Compare commits
2 Commits
cd600f9fc2
...
a12fcea86d
| Author | SHA1 | Date | |
|---|---|---|---|
| a12fcea86d | |||
| 044e6dbd98 |
@ -427,7 +427,8 @@ def create_outbound_request():
|
||||
allowed_approvers=allowed_approvers,
|
||||
remark=data.get('remark'),
|
||||
approver_id=approver_id,
|
||||
outbound_type=data.get('outbound_type') # 出库类型(申请时确定)
|
||||
outbound_type=data.get('outbound_type'), # 出库类型(申请时确定)
|
||||
force_approval=((user_role or '').upper() == 'WAREHOUSE_MGR') # 库管代建 → 强制审批
|
||||
)
|
||||
|
||||
return jsonify({
|
||||
|
||||
@ -248,7 +248,8 @@ def submit_borrow_request():
|
||||
allowed_approvers=allowed_approvers,
|
||||
remark=data.get('remark'),
|
||||
approver_id=approver_id,
|
||||
borrower_name=current_username
|
||||
borrower_name=current_username,
|
||||
force_approval=((user_role or '').upper() == 'WAREHOUSE_MGR') # 库管代建 → 强制审批
|
||||
)
|
||||
|
||||
return jsonify({'code': 200, 'msg': '借库申请已提交', 'data': approval.to_dict()}), 200
|
||||
|
||||
@ -62,7 +62,7 @@ class BorrowApprovalService:
|
||||
|
||||
@staticmethod
|
||||
def submit_approval(applicant_id, items, allowed_approvers, remark=None, approver_id=None,
|
||||
borrower_name=None):
|
||||
borrower_name=None, force_approval=False):
|
||||
"""
|
||||
提交借库申请(仅存储意向,不扣库存)
|
||||
|
||||
@ -111,10 +111,14 @@ class BorrowApprovalService:
|
||||
except (TypeError, ValueError) as e:
|
||||
raise ValueError(f"第 {idx + 1} 条物品的 quantity 格式无效: {str(e)}")
|
||||
|
||||
# ★ 需审批判定:明细含“出库/借库需审批”物料 → 走原审批流程;否则默认自动通过
|
||||
# ★ 需审批判定:库管代建(force_approval)或明细含需审批物料 → 走审批;否则默认自动通过
|
||||
from app.services.approval_control import resolve_approval_control
|
||||
need_approval, flagged_materials = resolve_approval_control(items)
|
||||
if force_approval:
|
||||
need_approval = True
|
||||
if need_approval and not approver_id:
|
||||
if force_approval:
|
||||
raise ValueError("库管代建借库申请必须选择审批人后再提交")
|
||||
_names = ";".join(f"{m['name']}({m['spec_model'] or '-'})" for m in flagged_materials)
|
||||
raise ValueError(f"以下物料需审批出库/借库:{_names}。请选择审批人后再提交")
|
||||
|
||||
|
||||
@ -743,7 +743,7 @@ class OutboundApprovalService:
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def create_request(applicant_id, items, allowed_approvers, remark=None, approver_id=None, outbound_type=None):
|
||||
def create_request(applicant_id, items, allowed_approvers, remark=None, approver_id=None, outbound_type=None, force_approval=False):
|
||||
"""
|
||||
创建出库审批单(申请阶段,直接存储前端传来的物料信息快照,不关联具体库存记录)
|
||||
|
||||
@ -787,10 +787,14 @@ class OutboundApprovalService:
|
||||
except (TypeError, ValueError) as e:
|
||||
raise ValueError(f"第 {idx + 1} 条物品的 quantity 格式无效: {str(e)}")
|
||||
|
||||
# ★ 需审批判定:明细含“出库/借库需审批”物料 → 走原审批流程;否则默认自动通过
|
||||
# ★ 需审批判定:库管代建(force_approval)或明细含需审批物料 → 走审批;否则默认自动通过
|
||||
from app.services.approval_control import resolve_approval_control
|
||||
need_approval, flagged_materials = resolve_approval_control(items)
|
||||
if force_approval:
|
||||
need_approval = True
|
||||
if need_approval and not approver_id:
|
||||
if force_approval:
|
||||
raise ValueError("库管代建出库申请必须选择审批人后再提交")
|
||||
_names = ";".join(f"{m['name']}({m['spec_model'] or '-'})" for m in flagged_materials)
|
||||
raise ValueError(f"以下物料需审批出库/借库:{_names}。请选择审批人后再提交")
|
||||
|
||||
|
||||
@ -394,7 +394,7 @@
|
||||
</el-table>
|
||||
|
||||
<el-form label-width="100px">
|
||||
<el-form-item v-if="approvalNeedVisible" label="指定审批人">
|
||||
<el-form-item v-if="approvalNeedVisible || (userStore.role || '').toUpperCase() === 'WAREHOUSE_MGR'" label="指定审批人">
|
||||
<div v-if="approvalNeedText" style="color:#E6A23C; font-size:12px; line-height:1.4; margin-bottom:4px;">
|
||||
以下物料需审批出库/借库:{{ approvalNeedText }},请选择审批人
|
||||
</div>
|
||||
@ -1058,8 +1058,8 @@ const openRequestDialog = () => {
|
||||
requestApproverId.value = null
|
||||
requestExpectedReturn.value = ''
|
||||
requestIndefinite.value = false
|
||||
approvalNeedVisible.value = false // 打开时默认隐藏审批人,命中需审批时由预检显示
|
||||
approvalNeedText.value = ''
|
||||
approvalNeedVisible.value = (userStore.role || '').toUpperCase() === 'WAREHOUSE_MGR' // 库管代建默认显示审批人
|
||||
approvalNeedText.value = approvalNeedVisible.value ? '库管代建借库申请需审批,请选择审批人' : ''
|
||||
loadApprovers()
|
||||
requestDialogVisible.value = true
|
||||
}
|
||||
@ -1125,19 +1125,22 @@ const confirmSubmitRequest = async () => {
|
||||
is_indefinite: requestIndefinite.value
|
||||
}))
|
||||
|
||||
// ★ 提交前预检:判断所选物料是否需审批 → 只有需审批才显示并必选审批人
|
||||
let needApproval = false
|
||||
// ★ 提交前预检:库管(WAREHOUSE_MGR)代建一律需审批;否则命中需审批物料才需审批
|
||||
const isKeeper = (userStore.role || '').toUpperCase() === 'WAREHOUSE_MGR'
|
||||
let needApproval = isKeeper
|
||||
let flagged: any[] = []
|
||||
try {
|
||||
const chk: any = await checkBorrowApproval({ items })
|
||||
needApproval = !!chk?.data?.need_approval
|
||||
needApproval = needApproval || !!chk?.data?.need_approval
|
||||
flagged = chk?.data?.materials || []
|
||||
} catch (e) { needApproval = false; flagged = [] }
|
||||
} catch (e) { flagged = [] }
|
||||
approvalNeedVisible.value = needApproval
|
||||
approvalNeedText.value = flagged.map((m: any) => `${m.name}(${m.spec_model || '-'})`).join(';')
|
||||
approvalNeedText.value = isKeeper && flagged.length === 0
|
||||
? '库管代建借库申请需审批,请选择审批人'
|
||||
: flagged.map((m: any) => `${m.name}(${m.spec_model || '-'})`).join(';')
|
||||
|
||||
if (needApproval && !requestApproverId.value) {
|
||||
ElMessage.warning(`以下物料需审批出库/借库:${approvalNeedText.value}。请先选择审批人`)
|
||||
ElMessage.warning(`${approvalNeedText.value}。请先选择审批人`)
|
||||
return
|
||||
}
|
||||
|
||||
@ -1155,7 +1158,8 @@ const confirmSubmitRequest = async () => {
|
||||
approvalNeedText.value = ''
|
||||
ElMessage.success('借库申请已提交(含需审批物料时将进入审批,否则直接交库管执行)')
|
||||
} catch (err: any) {
|
||||
ElMessage.error(err?.message || err?.msg || '提交申请失败,请重试')
|
||||
// 拦截器已按后端 data.msg 弹出业务错误(如“库管代建…必须选择审批人”),HTTP 错误不再重复提示
|
||||
if (!err?.response) ElMessage.error('网络异常,请重试')
|
||||
} finally {
|
||||
requestSubmitting.value = false
|
||||
}
|
||||
|
||||
@ -409,7 +409,7 @@
|
||||
<el-option label="维修出库" value="REPAIR" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="approvalNeedVisible" label="指定审批人">
|
||||
<el-form-item v-if="approvalNeedVisible || (userStore.role || '').toUpperCase() === 'WAREHOUSE_MGR'" label="指定审批人">
|
||||
<div v-if="approvalNeedText" style="color:#E6A23C; font-size:12px; line-height:1.4; margin-bottom:4px;">
|
||||
以下物料需审批出库/借库:{{ approvalNeedText }},请选择审批人
|
||||
</div>
|
||||
@ -1085,8 +1085,8 @@ const openRequestDialog = () => {
|
||||
}
|
||||
requestRemark.value = ''
|
||||
requestApproverId.value = null
|
||||
approvalNeedVisible.value = false // 打开时默认隐藏审批人,命中需审批时由预检显示
|
||||
approvalNeedText.value = ''
|
||||
approvalNeedVisible.value = (userStore.role || '').toUpperCase() === 'WAREHOUSE_MGR' // 库管代建默认显示审批人
|
||||
approvalNeedText.value = approvalNeedVisible.value ? '库管代建出库申请需审批,请选择审批人' : ''
|
||||
loadApprovers()
|
||||
requestDialogVisible.value = true
|
||||
}
|
||||
@ -1124,19 +1124,22 @@ const confirmSubmitRequest = async () => {
|
||||
quantity: item.export_quantity || 0
|
||||
}))
|
||||
|
||||
// ★ 提交前预检:判断所选物料是否需审批 → 只有需审批才显示并必选审批人
|
||||
let needApproval = false
|
||||
// ★ 提交前预检:库管(WAREHOUSE_MGR)代建一律需审批;否则命中需审批物料才需审批
|
||||
const isKeeper = (userStore.role || '').toUpperCase() === 'WAREHOUSE_MGR'
|
||||
let needApproval = isKeeper
|
||||
let flagged: any[] = []
|
||||
try {
|
||||
const chk: any = await checkOutboundApproval({ items })
|
||||
needApproval = !!chk?.data?.need_approval
|
||||
needApproval = needApproval || !!chk?.data?.need_approval
|
||||
flagged = chk?.data?.materials || []
|
||||
} catch (e) { needApproval = false; flagged = [] }
|
||||
} catch (e) { flagged = [] }
|
||||
approvalNeedVisible.value = needApproval
|
||||
approvalNeedText.value = flagged.map((m: any) => `${m.name}(${m.spec_model || '-'})`).join(';')
|
||||
approvalNeedText.value = isKeeper && flagged.length === 0
|
||||
? '库管代建出库申请需审批,请选择审批人'
|
||||
: flagged.map((m: any) => `${m.name}(${m.spec_model || '-'})`).join(';')
|
||||
|
||||
if (needApproval && !requestApproverId.value) {
|
||||
ElMessage.warning(`以下物料需审批出库/借库:${approvalNeedText.value}。请先选择审批人`)
|
||||
ElMessage.warning(`${approvalNeedText.value}。请先选择审批人`)
|
||||
return
|
||||
}
|
||||
|
||||
@ -1156,7 +1159,8 @@ const confirmSubmitRequest = async () => {
|
||||
approvalNeedText.value = ''
|
||||
ElMessage.success('出库申请已提交(含需审批物料时将进入审批,否则直接交库管执行)')
|
||||
} catch (err: any) {
|
||||
ElMessage.error(err?.message || err?.msg || '提交申请失败,请重试')
|
||||
// 拦截器已按后端 data.msg 弹出业务错误(如“库管代建…必须选择审批人”),HTTP 错误不再重复提示
|
||||
if (!err?.response) ElMessage.error('网络异常,请重试')
|
||||
} finally {
|
||||
requestSubmitting.value = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user