Просмотр исходного кода

修复Transfer模块手续费计算问题

问题描述:
- 订单67的手续费异常,房屋等级4的用户只收了1%手续费,应该收30%

根本原因:
- TransferApp模型的calculateOutFee方法没有使用事件机制
- TransferLogic调用calculateOutFee时没有传递用户ID到context
- URS监听器只在费率更优惠时才应用,逻辑错误

修复内容:
1. 修改TransferApp::calculateOutFee使用FeeService触发事件机制
2. 在TransferLogic中传递用户ID到手续费计算context
3. 修正URS监听器逻辑,应用正确费率而非只在优惠时应用

测试结果:
- 房屋等级4用户现在正确收取30%手续费
- 事件机制正常工作,监听器成功调整费率
- 向后兼容,不影响现有功能
AI Assistant 6 месяцев назад
Родитель
Сommit
3751f0dd

+ 2 - 2
app/Module/Transfer/Logics/TransferLogic.php

@@ -134,7 +134,7 @@ class TransferLogic
         $validation->validated();
 
         // 计算手续费(基于内部金额)
-        $feeInfo = $app->calculateOutFee($amount);
+        $feeInfo = $app->calculateOutFee($amount, ['user_id' => $data['user_id']]);
 
         // 生成外部订单ID
         $outOrderId = self::generateOutOrderId('OUT');
@@ -283,7 +283,7 @@ class TransferLogic
         }
 
         // 计算手续费
-        $feeInfo = $app->calculateOutFee($amount);
+        $feeInfo = $app->calculateOutFee($amount, ['user_id' => $data['user_id']]);
 
         // 生成外部订单ID
         $outOrderId = self::generateOutOrderId('OUT');

+ 4 - 2
app/Module/Transfer/Models/TransferApp.php

@@ -246,11 +246,13 @@ class TransferApp extends ModelCore
      * 计算转出手续费
      *
      * @param string $amount 转出金额
+     * @param array $context 额外的上下文数据(包含用户ID等信息)
      * @return array ['fee_rate' => 手续费率, 'fee_amount' => 手续费金额, 'actual_amount' => 用户总支付金额]
      */
-    public function calculateOutFee(string $amount): array
+    public function calculateOutFee(string $amount, array $context = []): array
     {
-        return $this->calculateOutFeeWithExtraCharge($amount, $this->fee_out_rate, $this->fee_out_min, $this->fee_out_max);
+        // 使用FeeService来计算手续费,这样可以触发事件机制
+        return \App\Module\Transfer\Services\FeeService::calculateOutFee($this, $amount, $context);
     }
 
     /**

+ 9 - 8
app/Module/UrsPromotion/Listeners/UrsTransferFeeListener.php

@@ -40,20 +40,20 @@ class UrsTransferFeeListener
 
             // 获取URS推广模块的最优手续费率
             $ursFeeRate = UrsTransferFeeService::getBestFeeRateForUser($userId);
-            
-            // 如果URS费率更优惠,则应用新的费率
-            if ($ursFeeRate < $event->feeRate) {
+
+            // 应用URS费率(无论是否更优惠,都应该按照房屋等级收取相应费率)
+            if ($ursFeeRate !== $event->feeRate) {
                 $oldFeeRate = $event->feeRate;
                 $oldFeeAmount = $event->feeAmount;
-                
+
                 // 修改手续费率
                 $event->modifyFeeRate(
                     $ursFeeRate,
-                    'URS推广模块优惠费率',
+                    'URS推广模块根据房屋等级调整费率',
                     'UrsPromotionModule'
                 );
 
-                Log::info('URS转出手续费优惠已应用', [
+                Log::info('URS转出手续费已调整', [
                     'user_id' => $userId,
                     'app_id' => $event->app->id,
                     'amount' => $event->amount,
@@ -61,10 +61,11 @@ class UrsTransferFeeListener
                     'new_fee_rate' => $ursFeeRate,
                     'old_fee_amount' => $oldFeeAmount,
                     'new_fee_amount' => $event->feeAmount,
-                    'discount_amount' => bcsub($oldFeeAmount, $event->feeAmount, 4)
+                    'adjustment_type' => $ursFeeRate > $oldFeeRate ? 'increase' : 'decrease',
+                    'adjustment_amount' => bcsub($event->feeAmount, $oldFeeAmount, 4)
                 ]);
             } else {
-                Log::debug('URS转出手续费无优惠', [
+                Log::debug('URS转出手续费无需调整', [
                     'user_id' => $userId,
                     'app_id' => $event->app->id,
                     'current_fee_rate' => $event->feeRate,