1.0.106.sql 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. -- 1.0.106.sql
  2. -- S8-ORDER-FLOW-KPI-OVERTIME-EXCEPTION-SEED-1:派生 ORDER_FLOW KPI 超期阶段为 ado_s8_exception 事件。
  3. -- 解决问题:order-execution 页面 yellow/red 阶段已是业务事实,但未进入 ado_s8_exception,
  4. -- 导致 S8 overview / delivery / production / supply / exception list / dept serious card 空态。
  5. -- 本脚本以幂等方式:(A) 新增 3 条阶段缺口 type;(B) 派生 16 条 exception;(C) 派生 16 条 timeline。
  6. -- 执行入口:AutoVersionUpdate.UseAutoVersionUpdate(),在 csproj Version=1.0.106 主节点首次启动时触发。
  7. -- 幂等性:
  8. -- - exception_type:唯一键 (tenant_id, factory_id, type_code) + ON DUPLICATE KEY UPDATE
  9. -- - exception:唯一键 (tenant_id, factory_id, exception_code) + ON DUPLICATE KEY UPDATE
  10. -- - timeline:无唯一键 → INSERT ... SELECT WHERE NOT EXISTS 防重
  11. -- 安全边界:
  12. -- - 不改 ado_s8_order_flow_stage / 不改 order-execution UI / 不启用 watch_rule
  13. -- - 不写 is_deleted 到 exception_type 与 timeline(实证表无该列)
  14. -- - exception 派生的 created_at 用 LEAST(COALESCE(actual_end_at, target_at, NOW()), NOW())
  15. -- 防止 BODY_PRODUCTION / FINAL_ASSEMBLY_DELIVERY 阶段 actual_end_at 晚于 DB NOW 制造未来异常
  16. -- 拍板依据:S8-ORDER-FLOW-KPI-OVERTIME-SYNC-DECISION-1 回执(2026-05-14)
  17. -- 2026-05-14
  18. -- =====================================================================
  19. -- A) 3 条 exception_type idempotent upsert
  20. -- =====================================================================
  21. -- 字段映射来源:S8-ORDER-FLOW-KPI-OVERTIME-SYNC-DECISION-1 §3.2
  22. -- 选 id:baseId(1329908100000) + 46/47/48;DB 已确认空闲,且与 PARENT_*(100..104) 不冲突
  23. INSERT INTO ado_s8_exception_type
  24. (id, tenant_id, factory_id, type_code, type_name, scene_code, severity_default, sla_minutes,
  25. owner_role_code, escalate_role_code, stats_mode, monitoring_category_key, mobile_visible, icon,
  26. enabled, sort_no, remark, parent_id, is_group, created_at, updated_at)
  27. VALUES
  28. (1329908100046, 0, 0, 'PRODUCT_DESIGN_DELAY', '产品设计延期', 'S1', 'SERIOUS', 240,
  29. 'ROLE_ORDER_PLANNER', 'ROLE_ORDER_PLANNER', 'ALL', 'PRODUCT_DESIGN', 1, NULL,
  30. 1, 113, '[S8-ORDER-FLOW-KPI-OVERTIME-SEED-1] 产品设计阶段 KPI 超期;ORDER_FLOW 派生事件使用。',
  31. 1329908100101, 0, '2026-05-14 00:00:00', NULL),
  32. (1329908100047, 0, 0, 'BODY_PRODUCTION_DELAY_WARNING', '本体生产延期预警', 'S6', 'FOLLOW', 120,
  33. 'ROLE_PRODUCTION_PLANNER', 'ROLE_PRODUCTION_PLANNER', 'ALL', 'BODY_PRODUCTION', 1, NULL,
  34. 1, 614, '[S8-ORDER-FLOW-KPI-OVERTIME-SEED-1] 本体生产阶段 KPI 超期预警;ORDER_FLOW 派生事件使用。',
  35. 1329908100103, 0, '2026-05-14 00:00:00', NULL),
  36. (1329908100048, 0, 0, 'DELIVERY_DELAY_WARNING', '总装发货延期预警', 'S7', 'FOLLOW', 240,
  37. 'ROLE_WH_OUTBOUND', 'ROLE_WH_OUTBOUND', 'ALL', 'FINAL_ASSEMBLY_DELIVERY', 1, NULL,
  38. 1, 713, '[S8-ORDER-FLOW-KPI-OVERTIME-SEED-1] 总装发货阶段 KPI 超期预警;ORDER_FLOW 派生事件使用。',
  39. 1329908100104, 0, '2026-05-14 00:00:00', NULL)
  40. ON DUPLICATE KEY UPDATE
  41. type_name = VALUES(type_name),
  42. scene_code = VALUES(scene_code),
  43. severity_default = VALUES(severity_default),
  44. sla_minutes = VALUES(sla_minutes),
  45. owner_role_code = VALUES(owner_role_code),
  46. escalate_role_code = VALUES(escalate_role_code),
  47. stats_mode = VALUES(stats_mode),
  48. monitoring_category_key = VALUES(monitoring_category_key),
  49. mobile_visible = VALUES(mobile_visible),
  50. enabled = VALUES(enabled),
  51. sort_no = VALUES(sort_no),
  52. remark = VALUES(remark),
  53. parent_id = VALUES(parent_id),
  54. is_group = VALUES(is_group),
  55. updated_at = NOW();
  56. -- =====================================================================
  57. -- B) 16 条 ado_s8_exception 派生 upsert
  58. -- =====================================================================
  59. -- 数据来源:ado_s8_order_flow_stage(status IN 'yellow'/'red')+ ado_s8_order_flow_order JOIN
  60. -- 幂等键:(tenant_id=1, factory_id=1, exception_code='EX-DRV-{order_code}-{flow_short}')
  61. INSERT INTO ado_s8_exception
  62. (tenant_id, factory_id, exception_code, title, description,
  63. scene_code, source_type, status, severity, priority_score, priority_level,
  64. occurrence_dept_id, responsible_dept_id, responsible_group_id, assignee_id, reporter_id,
  65. sla_deadline, timeout_flag, created_at, is_deleted, created_by,
  66. process_node_code, related_object_code, module_code,
  67. active_flow_instance_id, active_flow_biz_type,
  68. exception_type_code, source_data_source_id, source_rule_id, source_payload,
  69. dedup_key, last_detected_at, source_rule_code, source_object_type, source_object_id,
  70. consecutive_hit_count, consecutive_miss_count,
  71. stage_code, order_flow_code, rule_mechanism)
  72. SELECT
  73. 1 AS tenant_id,
  74. 1 AS factory_id,
  75. CONCAT('EX-DRV-', s.order_code, '-',
  76. CASE s.order_flow_code
  77. WHEN 'ORDER_REVIEW_PLAN_CALC' THEN 'OR'
  78. WHEN 'PRODUCT_DESIGN' THEN 'PD'
  79. WHEN 'MATERIAL_PURCHASE' THEN 'MP'
  80. WHEN 'BODY_PRODUCTION' THEN 'BP'
  81. WHEN 'FINAL_ASSEMBLY_DELIVERY' THEN 'FA'
  82. END) AS exception_code,
  83. CASE
  84. WHEN s.order_code = 'SO-2026-001' AND s.order_flow_code = 'MATERIAL_PURCHASE'
  85. THEN '订单 SO-2026-001 材料采购阶段累计偏差关注(节点本身未超 KPI)'
  86. ELSE CONCAT('订单 ', s.order_code, ' ',
  87. CASE s.order_flow_code
  88. WHEN 'ORDER_REVIEW_PLAN_CALC' THEN '评审/排产/测算'
  89. WHEN 'PRODUCT_DESIGN' THEN '产品设计'
  90. WHEN 'MATERIAL_PURCHASE' THEN '材料采购'
  91. WHEN 'BODY_PRODUCTION' THEN '本体生产'
  92. WHEN 'FINAL_ASSEMBLY_DELIVERY' THEN '总装发货'
  93. END,
  94. ' 超 KPI ', CAST(s.node_variance_days AS CHAR), ' 天')
  95. END AS title,
  96. NULL AS description,
  97. CASE s.order_flow_code
  98. WHEN 'ORDER_REVIEW_PLAN_CALC' THEN 'S1'
  99. WHEN 'PRODUCT_DESIGN' THEN 'S1'
  100. WHEN 'MATERIAL_PURCHASE' THEN 'S4'
  101. WHEN 'BODY_PRODUCTION' THEN 'S6'
  102. WHEN 'FINAL_ASSEMBLY_DELIVERY' THEN 'S7'
  103. END AS scene_code,
  104. 'AUTO_WATCH' AS source_type,
  105. 'NEW' AS status,
  106. CASE s.status WHEN 'red' THEN 'SERIOUS' WHEN 'yellow' THEN 'FOLLOW' END
  107. AS severity,
  108. 0 AS priority_score,
  109. 'P3' AS priority_level,
  110. CASE WHEN s.order_flow_code IN ('BODY_PRODUCTION','FINAL_ASSEMBLY_DELIVERY')
  111. THEN 2 ELSE 10 END AS occurrence_dept_id,
  112. CASE WHEN s.order_flow_code IN ('BODY_PRODUCTION','FINAL_ASSEMBLY_DELIVERY')
  113. THEN 2 ELSE 10 END AS responsible_dept_id,
  114. NULL AS responsible_group_id,
  115. NULL AS assignee_id,
  116. NULL AS reporter_id,
  117. DATE_ADD(LEAST(COALESCE(s.actual_end_at, s.target_at, NOW()), NOW()),
  118. INTERVAL et.sla_minutes MINUTE) AS sla_deadline,
  119. 0 AS timeout_flag,
  120. LEAST(COALESCE(s.actual_end_at, s.target_at, NOW()), NOW())
  121. AS created_at,
  122. 0 AS is_deleted,
  123. 'system:order_flow_kpi_derive' AS created_by,
  124. NULL AS process_node_code,
  125. s.order_code AS related_object_code,
  126. CASE s.order_flow_code
  127. WHEN 'ORDER_REVIEW_PLAN_CALC' THEN 'S1'
  128. WHEN 'PRODUCT_DESIGN' THEN 'S1'
  129. WHEN 'MATERIAL_PURCHASE' THEN 'S4'
  130. WHEN 'BODY_PRODUCTION' THEN 'S6'
  131. WHEN 'FINAL_ASSEMBLY_DELIVERY' THEN 'S7'
  132. END AS module_code,
  133. NULL AS active_flow_instance_id,
  134. NULL AS active_flow_biz_type,
  135. et.type_code AS exception_type_code,
  136. NULL AS source_data_source_id,
  137. NULL AS source_rule_id,
  138. JSON_OBJECT(
  139. 'source', 'ORDER_FLOW_KPI_OVERTIME_DERIVED',
  140. 'orderCode', s.order_code,
  141. 'orderId', o.id,
  142. 'orderFlowCode', s.order_flow_code,
  143. 'status', s.status,
  144. 'plannedDays', s.planned_days,
  145. 'actualDays', s.actual_days,
  146. 'nodeVarianceDays', s.node_variance_days,
  147. 'cumulativeVarianceDays', s.cumulative_variance_days,
  148. 'targetAt', DATE_FORMAT(s.target_at, '%Y-%m-%d %H:%i:%s'),
  149. 'actualEndAt', DATE_FORMAT(s.actual_end_at, '%Y-%m-%d %H:%i:%s')
  150. ) AS source_payload,
  151. CONCAT('ORDER_FLOW_KPI_OVERTIME:', s.order_code, ':', s.order_flow_code)
  152. AS dedup_key,
  153. LEAST(COALESCE(s.actual_end_at, s.target_at, NOW()), NOW())
  154. AS last_detected_at,
  155. 'ORDER_FLOW_KPI_OVERTIME_DERIVED' AS source_rule_code,
  156. 'SALES_ORDER' AS source_object_type,
  157. CAST(o.id AS CHAR) AS source_object_id,
  158. 1 AS consecutive_hit_count,
  159. 0 AS consecutive_miss_count,
  160. CASE s.order_flow_code
  161. WHEN 'ORDER_REVIEW_PLAN_CALC' THEN 'S1'
  162. WHEN 'PRODUCT_DESIGN' THEN 'S1'
  163. WHEN 'MATERIAL_PURCHASE' THEN 'S4'
  164. WHEN 'BODY_PRODUCTION' THEN 'S6'
  165. WHEN 'FINAL_ASSEMBLY_DELIVERY' THEN 'S7'
  166. END AS stage_code,
  167. s.order_flow_code AS order_flow_code,
  168. 'DATE' AS rule_mechanism
  169. FROM ado_s8_order_flow_stage s
  170. JOIN ado_s8_order_flow_order o
  171. ON o.id = s.order_id
  172. AND o.is_deleted = 0
  173. AND o.tenant_id = 1
  174. AND o.factory_id = 1
  175. JOIN ado_s8_exception_type et
  176. ON et.tenant_id = 0
  177. AND et.factory_id = 0
  178. AND et.is_group = 0
  179. AND et.enabled = 1
  180. AND et.type_code =
  181. CASE s.order_flow_code
  182. WHEN 'ORDER_REVIEW_PLAN_CALC' THEN 'ORDER_DUE_DATE_DELAY'
  183. WHEN 'PRODUCT_DESIGN' THEN 'PRODUCT_DESIGN_DELAY'
  184. WHEN 'MATERIAL_PURCHASE' THEN 'PURCHASE_EXECUTION_DELAY'
  185. WHEN 'BODY_PRODUCTION' THEN 'BODY_PRODUCTION_DELAY_WARNING'
  186. WHEN 'FINAL_ASSEMBLY_DELIVERY' THEN 'DELIVERY_DELAY_WARNING'
  187. END
  188. WHERE s.is_deleted = 0
  189. AND s.tenant_id = 1
  190. AND s.factory_id = 1
  191. AND s.status IN ('yellow','red')
  192. ON DUPLICATE KEY UPDATE
  193. title = VALUES(title),
  194. scene_code = VALUES(scene_code),
  195. module_code = VALUES(module_code),
  196. stage_code = VALUES(stage_code),
  197. order_flow_code = VALUES(order_flow_code),
  198. exception_type_code = VALUES(exception_type_code),
  199. severity = VALUES(severity),
  200. source_payload = VALUES(source_payload),
  201. last_detected_at = VALUES(last_detected_at),
  202. source_rule_code = VALUES(source_rule_code),
  203. source_object_type = VALUES(source_object_type),
  204. source_object_id = VALUES(source_object_id),
  205. related_object_code = VALUES(related_object_code),
  206. dedup_key = VALUES(dedup_key),
  207. rule_mechanism = VALUES(rule_mechanism),
  208. updated_at = NOW();
  209. -- =====================================================================
  210. -- C) 16 条 ado_s8_exception_timeline 派生(NOT EXISTS 防重)
  211. -- =====================================================================
  212. -- timeline 表无唯一键,不能使用 ON DUPLICATE KEY UPDATE;使用 NOT EXISTS 子查询防重。
  213. -- 关联键:exception_id(每个 source_rule_code='ORDER_FLOW_KPI_OVERTIME_DERIVED' 的 exception 同步 1 条 CREATE)
  214. INSERT INTO ado_s8_exception_timeline
  215. (exception_id, action_code, action_label, from_status, to_status,
  216. operator_id, operator_name, action_remark, created_at)
  217. SELECT
  218. e.id,
  219. 'CREATE',
  220. '派生',
  221. NULL,
  222. 'NEW',
  223. NULL,
  224. 'system',
  225. 'ORDER_FLOW KPI 超期派生',
  226. e.created_at
  227. FROM ado_s8_exception e
  228. WHERE e.tenant_id = 1
  229. AND e.factory_id = 1
  230. AND e.is_deleted = 0
  231. AND e.source_rule_code = 'ORDER_FLOW_KPI_OVERTIME_DERIVED'
  232. AND NOT EXISTS (
  233. SELECT 1
  234. FROM ado_s8_exception_timeline t
  235. WHERE t.exception_id = e.id
  236. AND t.action_code = 'CREATE'
  237. AND t.action_remark = 'ORDER_FLOW KPI 超期派生'
  238. );
  239. -- =====================================================================
  240. -- 验收预期(阶段 4 跑此 SQL 后核对)
  241. -- =====================================================================
  242. -- 1) ado_s8_exception_type 新增 3 条(如已存在则 ON DUPLICATE 刷新 updated_at)
  243. -- 2) ado_s8_exception 新增 16 条(red 6 + yellow 10,含 SO-2026-001 MATERIAL_PURCHASE 累计偏差边界项)
  244. -- 3) ado_s8_exception_timeline 新增 16 条 CREATE 行
  245. -- 4) 重跑此 SQL:A 段 ON DUPLICATE 0 row changed;B 段 ON DUPLICATE 0 row changed;C 段 NOT EXISTS 0 row affected