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