5.0 KiB
5.0 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 定格冻结用户流水 | 在 slot_wallet 的 `freeCreditsFreeze` 成功扣款后,补充 `addTransactionRecord` 写入 C 端可见的 `user_transaction_log`;并在 slot_pwa 注册新 `transaction_type` 与列表筛选映射。 |
|
false |
freeCreditsFreeze 补充用户可见流水
问题
WalletLogic::freeCreditsFreeze() 当前仅:
minus()扣减 deposit/withdrawaddLog()写入分表 wallet_log(biz_type=freeCreditsFreeze)
未调用 addTransactionRecord(),因此 MQ 不会投递到 PWA,用户在 Transaction / 流水页 看不到定格扣款记录。
对比:普通提现冻结在同文件内已有:
$this->addTransactionRecord('withdraw frozen', $this->requestDTO->fee * -1, $balance, 7);
需求文档 §15.2 要求「必须写钱包流水」——wallet_log 已满足后台审计;本需求补齐 C 端展示流水。
flowchart LR
freeze[freeCreditsFreeze]
addLog[addLog wallet_log]
addTx[addTransactionRecord]
mq[PWA MQ]
ui[用户流水列表]
freeze --> addLog
freeze --> addTx --> mq --> ui
说明:freeCreditsFreeze 是扣款(金额为负),不是入账;用户列表里应显示为负向变动(与 type 7「Withdraw」冻结类似)。
实现方案(slot_wallet + slot_pwa)
1. slot_wallet — freeCreditsFreeze 增加用户流水
在事务内、addLog 成功之后、commit 之前增加(与 withdrawFrozen 一致,失败仅记日志不回滚主事务):
$this->addTransactionRecord(
'Free Credits Freeze',
$this->requestDTO->fee * -1,
$balance,
self::TRANSACTION_TYPE_FREE_CREDITS_FREEZE // 新常量,建议 65
);
在 WalletLogic 类内新增常量(或集中放在与 PWA 对齐的注释块):
/** 用户流水类型:首充定格冻结扣款,对应 freeCreditsFreeze */
private const TRANSACTION_TYPE_FREE_CREDITS_FREEZE = 65;
字段约定(与现有 addTransactionRecord 一致):
| 字段 | 值 |
|---|---|
subject |
Free Credits Freeze(C 端 name 映射用) |
amount |
-fee(千分位,负数为扣款) |
balance_after |
扣款后 deposit + withdraw 总余额 |
transaction_id |
已有规则:substr(uid,0,3) + biz_id(幂等键 free_credits_freeze:{orderId}) |
transaction_type |
65 |
不改 addLog / 余额扣减逻辑;不改 slot_console / slot_lib。
2. slot_pwa — 注册 transaction_type=65
文件:UserTransactionLogService.php
$typeMaps[-1](All)增加65$typeMaps[1](Withdraw 分类,已含 7/8)增加65(定格扣款与提现类支出归同一 tab,可按产品再调)$typeToClient[65] = 'Free Credits Freeze'(或简短文案Free Credits)
可选:在 UserTransactionLogShardModel.php 增加 TRANSACTION_TYPE_FREE_CREDITS_FREEZE = 65 常量与注释,wallet 侧用相同数字(wallet 不依赖 pwa 类,注释对齐即可)。
3. 单测
| 仓库 | 文件 | 内容 |
|---|---|---|
| slot_wallet | 扩展 WalletLogicHarness 或新建用例 |
覆写/桩 addTransactionRecord,断言 freeCreditsFreeze 成功后调用一次,且 amount < 0、type=65 |
| slot_wallet | 现有 freeze 相关测 | 回归通过 |
运行:
docker exec -w /app/www/slot/slot_wallet php82 ./vendor/bin/phpunit tests/Unit/WalletFreeCreditsFirstKeepTest.php tests/Unit/WalletFreeCreditInitBusTest.php
# 若有新增 FreezeTransactionTest 则一并跑
不在本次范围
freeCreditsClaim/freeCreditsFirstCashKeep的用户流水(若也要在流水页展示入账,可另开任务,同样走addTransactionRecord+ 新 type)- 修改
wallet_log表结构 - C 端 UI 文案多语言(仅后端
name英文字段)
验收
- 首充定格成功后,用户流水列表(All / Withdraw)出现一条 负金额 记录,
name为 Free Credits Freeze transaction_id与biz_id(free_credits_freeze:{orderId})可追溯- 幂等重试 freeze:wallet_log 幂等不变;若 MQ 重复需依赖现有消费端去重(与 type 7 行为一致,本次不单独改 MQ)
- wallet 单测通过