| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- <?php
- namespace addons\BlindBox\common\logic;
- use addons\BlindBox\common\enums\BlindBoxEnum;
- use addons\BlindBox\common\models\BlindBoxBonusLog;
- use addons\BlindBox\common\models\BlindBoxBonusLogDetail;
- use addons\BlindBox\common\models\BlindBoxGoods;
- use addons\BlindBox\common\models\BlindBoxUser;
- use common\enums\StatusEnum;
- use common\helpers\StringHelper;
- class BonusLog
- {
- //消费计算
- public static function compute($mall_id, $user_id, $order_no, $order_detail, $goods_ids, $basic)
- {
- $t = \Yii::$app->db->beginTransaction();
- try {
- if (empty($basic['is_enable'])) throw new \Exception('订单编号:' . $order_no . '触发时,系统没有开启奖金盲盒');
- if (empty($basic['bonus_nums'])) throw new \Exception('订单编号:' . $order_no . '触发时,订单分红次数为0');
- $total_times = $basic['bonus_nums'];
- $result = self::getContributionAndProfit($order_detail, $goods_ids, $order_no);
- $contribution = $result['contribution'];//本单贡献值
- if($contribution<=0) return true;
- $profit = $result['profit'];//本单利润值
- $list = BlindBoxBonusLog::lists([
- 'where' => [
- ['mall_id' => $mall_id],
- ['status' => StatusEnum::ENABLED],
- ['is_feedback' => BlindBoxEnum::NO_FEEDBACK],
- ]
- ], false);
- $total_contribution = array_sum(array_column($list, 'contribution'));
- $params = [
- 'mall_id' => $mall_id,
- 'user_id' => $user_id,
- 'order_no' => $order_no,
- 'total_times' => $total_times,
- 'contribution' => $contribution,
- 'type' => BlindBoxEnum::ORDER_CONSUME,
- ];
- BlindBoxBonusLog::addData($params);
- $contribution_value = 0;
- if (!empty($total_contribution)) $contribution_value = bcdiv($profit,$total_contribution, 4);
- foreach ($list as $item) {
- $order_bonus = bcmul($item['contribution'], $contribution_value, 2);
- if (empty($order_bonus)) continue;
- if ($item['order_no'] == $order_no) continue;
- $params = [
- 'mall_id' => $mall_id,
- 'bonus_log_id' => $item['id'],
- 'user_id' => $item['user_id'],
- 'order_no' => $order_no,
- 'money' => $profit,
- 'total_contribution' => $total_contribution,
- 'contribution' => $item['contribution'],
- 'total_bonus' => bcadd($item['divided_money'], $order_bonus, 2),
- 'order_bonus' => $order_bonus,
- 'is_settlement' => 0,
- ];
- $res = BlindBoxBonusLogDetail::addData($params);
- if ($res == false) throw new \Exception('订单编号:' . $order_no . '触发时,添加分红记录详情错误' . BlindBoxBonusLogDetail::getStaticError());
- $item->divided_times++;
- $item->divided_money = bcadd($item->divided_money, $order_bonus,2);
- if ($item->divided_times >= $item->total_times) $item->status = StatusEnum::DISABLED;
- $res = $item->save();
- if ($res == false) throw new \Exception('订单编号:' . $order_no . '触发时,更新分红记录错误' . $item->getErrorMessage());
- $params = [
- 'mall_id' => $mall_id,
- 'user_id' => $item['user_id'],
- 'order_bonus' => $order_bonus,
- ];
- $res = BlindBoxUser::setData($params);
- if ($res == false) throw new \Exception('订单编号:' . $order_no . '触发时,更新奖金盲盒用户错误' . BlindBoxUser::getStaticError());
- }
- $t->commit();
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- \Yii::error($e->getMessage());
- return false;
- }
- }
- protected static function getContributionAndProfit($order_detail, $goods_ids, $order_no)
- {
- $contribution = $profit = 0;
- $blind_box_goods_list = BlindBoxGoods::lists(['where' => [['goods_id' => $goods_ids,'status'=>StatusEnum::ENABLED]]]);
- if (empty($blind_box_goods_list)) throw new \Exception('订单编号:' . $order_no . '触发时,查询不到该奖金盲盒商品,不用户分红');
- foreach ($blind_box_goods_list as $item) {
- $temp_contribution = 0;
- $temp_profit = 0;
- if ($item['contribution_percent'] == 1) {
- if (isset($order_detail[$item['goods_id']])) {
- $goods_price = $order_detail[$item['goods_id']]['goods_price'];
- $temp_contribution = bcdiv($goods_price * $item['contribution'], 100, 2);
- }
- } else {
- $temp_contribution = $item['contribution'];
- }
- $contribution = bcadd($contribution, $temp_contribution, 2);
- if ($item['profit_percent'] == 1) {
- if (isset($order_detail[$item['goods_id']])) {
- $goods_price = $order_detail[$item['goods_id']]['goods_price'];
- $cost_price = $order_detail[$item['goods_id']]['cost_price'];
- $temp_profit = bcdiv(($goods_price - $cost_price) * $item['profit'], 100, 2);
- if ($temp_profit <= 0) continue;
- }
- } else {
- $temp_profit = $item['profit'];
- }
- $profit = bcadd($profit, $temp_profit, 2);
- }
- return ['contribution' => $contribution, 'profit' => $profit];
- }
- //根据基础配置获取贡献值
- public static function getContributionBySetting($mall_id,$user_id,$total_times,$contribution,$type,$prefix='t'){
- $params = [
- 'mall_id' => $mall_id,
- 'user_id' => $user_id,
- 'order_no' => StringHelper::generateOrderNo($prefix),
- 'total_times' => $total_times,
- 'contribution' => $contribution,
- 'type' => $type,
- ];
- $res = BlindBoxBonusLog::addData($params);
- if($res==false){
- throw new \Exception(BlindBoxBonusLog::getStaticError());
- }
- return $res;
- }
- }
|