RebateTwoUserJob.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace App\Jobs;
  3. use App\Constants\ChangeLogConstant;
  4. use App\Model\UserModel;
  5. use App\Model\UserRebateLevelModel;
  6. use App\Model\VipCardModel;
  7. use App\Model\VipOrderModel;
  8. use App\Repositories\ConfigRepoistory;
  9. use App\Repositories\Service\QueueService;
  10. use App\Repositories\UserRepository;
  11. use Carbon\Carbon;
  12. use Hyperf\AsyncQueue\Job;
  13. use Hyperf\DbConnection\Db as DB;
  14. class RebateTwoUserJob extends Job
  15. {
  16. public function __construct($params)
  17. {
  18. // 这里最好是普通数据,不要使用携带 IO 的对象,比如 PDO 对象
  19. $this->params = $params;
  20. }
  21. public function handle()
  22. {
  23. $userInfo = UserModel::query()->where('code', $this->params['user_id'])->first(['parent_uid', 'created_at', 'code']);
  24. if (empty($userInfo->parent_uid) || $userInfo->created_at < '2022-04-28 00:00:00') {
  25. logger('RebateTwoUserJob:用户没有上级,或者注册时间在活动开始之前', [$this->params['user_id']]);
  26. return '';
  27. }
  28. // 查看是否是一次充值
  29. $orderCount = VipOrderModel::query()->where(['user_code' => $userInfo->code, 'status' => 1])->count();
  30. $isOne = false;
  31. if ($orderCount == 1) { // 是否是第一次
  32. $isOne = true;
  33. }
  34. $this->rebateAmountLevel($userInfo->parent_uid, $this->params['amount'], $isOne);
  35. }
  36. public function rebateAmountLevel($parentUid, $amount, $isOne)
  37. {
  38. try {
  39. // 日赚万元规则
  40. $userAgentRule = make(ConfigRepoistory::class)->get('user_agent_rebate_rule', 'rule');
  41. $userAgentRule = json_decode($userAgentRule, true);
  42. $UserRebateInfo = UserRebateLevelModel::query()->where('uid', $parentUid)->first();
  43. $isUp = false;
  44. DB::beginTransaction(); //事物开启
  45. if (empty($UserRebateInfo)) { //第一次生成一条数据
  46. $rebateAmount = round($amount * ($userAgentRule[1]['ratio'] / 100), 2);
  47. $insertdata = [
  48. 'uid' => $parentUid,
  49. 'amount' => $rebateAmount,
  50. 'week_amount' => $rebateAmount,
  51. 'moon_amount' => $rebateAmount,
  52. 'agent_level' => 1,
  53. 'invite_number' => 1,
  54. ];
  55. $res = UserRebateLevelModel::query()->create($insertdata);
  56. if (!$res) {
  57. logger('RebateTwoUserJob->初始规则数据插入失败', $insertdata);
  58. DB::rollBack();
  59. return '';
  60. }
  61. } else {
  62. $agentLevel = $UserRebateInfo->agent_level;
  63. if ($isOne == true) {
  64. $UserRebateInfo->invite_number += 1;
  65. // 计算这个用户是否要升级
  66. if ($userAgentRule[$agentLevel + 1]['mandate'] == $UserRebateInfo->invite_number) { //达到标准生一级
  67. $UserRebateInfo->agent_level += 1;
  68. $isUp = true;
  69. }
  70. }
  71. $rebateAmount = round($amount * ($userAgentRule[$agentLevel]['ratio']) / 100, 2);
  72. $UserRebateInfo->amount += $rebateAmount;
  73. $UserRebateInfo->week_amount += $rebateAmount;
  74. $UserRebateInfo->moon_amount += $rebateAmount;
  75. if (!$UserRebateInfo->save()) {
  76. logger('RebateTwoUserJob->保存反佣数据失败', $UserRebateInfo->toArray());
  77. DB::rollBack();
  78. return '';
  79. }
  80. }
  81. // 反佣
  82. $res1 = UserModel::query()->where('code', $parentUid)->increment('balance', $rebateAmount);
  83. if (!$res1) {
  84. logger('RebateTwoUserJob->用户反佣失败', [$parentUid, $amount]);
  85. DB::rollBack();
  86. return '';
  87. }
  88. // 帐变记录
  89. $changeData = [
  90. 'user_uid' => $parentUid,
  91. 'currency_type' => ChangeLogConstant::CHANGE_AMOUNT,
  92. 'amount' => $rebateAmount,
  93. 'way' => ChangeLogConstant::WAY_1,
  94. 'type' => ChangeLogConstant::TYPE_3,
  95. ];
  96. $res2 = make(QueueService::class)->saveChangeLogJob($changeData);
  97. if (!$res2) {
  98. logger('RebateTwoUserJob->帐变记录失败', $changeData);
  99. DB::rollBack();
  100. return '';
  101. }
  102. DB::commit();
  103. // 升级给会员
  104. if ($isUp == true) {
  105. $vipCardData = VipCardModel::query()->where('id', $UserRebateInfo->agent_level)->first(['day', 'id']);
  106. if (empty($vipCardData)) {
  107. return '';
  108. }
  109. //加会员天数
  110. $userInfo = make(UserRepository::class)->getUserInfoFromCache($parentUid);
  111. if ($userInfo['is_vip'] == 'y') {
  112. $vipTime = Carbon::parse($userInfo['vip_expired'])
  113. ->addDays($vipCardData['day'])
  114. ->toDateTimeString();
  115. } else {
  116. $vipTime = Carbon::now()->addDays($vipCardData['day'])->toDateTimeString();
  117. }
  118. UserModel::query()->where('code', $parentUid)->update(['vip_expired' => $vipTime, 'vip_level' => $vipCardData['id']]);
  119. }
  120. //清除用户信息redis缓存
  121. make(UserRepository::class)->delUserCache($parentUid);
  122. return true;
  123. } catch (\Exception $exception) {
  124. Db::rollBack();
  125. return logger('RebateTwoUserJob' . $exception->getMessage() . $exception->getLine());
  126. }
  127. }
  128. }