-- 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 );