feat(material): 物料列表新增「采购在途」自动标识,预警邮件改用活跃单静音
base_service.get_list: 新增 isPurchasing 字段,与待采购池共用同一份活跃单判定。放在预警权限 判断之外 —— 能看到物料列表的人都该知道这个物料已经在采购了。 inventory_task: 静音条件从人工标记 is_ordered 改为「该物料无活跃采购单」。 ★ 为什么必须同时改邮件:预警邮件由出库执行流程触发(outbound_service 出库 完成后的调用),功能是活的;而它的静音入口(前端人工「标记已采购」)随本次 改造一并移除。若不改这里,用户会彻底失去静音能力,每个缺货物料在每次出库后 都会发信。自动判定在建单时静默、单据驳回或强制结案后自动恢复,比人工标记准。 两张表的判定口径都由 utils/purchase_activity.py 提供,不各写一遍。
This commit is contained in:
@ -116,10 +116,16 @@ class InventoryWarningService:
|
||||
"""
|
||||
执行库存预警扫描与邮件发送
|
||||
|
||||
1. 查询所有 is_enabled=True 且 is_ordered=False 的预警配置
|
||||
1. 查询所有 is_enabled=True 且**没有活跃采购单**的预警配置
|
||||
2. 按 level 归类物料,按邮箱聚合(同一邮箱 → 一封邮件)
|
||||
3. 调用 send_email 发送,更新 last_notified_at
|
||||
|
||||
★ 静音条件从「人工标记 is_ordered」改成了「是否有活跃采购单」:
|
||||
人工标记的前端入口已随「采购在途」自动化改造一并移除,若不改这里,
|
||||
用户将彻底失去静音能力(本函数由出库执行流程触发,见
|
||||
outbound_service.py 出库完成后的调用)。自动化判定与待采购池、
|
||||
物料列表 isPurchasing 共用同一份定义,口径一致。
|
||||
|
||||
Returns:
|
||||
{
|
||||
"red_count": N, # 触发红色预警的物料数
|
||||
@ -134,10 +140,13 @@ class InventoryWarningService:
|
||||
beijing_tz = timezone(timedelta(hours=8))
|
||||
now = datetime.now(beijing_tz)
|
||||
|
||||
# 查询启用了预警且未标记采购的配置
|
||||
# 查询启用了预警、且当前没有活跃采购单的配置。
|
||||
# 有在途单 → 不必再催采购,静音;单据被驳回或强制结案后自动恢复告警。
|
||||
from app.utils.purchase_activity import active_purchase_exists
|
||||
|
||||
settings = MaterialWarningSetting.query.filter(
|
||||
MaterialWarningSetting.is_enabled == True,
|
||||
MaterialWarningSetting.is_ordered == False
|
||||
~active_purchase_exists(MaterialWarningSetting.base_id),
|
||||
).all()
|
||||
|
||||
red_rows_by_email = defaultdict(list) # email -> [物料row, ...]
|
||||
|
||||
Reference in New Issue
Block a user