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(); } 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 && OperationsModel::grantMoney($model['first_user_id'], $capital['first_money']); // 发放二级分销商佣金 $model['second_user_id'] > 0 && OperationsModel::grantMoney($model['second_user_id'], $capital['second_money']); // 发放三级分销商佣金 $model['third_user_id'] > 0 && OperationsModel::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; } /** * 获取订单分销佣金数据 * @param $order * @param string $source * @param array $operations * @return array */ protected function getCapitalByOrder($order, $source = 'create',$operations=[]) { $setting = Setting::getItem('bonus', $order['app_id']); // 分销订单佣金数据 $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) { // 商品实付款金额 $productPrice = min($capital['orderPrice'], $product['total_pay_price']); // 计算商品实际佣金 $productCapital = $this->calculateProductCapital($setting, $productPrice,$product); // 累积分销佣金 $capital['first_money'] += $productCapital['first_money']; $capital['second_money'] += $productCapital['second_money']; $capital['third_money'] += $productCapital['third_money']; } return $capital; } /** * 计算商品实际佣金 by yj * @param $setting * @param $productPrice * @return float[]|int[] */ private function calculateProductCapital($setting, $productPrice,$product) { $storeSetting=SettingModel::getItem('store', $product['app_id']); $productMoney=bcmul($productPrice, bcdiv($storeSetting['commission_rate'],100,2), 2); $capital['first_money'] = bcmul($productMoney, bcdiv($setting['province_ratio'],100,2), 2); $capital['second_money'] = bcmul($productMoney, bcdiv($setting['city_ratio'],100,2), 2); $capital['third_money'] = bcmul($productMoney, bcdiv($setting['area_ratio'],100,2), 2); return $capital; } }