4.29扫码获取库位小工具接口
This commit is contained in:
@ -375,34 +375,29 @@ class MaterialBaseService:
|
||||
|
||||
if enable_warning_sort:
|
||||
print("====== [DEBUG] 成功进入预警强排逻辑 ======")
|
||||
# 直接在 order_by 中进行计算排序,不污染 select 列
|
||||
inv_val = inner_sub.c.total_inv
|
||||
red_val = cast(MaterialWarningSetting.red_threshold, Numeric)
|
||||
yellow_val = cast(MaterialWarningSetting.yellow_threshold, Numeric)
|
||||
|
||||
# 预警等级计算:红=2, 黄=1, 正常=0
|
||||
warning_level = case(
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), inv_val <= red_val), 2),
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), inv_val <= yellow_val), 1),
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), red_val.isnot(None), inv_val <= red_val), 2),
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), yellow_val.isnot(None), inv_val <= yellow_val), 1),
|
||||
else_=0
|
||||
)
|
||||
|
||||
# 统一计算缺口 (Shortage) = 目标阈值 - 当前库存
|
||||
# 红色算红色的缺口,黄色算黄色的缺口,越大说明缺的越多
|
||||
shortage = case(
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), red_val.isnot(None), inv_val <= red_val), red_val - inv_val),
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), yellow_val.isnot(None), inv_val <= yellow_val), yellow_val - inv_val),
|
||||
else_=0
|
||||
)
|
||||
# 红色预警时的缺口
|
||||
red_shortage = case(
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), inv_val <= red_val), red_val - inv_val),
|
||||
else_=0
|
||||
)
|
||||
# 黄色预警时的缺口
|
||||
yellow_distance = case(
|
||||
(and_(MaterialWarningSetting.is_enabled.is_(True), inv_val > red_val, inv_val <= yellow_val), inv_val - red_val),
|
||||
else_=999999
|
||||
)
|
||||
|
||||
# 直接在 order_by 中使用 case() 表达式
|
||||
query = query.order_by(
|
||||
desc(warning_level),
|
||||
desc(red_shortage),
|
||||
asc(yellow_distance),
|
||||
desc(inv_val),
|
||||
desc(warning_level), # 1. 先按红、黄、正常排
|
||||
desc(shortage), # 2. 同级别内,缺口越大的排越上面
|
||||
desc(inv_val), # 3. 缺口一样,库存多的排上面
|
||||
desc(MaterialBase.id)
|
||||
)
|
||||
elif order_by_column:
|
||||
@ -462,12 +457,18 @@ class MaterialBaseService:
|
||||
item_dict['warningRed'] = float(warning_red) if warning_red is not None else None
|
||||
|
||||
# 计算预警状态
|
||||
if warning_enabled and warning_red is not None:
|
||||
if warning_enabled:
|
||||
invQty = item_dict['inventoryCount']
|
||||
if invQty <= warning_red:
|
||||
|
||||
# 优先判断红色预警(如果设置了红阈值,且库存 <= 红阈值)
|
||||
if warning_red is not None and invQty <= warning_red:
|
||||
item_dict['warningStatus'] = 2 # 红色
|
||||
|
||||
# 其次判断黄色预警(如果设置了黄阈值,且库存 <= 黄阈值)
|
||||
elif warning_yellow is not None and invQty <= warning_yellow:
|
||||
item_dict['warningStatus'] = 1 # 黄色
|
||||
|
||||
# 都不满足则正常
|
||||
else:
|
||||
item_dict['warningStatus'] = 0 # 正常
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user