From 74e058ee49eb8becdeaa367bc2a3dae9e8e74791 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 8 Mar 2026 22:38:03 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(mes):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E6=9E=B6=E5=8A=9F=E8=83=BD=E5=8F=8A=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增执行上架功能,允许将待上架状态的转移单更新为待执行状态。 同时,添加了转移单及转移单行的字段校验,确保必要字段不为空,提升数据完整性。 --- src/api/mes/wm/transfer/index.ts | 5 + .../mes/wm/transfer/TransferDetailForm.vue | 28 ++-- .../mes/wm/transfer/TransferDetailList.vue | 36 +++-- src/views/mes/wm/transfer/TransferForm.vue | 89 +++++-------- .../mes/wm/transfer/TransferLineList.vue | 124 ++++++------------ src/views/mes/wm/transfer/index.vue | 75 ++++------- 6 files changed, 140 insertions(+), 217 deletions(-) diff --git a/src/api/mes/wm/transfer/index.ts b/src/api/mes/wm/transfer/index.ts index 4e595fbb8..c04432c40 100644 --- a/src/api/mes/wm/transfer/index.ts +++ b/src/api/mes/wm/transfer/index.ts @@ -56,6 +56,11 @@ export const WmTransferApi = { return await request.put({ url: '/mes/wm/transfer/confirm?id=' + id }) }, + // 执行上架 + stockTransfer: async (id: number) => { + return await request.put({ url: '/mes/wm/transfer/stock?id=' + id }) + }, + // 完成转移 finishTransfer: async (id: number) => { return await request.put({ url: '/mes/wm/transfer/finish?id=' + id }) diff --git a/src/views/mes/wm/transfer/TransferDetailForm.vue b/src/views/mes/wm/transfer/TransferDetailForm.vue index 1882ad58b..9b94bbfc8 100644 --- a/src/views/mes/wm/transfer/TransferDetailForm.vue +++ b/src/views/mes/wm/transfer/TransferDetailForm.vue @@ -49,8 +49,6 @@ import WmWarehouseSelect from '@/views/mes/wm/warehouse/components/WmWarehouseSe import WmWarehouseLocationSelect from '@/views/mes/wm/warehouse/components/WmWarehouseLocationSelect.vue' import WmWarehouseAreaSelect from '@/views/mes/wm/warehouse/components/WmWarehouseAreaSelect.vue' -// TODO @AI:参考别的 detailform 补全下注释; - defineOptions({ name: 'TransferDetailForm' }) const props = defineProps<{ @@ -58,15 +56,16 @@ const props = defineProps<{ }>() const emit = defineEmits(['success']) -const { t } = useI18n() -const message = useMessage() -const dialogVisible = ref(false) -const dialogTitle = ref('') -const formLoading = ref(false) -const formType = ref('') -const currentLineId = ref() -const formRef = ref() +const { t } = useI18n() // 国际化 +const message = useMessage() // 消息弹窗 + +const dialogVisible = ref(false) // 弹窗的是否展示 +const dialogTitle = ref('') // 弹窗的标题 +const formLoading = ref(false) // 表单的加载中 +const formType = ref('') // 表单的类型:create / update +const currentLineId = ref() // 当前操作的行 ID +const formRef = ref() // 表单 Ref const formData = ref({ id: undefined as number | undefined, lineId: undefined as number | undefined, @@ -88,12 +87,14 @@ const formRules = reactive({ quantity: [{ required: true, message: '数量不能为空', trigger: 'blur' }] }) +/** 打开弹窗 */ const open = async (type: string, lineId: number, itemId?: number, detailId?: number) => { dialogVisible.value = true dialogTitle.value = type === 'create' ? '添加调拨明细' : '编辑调拨明细' formType.value = type currentLineId.value = lineId resetForm() + // 修改时,设置数据 if (detailId) { formLoading.value = true try { @@ -101,14 +102,17 @@ const open = async (type: string, lineId: number, itemId?: number, detailId?: nu } finally { formLoading.value = false } - } else { + } else if (itemId) { formData.value.itemId = itemId } } defineExpose({ open }) +/** 提交表单 */ const submitForm = async () => { + // 校验表单 await formRef.value.validate() + // 提交请求 formLoading.value = true try { const data = { @@ -124,12 +128,14 @@ const submitForm = async () => { message.success(t('common.updateSuccess')) } dialogVisible.value = false + // 发送操作成功的事件 emit('success', currentLineId.value) } finally { formLoading.value = false } } +/** 重置表单 */ const resetForm = () => { formData.value = { id: undefined, diff --git a/src/views/mes/wm/transfer/TransferDetailList.vue b/src/views/mes/wm/transfer/TransferDetailList.vue index 1543b27e0..b724b181a 100644 --- a/src/views/mes/wm/transfer/TransferDetailList.vue +++ b/src/views/mes/wm/transfer/TransferDetailList.vue @@ -1,18 +1,18 @@ @@ -80,19 +70,10 @@ v-loading="formLoading" > - - - - - - - - - + + @@ -101,7 +82,6 @@ v-model="formData.quantity" :precision="2" :min="0" - :max="selectedStockQuantity || undefined" controls-position="right" class="!w-full" /> @@ -109,26 +89,36 @@ - + - + - - + + - - - + + + - - - + + + - + @@ -141,7 +131,6 @@ - props.formType === 'stock') const loading = ref(false) const list = ref([]) -const materialStockSelectRef = ref() const detailFormRef = ref() const detailListRefs = ref>>({}) const allocatedQuantityMap = ref>({}) @@ -184,7 +174,6 @@ const dialogTitle = ref('') const formLoading = ref(false) const lineFormType = ref('') const formRef = ref() -const selectedStockQuantity = ref(undefined) const formData = ref({ id: undefined as number | undefined, transferId: undefined as number | undefined, @@ -206,19 +195,12 @@ const formData = ref({ remark: undefined }) -const materialStockDisplay = computed(() => { - if (!formData.value.materialStockId) { - return '' - } - return [formData.value.itemCode, formData.value.itemName, formData.value.batchCode] - .filter(Boolean) - .join(' / ') -}) - const formRules = reactive({ - materialStockId: [{ required: true, message: '来源库存不能为空', trigger: 'change' }], itemId: [{ required: true, message: '物料不能为空', trigger: 'change' }], - quantity: [{ required: true, message: '转移数量不能为空', trigger: 'blur' }] + quantity: [{ required: true, message: '转移数量不能为空', trigger: 'blur' }], + fromWarehouseId: [{ required: true, message: '移出仓库不能为空', trigger: 'change' }], + fromLocationId: [{ required: true, message: '移出库区不能为空', trigger: 'change' }], + fromAreaId: [{ required: true, message: '移出库位不能为空', trigger: 'change' }] }) const getList = async () => { @@ -257,26 +239,16 @@ const handleDelete = async (id: number) => { } catch {} } -const openMaterialStockSelect = () => { - materialStockSelectRef.value.open(formData.value.itemId) +const handleWarehouseChange = () => { + formData.value.fromLocationId = undefined + formData.value.fromLocationName = undefined + formData.value.fromAreaId = undefined + formData.value.fromAreaName = undefined } -const handleMaterialStockSelect = (row: any) => { - selectedStockQuantity.value = row.availableQuantity - formData.value.materialStockId = row.materialStockId - formData.value.itemId = row.itemId - formData.value.itemCode = row.itemCode - formData.value.itemName = row.itemName - formData.value.specification = row.specification - formData.value.unitMeasureName = row.unitMeasureName - formData.value.batchId = row.batchId - formData.value.batchCode = row.batchCode - formData.value.fromWarehouseId = row.warehouseId - formData.value.fromWarehouseName = row.warehouseName - formData.value.fromLocationId = row.locationId - formData.value.fromLocationName = row.locationName - formData.value.fromAreaId = row.areaId - formData.value.fromAreaName = row.areaName +const handleLocationChange = () => { + formData.value.fromAreaId = undefined + formData.value.fromAreaName = undefined } const openForm = async (type: string, id?: number) => { @@ -288,8 +260,6 @@ const openForm = async (type: string, id?: number) => { formLoading.value = true try { formData.value = await WmTransferLineApi.getTransferLine(id) - const currentLine = list.value.find((item) => item.id === id) - selectedStockQuantity.value = Number(currentLine?.quantity || 0) } finally { formLoading.value = false } @@ -298,13 +268,6 @@ const openForm = async (type: string, id?: number) => { const submitForm = async () => { await formRef.value.validate() - if ( - selectedStockQuantity.value !== undefined && - Number(formData.value.quantity) > selectedStockQuantity.value - ) { - message.warning('转移数量不能超过可用数量') - return - } formLoading.value = true try { const data = { ...formData.value, transferId: props.transferId } as unknown as WmTransferLineVO @@ -324,7 +287,6 @@ const submitForm = async () => { } const resetForm = () => { - selectedStockQuantity.value = undefined formData.value = { id: undefined, transferId: undefined, diff --git a/src/views/mes/wm/transfer/index.vue b/src/views/mes/wm/transfer/index.vue index aab97d73c..2e1745a23 100644 --- a/src/views/mes/wm/transfer/index.vue +++ b/src/views/mes/wm/transfer/index.vue @@ -40,33 +40,6 @@ /> - - - - - - - - - 搜索 重置 @@ -182,7 +155,11 @@ 执行转移 ([]) -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, code: undefined, name: undefined, - type: undefined, - transferDate: undefined, - status: undefined + type: undefined }) -const queryFormRef = ref() -const formRef = ref() - -// DONE @AI:保留为脚本方法,便于复用取消状态判断 -// TODO @AI:还是参考别的模块,保持代码风格的统一; -const canCancel = (status: number) => { - return [ - MesWmTransferStatusEnum.UNCONFIRMED, - MesWmTransferStatusEnum.UNSTOCK, - MesWmTransferStatusEnum.UNEXECUTE - ].includes(status) -} +const queryFormRef = ref() // 搜索的表单 +const formRef = ref() // 表单弹窗 +/** 查询列表 */ const getList = async () => { loading.value = true try { @@ -256,20 +220,24 @@ const getList = async () => { } } +/** 搜索按钮操作 */ const handleQuery = () => { queryParams.pageNo = 1 getList() } +/** 重置按钮操作 */ const resetQuery = () => { queryFormRef.value.resetFields() handleQuery() } +/** 添加/修改操作 */ const openForm = (type: string, id?: number) => { formRef.value.open(type, id) } +/** 提交按钮操作 */ const handleSubmit = async (id: number) => { try { await message.confirm('确认提交该转移单?') @@ -279,6 +247,7 @@ const handleSubmit = async (id: number) => { } catch {} } +/** 到货确认按钮操作 */ const handleConfirm = async (id: number) => { try { await message.confirm('确认到货后,将进入待上架状态,是否继续?') @@ -288,6 +257,7 @@ const handleConfirm = async (id: number) => { } catch {} } +/** 执行转移按钮操作 */ const handleFinish = async (id: number) => { try { await message.confirm('确认执行调拨?执行后将更新库存。') @@ -297,6 +267,7 @@ const handleFinish = async (id: number) => { } catch {} } +/** 取消按钮操作 */ const handleCancel = async (id: number) => { try { await message.confirm('确认取消该转移单?取消后不可恢复。') @@ -306,6 +277,7 @@ const handleCancel = async (id: number) => { } catch {} } +/** 删除按钮操作 */ const handleDelete = async (id: number) => { try { await message.delConfirm() @@ -315,6 +287,7 @@ const handleDelete = async (id: number) => { } catch {} } +/** 导出按钮操作 */ const handleExport = async () => { try { await message.exportConfirm()