From dba8ef1ab5d24bf1dc5e6c13d0fc9cb1d708b937 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 29 Mar 2026 11:22:53 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(mes):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E8=AE=A2=E5=8D=95=E5=8F=B7=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=8F=8A=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/wm/itemreceipt/ItemReceiptForm.vue | 88 ++++++++++++++++--- src/views/mes/wm/itemreceipt/index.vue | 40 +-------- 2 files changed, 80 insertions(+), 48 deletions(-) diff --git a/src/views/mes/wm/itemreceipt/ItemReceiptForm.vue b/src/views/mes/wm/itemreceipt/ItemReceiptForm.vue index f32260ab5..9473da89d 100644 --- a/src/views/mes/wm/itemreceipt/ItemReceiptForm.vue +++ b/src/views/mes/wm/itemreceipt/ItemReceiptForm.vue @@ -6,10 +6,10 @@ :rules="formRules" label-width="110px" v-loading="formLoading" + :disabled="isDetail" > - @@ -86,13 +84,29 @@ /> @@ -103,7 +117,11 @@ import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record' import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue' import WmArrivalNoticeSelect from '@/views/mes/wm/arrivalnotice/components/WmArrivalNoticeSelect.vue' import ItemReceiptLineList from './ItemReceiptLineList.vue' -import { MesAutoCodeRuleCode, MesWmArrivalNoticeStatusEnum } from '@/views/mes/utils/constants' +import { + MesAutoCodeRuleCode, + MesWmArrivalNoticeStatusEnum, + MesWmItemReceiptStatusEnum +} from '@/views/mes/utils/constants' defineOptions({ name: 'ItemReceiptForm' }) @@ -116,6 +134,7 @@ const formData = ref({ id: undefined as number | undefined, code: undefined, name: undefined, + status: undefined as number | undefined, vendorId: undefined, noticeId: undefined, iqcId: undefined, @@ -128,9 +147,9 @@ const formRules = reactive({ vendorId: [{ required: true, message: '供应商不能为空', trigger: 'change' }] }) const formRef = ref() // 表单 Ref - -const isUpdate = computed(() => ['create', 'update'].includes(formType.value)) // 是否为编辑模式 +const isEditable = computed(() => ['create', 'update'].includes(formType.value)) // 是否为编辑模式 const isStock = computed(() => formType.value === 'stock') // 是否为上架模式 +const isDetail = computed(() => formType.value === 'detail') // 是否为详情模式 const isHeaderReadonly = computed(() => ['stock', 'detail'].includes(formType.value)) // 是否只读 const dialogTitle = computed(() => { const titles = { @@ -141,10 +160,13 @@ const dialogTitle = computed(() => { } return titles[formType.value] || formType.value }) +const originalFormData = ref('') // 原始表单数据快照,用于脏检查 /** 生成入库单编号 */ const generateCode = async () => { - formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.WM_ITEM_RECEIPT_CODE) + formData.value.code = await AutoCodeRecordApi.generateAutoCode( + MesAutoCodeRuleCode.WM_ITEM_RECEIPT_CODE + ) } /** 到货通知单变化时,自动填充供应商 */ @@ -168,6 +190,8 @@ const open = async (type: string, id?: number) => { formLoading.value = false } } + // 保存原始数据快照 + originalFormData.value = JSON.stringify(formData.value) } defineExpose({ open }) @@ -184,11 +208,14 @@ const submitForm = async () => { const res = await WmItemReceiptApi.createItemReceipt(data) message.success('新增成功') formData.value.id = res + formData.value.status = MesWmItemReceiptStatusEnum.PREPARE formType.value = 'update' } else { await WmItemReceiptApi.updateItemReceipt(data) message.success('修改成功') } + // 更新快照 + originalFormData.value = JSON.stringify(formData.value) // 发送操作成功的事件 emit('success') } finally { @@ -196,6 +223,29 @@ const submitForm = async () => { } } +/** 提交操作:表单修改过则先保存,再提交 */ +const handleSubmit = async () => { + // 校验表单 + await formRef.value.validate() + try { + await message.confirm('确认提交该采购入库单?【提交后将不能修改】') + formLoading.value = true + // 1. 表单有修改时,先保存 + if (JSON.stringify(formData.value) !== originalFormData.value) { + const data = formData.value as unknown as WmItemReceiptVO + await WmItemReceiptApi.updateItemReceipt(data) + } + // 2. 提交入库单 + await WmItemReceiptApi.submitItemReceipt(formData.value.id!) + message.success('提交成功') + dialogVisible.value = false + emit('success') + } catch { + } finally { + formLoading.value = false + } +} + /** 执行上架 */ const handleStock = async () => { try { @@ -211,12 +261,28 @@ const handleStock = async () => { } } +/** 执行入库 */ +const handleFinish = async () => { + try { + await message.confirm('确认执行入库?执行后将更新库存台账。') + formLoading.value = true + await WmItemReceiptApi.finishItemReceipt(formData.value.id!) + message.success('入库成功') + dialogVisible.value = false + emit('success') + } catch { + } finally { + formLoading.value = false + } +} + /** 重置表单 */ const resetForm = () => { formData.value = { id: undefined, code: undefined, name: undefined, + status: undefined, vendorId: undefined, noticeId: undefined, iqcId: undefined, diff --git a/src/views/mes/wm/itemreceipt/index.vue b/src/views/mes/wm/itemreceipt/index.vue index a3018af0c..e80083963 100644 --- a/src/views/mes/wm/itemreceipt/index.vue +++ b/src/views/mes/wm/itemreceipt/index.vue @@ -73,6 +73,7 @@ + 编辑 - - 提交 - 执行上架 - - - 执行入库 - { formRef.value.open(type, id) } -/** 提交按钮操作 */ -const handleSubmit = async (id: number) => { - try { - await message.confirm('确认提交该采购入库单?') - await WmItemReceiptApi.submitItemReceipt(id) - message.success('提交成功') - await getList() - } catch {} -} -/** 执行入库 */ -const handleFinish = async (id: number) => { - try { - await message.confirm('确认执行入库?执行后将更新库存台账。') - await WmItemReceiptApi.finishItemReceipt(id) - message.success('入库成功') - await getList() - } catch {} -} + + /** 取消 */ const handleCancel = async (id: number) => {