1.0.111.sql 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. -- 1.0.111.sql
  2. -- S8-EXCEPTION-LIFECYCLE-DEMO-SEED-1
  3. -- 为 S8 overview 卡片驱动「闭环率 / 平均处理时间」演示能力,将 22 条 active 异常的一部分切到 CLOSED / IN_PROGRESS:
  4. -- * CLOSED 8 条:覆盖 S1/S2/S3/S4/S5/S6/S7 七个 stage,含 SERIOUS 与 FOLLOW 两档;处理时长 4/6/8/12/18/24/36/72h
  5. -- * IN_PROGRESS 5 条:覆盖 S1/S4/S5/S6 四个 stage;assigned_at = created_at + 1h
  6. -- * 其余 9 条保持 NEW
  7. -- 同时为受影响异常补写 timeline ASSIGN / CLOSE 动作行,CLOSE 仅写给 CLOSED 行。
  8. -- 执行入口:AutoVersionUpdate.UseAutoVersionUpdate(),csproj Version=1.0.111 主节点首次启动时触发。
  9. -- 幂等性:
  10. -- * UPDATE 通过 exception_code IN (...) + source_rule_code IN (...) + 目标状态 != 当前 status 防重;
  11. -- closed_at 用 created_at + INTERVAL N HOUR 固定生成,不用 NOW(),保证多次执行 closed_at 不漂移;
  12. -- 重复执行后已是 CLOSED 的行不再被 SET(WHERE status <> 'CLOSED'),avg/closeRate 稳定。
  13. -- * timeline INSERT ... WHERE NOT EXISTS (action_code, action_remark='S8 lifecycle demo seed') 防重。
  14. -- 安全边界:
  15. -- * 不动 source_rule_code / exception_code / severity / stage_code / module_code / responsible_dept_id /
  16. -- is_deleted / timeout_flag / sla_deadline;
  17. -- * WHERE 严格限制 source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED');
  18. -- * 仅 13 条按 exception_code 显式列入,不会扩散到其它行;
  19. -- * 无 DELETE;无 ALTER;无全表 UPDATE;不动 ado_s8_order_flow_*;不动 watch_rule。
  20. -- Rollback: 如需回滚,可执行:
  21. -- UPDATE ado_s8_exception SET status='NEW', assigned_at=NULL, closed_at=NULL
  22. -- WHERE exception_code IN ('EX-DRV-SO-2026-009-OR','EX-DEMO-COV-S2-02','EX-DEMO-COV-S3-02',
  23. -- 'EX-DRV-SO-2026-001-MP','EX-DRV-SO-2026-002-MP','EX-DEMO-COV-S5-02',
  24. -- 'EX-DRV-SO-2026-003-BP','EX-DRV-SO-2026-011-FA',
  25. -- 'EX-DRV-SO-2026-015-OR','EX-DRV-SO-2026-004-PD','EX-DRV-SO-2026-006-MP',
  26. -- 'EX-DEMO-COV-S5-01','EX-DRV-SO-2026-007-BP')
  27. -- AND source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED');
  28. -- DELETE FROM ado_s8_exception_timeline WHERE action_remark='S8 lifecycle demo seed';
  29. -- 2026-05-16
  30. -- 1) CLOSED 8 条:assigned_at = created_at + 1h,closed_at = created_at + Nh
  31. -- 幂等:WHERE status <> 'CLOSED' 避免重复执行覆盖 assigned_at(NULL→1h→1h,但若被人工修改过则保留)。
  32. UPDATE ado_s8_exception
  33. SET assigned_at = CASE
  34. WHEN assigned_at IS NULL THEN DATE_ADD(created_at, INTERVAL 1 HOUR)
  35. ELSE assigned_at
  36. END,
  37. closed_at = CASE exception_code
  38. WHEN 'EX-DRV-SO-2026-009-OR' THEN DATE_ADD(created_at, INTERVAL 36 HOUR)
  39. WHEN 'EX-DEMO-COV-S2-02' THEN DATE_ADD(created_at, INTERVAL 24 HOUR)
  40. WHEN 'EX-DEMO-COV-S3-02' THEN DATE_ADD(created_at, INTERVAL 6 HOUR)
  41. WHEN 'EX-DRV-SO-2026-001-MP' THEN DATE_ADD(created_at, INTERVAL 12 HOUR)
  42. WHEN 'EX-DRV-SO-2026-002-MP' THEN DATE_ADD(created_at, INTERVAL 18 HOUR)
  43. WHEN 'EX-DEMO-COV-S5-02' THEN DATE_ADD(created_at, INTERVAL 8 HOUR)
  44. WHEN 'EX-DRV-SO-2026-003-BP' THEN DATE_ADD(created_at, INTERVAL 4 HOUR)
  45. WHEN 'EX-DRV-SO-2026-011-FA' THEN DATE_ADD(created_at, INTERVAL 72 HOUR)
  46. ELSE closed_at
  47. END,
  48. status = 'CLOSED',
  49. updated_at = NOW(),
  50. updated_by = 'system:s8_lifecycle_demo_seed'
  51. WHERE is_deleted = 0
  52. AND status <> 'CLOSED'
  53. AND source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED')
  54. AND exception_code IN (
  55. 'EX-DRV-SO-2026-009-OR', -- S1 SERIOUS 36h
  56. 'EX-DEMO-COV-S2-02', -- S2 SERIOUS 24h
  57. 'EX-DEMO-COV-S3-02', -- S3 FOLLOW 6h
  58. 'EX-DRV-SO-2026-001-MP', -- S4 FOLLOW 12h
  59. 'EX-DRV-SO-2026-002-MP', -- S4 FOLLOW 18h
  60. 'EX-DEMO-COV-S5-02', -- S5 FOLLOW 8h
  61. 'EX-DRV-SO-2026-003-BP', -- S6 FOLLOW 4h
  62. 'EX-DRV-SO-2026-011-FA' -- S7 FOLLOW 72h
  63. );
  64. -- 2) IN_PROGRESS 5 条:assigned_at = created_at + 1h;closed_at 保持 NULL。
  65. -- 幂等:WHERE status NOT IN ('IN_PROGRESS','CLOSED') 避免覆盖已闭环或多次刷新 assigned_at。
  66. UPDATE ado_s8_exception
  67. SET assigned_at = CASE
  68. WHEN assigned_at IS NULL THEN DATE_ADD(created_at, INTERVAL 1 HOUR)
  69. ELSE assigned_at
  70. END,
  71. closed_at = NULL,
  72. status = 'IN_PROGRESS',
  73. updated_at = NOW(),
  74. updated_by = 'system:s8_lifecycle_demo_seed'
  75. WHERE is_deleted = 0
  76. AND status NOT IN ('IN_PROGRESS','CLOSED')
  77. AND source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED')
  78. AND exception_code IN (
  79. 'EX-DRV-SO-2026-015-OR', -- S1 SERIOUS
  80. 'EX-DRV-SO-2026-004-PD', -- S1 SERIOUS
  81. 'EX-DRV-SO-2026-006-MP', -- S4 FOLLOW
  82. 'EX-DEMO-COV-S5-01', -- S5 FOLLOW
  83. 'EX-DRV-SO-2026-007-BP' -- S6 FOLLOW
  84. );
  85. -- 3) timeline ASSIGN:所有 IN_PROGRESS / CLOSED 共 13 条均写一行 ASSIGN,from_status='NEW' → to_status='IN_PROGRESS'。
  86. INSERT INTO ado_s8_exception_timeline
  87. (exception_id, action_code, action_label, from_status, to_status,
  88. operator_id, operator_name, action_remark, created_at)
  89. SELECT e.id, 'ASSIGN', '分派', 'NEW', 'IN_PROGRESS',
  90. NULL, 'system', 'S8 lifecycle demo seed', e.assigned_at
  91. FROM ado_s8_exception e
  92. WHERE e.is_deleted = 0
  93. AND e.source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED')
  94. AND e.exception_code IN (
  95. 'EX-DRV-SO-2026-009-OR','EX-DEMO-COV-S2-02','EX-DEMO-COV-S3-02',
  96. 'EX-DRV-SO-2026-001-MP','EX-DRV-SO-2026-002-MP','EX-DEMO-COV-S5-02',
  97. 'EX-DRV-SO-2026-003-BP','EX-DRV-SO-2026-011-FA',
  98. 'EX-DRV-SO-2026-015-OR','EX-DRV-SO-2026-004-PD','EX-DRV-SO-2026-006-MP',
  99. 'EX-DEMO-COV-S5-01','EX-DRV-SO-2026-007-BP'
  100. )
  101. AND NOT EXISTS (
  102. SELECT 1 FROM ado_s8_exception_timeline tl
  103. WHERE tl.exception_id = e.id
  104. AND tl.action_code = 'ASSIGN'
  105. AND tl.action_remark = 'S8 lifecycle demo seed'
  106. );
  107. -- 4) timeline CLOSE:仅 8 条 CLOSED 写一行 CLOSE,from_status='IN_PROGRESS' → to_status='CLOSED'。
  108. INSERT INTO ado_s8_exception_timeline
  109. (exception_id, action_code, action_label, from_status, to_status,
  110. operator_id, operator_name, action_remark, created_at)
  111. SELECT e.id, 'CLOSE', '闭环', 'IN_PROGRESS', 'CLOSED',
  112. NULL, 'system', 'S8 lifecycle demo seed', e.closed_at
  113. FROM ado_s8_exception e
  114. WHERE e.is_deleted = 0
  115. AND e.status = 'CLOSED'
  116. AND e.source_rule_code IN ('ORDER_FLOW_KPI_OVERTIME_DERIVED','S8_OVERVIEW_DEMO_COVERAGE_SEED')
  117. AND e.exception_code IN (
  118. 'EX-DRV-SO-2026-009-OR','EX-DEMO-COV-S2-02','EX-DEMO-COV-S3-02',
  119. 'EX-DRV-SO-2026-001-MP','EX-DRV-SO-2026-002-MP','EX-DEMO-COV-S5-02',
  120. 'EX-DRV-SO-2026-003-BP','EX-DRV-SO-2026-011-FA'
  121. )
  122. AND NOT EXISTS (
  123. SELECT 1 FROM ado_s8_exception_timeline tl
  124. WHERE tl.exception_id = e.id
  125. AND tl.action_code = 'CLOSE'
  126. AND tl.action_remark = 'S8 lifecycle demo seed'
  127. );
  128. -- 验证 SQL(注释,仅人工核对):
  129. -- SELECT status, COUNT(*) FROM ado_s8_exception WHERE is_deleted=0 GROUP BY status;
  130. -- SELECT stage_code, COUNT(*) total, SUM(status='CLOSED') closed_cnt,
  131. -- ROUND(SUM(status='CLOSED')*100.0/COUNT(*), 1) close_rate,
  132. -- ROUND(AVG(CASE WHEN closed_at IS NOT NULL THEN TIMESTAMPDIFF(MINUTE, created_at, closed_at) END)/60, 2) avg_hours
  133. -- FROM ado_s8_exception WHERE is_deleted=0 GROUP BY stage_code ORDER BY stage_code;
  134. -- SELECT action_code, to_status, COUNT(*) FROM ado_s8_exception_timeline
  135. -- WHERE action_remark='S8 lifecycle demo seed' GROUP BY action_code, to_status;