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