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']]); } // 发放VIP专区补贴给下级用户(当下级获得推广佣金或复购佣金时) if ($model['vip_area_type'] == 10 || $model['vip_area_type'] == 20) { // 获取下级用户的推荐人(即上级用户) $superiorUser = UserModel::detail($model['vip_area_user_id']); if ($superiorUser && $superiorUser['referee_id']) { $vipUser = VipUserModel::detail($superiorUser['vip_area_user_id']); if ($vipUser['grade']['operating_subsidy']>0){ // 获取补贴比例设置 $subsidyRate = $vipUser['grade']['operating_subsidy']; // 计算VIP专区补贴 $subsidyAmount = bcmul($model['vip_area_money'], bcdiv((string)$subsidyRate, '100', 4), 2); User::grantMoney($superiorUser['referee_id'], $subsidyAmount, 'VIP专区补贴'); // 记录分销订单 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专区订单记录 */ 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'], '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($order['pay_price'], $order['express_price'], 2); // 获取当前买家的推荐人信息 $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']); if (!empty($config['become__buy_product_ids'])) { $purchase_count=(new self())->getPurchaseCount($order['user_id']); foreach ($order['product'] as $product){ if (in_array($product['product_id'], $config['become__buy_product_ids'])) { // 获取商品数量 $quantity = $product['total_num']; // 为每个商品生成分红订单 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++; } } } } } } $directReferralsCount=0; $user=UserModel::detail($order['user_id']); if (!empty($user['referee_id'])){ // 检查推荐人是否满足直推条件(直推用户数量) $directReferralsCount = UserModel::where('referee_id', '=', $user['referee_id'])->count(); } $requiredReferralCount = $setting['referee_buy_count'] ?? 0; if ($vipGrade['commission']>0 && $directReferralsCount >= $requiredReferralCount){ // 计算平台直推佣金金额 $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){ // 计算直推店铺交易额佣金金额 $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']]); } } } 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])->count()+1; } }