feat(bom): 新增动态级联扣减领料接口 cascade-inventory

This commit is contained in:
DXC
2026-05-29 16:24:35 +08:00
parent 034418df8a
commit ab42777e41
2 changed files with 245 additions and 0 deletions

View File

@ -1,6 +1,7 @@
from flask import Blueprint, request, jsonify, current_app
from sqlalchemy import or_
from app.services.bom_service import BomService, _cache_delete
from app.services.cascade_service import CascadeService
from app.models.base import MaterialBase
from app.models.bom import BomTable
from app.extensions import db
@ -382,3 +383,50 @@ def get_bom_parents():
except Exception as e:
current_app.logger.error(f'获取BOM父件列表失败: {str(e)}')
return jsonify({'code': 500, 'msg': '内部服务器错误'}), 500
@bom_bp.route('/cascade-inventory', methods=['GET'])
@jwt_required()
@permission_required('bom_manage')
def cascade_inventory():
"""
动态级联扣减领料接口。
参数:
bom_no BOM 编号(必填)
order_qty 订单需求总量必填float
version BOM 版本(可选,默认取最新)
返回:
级联展开后的分层领料清单,含 allocated / shortage 缺口分析
"""
try:
bom_no = request.args.get('bom_no', '').strip()
order_qty_str = request.args.get('order_qty', '').strip()
version = request.args.get('version') or None
if not bom_no:
return jsonify({'code': 400, 'msg': 'bom_no 不能为空'}), 400
if not order_qty_str:
return jsonify({'code': 400, 'msg': 'order_qty 不能为空'}), 400
try:
order_qty = float(order_qty_str)
except ValueError:
return jsonify({'code': 400, 'msg': 'order_qty 必须是数字'}), 400
if order_qty <= 0:
return jsonify({'code': 400, 'msg': 'order_qty 必须大于 0'}), 400
result = CascadeService.compute_cascade_result(bom_no, order_qty, version=version)
return jsonify({
'code': 200,
'msg': 'success',
'data': result
})
except ValueError as e:
return jsonify({'code': 404, 'msg': str(e)}), 404
except Exception as e:
current_app.logger.error(f'级联扣减领料失败: {str(e)}')
return jsonify({'code': 500, 'msg': '内部服务器错误'}), 500