-- 1.0.111.sql -- S8-EXCEPTION-LIFECYCLE-DEMO-SEED-1 -- 为 S8 overview 卡片驱动「闭环率 / 平均处理时间」演示能力,将 22 条 active 异常的一部分切到 CLOSED / IN_PROGRESS: -- * CLOSED 8 条:覆盖 S1/S2/S3/S4/S5/S6/S7 七个 stage,含 SERIOUS 与 FOLLOW 两档;处理时长 4/6/8/12/18/24/36/72h -- * IN_PROGRESS 5 条:覆盖 S1/S4/S5/S6 四个 stage;assigned_at = created_at + 1h -- * 其余 9 条保持 NEW -- 同时为受影响异常补写 timeline ASSIGN / CLOSE 动作行,CLOSE 仅写给 CLOSED 行。 -- 执行入口:AutoVersionUpdate.UseAutoVersionUpdate(),csproj Version=1.0.111 主节点首次启动时触发。 -- 幂等性: -- * UPDATE 通过 exception_code IN (...) + source_rule_code IN (...) + 目标状态 != 当前 status 防重; -- closed_at 用 created_at + INTERVAL N HOUR 固定生成,不用 NOW(),保证多次执行 closed_at 不漂移; -- 重复执行后已是 CLOSED 的行不再被 SET(WHERE status <> 'CLOSED'),avg/closeRate 稳定。 -- * timeline INSERT ... WHERE NOT EXISTS (action_code, action_remark='S8 lifecycle demo seed') 防重。 -- 安全边界: -- * 不动 source_rule_code / exception_code / severity / stage_code / module_code / responsible_dept_id / -- is_deleted / timeout_flag / sla_deadline; -- * WHERE 严格限制 source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED'); -- * 仅 13 条按 exception_code 显式列入,不会扩散到其它行; -- * 无 DELETE;无 ALTER;无全表 UPDATE;不动 ado_s8_order_flow_*;不动 watch_rule。 -- Rollback: 如需回滚,可执行: -- UPDATE ado_s8_exception SET status='NEW', assigned_at=NULL, closed_at=NULL -- WHERE exception_code IN ('EX-DRV-SO-2026-009-OR','EX-DEMO-COV-S2-02','EX-DEMO-COV-S3-02', -- 'EX-DRV-SO-2026-001-MP','EX-DRV-SO-2026-002-MP','EX-DEMO-COV-S5-02', -- 'EX-DRV-SO-2026-003-BP','EX-DRV-SO-2026-011-FA', -- 'EX-DRV-SO-2026-015-OR','EX-DRV-SO-2026-004-PD','EX-DRV-SO-2026-006-MP', -- 'EX-DEMO-COV-S5-01','EX-DRV-SO-2026-007-BP') -- AND source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED'); -- DELETE FROM ado_s8_exception_timeline WHERE action_remark='S8 lifecycle demo seed'; -- 2026-05-16 -- 1) CLOSED 8 条:assigned_at = created_at + 1h,closed_at = created_at + Nh -- 幂等:WHERE status <> 'CLOSED' 避免重复执行覆盖 assigned_at(NULL→1h→1h,但若被人工修改过则保留)。 UPDATE ado_s8_exception SET assigned_at = CASE WHEN assigned_at IS NULL THEN DATE_ADD(created_at, INTERVAL 1 HOUR) ELSE assigned_at END, closed_at = CASE exception_code WHEN 'EX-DRV-SO-2026-009-OR' THEN DATE_ADD(created_at, INTERVAL 36 HOUR) WHEN 'EX-DEMO-COV-S2-02' THEN DATE_ADD(created_at, INTERVAL 24 HOUR) WHEN 'EX-DEMO-COV-S3-02' THEN DATE_ADD(created_at, INTERVAL 6 HOUR) WHEN 'EX-DRV-SO-2026-001-MP' THEN DATE_ADD(created_at, INTERVAL 12 HOUR) WHEN 'EX-DRV-SO-2026-002-MP' THEN DATE_ADD(created_at, INTERVAL 18 HOUR) WHEN 'EX-DEMO-COV-S5-02' THEN DATE_ADD(created_at, INTERVAL 8 HOUR) WHEN 'EX-DRV-SO-2026-003-BP' THEN DATE_ADD(created_at, INTERVAL 4 HOUR) WHEN 'EX-DRV-SO-2026-011-FA' THEN DATE_ADD(created_at, INTERVAL 72 HOUR) ELSE closed_at END, status = 'CLOSED', updated_at = NOW(), updated_by = 'system:s8_lifecycle_demo_seed' WHERE is_deleted = 0 AND status <> 'CLOSED' AND source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED') AND exception_code IN ( 'EX-DRV-SO-2026-009-OR', -- S1 SERIOUS 36h 'EX-DEMO-COV-S2-02', -- S2 SERIOUS 24h 'EX-DEMO-COV-S3-02', -- S3 FOLLOW 6h 'EX-DRV-SO-2026-001-MP', -- S4 FOLLOW 12h 'EX-DRV-SO-2026-002-MP', -- S4 FOLLOW 18h 'EX-DEMO-COV-S5-02', -- S5 FOLLOW 8h 'EX-DRV-SO-2026-003-BP', -- S6 FOLLOW 4h 'EX-DRV-SO-2026-011-FA' -- S7 FOLLOW 72h ); -- 2) IN_PROGRESS 5 条:assigned_at = created_at + 1h;closed_at 保持 NULL。 -- 幂等:WHERE status NOT IN ('IN_PROGRESS','CLOSED') 避免覆盖已闭环或多次刷新 assigned_at。 UPDATE ado_s8_exception SET assigned_at = CASE WHEN assigned_at IS NULL THEN DATE_ADD(created_at, INTERVAL 1 HOUR) ELSE assigned_at END, closed_at = NULL, status = 'IN_PROGRESS', updated_at = NOW(), updated_by = 'system:s8_lifecycle_demo_seed' WHERE is_deleted = 0 AND status NOT IN ('IN_PROGRESS','CLOSED') AND source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED') AND exception_code IN ( 'EX-DRV-SO-2026-015-OR', -- S1 SERIOUS 'EX-DRV-SO-2026-004-PD', -- S1 SERIOUS 'EX-DRV-SO-2026-006-MP', -- S4 FOLLOW 'EX-DEMO-COV-S5-01', -- S5 FOLLOW 'EX-DRV-SO-2026-007-BP' -- S6 FOLLOW ); -- 3) timeline ASSIGN:所有 IN_PROGRESS / CLOSED 共 13 条均写一行 ASSIGN,from_status='NEW' → to_status='IN_PROGRESS'。 INSERT INTO ado_s8_exception_timeline (exception_id, action_code, action_label, from_status, to_status, operator_id, operator_name, action_remark, created_at) SELECT e.id, 'ASSIGN', '分派', 'NEW', 'IN_PROGRESS', NULL, 'system', 'S8 lifecycle demo seed', e.assigned_at FROM ado_s8_exception e WHERE e.is_deleted = 0 AND e.source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED') AND e.exception_code IN ( 'EX-DRV-SO-2026-009-OR','EX-DEMO-COV-S2-02','EX-DEMO-COV-S3-02', 'EX-DRV-SO-2026-001-MP','EX-DRV-SO-2026-002-MP','EX-DEMO-COV-S5-02', 'EX-DRV-SO-2026-003-BP','EX-DRV-SO-2026-011-FA', 'EX-DRV-SO-2026-015-OR','EX-DRV-SO-2026-004-PD','EX-DRV-SO-2026-006-MP', 'EX-DEMO-COV-S5-01','EX-DRV-SO-2026-007-BP' ) AND NOT EXISTS ( SELECT 1 FROM ado_s8_exception_timeline tl WHERE tl.exception_id = e.id AND tl.action_code = 'ASSIGN' AND tl.action_remark = 'S8 lifecycle demo seed' ); -- 4) timeline CLOSE:仅 8 条 CLOSED 写一行 CLOSE,from_status='IN_PROGRESS' → to_status='CLOSED'。 INSERT INTO ado_s8_exception_timeline (exception_id, action_code, action_label, from_status, to_status, operator_id, operator_name, action_remark, created_at) SELECT e.id, 'CLOSE', '闭环', 'IN_PROGRESS', 'CLOSED', NULL, 'system', 'S8 lifecycle demo seed', e.closed_at FROM ado_s8_exception e WHERE e.is_deleted = 0 AND e.status = 'CLOSED' AND e.source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED') AND e.exception_code IN ( 'EX-DRV-SO-2026-009-OR','EX-DEMO-COV-S2-02','EX-DEMO-COV-S3-02', 'EX-DRV-SO-2026-001-MP','EX-DRV-SO-2026-002-MP','EX-DEMO-COV-S5-02', 'EX-DRV-SO-2026-003-BP','EX-DRV-SO-2026-011-FA' ) AND NOT EXISTS ( SELECT 1 FROM ado_s8_exception_timeline tl WHERE tl.exception_id = e.id AND tl.action_code = 'CLOSE' AND tl.action_remark = 'S8 lifecycle demo seed' ); -- 验证 SQL(注释,仅人工核对): -- SELECT status, COUNT(*) FROM ado_s8_exception WHERE is_deleted=0 GROUP BY status; -- SELECT stage_code, COUNT(*) total, SUM(status='CLOSED') closed_cnt, -- ROUND(SUM(status='CLOSED')*100.0/COUNT(*), 1) close_rate, -- ROUND(AVG(CASE WHEN closed_at IS NOT NULL THEN TIMESTAMPDIFF(MINUTE, created_at, closed_at) END)/60, 2) avg_hours -- FROM ado_s8_exception WHERE is_deleted=0 GROUP BY stage_code ORDER BY stage_code; -- SELECT action_code, to_status, COUNT(*) FROM ado_s8_exception_timeline -- WHERE action_remark='S8 lifecycle demo seed' GROUP BY action_code, to_status;