-- S8-STANDARD-DATASET-HARD-CUTOVER-1 · 步骤 2：删除 Legacy 取数体系的全部残留。
--
-- 最终架构（唯一路径）：
--   Data Platform → Governed Dataset → S8 Provider → Canonical Contract
--                 → Watch Rule → Evaluator → Detection → Exception
-- S8 不维护物理数据源、不执行任意 SQL、不保留 Legacy Rule。
--
-- 本脚本是**破坏性**的，按依赖顺序执行。执行前的实测基线（2026-09-05）：
--   ado_s8_watch_rule    : 134 行 = Legacy 132（data_access_mode IS NULL）+ Standard 2
--   Legacy 中 enabled=1  : 1 行（id=86 RULE_S1_ORDER_DELIVERY_DUE_GRAY30_DATE_DELAY）
--   ado_s8_data_source   : 3 行（无 FK / 无触发器 / 无视图 / 除 PRIMARY 无索引）
--   Legacy 规则的运行产物: detection_log 327 行、exception 34 行
--                          （34 条中 32 条状态 NEW 从未被认领，2 条为 UAT 测试单；
--                            40 条 timeline ≈ 每单 1.2 条，即仅创建事件，无真实处理链）
--
-- ⚠️ 判定 Legacy 用「非 STANDARD_DATASET」补集写法，且必须显式写 IS NULL：
--    `data_access_mode <> 'STANDARD_DATASET'` 对 NULL 求值为 UNKNOWN，
--    会漏掉全部 132 条历史行。这是本脚本最容易写错的一处。
--    补集写法同时覆盖脏值（如 'SQL'），与代码侧「非 STANDARD 即无运行资格」对齐。
--
-- ⚠️⚠️ rule_code 跨租户重名，且 Rule 01 正在其中：
--    RULE_S4_PURCHASE_DELIVERY_DATE_DELAY 同时存在于
--      id=46（租户 797403760988230，Legacy）
--      id=144（租户 838257237606469，Legacy）
--      id=1329909460023（租户 838257186181189，STANDARD_DATASET ← Rule 01，必须保留）
--    而 ado_s8_rule_detection_state **只有 rule_code、没有 rule_id**。
--    因此凡按 rule_code 定位的删除，一律附加 (tenant_id, factory_id) 限定，
--    绝不允许出现裸 `WHERE rule_code = ...`。
--
-- 保留：Rule 01（1329909460023）与诊断规则（1329909460024），
--       两者均为 STANDARD_DATASET / PURCHASE_DELIVERY / enabled=0，本脚本不触碰。
--
-- 幂等：DELETE 带条件、DROP 带 IF EXISTS、ALTER 前查 information_schema。
--       重复执行影响行数为 0。

-- ────────────────────────────────────────────────────────────────────────────
-- 0. 固定 Legacy 规则 id 集合（后续步骤全部引用它，避免各步判定漂移）
-- ────────────────────────────────────────────────────────────────────────────
DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_rule;
CREATE TEMPORARY TABLE tmp_s8_legacy_rule AS
SELECT id, tenant_id, factory_id, rule_code
  FROM ado_s8_watch_rule
 WHERE data_access_mode IS NULL
    OR TRIM(data_access_mode) = ''
    OR UPPER(TRIM(data_access_mode)) <> 'STANDARD_DATASET';

-- ────────────────────────────────────────────────────────────────────────────
-- 1. Legacy 规则产生的异常单及其子表
--    无 FK，必须手工按父子顺序删；子表一律经 exception_id 关联。
-- ────────────────────────────────────────────────────────────────────────────
DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_exception;
CREATE TEMPORARY TABLE tmp_s8_legacy_exception AS
SELECT e.id FROM ado_s8_exception e
  JOIN tmp_s8_legacy_rule r ON r.id = e.source_rule_id;

DELETE t FROM ado_s8_exception_timeline t JOIN tmp_s8_legacy_exception x ON x.id = t.exception_id;
DELETE d FROM ado_s8_decision_record   d JOIN tmp_s8_legacy_exception x ON x.id = d.exception_id;
DELETE v FROM ado_s8_evidence          v JOIN tmp_s8_legacy_exception x ON x.id = v.exception_id;
DELETE n FROM ado_s8_notification_log  n JOIN tmp_s8_legacy_exception x ON x.id = n.exception_id;
DELETE e FROM ado_s8_exception         e JOIN tmp_s8_legacy_exception x ON x.id = e.id;

-- ────────────────────────────────────────────────────────────────────────────
-- 2. Legacy 规则的检测轨迹与抗抖状态
--    detection_log 有 rule_id，可精确关联；
--    rule_detection_state 只有 rule_code，故必须三键（tenant + factory + code）限定 ——
--    否则会连带删掉 Rule 01 的抗抖状态（见文件头的重名说明）。
-- ────────────────────────────────────────────────────────────────────────────
DELETE d FROM ado_s8_detection_log d JOIN tmp_s8_legacy_rule r ON r.id = d.rule_id;

DELETE s FROM ado_s8_rule_detection_state s
  JOIN tmp_s8_legacy_rule r
    ON r.tenant_id = s.tenant_id
   AND r.factory_id = s.factory_id
   AND r.rule_code = s.rule_code;

-- ────────────────────────────────────────────────────────────────────────────
-- 3. Legacy 规则本体
-- ────────────────────────────────────────────────────────────────────────────
DELETE w FROM ado_s8_watch_rule w JOIN tmp_s8_legacy_rule r ON r.id = w.id;

DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_exception;
DROP TEMPORARY TABLE IF EXISTS tmp_s8_legacy_rule;

-- ────────────────────────────────────────────────────────────────────────────
-- 4. 规则表的 Legacy 列
--    必须在第 3 步之后：data_access_mode 正是第 0 步的判定依据。
--    用 information_schema 预检使脚本可重复执行（MySQL 的 DROP COLUMN 无 IF EXISTS）。
-- ────────────────────────────────────────────────────────────────────────────
SET @sql := (
  SELECT IF(COUNT(*) > 0, 'ALTER TABLE ado_s8_watch_rule DROP COLUMN data_source_id', 'DO 0')
    FROM information_schema.COLUMNS
   WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s8_watch_rule' AND COLUMN_NAME = 'data_source_id');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @sql := (
  SELECT IF(COUNT(*) > 0, 'ALTER TABLE ado_s8_watch_rule DROP COLUMN expression', 'DO 0')
    FROM information_schema.COLUMNS
   WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s8_watch_rule' AND COLUMN_NAME = 'expression');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @sql := (
  SELECT IF(COUNT(*) > 0, 'ALTER TABLE ado_s8_watch_rule DROP COLUMN data_access_mode', 'DO 0')
    FROM information_schema.COLUMNS
   WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s8_watch_rule' AND COLUMN_NAME = 'data_access_mode');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ────────────────────────────────────────────────────────────────────────────
-- 5. 数据源整表
--    该表 endpoint 列存的是含凭据的真实连接串；S8 已不再维护物理连接，直接删除。
-- ────────────────────────────────────────────────────────────────────────────
DROP TABLE IF EXISTS ado_s8_data_source;

-- ────────────────────────────────────────────────────────────────────────────
-- 6. 菜单与授权
--    先清 SysRoleMenu 授权行，再删菜单，避免留下悬挂授权。
--    「维护数据源」按钮权限点（s8:config:data-source）一并清除；
--    目录侧保留一条 Deprecated 墓碑，防止该码被复用。
-- ────────────────────────────────────────────────────────────────────────────
DELETE rm FROM SysRoleMenu rm
  JOIN SysMenu m ON m.Id = rm.MenuId
 WHERE m.Name = 'aidopS8DataSourceConfig'
    OR m.Permission = 's8:config:data-source';

DELETE FROM SysMenu
 WHERE Name = 'aidopS8DataSourceConfig'
    OR Permission = 's8:config:data-source';
