IntegralJob.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace app\jobs\integral;
  3. use app\services\user\level\UserLevelServices;
  4. use app\services\user\UserAwardIntegralServices;
  5. use app\services\user\UserServices;
  6. use crmeb\basic\BaseJobs;
  7. use crmeb\traits\QueueTrait;
  8. use think\facade\Log;
  9. /**
  10. * 订单消息队列
  11. * Class OrderJob
  12. * @package app\jobs
  13. */
  14. class IntegralJob extends BaseJobs
  15. {
  16. use QueueTrait;
  17. public function dealOrderIntegral($order)
  18. {
  19. /** @var UserAwardIntegralServices $awardIntegralService */
  20. $awardIntegralService = app()->make(UserAwardIntegralServices::class);
  21. /** @var UserServices $userService */
  22. $userService = app()->make(UserServices::class);
  23. /** @var UserLevelServices $levelServices */
  24. $levelServices = app()->make(UserLevelServices::class);
  25. $user = $userService->getUserInfo($order['uid']);
  26. $integral_price = $awardIntegralService->getPrice($order['id']);
  27. $total_price = $order['total_price'];
  28. return $awardIntegralService->transaction(function () use ($levelServices, $awardIntegralService, $userService, $user, $integral_price, $total_price, $order) {
  29. try {
  30. //添加静态积分
  31. $static_integral_ratio = sys_config('static_integral_ratio', 0);
  32. $give_static_integral = bcdiv(bcmul($total_price, $static_integral_ratio), 100, 2);
  33. if ($give_static_integral > 0) {
  34. $rate = sys_config('static_integral_rate', 3);
  35. $extract_sum = bcmul($total_price, $rate, 2);
  36. $mark = '购买商品,获得静态积分';
  37. $awardIntegralService->incIntegral($order['uid'], $integral_price, $give_static_integral, $total_price, 0, $extract_sum, $order['id'], $mark);
  38. }
  39. //添加奖池
  40. $lake_ratio = sys_config('lake_ratio', 0);
  41. $add_lake = bcdiv(bcmul($total_price, $lake_ratio), 100, 2);
  42. if ($add_lake > 0) {
  43. $mark = '用户' . $order['uid'] . '购买商品,添加资金池';
  44. $awardIntegralService->addLake($add_lake, $order['id'], $mark);
  45. }
  46. //TODO 加动态积分
  47. //推荐奖
  48. $rate = sys_config('action_integral_rate', 3);
  49. $spread = $userService->getUserInfo($user['spread_uid']);
  50. if ($spread) {
  51. if ($awardIntegralService->getPaySum($spread['uid']) >= 1000 || $awardIntegralService->getHourExtractPaySum($spread['uid'], 24) >= 1000) {
  52. $award_ratio = sys_config('recommend_integral', 0);
  53. $give_action_integral = bcdiv(bcmul($total_price, $award_ratio), 100, 2);
  54. if ($give_action_integral > 0) {
  55. $extract_sum = bcmul($give_action_integral, $rate, 2);
  56. $mark = '推荐用户' . $user['nickname'] . "({$user['uid']})" . '购买商品,获得推荐积分';
  57. $awardIntegralService->incIntegral($spread['uid'], $integral_price, $give_action_integral, $total_price, 1, $extract_sum, $order['id'], $mark);
  58. }
  59. }
  60. }
  61. $levelServices->detection((int)$user['uid']);
  62. $pass = [$user['uid']];
  63. $send = 0;
  64. while ($spread && !in_array($spread['uid'], $pass)) {
  65. //先发奖,再结算等级
  66. $level = $levelServices->getUserLevel($spread['uid']);
  67. $ratio = $level['levelInfo']['group_award'] ?? 0;
  68. $give_action_integral = bcdiv(bcmul($total_price, $ratio), 100, 2);
  69. if ($give_action_integral > $send) {
  70. $real_send = bcsub($give_action_integral, $send, 2);
  71. $extract_sum = bcmul($real_send, $rate, 2);
  72. $mark = '团队用户' . $user['nickname'] . "({$user['uid']})" . '购买商品,获得团队级差积分';
  73. $awardIntegralService->incIntegral($spread['uid'], $integral_price, $real_send, $total_price, 1, $extract_sum, $order['id'], $mark);
  74. $send = $give_action_integral;
  75. }
  76. $levelServices->detection((int)$spread['uid']);
  77. $pass[] = $spread['uid'];
  78. $spread = $userService->getUserInfo($spread['spread_uid']);
  79. }
  80. return true;
  81. } catch (\Throwable $e) {
  82. Log::error('处理积分奖池失败,失败原因:' . $e->getMessage());
  83. return false;
  84. }
  85. });
  86. }
  87. /**
  88. * 减积分
  89. * @param int $uid 用户
  90. * @param float $static 静态积分
  91. * @param float $action 动态积分
  92. * @param float $cash 资金池
  93. * @param int $link_id 关联ID
  94. * @param string $mark 备注
  95. */
  96. public function decIntegral(int $uid, float $static, float $action, float $cash, int $link_id = 0, string $mark = '')
  97. {
  98. }
  99. }