ShopBonusJob.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?php
  2. /**
  3. * 商城分红
  4. */
  5. namespace jobs;
  6. use app\controller\v1\Shop;
  7. use app\model\ShopOrderBonusModel as ShopOrderBonus;
  8. use app\model\UserModel as User;
  9. use app\model\UserScoreModel as UserScore;
  10. use app\model\UserAuthLogModel as AuthLog;
  11. use think\facade\Db;
  12. class ShopBonusJob extends BaseJob
  13. {
  14. public function shopBonusJob ($userId, $order)
  15. {
  16. //生成分红订单
  17. Db::startTrans();
  18. try {
  19. $nowTime = date('Y-m-d H:i:s', time());
  20. $user = User::where(['id' => $userId])->findOrEmpty();
  21. if ($user->vip || $user->level) {
  22. $unlockTime = $nowTime;
  23. } else {
  24. $date = date_create($nowTime);
  25. date_add($date, date_interval_create_from_date_string("3 days"));
  26. $unlockTime = date_format($date, 'Y-m-d H:i:s');
  27. }
  28. $parent_user = User::where(['id' => $user->pid])->findOrEmpty();
  29. $indirect = User::where('id', $parent_user->pid)->findOrEmpty();
  30. $user_path_arr = explode(',', $user->path);
  31. array_pop($user_path_arr);
  32. array_pop($user_path_arr);
  33. $user_path_arr = array_reverse($user_path_arr);
  34. foreach ($order as $k => $v) {
  35. $bonus_setting = json_decode($v['rebate_tpl'], true);
  36. if (empty($bonus_setting)) {
  37. break;
  38. }
  39. $rebate_score = $v['total_rebate_score'];
  40. $bonus = ShopOrderBonus::create(
  41. ['uid' => $userId, 'pid' => $user->pid, 'path' => $user->path, 'order_id' => $v['order_id'], 'score' => $v['total_rebate_score'], 'bs' => 1, 'target_uid' => $userId, 'created_time' => $nowTime, 'unlock_time' => $unlockTime, 'estimate_unlock_time' => $unlockTime]
  42. );
  43. if ($parent_user->id) {
  44. $parent_fh = $v['total_rebate_score'] * ($bonus_setting['zt'] / 100); //返直属:20%
  45. ShopOrderBonus::create(
  46. ['uid' => $parent_user->id, 'pid' => $parent_user->pid, 'path' => $parent_user->path, 'order_id' => $v['order_id'], 'score' => $parent_fh, 'bs' => 2, 'weig_id' => $bonus->id, 'level' => 1, 'target_uid' => $userId, 'created_time' => $nowTime, 'unlock_time' => $unlockTime, 'estimate_unlock_time' => $unlockTime]
  47. );
  48. }
  49. if ($indirect->id) { //返间属:10%
  50. $indirect_fh = ($v['total_rebate_score']) * ($bonus_setting['js'] / 100);
  51. if ($indirect->vip) { //间属如果是vip,再返5%
  52. $indirect_fh += ($v['total_rebate_score']) * ($bonus_setting['td'] / 100);
  53. $rebate_score -= $rebate_score * ($bonus_setting['td'] / 100);
  54. //todo::5%内的5%
  55. $indirect_fh_pj = ($v['total_rebate_score']) * ($bonus_setting['td'] / 100);
  56. ShopOrderBonus::where(['id' => $bonus->id])->update(['score' => $rebate_score]);
  57. }
  58. $indirect_bonus = ShopOrderBonus::create(
  59. ['uid' => $indirect->id, 'pid' => $indirect->pid, 'path' => $indirect->path, 'order_id' => $v['order_id'], 'score' => $indirect_fh, 'bs' => 2, 'weig_id' => $bonus->id, 'level' => 2, 'target_uid' => $userId, 'created_time' => $nowTime, 'unlock_time' => $unlockTime, 'estimate_unlock_time' => $unlockTime]
  60. );
  61. }
  62. $level = 2;
  63. $pj = [];
  64. if ($indirect->vip) {
  65. foreach ($user_path_arr as $ks => $vs) {
  66. $puser = User::where(['id' => $vs])->findOrEmpty();
  67. if (!$puser['vip']) { //如上级不为金卡会员,返利截止
  68. break;
  69. } else if ($puser['vip']) {
  70. $level++;
  71. // $indirect_fh *= 0.05; //享由间属下级收益的5%
  72. // $rebate_score -= $indirect_fh;
  73. $indirect_fh_pj *= ($bonus_setting['td'] / 100);//享由间属下级5%的百分之5
  74. if ($level == 3) {
  75. ShopOrderBonus::where(['id' => $indirect_bonus->id, 'uid' => $indirect->id])->dec('score', $indirect_fh_pj)->update();
  76. }
  77. if ($indirect_fh_pj >= 0.0001) {
  78. // ShopOrderBonus::where(['id' => $bonus->id])->update(['score' => $rebate_score]);
  79. // ShopOrderBonus::create(
  80. // ['uid' => $puser->id, 'pid' => $puser->pid, 'path' => $puser->path, 'order_id' => $v['order_id'], 'score' => $indirect_fh, 'bs' => 2, 'weig_id' => $bonus->id, 'level' => $level, 'target_uid' => $userId, 'created_time' => $nowTime, 'unlock_time' => $unlockTime, 'estimate_unlock_time' => $unlockTime]
  81. // );
  82. $pj[] = ['uid' => $puser->id, 'pid' => $puser->pid, 'path' => $puser->path, 'order_id' => $v['order_id'], 'score' => $indirect_fh_pj, 'bs' => 2, 'weig_id' => $bonus->id, 'level' => $level, 'target_uid' => $userId, 'created_time' => $nowTime, 'unlock_time' => $unlockTime, 'estimate_unlock_time' => $unlockTime];
  83. }
  84. }
  85. }
  86. }
  87. if ($pj) {
  88. foreach ($pj as $kp => &$vp) {
  89. if ($kp + 1 < count($pj)) {
  90. $vp['score'] -= $pj[$kp + 1]['score'];
  91. }
  92. }
  93. (new ShopOrderBonus())->insertAll($pj);
  94. }
  95. $user = User::where(['id' => $userId])->findOrEmpty();
  96. User::where(['id' => $userId])->inc('score', $rebate_score)->update();
  97. UserScore::change(['before_score' => $user->score, 'score' => $rebate_score, 'type' => 2, 'uid' => $userId, 'state' => 1]);
  98. }
  99. Db::commit();
  100. return true;
  101. } catch (\Exception $e) {
  102. Db::rollback();
  103. echo $e->getMessage() . $e->getLine();
  104. return false;
  105. }
  106. }
  107. public function ShopBonusInviteQuickenJob ($userId)
  108. {
  109. //从用户下单日开始统计,邀新1位亲友完成实名认证缩短1天→邀新2位亲友完成实名认证缩短2天→邀新10位亲友完成实名认证立即领取(邀新数据不累积)
  110. Db::startTrans();
  111. try {
  112. $shopOrderBonus = new ShopOrderBonus();
  113. $nowTime = date('Y-m-d H:i:s', time());
  114. $data = $shopOrderBonus->where(['uid' => $userId, 'weig_id' => 0, 'bs' => 1, 'receive' => 0])->field('id,created_time,estimate_unlock_time,unlock_time,quicken_task')->where('unlock_time', '>', $nowTime)->select()->toArray();
  115. $weig_bonus = [];
  116. if (empty($data)) {
  117. return true;
  118. }
  119. foreach ($data as $k => &$v) {
  120. $inviteSum = AuthLog::where(['pid' => $userId])->where('auth_time', '>=', strtotime($v['created_time']))->count();
  121. $v['quicken_task'] = $inviteSum;
  122. if ($inviteSum >= 10) {
  123. $v['unlock_time'] = $nowTime;
  124. } else if ($inviteSum >= 2) {
  125. $v['unlock_time'] = dateDay($v['estimate_unlock_time'], '-2');
  126. } else if ($inviteSum >= 1) {
  127. $v['unlock_time'] = dateDay($v['estimate_unlock_time'], '-1');
  128. }
  129. $weig_bonus_arr = ShopOrderBonus::where(['weig_id' => $v['id'], 'bs' => 2])->field('id,unlock_time')->select()->toArray();
  130. foreach ($weig_bonus_arr as $wk => &$wv) {
  131. $wv['unlock_time'] = $v['unlock_time'];
  132. $weig_bonus[] = $wv;
  133. }
  134. }
  135. $shopOrderBonus->saveAll($data);
  136. $shopOrderBonus->saveAll($weig_bonus);
  137. Db::commit();
  138. return true;
  139. } catch (\Exception $e) {
  140. Db::rollback();
  141. return false;
  142. }
  143. }
  144. }