-- =============================================================================
-- S8-EXCEPTION-FLOW-TENANT-CONTEXT-1
-- 目的：为 S8 跨 S1-S7 场景共用的 EXCEPTION_REPORT/TB001「异常提报」节点建立真正
--       跨模块通用的异常受理角色，替换此前误绑的 S1 专属角色 ROLE_S1_EXCEPTION_HANDLER
--       （该角色系 1.0.193.sql 为「S1 产销协同/订单交付异常」创建，见 S8 Flow Role 审计：
--       EXCEPTION_REPORT 流程在该迁移发生前已跨 S1-S7 场景共用，绑定 S1 专属角色属误配）。
-- 范围：本批只保证 UAT 租户（838257186181189）闭环。其余流程克隆
--       （默认租户全局 TB001 / UATB-TB001 / DEMO-TB001）保持原状，不在本批处理——
--       这些租户尚无对应的 ROLE_S8_EXCEPTION_HANDLER 成员，盲目改绑只会把失败模式
--       从「角色查不到人」平移成「角色本身不存在」，不构成修复。
-- 安全：全幂等（NOT EXISTS 守卫 + FlowJson 唯一子串 REPLACE）；
--       不删除 ROLE_S1_EXCEPTION_HANDLER / s1_exception_handler；不动其他 3 份流程克隆的 FlowJson；
--       不动历史 ApprovalFlowInstance / ApprovalFlowTask（StartFlow 用 FlowJsonSnapshot，
--       改定义只影响之后新发起的实例）。
-- 权限边界：新角色仅作 Flow Engine 审批身份，不插入任何 SysRoleMenu 行，不携带菜单/按钮/API 权限。
-- =============================================================================

-- 1) 新建角色 ROLE_S8_EXCEPTION_HANDLER / S8异常处理员（UAT 租户，幂等）
INSERT INTO SysRole (Id, Name, Code, OrderNo, DataScope, Remark, Status, TenantId, CreateTime)
SELECT 1329908000160, 'S8异常处理员', 'ROLE_S8_EXCEPTION_HANDLER', 800, 4,
       'S8 跨 S1-S7 场景通用异常受理角色（S8-EXCEPTION-FLOW-TENANT-CONTEXT-1）；仅 Flow Engine 审批身份，不挂载菜单权限',
       1, 838257186181189, NOW()
FROM DUAL
WHERE NOT EXISTS (
  SELECT 1 FROM SysRole
  WHERE Id = 1329908000160 OR (Code = 'ROLE_S8_EXCEPTION_HANDLER' AND TenantId = 838257186181189)
);

-- 2) 绑定 UATExceptionA(838259724726341) → ROLE_S8_EXCEPTION_HANDLER（幂等）
INSERT INTO SysUserRole (Id, UserId, RoleId)
SELECT 1329908000161, 838259724726341, 1329908000160
FROM DUAL
WHERE NOT EXISTS (
  SELECT 1 FROM SysUserRole WHERE UserId = 838259724726341 AND RoleId = 1329908000160
);

-- 3) UAT 专属流程克隆 UATA-TB001（Id=9206082610000001）的「异常提报」节点改绑：
--    approverIds 从默认租户物理 RoleId「1329908000150」（S1专属）
--    改为角色 Code「ROLE_S8_EXCEPTION_HANDLER」（由 FlowEngineService.ResolveApprovers
--    按受信任租户 838257186181189 解析到本租户物理角色 → 本租户成员，不再跨租户借用）；
--    approverNames 展示标签同步更新。仅此一个流程行，不动 global TB001 / UATB-TB001 / DEMO-TB001。
--    唯一子串 REPLACE：第二次执行时原串已不存在 → 自然 no-op（幂等）。
UPDATE ApprovalFlow
SET FlowJson = REPLACE(
      REPLACE(FlowJson, '"approverIds":"1329908000150"', '"approverIds":"ROLE_S8_EXCEPTION_HANDLER"'),
      '"approverNames":"S1异常处理员"', '"approverNames":"S8异常处理员"')
WHERE Id = 9206082610000001 AND Code = 'UATA-TB001' AND BizType = 'EXCEPTION_REPORT';
