diff --git a/src/api/iot/device/index.ts b/src/api/iot/device/index.ts
index 79785144..683b986e 100644
--- a/src/api/iot/device/index.ts
+++ b/src/api/iot/device/index.ts
@@ -215,6 +215,11 @@ export const DeviceApi = {
return await request.put({ url: `/iot/device-contact-model/update`, data })
},
+ // 批量修改设备属性
+ batchUpdateDeviceAttribute: async (data) => {
+ return await request.put({ url: '/iot/device/device-attribute/batch-update', data })
+ },
+
// 删除设备属性
deleteDeviceAttribute: async (ids: string) => {
return await request.delete({ url: `/iot/device-contact-model/delete?ids=` + ids })
diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts
index b0ccae2f..1b96d3be 100644
--- a/src/locales/zh-CN.ts
+++ b/src/locales/zh-CN.ts
@@ -2007,7 +2007,11 @@ export default {
validatorDeviceCodeRequired: '编码不能为空',
gjTitle: '选择关键件',
bjTitle: '选择备件',
+ all: '全部',
normal: '正常',
+ disabled: '停用',
+ scheduled: '已排产',
+ unscheduled: '未排产',
stop: '停用',
maintenance: '维修',
scrap: '报废',
@@ -2149,6 +2153,7 @@ export default {
// 任务管理
TaskManagement: {
+ all: '全部',
name: '名称',
taskType: '类型',
taskTypeInspect: '点检',
@@ -2159,6 +2164,7 @@ export default {
planEndDate: '计划结束时间',
cronExpression: 'cron 表达式',
enabled: '启用',
+ disabled: '未启用',
creatorName: '创建人',
createTime: '创建时间',
updateTime: '更新时间',
@@ -2199,11 +2205,17 @@ export default {
// 工单管理
WorkOrderManagement: {
+ all: '全部',
basicInfo: '基本信息',
planNo: '单号',
planType: '类型',
planTypeInspect: '点检',
planTypeMaintain: '保养',
+ unworked: '未作业',
+ worked: '已作业',
+ overtimeUnworked: '超时未作业',
+ overtimeWorked: '超时已作业',
+ canceled: '取消',
jobStatus: '作业状态',
jobResult: '结果',
deviceName: '设备名称',
@@ -2253,6 +2265,7 @@ export default {
// 维修单
DvRepair: {
+ all: '全部',
repairCode: '维修单号',
repairName: '维修单',
machineryName: '设备名称',
@@ -3115,6 +3128,7 @@ export default {
},
MoldRepair: {
+ all: '全部',
moduleName: '维修单',
basicInfo: '基本信息',
faultInfo: '故障信息',
@@ -3322,12 +3336,18 @@ export default {
},
MoldWorkOrderInquiry: {
+ all: '全部',
moduleName: '工单查询',
basicInfo: '基本信息',
planNo: '单号',
planType: '类型',
planTypeInspect: '点检',
planTypeMaintain: '保养',
+ unworked: '未作业',
+ worked: '已作业',
+ overtimeUnworked: '超时未作业',
+ overtimeWorked: '超时已作业',
+ canceled: '取消',
jobStatus: '作业状态',
jobResult: '结果',
jobResultOk: '通过',
diff --git a/src/views/erp/mold/index.vue b/src/views/erp/mold/index.vue
index 776a03dd..5cc8210d 100644
--- a/src/views/erp/mold/index.vue
+++ b/src/views/erp/mold/index.vue
@@ -230,9 +230,9 @@ const onKeywordClear = () => {
const statusCards = computed(() => [
{ key: 'all', label: t('MoldManagement.MoldBrandPage.all'), value: counters.allCount, status: undefined },
- { key: 'onMachine', label: t('MoldManagement.MoldBrandPage.onMachine'), value: counters.onMachineCount, status: 1 },
+ { key: 'onMachine', label: t('MoldManagement.MoldBrandPage.onMachine'), value: counters.onMachineCount, status: 0 },
{ key: 'inStock', label: t('MoldManagement.MoldBrandPage.inStock'), value: counters.inStockCount, status: 4 },
- { key: 'standby', label: t('MoldManagement.MoldBrandPage.standby'), value: counters.standbyCount, status: 0 },
+ { key: 'standby', label: t('MoldManagement.MoldBrandPage.standby'), value: counters.standbyCount, status: 1 },
{ key: 'repairing', label: t('MoldManagement.MoldBrandPage.repairing'), value: counters.repairingCount, status: 2 },
{ key: 'scrapped', label: t('MoldManagement.MoldBrandPage.scrapped'), value: counters.scrappedCount, status: 3 }
])
@@ -458,12 +458,12 @@ onBeforeUnmount(() => {
diff --git a/src/views/erp/stock/overview/index.vue b/src/views/erp/stock/overview/index.vue
index b35b8fe4..1cb72397 100644
--- a/src/views/erp/stock/overview/index.vue
+++ b/src/views/erp/stock/overview/index.vue
@@ -33,8 +33,7 @@
-
+
{{ item.title }}
@@ -45,7 +44,7 @@
{{ item.tip }}
-
+
@@ -507,13 +506,22 @@ onMounted(async () => {
}
.stock-overview__card-wrap {
+ padding: 16px 18px;
+ border: 1px solid var(--el-border-color-light);
+ border-radius: 12px;
+ background: #fff;
+ cursor: pointer;
+ transition: box-shadow 0.2s ease;
margin-bottom: 0 !important;
+
+ &:hover {
+ box-shadow: 0 10px 24px rgba(64, 158, 255, 0.12);
+ }
}
.stock-overview__card {
display: flex;
justify-content: space-between;
- min-height: 174px;
}
.stock-overview__card-main {
diff --git a/src/views/iot/device/components/DeviceAttributeForm.vue b/src/views/iot/device/components/DeviceAttributeForm.vue
index 31b3a270..17b35c37 100644
--- a/src/views/iot/device/components/DeviceAttributeForm.vue
+++ b/src/views/iot/device/components/DeviceAttributeForm.vue
@@ -38,7 +38,7 @@ v-model="formData.dataUnit" clearable
+ :decision="2" :step="0.01" class="!w-full" />
{{ t('DataCollection.Device.batchDelete') }}
+
+ 批量编辑
+
@@ -137,7 +140,11 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to
align="center"
prop="dataUnit"
width="80px"
- />
+ >
+
+ {{ formatDataUnit(scope.row.dataUnit) }}
+
+
+
+
+
diff --git a/src/views/mes/taskManagement/TaskManagementForm.vue b/src/views/mes/taskManagement/TaskManagementForm.vue
index d3941cb8..90b0d244 100644
--- a/src/views/mes/taskManagement/TaskManagementForm.vue
+++ b/src/views/mes/taskManagement/TaskManagementForm.vue
@@ -162,10 +162,14 @@
- {{ row.deviceTypeName ?? row.deviceType ?? '-' }}
+ {{ getDeviceTypeName(row.deviceTypeName ?? row.deviceType) }}
+
+
+
+
+
-
@@ -283,6 +287,7 @@
+
+
diff --git a/src/views/mes/tasksummary/components/TaskScheduleDialog.vue b/src/views/mes/tasksummary/components/TaskScheduleDialog.vue
index e0e24bd4..f7011498 100644
--- a/src/views/mes/tasksummary/components/TaskScheduleDialog.vue
+++ b/src/views/mes/tasksummary/components/TaskScheduleDialog.vue
@@ -252,8 +252,8 @@ const currentDeviceRelationRow = ref
()
const currentProductData = ref()
const selectedDeviceRows = ref([])
const deviceRelationForm = reactive({
- productId: undefined as number | undefined,
- devices: [] as { id: number; name: string }[]
+ productId: undefined as string | undefined,
+ devices: [] as { id: string; name: string }[]
})
const deviceColumns = computed(() => [
@@ -304,7 +304,7 @@ const taskDetailRequestMap = new Map>()
const currentDetailRequestId = ref(0)
const taskTableBusy = computed(() => taskLoading.value || taskSelectionLoading.value)
-const getRelationName = (item: Record, nameKeys: string[], fallbackPrefix: string, id: number) => {
+const getRelationName = (item: Record, nameKeys: string[], fallbackPrefix: string, id: string) => {
for (const key of nameKeys) {
const value = item[key]
if (value !== undefined && value !== null && String(value).trim() !== '') {
@@ -318,11 +318,11 @@ const normalizeRelationList = (
fallbackRows: any[] | undefined,
nameKeys: string[],
fallbackPrefix: string
-): { id: number; name: string }[] => {
- const fallbackMap = new Map()
+): { id: string; name: string }[] => {
+ const fallbackMap = new Map()
;(fallbackRows || []).forEach((row) => {
- const id = Number(row?.id)
- if (!Number.isFinite(id)) return
+ const id = String(row?.id)
+ if (!id || id === 'undefined' || id === 'null') return
fallbackMap.set(id, getRelationName(row, nameKeys, fallbackPrefix, id))
})
const parseArray = (source: unknown): any[] => {
@@ -342,23 +342,23 @@ const normalizeRelationList = (
return parseArray(value)
.map((item) => {
if (typeof item === 'object' && item !== null) {
- const id = Number((item as any).id)
- if (!Number.isFinite(id)) return undefined
+ const id = String((item as any).id)
+ if (!id || id === 'undefined' || id === 'null') return undefined
return {
id,
name: getRelationName(item as any, nameKeys, fallbackPrefix, id)
}
}
- const id = Number(item)
- if (!Number.isFinite(id)) return undefined
+ const id = String(item)
+ if (!id || id === 'undefined' || id === 'null') return undefined
return {
id,
name: fallbackMap.get(id) || `${fallbackPrefix}ID:${id}`
}
})
- .filter((item): item is { id: number; name: string } => Boolean(item))
+ .filter((item): item is { id: string; name: string } => Boolean(item))
}
-const toDeviceRows = (devices: { id: number; name: string }[]) => {
+const toDeviceRows = (devices: { id: string; name: string }[]) => {
return devices.map((item) => ({
id: item.id,
deviceName: item.name,
@@ -625,7 +625,7 @@ const openDeviceRelationDialog = async (row: any) => {
deviceRelationLoading.value = true
selectedDeviceRows.value = []
try {
- const productData = await ProductApi.getProduct(Number(row.productId))
+ const productData = await ProductApi.getProduct(String(row.productId))
currentProductData.value = productData
const devices = normalizeRelationList(
(productData as any).devices ?? (productData as any).deviceIds,
@@ -633,7 +633,7 @@ const openDeviceRelationDialog = async (row: any) => {
['name', 'deviceName', 'code'],
t('ProductionPlan.TaskSummary.deviceColumnName')
)
- deviceRelationForm.productId = Number(row.productId)
+ deviceRelationForm.productId = String(row.productId)
deviceRelationForm.devices = devices
selectedDeviceRows.value = toDeviceRows(devices)
} finally {
@@ -656,7 +656,7 @@ const handleDeviceSelectConfirm = (payload: { ids: (number | string)[]; rows: an
name: item.deviceName || item.name || item.code || `${t('ProductionPlan.TaskSummary.deviceColumnName')}ID:${id}`
}
})
- .filter((item): item is { id: number; name: string } => Boolean(item))
+ .filter((item): item is { id: string; name: string } => Boolean(item))
selectedDeviceRows.value = payload.rows
}
const refreshDetailListAfterDeviceSaved = async () => {
diff --git a/src/views/mes/workOrderManagement/index.vue b/src/views/mes/workOrderManagement/index.vue
index f65fce3b..940f7630 100644
--- a/src/views/mes/workOrderManagement/index.vue
+++ b/src/views/mes/workOrderManagement/index.vue
@@ -1,6 +1,13 @@
+
[
+ { key: 'all', label: t('EquipmentManagement.WorkOrderManagement.all'), value: counters.allCount, planType: undefined, jobStatus: undefined },
+ { key: 'inspect', label: t('EquipmentManagement.WorkOrderManagement.planTypeInspect'), value: counters.inspectCount, planType: '1', jobStatus: undefined },
+ { key: 'maintain', label: t('EquipmentManagement.WorkOrderManagement.planTypeMaintain'), value: counters.maintainCount, planType: '2', jobStatus: undefined },
+ { key: 'unworked', label: t('EquipmentManagement.WorkOrderManagement.unworked'), value: counters.unworkedCount, planType: undefined, jobStatus: '0' },
+ { key: 'worked', label: t('EquipmentManagement.WorkOrderManagement.worked'), value: counters.workedCount, planType: undefined, jobStatus: '1' },
+ { key: 'overtimeUnworked', label: t('EquipmentManagement.WorkOrderManagement.overtimeUnworked'), value: counters.overtimeUnworkedCount, planType: undefined, jobStatus: '2' },
+ { key: 'overtimeWorked', label: t('EquipmentManagement.WorkOrderManagement.overtimeWorked'), value: counters.overtimeWorkedCount, planType: undefined, jobStatus: '3' },
+ { key: 'canceled', label: t('EquipmentManagement.WorkOrderManagement.canceled'), value: counters.canceledCount, planType: undefined, jobStatus: '4' }
+])
+const changeStatus = (key: string, planType?: string, jobStatus?: string) => {
+ currentStatusKey.value = key
+ queryParams.planType = planType
+ queryParams.jobStatus = jobStatus
+ handleQuery()
+}
const showAllFilters = ref(false)
const filterCount = 6
const UNWORKED_JOB_STATUS = '0'
@@ -317,6 +351,14 @@ const getList = async () => {
const data = await TicketManagementApi.getTicketManagementPage(buildQueryParams())
list.value = data.list
total.value = data.total
+ counters.allCount = Number(data?.allCount ?? data?.total ?? 0)
+ counters.inspectCount = Number(data?.inspectCount ?? 0)
+ counters.maintainCount = Number(data?.maintainCount ?? 0)
+ counters.unworkedCount = Number(data?.unworkedCount ?? 0)
+ counters.workedCount = Number(data?.workedCount ?? 0)
+ counters.overtimeUnworkedCount = Number(data?.overtimeUnworkedCount ?? 0)
+ counters.overtimeWorkedCount = Number(data?.overtimeWorkedCount ?? 0)
+ counters.canceledCount = Number(data?.canceledCount ?? 0)
} finally {
loading.value = false
updatePlanTableMaxHeight()
@@ -330,6 +372,9 @@ const handleQuery = () => {
const resetQuery = () => {
queryFormRef.value.resetFields()
+ currentStatusKey.value = 'all'
+ queryParams.planType = undefined
+ queryParams.jobStatus = '0'
handleQuery()
}
@@ -418,3 +463,44 @@ onBeforeUnmount(() => {
window.removeEventListener("resize", updatePlanTableMaxHeight)
})
+
+
diff --git a/src/views/mold/moldrepair/index.vue b/src/views/mold/moldrepair/index.vue
index 249bdbcb..f5554af0 100644
--- a/src/views/mold/moldrepair/index.vue
+++ b/src/views/mold/moldrepair/index.vue
@@ -1,6 +1,13 @@
+
-
+
-
+
{{ showAllFilters ? t('FactoryModeling.FactoryStructure.collapseText') : t('FactoryModeling.FactoryStructure.expandText') }}
@@ -242,10 +249,34 @@ const queryParams = reactive({
acceptedBy: undefined,
confirmBy: undefined,
status: undefined,
+ repairStatus: undefined,
remark: undefined,
createTime: [],
})
const queryFormRef = ref()
+const currentStatusKey = ref('all')
+const counters = reactive({
+ allCount: 0,
+ pendingCount: 0,
+ finishedCount: 0,
+ pendingRepairCount: 0,
+ passedCount: 0,
+ failedCount: 0
+})
+const statusCards = computed(() => [
+ { key: 'all', label: t('MoldManagement.MoldRepair.all'), value: counters.allCount, status: undefined, repairStatus: undefined },
+ { key: 'pending', label: t('MoldManagement.MoldRepair.statusPending'), value: counters.pendingCount, status: '0', repairStatus: undefined },
+ { key: 'finished', label: t('MoldManagement.MoldRepair.statusDone'), value: counters.finishedCount, status: '1', repairStatus: undefined },
+ { key: 'pendingRepair', label: t('MoldManagement.MoldRepair.repairResultPending'), value: counters.pendingRepairCount, status: undefined, repairStatus: '0' },
+ { key: 'passed', label: t('MoldManagement.MoldRepair.repairResultOk'), value: counters.passedCount, status: undefined, repairStatus: '1' },
+ { key: 'failed', label: t('MoldManagement.MoldRepair.repairResultNg'), value: counters.failedCount, status: undefined, repairStatus: '2' }
+])
+const changeStatus = (key: string, status?: string, repairStatus?: string) => {
+ currentStatusKey.value = key
+ queryParams.status = status
+ queryParams.repairStatus = repairStatus
+ handleQuery()
+}
const exportLoading = ref(false)
const statusOptions = [
@@ -318,6 +349,12 @@ const getList = async () => {
const data = await MoldRepairApi.getMoldRepairPage(params)
list.value = data.list
total.value = data.total
+ counters.allCount = Number(data?.allCount ?? data?.total ?? 0)
+ counters.pendingCount = Number(data?.pendingCount ?? 0)
+ counters.finishedCount = Number(data?.finishedCount ?? 0)
+ counters.pendingRepairCount = Number(data?.pendingRepairCount ?? 0)
+ counters.passedCount = Number(data?.passedCount ?? 0)
+ counters.failedCount = Number(data?.failedCount ?? 0)
} finally {
loading.value = false
updatePlanTableMaxHeight()
@@ -331,6 +368,9 @@ const handleQuery = () => {
const resetQuery = () => {
queryFormRef.value.resetFields()
+ currentStatusKey.value = 'all'
+ queryParams.status = undefined
+ queryParams.repairStatus = undefined
handleQuery()
}
@@ -400,3 +440,44 @@ onBeforeUnmount(() => {
window.removeEventListener("resize", updatePlanTableMaxHeight)
})
+
+
diff --git a/src/views/mold/taskConfiguration/index.vue b/src/views/mold/taskConfiguration/index.vue
index 3df0eef4..34d11f75 100644
--- a/src/views/mold/taskConfiguration/index.vue
+++ b/src/views/mold/taskConfiguration/index.vue
@@ -1,5 +1,12 @@
+
([])
+const currentStatusKey = ref('all')
+const counters = reactive({
+ allCount: 0,
+ inspectCount: 0,
+ maintainCount: 0,
+ enabledCount: 0,
+ disabledCount: 0
+})
+const statusCards = computed(() => [
+ { key: 'all', label: t('EquipmentManagement.TaskManagement.all'), value: counters.allCount, taskType: undefined, enabled: undefined },
+ { key: 'inspect', label: t('EquipmentManagement.TaskManagement.taskTypeInspect'), value: counters.inspectCount, taskType: 1, enabled: undefined },
+ { key: 'maintain', label: t('EquipmentManagement.TaskManagement.taskTypeMaintain'), value: counters.maintainCount, taskType: 2, enabled: undefined },
+ { key: 'enabled', label: t('EquipmentManagement.TaskManagement.enabled'), value: counters.enabledCount, taskType: undefined, enabled: true },
+ { key: 'disabled', label: t('EquipmentManagement.TaskManagement.disabled'), value: counters.disabledCount, taskType: undefined, enabled: false }
+])
+const changeStatus = (key: string, taskType?: number, enabled?: boolean) => {
+ currentStatusKey.value = key
+ queryParams.taskType = taskType
+ queryParams.enabled = enabled
+ handleQuery()
+}
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
name: undefined as string | undefined,
taskType: undefined as number | undefined,
- projectForm: [] as string[]
+ projectForm: [] as string[],
+ enabled: undefined as boolean | undefined
})
const queryFormRef = ref()
const showAllFilters = ref(false)
@@ -233,6 +262,11 @@ const getList = async () => {
const data = await TaskManagementApi.getTaskManagementPage(buildQueryParams())
list.value = data.list
total.value = data.total
+ counters.allCount = Number(data?.allCount ?? data?.total ?? 0)
+ counters.inspectCount = Number(data?.inspectCount ?? 0)
+ counters.maintainCount = Number(data?.maintainCount ?? 0)
+ counters.enabledCount = Number(data?.enabledCount ?? 0)
+ counters.disabledCount = Number(data?.disabledCount ?? 0)
} finally {
loading.value = false
updatePlanTableMaxHeight()
@@ -246,6 +280,9 @@ const handleQuery = () => {
const resetQuery = () => {
queryFormRef.value.resetFields()
+ currentStatusKey.value = 'all'
+ queryParams.taskType = undefined
+ queryParams.enabled = undefined
handleQuery()
}
@@ -358,3 +395,44 @@ onBeforeUnmount(() => {
window.removeEventListener("resize", updatePlanTableMaxHeight)
})
+
+
diff --git a/src/views/mold/workOrderInquiry/index.vue b/src/views/mold/workOrderInquiry/index.vue
index d77b72cc..72420377 100644
--- a/src/views/mold/workOrderInquiry/index.vue
+++ b/src/views/mold/workOrderInquiry/index.vue
@@ -1,6 +1,13 @@
+
[
+ { key: 'all', label: t('MoldManagement.MoldWorkOrderInquiry.all'), value: counters.allCount, planType: undefined, jobStatus: undefined },
+ { key: 'inspect', label: t('MoldManagement.MoldWorkOrderInquiry.planTypeInspect'), value: counters.inspectCount, planType: '1', jobStatus: undefined },
+ { key: 'maintain', label: t('MoldManagement.MoldWorkOrderInquiry.planTypeMaintain'), value: counters.maintainCount, planType: '2', jobStatus: undefined },
+ { key: 'unworked', label: t('MoldManagement.MoldWorkOrderInquiry.unworked'), value: counters.unworkedCount, planType: undefined, jobStatus: '0' },
+ { key: 'worked', label: t('MoldManagement.MoldWorkOrderInquiry.worked'), value: counters.workedCount, planType: undefined, jobStatus: '1' },
+ { key: 'overtimeUnworked', label: t('MoldManagement.MoldWorkOrderInquiry.overtimeUnworked'), value: counters.overtimeUnworkedCount, planType: undefined, jobStatus: '2' },
+ { key: 'overtimeWorked', label: t('MoldManagement.MoldWorkOrderInquiry.overtimeWorked'), value: counters.overtimeWorkedCount, planType: undefined, jobStatus: '3' },
+ { key: 'canceled', label: t('MoldManagement.MoldWorkOrderInquiry.canceled'), value: counters.canceledCount, planType: undefined, jobStatus: '4' }
+])
+const changeStatus = (key: string, planType?: string, jobStatus?: string) => {
+ currentStatusKey.value = key
+ queryParams.planType = planType
+ queryParams.jobStatus = jobStatus
+ handleQuery()
+}
const showAllFilters = ref(false)
const filterCount = 6
const UNWORKED_JOB_STATUS = '0'
@@ -234,6 +268,14 @@ const getList = async () => {
const data = await TicketManagementApi.getTicketManagementPage(buildQueryParams())
list.value = data.list
total.value = data.total
+ counters.allCount = Number(data?.allCount ?? data?.total ?? 0)
+ counters.inspectCount = Number(data?.inspectCount ?? 0)
+ counters.maintainCount = Number(data?.maintainCount ?? 0)
+ counters.unworkedCount = Number(data?.unworkedCount ?? 0)
+ counters.workedCount = Number(data?.workedCount ?? 0)
+ counters.overtimeUnworkedCount = Number(data?.overtimeUnworkedCount ?? 0)
+ counters.overtimeWorkedCount = Number(data?.overtimeWorkedCount ?? 0)
+ counters.canceledCount = Number(data?.canceledCount ?? 0)
} finally {
loading.value = false
updatePlanTableMaxHeight()
@@ -247,6 +289,9 @@ const handleQuery = () => {
const resetQuery = () => {
queryFormRef.value.resetFields()
+ currentStatusKey.value = 'all'
+ queryParams.planType = undefined
+ queryParams.jobStatus = '0'
handleQuery()
}
@@ -338,3 +383,44 @@ onBeforeUnmount(() => {
})
+
+