From 29e0d17d6008ce8f5728f9ec25c9bf20e6be7a21 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 9 Jul 2026 09:36:46 +0800 Subject: [PATCH 1/9] =?UTF-8?q?style=EF=BC=9A=E5=BA=93=E5=AD=98=E8=B0=83?= =?UTF-8?q?=E6=8B=A8-=E4=BA=A7=E5=93=81/=E7=89=A9=E6=96=99/=E5=A4=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8B=E6=8B=89=E6=95=B0=E6=8D=AE=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E6=9F=A5=E8=AF=A2=E9=87=8C=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../move/components/StockMoveItemForm.vue | 135 ++++++++++++++---- 1 file changed, 109 insertions(+), 26 deletions(-) diff --git a/src/views/erp/stock/move/components/StockMoveItemForm.vue b/src/views/erp/stock/move/components/StockMoveItemForm.vue index 24aad8f7..aa501f8c 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,33 @@ 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) { + return (list || []) + .map((item) => { + const productId = getProductOptionId(item) + return { + ...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 + } + }) + .filter((item) => item.productId) +} + function normalizeProductStockList(data) { if (Array.isArray(data)) return data if (Array.isArray(data?.list)) return data.list @@ -597,7 +674,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 +703,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 +749,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, From ceb8b3fdb957d99bc9d938d94bb0d3007364de33 Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 9 Jul 2026 10:11:29 +0800 Subject: [PATCH 2/9] =?UTF-8?q?style=EF=BC=9A=E8=AE=BE=E5=A4=87=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E5=8F=82=E6=95=B0=E5=88=86=E6=9E=90-=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=B1=95=E5=BC=80=E5=88=B0=E8=AE=BE=E5=A4=87=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../move/components/StockMoveItemForm.vue | 27 ++++++++++--------- src/views/iot/deviceParamAnalysis/index.vue | 16 +++++------ 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/views/erp/stock/move/components/StockMoveItemForm.vue b/src/views/erp/stock/move/components/StockMoveItemForm.vue index aa501f8c..a48e1b66 100644 --- a/src/views/erp/stock/move/components/StockMoveItemForm.vue +++ b/src/views/erp/stock/move/components/StockMoveItemForm.vue @@ -625,20 +625,21 @@ function getProductOptionRowKey(row) { } function normalizeStockProductOptions(list) { - return (list || []) - .map((item) => { - const productId = getProductOptionId(item) - return { - ...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 - } + 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 }) - .filter((item) => item.productId) + }) + return Array.from(map.values()) } function normalizeProductStockList(data) { 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) { From 26b59f9ad2411a0f0d498ae91c938264c3d17b1c Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Thu, 9 Jul 2026 12:45:11 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E7=82=B9=E6=A3=80=E4=BF=9D=E5=85=BB-?= =?UTF-8?q?=E7=82=B9=E6=A3=80=E4=BF=9D=E5=85=BB=E8=AE=B0=E5=BD=95-?= =?UTF-8?q?=E6=A8=A1=E5=85=B7=E5=B7=A5=E5=8D=95=E5=88=97=E8=A1=A8=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=8F=96=E6=B6=88=E9=80=BB=E8=BE=91=E5=92=8C=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E6=8C=89=E9=92=AE=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/mold/ticketManagement/index.ts | 4 + src/locales/en.ts | 7 ++ src/locales/zh-CN.ts | 8 ++ .../components/TicketResultDialog.vue | 23 +++-- src/views/mold/workOrderInquiry/index.vue | 87 +++++++++++++++++-- 5 files changed, 112 insertions(+), 17 deletions(-) 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..11efe055 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -3828,6 +3828,7 @@ export default { operatorName: 'Operator', taskTime: 'Job Time', taskEndTime: 'Planned End Time', + taskTimeRange: 'Job Time', createTime: 'Create Time', index: 'Index', remark: 'Remark', @@ -3837,10 +3838,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..99168640 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: '请先为所有待检测记录选择通过或不通过', @@ -3298,6 +3299,7 @@ export default { operatorName: '作业人', taskTime: '作业时间', taskEndTime: '计划结束作业时间', + taskTimeRange: '作业时间', createTime: '创建时间', index: '序号', remark: '备注', @@ -3307,10 +3309,16 @@ export default { placeholderPlanType: '请选择类型', placeholderJobStatus: '请选择作业状态', placeholderJobResult: '请选择结果', + placeholderOperatorName: '请选择作业人', + placeholderTaskTime: '请选择作业开始时间', + placeholderTaskEndTime: '请选择作业结束时间', query: '查询', reset: '重置', cancelConfirm: '确认取消选中的任务吗?', cancelSuccess: '取消任务成功', + cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务', + export: '导出', + exportFilename: '模具工单查询.xls', inspectResultTitlePrefix: '检验结果-', inspectResultTitle: '检验结果' }, diff --git a/src/views/mold/workOrderInquiry/components/TicketResultDialog.vue b/src/views/mold/workOrderInquiry/components/TicketResultDialog.vue index 32d1f6cb..365c68e1 100644 --- a/src/views/mold/workOrderInquiry/components/TicketResultDialog.vue +++ b/src/views/mold/workOrderInquiry/components/TicketResultDialog.vue @@ -4,6 +4,17 @@
{{ t('common.back') }} {{ pageTitle }} +
+ + {{ t('MoldManagement.TicketResultDialog.save') }} + +
@@ -141,14 +152,8 @@ v-model:page-size="queryParams.pageSize" :background="true" :page-sizes="[10, 20, 30, 50, 100]" :pager-count="7" :total="total" class="mt-15px mb-15px flex justify-end" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> - - +
@@ -386,9 +391,9 @@ const parseImages = (value: any): string[] => { color: var(--el-text-color-primary); } -.ticket-result-footer { +.ticket-result-actions { + margin-left: auto; display: flex; - justify-content: flex-end; gap: 12px; } diff --git a/src/views/mold/workOrderInquiry/index.vue b/src/views/mold/workOrderInquiry/index.vue index 3439990a..9ab5c258 100644 --- a/src/views/mold/workOrderInquiry/index.vue +++ b/src/views/mold/workOrderInquiry/index.vue @@ -41,6 +41,27 @@
+ + + + + + + + @@ -54,13 +75,16 @@ {{ t('MoldManagement.MoldWorkOrderInquiry.query') }} + + {{ t('MoldManagement.MoldWorkOrderInquiry.export') }} +
- + {{ t('MoldManagement.MoldWorkOrderInquiry.cancelTask') }}
@@ -125,6 +149,7 @@ import { dateFormatter } from '@/utils/formatTime' import { getStrDictOptions } from '@/utils/dict' import { useDictStoreWithOut } from '@/store/modules/dict' import { TicketManagementApi, TicketManagementVO } from '@/api/mold/ticketManagement' +import { getSimpleUserList, UserVO } from '@/api/system/user' import TicketResultDialog from '@/views/mold/workOrderInquiry/components/TicketResultDialog.vue' const { t } = useI18n() @@ -139,8 +164,8 @@ const planTypeOptions = [ { label: t('MoldManagement.MoldWorkOrderInquiry.planTypeMaintain'), value: '2' } ] const jobResultOptions = [ - { label: t('MoldManagement.MoldWorkOrderInquiry.jobResultOk'), value: 'OK' }, - { label: t('MoldManagement.MoldWorkOrderInquiry.jobResultNg'), value: 'NG' } + { label: t('MoldManagement.MoldWorkOrderInquiry.jobResultOk'), value: '1' }, + { label: t('MoldManagement.MoldWorkOrderInquiry.jobResultNg'), value: '2' } ] const loading = ref(true) @@ -159,7 +184,10 @@ const updatePlanTableMaxHeight = async () => { planTableMaxHeight.value = Math.min(window.innerHeight, Math.max(240, Math.floor(availableHeight))) } const selectedIds = ref([]) +const selectedRows = ref([]) const cancelLoading = ref(false) +const exportLoading = ref(false) +const users = ref([]) const resultVisible = ref(false) const selectedResultRow = ref() const resultTitle = computed(() => { @@ -175,22 +203,36 @@ const queryParams = reactive({ pageSize: 10, planNo: undefined as string | undefined, planType: undefined as string | undefined, - jobStatus: undefined as string | undefined, - jobResult: undefined as string | undefined + jobStatus: '0' as string | undefined, + jobResult: undefined as string | undefined, + operator: undefined as string | undefined, + taskTimeRange: [] as string[] }) const queryFormRef = ref() const showAllFilters = ref(false) -const filterCount = 4 +const filterCount = 6 +const UNWORKED_JOB_STATUS = '0' +const CANCELED_JOB_STATUS = '4' + const toggleFilters = () => { showAllFilters.value = !showAllFilters.value updatePlanTableMaxHeight() } +const buildQueryParams = () => { + const { taskTimeRange, ...params } = queryParams + return { + ...params, + taskTime: taskTimeRange?.[0], + taskEndTime: taskTimeRange?.[1] + } +} + const getList = async () => { loading.value = true try { - const data = await TicketManagementApi.getTicketManagementPage(queryParams) + const data = await TicketManagementApi.getTicketManagementPage(buildQueryParams()) list.value = data.list total.value = data.total } finally { @@ -210,13 +252,22 @@ const resetQuery = () => { } const handleSelectionChange = (rows: TicketManagementVO[]) => { + selectedRows.value = rows selectedIds.value = rows .map((r) => r.id) .filter((id): id is number => typeof id === 'number') } +const isUnworkedTicket = (row?: TicketManagementVO) => String(row?.jobStatus ?? '') === UNWORKED_JOB_STATUS +const hasUncancelableSelection = computed(() => selectedRows.value.some((row) => !isUnworkedTicket(row))) +const isCancelDisabled = computed(() => !selectedIds.value.length || hasUncancelableSelection.value) + const handleBatchCancel = async () => { if (!selectedIds.value.length) return + if (hasUncancelableSelection.value) { + message.warning(t('MoldManagement.MoldWorkOrderInquiry.cancelOnlyUnworkedTip')) + return + } try { const { value } = await ElMessageBox.prompt('请输入取消原因', t('MoldManagement.MoldWorkOrderInquiry.cancelTask'), { confirmButtonText: t('common.ok'), @@ -227,11 +278,12 @@ const handleBatchCancel = async () => { cancelLoading.value = true await TicketManagementApi.batchUpdateTicketStatus({ ids: selectedIds.value.join(','), - jobStatus: '4', + jobStatus: CANCELED_JOB_STATUS, cancelReason: value }) message.success(t('MoldManagement.MoldWorkOrderInquiry.cancelSuccess')) selectedIds.value = [] + selectedRows.value = [] await getList() } catch { } finally { @@ -239,6 +291,23 @@ const handleBatchCancel = async () => { } } +const handleExport = async () => { + try { + await message.exportConfirm() + exportLoading.value = true + const params: any = { + ...buildQueryParams(), + ids: selectedIds.value.length ? selectedIds.value.join(',') : undefined + } + const data = await TicketManagementApi.exportTicketManagement(params) + const download = (await import('@/utils/download')).default + download.excel(data, t('MoldManagement.MoldWorkOrderInquiry.exportFilename')) + } catch { + } finally { + exportLoading.value = false + } +} + const handleRowClick = (row: TicketManagementVO, column: any) => { if (column?.type === 'selection') return if (!row?.id) return @@ -259,6 +328,7 @@ const handleResultSuccess = async () => { onMounted(async () => { await dictStore.setDictMap() + users.value = await getSimpleUserList() await getList() updatePlanTableMaxHeight() window.addEventListener("resize", updatePlanTableMaxHeight) @@ -268,3 +338,4 @@ onBeforeUnmount(() => { window.removeEventListener("resize", updatePlanTableMaxHeight) }) + From d4b242754774522672d8c485ef0775d5b9da39ae Mon Sep 17 00:00:00 2001 From: hwj Date: Thu, 9 Jul 2026 14:21:18 +0800 Subject: [PATCH 4/9] =?UTF-8?q?style=EF=BC=9A=E8=AE=BE=E5=A4=87=E7=BB=B4?= =?UTF-8?q?=E4=BF=AE-=E6=B7=BB=E5=8A=A0=E4=BF=9D=E4=BF=AE=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/mes/dvrepair/index.ts | 1 + src/locales/en.ts | 2 ++ src/locales/zh-CN.ts | 2 ++ src/views/mes/dvrepair/DvRepairForm.vue | 30 +++++++++++++++++++++++++ src/views/mes/dvrepair/index.vue | 1 + 5 files changed, 36 insertions(+) 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/locales/en.ts b/src/locales/en.ts index 81b7d0c5..a4c33878 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', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 54c42029..8443876a 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -2229,6 +2229,7 @@ export default { machineryTypeId: '设备类型', device: '设备', component: '关键件', + repairReporter: '报修人员', acceptedBy: '维修人员', confirmBy: '验收人员', faultLevel: '故障等级', @@ -2277,6 +2278,7 @@ export default { placeholderRepairCode: '请输入维修单编号', placeholderRepairName: '请输入维修单名称', placeholderMachineryName: '请输入设备名称', + placeholderRepairReporter: '请选择报修人员', placeholderAcceptedBy: '请输入维修人员', placeholderConfirmBy: '请输入验收人员', placeholderStatus: '请选择单据状态', 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 /> + From 52e9f0ef9e54c4e60e7f7f293bd6bb1e839b2313 Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Thu, 9 Jul 2026 14:22:35 +0800 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20=E6=A8=A1=E5=85=B7=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=A8=A1=E6=96=B0=E5=A2=9E=E5=BC=B9=E6=A1=86=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=B8=8E=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mes/moldoperate/MoldOperateForm.vue | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/views/mes/moldoperate/MoldOperateForm.vue b/src/views/mes/moldoperate/MoldOperateForm.vue index 125e1ad9..4d0734b6 100644 --- a/src/views/mes/moldoperate/MoldOperateForm.vue +++ b/src/views/mes/moldoperate/MoldOperateForm.vue @@ -19,13 +19,12 @@ @click="openCriticalComponentDialog" /> - + - + ({ remark: undefined, }) -const validateMoldId = (_rule: any, value: any, callback: (error?: Error) => void) => { - if (String(formData.value.operateType) !== '1') { - callback() - return - } - const hasValue = value !== undefined && value !== null && value !== '' - if (!hasValue) { - callback(new Error(t('MoldManagement.MoldOperate.validatorMoldRequired'))) - } else { - callback() - } -} - -const formRules = reactive({ +const formRules = computed(() => ({ operateType: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTypeRequired'), trigger: 'blur' }], deviceId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorDeviceRequired'), trigger: 'change' }], - moldId: [{ validator: validateMoldId, trigger: 'change' }], + moldId: [{ required: true, message: formType.value === 'create' ? '关联模具不能为空' : t('MoldManagement.MoldOperate.validatorMoldRequired'), trigger: 'change' }], operateTime: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTimeRequired'), trigger: 'blur' }], operatorId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperatorRequired'), trigger: 'change' }], -}) +})) const formRef = ref() // 表单 Ref /** 打开弹窗 */ @@ -409,11 +395,13 @@ watch( return } formData.value.deviceId = undefined as any + formData.value.lineId = undefined as any formData.value.moldId = undefined as any ids.value = [] moldIds.value = [] selectedDeviceRows.value = [] selectedMoldRows.value = [] + displayTopCategory.value = '' if (!val) { return } @@ -599,7 +587,9 @@ const handleDeviceSelectConfirm = async (payload: { ids: (number | string)[]; ro } else { selectedDeviceRows.value = [] formData.value.deviceId = undefined + formData.value.lineId = undefined ids.value = [] + displayTopCategory.value = '' } nextTick(() => { formRef.value?.clearValidate?.('deviceId') @@ -792,8 +782,12 @@ const openCriticalComponentDialog = async () => { } const openMoldSelectDialog = () => { - searchMoldParams.code='' - searchMoldParams.name='' + if (!formData.value.deviceId) { + message.warning('请先选择设备') + return + } + searchMoldParams.code = '' + searchMoldParams.name = '' const rows = selectedMoldRows.value.map((item) => ({ ...item, id: Number(item.id) })) moldSelectDialogRef.value?.open(rows) } From da25b84dbba5cf0aab1967515da1868e5661dbca Mon Sep 17 00:00:00 2001 From: zhongwenkai <3478244299@qq.com> Date: Thu, 9 Jul 2026 14:39:54 +0800 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20=E8=83=BD=E8=80=97=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=8D=95=E4=BD=8D=E5=AD=97=E6=AE=B5=E5=85=B3=E8=81=94?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mes/energytype/EnergyTypeForm.vue | 70 +++++++++++++++++++-- 1 file changed, 66 insertions(+), 4 deletions(-) diff --git a/src/views/mes/energytype/EnergyTypeForm.vue b/src/views/mes/energytype/EnergyTypeForm.vue index 3372d4dd..a7b871f3 100644 --- a/src/views/mes/energytype/EnergyTypeForm.vue +++ b/src/views/mes/energytype/EnergyTypeForm.vue @@ -21,10 +21,24 @@ /> - + + + + @@ -57,6 +71,8 @@