Эх сурвалжийг харах

fix(s8): persist exception type tree seed migration

YY968XX 1 сар өмнө
parent
commit
6164fee996

+ 3 - 0
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -46,6 +46,9 @@
     <None Update="UpdateScripts\1.0.0.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.105.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 80 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.105.sql

@@ -0,0 +1,80 @@
+-- 1.0.105.sql
+-- TASK-015-TREE-SEED-PERSIST-1:固化异常类型 2 层树形结构的初始数据。
+-- 解决问题:Database.json 中 EnableIncreSeed=false 关闭了 SeedData 自动入库;
+--           本脚本以幂等方式把 5 个 PARENT_* 父节点 + 子节点 parent_id 回填落地到 DB,
+--           确保新环境拉代码启动后 tree API 也能返回 roots=5。
+-- 执行入口:AutoVersionUpdate.UseAutoVersionUpdate(),在 csproj Version=1.0.105 主节点首次启动时触发。
+-- 幂等性:列已存在不报错;父节点已存在则 UPDATE 关键字段;子节点 parent_id 已正确挂载则不动。
+-- 安全边界:不改 type_code;不动 enabled;不新增 PARENT_UNCLASSIFIED;不影响 deprecated/无 monitoring_category_key 的"未归类"行。
+-- 2026-05-14
+
+-- 1) 加列兜底:用 INFORMATION_SCHEMA 检查 + 动态 SQL,避免 MySQL 不支持 ADD COLUMN IF NOT EXISTS。
+SELECT COUNT(*) INTO @col_parent_id_exists
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME = 'ado_s8_exception_type'
+  AND COLUMN_NAME = 'parent_id';
+SET @sql_add_parent_id := IF(@col_parent_id_exists = 0,
+    'ALTER TABLE ado_s8_exception_type ADD COLUMN parent_id BIGINT NULL',
+    'DO 0');
+PREPARE stmt_add_parent_id FROM @sql_add_parent_id;
+EXECUTE stmt_add_parent_id;
+DEALLOCATE PREPARE stmt_add_parent_id;
+
+SELECT COUNT(*) INTO @col_is_group_exists
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME = 'ado_s8_exception_type'
+  AND COLUMN_NAME = 'is_group';
+SET @sql_add_is_group := IF(@col_is_group_exists = 0,
+    'ALTER TABLE ado_s8_exception_type ADD COLUMN is_group TINYINT(1) NOT NULL DEFAULT 0',
+    'DO 0');
+PREPARE stmt_add_is_group FROM @sql_add_is_group;
+EXECUTE stmt_add_is_group;
+DEALLOCATE PREPARE stmt_add_is_group;
+
+-- 2) 5 个分组父节点 idempotent upsert(字段值与 S8ExceptionTypeSeedData.P() 工厂一致)
+INSERT INTO ado_s8_exception_type
+  (id, tenant_id, factory_id, type_code, type_name, scene_code, severity_default, sla_minutes,
+   owner_role_code, escalate_role_code, stats_mode, monitoring_category_key, mobile_visible, icon,
+   enabled, sort_no, remark, parent_id, is_group, created_at, updated_at)
+VALUES
+  (1329908100100, 0, 0, 'PARENT_ORDER_REVIEW',            '订单评审', 'ALL', 'FOLLOW', 0, NULL, NULL, 'ALL', 'ORDER_REVIEW',            0, NULL, 1, 10, '[TASK-015-TREE-DEV-1] 分组父节点;仅作为树形容器,不可作为业务异常类型。', NULL, 1, '2026-04-18 00:00:00', NULL),
+  (1329908100101, 0, 0, 'PARENT_PRODUCT_DESIGN',          '产品设计', 'ALL', 'FOLLOW', 0, NULL, NULL, 'ALL', 'PRODUCT_DESIGN',          0, NULL, 1, 20, '[TASK-015-TREE-DEV-1] 分组父节点;仅作为树形容器,不可作为业务异常类型。', NULL, 1, '2026-04-18 00:00:00', NULL),
+  (1329908100102, 0, 0, 'PARENT_MATERIAL_PURCHASE',       '材料采购', 'ALL', 'FOLLOW', 0, NULL, NULL, 'ALL', 'MATERIAL_PURCHASE',       0, NULL, 1, 30, '[TASK-015-TREE-DEV-1] 分组父节点;仅作为树形容器,不可作为业务异常类型。', NULL, 1, '2026-04-18 00:00:00', NULL),
+  (1329908100103, 0, 0, 'PARENT_BODY_PRODUCTION',         '本体生产', 'ALL', 'FOLLOW', 0, NULL, NULL, 'ALL', 'BODY_PRODUCTION',         0, NULL, 1, 40, '[TASK-015-TREE-DEV-1] 分组父节点;仅作为树形容器,不可作为业务异常类型。', NULL, 1, '2026-04-18 00:00:00', NULL),
+  (1329908100104, 0, 0, 'PARENT_FINAL_ASSEMBLY_DELIVERY', '总装发货', 'ALL', 'FOLLOW', 0, NULL, NULL, 'ALL', 'FINAL_ASSEMBLY_DELIVERY', 0, NULL, 1, 50, '[TASK-015-TREE-DEV-1] 分组父节点;仅作为树形容器,不可作为业务异常类型。', NULL, 1, '2026-04-18 00:00:00', NULL)
+ON DUPLICATE KEY UPDATE
+  type_name = VALUES(type_name),
+  scene_code = VALUES(scene_code),
+  monitoring_category_key = VALUES(monitoring_category_key),
+  is_group = VALUES(is_group),
+  parent_id = VALUES(parent_id),
+  enabled = VALUES(enabled),
+  sort_no = VALUES(sort_no),
+  remark = VALUES(remark),
+  severity_default = VALUES(severity_default),
+  sla_minutes = VALUES(sla_minutes),
+  stats_mode = VALUES(stats_mode),
+  mobile_visible = VALUES(mobile_visible);
+
+-- 3) 子节点 parent_id 幂等回填:按 monitoring_category_key 挂到对应父节点;
+--    仅在 child.parent_id IS NULL 时更新,已正确挂载的行不动;
+--    不处理 monitoring_category_key IS NULL 的 deprecated 节点(前端虚拟未归类根承载)。
+UPDATE ado_s8_exception_type child
+JOIN ado_s8_exception_type parent
+  ON parent.is_group = 1
+ AND parent.monitoring_category_key = child.monitoring_category_key
+ AND parent.tenant_id = child.tenant_id
+ AND parent.factory_id = child.factory_id
+SET child.parent_id = parent.id,
+    child.updated_at = NOW()
+WHERE child.is_group = 0
+  AND child.parent_id IS NULL
+  AND child.monitoring_category_key IN (
+    'ORDER_REVIEW',
+    'PRODUCT_DESIGN',
+    'MATERIAL_PURCHASE',
+    'BODY_PRODUCTION',
+    'FINAL_ASSEMBLY_DELIVERY'
+  );