feat(outbound): 退回弹窗增加「需要补发」勾选与补发数量

· 退回对话框新增「退回后自动生成补发单」勾选框 + 补发数量(勾选时默认 = 本次
  退回量,可调小;上限即退回量)。
· 文案明写两条关键后果:生成的是**免审批**出库单;**库存不足时整笔退回会一并
  取消**,取消勾选即可只做退回过账 —— 避免库管对着失败提示发懵。
· 提交前做同口径前置校验(数量 > 0 且 <= 退回量),不白跑一趟。
· resetReturnDialog / openReturnDialog 同步重置这两个字段。

默认**不勾选**:有些退回是项目结束退还,根本不需要补,不该默认给所有人挂上。
This commit is contained in:
yueli
2026-09-17 11:56:39 +08:00
parent 7071c89305
commit 9d187593eb
2 changed files with 65 additions and 0 deletions

View File

@ -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',

View File

@ -269,6 +269,32 @@
placeholder="请填写退回原因(必填)"
/>
</el-form-item>
<!-- 补发退回后申请人往往**仍然需要这件东西**尤其坏件
原需求并未被满足勾选即自动生成一张免审批出库单并关联回本笔退回
不必再靠人记住另建一张与原单毫无关系的单 -->
<el-form-item label="需要补发">
<el-checkbox
v-model="returnDialog.form.need_reissue"
@change="handleNeedReissueChange"
>退回后自动生成补发单</el-checkbox>
<div style="color:#909399; font-size:12px; line-height:1.6; margin-top:4px;">
勾选后系统直接生成一张<strong>免审批</strong>的出库单原领用人写入备注
库管即可扫码补发<br>
<strong>库存不足整笔退回会一并取消</strong>并给出提示
取消勾选即可只做退回过账
</div>
</el-form-item>
<el-form-item label="补发数量" v-if="returnDialog.form.need_reissue" required>
<el-input-number
v-model="returnDialog.form.reissue_qty"
:min="1"
:max="normalizeQty(returnDialog.form.return_qty)"
:step="1"
style="width: 200px"
/>
</el-form-item>
</el-form>
<template #footer>
@ -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