diff --git a/src/views/mes/wm/itemreceipt/index.vue b/src/views/mes/wm/itemreceipt/index.vue index bf8810485..d792c7ecb 100644 --- a/src/views/mes/wm/itemreceipt/index.vue +++ b/src/views/mes/wm/itemreceipt/index.vue @@ -213,10 +213,6 @@ const openForm = (type: string, id?: number) => { formRef.value.open(type, id) } - - - - /** 取消按钮操作 */ const handleCancel = async (id: number) => { try { diff --git a/src/views/mes/wm/returnissue/ReturnIssueForm.vue b/src/views/mes/wm/returnissue/ReturnIssueForm.vue index f2dca64c7..06d0af6a5 100644 --- a/src/views/mes/wm/returnissue/ReturnIssueForm.vue +++ b/src/views/mes/wm/returnissue/ReturnIssueForm.vue @@ -89,13 +89,24 @@ @@ -104,22 +115,41 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { WmReturnIssueApi, WmReturnIssueVO } from '@/api/mes/wm/returnissue' import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record' -import { MesAutoCodeRuleCode } from '@/views/mes/utils/constants' +import { MesAutoCodeRuleCode, MesWmReturnIssueStatusEnum } from '@/views/mes/utils/constants' import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue' import MdWorkstationSelect from '@/views/mes/md/workstation/components/MdWorkstationSelect.vue' import ReturnIssueLineList from './ReturnIssueLineList.vue' defineOptions({ name: 'ReturnIssueForm' }) +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 / submit / stock / finish / detail +const isEditable = computed(() => ['create', 'update', 'submit'].includes(formType.value)) // 是否为编辑模式 +const isStock = computed(() => formType.value === 'stock') // 是否为入库上架模式 +const isFinish = computed(() => formType.value === 'finish') // 是否为执行退料模式 +const isHeaderReadonly = computed(() => + ['stock', 'detail', 'finish'].includes(formType.value) +) // 表头是否只读 +const dialogTitle = computed(() => { + const titles = { + create: '新增生产退料单', + update: '编辑生产退料单', + submit: '提交生产退料单', + stock: '入库上架', + finish: '执行退料', + detail: '生产退料单详情' + } + return titles[formType.value] || formType.value +}) const formData = ref({ id: undefined as number | undefined, code: undefined, name: undefined, + status: undefined as number | undefined, workOrderId: undefined, workstationId: undefined, type: undefined, @@ -133,19 +163,7 @@ const formRules = reactive({ workOrderId: [{ 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 () => { @@ -159,7 +177,7 @@ const open = async (type: string, id?: number) => { dialogVisible.value = true formType.value = type resetForm() - // 修改/入库上架/详情时,加载数据 + // 修改/提交/上架/完成/详情时,加载数据 if (id) { formLoading.value = true try { @@ -168,11 +186,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/submit 模式的保存按钮) */ const submitForm = async () => { // 校验表单 await formRef.value.validate() @@ -183,12 +201,16 @@ const submitForm = async () => { if (formType.value === 'create') { const res = await WmReturnIssueApi.createReturnIssue(data) message.success('新增成功') + // 创建成功后,更新表单数据和状态为编辑模式 formData.value.id = res + formData.value.status = MesWmReturnIssueStatusEnum.PREPARE formType.value = 'update' } else { await WmReturnIssueApi.updateReturnIssue(data) message.success('修改成功') } + // 更新快照 + originalFormData.value = JSON.stringify(formData.value) // 发送操作成功的事件 emit('success') } finally { @@ -196,6 +218,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 WmReturnIssueVO + await WmReturnIssueApi.updateReturnIssue(data) + } + // 2. 提交退料单 + await WmReturnIssueApi.submitReturnIssue(formData.value.id!) + message.success('提交成功') + dialogVisible.value = false + emit('success') + } catch { + } finally { + formLoading.value = false + } +} + /** 入库上架 */ const handleStock = async () => { try { @@ -210,12 +255,28 @@ const handleStock = async () => { } } +/** 执行退料 */ +const handleFinish = async () => { + try { + await message.confirm('确认完成该退料单并执行入库吗?') + formLoading.value = true + await WmReturnIssueApi.finishReturnIssue(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, workOrderId: undefined, workstationId: undefined, type: undefined, @@ -224,4 +285,6 @@ const resetForm = () => { } formRef.value?.resetFields() } + +defineExpose({ open }) diff --git a/src/views/mes/wm/returnissue/ReturnIssueLineList.vue b/src/views/mes/wm/returnissue/ReturnIssueLineList.vue index 5713ad643..dcbdf0e9d 100644 --- a/src/views/mes/wm/returnissue/ReturnIssueLineList.vue +++ b/src/views/mes/wm/returnissue/ReturnIssueLineList.vue @@ -115,7 +115,7 @@ - + @@ -123,11 +123,6 @@ - - - - - @@ -158,6 +153,7 @@ import { DICT_TYPE } from '@/utils/dict' import { WmReturnIssueLineApi, WmReturnIssueLineVO } from '@/api/mes/wm/returnissue/line' import { WmMaterialStockVO } from '@/api/mes/wm/materialstock' import WmMaterialStockSelect from '@/views/mes/wm/materialstock/components/WmMaterialStockSelect.vue' +import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue' import ReturnIssueDetailList from './ReturnIssueDetailList.vue' import ReturnIssueDetailForm from './ReturnIssueDetailForm.vue' import { BarcodeDetail } from '@/views/mes/wm/barcode/components' diff --git a/src/views/mes/wm/returnissue/index.vue b/src/views/mes/wm/returnissue/index.vue index 2a8f7915c..7a5aa1729 100644 --- a/src/views/mes/wm/returnissue/index.vue +++ b/src/views/mes/wm/returnissue/index.vue @@ -98,7 +98,7 @@