diff --git a/src/api/mes/dvrepair/index.ts b/src/api/mes/dvrepair/index.ts index 63942c09..534b4b23 100644 --- a/src/api/mes/dvrepair/index.ts +++ b/src/api/mes/dvrepair/index.ts @@ -25,6 +25,7 @@ export interface DvRepairVO { replacementParts?: string // 更换配件 repairContent?: string // 维修内容 repairedImages?: string // 维修后图片,逗号分隔 + repairReporter?: string // 报修人员 acceptedBy: string // 维修人员 confirmBy: string // 验收人员 faultLevel?: string // 故障等级 diff --git a/src/api/mold/moldrepair/index.ts b/src/api/mold/moldrepair/index.ts index c23584fe..8c14b0de 100644 --- a/src/api/mold/moldrepair/index.ts +++ b/src/api/mold/moldrepair/index.ts @@ -17,6 +17,7 @@ export interface MoldRepairVO { finishDate: Date confirmDate: Date repairResult: string + repairReporter?: string // 报修人员 acceptedBy: string confirmBy: string status: string diff --git a/src/api/mold/taskManagement/index.ts b/src/api/mold/taskManagement/index.ts index 0fa1a402..266f1263 100644 --- a/src/api/mold/taskManagement/index.ts +++ b/src/api/mold/taskManagement/index.ts @@ -48,5 +48,10 @@ export const TaskManagementApi = { exportTaskManagement: async (params: any) => { return await request.download({ url: `/mes/mold-task-management/export-excel`, params }) + }, + + updateTaskManagementEnabled: async (id: number | string, enabled: string) => { + const data = { id, enabled } + return await request.put({ url: `/mes/mold-task-management/update-enabled`, data }) } } diff --git a/src/api/mold/ticketManagement/index.ts b/src/api/mold/ticketManagement/index.ts index e85bc695..50ab32dc 100644 --- a/src/api/mold/ticketManagement/index.ts +++ b/src/api/mold/ticketManagement/index.ts @@ -54,6 +54,10 @@ export const TicketManagementApi = { return await request.put({ url: `/mes/mold-ticket-results/batchUpdate`, data }) }, + exportTicketManagement: async (params: any) => { + return await request.download({ url: `/mes/mold-ticket-management/export-excel`, params }) + }, + getInspectionByMoldId: async (params: { moldId: number; startTime?: string; endTime?: string }) => { return await request.get({ url: `/mes/mold-ticket-management/getInspectionByMoldId`, params }) }, diff --git a/src/locales/en.ts b/src/locales/en.ts index 81b7d0c5..18e36632 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -2236,6 +2236,7 @@ export default { machineryTypeId: 'Device Type', device: 'Device', component: 'Key Component', + repairReporter: 'Repair Reporter', acceptedBy: 'Repairer', confirmBy: 'Inspector', faultLevel: 'Failure Level', @@ -2284,6 +2285,7 @@ export default { placeholderRepairCode: 'Please input repair order no', placeholderRepairName: 'Please input repair order name', placeholderMachineryName: 'Please input device name', + placeholderRepairReporter: 'Please select repair reporter', placeholderAcceptedBy: 'Please input repairer', placeholderConfirmBy: 'Please input inspector', placeholderStatus: 'Please select order status', @@ -3617,6 +3619,7 @@ export default { moldCode: 'Mold Code', moldName: 'Mold Name', repairUser: 'Repair User', + repairReporter: 'Repair Reporter', confirmUser: 'Acceptance User', requireDate: 'Request Date', finishDate: 'Finish Date', @@ -3660,6 +3663,7 @@ export default { placeholderMold: 'Please select mold', placeholderAcceptUser: 'Please select repair user', placeholderConfirmUser: 'Please select acceptance user', + placeholderRepairReporter: 'Please select repair reporter', placeholderRequireDate: 'Select request date', placeholderFinishDate: 'Select finish date', placeholderConfirmDate: 'Select acceptance date', @@ -3828,6 +3832,7 @@ export default { operatorName: 'Operator', taskTime: 'Job Time', taskEndTime: 'Planned End Time', + taskTimeRange: 'Job Time', createTime: 'Create Time', index: 'Index', remark: 'Remark', @@ -3837,10 +3842,16 @@ export default { placeholderPlanType: 'Please select type', placeholderJobStatus: 'Please select job status', placeholderJobResult: 'Please select result', + placeholderOperatorName: 'Please select operator', + placeholderTaskTime: 'Please select job start time', + placeholderTaskEndTime: 'Please select job end time', query: 'Query', reset: 'Reset', cancelConfirm: 'Confirm cancel selected tasks?', cancelSuccess: 'Cancel task successful', + cancelOnlyUnworkedTip: 'Only unworked tickets can be canceled', + export: 'Export', + exportFilename: 'Mold Work Order Inquiry.xls', inspectResultTitlePrefix: 'Inspection Result-', inspectResultTitle: 'Inspection Result' }, diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 54c42029..4f0416ec 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -2198,6 +2198,7 @@ export default { cancelReason: '取消原因', cancelConfirm: '确认取消选中的任务吗?', cancelSuccess: '取消任务成功', + cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务', cancelFail: '取消任务失败', cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务', selectAllDecisionError: '请先为所有待检测记录选择通过或不通过', @@ -2229,6 +2230,7 @@ export default { machineryTypeId: '设备类型', device: '设备', component: '关键件', + repairReporter: '报修人员', acceptedBy: '维修人员', confirmBy: '验收人员', faultLevel: '故障等级', @@ -2277,6 +2279,7 @@ export default { placeholderRepairCode: '请输入维修单编号', placeholderRepairName: '请输入维修单名称', placeholderMachineryName: '请输入设备名称', + placeholderRepairReporter: '请选择报修人员', placeholderAcceptedBy: '请输入维修人员', placeholderConfirmBy: '请输入验收人员', placeholderStatus: '请选择单据状态', @@ -3087,6 +3090,7 @@ export default { moldCode: '模具编码', moldName: '模具名称', repairUser: '维修人员', + repairReporter: '报修人员', confirmUser: '验收人员', requireDate: '报修日期', finishDate: '完成日期', @@ -3130,6 +3134,7 @@ export default { placeholderMold: '请选择模具', placeholderAcceptUser: '请选择维修人员', placeholderConfirmUser: '请选择验收人员', + placeholderRepairReporter: '请选择报修人员', placeholderRequireDate: '选择报修日期', placeholderFinishDate: '选择完成日期', placeholderConfirmDate: '选择验收日期', @@ -3298,6 +3303,7 @@ export default { operatorName: '作业人', taskTime: '作业时间', taskEndTime: '计划结束作业时间', + taskTimeRange: '作业时间', createTime: '创建时间', index: '序号', remark: '备注', @@ -3307,10 +3313,16 @@ export default { placeholderPlanType: '请选择类型', placeholderJobStatus: '请选择作业状态', placeholderJobResult: '请选择结果', + placeholderOperatorName: '请选择作业人', + placeholderTaskTime: '请选择作业开始时间', + placeholderTaskEndTime: '请选择作业结束时间', query: '查询', reset: '重置', cancelConfirm: '确认取消选中的任务吗?', cancelSuccess: '取消任务成功', + cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务', + export: '导出', + exportFilename: '模具工单查询.xls', inspectResultTitlePrefix: '检验结果-', inspectResultTitle: '检验结果' }, diff --git a/src/views/erp/mold/components/MoldMaintainView.vue b/src/views/erp/mold/components/MoldMaintainView.vue index 764bf7b6..16711485 100644 --- a/src/views/erp/mold/components/MoldMaintainView.vue +++ b/src/views/erp/mold/components/MoldMaintainView.vue @@ -245,6 +245,16 @@ + + + + + + + ({ projectForm: taskFormData.projectForm, repairName: repairFormData.repairName, requireDate: repairFormData.requireDate, + repairReporter: repairFormData.repairReporter, faultLevel: repairFormData.faultLevel, shutdown: repairFormData.shutdown, faultPhenomenon: repairFormData.faultPhenomenon, @@ -562,6 +575,7 @@ const repairFormData = reactive({ repairCode: undefined as string | undefined, repairName: undefined as string | undefined, requireDate: undefined as number | string | undefined, + repairReporter: undefined as string | undefined, acceptedBy: undefined as string | undefined, confirmBy: undefined as string | undefined, faultLevel: undefined as string | undefined, @@ -879,6 +893,12 @@ const selectMaintainType = async (type: number) => { if (type === 3 && !repairFormData.requireDate) { repairFormData.requireDate = Date.now() } + if (type === 3 && !repairFormData.repairReporter) { + const currentUserId = userStore.getUser?.id + if (currentUserId !== undefined && currentUserId !== null && Number(currentUserId) > 0) { + repairFormData.repairReporter = String(currentUserId) + } + } handleMaintainTypeChange() // 切换类型时刷新对应下拉框选项 await initOptions() @@ -933,6 +953,7 @@ const submitForm = async () => { requireDate: repairFormData.requireDate, repairResult: '', repairStatus: '', + repairReporter: normalizeUserId(repairFormData.repairReporter), acceptedBy: normalizeUserId(repairFormData.acceptedBy), confirmBy: normalizeUserId(repairFormData.confirmBy), faultLevel: repairFormData.faultLevel, @@ -951,6 +972,7 @@ const submitForm = async () => { repairFormData.repairCode = undefined repairFormData.repairName = undefined repairFormData.requireDate = Date.now() + repairFormData.repairReporter = undefined repairFormData.acceptedBy = undefined repairFormData.confirmBy = undefined repairFormData.faultLevel = undefined @@ -995,6 +1017,15 @@ const open = async () => { repairFormData.requireDate = Date.now() replaceNetFormData.pressureNetTime = getCurrentDateTime() await initOptions() + if (!userStore.getIsSetUser) { + try { + await userStore.setUserInfoAction() + } catch (e) {} + } + const currentUserId = userStore.getUser?.id + if (currentUserId !== undefined && currentUserId !== null && Number(currentUserId) > 0) { + repairFormData.repairReporter = String(currentUserId) + } } defineExpose({ open }) diff --git a/src/views/erp/mold/detail/brand.vue b/src/views/erp/mold/detail/brand.vue index 49cd7e53..222ec53c 100644 --- a/src/views/erp/mold/detail/brand.vue +++ b/src/views/erp/mold/detail/brand.vue @@ -182,6 +182,9 @@
{{ t('MoldManagement.MoldBrandDetail.requireDate') }}{{ formatHistoryTime(row.requireDate) }}
+
{{ t('MoldManagement.MoldRepair.repairReporter') }}{{ row.repairReporterName ?? row.repairReporter ?? '-' }}
{{ t('MoldManagement.MoldRepair.repairUser') }}{{ row.acceptedByName ?? row.acceptedName ?? row.acceptedBy ?? '-' }}
diff --git a/src/views/erp/stock/move/components/StockMoveItemForm.vue b/src/views/erp/stock/move/components/StockMoveItemForm.vue index 24aad8f7..a48e1b66 100644 --- a/src/views/erp/stock/move/components/StockMoveItemForm.vue +++ b/src/views/erp/stock/move/components/StockMoveItemForm.vue @@ -51,7 +51,11 @@ @@ -166,7 +175,12 @@ + 添加调拨产品
- + - + +
@@ -229,6 +252,7 @@ import { ProductApi } from '@/api/erp/product/product' import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse' import { StockMoveApi } from '@/api/erp/stock/move' +import { StockApi } from '@/api/erp/stock/stock' import { erpCountInputFormatter, getSumValue } from '@/utils' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' @@ -245,17 +269,31 @@ const formData = ref([]) const sameAreaMessage = '调出库区和调入库区不能相同' const formRules = reactive({ inId: [{ required: true, message: '调度编号不能为空', trigger: 'submit' }], - fromWarehouseId: [{ required: true, message: t('ErpStock.Move.item.validatorFromWarehouseRequired'), trigger: 'submit' }], + fromWarehouseId: [ + { + required: true, + message: t('ErpStock.Move.item.validatorFromWarehouseRequired'), + trigger: 'submit' + } + ], fromAreaId: [ { required: true, message: t('ErpStock.Item.validatorAreaRequired'), trigger: 'submit' }, { validator: validateDifferentArea, trigger: ['change', 'submit'] } ], - toWarehouseId: [{ required: true, message: t('ErpStock.Move.item.validatorToWarehouseRequired'), trigger: 'submit' }], + toWarehouseId: [ + { + required: true, + message: t('ErpStock.Move.item.validatorToWarehouseRequired'), + trigger: 'submit' + } + ], toAreaId: [ { required: true, message: t('ErpStock.Item.validatorAreaRequired'), trigger: 'submit' }, { validator: validateDifferentArea, trigger: ['change', 'submit'] } ], - productId: [{ required: true, message: t('ErpStock.Item.validatorProductRequired'), trigger: 'submit' }], + productId: [ + { required: true, message: t('ErpStock.Item.validatorProductRequired'), trigger: 'submit' } + ], count: [ { required: true, message: t('ErpStock.Item.validatorCountRequired'), trigger: 'submit' }, { validator: validateStockMoveCount, trigger: ['change', 'submit'] } @@ -269,11 +307,12 @@ const productDialogVisible = ref(false) const productDialogLoading = ref(false) const productDialogList = ref([]) const productDialogTotal = ref(0) -const selectedProductId = ref() +const selectedProductId = ref() const productQueryParams = reactive({ pageNo: 1, pageSize: 10, categoryType: undefined as number | undefined, + stockNotZero: true, barCode: undefined as string | undefined, name: undefined as string | undefined }) @@ -319,7 +358,9 @@ function getSummaries(param: SummaryMethodProps) { return } if (column.property === 'count') { - sums[index] = erpCountInputFormatter(getSumValue(data.map((item) => Number(item[column.property])))) + sums[index] = erpCountInputFormatter( + getSumValue(data.map((item) => Number(item[column.property]))) + ) } else { sums[index] = '' } @@ -359,7 +400,11 @@ function handleDelete(index) { } function isSameMoveArea(row) { - return row.fromAreaId !== undefined && row.toAreaId !== undefined && String(row.fromAreaId) === String(row.toAreaId) + return ( + row.fromAreaId !== undefined && + row.toAreaId !== undefined && + String(row.fromAreaId) === String(row.toAreaId) + ) } function validateDifferentArea(rule, _value, callback) { @@ -427,7 +472,9 @@ function warnIfSameArea(row) { function validateAreaFields(row) { const rowIndex = formData.value.indexOf(row) if (rowIndex < 0) return - formRef.value?.validateField([`${rowIndex}.fromAreaId`, `${rowIndex}.toAreaId`]).catch(() => undefined) + formRef.value + ?.validateField([`${rowIndex}.fromAreaId`, `${rowIndex}.toAreaId`]) + .catch(() => undefined) } async function handleFromAreaChange(row) { @@ -491,8 +538,9 @@ async function getProductDialogList() { productDialogLoading.value = true try { productQueryParams.categoryType = props.categoryType - const data = await ProductApi.getProductPage(productQueryParams) - productDialogList.value = data?.list || [] + productQueryParams.stockNotZero = true + const data = await StockApi.getStockPage(productQueryParams) + productDialogList.value = normalizeStockProductOptions(data?.list || []) productDialogTotal.value = data?.total || 0 } finally { productDialogLoading.value = false @@ -505,12 +553,14 @@ function handleProductDialogQuery() { } function handleProductDialogRowClick(row: any) { - selectedProductId.value = row.id + selectedProductId.value = getProductOptionId(row) } async function confirmProductSelect() { if (props.disabled) return - const product = productDialogList.value.find((item) => item.id === selectedProductId.value) + const product = productDialogList.value.find( + (item) => String(getProductOptionId(item)) === String(selectedProductId.value) + ) if (!product || !currentSelectRow.value) return fillRowByProduct(currentSelectRow.value, product) await loadProductStockList(currentSelectRow.value) @@ -518,11 +568,11 @@ async function confirmProductSelect() { } function fillRowByProduct(row, product) { - row.productId = product.id - row.productName = product.name - row.productUnitName = product.unitName + row.productId = getProductOptionId(product) + row.productName = product.name || product.productName + row.productUnitName = product.unitName || product.purchaseUnitName row.purchaseUnitName = product.purchaseUnitName - row.unitName = product.unitName + row.unitName = product.unitName || product.purchaseUnitName row.productBarCode = product.barCode row.fromWarehouseId = undefined row.fromAreaId = undefined @@ -564,6 +614,34 @@ async function loadOptions() { } } +function getProductOptionId(item) { + return item?.productId ?? item?.id +} + +function getProductOptionRowKey(row) { + return [getProductOptionId(row), row.warehouseId, row.areaId, row.stockId || row.id] + .filter((item) => item !== undefined && item !== null && item !== '') + .join('-') +} + +function normalizeStockProductOptions(list) { + const map = new Map() + ;(list || []).forEach((item) => { + const productId = getProductOptionId(item) + if (!productId || map.has(String(productId))) return + map.set(String(productId), { + ...item, + id: productId, + productId, + name: item.name || item.productName, + unitName: item.unitName || item.purchaseUnitName, + subCategoryName: item.subCategoryName || item.categoryName, + stockDisplay: item.stockDisplay || item.totalBaseCount || item.count || item.stockCount + }) + }) + return Array.from(map.values()) +} + function normalizeProductStockList(data) { if (Array.isArray(data)) return data if (Array.isArray(data?.list)) return data.list @@ -597,7 +675,9 @@ async function fillProductStockAreaInfo(stockList) { stockList .filter((item) => Number(getStockWarehouseId(item)) === Number(warehouseId)) .forEach((item) => { - const area = areaList.find((areaItem) => Number(areaItem.id) === Number(getStockAreaId(item))) + const area = areaList.find( + (areaItem) => Number(areaItem.id) === Number(getStockAreaId(item)) + ) if (!area) return item.areaCode = area.areaCode item.areaName = area.areaName @@ -624,7 +704,9 @@ function getFromWarehouseOptions(row) { return appendOptionIfMissing( Array.from(warehouseMap.values()), row.fromWarehouseId, - row.fromWarehouseName ? { warehouseId: row.fromWarehouseId, warehouseName: row.fromWarehouseName } : undefined, + row.fromWarehouseName + ? { warehouseId: row.fromWarehouseId, warehouseName: row.fromWarehouseName } + : undefined, getStockWarehouseId ) } @@ -668,9 +750,11 @@ function getToWarehouseOptions(row) { } function getToAreaOptions(row) { - const areaOptions = Array.isArray(row.toAreaList) && row.toAreaList.length > 0 - ? row.toAreaList - : warehouseList.value.find((item) => Number(item.id) === Number(row.toWarehouseId))?.areaList || [] + const areaOptions = + Array.isArray(row.toAreaList) && row.toAreaList.length > 0 + ? row.toAreaList + : warehouseList.value.find((item) => Number(item.id) === Number(row.toWarehouseId)) + ?.areaList || [] return appendOptionIfMissing( areaOptions, row.toAreaId, diff --git a/src/views/iot/deviceParamAnalysis/index.vue b/src/views/iot/deviceParamAnalysis/index.vue index 5b69fdb3..e04dc2d4 100644 --- a/src/views/iot/deviceParamAnalysis/index.vue +++ b/src/views/iot/deviceParamAnalysis/index.vue @@ -345,23 +345,21 @@ const buildTreeFromApi = (orgs: ApiTreeOrg[]): DeviceTreeNode[] => { return Array.isArray(orgTree) ? orgTree.map(toOrgNode) : [] } -const hasOrgClassInSubtree = (node: DeviceTreeNode, targetOrgClass: string): boolean => { +const hasEquipmentInSubtree = (node: DeviceTreeNode): boolean => { const children = Array.isArray(node?.children) ? node.children : [] for (const child of children) { - if (child?.orgClass === targetOrgClass) return true - if (hasOrgClassInSubtree(child, targetOrgClass)) return true + if (child?.tag === 'equipment') return true + if (hasEquipmentInSubtree(child)) return true } return false } -const buildDefaultExpandedKeys = (nodes: DeviceTreeNode[], stopOrgClass: string): string[] => { +const buildDefaultExpandedKeys = (nodes: DeviceTreeNode[]): string[] => { const keys: string[] = [] const walk = (list: DeviceTreeNode[]) => { for (const node of list) { - if (node?.type === 'device' && node?.orgClass && node.orgClass !== stopOrgClass) { - if (hasOrgClassInSubtree(node, stopOrgClass)) { - keys.push(node.id) - } + if (node?.type === 'device' && node?.tag !== 'equipment' && hasEquipmentInSubtree(node)) { + keys.push(node.id) } const children = Array.isArray(node?.children) ? node.children : [] if (children.length) walk(children) @@ -388,7 +386,7 @@ const loadTree = async () => { filterNoDeviceLine: 1 }) treeData.value = buildTreeFromApi(extractApiOrgs(res)) - defaultExpandedKeys.value = buildDefaultExpandedKeys(treeData.value, 'pipeline') + defaultExpandedKeys.value = buildDefaultExpandedKeys(treeData.value) await nextTick() treeRef.value?.setExpandedKeys?.(defaultExpandedKeys.value) if (keyword.value) { diff --git a/src/views/mes/dvrepair/DvRepairForm.vue b/src/views/mes/dvrepair/DvRepairForm.vue index 240b2b4f..632d85f7 100644 --- a/src/views/mes/dvrepair/DvRepairForm.vue +++ b/src/views/mes/dvrepair/DvRepairForm.vue @@ -57,6 +57,20 @@ + + + + + + + { const { t } = useI18n() const message = useMessage() +const userStore = useUserStore() const createDefaultFormData = (): DvRepairFormData => ({ id: undefined, @@ -436,6 +452,7 @@ const createDefaultFormData = (): DvRepairFormData => ({ replacementParts: undefined, repairContent: undefined, repairedImages: '', + repairReporter: undefined, acceptedBy: undefined, confirmBy: undefined, faultLevel: undefined, @@ -855,6 +872,7 @@ const open = async (type: string, id?: number) => { repairedImages: normalizeImageString(detail?.repairedImages), acceptedBy: normalizeUserId(detail?.acceptedBy), confirmBy: normalizeUserId(detail?.confirmBy), + repairReporter: normalizeUserId(detail?.repairReporter), faultLevel: detail?.faultLevel === undefined || detail?.faultLevel === null ? undefined : String(detail?.faultLevel) } @@ -889,6 +907,17 @@ const open = async (type: string, id?: number) => { formLoading.value = false } } else { + if (formType.value === 'create') { + if (!userStore.getIsSetUser) { + try { + await userStore.setUserInfoAction() + } catch (e) {} + } + const currentUserId = userStore.getUser?.id + if (currentUserId !== undefined && currentUserId !== null && Number(currentUserId) > 0) { + formData.value.repairReporter = String(currentUserId) + } + } await nextTick() formRef.value?.clearValidate?.() } @@ -921,6 +950,7 @@ const submitForm = async () => { const data = { ...(formData.value as DvRepairFormData) } as DvRepairFormData & Record data.acceptedBy = normalizeUserId(data.acceptedBy) data.confirmBy = normalizeUserId(data.confirmBy) + data.repairReporter = normalizeUserId(data.repairReporter) data.faultLevel = data.faultLevel === undefined || data.faultLevel === null || String(data.faultLevel).trim() === '' ? undefined : String(data.faultLevel) data.faultImages = normalizeImageString(data.faultImages) data.repairedImages = normalizeImageString(data.repairedImages) diff --git a/src/views/mes/dvrepair/index.vue b/src/views/mes/dvrepair/index.vue index cc777977..ca8f25c3 100644 --- a/src/views/mes/dvrepair/index.vue +++ b/src/views/mes/dvrepair/index.vue @@ -174,6 +174,7 @@ prop="confirmDate" :formatter="dateFormatter2" width="110px" sortable /> + diff --git a/src/views/mes/energydevicecheck/index.vue b/src/views/mes/energydevicecheck/index.vue index 2ac9c603..79ef229d 100644 --- a/src/views/mes/energydevicecheck/index.vue +++ b/src/views/mes/energydevicecheck/index.vue @@ -8,9 +8,18 @@ - - - + @@ -93,7 +102,7 @@ v-if="getPointDetailsRows(scope.row).length" :data="getPointDetailsRows(scope.ro +