From 5856838c73b827b33eb70e1805513e014d783ae3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 29 Mar 2026 21:43:46 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(mes):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=80=80=E8=B4=A7=E5=8D=95=E6=93=8D=E4=BD=9C=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E7=AE=80=E5=8C=96=E6=8F=90=E4=BA=A4=E4=B8=8E=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/wm/returnvendor/ReturnVendorForm.vue | 112 +++++++++++++----- src/views/mes/wm/returnvendor/index.vue | 40 +------ 2 files changed, 90 insertions(+), 62 deletions(-) diff --git a/src/views/mes/wm/returnvendor/ReturnVendorForm.vue b/src/views/mes/wm/returnvendor/ReturnVendorForm.vue index c0ffec13f..245d38456 100644 --- a/src/views/mes/wm/returnvendor/ReturnVendorForm.vue +++ b/src/views/mes/wm/returnvendor/ReturnVendorForm.vue @@ -6,6 +6,7 @@ :rules="formRules" label-width="110px" v-loading="formLoading" + :disabled="isDetail" > @@ -16,9 +17,7 @@ :disabled="isHeaderReadonly" > @@ -104,13 +103,24 @@ @@ -120,22 +130,38 @@ import { WmReturnVendorApi, WmReturnVendorVO } from '@/api/mes/wm/returnvendor' import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record' import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue' import ReturnVendorLineList from './ReturnVendorLineList.vue' -import { MesAutoCodeRuleCode } from '@/views/mes/utils/constants' +import { MesAutoCodeRuleCode, MesWmReturnVendorStatusEnum } from '@/views/mes/utils/constants' defineOptions({ name: 'ReturnVendorForm' }) +const emit = defineEmits(['success']) const message = useMessage() // 消息弹窗 const dialogVisible = ref(false) // 弹窗的是否展示 const formLoading = ref(false) // 表单的加载中 -const formType = ref('create') // 表单的类型:create / update / stock / detail +const formType = ref('create') // 表单的类型:create / update / stock / finish / detail +const isEditable = computed(() => ['create', 'update'].includes(formType.value)) // 是否为编辑模式 +const isStock = computed(() => formType.value === 'stock') // 是否为拣货模式 +const isFinish = computed(() => formType.value === 'finish') // 是否为完成退货模式 +const isDetail = computed(() => ['detail', 'finish'].includes(formType.value)) // 是否为详情模式 +const isHeaderReadonly = computed(() => ['stock', 'detail', 'finish'].includes(formType.value)) // 是否只读 +const dialogTitle = computed(() => { + const titles = { + create: '新增供应商退货单', + update: '编辑供应商退货单', + stock: '执行拣货', + finish: '完成退货', + detail: '供应商退货单详情' + } + return titles[formType.value] || formType.value +}) const formData = ref({ id: undefined as number | undefined, + status: undefined as number | undefined, code: undefined, name: undefined, purchaseOrderCode: undefined, vendorId: undefined, - returnDate: undefined, returnReason: undefined, transportCode: undefined, @@ -149,19 +175,7 @@ const formRules = reactive({ returnDate: [{ required: true, message: '退货日期不能为空', trigger: 'change' }] }) const formRef = ref() // 表单 Ref - -const isUpdate = computed(() => ['create', 'update'].includes(formType.value)) // 是否为编辑模式 -const isStock = computed(() => formType.value === 'stock') // 是否为拣货模式 -const isHeaderReadonly = computed(() => ['stock', 'detail'].includes(formType.value)) // 是否只读 -const dialogTitle = computed(() => { - const titles = { - create: '新增供应商退货单', - update: '编辑供应商退货单', - stock: '执行拣货', - detail: '供应商退货单详情' - } - return titles[formType.value] || formType.value -}) +const originalFormData = ref('') // 原始表单数据快照,用于脏检查 /** 生成退货单编号 */ const generateCode = async () => { @@ -175,7 +189,7 @@ const open = async (type: string, id?: number) => { dialogVisible.value = true formType.value = type resetForm() - // 修改/拣货/详情时,加载数据 + // 修改/提交/拣货/完成/详情时,加载数据 if (id) { formLoading.value = true try { @@ -184,11 +198,11 @@ const open = async (type: string, id?: number) => { formLoading.value = false } } + // 保存原始数据快照 + originalFormData.value = JSON.stringify(formData.value) } -defineExpose({ open }) -/** 提交表单(create/update 模式) */ -const emit = defineEmits(['success']) +/** 保存表单(create/update 模式) */ const submitForm = async () => { // 校验表单 await formRef.value.validate() @@ -199,12 +213,16 @@ const submitForm = async () => { if (formType.value === 'create') { const res = await WmReturnVendorApi.createReturnVendor(data) message.success('新增成功') + // 创建成功后,更新表单数据和状态为编辑模式 formData.value.id = res + formData.value.status = MesWmReturnVendorStatusEnum.PREPARE formType.value = 'update' } else { await WmReturnVendorApi.updateReturnVendor(data) message.success('修改成功') } + // 更新快照 + originalFormData.value = JSON.stringify(formData.value) // 发送操作成功的事件 emit('success') } finally { @@ -212,6 +230,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 WmReturnVendorVO + await WmReturnVendorApi.updateReturnVendor(data) + } + // 2. 提交退货单 + await WmReturnVendorApi.submitReturnVendor(formData.value.id!) + message.success('提交成功') + dialogVisible.value = false + emit('success') + } catch { + } finally { + formLoading.value = false + } +} + /** 执行拣货 */ const handleStock = async () => { try { @@ -231,15 +272,30 @@ const handleStock = async () => { } } +/** 完成退货 */ +const handleFinish = async () => { + try { + await message.confirm('确认完成该退货单并执行退货?') + formLoading.value = true + await WmReturnVendorApi.finishReturnVendor(formData.value.id!) + message.success('完成成功') + dialogVisible.value = false + emit('success') + } catch { + } finally { + formLoading.value = false + } +} + /** 重置表单 */ const resetForm = () => { formData.value = { id: undefined, + status: undefined, code: undefined, name: undefined, purchaseOrderCode: undefined, vendorId: undefined, - returnDate: undefined, returnReason: undefined, transportCode: undefined, @@ -248,4 +304,6 @@ const resetForm = () => { } formRef.value?.resetFields() } + +defineExpose({ open }) diff --git a/src/views/mes/wm/returnvendor/index.vue b/src/views/mes/wm/returnvendor/index.vue index b768aab3b..4d778b19f 100644 --- a/src/views/mes/wm/returnvendor/index.vue +++ b/src/views/mes/wm/returnvendor/index.vue @@ -88,7 +88,7 @@