From 68db8c8b70b572f02381a16443d04199c0f81d4d Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 8 Jan 2026 10:32:07 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat=EF=BC=9A=E8=AE=BE=E5=A4=87=E5=8F=B0?= =?UTF-8?q?=E8=B4=A6=E6=B7=BB=E5=8A=A0=E5=AF=BC=E5=87=BA/=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E5=88=A0=E9=99=A4=EF=BC=8C=E4=BF=AE=E6=94=B9=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E6=98=BE=E7=A4=BA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/mes/deviceledger/index.ts | 5 +- .../mes/deviceledger/DeviceLedgerForm.vue | 37 ++++++----- src/views/mes/deviceledger/index.vue | 61 ++++++++++++++----- 3 files changed, 70 insertions(+), 33 deletions(-) diff --git a/src/api/mes/deviceledger/index.ts b/src/api/mes/deviceledger/index.ts index f62231ae..eed0d1d0 100644 --- a/src/api/mes/deviceledger/index.ts +++ b/src/api/mes/deviceledger/index.ts @@ -17,7 +17,6 @@ export interface DeviceLedgerVO { deviceLocation: string // 设备位置 useDept?: string // 使用部门 deviceManager: string // 设备负责人 - quantity?: number // 数量 productionDate: Date // 设备生产日期 factoryEntryDate: Date // 设备入厂日期 deviceRemark: string // 设备备注 @@ -51,8 +50,8 @@ export const DeviceLedgerApi = { }, // 删除设备类型 - deleteDeviceLedger: async (id: number) => { - return await request.delete({ url: `/mes/device-ledger/delete?id=` + id }) + deleteDeviceLedger: async (ids: string) => { + return await request.delete({ url: `/mes/device-ledger/delete?ids=` + ids }) }, // 导出设备类型 Excel diff --git a/src/views/mes/deviceledger/DeviceLedgerForm.vue b/src/views/mes/deviceledger/DeviceLedgerForm.vue index d587ed99..f964b635 100644 --- a/src/views/mes/deviceledger/DeviceLedgerForm.vue +++ b/src/views/mes/deviceledger/DeviceLedgerForm.vue @@ -57,12 +57,6 @@ - - - - - - @@ -104,9 +98,9 @@ - + ([]) const deptTree = ref([]) const supplierOptions = ref([]) const deptNameMap = ref>({}) +const deptIdMap = ref>({}) const userPickerVisible = ref(false) const userKeyword = ref('') @@ -230,13 +224,25 @@ const selectUser = (user: UserVO) => { const buildDeptNameMap = (nodes: any[]) => { const map: Record = {} + const reverseMap: Record = {} const stack = [...nodes] while (stack.length) { const node = stack.pop()! - if (typeof node.id === 'number') map[node.id] = node.name + if (typeof node.id === 'number') { + map[node.id] = node.name + if (node.name) reverseMap[String(node.name)] = node.id + } if (Array.isArray(node.children) && node.children.length) stack.push(...node.children) } deptNameMap.value = map + deptIdMap.value = reverseMap +} + +const normalizeDeptValue = (value: any) => { + if (value === undefined || value === null || value === '') return undefined + if (typeof value === 'number') return value + const byName = deptIdMap.value[String(value)] + return byName === undefined ? undefined : byName } const ensureOptionsLoaded = async () => { @@ -270,6 +276,8 @@ const open = async (type: string, id?: number, defaultDeviceTypeId?: number) => formLoading.value = true try { formData.value = await DeviceLedgerApi.getDeviceLedger(id) + formData.value.workshop = normalizeDeptValue((formData.value as any).workshop) + formData.value.systemOrg = normalizeDeptValue((formData.value as any).systemOrg) } finally { formLoading.value = false } @@ -286,11 +294,11 @@ const submitForm = async () => { formLoading.value = true try { const workshopId = formData.value.workshop - const useDeptId = formData.value.useDept + const systemOrgId = formData.value.systemOrg const data = { ...(formData.value as any), workshop: typeof workshopId === 'number' ? deptNameMap.value[workshopId] : undefined, - useDept: typeof useDeptId === 'number' ? deptNameMap.value[useDeptId] : undefined + systemOrg: typeof systemOrgId === 'number' ? deptNameMap.value[systemOrgId] : undefined } as unknown as DeviceLedgerVO if (formType.value === 'create') { await DeviceLedgerApi.createDeviceLedger(data) @@ -321,9 +329,8 @@ const resetForm = () => { supplier: undefined, workshop: undefined, deviceLocation: undefined, - useDept: undefined, + systemOrg: undefined, deviceManager: undefined, - quantity: 1, productionDate: undefined, factoryEntryDate: undefined, remark: undefined, diff --git a/src/views/mes/deviceledger/index.vue b/src/views/mes/deviceledger/index.vue index 7ae38e3d..b86220b4 100644 --- a/src/views/mes/deviceledger/index.vue +++ b/src/views/mes/deviceledger/index.vue @@ -20,7 +20,7 @@ :model="queryParams" ref="queryFormRef" :inline="true" - label-width="90px" + label-width="60px" > 新增 + + 批量删除 + - + + - - - - - - - - - - diff --git a/src/views/mes/deviceledger/index.vue b/src/views/mes/deviceledger/index.vue index b86220b4..7d6c65e5 100644 --- a/src/views/mes/deviceledger/index.vue +++ b/src/views/mes/deviceledger/index.vue @@ -119,9 +119,9 @@ - + - + From fbf4da5e810b0c58d144815643c0216209233645 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 8 Jan 2026 14:51:27 +0800 Subject: [PATCH 04/10] =?UTF-8?q?style=EF=BC=9A=E8=AE=BE=E5=A4=87=E5=8F=B0?= =?UTF-8?q?=E8=B4=A6-=E7=94=9F=E4=BA=A7=E6=97=A5=E6=9C=9F=E3=80=81?= =?UTF-8?q?=E5=85=A5=E5=8E=82=E6=97=A5=E6=9C=9F=E6=97=B6=E9=97=B4=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/mes/deviceledger/index.ts | 4 +-- .../mes/deviceledger/DeviceLedgerForm.vue | 26 ++++++++++++++++--- src/views/mes/deviceledger/index.vue | 6 ++--- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/api/mes/deviceledger/index.ts b/src/api/mes/deviceledger/index.ts index eed0d1d0..aa625753 100644 --- a/src/api/mes/deviceledger/index.ts +++ b/src/api/mes/deviceledger/index.ts @@ -17,8 +17,8 @@ export interface DeviceLedgerVO { deviceLocation: string // 设备位置 useDept?: string // 使用部门 deviceManager: string // 设备负责人 - productionDate: Date // 设备生产日期 - factoryEntryDate: Date // 设备入厂日期 + productionDate: string | number | Date // 设备生产日期 + factoryEntryDate: string | number | Date // 设备入厂日期 deviceRemark: string // 设备备注 remark: string // 备注 creator?: string // 创建人 diff --git a/src/views/mes/deviceledger/DeviceLedgerForm.vue b/src/views/mes/deviceledger/DeviceLedgerForm.vue index c9d3a24c..465ce406 100644 --- a/src/views/mes/deviceledger/DeviceLedgerForm.vue +++ b/src/views/mes/deviceledger/DeviceLedgerForm.vue @@ -87,13 +87,13 @@ - + - + @@ -156,6 +156,7 @@ import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger' import { DeviceTypeApi, DeviceTypeTreeVO } from '@/api/mes/devicetype' import { getSimpleUserList, UserVO } from '@/api/system/user' +import { formatDate } from '@/utils/formatTime' import type { FormRules } from 'element-plus' /** 设备类型 表单 */ @@ -178,6 +179,21 @@ const parseIdsValue = (value: any): number[] => { .filter((v) => !Number.isNaN(v)) } +const normalizeYmd = (value: any): string | undefined => { + if (value === null || value === undefined || value === '') return undefined + if (typeof value === 'string') { + const trimmed = value.trim() + const matched = trimmed.match(/^(\d{4}-\d{2}-\d{2})/) + if (matched?.[1]) return matched[1] + const parsed = Date.parse(trimmed) + if (!Number.isNaN(parsed)) return formatDate(new Date(parsed), 'YYYY-MM-DD') + return trimmed + } + if (typeof value === 'number') return formatDate(new Date(value), 'YYYY-MM-DD') + if (value instanceof Date) return formatDate(value, 'YYYY-MM-DD') + return formatDate(new Date(value), 'YYYY-MM-DD') +} + const initFormData = () => ({ id: undefined, deviceCode: undefined, @@ -242,7 +258,9 @@ const open = async (type: string, id?: number, defaultDeviceTypeId?: number) => formData.value = { ...initFormData(), ...(detail as any), - deviceManagerIds: parseIdsValue((detail as any)?.deviceManager) + deviceManagerIds: parseIdsValue((detail as any)?.deviceManager), + productionDate: normalizeYmd((detail as any)?.productionDate), + factoryEntryDate: normalizeYmd((detail as any)?.factoryEntryDate) } } finally { formLoading.value = false @@ -261,6 +279,8 @@ const submitForm = async () => { try { const data = { ...(formData.value as any), + productionDate: normalizeYmd(formData.value.productionDate), + factoryEntryDate: normalizeYmd(formData.value.factoryEntryDate), deviceManager: formData.value.deviceManagerIds?.length ? formData.value.deviceManagerIds.join(',') : undefined } as unknown as DeviceLedgerVO delete (data as any).deviceManagerIds diff --git a/src/views/mes/deviceledger/index.vue b/src/views/mes/deviceledger/index.vue index 7d6c65e5..8968bfa5 100644 --- a/src/views/mes/deviceledger/index.vue +++ b/src/views/mes/deviceledger/index.vue @@ -113,8 +113,8 @@ - - + + @@ -198,7 +198,7 @@ diff --git a/src/views/mes/planMaintenance/index.vue b/src/views/mes/planMaintenance/index.vue new file mode 100644 index 00000000..67511475 --- /dev/null +++ b/src/views/mes/planMaintenance/index.vue @@ -0,0 +1,327 @@ + + + From 626c947f694eedf28b769584d4962327ab106536 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 8 Jan 2026 18:08:14 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feat=EF=BC=9A=E6=B7=BB=E5=8A=A0=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/mes/taskManagement/index.ts | 44 ++++ .../mes/taskManagement/TaskManagementForm.vue | 159 ++++++++++++++ src/views/mes/taskManagement/index.vue | 202 ++++++++++++++++++ 3 files changed, 405 insertions(+) create mode 100644 src/api/mes/taskManagement/index.ts create mode 100644 src/views/mes/taskManagement/TaskManagementForm.vue create mode 100644 src/views/mes/taskManagement/index.vue diff --git a/src/api/mes/taskManagement/index.ts b/src/api/mes/taskManagement/index.ts new file mode 100644 index 00000000..cad0b3f7 --- /dev/null +++ b/src/api/mes/taskManagement/index.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +export interface TaskManagementVO { + id?: number + name?: string + taskType?: number + deviceList?: string + projectForm?: string + startDate?: string + endDate?: string + cronExpression?: string + operableUsers?: string + enabled?: boolean + execFrequency?: string + frequencyValue?: string + time?: string + validMinutes?: number + creator?: string + createTime?: string + updateTime?: string +} + +export const TaskManagementApi = { + getTaskManagementPage: async (params: any) => { + return await request.get({ url: `/mes/task-management/page`, params }) + }, + + createTaskManagement: async (data: TaskManagementVO) => { + return await request.post({ url: `/mes/task-management/create`, data }) + }, + + updateTaskManagement: async (data: TaskManagementVO) => { + return await request.put({ url: `/mes/task-management/update`, data }) + }, + + deleteTaskManagement: async (ids: string) => { + return await request.delete({ url: `/mes/task-management/delete?ids=` + ids }) + }, + + exportTaskManagement: async (params: any) => { + return await request.download({ url: `/mes/task-management/export-excel`, params }) + } +} + diff --git a/src/views/mes/taskManagement/TaskManagementForm.vue b/src/views/mes/taskManagement/TaskManagementForm.vue new file mode 100644 index 00000000..eec67eba --- /dev/null +++ b/src/views/mes/taskManagement/TaskManagementForm.vue @@ -0,0 +1,159 @@ + + + + diff --git a/src/views/mes/taskManagement/index.vue b/src/views/mes/taskManagement/index.vue new file mode 100644 index 00000000..1daa508a --- /dev/null +++ b/src/views/mes/taskManagement/index.vue @@ -0,0 +1,202 @@ + + + + From 110f99f8d335ed6e8aecf94d605df0ea042c008e Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 8 Jan 2026 18:14:45 +0800 Subject: [PATCH 09/10] =?UTF-8?q?style=EF=BC=9A=E6=96=B9=E6=A1=88=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4-=E7=BC=96=E8=BE=91=E5=BC=B9=E6=A1=86-=E5=85=B3?= =?UTF-8?q?=E8=81=94=E9=A1=B9=E7=9B=AE=E5=9B=9E=E6=98=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../planMaintenance/PlanMaintenanceForm.vue | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/views/mes/planMaintenance/PlanMaintenanceForm.vue b/src/views/mes/planMaintenance/PlanMaintenanceForm.vue index 123a3444..9ef6641f 100644 --- a/src/views/mes/planMaintenance/PlanMaintenanceForm.vue +++ b/src/views/mes/planMaintenance/PlanMaintenanceForm.vue @@ -62,11 +62,23 @@ const ensureSubjectOptionsLoaded = async () => { const parseIds = (value: any): Array => { if (!value) return [] - if (Array.isArray(value)) return value - return String(value) - .split(',') - .map((v) => v.trim()) - .filter((v) => v !== '') + const raw = Array.isArray(value) + ? value + : String(value) + .split(',') + .map((v) => v.trim()) + .filter((v) => v !== '') + + return raw + .map((v) => { + if (typeof v === 'number') return v + const s = String(v).trim() + if (!s) return undefined + const n = Number(s) + if (Number.isFinite(n) && String(n) === s) return n + return s + }) + .filter((v): v is number | string => v !== undefined) } const initFormData = () => ({ @@ -98,7 +110,7 @@ const open = async (type: 'create' | 'update', row?: Partial) planName: (row.planName as any) ?? '', planType: (row.planType as any) ?? undefined, description: (row.description as any) ?? '', - subjectIds: parseIds((row as any).subjectIdS) + subjectIds: parseIds((row as any).subjectIds ?? (row as any).subjectIdS) } } } From 3649df054707e8a43581f4dbcdd29ff5c63a11c6 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 8 Jan 2026 18:41:32 +0800 Subject: [PATCH 10/10] =?UTF-8?q?feat=EF=BC=9A=E9=85=8D=E6=96=B9=E9=85=8D?= =?UTF-8?q?=E7=BD=AE-=E9=85=8D=E7=BD=AE=E5=BC=B9=E6=A1=86=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/iot/recipeConfig/index.ts | 4 + src/views/formula/formulaConfig/index.vue | 277 +++++++++++++++--- .../producereport/ProduceReportDetailForm.vue | 2 +- 3 files changed, 237 insertions(+), 46 deletions(-) diff --git a/src/api/iot/recipeConfig/index.ts b/src/api/iot/recipeConfig/index.ts index 90e6a386..53034c1e 100644 --- a/src/api/iot/recipeConfig/index.ts +++ b/src/api/iot/recipeConfig/index.ts @@ -177,6 +177,10 @@ export const RecipeConfigApi = { return await request.get({ url: `/iot/recipe-device-attribute/page`, params }) }, + updateRecipeDeviceAttribute: async (data: { recipeId: string | number; ids: number[] }) => { + return await request.put({ url: `/iot/recipe-device-attribute/update`, data }) + }, + saveRecipePointConfig: async (data: { recipeId: string | number; attributeIds: number[] }) => { ensureMockSeeded() await sleep(120) diff --git a/src/views/formula/formulaConfig/index.vue b/src/views/formula/formulaConfig/index.vue index f63a98fd..4fbb86ad 100644 --- a/src/views/formula/formulaConfig/index.vue +++ b/src/views/formula/formulaConfig/index.vue @@ -21,6 +21,9 @@ v-model="queryParams.productName" placeholder="请输入产品名称" clearable 查询 + + 重置 + 新增 @@ -49,7 +52,7 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to @@ -60,15 +63,9 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to +ref="detailRef" :visible="detailVisible" + :recipe-id="detailMeta.id ? String(detailMeta.id) : undefined" :manual-recipe-id="detailMeta.id" + :recipe-code="detailMeta.recipeCode" :name="detailMeta.name" @config="handleDetailConfig" @close="closeDetail" /> @@ -111,9 +108,59 @@ v-model="dialogForm.machineName" placeholder="请选择关联设备" clearable f
- +
+
+
+
来源
+
{{ filteredSourceItems.length }}
+
+
+ +
+ + + + +
+ +
+ + >> + + + << + +
+ +
+
+
目标
+
{{ filteredTargetItems.length }}
+
+
+ +
+ + + + +
+