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 场景由调用方自行处理)。
|
仅当 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):
|
def stripper(d, stock_category):
|
||||||
if permission_prefix is None or permission_prefix in SELECTION_PREFIXES:
|
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
|
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. 报废记录查询接口
|
# 3. 报废记录查询接口
|
||||||
# GET /api/v1/scrap/records
|
# 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