|
|
@@ -0,0 +1,189 @@
|
|
|
+# 修正AddHandler资金验证支持多币种
|
|
|
+
|
|
|
+**任务时间**: 2025年06月13日 14:45:00 CST
|
|
|
+**任务内容**: 修正AddHandler的资金验证以匹配多币种支持,确保使用正确的币种进行资金验证
|
|
|
+
|
|
|
+## 1. 问题背景
|
|
|
+
|
|
|
+在完成Mex模块多币种适配后,发现AddHandler中的资金验证仍然硬编码使用`FUND_TYPE::FUND1`(金币账户),但多币种适配默认使用钻石币种(`FUND_TYPE::FUND2`),导致资金验证不匹配。
|
|
|
+
|
|
|
+### 1.1 问题分析
|
|
|
+- MexOrderValidator第141行硬编码使用`FUND_TYPE::FUND1`
|
|
|
+- 多币种适配默认使用钻石币种,对应`FUND_TYPE::FUND2`
|
|
|
+- 资金验证与实际交易使用的币种不一致
|
|
|
+
|
|
|
+## 2. 解决方案
|
|
|
+
|
|
|
+### 2.1 核心修正策略
|
|
|
+1. **更新MexOrderValidator**:支持动态币种选择
|
|
|
+2. **修改MatchexchangeAddValidation**:自动添加默认币种信息
|
|
|
+3. **增强AddHandler**:传递币种参数给Service层
|
|
|
+4. **保持向后兼容**:现有功能无需修改
|
|
|
+
|
|
|
+### 2.2 技术实现
|
|
|
+
|
|
|
+#### MexOrderValidator修正
|
|
|
+```php
|
|
|
+// 修正前:硬编码使用金币账户
|
|
|
+$fundService = new FundService($userId, FUND_TYPE::FUND1->value);
|
|
|
+
|
|
|
+// 修正后:根据币种动态选择账户
|
|
|
+$currencyType = $currencyType ?? FundLogic::getDefaultCurrency();
|
|
|
+$availableAccountType = FundLogic::getAvailableAccountType($currencyType);
|
|
|
+$fundService = new FundService($userId, $availableAccountType->value);
|
|
|
+```
|
|
|
+
|
|
|
+#### 精度处理优化
|
|
|
+```php
|
|
|
+// 根据币种精度动态计算资金转换
|
|
|
+$precision = $currencyType->getPrecision();
|
|
|
+$requiredAmountInStorage = (int)bcmul($requiredAmount, bcpow('10', $precision), 0);
|
|
|
+```
|
|
|
+
|
|
|
+#### 验证流程增强
|
|
|
+```php
|
|
|
+// 在MatchexchangeAddValidation中自动添加默认币种
|
|
|
+$defaultCurrency = FundLogic::getDefaultCurrency();
|
|
|
+$this->setRaw('currency_type', $defaultCurrency->value);
|
|
|
+```
|
|
|
+
|
|
|
+## 3. 修改文件清单
|
|
|
+
|
|
|
+### 3.1 核心验证文件
|
|
|
+- `app/Module/Mex/Validators/MexOrderValidator.php`:支持多币种资金验证
|
|
|
+- `app/Module/AppGame/Validations/MatchexchangeAddValidation.php`:添加默认币种信息
|
|
|
+
|
|
|
+### 3.2 Handler文件
|
|
|
+- `app/Module/AppGame/Handler/Matchexchange/AddHandler.php`:传递币种参数
|
|
|
+
|
|
|
+### 3.3 测试文件
|
|
|
+- `app/Module/Mex/Tests/AddHandlerMultiCurrencyTest.php`:多币种验证测试
|
|
|
+- `app/Module/Mex/Tests/AddHandlerIntegrationTest.php`:集成测试
|
|
|
+- `app/Module/Mex/Tests/verify_addhandler_fix.php`:验证脚本
|
|
|
+
|
|
|
+## 4. 关键修正点
|
|
|
+
|
|
|
+### 4.1 MexOrderValidator::validateUserFundBalance
|
|
|
+**修正前**:
|
|
|
+```php
|
|
|
+private function validateUserFundBalance(int $userId, float $requiredAmount): bool
|
|
|
+{
|
|
|
+ $fundService = new FundService($userId, FUND_TYPE::FUND1->value);
|
|
|
+ $balance = $fundService->balance();
|
|
|
+ if ($balance < $requiredAmount) {
|
|
|
+ $this->addError("资金不足,当前余额 {$balance},需要 {$requiredAmount}");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**修正后**:
|
|
|
+```php
|
|
|
+private function validateUserFundBalance(int $userId, float $requiredAmount, ?FUND_CURRENCY_TYPE $currencyType = null): bool
|
|
|
+{
|
|
|
+ $currencyType = $currencyType ?? FundLogic::getDefaultCurrency();
|
|
|
+ $availableAccountType = FundLogic::getAvailableAccountType($currencyType);
|
|
|
+
|
|
|
+ $fundService = new FundService($userId, $availableAccountType->value);
|
|
|
+ $balance = $fundService->balance();
|
|
|
+
|
|
|
+ $precision = $currencyType->getPrecision();
|
|
|
+ $requiredAmountInStorage = (int)bcmul($requiredAmount, bcpow('10', $precision), 0);
|
|
|
+
|
|
|
+ if ($balance < $requiredAmountInStorage) {
|
|
|
+ $balanceDisplay = bcdiv($balance, bcpow('10', $precision), $precision);
|
|
|
+ $this->addError("资金不足,当前{$currencyType->name}余额 {$balanceDisplay},需要 {$requiredAmount}");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 4.2 AddHandler币种参数传递
|
|
|
+**修正前**:
|
|
|
+```php
|
|
|
+$result = MexOrderService::createBuyOrder($userId, $itemId, $quantity, $price);
|
|
|
+```
|
|
|
+
|
|
|
+**修正后**:
|
|
|
+```php
|
|
|
+$currencyType = FundLogic::getDefaultCurrency();
|
|
|
+$result = MexOrderService::createBuyOrder($userId, $itemId, $quantity, $price, $currencyType);
|
|
|
+```
|
|
|
+
|
|
|
+## 5. 验证结果
|
|
|
+
|
|
|
+### 5.1 验证脚本结果
|
|
|
+```
|
|
|
+=== AddHandler多币种资金验证修正验证 ===
|
|
|
+
|
|
|
+1. 验证默认币种设置
|
|
|
+ 默认币种: 2 (ZUANSHI)
|
|
|
+
|
|
|
+2. 验证币种映射
|
|
|
+ 钻石币种 - 可用账户: FUND2, 冻结账户: FUND3
|
|
|
+
|
|
|
+3. 验证精度处理
|
|
|
+ 钻石精度: 10位小数
|
|
|
+ 测试金额: 100.5
|
|
|
+ 存储格式: 1005000000000
|
|
|
+ 显示格式: 100.5000000000
|
|
|
+ 转换正确: ✅
|
|
|
+```
|
|
|
+
|
|
|
+### 5.2 关键验证点
|
|
|
+- ✅ **默认币种**:正确设置为钻石(ZUANSHI,值为2)
|
|
|
+- ✅ **账户映射**:钻石币种正确映射到FUND2(可用)和FUND3(冻结)
|
|
|
+- ✅ **精度处理**:10位小数精度,转换逻辑正确
|
|
|
+- ✅ **向后兼容**:现有功能无需修改即可使用
|
|
|
+
|
|
|
+## 6. 技术特点
|
|
|
+
|
|
|
+### 6.1 动态币种支持
|
|
|
+- 根据传入的币种类型动态选择对应的账户类型
|
|
|
+- 支持不同币种的精度处理
|
|
|
+- 自动计算存储格式和显示格式的转换
|
|
|
+
|
|
|
+### 6.2 错误信息优化
|
|
|
+- 错误信息包含具体的币种名称
|
|
|
+- 显示用户友好的余额格式
|
|
|
+- 提供详细的资金不足信息
|
|
|
+
|
|
|
+### 6.3 向后兼容设计
|
|
|
+- 所有币种参数都是可选的,默认使用钻石币种
|
|
|
+- 现有的Handler调用无需修改
|
|
|
+- 保持原有的API接口不变
|
|
|
+
|
|
|
+## 7. 影响范围
|
|
|
+
|
|
|
+### 7.1 正面影响
|
|
|
+- 资金验证与实际交易币种保持一致
|
|
|
+- 支持多币种的准确资金验证
|
|
|
+- 提高了系统的币种处理一致性
|
|
|
+
|
|
|
+### 7.2 兼容性
|
|
|
+- 完全向后兼容,现有功能正常运行
|
|
|
+- 新的多币种功能可以逐步启用
|
|
|
+- 不影响现有的交易流程
|
|
|
+
|
|
|
+## 8. 后续工作
|
|
|
+
|
|
|
+### 8.1 Handler层完善
|
|
|
+- 如需支持其他币种,可在Handler中传递具体的币种参数
|
|
|
+- 前端可以增加币种选择功能
|
|
|
+
|
|
|
+### 8.2 测试完善
|
|
|
+- 可以增加更多的集成测试
|
|
|
+- 验证不同币种的完整交易流程
|
|
|
+
|
|
|
+## 9. 总结
|
|
|
+
|
|
|
+本次修正成功解决了AddHandler资金验证与多币种适配不匹配的问题:
|
|
|
+
|
|
|
+1. **问题解决**:资金验证现在使用正确的币种和账户类型
|
|
|
+2. **功能增强**:支持动态币种选择和精度处理
|
|
|
+3. **向后兼容**:现有功能无需修改即可正常运行
|
|
|
+4. **代码质量**:提高了币种处理的一致性和准确性
|
|
|
+
|
|
|
+修正后的AddHandler能够正确验证用户的钻石余额,确保多币种交易的资金验证准确性。
|