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; } }