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