From 044e6dbd989d032b70656c1a28e5e29ebe98c633 Mon Sep 17 00:00:00 2001 From: yueli Date: Wed, 9 Sep 2026 16:19:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(borrow,outbound):=20=E5=BA=93=E7=AE=A1(WAR?= =?UTF-8?q?EHOUSE=5FMGR)=E4=BB=A3=E5=BB=BA=E7=94=B3=E8=AF=B7=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - submit/create 新增 force_approval:库管建单无视物料是否需审批,一律走审批 - 路由按当前角色为 WAREHOUSE_MGR 传 true;未选审批人返回明确业务错误 --- inventory-backend/app/api/v1/outbound.py | 3 ++- inventory-backend/app/api/v1/transactions.py | 3 ++- inventory-backend/app/services/borrow_service.py | 8 ++++++-- inventory-backend/app/services/outbound_service.py | 8 ++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/inventory-backend/app/api/v1/outbound.py b/inventory-backend/app/api/v1/outbound.py index ee5565c..755ca88 100644 --- a/inventory-backend/app/api/v1/outbound.py +++ b/inventory-backend/app/api/v1/outbound.py @@ -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({ diff --git a/inventory-backend/app/api/v1/transactions.py b/inventory-backend/app/api/v1/transactions.py index c0e8e3c..01857aa 100644 --- a/inventory-backend/app/api/v1/transactions.py +++ b/inventory-backend/app/api/v1/transactions.py @@ -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 diff --git a/inventory-backend/app/services/borrow_service.py b/inventory-backend/app/services/borrow_service.py index 1541720..8e43840 100644 --- a/inventory-backend/app/services/borrow_service.py +++ b/inventory-backend/app/services/borrow_service.py @@ -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}。请选择审批人后再提交") diff --git a/inventory-backend/app/services/outbound_service.py b/inventory-backend/app/services/outbound_service.py index 93839e7..9966e6b 100644 --- a/inventory-backend/app/services/outbound_service.py +++ b/inventory-backend/app/services/outbound_service.py @@ -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}。请选择审批人后再提交")