UrsTransferFeeService.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. namespace App\Module\UrsPromotion\Services;
  3. use App\Module\UrsPromotion\Logics\UrsTransferFeeLogic;
  4. use App\Module\UrsPromotion\Dtos\UrsTransferFeeConfigDto;
  5. use Illuminate\Support\Facades\Log;
  6. /**
  7. * URS转账手续费服务
  8. *
  9. * 对外提供URS推广模块的转入/转出手续费相关服务接口
  10. */
  11. class UrsTransferFeeService
  12. {
  13. /**
  14. * 根据用户ID获取最优手续费率
  15. *
  16. * @param int $userId 农场用户ID
  17. * @param string $transferType 转账类型:'in'转入,'out'转出
  18. * @return float 手续费率
  19. */
  20. public static function getBestFeeRateForUser(int $userId, string $transferType = 'out'): float
  21. {
  22. try {
  23. $logic = new UrsTransferFeeLogic();
  24. return $logic->getBestFeeRateForUser($userId, $transferType);
  25. } catch (\Exception $e) {
  26. Log::error('URS转账手续费率获取失败', [
  27. 'user_id' => $userId,
  28. 'transfer_type' => $transferType,
  29. 'error' => $e->getMessage(),
  30. 'trace' => $e->getTraceAsString()
  31. ]);
  32. // 返回默认费率(转入通常免费,转出5%)
  33. return $transferType === 'in' ? 0.0 : 0.05;
  34. }
  35. }
  36. /**
  37. * 根据房屋等级和达人等级计算最优手续费率
  38. *
  39. * @param int $houseLevel 房屋等级
  40. * @param int $talentLevel 达人等级
  41. * @param string $transferType 转账类型:'in'转入,'out'转出
  42. * @return float 手续费率
  43. */
  44. public static function calculateBestFeeRate(int $houseLevel, int $talentLevel, string $transferType = 'out'): float
  45. {
  46. try {
  47. $logic = new UrsTransferFeeLogic();
  48. return $logic->calculateBestFeeRate($houseLevel, $talentLevel, $transferType);
  49. } catch (\Exception $e) {
  50. Log::error('URS转账手续费率计算失败', [
  51. 'house_level' => $houseLevel,
  52. 'talent_level' => $talentLevel,
  53. 'transfer_type' => $transferType,
  54. 'error' => $e->getMessage(),
  55. 'trace' => $e->getTraceAsString()
  56. ]);
  57. // 返回默认费率(转入通常免费,转出5%)
  58. return $transferType === 'in' ? 0.0 : 0.05;
  59. }
  60. }
  61. /**
  62. * 获取所有手续费配置
  63. *
  64. * @return array<UrsTransferFeeConfigDto>
  65. */
  66. public static function getAllConfigs(): array
  67. {
  68. try {
  69. $logic = new UrsTransferFeeLogic();
  70. return $logic->getAllConfigs();
  71. } catch (\Exception $e) {
  72. Log::error('获取URS转出手续费配置失败', [
  73. 'error' => $e->getMessage(),
  74. 'trace' => $e->getTraceAsString()
  75. ]);
  76. return [];
  77. }
  78. }
  79. /**
  80. * 清除用户手续费率缓存
  81. *
  82. * @param int $userId 农场用户ID
  83. * @return void
  84. */
  85. public static function clearUserFeeRateCache(int $userId): void
  86. {
  87. try {
  88. $logic = new UrsTransferFeeLogic();
  89. $logic->clearUserFeeRateCache($userId);
  90. Log::info('URS转出手续费率缓存已清除', [
  91. 'user_id' => $userId
  92. ]);
  93. } catch (\Exception $e) {
  94. Log::error('清除URS转出手续费率缓存失败', [
  95. 'user_id' => $userId,
  96. 'error' => $e->getMessage()
  97. ]);
  98. }
  99. }
  100. /**
  101. * 清除所有手续费率缓存
  102. *
  103. * @return void
  104. */
  105. public static function clearAllFeeRateCache(): void
  106. {
  107. try {
  108. $logic = new UrsTransferFeeLogic();
  109. $logic->clearAllFeeRateCache();
  110. Log::info('所有URS转出手续费率缓存已清除');
  111. } catch (\Exception $e) {
  112. Log::error('清除所有URS转出手续费率缓存失败', [
  113. 'error' => $e->getMessage()
  114. ]);
  115. }
  116. }
  117. /**
  118. * 获取用户的手续费优惠信息
  119. *
  120. * @param int $userId 农场用户ID
  121. * @return array 包含手续费率、优惠信息等
  122. */
  123. public static function getUserFeeInfo(int $userId): array
  124. {
  125. try {
  126. $logic = new UrsTransferFeeLogic();
  127. // 获取用户的最优手续费率
  128. $feeRate = $logic->getBestFeeRateForUser($userId);
  129. // 获取默认费率用于比较
  130. $defaultRate = 0.05; // 5%
  131. // 计算优惠幅度
  132. $discountAmount = $defaultRate - $feeRate;
  133. $discountPercentage = $defaultRate > 0 ? ($discountAmount / $defaultRate) * 100 : 0;
  134. return [
  135. 'fee_rate' => $feeRate,
  136. 'fee_rate_percentage' => number_format($feeRate * 100, 2) . '%',
  137. 'default_rate' => $defaultRate,
  138. 'default_rate_percentage' => number_format($defaultRate * 100, 2) . '%',
  139. 'discount_amount' => $discountAmount,
  140. 'discount_percentage' => number_format($discountPercentage, 2) . '%',
  141. 'has_discount' => $feeRate < $defaultRate,
  142. ];
  143. } catch (\Exception $e) {
  144. Log::error('获取用户手续费优惠信息失败', [
  145. 'user_id' => $userId,
  146. 'error' => $e->getMessage()
  147. ]);
  148. // 返回默认信息
  149. return [
  150. 'fee_rate' => 0.05,
  151. 'fee_rate_percentage' => '5.00%',
  152. 'default_rate' => 0.05,
  153. 'default_rate_percentage' => '5.00%',
  154. 'discount_amount' => 0,
  155. 'discount_percentage' => '0.00%',
  156. 'has_discount' => false,
  157. ];
  158. }
  159. }
  160. }