diff --git a/src/views/mes/wm/outsourcereceipt/OutsourceReceiptForm.vue b/src/views/mes/wm/outsourcereceipt/OutsourceReceiptForm.vue index dc04713e9..ecb1c6983 100644 --- a/src/views/mes/wm/outsourcereceipt/OutsourceReceiptForm.vue +++ b/src/views/mes/wm/outsourcereceipt/OutsourceReceiptForm.vue @@ -6,6 +6,7 @@ :rules="formRules" label-width="110px" v-loading="formLoading" + :disabled="isDetail" > @@ -16,7 +17,7 @@ :disabled="isHeaderReadonly" > @@ -79,13 +80,24 @@ @@ -97,19 +109,38 @@ import { ProWorkOrderVO } from '@/api/mes/pro/workorder' import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue' import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue' import OutsourceReceiptLineList from './OutsourceReceiptLineList.vue' -import { MesProWorkOrderTypeEnum } from '@/views/mes/utils/constants' +import { + MesProWorkOrderTypeEnum, + MesWmOutsourceReceiptStatusEnum +} from '@/views/mes/utils/constants' defineOptions({ name: 'OutsourceReceiptForm' }) +const emit = defineEmits(['success']) -const message = useMessage() - -const dialogVisible = ref(false) -const formLoading = ref(false) -const formType = ref('create') +const message = useMessage() // 消息弹窗 +const dialogVisible = ref(false) // 弹窗的是否展示 +const formLoading = ref(false) // 表单的加载中 +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, code: undefined, name: undefined, + status: undefined as number | undefined, vendorId: undefined, workOrderId: undefined, receiptDate: undefined, @@ -121,20 +152,8 @@ const formRules = reactive({ workOrderId: [{ required: true, message: '请选择外协工单', trigger: 'change' }], receiptDate: [{ required: true, message: '入库日期不能为空', trigger: 'change' }] }) -const formRef = ref() - -const isUpdate = computed(() => ['create', 'update'].includes(formType.value)) -const isHeaderReadonly = computed(() => ['stock', 'detail'].includes(formType.value)) -const isStock = computed(() => formType.value === 'stock') -const dialogTitle = computed(() => { - const titles = { - create: '新增外协入库单', - update: '编辑外协入库单', - stock: '入库上架', - detail: '外协入库单详情' - } - return titles[formType.value] || formType.value -}) +const formRef = ref() // 表单 Ref +const originalFormData = ref('') // 原始表单数据快照,用于脏检查 /** 生成入库单编号 */ const generateCode = () => { @@ -151,6 +170,7 @@ const open = async (type: string, id?: number) => { dialogVisible.value = true formType.value = type resetForm() + // 修改/上架/完成/详情时,加载数据 if (id) { formLoading.value = true try { @@ -159,37 +179,83 @@ const open = async (type: string, id?: number) => { formLoading.value = false } } + // 保存原始数据快照 + originalFormData.value = JSON.stringify(formData.value) } -defineExpose({ open }) -/** 提交表单 */ -const emit = defineEmits(['success']) +/** 提交表单(create/update 模式) */ const submitForm = async () => { + // 校验表单 await formRef.value.validate() + // 提交请求 formLoading.value = true try { const data = formData.value as unknown as WmOutsourceReceiptVO if (formType.value === 'create') { const res = await WmOutsourceReceiptApi.createOutsourceReceipt(data) message.success('新增成功') + // 创建成功后,更新表单数据和状态为编辑模式 formData.value.id = res + formData.value.status = MesWmOutsourceReceiptStatusEnum.PREPARE formType.value = 'update' } else { await WmOutsourceReceiptApi.updateOutsourceReceipt(data) message.success('修改成功') } + // 更新快照 + originalFormData.value = JSON.stringify(formData.value) + // 发送操作成功的事件 emit('success') } finally { formLoading.value = false } } -/** 入库上架 */ +/** 提交操作:表单修改过则先保存,再提交 */ +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 WmOutsourceReceiptVO + await WmOutsourceReceiptApi.updateOutsourceReceipt(data) + } + // 2. 提交入库单 + await WmOutsourceReceiptApi.submitOutsourceReceipt(formData.value.id!) + message.success('提交成功') + dialogVisible.value = false + emit('success') + } catch { + } finally { + formLoading.value = false + } +} + +/** 执行上架 */ const handleStock = async () => { try { + await message.confirm('确认执行上架?') formLoading.value = true await WmOutsourceReceiptApi.stockOutsourceReceipt(formData.value.id!) - message.success('入库上架成功') + message.success('上架成功') + dialogVisible.value = false + emit('success') + } catch { + } finally { + formLoading.value = false + } +} + +/** 完成入库 */ +const handleFinish = async () => { + try { + await message.confirm('确认完成入库?完成后将更新库存台账。') + formLoading.value = true + await WmOutsourceReceiptApi.finishOutsourceReceipt(formData.value.id!) + message.success('入库成功') dialogVisible.value = false emit('success') } catch { @@ -204,6 +270,7 @@ const resetForm = () => { id: undefined, code: undefined, name: undefined, + status: undefined, vendorId: undefined, workOrderId: undefined, receiptDate: undefined, @@ -211,4 +278,6 @@ const resetForm = () => { } formRef.value?.resetFields() } + +defineExpose({ open }) diff --git a/src/views/mes/wm/outsourcereceipt/index.vue b/src/views/mes/wm/outsourcereceipt/index.vue index a48b4d191..9268ad917 100644 --- a/src/views/mes/wm/outsourcereceipt/index.vue +++ b/src/views/mes/wm/outsourcereceipt/index.vue @@ -65,7 +65,13 @@ - + + + @@ -93,15 +99,6 @@ > 编辑 - - 提交 - 删除 - + 执行上架 - + - 执行退料 + 完成入库 ([]) -const total = ref(0) -const exportLoading = ref(false) +const loading = ref(true) // 列表的加载中 +const list = ref([]) // 列表的数据 +const total = ref(0) // 列表的总页数 +const exportLoading = ref(false) // 导出的加载中 const queryParams = reactive({ pageNo: 1, pageSize: 10, @@ -185,8 +182,8 @@ const queryParams = reactive({ vendorId: undefined, receiptDate: undefined }) -const queryFormRef = ref() -const formRef = ref() +const queryFormRef = ref() // 搜索的表单 +const formRef = ref() // 表单弹窗 /** 查询列表 */ const getList = async () => { @@ -217,36 +214,6 @@ const openForm = (type: string, id?: number) => { formRef.value.open(type, id) } -/** 提交按钮操作 */ -const handleSubmit = async (id: number) => { - try { - await message.confirm('确认提交该外协入库单?') - await WmOutsourceReceiptApi.submitOutsourceReceipt(id) - message.success('提交成功') - await getList() - } catch {} -} - -/** 审批 */ -const handleApprove = async (id: number) => { - try { - await message.confirm('确认审批该外协入库单?') - await WmOutsourceReceiptApi.approveOutsourceReceipt(id) - message.success('审批成功') - await getList() - } catch {} -} - -/** 完成 */ -const handleFinish = async (id: number) => { - try { - await message.confirm('确认完成该外协入库单?完成后将更新库存台账。') - await WmOutsourceReceiptApi.finishOutsourceReceipt(id) - message.success('完成成功') - await getList() - } catch {} -} - /** 取消按钮操作 */ const handleCancel = async (id: number) => { try {