From 5858aef52a1f4868d45cfcb1aa455b31c2b07bb6 Mon Sep 17 00:00:00 2001 From: hwj Date: Fri, 26 Jun 2026 14:54:42 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=BA=93=E5=AD=98=E8=B0=83?= =?UTF-8?q?=E6=8B=A8=E6=A8=A1=E5=9D=97=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/erp/stock/move/index.ts | 40 +- src/locales/en.ts | 13 + src/locales/zh-CN.ts | 13 + src/views/erp/stock/move/StockMoveForm.vue | 38 +- .../move/components/StockMoveItemForm.vue | 632 ++++++++++++++---- src/views/erp/stock/move/index.vue | 159 ++++- 6 files changed, 713 insertions(+), 182 deletions(-) diff --git a/src/api/erp/stock/move/index.ts b/src/api/erp/stock/move/index.ts index 398568e0..1171d99e 100644 --- a/src/api/erp/stock/move/index.ts +++ b/src/api/erp/stock/move/index.ts @@ -1,39 +1,39 @@ import request from '@/config/axios' -// ERP 库存调度单 VO export interface StockMoveVO { - id: number // 出库编号 - no: string // 出库单号 - outTime: Date // 出库时间 - totalCount: number // 合计数量 - totalPrice: number // 合计金额,单位:元 - status: number // 状态 - remark: string // 备注 + id: number + no: string + categoryType?: number + outTime: Date + totalCount: number + totalPrice: number + status: number + auditUserId?: number + auditUserName?: string + remark: string } -// ERP 库存调度单 API export const StockMoveApi = { - // 查询库存调度单分页 getStockMovePage: async (params: any) => { return await request.get({ url: `/erp/stock-move/page`, params }) }, - // 查询库存调度单详情 getStockMove: async (id: number) => { return await request.get({ url: `/erp/stock-move/get?id=` + id }) }, - // 新增库存调度单 + getProductStockList: async (productId: number) => { + return await request.get({ url: `/erp/stock-move/product-stock-list`, params: { productId } }) + }, + createStockMove: async (data: StockMoveVO) => { return await request.post({ url: `/erp/stock-move/create`, data }) }, - // 修改库存调度单 updateStockMove: async (data: StockMoveVO) => { return await request.put({ url: `/erp/stock-move/update`, data }) }, - // 更新库存调度单的状态 updateStockMoveStatus: async (id: number, status: number) => { return await request.put({ url: `/erp/stock-move/update-status`, @@ -44,7 +44,14 @@ export const StockMoveApi = { }) }, - // 删除库存调度单 + submitStockMove: async (data: { id: number; auditUserId?: number; remark?: string }) => { + return await request.put({ url: `/erp/stock-move/submit`, data }) + }, + + auditStockMove: async (data: { id: number; status: number; remark?: string }) => { + return await request.put({ url: `/erp/stock-move/audit`, data }) + }, + deleteStockMove: async (ids: number[]) => { return await request.delete({ url: `/erp/stock-move/delete`, @@ -54,8 +61,7 @@ export const StockMoveApi = { }) }, - // 导出库存调度单 Excel exportStockMove: async (params) => { return await request.download({ url: `/erp/stock-move/export-excel`, params }) } -} +} \ No newline at end of file diff --git a/src/locales/en.ts b/src/locales/en.ts index d6a68856..346034c6 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -799,6 +799,19 @@ export default { confirmReverseApprove: 'Are you sure to reverse approve this transfer order?', approveSuccess: 'Approve success', reverseApproveSuccess: 'Reverse approve success', + submit: 'Submit', + submitSuccess: 'Submitted successfully', + auditUserName: 'Approver', + placeholderAuditUser: 'Please select approver', + validatorAuditUserRequired: 'Approver is required', + submitRemark: 'Submit Remark', + placeholderSubmitRemark: 'Please enter submit remark', + auditApprove: 'Approve', + auditReject: 'Reject', + auditRemark: 'Audit Remark', + placeholderAuditRemark: 'Please enter audit remark', + auditApproveSuccess: 'Approved successfully', + auditRejectSuccess: 'Rejected successfully', exportName: 'Stock Transfer Order.xls', list: 'Transfer Product List', addItem: 'Add Transfer Product', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 080f8ddb..675fa6c7 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -799,6 +799,19 @@ export default { confirmReverseApprove: '确定反审批该调拨单吗?', approveSuccess: '审批成功', reverseApproveSuccess: '反审批成功', + submit: '提交', + submitSuccess: '提交成功', + auditUserName: '审批人', + placeholderAuditUser: '请选择审批人', + validatorAuditUserRequired: '审批人不能为空', + submitRemark: '提交备注', + placeholderSubmitRemark: '请输入提交备注', + auditApprove: '通过', + auditReject: '驳回', + auditRemark: '审批备注', + placeholderAuditRemark: '请输入审批备注', + auditApproveSuccess: '通过成功', + auditRejectSuccess: '驳回成功', exportName: '库存调拨单.xls', list: '调度产品清单', addItem: '添加调度产品', diff --git a/src/views/erp/stock/move/StockMoveForm.vue b/src/views/erp/stock/move/StockMoveForm.vue index 533eb102..4ed3067b 100644 --- a/src/views/erp/stock/move/StockMoveForm.vue +++ b/src/views/erp/stock/move/StockMoveForm.vue @@ -25,6 +25,19 @@ /> + + + + + {{ dict.label }} + + + + - + @@ -60,6 +78,7 @@ + diff --git a/src/views/erp/stock/move/index.vue b/src/views/erp/stock/move/index.vue index 57937523..eff9920f 100644 --- a/src/views/erp/stock/move/index.vue +++ b/src/views/erp/stock/move/index.vue @@ -168,7 +168,7 @@ - + @@ -265,6 +328,27 @@ const exportLoading = ref(false) // 导出的加载中 const productList = ref([]) // 产品列表 const warehouseList = ref([]) // 仓库列表 const userList = ref([]) // 用户列表 +const submitFormRef = ref() +const submitDialogVisible = ref(false) +const submitLoading = ref(false) +const submitForm = reactive({ + id: undefined as number | undefined, + auditUserId: undefined as number | undefined, + remark: undefined as string | undefined +}) +const submitRules = { + auditUserId: [{ required: true, message: t('ErpStock.Move.validatorAuditUserRequired'), trigger: 'change' }] +} +const auditDialogVisible = ref(false) +const auditLoading = ref(false) +const auditForm = reactive({ + id: undefined as number | undefined, + status: undefined as number | undefined, + remark: undefined as string | undefined +}) +const auditDialogTitle = computed(() => + auditForm.status === 20 ? t('ErpStock.Move.auditApprove') : t('ErpStock.Move.auditReject') +) /** 查询列表 */ const getList = async () => { @@ -310,17 +394,58 @@ const handleDelete = async (ids: number[]) => { } catch {} } -/** 审批/反审批操作 */ -const handleUpdateStatus = async (id: number, status: number) => { +const openSubmitDialog = (row: StockMoveVO) => { + submitForm.id = row.id + submitForm.auditUserId = row.auditUserId + submitForm.remark = undefined + submitDialogVisible.value = true + nextTick(() => submitFormRef.value?.clearValidate?.()) +} + +const handleSubmit = async () => { + await submitFormRef.value.validate() + if (!submitForm.id || !submitForm.auditUserId) return + submitLoading.value = true try { - // 审批的二次确认 - await message.confirm(status === 20 ? t('ErpStock.Move.confirmApprove') : t('ErpStock.Move.confirmReverseApprove')) - // 发起审批 - await StockMoveApi.updateStockMoveStatus(id, status) - message.success(status === 20 ? t('ErpStock.Move.approveSuccess') : t('ErpStock.Move.reverseApproveSuccess')) - // 刷新列表 + await StockMoveApi.submitStockMove({ + id: submitForm.id, + auditUserId: submitForm.auditUserId, + remark: submitForm.remark + }) + message.success(t('ErpStock.Move.submitSuccess')) + submitDialogVisible.value = false await getList() - } catch {} + } finally { + submitLoading.value = false + } +} + +const openAuditDialog = (row: StockMoveVO, status: number) => { + auditForm.id = row.id + auditForm.status = status + auditForm.remark = undefined + auditDialogVisible.value = true +} + +const handleAudit = async () => { + if (!auditForm.id || !auditForm.status) return + auditLoading.value = true + try { + await StockMoveApi.auditStockMove({ + id: auditForm.id, + status: auditForm.status, + remark: auditForm.remark + }) + message.success( + auditForm.status === 20 + ? t('ErpStock.Move.auditApproveSuccess') + : t('ErpStock.Move.auditRejectSuccess') + ) + auditDialogVisible.value = false + await getList() + } finally { + auditLoading.value = false + } } /** 导出按钮操作 */