Files
cursor/plans/定格冻结用户流水_68d9c5d1.plan.md
ray zhou f71a5c59af ok
2026-05-29 11:21:40 +08:00

5.0 KiB
Raw Permalink Blame History

name, overview, todos, isProject
name overview todos isProject
定格冻结用户流水 在 slot_wallet 的 `freeCreditsFreeze` 成功扣款后,补充 `addTransactionRecord` 写入 C 端可见的 `user_transaction_log`;并在 slot_pwa 注册新 `transaction_type` 与列表筛选映射。
id content status
wallet-add-transaction WalletLogic::freeCreditsFreeze 增加 addTransactionRecordtype=65负金额 pending
id content status
pwa-type-map slot_pwa UserTransactionLogService 注册 type 65 与展示名 pending
id content status
wallet-unit-test wallet 单测断言 freeCreditsFreeze 写入用户流水 pending
id content status
run-phpunit php82 跑 wallet 相关单测验证 pending
false

freeCreditsFreeze 补充用户可见流水

问题

WalletLogic::freeCreditsFreeze() 当前仅:

  1. minus() 扣减 deposit/withdraw
  2. addLog() 写入分表 wallet_logbiz_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 增加用户流水

文件:WalletLogic.php

在事务内、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 FreezeC 端 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 < 0type=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 英文字段)

验收

  1. 首充定格成功后用户流水列表All / Withdraw出现一条 负金额 记录,name 为 Free Credits Freeze
  2. transaction_idbiz_idfree_credits_freeze:{orderId})可追溯
  3. 幂等重试 freezewallet_log 幂等不变;若 MQ 重复需依赖现有消费端去重(与 type 7 行为一致,本次不单独改 MQ
  4. wallet 单测通过