|
|
@@ -642,3 +642,37 @@ ALTER TABLE pos_order_omg_payment CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8m
|
|
|
ALTER TABLE pos_order_omg_refund CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
ALTER TABLE pos_store_omg CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
```
|
|
|
+
|
|
|
+## 2026-08-12 OMG 账本重构(追加式 S):is_active 单活跃轴 + expire_date + 生成列唯一索引(016 Phase 10 T056)
|
|
|
+
|
|
|
+```sql
|
|
|
+-- 设计见 specs/016-omg-payment/payment-attempt-lifecycle.md §6.1。双轴:is_active ⊥ pay_status,
|
|
|
+-- 轮换只翻 is_active 1→0 不动 pay_status → 迟到 notify 的 markSuccess CAS IN(0,2) 永命中。
|
|
|
+-- 执行前先确认生产 MySQL 版本:SELECT VERSION();(生成列唯一索引需 5.7.6+)
|
|
|
+
|
|
|
+ALTER TABLE pos_order_omg_payment ADD COLUMN expire_date DATETIME NULL
|
|
|
+ COMMENT 'OMG 延期支付真实 ExpireDate,仅由 paymentInfo 回调解析写入;NULL=未知(信用卡/未取号),绝不由后台任务触发换号';
|
|
|
+ALTER TABLE pos_order_omg_payment ADD COLUMN is_active TINYINT NOT NULL DEFAULT 1
|
|
|
+ COMMENT '1=当前活跃尝试 0=已轮换历史(保留审计+迟到notify落地);与 pay_status 正交,轮换只翻 is_active 不动 pay_status';
|
|
|
+
|
|
|
+-- 生成列唯一索引:每 ddId 同时至多一条活跃未付(is_active=1 AND pay_status=0)行(DB 级强制单活跃)
|
|
|
+-- ⚠ 需 MySQL 5.7.6+;不够则注释掉下两行,退化为普通索引 idx_omg_dd_active(dd_id,is_active,pay_status)+ app 锁 + CAS
|
|
|
+ALTER TABLE pos_order_omg_payment ADD COLUMN active_dd_id BIGINT
|
|
|
+ GENERATED ALWAYS AS (IF(is_active=1 AND pay_status=0, dd_id, NULL)) VIRTUAL
|
|
|
+ COMMENT '单活跃不变量载体';
|
|
|
+ALTER TABLE pos_order_omg_payment ADD UNIQUE KEY uk_omg_active_dd (active_dd_id);
|
|
|
+
|
|
|
+-- 历史回填(绝不回填 expire_date,NULL=未知):
|
|
|
+-- ① 已终态(pay_status<>0)行 is_active=0
|
|
|
+UPDATE pos_order_omg_payment SET is_active=0 WHERE pay_status<>0;
|
|
|
+-- ② pay_status=0 的行:每 ddId 保留最新(id 最大)一条 is_active=1,其余置 0
|
|
|
+UPDATE pos_order_omg_payment p
|
|
|
+INNER JOIN (SELECT dd_id, MAX(id) AS max_id FROM pos_order_omg_payment WHERE pay_status=0 GROUP BY dd_id) m
|
|
|
+ ON p.dd_id=m.dd_id
|
|
|
+SET p.is_active = IF(p.id=m.max_id, 1, 0)
|
|
|
+WHERE p.pay_status=0;
|
|
|
+
|
|
|
+-- 验证:每 ddId 至多一条 is_active=1 AND pay_status=0(应返回 0 行;若 >0 说明回填或唯一索引有问题)
|
|
|
+SELECT dd_id, COUNT(*) AS cnt FROM pos_order_omg_payment WHERE is_active=1 AND pay_status=0
|
|
|
+GROUP BY dd_id HAVING COUNT(*)>1;
|
|
|
+```
|