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