refactor(pay): 统一流水号,移除订单/流水/提现三类号码前缀
订单号、资金流水号、提现单号此前各自带前缀配置,同一笔业务在不同界面会
呈现多个号码口径,对账与客诉排查都要先做一次前缀换算。现收敛为单一流水号
分配器,不再按业务类型区分号码形态。
- 删除 payment_order_prefix / payment_flow_prefix /
payment_withdrawal_prefix 三项配置项及其生成、校验链路
- BusinessNumber::allocate() 成为唯一入口,输出 {YmdHis}{6 位随机},
共 20 位无前缀,满足 VARCHAR(32) 与网关 out_trade_no ≤ 32 的限制
- 订单、资金流水、提现、卡密渠道交易号四处生成点全部改走该分配器
- 后台支付中心表头「订单号 / 提现单号」统一为「流水号」
- 前台用户中心与订单卡片文案同步统一;前台订单详情合并为单行流水号,
账本流水号不再下发到前台,避免同一单据出现两个对外号码
- 同步更新 financial-flow / pay-card / card-pass-order-numbers 契约测试
与 BusinessNumberTest 断言
按用户要求不做双路逻辑与数据迁移,直接替换为统一方案,历史行不做转换。
验证:node --test tests/**/*.test.cjs 362/364 通过,新增 37 项契约;失败的
2 项在改动前的干净 HEAD 基线上同样失败(基线 327 项 / 失败 2 项),分别命中
遗留的 fa fa- 标记与 FA 版本号断言,与本次改动无关。phpunit 44 项 / 103
断言全部通过;php -l 全部改动的 PHP 文件通过。
This commit is contained in:
@@ -5,13 +5,14 @@
|
||||
*
|
||||
* 背景(已修复的缺陷):
|
||||
* 卡密充值(balance/credits)与兑换(vip)虽已建订单,但订单号硬编码为
|
||||
* `CARD{卡ID}`、渠道交易号硬编码为 `card_pass_{卡ID}`,均不受后台
|
||||
* 「订单前缀 / 流水号前缀」控制;且卡密核销产生的资金流水没有挂到订单上
|
||||
* (order_number 为 NULL),订单详情页的「支付流水号」永远显示「—」。
|
||||
* `CARD{卡ID}`、渠道交易号硬编码为 `card_pass_{卡ID}`;且卡密核销产生的资金流水
|
||||
* 没有挂到订单上(order_number 为 NULL),订单详情页的「账本流水号」永远显示「—」。
|
||||
*
|
||||
* 处置:
|
||||
* - 订单号走 OrderRepository::allocate_order_number()(消费 payment_order_prefix);
|
||||
* - 渠道交易号走 BusinessNumber::candidate(flow_prefix)(消费 payment_flow_prefix);
|
||||
* - 订单号走 OrderRepository::allocate_order_number();
|
||||
* - 渠道交易号走 BusinessNumber::allocate();
|
||||
* - 两者与资金流水号、提现单号同源,均为无前缀的统一流水号,
|
||||
* 后台不再提供任何前缀配置项;
|
||||
* - 余额/积分卡的流水由账本落库后用 attach_order_to_ledger_flow() 补挂订单号,
|
||||
* 并把 event_type 归一为 order_payment;会员卡(0 元、无账本参与)由
|
||||
* record_card_pass_payment() 直接落一条零分录的 order_payment 流水。
|
||||
@@ -47,11 +48,12 @@ test('卡密订单号不再硬编码 CARD 前缀,改走统一分配器', () =>
|
||||
}
|
||||
});
|
||||
|
||||
test('渠道交易号不再硬编码 card_pass_ 前缀,改走流水号前缀', () => {
|
||||
test('渠道交易号不再硬编码 card_pass_ 前缀,改走统一流水号分配器', () => {
|
||||
assert.doesNotMatch(card, /'card_pass_'\s*\.\s*\$card_id/);
|
||||
assert.match(card, /card_pass_transaction_number\(\)/);
|
||||
assert.match(card, /BusinessNumber::normalize_prefix\(\$settings\['flow_prefix'\]/);
|
||||
assert.match(card, /BusinessNumber::candidate\(\$prefix\)/);
|
||||
// 不再读取任何前缀配置,直接取统一流水号
|
||||
assert.doesNotMatch(card, /normalize_prefix|flow_prefix|get_order_settings/);
|
||||
assert.match(card, /private function card_pass_transaction_number\(\): string \{\s*return \\AKSRT\\Finance\\BusinessNumber::allocate\(\);/);
|
||||
// create_redeem_order 只接收调用方传入的交易号,不再自行拼前缀
|
||||
assert.match(card, /'payment_transaction_id'\s*=>\s*\$order_status === Order::STATUS_PAID \? \$transaction_number : ''/);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user