diff --git a/inventory-web/src/api/inbound/return.ts b/inventory-web/src/api/inbound/return.ts index fb8e46e..54678f7 100644 --- a/inventory-web/src/api/inbound/return.ts +++ b/inventory-web/src/api/inbound/return.ts @@ -18,13 +18,24 @@ import request from '@/utils/request' * return_qty: number 必填,本次退回数量(>0) * is_defective: boolean 必填,true=不良品转在管台账,false=良品加回库存 * reason: string 可选,退回原因 + * need_reissue: boolean 可选,退回后是否自动生成补发单(默认 false) + * reissue_qty: number 可选,补发数量,默认 = return_qty * } + * + * ★ 补发(need_reissue=true):后端直接生成一张**免审批**出库单并关联回本笔退回, + * 申请人取**当前操作人**(trans_outbound 没有申请人字段,也无指回原审批单的 + * 关联,无法可靠判定原申请人;原领用人写入备注)。 + * ★ 补发库存不足时**整笔退回一并回滚**并返回明确提示 —— 取消勾选即可只做退回过账。 + * + * @returns data.reissue 为 { id, request_no, quantity } 或 null */ export function returnFromOutbound(data: { outbound_id: number return_qty: number is_defective: boolean reason?: string + need_reissue?: boolean + reissue_qty?: number }) { return request({ url: '/inbound/stock/return-from-outbound', diff --git a/inventory-web/src/views/outbound/index.vue b/inventory-web/src/views/outbound/index.vue index 020c6fa..b19ef36 100644 --- a/inventory-web/src/views/outbound/index.vue +++ b/inventory-web/src/views/outbound/index.vue @@ -269,6 +269,32 @@ placeholder="请填写退回原因(必填)" /> + + + + 退回后自动生成补发单 + + 勾选后系统直接生成一张免审批的出库单(原领用人写入备注), + 库管即可扫码补发。 + 若库存不足,整笔退回会一并取消并给出提示 —— + 取消勾选即可只做退回过账。 + + + + + + @@ -501,9 +527,17 @@ const returnDialog = reactive({ return_qty: 1, is_defective: false, reason: '', + // 补发:默认**不勾选** —— 有些退回是项目结束退还,根本不需要补 + need_reissue: false, + reissue_qty: 1, }, }) +// 勾选补发时,默认补发量 = 本次退回量(最常见的情况),用户可再调小 +const handleNeedReissueChange = (val: boolean) => { + if (val) returnDialog.form.reissue_qty = normalizeQty(returnDialog.form.return_qty) || 1 +} + const openReturnDialog = (row: any) => { returnDialog.row = row // 默认带入「本次可退最大」,业务上整行退回最常见;用户可再调小做部分退回 @@ -511,6 +545,8 @@ const openReturnDialog = (row: any) => { returnDialog.form.return_qty = normalizeQty(row?.returnable_quantity) returnDialog.form.is_defective = false returnDialog.form.reason = '' + returnDialog.form.need_reissue = false + returnDialog.form.reissue_qty = 1 returnDialog.visible = true } @@ -520,6 +556,8 @@ const resetReturnDialog = () => { returnDialog.form.return_qty = 1 returnDialog.form.is_defective = false returnDialog.form.reason = '' + returnDialog.form.need_reissue = false + returnDialog.form.reissue_qty = 1 } const submitReturn = async () => { @@ -542,6 +580,20 @@ const submitReturn = async () => { return } + // 补发的前置校验:与后端同口径,避免白跑一趟 + const needReissue = !!returnDialog.form.need_reissue + const reissueQty = normalizeQty(returnDialog.form.reissue_qty) + if (needReissue) { + if (!reissueQty || reissueQty <= 0) { + ElMessage.warning('请填写补发数量') + return + } + if (reissueQty > qty) { + ElMessage.warning(`补发数量不能超过本次退回数量 ${qty}`) + return + } + } + returnDialog.submitting = true try { const res = await returnFromOutbound({ @@ -549,6 +601,8 @@ const submitReturn = async () => { return_qty: qty, is_defective: returnDialog.form.is_defective, reason, + need_reissue: needReissue, + reissue_qty: needReissue ? reissueQty : undefined, }) ElMessage.success(res?.msg || '退回成功') returnDialog.visible = false