fix(webhook): 白名单判定容忍大小写,堵住「两边都丢弃」的静默黑洞

_belongs_to_this_org 此前是 (company_name or "").strip() == ORG_DEPARTMENT ——
只 strip 不 upper,而 IRIS 的 _is_foreign_company 做了 .upper()。两边口径不一致
的后果:

  company_name = "lica" / "Lica"
    → IRIS:.upper() 命中外来名单,拒掉
    → LICA:不等于 "LICA",白名单拒掉
    → 双方都回 200,消息彻底静默丢失

这正是本文档最该防的那种「漏」。改为 .strip().upper() 与 IRIS 对齐。

「严格」指的是白名单语义(只有本部门才收),不是逐字节比对 —— 空白值依然被
拒、未知部门名依然被拒,只是不再因为大小写写法白白丢消息。

实测 11 种取值:修复前 "lica" / "Lica" 是两个黑洞(两边都丢弃),修复后 0 个;
空白 / 全空格 / "IRIS" / "UNKNOWN" / None 仍然全部忽略,严格性未放松。

顺带修正 outbound_type 的取值注释:MOM 的 TransOutbound.outbound_type 实际是
SALES / USE / PRODUCTION(见 projects inventory-backend/app/models/outbound.py
第 136 行),原注释漏了 USE。
This commit is contained in:
2026-09-22 13:46:12 +08:00
parent 9778b8e4b2
commit 700486d5d5

View File

@ -63,8 +63,13 @@ def _belongs_to_this_org(company_name: str | None) -> bool:
配置,不收就彻底丢了。
LICA 没有兜底角色,空白值只可能来自"MOM 没判定出公司",那本就该由
IRIS 兜。**宁可漏,不可误收**:误收会把别的部门的设备状态改掉。
⚠️ 大小写与首尾空白都容忍(.strip().upper()),与 IRIS 的判定口径对齐。
两边若一个容忍、一个不容忍,小写写法("lica")会同时被 IRIS 当外来户
拒掉、又被本实例的白名单拒掉 —— 双方都回 200消息静默丢失正是本文
档最该防的那种「漏」。「严格」指的是白名单语义,不是逐字节比对。
"""
return (company_name or "").strip() == settings.ORG_DEPARTMENT
return (company_name or "").strip().upper() == settings.ORG_DEPARTMENT.strip().upper()
def _attribute_audit_to_mom_operator(request: Request, operator: str | None) -> None:
@ -407,7 +412,7 @@ class MomOutboundPayload(BaseModel):
outbound_time: datetime | None = None # 出库时间
# ↓ 2026-09 新增:部门路由键,本实例只认 "LICA"(见 _belongs_to_this_org
company_name: str | None = None # IRIS / LICA
outbound_type: str | None = None # SALES / PRODUCTIONMOM 一直在发,此前被丢弃)
outbound_type: str | None = None # SALES / USE / PRODUCTIONMOM 一直在发,此前被丢弃)
@router.post("/mom-outbound")