WIN-2308041133\Administrator 1 周之前
父節點
當前提交
17a6f2f415

+ 5 - 0
app/admin/controller/store/StoreProduct.php

@@ -282,6 +282,7 @@ class StoreProduct extends AuthController
             ['sort', 0],
             ['sort', 0],
             ['sales', 0],
             ['sales', 0],
             ['ficti', 100],
             ['ficti', 100],
+            ['rebate_ratio', 0],
             ['give_integral', 0],
             ['give_integral', 0],
             ['is_show', 0],
             ['is_show', 0],
             ['temp_id', 0],
             ['temp_id', 0],
@@ -332,6 +333,7 @@ class StoreProduct extends AuthController
         if (!$data['store_name']) return Json::fail('请输入产品名称');
         if (!$data['store_name']) return Json::fail('请输入产品名称');
         if (count($data['image']) < 1) return Json::fail('请上传产品图片');
         if (count($data['image']) < 1) return Json::fail('请上传产品图片');
         if (count($data['slider_image']) < 1) return Json::fail('请上传产品轮播图');
         if (count($data['slider_image']) < 1) return Json::fail('请上传产品轮播图');
+        if ($data['rebate_ratio']>10) return Json::fail('返利比例不能大于10%');
         $data['image'] = $data['image'][0];
         $data['image'] = $data['image'][0];
         $data['slider_image'] = json_encode($data['slider_image']);
         $data['slider_image'] = json_encode($data['slider_image']);
         $data['stock'] = array_sum(array_column($detail, 'stock'));
         $data['stock'] = array_sum(array_column($detail, 'stock'));
@@ -455,6 +457,7 @@ class StoreProduct extends AuthController
             Form::number('postage', '邮费', $product->getData('postage'))->min(0)->col(8),
             Form::number('postage', '邮费', $product->getData('postage'))->min(0)->col(8),
             Form::number('sales', '销量', $product->getData('sales'))->min(0)->precision(0)->col(8)->readonly(1),
             Form::number('sales', '销量', $product->getData('sales'))->min(0)->precision(0)->col(8)->readonly(1),
             Form::number('ficti', '虚拟销量', $product->getData('ficti'))->min(0)->precision(0)->col(8),
             Form::number('ficti', '虚拟销量', $product->getData('ficti'))->min(0)->precision(0)->col(8),
+            Form::number('rebate_ratio', '返利点数', $product->getData('rebate_ratio'))->min(0)->precision(0)->col(8),
             Form::number('stock', '库存', ProductModel::getStock($id) > 0 ? ProductModel::getStock($id) : $product->getData('stock'))->min(0)->precision(0)->col(8),
             Form::number('stock', '库存', ProductModel::getStock($id) > 0 ? ProductModel::getStock($id) : $product->getData('stock'))->min(0)->precision(0)->col(8),
             Form::number('cost', '产品成本价', $product->getData('cost'))->min(0)->col(8),
             Form::number('cost', '产品成本价', $product->getData('cost'))->min(0)->col(8),
             Form::number('sort', '排序', $product->getData('sort'))->col(8),
             Form::number('sort', '排序', $product->getData('sort'))->col(8),
@@ -496,6 +499,7 @@ class StoreProduct extends AuthController
             ['stock', 0],
             ['stock', 0],
             ['temp_id', 0],
             ['temp_id', 0],
             ['ficti', 100],
             ['ficti', 100],
+            ['rebate_ratio', 0],
             ['give_integral', 0],
             ['give_integral', 0],
             ['is_show', 0],
             ['is_show', 0],
             ['cost', 0],
             ['cost', 0],
@@ -518,6 +522,7 @@ class StoreProduct extends AuthController
         if ($data['price'] == '' || $data['price'] < 0) return Json::fail('请输入产品售价');
         if ($data['price'] == '' || $data['price'] < 0) return Json::fail('请输入产品售价');
         if ($data['ot_price'] == '' || $data['ot_price'] < 0) return Json::fail('请输入产品市场价');
         if ($data['ot_price'] == '' || $data['ot_price'] < 0) return Json::fail('请输入产品市场价');
         if ($data['stock'] == '' || $data['stock'] < 0) return Json::fail('请输入库存');
         if ($data['stock'] == '' || $data['stock'] < 0) return Json::fail('请输入库存');
+        if($data['rebate_ratio']>10) return Json::fail('返利比例不能大于10%');
         $data['image'] = $data['image'][0];
         $data['image'] = $data['image'][0];
         $data['slider_image'] = json_encode($data['slider_image']);
         $data['slider_image'] = json_encode($data['slider_image']);
         ProductModel::edit($data, $id);
         ProductModel::edit($data, $id);

+ 8 - 0
app/admin/model/system/SystemUserTask.php

@@ -65,6 +65,14 @@ class SystemUserTask extends BaseModel
             'min_number' => 0,
             'min_number' => 0,
             'unit' => '次'
             'unit' => '次'
         ],
         ],
+        [
+            'type' => 'TeamConsumptionFrequency',
+            'name' => '团队消费{$num}',
+            'real_name' => '消费次数',
+            'max_number' => 0,
+            'min_number' => 0,
+            'unit' => '次'
+        ],
         [
         [
             'type' => 'CumulativeAttendance',
             'type' => 'CumulativeAttendance',
             'name' => '累计签到{$num}',
             'name' => '累计签到{$num}',

+ 14 - 0
app/admin/view/store/store_product/create.php

@@ -668,6 +668,19 @@
                                             </div>
                                             </div>
                                         </div>
                                         </div>
                                     </div>
                                     </div>
+                                    <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
+                                        <div class="grid-demo grid-demo-bg1">
+                                            <div class="layui-form-item">
+                                                <label class="layui-form-label">返利点数</label>
+                                                <div class="layui-input-block">
+                                                    <input type="number" name="rebate_ratio" lay-verify="title"
+                                                           autocomplete="off"
+                                                           placeholder="请输入返利点数" class="layui-input"
+                                                           v-model="formData.rebate_ratio">
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
                                     <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
                                     <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
                                         <div class="grid-demo grid-demo-bg1">
                                         <div class="grid-demo grid-demo-bg1">
                                             <div class="layui-form-item">
                                             <div class="layui-form-item">
@@ -1035,6 +1048,7 @@
                 attrs: [],
                 attrs: [],
                 description: '',
                 description: '',
                 ficti: 0,
                 ficti: 0,
+                rebate_ratio: 0,
                 give_integral: 0,
                 give_integral: 0,
                 sort: 0,
                 sort: 0,
                 is_show: 1,
                 is_show: 1,

+ 202 - 12
app/models/store/StoreOrder.php

@@ -9,6 +9,7 @@ namespace app\models\store;
 
 
 use app\admin\model\system\ShippingTemplatesFree;
 use app\admin\model\system\ShippingTemplatesFree;
 use app\admin\model\system\ShippingTemplatesRegion;
 use app\admin\model\system\ShippingTemplatesRegion;
+use app\models\system\SystemUserAgentLevel;
 use app\models\system\SystemUserLevel;
 use app\models\system\SystemUserLevel;
 use crmeb\basic\BaseModel;
 use crmeb\basic\BaseModel;
 use think\db\exception\DataNotFoundException;
 use think\db\exception\DataNotFoundException;
@@ -19,7 +20,7 @@ use crmeb\traits\ModelTrait;
 use think\facade\Log;
 use think\facade\Log;
 use app\models\system\SystemStore;
 use app\models\system\SystemStore;
 use app\models\routine\RoutineTemplate;
 use app\models\routine\RoutineTemplate;
-use app\models\user\{User, UserAddress, UserBill, UserSpread, WechatUser};
+use app\models\user\{User, UserAddress, UserBill, UserLevel, UserSpread, WechatUser};
 use crmeb\services\{
 use crmeb\services\{
     SystemConfigService, WechatTemplateService, workerman\ChannelService
     SystemConfigService, WechatTemplateService, workerman\ChannelService
 };
 };
@@ -318,7 +319,7 @@ class StoreOrder extends BaseModel
             $mer_id = [];
             $mer_id = [];
             $totalNum = 0;
             $totalNum = 0;
             $gainIntegral = 0;
             $gainIntegral = 0;
-            $is_wholesale=-1;
+            $is_wholesale = -1;
             foreach ($cartInfo as $cart) {
             foreach ($cartInfo as $cart) {
                 $cartIds[] = $cart['id'];
                 $cartIds[] = $cart['id'];
                 $totalNum += $cart['cart_num'];
                 $totalNum += $cart['cart_num'];
@@ -329,8 +330,8 @@ class StoreOrder extends BaseModel
                 $cartInfoGainIntegral = isset($cart['productInfo']['give_integral']) ? bcmul($cart['cart_num'], $cart['productInfo']['give_integral'], 2) : 0;
                 $cartInfoGainIntegral = isset($cart['productInfo']['give_integral']) ? bcmul($cart['cart_num'], $cart['productInfo']['give_integral'], 2) : 0;
                 $gainIntegral = bcadd($gainIntegral, $cartInfoGainIntegral, 2);
                 $gainIntegral = bcadd($gainIntegral, $cartInfoGainIntegral, 2);
 
 
-                if ($is_wholesale!= -1){
-                    if ($is_wholesale != intval($cart['productInfo']['is_wholesale']) ){
+                if ($is_wholesale != -1) {
+                    if ($is_wholesale != intval($cart['productInfo']['is_wholesale'])) {
                         return self::setErrorInfo('批发商品和普通商品不能混合购买!', true);
                         return self::setErrorInfo('批发商品和普通商品不能混合购买!', true);
                     }
                     }
                 }
                 }
@@ -435,7 +436,7 @@ class StoreOrder extends BaseModel
             $mer_id = array_unique($mer_id);
             $mer_id = array_unique($mer_id);
             if (count($mer_id) > 1) {
             if (count($mer_id) > 1) {
                 $mer_id_string = implode(',', $mer_id);
                 $mer_id_string = implode(',', $mer_id);
-            }else{
+            } else {
                 $mer_id_string = $mer_id[0];
                 $mer_id_string = $mer_id[0];
             }
             }
             $orderInfo = [
             $orderInfo = [
@@ -468,6 +469,7 @@ class StoreOrder extends BaseModel
                 'add_time' => time(),
                 'add_time' => time(),
                 'unique' => $key,
                 'unique' => $key,
                 'shipping_type' => $shipping_type,
                 'shipping_type' => $shipping_type,
+                'is_wholesale' => $is_wholesale
             ];
             ];
             if ((string)$shipping_type === 2) {
             if ((string)$shipping_type === 2) {
                 $orderInfo['verify_code'] = self::getStoreCode();
                 $orderInfo['verify_code'] = self::getStoreCode();
@@ -506,7 +508,8 @@ class StoreOrder extends BaseModel
         }
         }
     }
     }
 
 
-    public static function createOrderPart($orderInfo){
+    public static function createOrderPart($orderInfo)
+    {
         $user_info = User::where('uid', $orderInfo['uid'])->find();
         $user_info = User::where('uid', $orderInfo['uid'])->find();
         $cart_ids = explode(',', $orderInfo['cart_id']);
         $cart_ids = explode(',', $orderInfo['cart_id']);
 
 
@@ -521,25 +524,25 @@ class StoreOrder extends BaseModel
             })
             })
             ->toArray();
             ->toArray();
         $grouped = array_column($cartInfo, 'ids', 'mer_id');
         $grouped = array_column($cartInfo, 'ids', 'mer_id');
-        foreach ($cartInfo as $k => $v){
-            $total_num=0;
+        foreach ($cartInfo as $k => $v) {
+            $total_num = 0;
             $total_price = 0;
             $total_price = 0;
             $deduction_price = 0;
             $deduction_price = 0;
-            $cartInfo = StoreCart::where('id','in',$v)->select();
-            foreach ($cartInfo as $cart){
+            $cartInfo = StoreCart::where('id', 'in', $v)->select();
+            foreach ($cartInfo as $cart) {
                 $price = StoreProduct::where('id', $cart['product_id'])->value('price');
                 $price = StoreProduct::where('id', $cart['product_id'])->value('price');
                 $product_price = bcmul($price, $cart['cart_num'], 2);
                 $product_price = bcmul($price, $cart['cart_num'], 2);
                 $total_price = bcadd($total_price, $product_price, 2); //商品总价
                 $total_price = bcadd($total_price, $product_price, 2); //商品总价
                 $total_num = bcadd($total_num, $cart['cart_num'], 2);
                 $total_num = bcadd($total_num, $cart['cart_num'], 2);
             }
             }
-            if ($user_info['level']>0){ //会员折扣
+            if ($user_info['level'] > 0) { //会员折扣
                 $discount = SystemUserLevel::where('id', $user_info['level'])->value('discount');
                 $discount = SystemUserLevel::where('id', $user_info['level'])->value('discount');
                 $moto_price = $total_price;
                 $moto_price = $total_price;
                 $total_price = bcmul($total_price, bcsub(1, $discount, 2), 2);
                 $total_price = bcmul($total_price, bcsub(1, $discount, 2), 2);
                 $deduction_price = bcsub($moto_price, $total_price, 2); //抵扣金额
                 $deduction_price = bcsub($moto_price, $total_price, 2); //抵扣金额
             }
             }
 
 
-            $orderInfo =[
+            $orderInfo = [
                 'mer_id' => $k,
                 'mer_id' => $k,
                 'cart_id' => $v,
                 'cart_id' => $v,
                 'order_id' => $orderInfo['order_id'],
                 'order_id' => $orderInfo['order_id'],
@@ -559,6 +562,7 @@ class StoreOrder extends BaseModel
         }
         }
 
 
     }
     }
+
     /**
     /**
      * 回退积分
      * 回退积分
      * @param $order 订单信息
      * @param $order 订单信息
@@ -659,6 +663,7 @@ class StoreOrder extends BaseModel
         } while (self::be(['order_id' => $orderId]));// $orderId = 'wx' . $msectime . mt_rand(10000, 99999);
         } while (self::be(['order_id' => $orderId]));// $orderId = 'wx' . $msectime . mt_rand(10000, 99999);
         return $orderId;
         return $orderId;
     }
     }
+
     /**
     /**
      * 生成订单唯一id
      * 生成订单唯一id
      * @param $uid 用户uid
      * @param $uid 用户uid
@@ -868,10 +873,195 @@ class StoreOrder extends BaseModel
         UserBill::expend('购买商品', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元购买商品');
         UserBill::expend('购买商品', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元购买商品');
         //支付成功后
         //支付成功后
         event('OrderPaySuccess', [$order, $formId]);
         event('OrderPaySuccess', [$order, $formId]);
+        self::userLevelReward($order, $order['uid'], 1);  //激励奖 会员返现
+        if ($order['is_wholesale'] == 1) {  //批发订单
+            self::wholesale($order);  //批发订单返利
+            self::umbrella($order);  //伞下返利
+        }
         $res = $res1 && $resPink && UserSpread::setSpreadSure($order['uid']) && User::backOrderBrokerage($order);
         $res = $res1 && $resPink && UserSpread::setSpreadSure($order['uid']) && User::backOrderBrokerage($order);
         return false !== $res;
         return false !== $res;
     }
     }
 
 
+//    激励奖 会员返现
+    public static function userLevelReward($order, $uid, $type)
+    {
+        try {
+            $userInfo = User::get($uid);
+            if ($userInfo['level'] > 0) {
+                $user_radio = UserLevel::where('id', $userInfo['level'])->value('rebate_ratio');  //用户等级返现比例
+                $rebate = bcmul($order['pay_price'], bcdiv($user_radio, 100, 2), 2);  //用户返现金额
+                $blance = bcadd($userInfo['brokerage_price'], $rebate, 2);  //用户佣金
+                if ($type == 1) {
+                    UserBill::income('商品返利', $uid, 'brokerage_price', 'order_money', $rebate, $order['id'], $blance, '商品返利佣金');
+                    if ($userInfo['spread_uid'] > 0) {
+                        self::userLevelReward($order, $userInfo['spread_uid'], 2);
+                    }
+                } elseif ($type == 2) { //下级推荐返利
+                    UserBill::income('下级商品返利', $uid, 'brokerage_price', 'order_money', $rebate, $order['id'], $blance, '下级购买商品返利佣金');
+                    return true;
+                }
+
+//            $rebate = 0;
+//            $shopping_cart = json_decode($order['cart_id'], true);
+//            先不考虑什么商品返现比例了
+//            foreach ($shopping_cart as $cart) {
+//                $product_info = StoreCart::get($cart['cart_id']);
+//                $product_radio = StoreProduct::where('id', $product_info['product_id'])->find();  //商品返现比例
+//
+//            }
+
+            }
+        }catch (\Exception $e) {
+            // 处理异常
+            @file_put_contents('quanju.txt', json_encode(['line' => $e->getLine(), 'message' => $e->getMessage(), 'file' => $e->getFile()]) . "-会员等级激励奖报错内容\r\n", 8);
+
+            return false;
+        }
+        return true;
+    }
+
+//批发商品奖励  因为能买批发商品所以肯定有代理等级
+    public static function wholesale($order)
+    {
+        try {
+            $userInfo = User::get($order['uid']);
+            $user_agnet = SystemUserAgentLevel::where('id', $userInfo['agent'])->find();
+            $one = 0;  //一级直推是否比代理等级高
+            $two = 0;  //二级推荐人是否比一级直推等级高
+
+            if ($userInfo['spread_uid'] > 0) {  //有推荐人
+                $one_spread_info = User::get($userInfo['spread_uid']);
+                if ($one_spread_info['agent'] > 0) {
+                    $one_agent = SystemUserAgentLevel::where('id', $one_spread_info['agent'])->find();
+                    $one = $one_agent['grade'];
+                }
+
+                if ($one_spread_info['spread_uid'] > 0) {
+                    $two_spread_info = User::get($one_spread_info['spread_uid']);
+                    if ($two_spread_info['agent'] > 0) {
+                        $two_agent = SystemUserAgentLevel::where('id', $two_spread_info['agent'])->find();
+                        $two = $two_agent['grade'];
+                    }
+                }
+            }
+
+//        先算直推的
+            if ($userInfo['agent'] > 0 && !empty($one_spread_info)) {
+                if ($one_spread_info['agent'] > 0) {
+                    if ($one_agent['grade'] > $user_agnet['grade']) {  //如果直推代理等级大于自己
+                        $discount_difference = bcsub($one_agent['discount'], $user_agnet['discount'], 2);
+                        $price = bcmul($order['total_price'], bcdiv($discount_difference, 100, 2), 2); //直推上级获得差价
+                    } elseif ($one_agent['discount'] <= $user_agnet['discount']) {  //一级直推等级小于等于自己
+                        $price = bcmul($order['total_price'], bcdiv($one_agent['direct_rebates'], 100, 2), 2); //直推上级获得直推返利
+                    }
+                }
+//            $blance = User::where('uid', $spread_uid)->value('brokerage_price');
+                $blance = bcadd($one_spread_info['brokerage_price'], $price, 2);
+                UserBill::income('直推代理返利', $one_spread_info['uid'], 'brokerage_price', 'agent_rebates', $price, $order['id'], $blance, '直推下级购买商品返利');
+                User::where('uid', $one_spread_info['uid'])->update(['brokerage_price' => $blance]);
+
+            }
+            $price=0;
+            //然后算二级推荐人的
+            if ($userInfo['agent'] > 0 && $two_spread_info) {
+                if ($two_spread_info['agent'] > 0) {
+                    if ($two == $one) {  //如果直推等级等于二级推荐人等级
+                        if ($two > $user_agnet['grade']) {  //如果二级推荐人等级高于自己
+                            $price = bcmul($order['total_price'], bcdiv($two_agent['indirect_rebates'], 100, 2), 2); //二级推荐人获得间接比例返利
+                        }
+                    } elseif ($two > $one) {  //如果二级推荐人等级大于直推等级
+                        if ($two > $user_agnet['grade']) {  //如果二级推荐人等级高于自己
+                            $indirect_rebates = bcmul($two_agent['indirect_rebates'],2,2);
+                            $price = bcmul($order['total_price'], bcdiv($indirect_rebates, 100, 2), 2); //二级推荐人获得直接推荐比例的两倍
+
+                        } elseif ($two == $user_agnet['grade']) {  //如果二级推荐人等级等于自己
+                            $price = bcmul($order['total_price'], bcdiv($two_agent['indirect_rebates'], 100, 2), 2); //二级推荐人获得间接比例返利
+
+                        }
+                    }
+                    $blance2 = bcadd($two_spread_info['brokerage_price'], $price, 2);
+                    UserBill::income('间接代理返利', $two_spread_info['uid'], 'brokerage_price', 'agent_rebates', $price, $order['id'], $blance2, '间接下级购买商品返利');
+                    User::where('uid', $two_spread_info['uid'])->update(['brokerage_price' => $blance2]);
+
+                }
+            }
+            return true;
+        }catch (\Exception $e) {
+            // 处理异常
+            @file_put_contents('quanju.txt', json_encode(['line' => $e->getLine(), 'message' => $e->getMessage(), 'file' => $e->getFile()]) . "-代理等级批发返利报错内容\r\n", 8);
+
+            return false;
+        }
+    }
+//伞下返利
+    public static function umbrella($order){
+        try{
+//        获取所有伞下比例大于0的等级
+            $agent_level = SystemUserLevel::where('umbrella_rebates','>',0)->where('is_show',1)->where('is_del',0)->column('id');
+
+//        for循环所有伞下比例大于0的等级计算他们每个等级伞下比例乘订单金额的奖池数量再除以该等级的上级人数
+            foreach ($agent_level as $level){
+                $level_uids = self::getAllSuperiors($order['uid'], $level['id']); //获取所有符合等级的上级用户UID
+                $level_count = count($level_uids); //符合等级的上级人数
+                $pool = bcmul($order['total_price'],bcdiv($level['umbrella_rebates'],100,2),2); //该等级奖池
+                $user_price = bcdiv($pool,$level_count,2); //该等级奖池/符合等级的上级人数
+                $name = SystemUserLevel::where('id',$level['id'])->value('name'); //等级名称
+                foreach ($level_uids as $uid) {
+                    $brokerage_price = User::where('uid', $uid)->value('brokerage_price');
+                    $blance = bcadd($brokerage_price, $user_price, 2);
+                    UserBill::income('伞下团体返利', $uid, 'brokerage_price', 'umbrella_rebates', $user_price, $order['id'], $blance, $name.'伞下团队购买商品返利');
+                    User::where('uid', $uid)->update(['brokerage_price' => $blance]);
+                }
+            }
+        }catch (\Exception $e) {
+            // 处理异常
+            @file_put_contents('quanju.txt', json_encode(['line' => $e->getLine(), 'message' => $e->getMessage(), 'file' => $e->getFile()]) . "-伞下团队批发返利报错内容\r\n", 8);
+
+            return false;
+        }
+        return true;
+    }
+    /**
+     * 递归获取所有上级(推荐人/推广人)的UID
+     * @param int $uid 团队成员的ID
+     * @param int|null $agent 代理UID,如果传入,则只返回上级列表中agent字段等于此值的UID
+     * @param array $allSuperiors 内部递归使用,用于存储所有上级UID,初始为空数组
+     * @return array 过滤后的上级UID列表
+     */
+    public static function getAllSuperiors($uid, $agent = null, &$allSuperiors = []) {
+        // 1. 获取当前用户的直接上级 spread_uid
+        // 假设 User::where('uid', $uid)->value('spread_uid') 可以获取到该用户的直接上级ID
+        $superiorUid = User::where('uid', $uid)->value('spread_uid');
+
+        // 2. 检查是否存在上级且上级UID不是0或null
+        if (!empty($superiorUid)) {
+            // 3. 将当前获取到的上级UID添加到结果数组中
+            $allSuperiors[] = $superiorUid;
+
+            // 4. 递归调用,以当前的上级作为新的 $uid,继续查找他的上级
+            // 注意:继续将 $agent 和 $allSuperiors 传递给下一次递归
+            self::getAllSuperiors($superiorUid, $agent, $allSuperiors);
+        }
+
+        // 5. 递归结束,对收集到的所有上级UID进行去重
+        $resultUids = array_unique($allSuperiors);
+
+        // 6. 如果传入了 $agent,则进行过滤
+        if (!empty($agent) && !empty($resultUids)) {
+
+            // 批量查询数据库,找出 $resultUids 中 agent 字段等于传入 $agent 的 UIDs
+            // 假设 agent 字段存储在 User 表中
+            $filteredUids = User::whereIn('uid', $resultUids)
+                ->where('agent', $agent)
+                ->column('uid');
+
+            // 返回过滤后的结果
+            return $filteredUids;
+        }
+
+        // 7. 如果没有传入 $agent,则返回所有收集到的上级 UID
+        return $resultUids;
+    }
     /*
     /*
      * 线下支付消息通知
      * 线下支付消息通知
      * 待完善
      * 待完善

+ 51 - 0
app/models/system/SystemUserTask.php

@@ -67,6 +67,14 @@ class SystemUserTask extends BaseModel
             'min_number' => 0,
             'min_number' => 0,
             'unit' => '次'
             'unit' => '次'
         ],
         ],
+        [
+            'type' => 'TeamConsumptionFrequency',
+            'name' => '团队消费{$num}',
+            'real_name' => '消费次数',
+            'max_number' => 0,
+            'min_number' => 0,
+            'unit' => '次'
+        ],
         [
         [
             'type' => 'CumulativeAttendance',
             'type' => 'CumulativeAttendance',
             'name' => '累计签到{$num}',
             'name' => '累计签到{$num}',
@@ -166,6 +174,23 @@ class SystemUserTask extends BaseModel
         if ($countPay >= $number) $isComplete = UserTaskFinish::setFinish($uid, $task_id) ? true : false;
         if ($countPay >= $number) $isComplete = UserTaskFinish::setFinish($uid, $task_id) ? true : false;
         return ['还需消费{$num}次', $countPay, $isComplete];
         return ['还需消费{$num}次', $countPay, $isComplete];
     }
     }
+    /**
+     * 团队累计消费次数
+     * @param int $task_id 任务id
+     * @param int $uid 用户id
+     * @param int $start_time 开始时间
+     * @param int $number 限定时间
+     * @return boolean
+     * */
+    public static function TeamConsumptionFrequency($task_id, $uid = 0, $start_time = 0, $number = 0)
+    {
+        $isComplete = false;
+        $team_users = self::getAllTeamMembers($uid);
+        $countPay = User::where('uid','in',$team_users)->sum('pay_count');
+//        $countPay = StoreOrder::where('paid', 1)->where('refund_status', 0)->where('is_del', 0)->where('uid', $uid)->where('add_time', '>', $start_time)->count();
+        if ($countPay >= $number) $isComplete = UserTaskFinish::setFinish($uid, $task_id) ? true : false;
+        return ['还需团队消费{$num}次', $countPay, $isComplete];
+    }
 
 
     /**
     /**
      * 邀请好友成为会员
      * 邀请好友成为会员
@@ -331,6 +356,7 @@ class SystemUserTask extends BaseModel
             case 'SatisfactionIntegral':
             case 'SatisfactionIntegral':
             case 'ConsumptionAmount':
             case 'ConsumptionAmount':
             case 'ConsumptionFrequency':
             case 'ConsumptionFrequency':
+            case 'TeamConsumptionFrequency':
             case 'CumulativeAttendance':
             case 'CumulativeAttendance':
             case 'SharingTimes':
             case 'SharingTimes':
             case 'InviteGoodFriends':
             case 'InviteGoodFriends':
@@ -433,5 +459,30 @@ class SystemUserTask extends BaseModel
         }
         }
         return $task;
         return $task;
     }
     }
+    /**
+     * 递归获取所有团队成员
+     * @param int $uid 用户ID
+     * @return array
+     */
+    public static function getAllTeamMembers($uid, &$teamUids = [])
+    {
+        // 获取直接下级
+        $directSubordinates = User::where('spread_uid', $uid)->column('uid');
+
+        if (!empty($directSubordinates)) {
+            // 过滤掉最开始传入的UID
+            $directSubordinates = array_diff($directSubordinates, [$uid]);
+
+            // 合并当前直接下级UID到团队UID列表
+            $teamUids = array_merge($teamUids, $directSubordinates);
+
+            // 递归获取下级的下级
+            foreach ($directSubordinates as $subordinateUid) {
+                self::getAllTeamMembers($subordinateUid, $teamUids);
+            }
+        }
+
+        return $teamUids;
+    }
 
 
 }
 }