黄伟杰 1 week ago
commit 5416bdbdac

@ -1,6 +1,11 @@
<template>
<Dialog :title="title" v-model="dialogVisible" :appendToBody="true" width="1080">
<ContentWrap>
<!-- 新增查询表单区域 -->
<div v-if="$slots.header" class="search-container">
<slot name="header"></slot>
</div>
<el-table
ref="tableRef"
v-loading="loading"
@ -58,12 +63,14 @@ const props = withDefaults(
rowKey?: string
pageSize?: number
initialRows?: any[]
queryParams?: Record<string, any> //
}>(),
{
selectionType: 'multiple',
rowKey: 'id',
pageSize: 10,
initialRows: () => []
initialRows: () => [],
queryParams: () => ({}) //
}
)
@ -108,7 +115,8 @@ const refreshSelectionOnTable = async () => {
const getList = async () => {
loading.value = true
try {
const data = await props.fetchApi(queryParams)
const params = getQueryParams()
const data = await props.fetchApi(params)
list.value = data.list || []
total.value = data.total || 0
await refreshSelectionOnTable()
@ -172,5 +180,31 @@ const submitSelection = () => {
dialogVisible.value = false
}
defineExpose({ open })
//
const reload =async () => {
loading.value = true
//
await getList()
}
// 3. queryParams
const getQueryParams = () => {
return {
pageNo: queryParams.pageNo || 1,
pageSize: queryParams.pageSize || 10,
...props.queryParams //
}
}
// 4.
watch(() => props.queryParams, async () => {
await getList()
}, { deep: true })
defineExpose({ open, reload })
</script>
<style scoped>
.search-container {
margin-bottom: 10px;
padding: 0 0px;
}
</style>

@ -3765,8 +3765,8 @@ export default {
DeviceAttributeType: {
moduleName: '采集点类型',
index: '序号',
code: '类型编码',
name: '类型名称',
code: '编码',
name: '名称',
sort: '显示顺序',
remark: '备注',
createTime: '创建时间',
@ -3778,8 +3778,8 @@ export default {
batchDelete: '批量删除',
export: '导出',
placeholderCode: '请输入类型编码',
placeholderName: '请输入类型名称',
placeholderCode: '请输入编码',
placeholderName: '请输入名称',
placeholderSort: '请输入显示顺序',
placeholderRemark: '请输入备注',

@ -186,7 +186,24 @@
:fetch-api="fetchDeviceLedgerPage"
row-key="id"
@confirm="handleDeviceSelectConfirm"
/>
:query-params="mergedQueryParams"
>
<!-- 使用 header 插槽插入查询表单 -->
<template #header>
<el-form ref="searchFormRef" :model="searchParams" :inline="true" >
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model="searchParams.deviceCode" placeholder="请输入编号" clearable />
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model="searchParams.deviceName" placeholder="请输入名称" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">{{ t('FactoryModeling.ProductInformation.searchButtonText') }}</el-button>
<el-button @click="resetSearch">{{ t('FactoryModeling.ProductInformation.resetButtonText') }}</el-button>
</el-form-item>
</el-form>
</template>
</TableSelectDialog>
<TableSelectDialog
ref="moldSelectDialogRef"
title="选择模具"
@ -194,7 +211,24 @@
:fetch-api="MoldBrandApi.getMoldPage"
row-key="id"
@confirm="handleMoldSelectConfirm"
/>
:query-params="mergedMoldQueryParams"
>
<!-- 使用 header 插槽插入查询表单 -->
<template #header>
<el-form ref="searchMoldFormRef" :model="searchMoldParams" :inline="true" >
<el-form-item label="模具编号" prop="code">
<el-input v-model="searchMoldParams.code" placeholder="请输入编号" clearable />
</el-form-item>
<el-form-item label="模具名称" prop="name">
<el-input v-model="searchMoldParams.name" placeholder="请输入名称" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleMoldSearch">{{ t('FactoryModeling.ProductInformation.searchButtonText') }}</el-button>
<el-button @click="resetMoldSearch">{{ t('FactoryModeling.ProductInformation.resetButtonText') }}</el-button>
</el-form-item>
</el-form>
</template>
</TableSelectDialog>
</template>
<script setup lang="ts">
import { ProductApi, ProductVO } from '@/api/erp/product/product'
@ -220,6 +254,42 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const formType = ref('') // create - update -
const deviceSelectDialogRef = ref()
const moldSelectDialogRef = ref()
const searchFormRef = ref()
// 1.
const searchParams = reactive({
deviceCode: undefined,
deviceName: undefined,
})
const handleSearch = () => {
//
deviceSelectDialogRef.value?.reload?.()
}
const resetSearch = () => {
searchFormRef.value?.resetFields()
handleSearch()
}
// 1.
const searchMoldParams = reactive({
code: undefined,
name: undefined,
})
const searchMoldFormRef = ref()
const handleMoldSearch = () => {
//
moldSelectDialogRef.value?.reload?.()
}
const resetMoldSearch = () => {
searchMoldFormRef.value?.resetFields()
handleSearch()
}
// 2.
const mergedQueryParams = computed(() => ({ ...searchParams }))
const mergedMoldQueryParams = computed(() => ({ ...searchMoldParams }))
const formData = ref({
id: undefined,
name: undefined,

@ -25,13 +25,12 @@
>
<el-option v-for="opt in deviceOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>-->
<el-input :model-value="displayItemDevice" readonly clearable class="device-ledger-selection-input"
:placeholder="t('MoldManagement.MoldOperate.placeholderDevice')"
@click="openCriticalComponentDialog" @clear="clearBeijian" />
@click="openCriticalComponentDialog" />
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.mold')" prop="moldId" v-if="formData.operateType == '1'">
<el-select
<!-- <el-select
v-model="formData.moldId"
multiple
clearable
@ -45,7 +44,13 @@
:label="item.name"
:value="item.id"
/>
</el-select>
</el-select>-->
<el-input
:model-value="moldDisplayText"
:placeholder="t('MoldManagement.MoldOperate.placeholderMold')"
readonly
@click="openMoldSelectDialog"
/>
</el-form-item>
<el-form-item
v-if="formData.operateType == '2' && formData.deviceId"
@ -78,92 +83,64 @@
</template>
</Dialog>
<el-dialog
v-model="itemDialogVisible"
:title="t('QualityManagement.ZjSchema.selectItemDialogTitle')"
width="1300px"
draggable
<TableSelectDialog
ref="deviceSelectDialogRef"
title="选择设备"
:columns="deviceColumns"
:fetch-api="fetchDeviceLedgerPage"
row-key="id"
@confirm="handleDeviceSelectConfirm"
:query-params="mergedQueryParams"
>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true"
label-width="60px">
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.deviceCode')"
prop="deviceCode">
<el-input
v-model="queryParams.deviceCode"
:placeholder="t('EquipmentManagement.EquipmentLedger.placeholderDeviceCode')"
clearable @keyup.enter="handleQuery"
class="!w-240px"/>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.deviceName')"
prop="deviceName">
<el-input
v-model="queryParams.deviceName"
:placeholder="t('EquipmentManagement.EquipmentLedger.placeholderDeviceName')"
clearable @keyup.enter="handleQuery"
class="!w-240px"/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px"/>
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px"/>
{{ t('common.reset') }}
</el-button>
</el-form-item>
</el-form>
<ContentWrap>
<el-table ref="multipleTableRef" v-loading="loading" :data="deviceList" :stripe="true"
@selection-change="handleSelectionChange" @select="handleSelect" @select-all="handleSelectAll" :show-overflow-tooltip="true"
class="no-select-all"
row-key="id">
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column :label="t('EquipmentManagement.EquipmentLedger.deviceCode')"
align="center" prop="deviceCode" min-width="160px" sortable/>
<el-table-column :label="t('EquipmentManagement.EquipmentLedger.deviceName')"
align="center" prop="deviceName" min-width="140px" sortable/>
<el-table-column :label="t('EquipmentManagement.EquipmentLedger.ratedCapacity')"
align="center" prop="ratedCapacity" min-width="120px"/>
<el-table-column :label="t('EquipmentManagement.EquipmentLedger.deviceSpec')"
align="center" prop="deviceSpec"/>
<!-- <el-table-column :label="t('EquipmentManagement.EquipmentLedger.deviceModel')"
align="center" prop="deviceModel"/>-->
<!-- <el-table-column :label="t('EquipmentManagement.EquipmentLedger.deviceBrand')" align="center" prop="deviceBrand" /> -->
<el-table-column
:label="t('EquipmentManagement.EquipmentLedger.productionDate')" align="center"
prop="productionDate" :formatter="dateFormatter2"
width="120px" sortable/>
<el-table-column
:label="t('EquipmentManagement.EquipmentLedger.factoryEntryDate')" align="center"
prop="factoryEntryDate" :formatter="dateFormatter2"
width="120px" sortable/>
</el-table>
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<template #footer>
<el-button @click="itemDialogVisible = false">
{{ t('common.cancel') }}
</el-button>
<el-button type="primary" @click="confirmSelectItems">
{{ t('common.ok') }}
</el-button>
<!-- 使用 header 插槽插入查询表单 -->
<template #header>
<el-form ref="searchFormRef" :model="searchParams" :inline="true" >
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model="searchParams.deviceCode" placeholder="请输入编号" clearable />
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model="searchParams.deviceName" placeholder="请输入名称" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">{{ t('FactoryModeling.ProductInformation.searchButtonText') }}</el-button>
<el-button @click="resetSearch">{{ t('FactoryModeling.ProductInformation.resetButtonText') }}</el-button>
</el-form-item>
</el-form>
</template>
</el-dialog>
</TableSelectDialog>
<TableSelectDialog
ref="moldSelectDialogRef"
title="选择模具"
:columns="moldColumns"
:fetch-api="MoldBrandApi.getMoldPage"
row-key="id"
@confirm="handleMoldSelectConfirm"
:query-params="mergedMoldQueryParams"
>
<!-- 使用 header 插槽插入查询表单 -->
<template #header>
<el-form ref="searchMoldFormRef" :model="searchMoldParams" :inline="true" >
<el-form-item label="模具编号" prop="code">
<el-input v-model="searchMoldParams.code" placeholder="请输入编号" clearable />
</el-form-item>
<el-form-item label="模具名称" prop="name">
<el-input v-model="searchMoldParams.name" placeholder="请输入名称" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleMoldSearch">{{ t('FactoryModeling.ProductInformation.searchButtonText') }}</el-button>
<el-button @click="resetMoldSearch">{{ t('FactoryModeling.ProductInformation.resetButtonText') }}</el-button>
</el-form-item>
</el-form>
</template>
</TableSelectDialog>
</template>
<script setup lang="ts">
import { MoldOperateApi, MoldOperateVO } from '@/api/mes/moldoperate'
import { MoldBrandApi, MoldVO } from '@/api/erp/mold'
import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger'
import {ref} from "vue";
import {ElTable} from "element-plus";
import {ZjItemApi, ZjItemVO} from "@/api/mes/zjitem";
import { dateFormatter2 } from '@/utils/formatTime'
import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue'
/** 模具上下模 表单 */
defineOptions({ name: 'MoldOperateForm' })
@ -264,11 +241,11 @@ const open = async (type: string, id?: number) => {
}
}else{
ids.value=[]
moldIds.value=[]
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
// const submitForm = async () => {
@ -304,11 +281,11 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
const submitForm = async () => {
// loading
formLoading.value = true
try {
// 1.
await formRef.value.validate()
// 2.
const raw = formData.value as any
const submitData: any = {
@ -343,13 +320,13 @@ const submitForm = async () => {
await MoldOperateApi.updateMoldOperate(submitData)
message.success(t('common.updateSuccess'))
}
// 4.
dialogVisible.value = false
emit('success')
} catch (error) {
} finally {
// loading
formLoading.value = false
@ -426,10 +403,98 @@ const resetForm = () => {
}
formRef.value?.resetFields()
}
const deviceColumns = [
{ label: '设备编号', prop: 'deviceCode', minWidth: 140 },
{ label: '设备名称', prop: 'deviceName', minWidth: 160 },
{ label: '设备型号', prop: 'deviceModel', minWidth: 140 },
{ label: '所属车间', prop: 'workshop', minWidth: 140 }
]
const moldColumns = [
{ label: '模具编码', prop: 'code', minWidth: 140 },
{ label: '模具名称', prop: 'name', minWidth: 160 },
{ label: '模具型号', prop: 'brandName', minWidth: 140 },
{ label: '状态', prop: 'status', minWidth: 100 }
]
const fetchDeviceLedgerPage = (params: Record<string, any>) => {
return DeviceLedgerApi.getDeviceLedgerPage({
...params,
isScheduled: 1
})
}
const selectedDeviceRows = ref<any[]>([])
const selectedMoldRows = ref<any[]>([])
const handleDeviceSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
formData.value.devices = payload.rows
.map((item) => {
const id = Number(item.id)
if (!Number.isFinite(id)) return undefined
return {
id,
name: item.deviceName || item.name || item.code || `设备ID:${id}`
}
})
.filter((item): item is { id: number; name: string } => Boolean(item))
selectedDeviceRows.value = payload.rows
formData.value.deviceId = payload.ids.join(',')
ids.value = payload.ids.map((id) => Number(id))
}
const handleMoldSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
formData.value.molds = payload.rows
.map((item) => {
const id = Number(item.id)
if (!Number.isFinite(id)) return undefined
return {
id,
name: item.name || item.code || `模具ID:${id}`
}
})
.filter((item): item is { id: number; name: string } => Boolean(item))
selectedMoldRows.value = payload.rows
formData.value.moldId = payload.ids.join(',')
moldIds.value = payload.ids.map((id) => Number(id))
}
// 1.
const searchParams = reactive({
deviceCode: undefined,
deviceName: undefined,
})
const searchFormRef = ref()
const handleSearch = () => {
//
deviceSelectDialogRef.value?.reload?.()
}
const resetSearch = () => {
searchFormRef.value?.resetFields()
handleSearch()
}
// 1.
const searchMoldParams = reactive({
code: undefined,
name: undefined,
})
const searchMoldFormRef = ref()
const handleMoldSearch = () => {
//
moldSelectDialogRef.value?.reload?.()
}
const resetMoldSearch = () => {
searchMoldFormRef.value?.resetFields()
handleSearch()
}
const moldSelectDialogRef = ref()
// 2.
const mergedQueryParams = computed(() => ({ ...searchParams }))
const mergedMoldQueryParams = computed(() => ({ ...searchMoldParams }))
const ids = ref([])
const moldIds= ref([])
const itemList = ref<DeviceLedgerVO[]>([])
const itemDialogVisible = ref(false)
const multipleTableRef = ref<InstanceType<typeof ElTable>>()
const moldItemList = ref<MoldVO[]>([])
const deviceSelectDialogRef = ref(false)
const deviceList = ref<DeviceLedgerVO[]>([])
const selectedRows = ref<any[]>([])
const total = ref(0)
@ -447,134 +512,39 @@ const displayItemDevice = computed( () => {
return names.join(',')
})
const openCriticalComponentDialog = async () => {
itemDialogVisible.value = true
let initIds= formData.value.deviceId!=undefined?formData.value.deviceId.toString().split(","):[]
ids.value=initIds.map((id) => Number(id))
setDefaultSelections()
}
//
const setDefaultSelections = () => {
// DOM
nextTick(() => {
if (!multipleTableRef.value) return
multipleTableRef.value.clearSelection()
let initIds= formData.value.deviceId!=undefined?formData.value.deviceId.toString().split(","):[]
const rawSubjectIds =initIds.map((id) => Number(id))
if (rawSubjectIds.length != 0) {
let row = {
id: undefined
}
multipleTableRef.value.toggleRowSelection(row, true)
}
//
deviceList.value.forEach(row => {
let id = row.id;
if (rawSubjectIds.includes(row.id)) {
multipleTableRef.value.toggleRowSelection(row, true)
}
})
})
}
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
deviceCode: undefined,
deviceName: undefined,
})
const clearBeijian = () => {
formData.value.item = ''
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const getList = async () => {
loading.value = true
try {
const data = await DeviceLedgerApi.getDeviceLedgerPage(queryParams)
deviceList.value = data.list
total.value = data.total
//
nextTick(() => {
toggleSelection()
})
} finally {
loading.value = false
const moldDisplayText = computed(() => {
if (!moldIds.value.length)return ''
if (!moldItemList.value.length) {
return formData.value.moldId ? String(formData.value.moldId) : ''
}
}
//
const toggleSelection = () => {
if (!multipleTableRef.value || !selectedRows.value.length) return
//
deviceList.value.forEach(row => {
//
const isSelected = selectedRows.value.some(item => item.id === row.id)
if (isSelected) {
//
multipleTableRef.value!.toggleRowSelection(row, true)
} else {
//
multipleTableRef.value!.toggleRowSelection(row, false)
}
})
}
const handleSelectionChange = (rows: ZjItemVO[]) => {
// id
const currentPageIds = rows.map(item => item.id)
//
selectedRows.value = selectedRows.value.filter(
item => !currentPageIds.includes(item.id)
)
//
selectedRows.value.push(...rows)
let a=1;
}
const map = new Map(moldItemList.value.map((item) => [item.id, item.name]))
const names = moldIds.value
.map((id) => map.get(id))
.filter((name) => name)
return names.join(',')
})
//
const currentSelectedRows = ref([])
const handleSelectAll = (selection) => {
let initIds=selection?.map((row) => row.id).filter((id) => id !== undefined) ?? []
ids.value =initIds.map((id) => Number(id))
const openCriticalComponentDialog = async () => {
searchParams.deviceCode=''
searchParams.deviceName=''
searchMoldParams.code=''
searchMoldParams.name=''
const rows = selectedDeviceRows.value.map((item) => ({ ...item, id: Number(item.id) }))
deviceSelectDialogRef.value?.open(rows)
let initIds= formData.value.deviceId!=undefined?formData.value.deviceId.toString().split(","):[]
ids.value=initIds.map((id) => Number(id))
}
// select row selected
const handleSelect = (selection, row) => {
//
const isSelected = selection.includes(row)
if (isSelected) {
// console.log(` : ID=${row.id}, Name=${row.name}`)
ids.value.push(row.id)
} else {
ids.value = ids.value.filter(
item => item !== row.id
)
// console.log(` : ID=${row.id}, Name=${row.name}`)
}
//
currentSelectedRows.value = selection
const openMoldSelectDialog = () => {
const rows = selectedMoldRows.value.map((item) => ({ ...item, id: Number(item.id) }))
moldSelectDialogRef.value?.open(rows)
}
const confirmSelectItems = () => {
formData.value.deviceId = ids.value.join(',')
itemDialogVisible.value = false
const toDeviceRows = (split: any) => {
return split.map((item: any) => ({
id: item,
deviceName: item
}))
}
const initSelectedItems = async () => {
@ -586,15 +556,13 @@ const initSelectedItems = async () => {
loading.value = false
}
}
if (!moldItemList.value.length) {
loading.value = true
try {
moldItemList.value = await MoldBrandApi.getMoldAllList()
} finally {
loading.value = false
}
}
}
/** 初始化 **/
onMounted(async () => {
getList()
})
</script>
<style scoped lang="scss">
.no-select-all :deep(.el-table__header-wrapper .el-checkbox) {
display: none;
}
</style>

@ -68,6 +68,7 @@
row-key="id"
:stripe="true"
:show-overflow-tooltip="true"
:expand-row-keys="expandedKeys"
@expand-change="handleExpandChange"
@selection-change="handleSelectionChange"
>
@ -163,7 +164,7 @@ defineOptions({ name: 'PlanMaintenance' })
const message = useMessage()
const { t } = useI18n()
const expandedKeys = ref<number[]>([])
const dictStore = useDictStoreWithOut()
const dictReady = ref(false)
@ -229,6 +230,7 @@ const normalizeList = (res: any): { list: any[]; total: number } => {
const getList = async () => {
loading.value = true
expandedKeys.value = []
try {
const res = await PlanMaintenanceApi.getPlanMaintenancePage({
pageNo: queryParams.pageNo,
@ -258,7 +260,7 @@ const resetQuery = () => {
const ensureSubjectListLoaded = async (id: number | string) => {
const key = String(id)
if (!key) return
if (subjectListMap.value[key]) return
//if (subjectListMap.value[key]) return
subjectLoadingMap.value[key] = true
try {
const res = await PlanMaintenanceApi.getSubjectList(id)

Loading…
Cancel
Save