-- ai_op_queue：AI 写操作队列（rearch3 §3：**AI 侧唯一的写入口**）。
-- 用户在预览卡/表单上点按钮（保存/审核/作废/…）→ xlyAi 校验后落一行 pending+100。
-- xlyAi 工作到此为止：执行/审计由 ERP 侧负责（暂存执行器 /ai/execStaging 读本表；
-- 现状=报价自动执行、其余进待办）。覆盖 update / create / delete / examine / invalid（sOpType 区分）。
--
-- 状态协议（2026-07-29 定）= sStatus 三态 + iStatusCode 状态码：
--   pending：100=已提交等待 ERP 处理（xlyAi 写入的唯一状态）｜101=ERP 处理中（已领取，防并发重复执行）
--   success：200=执行成功｜201=幂等命中（此前已执行，本次返回既有结果）
--   fail   ：400=载荷/参数非法｜401=身份/权限不足｜404=目标记录不存在｜409=状态冲突（重复审核/
--            重复作废/未审核销审/记录被他人改过）｜422=业务校验未通过｜423=记录被锁定(SysLocking)｜
--            450=已取消（ERP 端取消待办）｜500=执行异常｜504=执行超时
--   pending 由 xlyAi 写入（100）与 ERP 领取时更新（101）；success/fail 只由 ERP 回写。
--   旧值 draft/confirmed/executing/executed/failed/cancelled 已废弃（xlyAi 兼容读，不再写）。
--   update：sTargetBillId + sField/sNewValue（单字段；一次保存多字段 = 多行）。
--   invalid：sNewValue 存 handleType（toVoid=作废 / cancel=复原）；examine：sNewValue 存 iFlag（1/0）。
--   create：整表 payload 存 sPayload（列->值 JSON，多表用 __tables__）。
-- 列名兼容：ERP 执行器仍读 sUserId → sMakePerson（ERP 惯例）双写，ERP 侧切换后可删 sUserId。
CREATE TABLE IF NOT EXISTS ai_op_queue (
  sId             varchar(64)   NOT NULL PRIMARY KEY,   -- 操作/深链 token
  sUserId         varchar(64),                          -- 旧列（ERP 执行器在读，暂保留）
  sMakePerson     varchar(64),                          -- 新列（ERP 惯例；与 sUserId 双写）
  sConversationId varchar(96),
  sBrandsId       varchar(32),
  sSubsidiaryId   varchar(32),
  sOpType         varchar(16),                          -- update | create | delete | examine | generate
  sTargetFormId   varchar(64),
  sTargetModuleId varchar(64),
  sTargetTable    varchar(64),
  sTargetBillId   varchar(64),                          -- 目标记录 sId（update/delete/examine 用）
  sField          varchar(64),                          -- 目标列（技术名）
  sFieldLabel     varchar(128),                         -- 目标列中文名
  sOldValue       varchar(500),
  sNewValue       varchar(500),
  sPayload        text,                                 -- create/update 的列->值 JSON（整表写入）
  sSourceRef      text,                                 -- generate：源表单 + 选中明细 sId 集合 JSON
  bAutoExecute    tinyint       NOT NULL DEFAULT 0,     -- 1=ERP 确认后自动执行；0=预填表单等用户提交
  sDescription    varchar(500),                         -- 人类可读的改动描述
  sStatus         varchar(16),                          -- pending | success | fail（状态码见头部注释）
  iStatusCode     int           NULL,                   -- 状态码（100/101/200/201/4xx/5xx）
  sResultBillId   varchar(64),                          -- 执行后生成/影响的单据 id
  sResultMsg      varchar(500),
  sErrorMsg       varchar(1000),
  tCreateDate     datetime,
  tConfirmDate    datetime,
  tExecutedDate   datetime,
  tExpireAt       datetime,
  KEY idx_conv (sConversationId, sStatus)
);
