Reward.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. namespace app\common\Service\Commission;
  3. use app\common\model\commission\Log as LogModel;
  4. use app\common\model\commission\Order as OrderModel;
  5. use app\common\model\commission\Reward as RewardModel;
  6. use app\common\model\User as UserModel;
  7. use app\common\Service\Wallet as WalletService;
  8. /**
  9. * 结算奖金
  10. */
  11. class Reward
  12. {
  13. protected $event = '';
  14. /**
  15. * 执行奖金计划,直接派发佣金
  16. *
  17. * @param string $event 分佣的事件
  18. */
  19. public function __construct($event)
  20. {
  21. $this->event = $event;
  22. }
  23. /**
  24. * 执行奖金计划, 派发整单佣金
  25. *
  26. * @param mixed $commissionOrder|$commissionOrderId 分销订单
  27. */
  28. public function runCommissionRewardByOrder($commissionOrder)
  29. {
  30. if (is_numeric($commissionOrder)) {
  31. $commissionOrder = OrderModel::find($commissionOrder);
  32. }
  33. // 未找到分销订单
  34. if (!$commissionOrder) {
  35. return false;
  36. }
  37. // 已经操作过了
  38. if ($commissionOrder['commission_reward_status'] !== RewardModel::COMMISSION_REWARD_STATUS_PENDING) {
  39. return false;
  40. }
  41. $rewardEvent = $commissionOrder['reward_event'];
  42. // 不满足分佣事件
  43. if ($rewardEvent !== $this->event && $this->event !== 'admin') {
  44. return false;
  45. }
  46. // 更新分销订单结算状态
  47. $commissionOrder->commission_reward_status = RewardModel::COMMISSION_REWARD_STATUS_ACCOUNTED;
  48. $commissionOrder->commission_time = time();
  49. $commissionOrder->save();
  50. // 防止重复添加佣金
  51. $commissionRewards = RewardModel::where([
  52. 'commission_order_id' => $commissionOrder['id'],
  53. 'status' => RewardModel::COMMISSION_REWARD_STATUS_PENDING,
  54. ])->select();
  55. // 添加分销商收益、余额添加钱包、更新分销佣金结算状态、提醒分销商到账
  56. if (count($commissionRewards) > 0) {
  57. foreach ($commissionRewards as $commissionReward) {
  58. $this->runCommissionReward($commissionReward);
  59. }
  60. }
  61. return true;
  62. }
  63. /**
  64. * 执行奖金计划,直接派发佣金
  65. *
  66. * @param mixed $commissionReward|$commissionRewardId 奖金记录
  67. */
  68. public function runCommissionReward($commissionReward)
  69. {
  70. if (is_numeric($commissionReward)) {
  71. $commissionReward = RewardModel::find($commissionReward);
  72. }
  73. // 未找到奖金记录
  74. if (!$commissionReward) {
  75. return false;
  76. }
  77. if ($commissionReward->status == RewardModel::COMMISSION_REWARD_STATUS_PENDING) {
  78. $rewardAgent = new Agent($commissionReward->agent_id);
  79. if ($rewardAgent->isAgentAvaliable()) {
  80. $rewardAgent->agent->setInc('total_income', $commissionReward->commission);
  81. $commissionReward->status = RewardModel::COMMISSION_REWARD_STATUS_ACCOUNTED;
  82. $commissionReward->commission_time = time();
  83. $commissionReward->save();
  84. WalletService::change($rewardAgent->user, $commissionReward->type, $commissionReward->commission, 'reward_income', $commissionReward);
  85. LogModel::add($rewardAgent->user->id, 'reward', [
  86. 'type' => $this->event,
  87. 'reward' => $commissionReward
  88. ]);
  89. }
  90. }
  91. return true;
  92. }
  93. /**
  94. * 扣除/取消 分销订单
  95. *
  96. * @param mixed $commissionOrder|$commissionOrderId 分销订单
  97. * @param array $deductOrderMoney 扣除分销商的订单业绩 默认扣除
  98. * @param array $deleteReward 扣除分销订单奖金 默认扣除
  99. */
  100. public function backCommissionRewardByOrder($commissionOrder, $deductOrderMoney = true, $deleteReward = true)
  101. {
  102. if ($this->event !== 'admin' && $this->event !== 'refund') {
  103. return false;
  104. }
  105. if ($this->event === 'refund') {
  106. $config = new Config();
  107. $deductOrderMoney = $config->getRefundCommissionOrder();
  108. $deleteReward = $config->getRefundCommissionReward();
  109. }
  110. if (!$deductOrderMoney && !$deleteReward) {
  111. return false;
  112. }
  113. if (is_numeric($commissionOrder)) {
  114. $commissionOrder = OrderModel::find($commissionOrder);
  115. }
  116. // 未找到分销订单
  117. if (!$commissionOrder) {
  118. return false;
  119. }
  120. // 扣除分销商的订单业绩
  121. if ($deductOrderMoney) {
  122. // 变更分销订单状态
  123. if ($commissionOrder->commission_order_status == OrderModel::COMMISSION_ORDER_STATUS_YES) { // 扣除
  124. $commissionOrder->commission_order_status = OrderModel::COMMISSION_ORDER_STATUS_BACK;
  125. $commissionOrder->save();
  126. $orderAgent = new Agent($commissionOrder->agent_id);
  127. // 扣除分销订单业绩
  128. if($commissionOrder->self_buy) {
  129. $orderAgent->agent->setDec('child_order_money_0', $commissionOrder->amount);
  130. $orderAgent->agent->setDec('child_order_count_0', 1);
  131. }else {
  132. $orderAgent->agent->setDec('child_order_money_1', $commissionOrder->amount);
  133. $orderAgent->agent->setDec('child_order_count_1', 1);
  134. }
  135. // 重新计算分销链条业绩
  136. $orderAgent->createAsyncAgentUpgrade();
  137. LogModel::add($orderAgent->user->id, 'order', [
  138. 'type' => $this->event,
  139. 'order' => $commissionOrder,
  140. 'buyer' => UserModel::find($commissionOrder->buyer_id)
  141. ]);
  142. }
  143. if ($commissionOrder->commission_order_status == OrderModel::COMMISSION_ORDER_STATUS_NO) { // 取消
  144. $commissionOrder->commission_order_status = OrderModel::COMMISSION_ORDER_STATUS_CANCEL;
  145. $commissionOrder->save();
  146. }
  147. }
  148. // 变更分销订单佣金执行状态
  149. if ($deleteReward) {
  150. if ($commissionOrder->commission_reward_status == RewardModel::COMMISSION_REWARD_STATUS_ACCOUNTED) { // 扣除
  151. $commissionOrder->commission_reward_status = RewardModel::COMMISSION_REWARD_STATUS_BACK;
  152. $commissionOrder->save();
  153. // 防止重复扣除佣金
  154. $commissionRewards = RewardModel::where([
  155. 'commission_order_id' => $commissionOrder->id,
  156. 'status' => RewardModel::COMMISSION_REWARD_STATUS_ACCOUNTED,
  157. ])->select();
  158. if (count($commissionRewards) > 0) {
  159. // 扣除分销佣金
  160. foreach ($commissionRewards as $commissionReward) {
  161. $this->backCommissionReward($commissionReward);
  162. }
  163. }
  164. }
  165. }
  166. if ($commissionOrder->commission_reward_status == RewardModel::COMMISSION_REWARD_STATUS_PENDING) { // 取消
  167. $commissionOrder->commission_reward_status = RewardModel::COMMISSION_REWARD_STATUS_CANCEL;
  168. $commissionOrder->save();
  169. $commissionRewards = RewardModel::where([
  170. 'commission_order_id' => $commissionOrder->id,
  171. 'status' => RewardModel::COMMISSION_REWARD_STATUS_PENDING
  172. ])->select();
  173. // 取消分销佣金
  174. if (count($commissionRewards) > 0) {
  175. foreach ($commissionRewards as $commissionReward) {
  176. $this->cancelCommissionReward($commissionReward);
  177. }
  178. }
  179. }
  180. return true;
  181. }
  182. /**
  183. * 扣除单笔分销佣金
  184. *
  185. * @param mixed $commissionReward|$commissionRewardId 奖金记录
  186. */
  187. public function backCommissionReward($commissionReward)
  188. {
  189. if (is_numeric($commissionReward)) {
  190. $commissionReward = RewardModel::find($commissionReward);
  191. }
  192. // 未找到奖金记录
  193. if (!$commissionReward) {
  194. return false;
  195. }
  196. if ($commissionReward->status == RewardModel::COMMISSION_REWARD_STATUS_ACCOUNTED) {
  197. $rewardAgent = new Agent($commissionReward->agent_id);
  198. if ($rewardAgent->agent->total_income < $commissionReward->commission) {
  199. $rewardAgent->agent->total_income = 0;
  200. $rewardAgent->agent->save();
  201. } else {
  202. $rewardAgent->agent->setDec('total_income', $commissionReward->commission);
  203. }
  204. WalletService::change($rewardAgent->user, $commissionReward->type, -$commissionReward->commission, 'reward_back', $commissionReward);
  205. $commissionReward->status = RewardModel::COMMISSION_REWARD_STATUS_BACK;
  206. $commissionReward->save();
  207. LogModel::add($rewardAgent->user->id, 'reward', [
  208. 'type' => $this->event,
  209. 'reward' => $commissionReward,
  210. ]);
  211. }
  212. return true;
  213. }
  214. /**
  215. * 取消单笔分销佣金
  216. *
  217. * @param mixed $commissionReward|$commissionRewardId 奖金记录
  218. */
  219. public function cancelCommissionReward($commissionReward)
  220. {
  221. if (is_numeric($commissionReward)) {
  222. $commissionReward = RewardModel::find($commissionReward);
  223. }
  224. // 未找到奖金记录
  225. if (!$commissionReward) {
  226. return false;
  227. }
  228. if ($commissionReward->status == RewardModel::COMMISSION_REWARD_STATUS_PENDING) {
  229. $commissionReward->status = RewardModel::COMMISSION_REWARD_STATUS_CANCEL;
  230. $commissionReward->save();
  231. $rewardAgent = new Agent($commissionReward->agent_id);
  232. LogModel::add($rewardAgent->user->id, 'reward', [
  233. 'type' => $this->event,
  234. 'reward' => $commissionReward,
  235. ]);
  236. }
  237. return true;
  238. }
  239. }