belongsTo('app\common\model\user\User'); } /** * 一级分销商用户 * @return \think\model\relation\BelongsTo */ public function agentFirst() { return $this->belongsTo('app\common\model\user\User', 'first_user_id'); } /** * 二级分销商用户 * @return \think\model\relation\BelongsTo */ public function agentSecond() { return $this->belongsTo('app\common\model\user\User', 'second_user_id'); } /** * 三级分销商用户 * @return \think\model\relation\BelongsTo */ public function agentThird() { return $this->belongsTo('app\common\model\user\User', 'third_user_id'); } /** * 订单类型 * @param $value * @return array */ public function getOrderTypeAttr($value) { $types = OrderTypeEnum::getTypeName(); return ['text' => $types[$value], 'value' => $value]; } /** * 订单详情 */ public static function getDetailByOrderId($orderId, $orderType) { return (new static())->where('order_id', '=', $orderId) ->where('order_type', '=', $orderType) ->find(); } /** * 发放分销订单佣金 * @param $order * @param int $orderType * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function grantMoney($order, $orderType = OrderTypeEnum::MASTER) { // 订单是否已完成 if ($order['order_status']['value'] != 30) { return false; } // 分销订单详情 $model = self::getDetailByOrderId($order['order_id'], $orderType); if (!$model || $model['is_settled'] == 1) { return false; } // 佣金结算天数 $settleDays = Setting::getItem('settlement', $order['app_id'])['settle_days']; // 写入结算时间 $deadlineTime = $model['settle_end_time']; if($deadlineTime == 0){ $deadlineTime = $order['receipt_time'] + $settleDays * 86400; $model->save([ 'settle_end_time' => $deadlineTime ]); } if ($deadlineTime > time()) { return false; } // 重新计算分销佣金 $capital = $model->getCapitalByOrder($order); // 发放一级分销商佣金 $model['first_user_id'] > 0 && User::grantMoney($model['first_user_id'], $capital['first_money']); // 发放二级分销商佣金 $model['second_user_id'] > 0 && User::grantMoney($model['second_user_id'], $capital['second_money']); // 发放三级分销商佣金 $model['third_user_id'] > 0 && User::grantMoney($model['third_user_id'], $capital['third_money']); // 更新分销订单记录 $model->save([ 'order_price' => $capital['orderPrice'], 'first_money' => $model['first_user_id'] > 0? $capital['first_money']:0, 'second_money' => $model['second_user_id'] > 0? $capital['second_money']:0, 'third_money' => $model['third_user_id'] > 0? $capital['third_money']:0, 'is_settled' => 1, 'settle_time' => time() ]); event('AgentUserGrade', $model['first_user_id']); event('AgentUserGrade', $model['second_user_id']); event('AgentUserGrade', $model['third_user_id']); // 更新队长等级 by lyzflash event('TeamUserGrade', $model['first_user_id']); event('TeamUserGrade', $model['second_user_id']); event('TeamUserGrade', $model['third_user_id']); // 更新股东等级 by lyzflash event('ShareholderUserGrade', $model['first_user_id']); event('ShareholderUserGrade', $model['second_user_id']); event('ShareholderUserGrade', $model['third_user_id']); return true; } /** * 计算订单分销佣金 by yj * @param $order * @return array */ protected function getCapitalByOrder($order, $source = 'create',$agentUser=[]) { // 分销佣金设置 $setting = Setting::getItem('commission', $order['app_id']); $basicSetting = Setting::getItem('basic', $order['app_id']); $setting['commission_type'] = $basicSetting['commission_type']; $setting['loop_num'] = $basicSetting['loop_num']; // 分销层级 $level = Setting::getItem('basic', $order['app_id'])['level']; // 分销订单佣金数据 $capital = [ // 订单总金额(不含运费) 'orderPrice' => bcsub($order['pay_price'], $order['express_price'], 2), // 一级分销佣金 'first_money' => 0.00, // 二级分销佣金 'second_money' => 0.00, // 三级分销佣金 'third_money' => 0.00, // 是否记录 'is_record' => true ]; $total_count = count($order['product']); // 计算分销佣金 foreach ($order['product'] as $product) { // 判断商品是否开放分销 if(ProductModel::detail($product['product_id'])['is_agent'] == 0 && $source == 'create'){ $total_count--; continue; } // 判断商品存在售后退款则不计算佣金 if ($this->checkProductRefund($product)) { continue; } // 判断复购商品是否计算佣金 by lyzflash if ($basicSetting['buy_again'] == 0 && OrderModel::getHasBuyProductNum($order['user_id'], $product['product_id'], true, $order['order_id'])) { continue; } // 商品实付款金额 $productPrice = min($capital['orderPrice'], $product['total_pay_price']); // 计算商品实际佣金 $productCapital = $this->calculateProductCapital($setting, $product, $productPrice,$agentUser); // 累积分销佣金 $level >= 1 && $capital['first_money'] += $productCapital['first_money']; $level >= 2 && $capital['second_money'] += $productCapital['second_money']; $level == 3 && $capital['third_money'] += $productCapital['third_money']; } if($total_count == 0){ $capital['is_record'] = false; } return $capital; } /** * 计算商品实际佣金 by yj * @param $setting * @param $product * @param $productPrice * @return float[]|int[] */ private function calculateProductCapital($setting, $product, $productPrice,$agentUser=[]) { if($agentUser){ $user_id=$agentUser['user_id']; $first_user_id=$agentUser['first_user_id'];; $second_user_id=$agentUser['second_user_id']; $third_user_id=$agentUser['third_user_id']; }else{ $user_id=$this['user_id']; $first_user_id=$this['first_user_id']; $second_user_id=$this['second_user_id']; $third_user_id=$this['third_user_id']; } $first_user = AgentUserModel::detail($first_user_id, ['grade']); //log_write($first_user['grade']); // 如果循环比例 by lyzflash //log_write('Order_user_id:' . $this['user_id']); $true_number = 0; if ($setting['commission_type'] && $setting['loop_num'] > 1) { // 计算买家在推荐关系中的排位 by yj if ($first_user_id == $user_id) { // 如果是自购分佣 $true_number = 0; } else { $referee_number = AgentRefereeModel::getSortNumber($user_id); log_write('referee_number:'.$referee_number); if ($referee_number <= $setting['loop_num']) { $true_number = $referee_number; } else { //$true_number = floor(($referee_number - $setting['loop_num']) / $setting['loop_num']); $true_number = $referee_number % $setting['loop_num']; if ($true_number==0) { $true_number = $setting['loop_num']; } } $true_number = $true_number - 1; } // 如果不是默认等级 if (!$first_user['grade']['is_default']) { $first_loop_percent = $first_user['grade']['first_loop_percent']; $first_percent = $first_loop_percent[$true_number]['ratio']; } else { $first_percent = 0; } } else { $first_percent = empty($first_user['grade']) ? 0 :$first_user['grade']['first_percent']; } // log_write('true_number:'.$true_number); // log_write('first_percent:'.$first_percent); $second_user = AgentUserModel::detail($second_user_id, ['grade']); $third_user = AgentUserModel::detail($third_user_id, ['grade']); $second_percent = empty($second_user['grade']) ? 0 :$second_user['grade']['second_percent']; $third_percent = empty($third_user['grade']) ? 0 :$third_user['grade']['third_percent']; $add_first_money = $productPrice * ($first_percent * 0.01); $add_second_money = $productPrice * ($second_percent * 0.01); $add_third_money = $productPrice * ($third_percent * 0.01); $agent_product = AgentProductModel::detail($product['product_id']); // 全局分销 if (!empty($agent_product) && $agent_product['is_ind_agent'] == false) { if ($setting['commission_type'] && $setting['loop_num'] > 1) { $setting_first_percent = $setting['first_loop_money'][$true_number]['ratio']; } else { $setting_first_percent = $setting['first_money']; } // 全局分销比例 return [ 'first_money' => $productPrice * ($setting_first_percent * 0.01) + $add_first_money, 'second_money' => $productPrice * ($setting['second_money'] * 0.01) + $add_second_money, 'third_money' => $productPrice * ($setting['third_money'] * 0.01) + $add_third_money ]; } // 商品单独分销 if (!empty($agent_product) && $agent_product['agent_money_type'] == 10) { // 如果循环比例,所有等级仅获得单独设置的佣金 if ($setting['commission_type'] && $setting['loop_num'] > 1) { $add_first_money = $add_second_money = $add_third_money = 0; } // 分销佣金类型:百分比 return [ 'first_money' => $productPrice * ($agent_product['first_money'] * 0.01) + $add_first_money, 'second_money' => $productPrice * ($agent_product['second_money'] * 0.01) + $add_second_money, 'third_money' => $productPrice * ($agent_product['third_money'] * 0.01) + $add_third_money ]; } elseif(!empty($agent_product)) { return [ 'first_money' => $product['total_num'] * $agent_product['first_money'] + $add_first_money, 'second_money' => $product['total_num'] * $agent_product['second_money'] + $add_second_money, 'third_money' => $product['total_num'] * $agent_product['third_money'] + $add_third_money ]; } return [ 'first_money' => 0, 'second_money' => 0, 'third_money' => 0 ]; } /** * 验证商品是否存在售后 * @param $product * @return bool */ private function checkProductRefund($product) { return !empty($product['refund']) && $product['refund']['type']['value'] != 20 && $product['refund']['is_agree']['value'] != 20; } }