belongsTo('app\common\model\user\User'); } /** * VIP专区用户 * @return \think\model\relation\BelongsTo */ public function vipUser() { return $this->belongsTo('app\common\model\plus\vip\User', 'vip_area_user_id'); } /** * 关联订单主表 * @return \think\model\relation\BelongsTo */ public function orderMaster() { return $this->belongsTo('app\common\model\order\Order', 'order_id'); } /** * 推荐人用户 * @return \think\model\relation\BelongsTo */ public function referee() { return $this->belongsTo('app\common\model\user\User', 'referee_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(); } /** * 获取订单的所有VIP专区订单记录 */ public static function getAllDetailsByOrderId($orderId, $orderType) { return (new static())->where('order_id', '=', $orderId) ->where('order_type', '=', $orderType) ->select(); } /** * 发放VIP专区订单佣金 * @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; } // 获取该订单的所有VIP专区订单记录 $models = self::getAllDetailsByOrderId($order['order_id'], $orderType); if ($models->isEmpty()) { return false; } // 佣金结算天数 $settleDays = Setting::getItem('settlement', $order['app_id'])['settle_days']; $success = false; // 处理每个VIP专区订单 foreach ($models as $model) { // 跳过已结算的订单 if ($model['is_settled'] == 1) { continue; } // 写入结算时间 $deadlineTime = $model['settle_time'] ?: 0; if ($deadlineTime == 0) { $deadlineTime = $order['receipt_time'] + $settleDays * 86400; $model->save([ 'settle_time' => $deadlineTime ]); } // 未到结算时间,跳过 if ($deadlineTime > time()) { continue; } if ($model['vip_area_user_id'] != 0) { User::grantMoney($model['vip_area_user_id'], $model['vip_area_money'], VipAreaTypeEnum::getTypeName()[$model['vip_area_type']]); } // 发放下级收益补贴给下级用户(当下级获得推广佣金或复购佣金时) if ($model['vip_area_type'] == 10 || $model['vip_area_type'] == 20) { // 获取下级用户的推荐人(即上级用户) $superiorUser = UserModel::detail($model['vip_area_user_id']); if ($superiorUser && $superiorUser['referee_id']) { if (UserModel::getOperatingSubsidy($superiorUser['referee_id'],Setting::getItem('basic', $order['app_id']))){ $vipUser = VipUserModel::detail($superiorUser['referee_id']); if (!empty($vipUser)){ if ($vipUser['grade']['operating_subsidy'] > 0) { // 获取补贴比例设置 $subsidyRate = $vipUser['grade']['operating_subsidy']; // 计算下级收益补贴 $subsidyAmount = bcmul($model['vip_area_money'], bcdiv((string)$subsidyRate, '100', 4), 2); User::grantMoney($superiorUser['referee_id'], $subsidyAmount, '下级收益补贴'); // 记录分销订单 self::createDistributionOrder($order, $superiorUser['referee_id'], $subsidyAmount, 'vip_subsidy', $model['vip_area_money']); } } } } } // 发放平台直推佣金(满足直推条件后) //self::grantPlatformCommission($order, $model); // 更新VIP订单记录 $model->save([ 'is_settled' => 1, 'settle_time' => time() ]); $success = true; } return $success; } /** * 发放平台直推佣金(已弃用) * @param $order * @param $model * @return void */ protected static function grantPlatformCommission($order, $model) { // 获取平台直推佣金设置 $setting = Setting::getItem('basic', $order['app_id']); $requiredReferralCount = $setting['referee_buy_count'] ?? 0; // 如果设置了直推条件且用户有推荐人 if ($requiredReferralCount > 0 && $model['vip_area_user_id'] > 0) { // 检查推荐人是否满足直推条件(直推用户数量) $directReferralsCount = UserModel::where('referee_id', '=', $model['vip_area_user_id'])->count(); if ($directReferralsCount >= $requiredReferralCount) { // 计算平台直推佣金 $platformCommissionRate = $setting['platform_commission_rate'] ?? 5; $platformCommissionAmount = bcmul($model['order_price'], bcdiv((string)$platformCommissionRate, '100', 4), 2); // 发放平台直推佣金 User::grantMoney($model['vip_area_user_id'], $platformCommissionAmount, '平台直推佣金'); // 记录分销订单 self::createDistributionOrder($order, $model['vip_area_user_id'], $platformCommissionAmount, 'platform_commission', $model['vip_area_money']); } } } /** * 创建分销订单记录 * @param $order * @param $userId * @param $amount * @param $type * @return bool */ protected static function createDistributionOrder($order, $userId, $amount, $type, $subordinate_money) { // 创建分销订单记录以跟踪各种类型的佣金 $distributionOrder = new self(); $vip_area_type = 0; switch ($type) { case 'vip_subsidy': $vip_area_type = 30; // VIP专区补贴 break; case 'platform_commission': $vip_area_type = 40; // 平台直推佣金 break; } return $distributionOrder->save([ 'user_id' => $userId, 'order_id' => $order['order_id'], 'order_type' => OrderTypeEnum::MASTER, 'order_price' => $order['pay_price'], 'vip_area_user_id' => $userId, 'referee_id' => $order['user_id'], // 被推荐人 'vip_area_money' => $amount, 'subordinate_money' => $subordinate_money, 'team_revenue' => 0, 'vip_area_type' => $vip_area_type, 'is_settled' => 1, 'settle_time' => time(), 'app_id' => $order['app_id'] ]); } /** * 创建VIP专区订单记录 * @param array $order 订单信息数组 * @param int $order_type 订单类型,默认为OrderTypeEnum::MASTER * @return bool|\think\Collection 是否成功创建订单 */ public static function createOrder($order, $order_type = OrderTypeEnum::MASTER) { try { // VIP专区订单模型 $model = new self; // VIP专区基本设置 $setting = Setting::getItem('basic', $order['app_id']); // 是否开启VIP专区功能 if (!$setting['is_open']) { return false; } $data = [ 'user_id' => $order['user_id'], 'order_id' => $order['order_id'], 'order_type' => $order_type, 'order_price' => $order['pay_price'], 'settlement_price' => $order['settlement_price'], 'vip_area_user_id' => 0, 'referee_id' => 0, 'vip_area_money' => 0, 'vip_area_type' => 0, 'is_settled' => 0, 'settle_time' => 0, 'app_id' => $order['app_id'] ]; $list = []; // 计算佣金金额 $orderPrice = bcsub(bcsub($order['pay_price'], $order['express_price'], 2), $order['settlement_price'], 2); //$viewpoint_money = 0; // 获取当前买家的推荐人信息 $userModel = UserModel::detail($order['user_id']); if (!empty($userModel) && !empty($userModel['referee_id'])) { // 检查推荐人是否为VIP专区用户 $vipUser = User::detail($userModel['referee_id']); if ($vipUser) { $data['vip_area_user_id'] = $vipUser['user_id']; $data['referee_id'] = $userModel['referee_id']; // 获取VIP等级设置 $vipGrade = Grade::detail($vipUser['grade_id']); if ($vipGrade) { $config = Setting::getItem('basic', $order['app_id']); $purchase_count = (new self())->getPurchaseCount($order['user_id']); $vip_quantity=0; $product_price_repurchase=0; foreach ($order['product'] as $product) { /*if ($product['is_repurchase'] == 1) { $viewpoint_money = bcadd($viewpoint_money, ($product['is_viewpoint_money'] ? $product['viewpoint_money'] : $vipGrade['viewpoint_money']), 2); }*/ if (in_array($product['product_id'], $config['become__buy_product_ids']) || $product['is_vip']) { // 获取VIP专区商品数量 $vip_quantity = bcadd($vip_quantity, $product['total_num'], 2); // 为每个商品生成分红订单 /*for ($i = 0; $i < $quantity; $i++) { if ($purchase_count == 1) { $list[] = array_merge($data, ['vip_area_type' => 10, 'vip_area_money' => $vipGrade['agent_money'], 'is_vip' => 1, 'purchase_count' => $purchase_count]); $purchase_count++; } else { if ($vipGrade['repurchase_money'] > 0) { $list[] = array_merge($data, ['vip_area_type' => 20, 'vip_area_money' => $vipGrade['repurchase_money'], 'is_vip' => 1, 'purchase_count' => $purchase_count]); $purchase_count++; } } }*/ } //复购专区利润 if($product['is_repurchase']){ $product_price_repurchase=bcadd($product_price_repurchase, bcsub($product['total_pay_price'], $product['total_settlement_price'], 2)); } } if ($vip_quantity>0){ if ($purchase_count == 1) { $list[] = array_merge($data, ['vip_area_type' => 10, 'vip_area_money' => bcmul($vipGrade['agent_money'],$vip_quantity,2), 'is_vip' => 1, 'purchase_count' => $purchase_count]); } else { if ($vipGrade['repurchase_money'] > 0) { $list[] = array_merge($data, ['vip_area_type' => 20, 'vip_area_money' => bcmul($vipGrade['repurchase_money'],$vip_quantity,2), 'is_vip' => 1, 'purchase_count' => $purchase_count]); } } } if ($product_price_repurchase>0){ //复购专区级差奖 if ($setting['jcaward']){ $refereeJc=User::getAllJcUser($userModel['user_id']); foreach ($refereeJc as $v){ if ( (new User())->getViewpointMoneyQualification($v['user_id'], $setting)){ $list[] = array_merge($data, ['vip_area_type' => 70, 'vip_area_money' =>bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2),'vip_area_user_id'=>$v['user_id']]); } } } //复购专区平级奖 if ($setting['pjaward']){ $refereeJc=User::getAllPjUser($userModel['user_id'],$setting['pjaward_level']); foreach ($refereeJc as $v){ if ((new User())->getViewpointMoneyQualification($v['user_id'], $setting)) { $list[] = array_merge($data, ['vip_area_type' => 80, 'vip_area_money' => bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2), 'vip_area_user_id' => $v['user_id']]); } } } } // 检查并处理直推佣金 $directReferralsCount = 0; $user = UserModel::detail($order['user_id']); //见点奖 /* if (!empty($user['referee_id'])) { if ($viewpoint_money > 0 && (new User())->getViewpointMoneyQualification($user['referee_id'], $setting)) { $list[] = array_merge($data, ['vip_area_type' => 60, 'vip_area_money' => $viewpoint_money]); } }*/ $requiredReferralCount = $setting['referee_buy_count'] ?? 0; if (!empty($user['referee_id'])) { // 检查推荐人是否满足直推条件(直推用户数量) $directReferralsCount = UserModel::where('referee_id', '=', $user['referee_id'])->count(); } if ($vipGrade['commission'] > 0 && $directReferralsCount >= $requiredReferralCount && $orderPrice > 0) { // 计算平台直推佣金金额 $commissionAmount = bcmul($orderPrice, bcdiv($vipGrade['commission'], '100', 4), 2); $list[] = array_merge($data, ['vip_area_type' => 40, 'vip_area_money' => $commissionAmount]); } } } } // 处理供应商推荐人佣金 if ($order['supplier']['referee_id'] != 0) { $supplierReferee = VipUserModel::detail($order['supplier']['referee_id']); if ($supplierReferee) { $vipGradeSupplier = Grade::detail($supplierReferee['grade_id']); if ($vipGradeSupplier['supplier_money'] > 0 && $orderPrice > 0) { // 计算直推店铺交易额佣金金额 $supplier_money = bcmul($orderPrice, bcdiv($vipGrade['supplier_money'], '100', 4), 2); $list[] = array_merge($data, ['vip_area_type' => 50, 'vip_area_money' => $supplier_money, 'vip_area_user_id' => $supplierReferee['user_id'], 'referee_id' => $supplierReferee['referee_id']]); } } } log_write($list); if (empty($list)) { return true; } // 保存VIP专区订单记录 return $model->saveAll($list); } catch (\Exception $e) { log_write('创建VIP专区订单失败:' . $e->getMessage()); return false; } } public function getPurchaseCount($user_id) { return self::where(['user_id' => $user_id, 'is_vip' => 1,'is_invalid'=>0])->count() + 1; } }