RebateUserJob.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace App\Jobs;
  3. use App\Constants\ChangeLogConstant;
  4. use App\Model\RebateOrderMmdel;
  5. use App\Model\UserModel;
  6. use App\Repositories\CommissionRulesRepository;
  7. use App\Repositories\ConfigRepoistory;
  8. use App\Repositories\RebateOrderRepository;
  9. use App\Repositories\Service\CommonService;
  10. use App\Repositories\Service\QueueService;
  11. use App\Repositories\UserLevelRelationRepository;
  12. use App\Repositories\UserRepository;
  13. use Hyperf\AsyncQueue\Job;
  14. use Hyperf\DbConnection\Db;
  15. /**
  16. * 计算返佣
  17. */
  18. class RebateUserJob extends Job
  19. {
  20. public $params;
  21. private $perfRati;
  22. private $rebatRepo;
  23. private $ruleData;
  24. private $amount;
  25. public function __construct($params)
  26. {
  27. // 这里最好是普通数据,不要使用携带 IO 的对象,比如 PDO 对象
  28. $this->params = $params;
  29. }
  30. public function handle()
  31. {
  32. try {
  33. //获取关联等级用户
  34. $userRelationData = make(UserLevelRelationRepository::class)->findBy('uid', $this->params['user_id'], ['relation_uid', 'relation_level']);
  35. if (empty($userRelationData)) {
  36. return '';
  37. }
  38. //获取基础仓库
  39. $this->getBaseRepo($this->params['amount']);
  40. $this->setUserRecursion($userRelationData);
  41. } catch (\Throwable $e) {
  42. logger('CrashLogJob', [$e->getMessage(), 1]);
  43. }
  44. }
  45. /**
  46. * 递归计算佣金和返佣
  47. *
  48. * @param $userRelationData
  49. * @param $ruleData
  50. * @param $perfRatio
  51. * @return void
  52. */
  53. private function setUserRecursion($userRelationData, $relationLevel = 1)
  54. {
  55. //业绩金额
  56. $perfAmount = $this->amount * $this->perfRatio[$relationLevel];
  57. //获取用户累计业绩
  58. $historyPerf = $this->rebatRepo->sumUserTotalPerf($userRelationData->relation_uid);
  59. $perfTotal = $perfAmount + (float)$historyPerf;
  60. //获取用户vip等级
  61. $userVipLevel = $this->userRepo->findBy('code', $userRelationData->relation_uid, ['vip_level']);
  62. //返佣金额
  63. $rebateAmount = $this->getRebateAmount($perfAmount, $this->ruleData, $userVipLevel->vip_level, $perfTotal, $rebateRatio);
  64. $setRebateOrder = [
  65. 'order_sn' => make(CommonService::class)->createOrderSn('RO'),
  66. 'rebate_amount' => $rebateAmount,
  67. 'rebate_ratio' => $rebateRatio,
  68. 'perf_amount' => $perfAmount,
  69. 'perf_ratio' => $this->perfRatio[$relationLevel],
  70. 'uid' => $userRelationData->relation_uid,
  71. 'quilt_uid' => $this->params['user_id'],
  72. 'amount' => $this->amount,
  73. 'user_vip_level' => $userVipLevel->vip_level,
  74. 'rebate_level' => $relationLevel,
  75. 'perf_total' => $perfTotal
  76. ];
  77. Db::beginTransaction();
  78. try {
  79. $result = UserModel::where('code', $userRelationData->relation_uid)->increment('balance', $rebateAmount);
  80. if (!$result) {
  81. Db::rollBack();
  82. return logger('RebateUserJob', [$setRebateOrder, 3]);
  83. }
  84. $result1 = RebateOrderMmdel::insert($setRebateOrder);
  85. if (!$result1) {
  86. Db::rollBack();
  87. return logger('RebateUserJob:', [$setRebateOrder, 4]);
  88. }
  89. Db::commit();
  90. // 帐变流水
  91. $changeData = [
  92. 'user_uid' => $userRelationData->relation_uid,
  93. 'currency_type' => ChangeLogConstant::CHANGE_AMOUNT,
  94. 'amount' => $rebateAmount,
  95. 'way' => ChangeLogConstant::WAY_1,
  96. 'type' => ChangeLogConstant::TYPE_3,
  97. ];
  98. make(QueueService::class)->saveChangeLogJob($changeData);
  99. if ($relationLevel == 4) {
  100. return logger('CrashLogJob', ['本轮返佣计算结束']);
  101. }
  102. $userRelationData = make(UserLevelRelationRepository::class)->findBy('uid', $userRelationData->relation_uid, ['relation_uid', 'relation_level']);
  103. $this->setUserRecursion($userRelationData, ++$relationLevel);
  104. } catch (\Throwable $e) {
  105. logger('CrashLogJob', [$e->getMessage(), 2]);
  106. Db::rollBack();
  107. }
  108. }
  109. /**
  110. * 获取基础仓库信息
  111. *
  112. * @return void
  113. */
  114. private function getBaseRepo($amount)
  115. {
  116. $this->userRepo = make(UserRepository::class);
  117. $this->rebatRepo =make(RebateOrderRepository::class);
  118. $this->amount = $amount;
  119. //佣金规则
  120. $this->ruleData = make(CommissionRulesRepository::class)->all(['min_perf', 'max_perf', 'grade', 'rebate_ratio']);
  121. //业绩比例
  122. $perfRatio = make(ConfigRepoistory::class)->get('perf_ratio', 'rule');
  123. $this->perfRatio = json_decode($perfRatio, true);
  124. }
  125. /**
  126. * 计算返佣金额
  127. *
  128. * @param $amount
  129. * @param $ruleData
  130. * @param $userVipLevel
  131. * @param $rebateRatio
  132. * @return float|int
  133. */
  134. private function getRebateAmount($amount, $ruleData, $userVipLevel, $perfTotal, &$rebateRatio)
  135. {
  136. $rebateAmount = 0;
  137. foreach ($ruleData as $val) {
  138. if ($val['grade'] == $userVipLevel && ($perfTotal > $val['min_perf'] && $perfTotal <= $val['max_perf'])) {
  139. $rebateAmount = sprintf("%01.2f", $amount * $val['rebate_ratio']);
  140. $rebateRatio = $val['rebate_ratio'];
  141. }
  142. }
  143. return $rebateAmount;
  144. }
  145. }