feat(scrap): 新增报废专用库存查询端点,解耦出库选单权限
报废申请页原复用 /inbound/stock/list,该端点权限是 outbound_selection。
持有 scrap_apply 的角色目前恰好也都持有该权限,故能跑通,但属隐性耦合:
任一角色授权脱钩就会静默 403,被前端 catch 掩盖成「加载库存失败」。
照抄借库既有先例(transactions.py 的 /borrow/stock-list),新增:
GET /v1/scrap/stock-list @permission_required('scrap_apply')
★ 同步把 'scrap_apply' 登记进 stock.py 的 SELECTION_PREFIXES。
_make_price_stripper 仅当前缀为 None 或已在集合中时才剥离价格,
漏登记会导致价格/成本字段泄露给报废申请人(Fail-Closed 失效)。
实测:OUTBOUND/WAREHOUSE_MGR 均 200,无 token 401,
响应中 unit_price/total_price/sale_price 等价格字段零泄漏。
This commit is contained in:
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
})
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// 报废申请/审批/执行(新流程,镜像出/借库)
|
||||
// ==========================================
|
||||
|
||||
Reference in New Issue
Block a user