1.0.463.sql 1.5 KB

123456789101112131415161718192021222324
  1. -- 1.0.463:WorkOrdMaster 状态回退保护(禁止 r/w/s/c 回退为 p)
  2. -- 背景:本库工单与 165(MES) 热回读共管(MdpHotWatchService 轮询回写 Status)。
  3. -- 存在状态时间差竞态:本库已下达/投产(r/w/s)甚至关单(c),而 165 侧仍为 p(已发布),
  4. -- 轮询回写会把执行态工单悄悄打回计划态 p,导致齐套看板判定紊乱(状态回退后不再满足
  5. -- 下达/投产口径)、领料单更新逻辑(仅处理 r/w/s)失效。
  6. -- 方案B(静默抑制):BEFORE UPDATE 触发器拦截 NEW.Status='p' 且 OLD.Status IN ('r','w','s','c'),
  7. -- 保留 OLD.Status;不阻断语句,其余字段(QtyCompleted 报工量等)正常更新。
  8. -- 配套应用层根因修复:MdpHotWatchService 回写 CASE 已加同规则守卫;本触发器为全库兜底,
  9. -- 覆盖手工 SQL / scheduling/status PATCH 接口等其他一切写入路径。
  10. -- 合法路径不受影响:交期确认仅从空状态写 p(WHERE Status=''),MES 投产 r→W 正常放行。
  11. -- 幂等:DROP TRIGGER IF EXISTS 后重建;触发器体为单语句(SET ... = IF(...)),
  12. -- 无 BEGIN...END、无中间分号,无需 DELIMITER,兼容按分号拆分的迁移执行器。
  13. DROP TRIGGER IF EXISTS trg_wo_status_no_regress_p;
  14. CREATE TRIGGER trg_wo_status_no_regress_p
  15. BEFORE UPDATE ON WorkOrdMaster
  16. FOR EACH ROW
  17. SET NEW.Status = IF(
  18. LOWER(TRIM(IFNULL(NEW.Status, ''))) = 'p'
  19. AND LOWER(TRIM(IFNULL(OLD.Status, ''))) IN ('r', 'w', 's', 'c'),
  20. OLD.Status,
  21. NEW.Status
  22. );