-- ============================================================================
-- Migration 012: TWork 任务执行层增强
-- 对齐: TWork任务执行层PRD V1.0 (TW-EXEC-PRD-001) 12项能力
-- 数据库: MySQL 8.0+ / 字符集: utf8mb4
-- 幂等: ADD COLUMN IF NOT EXISTS / CREATE TABLE IF NOT EXISTS
--
-- 改动:
--   1. tw_task 补 5 列（下一处理人 / SLA增强 / 快速通道）
--   2. tw_task_log 补 1 列（操作详情 JSON）
--   3. tw_task_step_instance 补 5 列（预填状态 / 变更检测）
--   4. 新建 tw_task_kcp_result（KCP 检查执行结果）
--   5. 新建 tw_task_draft（TWork 本地草稿）
-- ============================================================================

-- ============================================================================
-- 1. tw_task 补列
-- ============================================================================

ALTER TABLE tw_task
  -- ⑤ 下一处理人：提交时写入，用于任务卡片展示和路由判定
  ADD COLUMN IF NOT EXISTS next_assignee_id   VARCHAR(32)  NULL
    COMMENT '下一处理人ID（提交时写入）' AFTER callback_url,
  ADD COLUMN IF NOT EXISTS next_assignee_type VARCHAR(20)  NULL
    COMMENT '下一处理人类型 user/role/dept' AFTER next_assignee_id,

  -- ⑧ SLA 增强：挂起/续办时保存剩余时间
  ADD COLUMN IF NOT EXISTS sla_paused_at      DATETIME     NULL
    COMMENT 'SLA暂停时间（resume后清空）' AFTER suspended_at,
  ADD COLUMN IF NOT EXISTS sla_remaining_ms   BIGINT       NULL
    COMMENT 'SLA暂停时剩余毫秒（resume时恢复计算）' AFTER sla_paused_at,

  -- ② 快速通道标记
  ADD COLUMN IF NOT EXISTS fast_track         TINYINT      NOT NULL DEFAULT 0
    COMMENT '是否快速通道：0=否 1=是' AFTER sla_remaining_ms;

CREATE INDEX IF NOT EXISTS idx_next_assignee ON tw_task (next_assignee_id, status);
CREATE INDEX IF NOT EXISTS idx_fast_track ON tw_task (fast_track, status);

-- ============================================================================
-- 2. tw_task_log 补列
-- ============================================================================

ALTER TABLE tw_task_log
  -- ⑫ 操作详情：存储退回原因/KCP结果/步骤数据等结构化信息
  ADD COLUMN IF NOT EXISTS detail JSON NULL
    COMMENT '操作详情JSON（退回原因/KCP结果/步骤数据等）' AFTER remark;

-- ============================================================================
-- 3. tw_task_step_instance 补列
-- ============================================================================

ALTER TABLE tw_task_step_instance
  -- ② Agent 预填状态跟踪
  ADD COLUMN IF NOT EXISTS prefill_state      VARCHAR(20)  NULL DEFAULT 'idle'
    COMMENT '预填状态: idle/prefilling/completed/failed' AFTER step_type,
  ADD COLUMN IF NOT EXISTS prefill_progress   TINYINT      NULL DEFAULT 0
    COMMENT '预填进度 0-100' AFTER prefill_state,
  ADD COLUMN IF NOT EXISTS prefill_retry      TINYINT      NOT NULL DEFAULT 0
    COMMENT '预填重试次数（最大3次）' AFTER prefill_progress,

  -- ⑪ 变更检测：agentFilled vs humanModified 字段集合
  ADD COLUMN IF NOT EXISTS agent_filled       JSON         NULL
    COMMENT 'Agent预填字段名集合 ["field_a","field_b"]' AFTER output_snapshot,
  ADD COLUMN IF NOT EXISTS human_modified     JSON         NULL
    COMMENT '人工修改字段名集合 ["field_c"]' AFTER agent_filled;

CREATE INDEX IF NOT EXISTS idx_prefill_state ON tw_task_step_instance (task_id, prefill_state);

-- ============================================================================
-- 4. 新建 tw_task_kcp_result — KCP 质控检查执行结果
-- ============================================================================

CREATE TABLE IF NOT EXISTS tw_task_kcp_result (
  result_id       VARCHAR(32)  NOT NULL COMMENT 'KCP结果ID',
  task_id         VARCHAR(32)  NOT NULL COMMENT '任务ID',
  step_key        VARCHAR(64)  NOT NULL COMMENT '触发KCP的步骤键',
  check_field     VARCHAR(64)  NOT NULL COMMENT '检查字段名',
  check_expr      VARCHAR(500)          COMMENT '检查表达式（冗余，便于审计）',
  check_message   VARCHAR(200)          COMMENT '检查提示消息',
  severity        VARCHAR(20)  NOT NULL DEFAULT 'error'
    COMMENT '严重级别: error=阻断/warning=警告',
  passed          TINYINT      NOT NULL DEFAULT 0
    COMMENT '是否通过: 0=不通过 1=通过',
  actual_value    VARCHAR(500)          COMMENT '实际值（便于排查）',
  checked_at      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP
    COMMENT '检查时间',
  operator_id     VARCHAR(32)           COMMENT '触发检查的操作人',
  PRIMARY KEY (result_id),
  INDEX idx_task_step (task_id, step_key, checked_at DESC),
  INDEX idx_severity (severity, passed)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='KCP质控检查执行结果';

-- ============================================================================
-- 5. 新建 tw_task_draft — TWork 本地草稿
-- ============================================================================

CREATE TABLE IF NOT EXISTS tw_task_draft (
  draft_id        VARCHAR(32)  NOT NULL COMMENT '草稿ID',
  task_id         VARCHAR(32)  NOT NULL COMMENT '任务ID',
  step_key        VARCHAR(64)  NOT NULL COMMENT '当前步骤键',
  step_index      INT                   COMMENT '当前步骤序号（0-based）',
  form_data       JSON         NOT NULL COMMENT '表单数据快照',
  agent_filled    JSON                  COMMENT 'Agent预填字段集合',
  human_modified  JSON                  COMMENT '人工修改字段集合',
  step_states     JSON                  COMMENT '各步骤状态快照 [{step_key, status}]',
  saved_by        VARCHAR(32)  NOT NULL COMMENT '保存人ID',
  saved_at        DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP
    COMMENT '保存时间',
  is_active       TINYINT      NOT NULL DEFAULT 1
    COMMENT '是否有效: 0=已清除 1=有效',
  restore_count   INT          NOT NULL DEFAULT 0
    COMMENT '恢复次数',
  PRIMARY KEY (draft_id),
  UNIQUE INDEX uk_task_active (task_id, is_active),
  INDEX idx_saved_by (saved_by, saved_at DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='TWork任务草稿（本地暂存）';
