diff --git a/inventory-backend/app/api/v1/inbound/stock.py b/inventory-backend/app/api/v1/inbound/stock.py index 4d36530..fcb12c9 100644 --- a/inventory-backend/app/api/v1/inbound/stock.py +++ b/inventory-backend/app/api/v1/inbound/stock.py @@ -252,7 +252,8 @@ def _make_price_stripper(permission_prefix=None): 仅当 permission_prefix 不在已知选单前缀列表中时放行(例如 material_list 场景由调用方自行处理)。 """ # 已知的选单/借用前缀 → 无条件剥离所有价格成本 - SELECTION_PREFIXES = {'outbound_selection', 'op_borrow_apply', 'inventory_stocktake'} + # ★ 新增前缀必须登记在此,否则该前缀的调用方会拿到价格/成本字段(Fail-Closed 失效) + SELECTION_PREFIXES = {'outbound_selection', 'op_borrow_apply', 'inventory_stocktake', 'scrap_apply'} def stripper(d, stock_category): if permission_prefix is None or permission_prefix in SELECTION_PREFIXES: diff --git a/inventory-backend/app/api/v1/scrap.py b/inventory-backend/app/api/v1/scrap.py index faef9a3..ed1b423 100644 --- a/inventory-backend/app/api/v1/scrap.py +++ b/inventory-backend/app/api/v1/scrap.py @@ -104,6 +104,24 @@ def create_scrap(): return jsonify({'code': 400, 'msg': str(e)}), 400 +# -------------------------------------------------------- +# 2.1 报废申请专用库存列表(独立权限,解耦出库选单) +# GET /api/v1/scrap/stock-list +# -------------------------------------------------------- +@scrap_bp.route('/stock-list', methods=['GET']) +@jwt_required() +@permission_required('scrap_apply') +def get_scrap_stock_list(): + """ + 报废申请专用库存列表 — Fail-Closed: 剥离价格字段 + + 与借库 /transactions/borrow/stock-list 同构:复用 _do_get_stock_list, + 但挂 scrap_apply 权限,报废申请人无需持有出库选单权限。 + """ + from app.api.v1.inbound.stock import _do_get_stock_list + return _do_get_stock_list(permission_prefix='scrap_apply') + + # -------------------------------------------------------- # 3. 报废记录查询接口 # GET /api/v1/scrap/records diff --git a/inventory-web/src/api/scrap.ts b/inventory-web/src/api/scrap.ts index 92e0bfd..369736c 100644 --- a/inventory-web/src/api/scrap.ts +++ b/inventory-web/src/api/scrap.ts @@ -27,6 +27,15 @@ export function getScrapRecords(params: any) { }) } +// 3.1 报废申请专用库存列表(独立于出库选单权限,Fail-Closed 剥离价格) +export function getScrapStockList(params: { page?: number; pageSize?: number; keyword?: string }) { + return request({ + url: '/v1/scrap/stock-list', + method: 'get', + params + }) +} + // ========================================== // 报废申请/审批/执行(新流程,镜像出/借库) // ==========================================