From abc7edc3c8ad59ff213c85413d0d6a10d7a0b6f7 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Wed, 17 Dec 2025 18:03:09 +0800
Subject: [PATCH] 1.	发布供需消耗连盟币,连盟币数量在后台独立设置 2.	小程序供需个人中心可自由切换身份 3.	增加私信系统 4.	增加评论系统,用户可在发布者详情页进行评论操作,评论获得的连盟币可在后台设置 5.	增加发布者的等级,以好评个数为条件进行升级,小程序端会显示该等级的图标,如没有等级则不会显示图标 6.	增加设置消耗连盟币可以解锁、查看发布的信息,费用可在后台设置 7.	小程序供需大厅界面优化,以及增加了推荐栏目,该栏目按发布的分类相似进行匹配,比如A用户发布了 互联网 分类的需求,则会优先推荐匹配互联网分类的供应需求给他。

---
 admin/app/common/model/plus/vip/Order.php |  189 +++++++++++++++++++++++++++++-----------------
 1 files changed, 118 insertions(+), 71 deletions(-)

diff --git a/admin/app/common/model/plus/vip/Order.php b/admin/app/common/model/plus/vip/Order.php
index e9a5c11..7b68882 100644
--- a/admin/app/common/model/plus/vip/Order.php
+++ b/admin/app/common/model/plus/vip/Order.php
@@ -15,7 +15,8 @@
 {
     protected $name = 'vip_area_order';
     protected $pk = 'id';
-    public $append=['vip_area_type_text'];
+    public $append = ['vip_area_type_text'];
+
     /**
      * VIP专区订单类型
      * @param $value
@@ -24,7 +25,7 @@
     public function getVipAreaTypeTextAttr($value, $data)
     {
         $types = VipAreaTypeEnum::getTypeName();
-        return  $types[$data['vip_area_type']];
+        return $types[$data['vip_area_type']];
     }
 
     /**
@@ -83,7 +84,7 @@
             ->where('order_type', '=', $orderType)
             ->find();
     }
-    
+
     /**
      * 获取订单的所有VIP专区订单记录
      */
@@ -109,13 +110,13 @@
         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;
@@ -126,16 +127,16 @@
             if ($model['is_settled'] == 1) {
                 continue;
             }
-            
+
             // 写入结算时间
             $deadlineTime = $model['settle_time'] ?: 0;
-            if($deadlineTime == 0){
-                $deadlineTime = $order['receipt_time'] + $settleDays  * 86400;
+            if ($deadlineTime == 0) {
+                $deadlineTime = $order['receipt_time'] + $settleDays * 86400;
                 $model->save([
                     'settle_time' => $deadlineTime
                 ]);
             }
-            
+
             // 未到结算时间,跳过
             if ($deadlineTime > time()) {
                 continue;
@@ -143,36 +144,42 @@
             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']);
+                    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;
     }
 
@@ -187,22 +194,22 @@
         // 获取平台直推佣金设置
         $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']);
+                self::createDistributionOrder($order, $model['vip_area_user_id'], $platformCommissionAmount, 'platform_commission', $model['vip_area_money']);
             }
         }
     }
@@ -215,12 +222,12 @@
      * @param $type
      * @return bool
      */
-    protected static function createDistributionOrder($order, $userId, $amount, $type,$subordinate_money)
+    protected static function createDistributionOrder($order, $userId, $amount, $type, $subordinate_money)
     {
         // 创建分销订单记录以跟踪各种类型的佣金
         $distributionOrder = new self();
         $vip_area_type = 0;
-        switch($type) {
+        switch ($type) {
             case 'vip_subsidy':
                 $vip_area_type = 30; // VIP专区补贴
                 break;
@@ -228,7 +235,7 @@
                 $vip_area_type = 40; // 平台直推佣金
                 break;
         }
-        
+
         return $distributionOrder->save([
             'user_id' => $userId,
             'order_id' => $order['order_id'],
@@ -268,6 +275,7 @@
                 '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,
@@ -276,10 +284,10 @@
                 'settle_time' => 0,
                 'app_id' => $order['app_id']
             ];
-            $list=[];
+            $list = [];
             // 计算佣金金额
-            $orderPrice = bcsub($order['pay_price'], $order['express_price'], 2);
-            $viewpoint_money=0;
+            $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'])) {
@@ -292,76 +300,115 @@
                     $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 ($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'])) {
-                                    // 获取商品数量
-                                    $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 = (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++;
-                                        }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'])){
+                        $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 ($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 ($vipGrade['commission']>0 && $directReferralsCount >= $requiredReferralCount){
+                        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]);
+                            $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){
+            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']]);
+                        $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)){
+            if (empty($list)) {
                 return true;
             }
             // 保存VIP专区订单记录
             return $model->saveAll($list);
-        }catch (\Exception $e){
-            log_write('创建VIP专区订单失败:'.$e->getMessage());
+        } 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;
+        return self::where(['user_id' => $user_id, 'is_vip' => 1,'is_invalid'=>0])->count() + 1;
     }
 }
\ No newline at end of file

--
Gitblit v1.9.2