Files
cursor/plans/walletuserstat_model_c0f7d053.plan.md
ray zhou f71a5c59af ok
2026-05-29 11:21:40 +08:00

133 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: WalletUserStat Model
overview: 为 rh_wallet.wallet_user_stat 新增继承 think\Model 的 WalletUserStatModel通过 mysql 连接 + 库名.表名 的 $table 绑定跨库表;提供 inc/version 及充提首末次等领域方法;不改 thinkorm 配置与 WalletLogic。
todos:
- id: wallet-user-stat-model
content: 新增 WalletUserStatModel extends think\Modelconnection/table、PHPDoc、inc/apply* 方法)
status: completed
- id: smoke-verify
content: Docker 内冒烟验证 find/applyDeposit 与 version 行为
status: completed
isProject: false
---
# rh_wallet.wallet_user_stat Model 实现计划
## 背景与约束
- 表:`rh_wallet.wallet_user_stat`**单库单表、非分片**;主键 `(uid, currency)`;金额为 **x1000 整数**;含 `version` 乐观锁。
- 与现有 [`WalletStatModel`](app/model/multi/WalletStatModel.php)`SelfBaseModel` + 分片)**并存**,本次不替换其调用链。
- **直接继承 `think\Model`**;库表绑定参考项目内惯例:`$connection` + **`$table = '库名.表名'`**(与你提供的 `s_statistics.gm_stat_summary` 写法一致)。
```mermaid
flowchart LR
Logic["Logic / Service"]
Model["WalletUserStatModel"]
Conn["connection mysql"]
Table["table rh_wallet.wallet_user_stat"]
Logic --> Model
Model --> Conn
Model --> Table
```
## 实现方案
### 单文件:[`app/model/WalletUserStatModel.php`](app/model/WalletUserStatModel.php)
```php
namespace app\model;
use think\Model;
use think\facade\Db;
/**
* 用户钱包累计统计rh_wallet.wallet_user_stat
*
* @property int $uid
* @property string $currency
* ...
*/
class WalletUserStatModel extends Model
{
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'mysql';
/**
* The table associated with the model.
* 跨库:库名.表名
*
* @var string
*/
protected $table = 'rh_wallet.wallet_user_stat';
/**
* 复合主键
*
* @var array<int, string>|string
*/
protected $pk = ['uid', 'currency'];
}
```
**说明:**
- **不改** [`config/thinkorm.php`](config/thinkorm.php):沿用现有 `mysql` 连接(`database` 可为空,与分片库同一实例),由 `$table` 全限定名定位 `rh_wallet`
- 主键使用 ThinkORM **数组形式** `['uid', 'currency']`,与表 `PRIMARY KEY (uid, currency)` 一致;`find` / `update` / `destroy` 等可传复合键数组。
### PHPDoc `@property`
与表字段一致:`total_deposit_*``first/last_deposit_*`、提现/促销/返利/退款/拒付字段、`version``created_at``updated_at`;金额单位 x1000。
### 查询与初始化
| 方法 | 说明 |
|------|------|
| `findByUidCurrency(int $uid, string $currency = 'USD'): ?static` | `static::find(['uid' => $uid, 'currency' => $currency])` 或等价 where |
| `lockByUidCurrency(int $uid, string $currency): ?static` | 复合 where + `lock(true)->find()` |
| `insertInitRow(int $uid, string $currency = 'USD'): static` | `static::create(['uid' => $uid, 'currency' => $currency])` |
### 统计更新(参考 [`WalletStatModel::inc`](app/model/multi/WalletStatModel.php)
**通用累加 `incField`**
- `$field` 白名单:仅可 `inc``*_amount` / `*_count`
- `static::where(['uid','currency'])->inc($field, $amount)`,可选 `version` 条件与 `version + 1`
**领域方法(静态,单次 `update`**
| 方法 | 行为 |
|------|------|
| `applyDeposit` | 累加充值金额/次数;更新 `last_deposit_*`;首充写 `first_deposit_*` |
| `applyWithdraw` | 提现对称 |
| `applyPromoBonus` / `applyCashback` / `applyRefund` / `applyChargeback` | 对应累计字段 |
- 金额参数 `int`,禁止 `float`
- 首充/首提用 `Db::raw('IF(...)')` 保证原子性
- 返回影响行数
### 暂不包含
- 不改 [`WalletLogic.php`](app/api/logic/WalletLogic.php)、[`RegisterService.php`](app/service/wallet/RegisterService.php)
## 验证(实现后)
```bash
docker exec -w /app/www/slot/slot_wallet php82 php -r "
// bootstrap 后
var_export(app\model\WalletUserStatModel::findByUidCurrency(1, 'USD'));
"
```
## 文件清单
| 操作 | 路径 |
|------|------|
| 新增 | `app/model/WalletUserStatModel.php` |
**无配置变更**(不新增 `rh_wallet` connection