BonusLog.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace addons\BlindBox\common\logic;
  3. use addons\BlindBox\common\enums\BlindBoxEnum;
  4. use addons\BlindBox\common\models\BlindBoxBonusLog;
  5. use addons\BlindBox\common\models\BlindBoxBonusLogDetail;
  6. use addons\BlindBox\common\models\BlindBoxGoods;
  7. use addons\BlindBox\common\models\BlindBoxUser;
  8. use common\enums\StatusEnum;
  9. use common\helpers\StringHelper;
  10. class BonusLog
  11. {
  12. //消费计算
  13. public static function compute($mall_id, $user_id, $order_no, $order_detail, $goods_ids, $basic)
  14. {
  15. $t = \Yii::$app->db->beginTransaction();
  16. try {
  17. if (empty($basic['is_enable'])) throw new \Exception('订单编号:' . $order_no . '触发时,系统没有开启奖金盲盒');
  18. if (empty($basic['bonus_nums'])) throw new \Exception('订单编号:' . $order_no . '触发时,订单分红次数为0');
  19. $total_times = $basic['bonus_nums'];
  20. $result = self::getContributionAndProfit($order_detail, $goods_ids, $order_no);
  21. $contribution = $result['contribution'];//本单贡献值
  22. if($contribution<=0) return true;
  23. $profit = $result['profit'];//本单利润值
  24. $list = BlindBoxBonusLog::lists([
  25. 'where' => [
  26. ['mall_id' => $mall_id],
  27. ['status' => StatusEnum::ENABLED],
  28. ['is_feedback' => BlindBoxEnum::NO_FEEDBACK],
  29. ]
  30. ], false);
  31. $total_contribution = array_sum(array_column($list, 'contribution'));
  32. $params = [
  33. 'mall_id' => $mall_id,
  34. 'user_id' => $user_id,
  35. 'order_no' => $order_no,
  36. 'total_times' => $total_times,
  37. 'contribution' => $contribution,
  38. 'type' => BlindBoxEnum::ORDER_CONSUME,
  39. ];
  40. BlindBoxBonusLog::addData($params);
  41. $contribution_value = 0;
  42. if (!empty($total_contribution)) $contribution_value = bcdiv($profit,$total_contribution, 4);
  43. foreach ($list as $item) {
  44. $order_bonus = bcmul($item['contribution'], $contribution_value, 2);
  45. if (empty($order_bonus)) continue;
  46. if ($item['order_no'] == $order_no) continue;
  47. $params = [
  48. 'mall_id' => $mall_id,
  49. 'bonus_log_id' => $item['id'],
  50. 'user_id' => $item['user_id'],
  51. 'order_no' => $order_no,
  52. 'money' => $profit,
  53. 'total_contribution' => $total_contribution,
  54. 'contribution' => $item['contribution'],
  55. 'total_bonus' => bcadd($item['divided_money'], $order_bonus, 2),
  56. 'order_bonus' => $order_bonus,
  57. 'is_settlement' => 0,
  58. ];
  59. $res = BlindBoxBonusLogDetail::addData($params);
  60. if ($res == false) throw new \Exception('订单编号:' . $order_no . '触发时,添加分红记录详情错误' . BlindBoxBonusLogDetail::getStaticError());
  61. $item->divided_times++;
  62. $item->divided_money = bcadd($item->divided_money, $order_bonus,2);
  63. if ($item->divided_times >= $item->total_times) $item->status = StatusEnum::DISABLED;
  64. $res = $item->save();
  65. if ($res == false) throw new \Exception('订单编号:' . $order_no . '触发时,更新分红记录错误' . $item->getErrorMessage());
  66. $params = [
  67. 'mall_id' => $mall_id,
  68. 'user_id' => $item['user_id'],
  69. 'order_bonus' => $order_bonus,
  70. ];
  71. $res = BlindBoxUser::setData($params);
  72. if ($res == false) throw new \Exception('订单编号:' . $order_no . '触发时,更新奖金盲盒用户错误' . BlindBoxUser::getStaticError());
  73. }
  74. $t->commit();
  75. return true;
  76. } catch (\Exception $e) {
  77. $t->rollBack();
  78. \Yii::error($e->getMessage());
  79. return false;
  80. }
  81. }
  82. protected static function getContributionAndProfit($order_detail, $goods_ids, $order_no)
  83. {
  84. $contribution = $profit = 0;
  85. $blind_box_goods_list = BlindBoxGoods::lists(['where' => [['goods_id' => $goods_ids,'status'=>StatusEnum::ENABLED]]]);
  86. if (empty($blind_box_goods_list)) throw new \Exception('订单编号:' . $order_no . '触发时,查询不到该奖金盲盒商品,不用户分红');
  87. foreach ($blind_box_goods_list as $item) {
  88. $temp_contribution = 0;
  89. $temp_profit = 0;
  90. if ($item['contribution_percent'] == 1) {
  91. if (isset($order_detail[$item['goods_id']])) {
  92. $goods_price = $order_detail[$item['goods_id']]['goods_price'];
  93. $temp_contribution = bcdiv($goods_price * $item['contribution'], 100, 2);
  94. }
  95. } else {
  96. $temp_contribution = $item['contribution'];
  97. }
  98. $contribution = bcadd($contribution, $temp_contribution, 2);
  99. if ($item['profit_percent'] == 1) {
  100. if (isset($order_detail[$item['goods_id']])) {
  101. $goods_price = $order_detail[$item['goods_id']]['goods_price'];
  102. $cost_price = $order_detail[$item['goods_id']]['cost_price'];
  103. $temp_profit = bcdiv(($goods_price - $cost_price) * $item['profit'], 100, 2);
  104. if ($temp_profit <= 0) continue;
  105. }
  106. } else {
  107. $temp_profit = $item['profit'];
  108. }
  109. $profit = bcadd($profit, $temp_profit, 2);
  110. }
  111. return ['contribution' => $contribution, 'profit' => $profit];
  112. }
  113. //根据基础配置获取贡献值
  114. public static function getContributionBySetting($mall_id,$user_id,$total_times,$contribution,$type,$prefix='t'){
  115. $params = [
  116. 'mall_id' => $mall_id,
  117. 'user_id' => $user_id,
  118. 'order_no' => StringHelper::generateOrderNo($prefix),
  119. 'total_times' => $total_times,
  120. 'contribution' => $contribution,
  121. 'type' => $type,
  122. ];
  123. $res = BlindBoxBonusLog::addData($params);
  124. if($res==false){
  125. throw new \Exception(BlindBoxBonusLog::getStaticError());
  126. }
  127. return $res;
  128. }
  129. }