ソースを参照

Mex模块移除精度处理,信任Fund模块数据

- 移除AddHandler中的number_format精度处理
- 移除MexOrderLogic中的bcmul精度计算
- 移除MexOrderValidator中的bcpow精度转换
- 改为直接使用Fund模块的FundService进行数额验证
- 统一使用float类型传递价格参数
- 简化数值处理逻辑,提高代码可维护性
notfff 7 ヶ月 前
コミット
22f7885c0b

+ 1 - 0
AiWork/记忆习惯.md

@@ -86,6 +86,7 @@
 - Mex模块需要支持多币种适配功能,默认币种为钻石,通过FundLogic类管理币种与账户类型的映射关系
 - Mex模块多币种适配:订单表和成交记录表增加currency_type字段,FundLogic提供币种映射,MexAccountLogic支持币种参数传递
 - Mex模块AddHandler资金验证已修正支持多币种:MexOrderValidator根据币种动态选择账户类型,MatchexchangeAddValidation自动添加默认币种信息,确保资金验证使用正确的币种和精度
+- Mex模块不再自行处理Fund模块的数值精度,移除了number_format和bcpow等精度处理代码,改为信任Fund模块的数据,数额验证直接使用Fund模块的FundService进行比较
 
 ### GameItem模块
 - GameItem模块需要实现物品冻结功能,用于匹配交易过程中卖出物品时的状态管理

+ 4 - 4
app/Module/AppGame/Handler/Matchexchange/AddHandler.php

@@ -110,12 +110,12 @@ class AddHandler extends BaseHandler
      */
     private function processBuyOrder(int $userId, int $itemId, int $quantity, float $price, FUND_CURRENCY_TYPE $currencyType): array
     {
-        // 调用服务层创建买入订单(传递币种参数
+        // 调用服务层创建买入订单(直接传递原始价格,信任Fund模块的数据处理
         $result = MexOrderService::createBuyOrder(
             $userId,
             $itemId,
             $quantity,
-            number_format($price, 5, '.', ''),
+            $price,
             $currencyType
         );
 
@@ -148,12 +148,12 @@ class AddHandler extends BaseHandler
      */
     private function processSellOrder(int $userId, int $itemId, int $quantity, float $price, FUND_CURRENCY_TYPE $currencyType): array
     {
-        // 调用服务层创建卖出订单(传递币种参数
+        // 调用服务层创建卖出订单(直接传递原始价格,信任Fund模块的数据处理
         $result = MexOrderService::createSellOrder(
             $userId,
             $itemId,
             $quantity,
-            number_format($price, 5, '.', ''),
+            $price,
             $currencyType
         );
 

+ 8 - 6
app/Module/Mex/Logic/MexOrderLogic.php

@@ -23,11 +23,11 @@ class MexOrderLogic
      * @param int $userId 用户ID
      * @param int $itemId 商品ID
      * @param int $quantity 数量
-     * @param string $price 价格
+     * @param float $price 价格(信任Fund模块的数据处理)
      * @param FUND_CURRENCY_TYPE|null $currencyType 币种类型,默认使用钻石
      * @return array 操作结果
      */
-    public static function createSellOrder(int $userId, int $itemId, int $quantity, string $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
+    public static function createSellOrder(int $userId, int $itemId, int $quantity, float $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
     {
         // 获取币种类型,默认使用钻石
         $currencyType = $currencyType ?? FundLogic::getDefaultCurrency();
@@ -38,7 +38,8 @@ class MexOrderLogic
             return ['success' => false, 'message' => '商品未配置价格信息'];
         }
 
-        $totalAmount = bcmul($price, $quantity, 5);
+        // 直接计算总金额,信任Fund模块的精度处理
+        $totalAmount = $price * $quantity;
 
         try {
             $order = MexOrder::create([
@@ -71,11 +72,11 @@ class MexOrderLogic
      * @param int $userId 用户ID
      * @param int $itemId 商品ID
      * @param int $quantity 数量
-     * @param string $price 价格
+     * @param float $price 价格(信任Fund模块的数据处理)
      * @param FUND_CURRENCY_TYPE|null $currencyType 币种类型,默认使用钻石
      * @return array 操作结果
      */
-    public static function createBuyOrder(int $userId, int $itemId, int $quantity, string $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
+    public static function createBuyOrder(int $userId, int $itemId, int $quantity, float $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
     {
         // 获取币种类型,默认使用钻石
         $currencyType = $currencyType ?? FundLogic::getDefaultCurrency();
@@ -86,7 +87,8 @@ class MexOrderLogic
             return ['success' => false, 'message' => '商品未配置价格信息'];
         }
 
-        $totalAmount = bcmul($price, $quantity, 5);
+        // 直接计算总金额,信任Fund模块的精度处理
+        $totalAmount = $price * $quantity;
 
         try {
             $order = MexOrder::create([

+ 4 - 4
app/Module/Mex/Services/MexOrderService.php

@@ -21,11 +21,11 @@ class MexOrderService
      * @param int $userId 用户ID
      * @param int $itemId 商品ID
      * @param int $quantity 数量
-     * @param string $price 价格
+     * @param float $price 价格(信任Fund模块的数据处理)
      * @param FUND_CURRENCY_TYPE|null $currencyType 币种类型,默认使用钻石
      * @return array 操作结果
      */
-    public static function createSellOrder(int $userId, int $itemId, int $quantity, string $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
+    public static function createSellOrder(int $userId, int $itemId, int $quantity, float $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
     {
         return MexOrderLogic::createSellOrder($userId, $itemId, $quantity, $price, $currencyType);
     }
@@ -36,11 +36,11 @@ class MexOrderService
      * @param int $userId 用户ID
      * @param int $itemId 商品ID
      * @param int $quantity 数量
-     * @param string $price 价格
+     * @param float $price 价格(信任Fund模块的数据处理)
      * @param FUND_CURRENCY_TYPE|null $currencyType 币种类型,默认使用钻石
      * @return array 操作结果
      */
-    public static function createBuyOrder(int $userId, int $itemId, int $quantity, string $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
+    public static function createBuyOrder(int $userId, int $itemId, int $quantity, float $price, ?FUND_CURRENCY_TYPE $currencyType = null): array
     {
         return MexOrderLogic::createBuyOrder($userId, $itemId, $quantity, $price, $currencyType);
     }

+ 5 - 10
app/Module/Mex/Validators/MexOrderValidator.php

@@ -4,7 +4,6 @@ namespace App\Module\Mex\Validators;
 
 use App\Module\GameItems\Logics\ItemQuantity;
 use App\Module\Fund\Services\FundService;
-use App\Module\Fund\Enums\FUND_TYPE;
 use App\Module\Fund\Enums\FUND_CURRENCY_TYPE;
 use App\Module\Mex\Logic\FundLogic;
 use UCore\Validator;
@@ -145,6 +144,7 @@ class MexOrderValidator extends Validator
 
     /**
      * 验证用户资金余额
+     * 使用Fund模块的验证器进行数额验证,信任Fund模块的数据处理
      *
      * @param int $userId 用户ID
      * @param float $requiredAmount 需要的金额
@@ -163,18 +163,13 @@ class MexOrderValidator extends Validator
             return false;
         }
 
-        // 使用对应币种的账户进行资金验证
+        // 使用Fund模块的FundService进行资金验证,信任Fund模块的数据处理
         $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}");
+        // 直接比较,不进行精度转换,信任Fund模块的数据处理
+        if ($balance < $requiredAmount) {
+            $this->addError("资金不足,当前{$currencyType->name}余额 {$balance},需要 {$requiredAmount}");
             return false;
         }