From 1805a7b9648ff9cfbd19129255a5a4fa62f0261e Mon Sep 17 00:00:00 2001 From: yeg <1347747024@qq.com> Date: 星期四, 17 九月 2026 18:46:46 +0800 Subject: [PATCH] chore(db): 迁移编号让位到 V151–V154,解与远端 V148–V150 的撞号 --- talent-card-server/src/main/resources/db/migration/V154__order_cancel_request.sql | 1 + talent-card-server/scripts/dev-schema-v154-order-cancel-request.sql | 3 ++- docs/adr/0003-payment-converges-per-attempt.md | 2 +- .scratch/pending-order-payment-flow/README.md | 17 +++++++++++++++++ docs/agents/testing.md | 6 +++--- talent-card-server/scripts/apply-sql-file.ps1 | 4 ++-- talent-card-server/scripts/dev-schema-v152-payment-attempt.sql | 7 +++++-- talent-card-server/src/main/resources/db/migration/V153__merchant_numeric_code_attempt.sql | 1 + talent-card-server/src/main/resources/db/migration/V152__payment_attempt_convergence.sql | 1 + talent-card-server/src/main/resources/db/migration/V151__merchant_capability_sync_until.sql | 1 + .scratch/pending-order-payment-flow/plan.md | 4 ++-- 11 files changed, 36 insertions(+), 11 deletions(-) diff --git a/.scratch/pending-order-payment-flow/README.md b/.scratch/pending-order-payment-flow/README.md index 5aa25d0..6863fc5 100644 --- a/.scratch/pending-order-payment-flow/README.md +++ b/.scratch/pending-order-payment-flow/README.md @@ -190,3 +190,20 @@ - `issues/01-pending-order-deadlock.md`:用户报的死锁(诊断,不是票)。 - `issues/02-store-consume-order-notification.md`:D1(到店消费通知)的移交文档。 - `issues/03-stock-and-create-order-idempotency.md`:审计 §13(库存/销量/下单幂等)的移交文档。 + +## 迁移编号让位(2026-09-17) + +本轮新增的四个迁移原本取 V148–V151,但远端 `shinnosuke` 的两个提交(`d2d27be`、`38dd07d`)先推送了 +`V148__policy_article_top_time`、`V149__clear_service_hero_placeholders`、`V150__merchant_hero_image`: +共同祖先只到 `V147`,双方各自独立占了同一段编号(git 不会报冲突,Flyway 会直接报「同一版本两个迁移」)。 +合并时**本地让号**(远端那三个已推送,可能已在别人的环境里跑过),按原有先后顺延: + +| 原编号 | 现编号 | +| --- | --- | +| `V148__merchant_capability_sync_until` | `V151` | +| `V149__payment_attempt_convergence` | `V152` | +| `V150__merchant_numeric_code_attempt` | `V153` | +| `V151__order_cancel_request` | `V154` | + +两个 `scripts/dev-schema-*.sql` 同步改名,每个迁移文件头也留了让位记录。票面与 issue 里出现的旧编号 +按当时的事实保留(历史记录),以后新增迁移请照 `AGENTS.md` 先看当前最大版本号再取。 diff --git a/.scratch/pending-order-payment-flow/plan.md b/.scratch/pending-order-payment-flow/plan.md index 59429af..4e7b308 100644 --- a/.scratch/pending-order-payment-flow/plan.md +++ b/.scratch/pending-order-payment-flow/plan.md @@ -5,7 +5,7 @@ **一处修正**:我此前说过「第一刀大概率不需要迁移」,那是只考虑了新增 `status` 取值。C4(对账任务 无轮转)与 Q8(关单重试上限)都需要按行记状态,所以**第一刀需要一次迁移**。当前迁移最大版本是 -`V148`,本次取 `V149`,开工前再确认没被他人占用(`AGENTS.md`:迁移编号全仓共享)。 +`V148`,本次取 `V149`;实际开工时远端另有提交把 V148–V150 占走,本地让号后落在 `V152`(见 README「编号让位」)。 --- @@ -13,7 +13,7 @@ **目标**:任何入口进的待支付订单都不再卡死——能再付、能取消、能到期。 -### 迁移 `V149` +### 迁移 `V149` → `V152`(编号让位后) `payment_transaction` 加两列(都在 `payment_transaction` 上,不动别人的区域): diff --git a/docs/adr/0003-payment-converges-per-attempt.md b/docs/adr/0003-payment-converges-per-attempt.md index ef1cfdb..91e3e95 100644 --- a/docs/adr/0003-payment-converges-per-attempt.md +++ b/docs/adr/0003-payment-converges-per-attempt.md @@ -45,6 +45,6 @@ 真实的收款+退款流水(手续费大概率不退,对账也要处理),换来的是取消立刻生效。这是产品明确选的取舍: 取消是高频操作,「等一分钟」是每次都要付的代价;「收了再退」是极少数情况。 -同时把取消意图降级为审计事实:`benefit_order.cancel_requested_at`(V151)只记录用户何时点的取消, +同时把取消意图降级为审计事实:`benefit_order.cancel_requested_at`(V154)只记录用户何时点的取消, **不再驱动任何行为**——它驱动的那个「等关单结论再落地」的对账扫描已经删掉,留它只是为了在 「取消后收到钱」那类偶发路径上把时间对得上。 diff --git a/docs/agents/testing.md b/docs/agents/testing.md index 131a34a..399df6c 100644 --- a/docs/agents/testing.md +++ b/docs/agents/testing.md @@ -12,7 +12,7 @@ 三条由此推出的硬约束: -- **迁移必须同时兼容 5.7 与 8.0**:测试只在 8.0 上跑,跑绿不代表开发库能执行(`V148` 的存储过程写法 +- **迁移必须同时兼容 5.7 与 8.0**:测试只在 8.0 上跑,跑绿不代表开发库能执行(`V151` 的存储过程写法 已在 5.7 上实跑验证过,但每次新增迁移都值得照做一遍)。 - **开发库的结构不由 Flyway 维护**:缺表缺列只能靠启动时的初始化器 best-effort 补,补不上就手工补(见下)。 - 本机 `8134` 实例上另有 `talent_card`、`talent_card_dryrun`、`talent_card_verify1` 三个库:它们是 @@ -79,8 +79,8 @@ 逐条执行 SQL(默认连开发库,可 `-Database/-DatabaseHost/-Port` 覆盖;不带 `-Yes` 只打印不执行)。 它认得 `DELIMITER`,所以 `db/migration/V*.sql` 也能原样重放。默认指向**开发库**,别拿它去改测试库 (测试库由 Flyway 从 `db/migration` 重建,手工 DDL 会让迁移与 history 表对不上)。 - 开发者首次拿到新列:2026-09-17 的 `V149`(支付流水两列)与 `V150`(手输核销码计数表)就是这样落地的, - 对应脚本 `scripts/dev-schema-v149-payment-attempt.sql`(写法可重复执行的那份在迁移里,两者等价)。 + 开发者首次拿到新列:2026-09-17 的 `V152`(支付流水两列)与 `V153`(手输核销码计数表)就是这样落地的, + 对应脚本 `scripts/dev-schema-v152-payment-attempt.sql`(写法可重复执行的那份在迁移里,两者等价)。 - 动结构之前先备份。本机**没有** mysql 客户端、也没有 Docker(README 里指向 `D:\MySQL\...` 和 `docker exec talent-card-mysql-1` 的两条老做法都已失效),要备份就在 DB 主机上做,或照 `scripts/reset-test-db.ps1` 的办法用项目已有的 JDBC 驱动写个单文件程序。 diff --git a/talent-card-server/scripts/apply-sql-file.ps1 b/talent-card-server/scripts/apply-sql-file.ps1 index 58e102a..9683da9 100644 --- a/talent-card-server/scripts/apply-sql-file.ps1 +++ b/talent-card-server/scripts/apply-sql-file.ps1 @@ -6,8 +6,8 @@ # request that touches it fails with "Unknown column ...". See docs/agents/testing.md. # # Usage: -# .\scripts\apply-sql-file.ps1 -File scripts\dev-schema-v149-payment-attempt.sql -Yes -# .\scripts\apply-sql-file.ps1 -File src\main\resources\db\migration\V149__payment_attempt_convergence.sql -Yes +# .\scripts\apply-sql-file.ps1 -File scripts\dev-schema-v152-payment-attempt.sql -Yes +# .\scripts\apply-sql-file.ps1 -File src\main\resources\db\migration\V152__payment_attempt_convergence.sql -Yes # .\scripts\apply-sql-file.ps1 -File <file> # prints the statements without executing # # The target defaults to the shared dev database. It is a shared database, so the script executes diff --git a/talent-card-server/scripts/dev-schema-v149-payment-attempt.sql b/talent-card-server/scripts/dev-schema-v152-payment-attempt.sql similarity index 77% rename from talent-card-server/scripts/dev-schema-v149-payment-attempt.sql rename to talent-card-server/scripts/dev-schema-v152-payment-attempt.sql index 19ae7b6..4a4c450 100644 --- a/talent-card-server/scripts/dev-schema-v149-payment-attempt.sql +++ b/talent-card-server/scripts/dev-schema-v152-payment-attempt.sql @@ -1,10 +1,13 @@ --- 开发库(局域网共享的 talent_card,MySQL 5.7,Flyway 关闭)手工补齐 V149 的两列。 +-- 开发库(局域网共享的 talent_card,MySQL 5.7,Flyway 关闭)手工补齐支付尝试收敛的两列。 +-- +-- 编号让位(2026-09-17):这两列对应的迁移原为 V149,因与远端已推送的 V149__clear_service_hero_placeholders +-- 撞号,本地让号改为 V152__payment_attempt_convergence.sql;本脚本同步改名。 -- -- 为什么需要这份文件:开发库的结构不由迁移维护,而现有启动初始化器只补商户进件相关的表, -- 不覆盖 payment_transaction。只写迁移会让开发库缺列,对账任务与支付接口直接以 -- Unknown column 500(见 docs/agents/testing.md 记录的同类事故)。 -- --- 与 V149__payment_attempt_convergence.sql 逐列等价,只是不含存储过程(JDBC 无法直接执行 +-- 与 V152__payment_attempt_convergence.sql 逐列等价,只是不含存储过程(JDBC 无法直接执行 -- DELIMITER 批处理),所以只能执行一次:重复执行会在「列已存在」上报错,这是安全的失败。 -- -- 执行方式(本机没有 mysql 客户端,用项目已有的 JDBC 驱动): diff --git a/talent-card-server/scripts/dev-schema-v151-order-cancel-request.sql b/talent-card-server/scripts/dev-schema-v154-order-cancel-request.sql similarity index 71% rename from talent-card-server/scripts/dev-schema-v151-order-cancel-request.sql rename to talent-card-server/scripts/dev-schema-v154-order-cancel-request.sql index 0b788c1..bde1b3b 100644 --- a/talent-card-server/scripts/dev-schema-v151-order-cancel-request.sql +++ b/talent-card-server/scripts/dev-schema-v154-order-cancel-request.sql @@ -1,6 +1,7 @@ +-- 编号让位(2026-09-17):这一列对应的迁移原为 V151,同批让号后为 V154__order_cancel_request.sql;本脚本同步改名。 -- 开发库(局域网共享的 talent_card,MySQL 5.7,Flyway 关闭)手工补列。 -- --- 与 V151__order_cancel_request.sql 等价,只是不含存储过程(JDBC 无法直接执行 DELIMITER 批处理), +-- 与 V154__order_cancel_request.sql 等价,只是不含存储过程(JDBC 无法直接执行 DELIMITER 批处理), -- 所以只能执行一次:重复执行会在「列已存在」上报错,这是安全的失败。 -- -- 执行方式: diff --git a/talent-card-server/src/main/resources/db/migration/V148__merchant_capability_sync_until.sql b/talent-card-server/src/main/resources/db/migration/V151__merchant_capability_sync_until.sql similarity index 87% rename from talent-card-server/src/main/resources/db/migration/V148__merchant_capability_sync_until.sql rename to talent-card-server/src/main/resources/db/migration/V151__merchant_capability_sync_until.sql index a886136..119855b 100644 --- a/talent-card-server/src/main/resources/db/migration/V148__merchant_capability_sync_until.sql +++ b/talent-card-server/src/main/resources/db/migration/V151__merchant_capability_sync_until.sql @@ -1,3 +1,4 @@ +-- 编号让位(2026-09-17):本文件原为 V148,与远端已推送的 V148__policy_article_top_time 撞号,本地让号改为 V151。 -- 商户端「立即核实」的冷却时间戳:手动核实一次通道查询后,在此时间之前不再重复查询。 -- 不放在 capability_verified_at:查询失败时那一列不推进,会被连点;也不放在 updated_at: -- 那是 MySQL 的 on update current_timestamp,任何无关 UPDATE 都会顺带把它重置。 diff --git a/talent-card-server/src/main/resources/db/migration/V149__payment_attempt_convergence.sql b/talent-card-server/src/main/resources/db/migration/V152__payment_attempt_convergence.sql similarity index 94% rename from talent-card-server/src/main/resources/db/migration/V149__payment_attempt_convergence.sql rename to talent-card-server/src/main/resources/db/migration/V152__payment_attempt_convergence.sql index 134cfe3..b48f434 100644 --- a/talent-card-server/src/main/resources/db/migration/V149__payment_attempt_convergence.sql +++ b/talent-card-server/src/main/resources/db/migration/V152__payment_attempt_convergence.sql @@ -1,3 +1,4 @@ +-- 编号让位(2026-09-17):本文件原为 V149,与远端已推送的 V149__clear_service_hero_placeholders 撞号,本地让号改为 V152。 -- 支付尝试按「这一次尝试」收敛所需要的两列(判定见 docs/adr/0003)。 -- -- last_reconciled_at 对账任务的公平轮转与退避依据。旧实现按「最早 100 条」取未决流水,一旦积压 diff --git a/talent-card-server/src/main/resources/db/migration/V150__merchant_numeric_code_attempt.sql b/talent-card-server/src/main/resources/db/migration/V153__merchant_numeric_code_attempt.sql similarity index 91% rename from talent-card-server/src/main/resources/db/migration/V150__merchant_numeric_code_attempt.sql rename to talent-card-server/src/main/resources/db/migration/V153__merchant_numeric_code_attempt.sql index f62e26f..5a644ba 100644 --- a/talent-card-server/src/main/resources/db/migration/V150__merchant_numeric_code_attempt.sql +++ b/talent-card-server/src/main/resources/db/migration/V153__merchant_numeric_code_attempt.sql @@ -1,3 +1,4 @@ +-- 编号让位(2026-09-17):本文件原为 V150,与远端已推送的 V150__merchant_hero_image 撞号,本地让号改为 V153。 -- 商户端手输 6 位数字核销码的失败计数与锁定。 -- -- 核销码本来就下发一个 6 位数字码给顾客(order_dynamic_verification_code.display_code),但系统里 diff --git a/talent-card-server/src/main/resources/db/migration/V151__order_cancel_request.sql b/talent-card-server/src/main/resources/db/migration/V154__order_cancel_request.sql similarity index 92% rename from talent-card-server/src/main/resources/db/migration/V151__order_cancel_request.sql rename to talent-card-server/src/main/resources/db/migration/V154__order_cancel_request.sql index a197477..5bf08ab 100644 --- a/talent-card-server/src/main/resources/db/migration/V151__order_cancel_request.sql +++ b/talent-card-server/src/main/resources/db/migration/V154__order_cancel_request.sql @@ -1,3 +1,4 @@ +-- 编号让位(2026-09-17):本文件原为 V151,同批让号后顺延为 V154(远端那两个提交占了 V148–V150)。 -- 「取消意图」要能跨请求活到关单结论回来的那一刻。 -- -- 用户在通道说「关单处理中」时点了取消,服务端当次只能回一句「取消处理中」——真正该取消的时机是 -- Gitblit v1.7.1