Kirin 3 years ago
parent
commit
5aa92e839a

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

@@ -260,6 +260,7 @@ class StoreProduct extends AuthController
             ['is_show', 0],
             ['temp_id', 0],
             ['is_hot', 0],
+            ['is_gift', 0],
             ['is_benefit', 0],
             ['is_best', 0],
             ['is_new', 0],
@@ -425,6 +426,7 @@ class StoreProduct extends AuthController
             Form::number('sort', '排序', $product->getData('sort'))->col(8),
             Form::radio('is_show', '产品状态', $product->getData('is_show'))->options([['label' => '上架', 'value' => 1], ['label' => '下架', 'value' => 0]])->col(8),
             Form::radio('is_hot', '热卖单品', $product->getData('is_hot'))->options([['label' => '是', 'value' => 1], ['label' => '否', 'value' => 0]])->col(8),
+            Form::radio('is_gift', '礼包商品', $product->getData('is_gift'))->options([['label' => '是', 'value' => 1], ['label' => '否', 'value' => 0]])->col(8),
             Form::radio('is_benefit', '促销单品', $product->getData('is_benefit'))->options([['label' => '是', 'value' => 1], ['label' => '否', 'value' => 0]])->col(8),
             Form::radio('is_best', '精品推荐', $product->getData('is_best'))->options([['label' => '是', 'value' => 1], ['label' => '否', 'value' => 0]])->col(8),
             Form::radio('is_new', '首发新品', $product->getData('is_new'))->options([['label' => '是', 'value' => 1], ['label' => '否', 'value' => 0]])->col(8),
@@ -464,6 +466,7 @@ class StoreProduct extends AuthController
             ['is_show', 0],
             ['cost', 0],
             ['is_hot', 0],
+            ['is_gift', 0],
             ['is_benefit', 0],
             ['is_best', 0],
             ['is_new', 0],

+ 10 - 10
app/admin/controller/ump/StoreCombination.php

@@ -328,8 +328,8 @@ class StoreCombination extends AuthController
                 $productAttr[0]['weight'] = 0;
                 $productAttr[0]['volume'] = 0;
                 $productAttr[0]['brokerage'] = 0;
-                $productAttr[0]['return'] = 0;
-                $productAttr[0]['integral'] = 0;
+//                $productAttr[0]['return'] = 0;
+//                $productAttr[0]['integral'] = 0;
                 $productAttr[0]['brokerage_two'] = 0;
                 $productAttr[0]['check'] = 0;
             }
@@ -398,16 +398,16 @@ class StoreCombination extends AuthController
                 foreach ($detail as $kk => $vv) {
                     if ($v['detail'] == $vv['detail']) {
                         $attrFormat[$k]['price'] = $vv['price'];
-                        $attrFormat[$k]['return'] = $vv['return'];
-                        $attrFormat[$k]['integral'] = $vv['integral'];
+//                        $attrFormat[$k]['return'] = $vv['return'];
+//                        $attrFormat[$k]['integral'] = $vv['integral'];
                         $attrFormat[$k]['sales'] = $vv['sales'];
                         $attrFormat[$k]['pic'] = $vv['pic'];
                         $attrFormat[$k]['check'] = false;
                         break;
                     } else {
                         $attrFormat[$k]['price'] = '';
-                        $attrFormat[$k]['return'] = '';
-                        $attrFormat[$k]['integral'] = '';
+//                        $attrFormat[$k]['return'] = '';
+//                        $attrFormat[$k]['integral'] = '';
                         $attrFormat[$k]['sales'] = '';
                         $attrFormat[$k]['pic'] = $product['image'];
                         $attrFormat[$k]['check'] = true;
@@ -417,8 +417,8 @@ class StoreCombination extends AuthController
         } else {
             foreach ($attrFormat as $k => $v) {
                 $attrFormat[$k]['price'] = $product['price'];
-                $attrFormat[$k]['return'] = $product['return'] ?? 0;
-                $attrFormat[$k]['integral'] = $product['integral'] ?? 0;
+//                $attrFormat[$k]['return'] = $product['return'] ?? 0;
+//                $attrFormat[$k]['integral'] = $product['integral'] ?? 0;
                 $attrFormat[$k]['sales'] = $product['stock'];
                 $attrFormat[$k]['pic'] = $product['image'];
                 $attrFormat[$k]['check'] = false;
@@ -565,8 +565,8 @@ class StoreCombination extends AuthController
                 $valueNew[$count]['detail'] = json_encode($detail);
                 $valueNew[$count]['pic'] = $sukValue[$suk]['pic'] ?? '';
                 $valueNew[$count]['price'] = $sukValue[$suk]['price'] ? floatval($sukValue[$suk]['price']) : 0;
-                $valueNew[$count]['return'] = $sukValue[$suk]['return'] ? floatval($sukValue[$suk]['return']) : 0;
-                $valueNew[$count]['integral'] = $sukValue[$suk]['integral'] ? floatval($sukValue[$suk]['integral']) : 0;
+//                $valueNew[$count]['return'] = $sukValue[$suk]['return'] ? floatval($sukValue[$suk]['return']) : 0;
+//                $valueNew[$count]['integral'] = $sukValue[$suk]['integral'] ? floatval($sukValue[$suk]['integral']) : 0;
                 $valueNew[$count]['cost'] = $sukValue[$suk]['cost'] ? floatval($sukValue[$suk]['cost']) : 0;
                 $valueNew[$count]['ot_price'] = isset($sukValue[$suk]['ot_price']) ? floatval($sukValue[$suk]['ot_price']) : 0;
                 $valueNew[$count]['stock'] = $sukValue[$suk]['stock'] ? intval($sukValue[$suk]['stock']) : 0;

+ 26 - 3
app/admin/controller/user/User.php

@@ -327,12 +327,14 @@ class User extends AuthController
         if (!$user) return Json::fail('数据不存在!');
         $f = array();
         $f[] = Form::input('uid', '用户编号', $user->getData('uid'))->disabled(1);
-        $f[] = Form::input('real_name', '真实姓名', $user->getData('real_name'));
+//        $f[] = Form::input('real_name', '真实姓名', $user->getData('real_name'));
         $f[] = Form::text('phone', '手机号', $user->getData('phone'));
-        $f[] = Form::date('birthday', '生日', $user->getData('birthday') ? date('Y-m-d', $user->getData('birthday')) : 0);
-        $f[] = Form::input('card_id', '身份证号', $user->getData('card_id'));
+//        $f[] = Form::date('birthday', '生日', $user->getData('birthday') ? date('Y-m-d', $user->getData('birthday')) : 0);
+//        $f[] = Form::input('card_id', '身份证号', $user->getData('card_id'));
         $f[] = Form::textarea('mark', '用户备注', $user->getData('mark'));
         $f[] = Form::radio('is_promoter', '推广员', $user->getData('is_promoter'))->options([['value' => 1, 'label' => '开启'], ['value' => 0, 'label' => '关闭']]);
+        $f[] = Form::radio('area_admin', '区域代理', $user->getData('area_admin'))->options([['value' => 0, 'label' => '无'], ['value' => 1, 'label' => '区代'], ['value' => 2, 'label' => '市代'], ['value' => 3, 'label' => '省代']]);
+        $f[] = Form::cityArea('area_address', '区域', $user->getData('area_province'), $user->getData('area_city'), $user->getData('area_district'));
         $f[] = Form::radio('status', '状态', $user->getData('status'))->options([['value' => 1, 'label' => '开启'], ['value' => 0, 'label' => '锁定']]);
         $form = Form::make_post_form('添加用户通知', $f, Url::buildUrl('update', array('uid' => $uid)), 5);
         $this->assign(compact('form'));
@@ -352,8 +354,10 @@ class User extends AuthController
             ['money', 0],
             ['integration_status', 0],
             ['integration', 0],
+            ['area_admin'],
             ['status', 0],
         ]);
+        $data['area_address'] = $this->request->post('area_address/a');
         if (!$uid) return $this->failed('数据不存在');
         $user = UserModel::get($uid);
         if (!$user) return Json::fail('数据不存在!');
@@ -414,6 +418,25 @@ class User extends AuthController
         $edit['birthday'] = strtotime($data['birthday']);
         $edit['mark'] = $data['mark'];
         $edit['is_promoter'] = $data['is_promoter'];
+        $edit['area_admin'] = $data['area_admin'];
+        if ($edit['area_admin'] == 1 && (!$data['area_address'][0] || !$data['area_address'][1] || !$data['area_address'][2])) {
+            return Json::fail('请选择代理地区');
+        }
+        if ($edit['area_admin'] == 2 && (!$data['area_address'][0] || !$data['area_address'][1])) {
+            return Json::fail('请选择代理地区');
+        }
+        if ($edit['area_admin'] == 3 && (!$data['area_address'][0])) {
+            return Json::fail('请选择代理地区');
+        }
+        if ($edit['area_admin'] == 0) {
+            $edit['area_province'] = '';
+            $edit['area_city'] = '';
+            $edit['area_district'] = '';
+        } else {
+            $edit['area_province'] = $data['area_address'][0];
+            $edit['area_city'] = $data['area_address'][1];
+            $edit['area_district'] = $data['area_address'][2];
+        }
         if ($edit) $res3 = UserModel::edit($edit, $uid);
         else $res3 = true;
         if ($res1 && $res2 && $res3) $res = true;

+ 3 - 0
app/admin/model/order/StoreOrder.php

@@ -113,6 +113,9 @@ class StoreOrder extends BaseModel
             } elseif ($item['bargain_id']) {
                 $item['pink_name'] = '[砍价订单]';
                 $item['color'] = '#12c5e9';
+            } elseif ($item['is_gift']) {
+                $item['pink_name'] = '[礼包订单]';
+                $item['color'] = '#c512e9';
             } else {
                 if ($item['shipping_type'] == 1) {
                     $item['pink_name'] = '[普通订单]';

+ 40 - 21
app/admin/view/store/store_product/create.php

@@ -150,7 +150,7 @@
     <div class="layui-row layui-col-space15" id="app" v-cloak="">
         <div class="layui-card">
             <div class="layui-card-header">
-                <span class="">{{id ? '商品修改': '商品添加' }}</span>
+                <span class="">{{id ? '商品修改' : '商品添加' }}</span>
                 <button style="margin-left: 20px" type="button" class="layui-btn layui-btn-primary layui-btn-xs"
                         @click="goBack">返回列表
                 </button>
@@ -233,7 +233,7 @@
                                                    autocomplete="off" placeholder="请输入视频链接" class="layui-input">
                                             <button type="button" @click="uploadVideo"
                                                     class="layui-btn layui-btn-sm layui-btn-normal">{{videoLink ? '确认添加'
-                                                : '上传视频'}}
+                                                        : '上传视频'}}
                                             </button>
                                             <input ref="filElem" type="file" style="display: none">
                                         </div>
@@ -700,6 +700,9 @@
                                                     <input type="radio" name="is_sub" lay-filter="is_sub" value="0"
                                                            title="默认设置"
                                                            :checked="formData.is_sub == 0 ? true : false">
+                                                    <input type="radio" name="is_sub" lay-filter="is_sub" value="2"
+                                                           title="不发放"
+                                                           :checked="formData.is_sub == 2 ? true : false">
                                                 </div>
                                             </div>
                                         </div>
@@ -909,28 +912,43 @@
                                             </div>
                                         </div>
                                     </div>
-                                    <div class="layui-row layui-col-space15">
-                                        <div class="layui-col-xs12 layui-col-sm12 layui-col-md12">
-                                            <div class="grid-demo grid-demo-bg1">
-                                                <div class="layui-form-item">
-                                                    <label class="layui-form-label">活动优先级</label>
-                                                    <div class="layui-input-block">
-                                                        <span class="layui-btn layui-btn-sm layui-btn-normal"
-                                                              :style="'background-color:'+activity[item]"
-                                                              v-for="(item,index) in formData.activity" :key="index"
-                                                              draggable="true"
-                                                              @dragstart="handleDragStart($event, item)"
-                                                              @dragover.prevent="handleDragOver($event, item)"
-                                                              @dragenter="handleDragEnter($event, item)"
-                                                              @dragend="handleDragEnd($event, item)">
-                                                        {{item}}
-                                                    </span>
-                                                        <span class="info">可拖动按钮调整活动的优先展示顺序</span>
-                                                    </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="radio" name="is_gift" lay-filter="is_gift" value="1"
+                                                           title="开启"
+                                                           :checked="formData.is_gift == 1 ? true : false">
+                                                    <input type="radio" name="is_gift" lay-filter="is_gift" value="0"
+                                                           title="关闭"
+                                                           :checked="formData.is_gift == 0 ? true : false">
                                                 </div>
                                             </div>
                                         </div>
                                     </div>
+                                    <!--                                    <div class="layui-row layui-col-space15">-->
+                                    <!--                                        <div class="layui-col-xs12 layui-col-sm12 layui-col-md12">-->
+                                    <!--                                            <div class="grid-demo grid-demo-bg1">-->
+                                    <!--                                                <div class="layui-form-item">-->
+                                    <!--                                                    <label class="layui-form-label">活动优先级</label>-->
+                                    <!--                                                    <div class="layui-input-block">-->
+                                    <!--                                                        <span class="layui-btn layui-btn-sm layui-btn-normal"-->
+                                    <!--                                                              :style="'background-color:'+activity[item]"-->
+                                    <!--                                                              v-for="(item,index) in formData.activity" :key="index"-->
+                                    <!--                                                              draggable="true"-->
+                                    <!--                                                              @dragstart="handleDragStart($event, item)"-->
+                                    <!--                                                              @dragover.prevent="handleDragOver($event, item)"-->
+                                    <!--                                                              @dragenter="handleDragEnter($event, item)"-->
+                                    <!--                                                              @dragend="handleDragEnd($event, item)">-->
+                                    <!--                                                        {{item}}-->
+                                    <!--                                                    </span>-->
+                                    <!--                                                        <span class="info">可拖动按钮调整活动的优先展示顺序</span>-->
+                                    <!--                                                    </div>-->
+                                    <!--                                                </div>-->
+                                    <!--                                            </div>-->
+                                    <!--                                        </div>-->
+                                    <!--                                    </div>-->
                                 </div>
                             </div>
                         </div>
@@ -1016,6 +1034,7 @@
                 sort: 0,
                 is_show: 1,
                 is_hot: 0,
+                is_gift: 0,
                 is_benefit: 0,
                 is_best: 0,
                 is_new: 0,
@@ -1058,7 +1077,7 @@
             activity: {'秒杀': '#1E9FFF', '砍价': '#189688', '拼团': '#FEB900'},
             attr: [],//临时属性
             newRule: false,//是否添加新规则
-            radioRule: ['store_type', 'is_sub', 'is_show', 'is_hot', 'is_benefit', 'is_new', 'is_good', 'is_best', 'spec_type'],//radio 当选规则
+            radioRule: ['store_type', 'is_sub', 'is_show', 'is_hot', 'is_gift', 'is_benefit', 'is_new', 'is_good', 'is_best', 'spec_type'],//radio 当选规则
             rule: { //多图选择规则
                 slider_image: {
                     maxLength: 5

+ 2 - 2
app/admin/view/ump/store_combination/attr_list.php

@@ -30,8 +30,8 @@
                     {/volist}
                     <th>图片</th>
                     <th>售价</th>
-                    <th>未拼中返佣</th>
-                    <th>拼中送积分</th>
+<!--                    <th>未拼中返佣</th>-->
+<!--                    <th>拼中送积分</th>-->
                     <th>成本价</th>
                     <th>原价</th>
                     <th>库存</th>

+ 34 - 17
app/api/controller/PublicController.php

@@ -40,23 +40,39 @@ class PublicController
 
     public function test(Request $request)
     {
-        BaseModel::beginTrans();
-        try {
-            $uid = $request->post('uid');
-            $res = TreeRecommend::insertTree($uid, User::where('uid', $uid)->value('spread_uid'));
-            $res = $res && self::pinkIntegral($uid);
-            $res = $res && self::pinkRecommend($uid);
-            if ($res) {
-                BaseModel::commitTrans();
-                return app('json')->success('成功');
-            } else {
-                BaseModel::rollbackTrans();
-                return app('json')->fail('失败');
+//        BaseModel::beginTrans();
+//        try {
+//            $uid = $request->post('uid');
+//            $res = TreeRecommend::insertTree($uid, User::where('uid', $uid)->value('spread_uid'));
+//            $res = $res && self::pinkIntegral($uid);
+//            $res = $res && self::pinkRecommend($uid);
+//            if ($res) {
+//                BaseModel::commitTrans();
+//                return app('json')->success('成功');
+//            } else {
+//                BaseModel::rollbackTrans();
+//                return app('json')->fail('失败');
+//            }
+//        } catch (Exception $e) {
+//            BaseModel::rollbackTrans();
+//            return app('json')->fail($e->getMessage());
+//        }
+        $province = SystemCity::where('parent_id', 0)->where('level', 0)->select();
+        $res = [];
+        foreach ($province as $v) {
+            $city = SystemCity::where('parent_id', $v['city_id'])->where('level', 1)->select();
+            $citys = [];
+            foreach ($city as $vv) {
+                $children = SystemCity::where('parent_id', $vv['city_id'])->where('level', 2)->select();
+                $dis = [];
+                foreach ($children as $vvv) {
+                    $dis[] = ['value' => $vvv['name'], 'label' => $vvv['name']];
+                }
+                $citys[] = ['value' => $vv['name'], 'label' => $vv['name'], 'children' => $dis];
             }
-        } catch (Exception $e) {
-            BaseModel::rollbackTrans();
-            return app('json')->fail($e->getMessage());
+            $res[] = ['value' => $v['name'], 'label' => $v['name'], 'children' => $citys];
         }
+        @file_put_contents('city.js', 'window.province_city_area=' . json_encode($res));
     }
 
     public static function pinkIntegral($uid)
@@ -124,7 +140,8 @@ class PublicController
         $info['bastBanner'] = sys_data('routine_home_bast_banner') ?? [];//TODO 首页精品推荐图片
         $benefit = StoreProduct::getBenefitProduct('id,image,store_name,cate_id,price,ot_price,stock,unit_name', $promotionNumber);//TODO 首页促销单品
         $lovely = sys_data('routine_home_new_banner') ?: [];//TODO 首发新品顶部图
-        $likeInfo = StoreProduct::getHotProduct('id,image,store_name,cate_id,price,ot_price,unit_name', 3);//TODO 热门榜单 猜你喜欢
+        $likeInfo = StoreProduct::getHotProduct('id,image,store_name,cate_id,price,ot_price,unit_name', 10);//TODO 热门榜单 猜你喜欢
+        $giftInfo = StoreProduct::getGiftProduct('id,image,store_name,cate_id,price,ot_price,unit_name', 10);//TODO 热门榜单 猜你喜欢
         $couponList = StoreCouponIssue::getIssueCouponList($request->uid(), 3);
         if ($request->uid()) {
             $subscribe = WechatUser::where('uid', $request->uid())->value('subscribe') ? true : false;
@@ -133,7 +150,7 @@ class PublicController
         }
         $newGoodsBananr = sys_config('new_goods_bananr');
         $tengxun_map_key = sys_config('tengxun_map_key');
-        return app('json')->successful(compact('banner', 'menus', 'roll', 'info', 'activity', 'lovely', 'benefit', 'likeInfo', 'logoUrl', 'couponList', 'site_name', 'subscribe', 'newGoodsBananr', 'tengxun_map_key'));
+        return app('json')->successful(compact('giftInfo', 'banner', 'menus', 'roll', 'info', 'activity', 'lovely', 'benefit', 'likeInfo', 'logoUrl', 'couponList', 'site_name', 'subscribe', 'newGoodsBananr', 'tengxun_map_key'));
     }
 
     /**

+ 2 - 1
app/api/controller/order/StoreOrderController.php

@@ -61,7 +61,8 @@ class StoreOrderController
         }
         $other = [
             'offlinePostage' => sys_config('offline_postage'),
-            'integralRatio' => sys_config('integral_ratio')
+            'integralRatio' => sys_config('integral_ratio'),
+            'is_gift' => $cartGroup['is_gift'],
         ];
         $usableCoupons = StoreCouponUser::getUsableCouponList($uid, $cartGroup, $priceGroup['totalPrice']);
         $usableCoupon = isset($usableCoupons[0]) ? $usableCoupons[0] : null;

+ 3 - 0
app/api/controller/store/StoreProductController.php

@@ -230,6 +230,9 @@ class StoreProductController
         } else if ($type == 4) {//TODO 促销单品
             $info['banner'] = sys_data('routine_home_benefit_banner') ?: [];//TODO 促销单品推荐图片
             $info['list'] = StoreProduct::getBenefitProduct('id,image,store_name,cate_id,price,ot_price,stock,unit_name,sort');//TODO 促销单品
+        } else if ($type == 5) {//TODO 礼包单品
+            $info['banner'] = sys_data('routine_home_benefit_banner') ?: [];//TODO 促销单品推荐图片
+            $info['list'] = StoreProduct::getGiftProduct('id,image,store_name,cate_id,price,ot_price,unit_name,sort,IFNULL(sales,0) + IFNULL(ficti,0) as sales', 0, $request->uid());//TODO 热门榜单 猜你喜欢
         }
         return app('json')->successful($info);
     }

+ 131 - 128
app/models/store/StoreCart.php

@@ -41,78 +41,78 @@ class StoreCart extends BaseModel
         return time();
     }
 
-    public static function setCart($uid,$product_id,$cart_num = 1,$product_attr_unique = '',$type='product',$is_new = 0,$combination_id=0,$seckill_id = 0,$bargain_id = 0)
+    public static function setCart($uid, $product_id, $cart_num = 1, $product_attr_unique = '', $type = 'product', $is_new = 0, $combination_id = 0, $seckill_id = 0, $bargain_id = 0)
     {
-        if($cart_num < 1) $cart_num = 1;
-        if($seckill_id){
+        if ($cart_num < 1) $cart_num = 1;
+        if ($seckill_id) {
             $StoreSeckillinfo = StoreSeckill::getValidProduct($seckill_id);
-            if(!$StoreSeckillinfo)
+            if (!$StoreSeckillinfo)
                 return self::setErrorInfo('该产品已下架或删除');
             $userbuycount = StoreOrder::where('uid', $uid)->where('paid', 1)->where('seckill_id', $seckill_id)->count();
-            if($StoreSeckillinfo['num'] <= $userbuycount || $StoreSeckillinfo['num'] < $cart_num)
-                return self::setErrorInfo('每人限购'.$StoreSeckillinfo['num'].'件');
-            $res = StoreProductAttrValue::where('product_id',$seckill_id)->where('unique',$product_attr_unique)->where('type',1)->field('suk,quota')->find();
-            if($cart_num > $res['quota'])
-                return self::setErrorInfo('该产品库存不足'.$cart_num);
-            $product_stock = StoreProductAttrValue::where('product_id',$StoreSeckillinfo['product_id'])->where('suk',$res['suk'])->where('type',0)->value('stock');
-            if($product_stock < $cart_num)
-                return self::setErrorInfo('该产品库存不足'.$cart_num);
-        }elseif($bargain_id){
-            if(!StoreBargain::validBargain($bargain_id))
+            if ($StoreSeckillinfo['num'] <= $userbuycount || $StoreSeckillinfo['num'] < $cart_num)
+                return self::setErrorInfo('每人限购' . $StoreSeckillinfo['num'] . '件');
+            $res = StoreProductAttrValue::where('product_id', $seckill_id)->where('unique', $product_attr_unique)->where('type', 1)->field('suk,quota')->find();
+            if ($cart_num > $res['quota'])
+                return self::setErrorInfo('该产品库存不足' . $cart_num);
+            $product_stock = StoreProductAttrValue::where('product_id', $StoreSeckillinfo['product_id'])->where('suk', $res['suk'])->where('type', 0)->value('stock');
+            if ($product_stock < $cart_num)
+                return self::setErrorInfo('该产品库存不足' . $cart_num);
+        } elseif ($bargain_id) {
+            if (!StoreBargain::validBargain($bargain_id))
                 return self::setErrorInfo('该产品已下架或删除');
             $StoreBargainInfo = StoreBargain::getBargain($bargain_id);
-            $res = StoreProductAttrValue::where('product_id',$bargain_id)->where('type',2)->field('suk,quota')->find();
-            if($cart_num > $res['quota'])
-                return self::setErrorInfo('该产品库存不足'.$cart_num);
-            $product_stock = StoreProductAttrValue::where('product_id',$StoreBargainInfo['product_id'])->where('suk',$res['suk'])->where('type',0)->value('stock');
-            if($product_stock < $cart_num)
-                return self::setErrorInfo('该产品库存不足'.$cart_num);
-        }elseif($combination_id){//拼团
+            $res = StoreProductAttrValue::where('product_id', $bargain_id)->where('type', 2)->field('suk,quota')->find();
+            if ($cart_num > $res['quota'])
+                return self::setErrorInfo('该产品库存不足' . $cart_num);
+            $product_stock = StoreProductAttrValue::where('product_id', $StoreBargainInfo['product_id'])->where('suk', $res['suk'])->where('type', 0)->value('stock');
+            if ($product_stock < $cart_num)
+                return self::setErrorInfo('该产品库存不足' . $cart_num);
+        } elseif ($combination_id) {//拼团
             $StoreCombinationInfo = StoreCombination::getCombinationOne($combination_id);
-            if(!$StoreCombinationInfo)
+            if (!$StoreCombinationInfo)
                 return self::setErrorInfo('该产品已下架或删除');
             $userbuycount = StoreOrder::where('uid', $uid)->where('paid', 1)->where('combination_id', $combination_id)->count();
-            if($StoreCombinationInfo['num'] <= $userbuycount || $StoreCombinationInfo['num'] < $cart_num)
-                return self::setErrorInfo('每人限购'.$StoreCombinationInfo['num'].'件');
-            $res = StoreProductAttrValue::where('product_id',$combination_id)->where('unique',$product_attr_unique)->where('type',3)->field('suk,quota')->find();
-            if($cart_num > $res['quota'])
-                return self::setErrorInfo('该产品库存不足'.$cart_num);
-            $product_stock = StoreProductAttrValue::where('product_id',$StoreCombinationInfo['product_id'])->where('suk',$res['suk'])->where('type',0)->value('stock');
-            if($product_stock < $cart_num)
-                return self::setErrorInfo('该产品库存不足'.$cart_num);
-        }else{
-            if(!StoreProduct::isValidProduct($product_id))
+            if ($StoreCombinationInfo['num'] <= $userbuycount || $StoreCombinationInfo['num'] < $cart_num)
+                return self::setErrorInfo('每人限购' . $StoreCombinationInfo['num'] . '件');
+            $res = StoreProductAttrValue::where('product_id', $combination_id)->where('unique', $product_attr_unique)->where('type', 3)->field('suk,quota')->find();
+            if ($cart_num > $res['quota'])
+                return self::setErrorInfo('该产品库存不足' . $cart_num);
+            $product_stock = StoreProductAttrValue::where('product_id', $StoreCombinationInfo['product_id'])->where('suk', $res['suk'])->where('type', 0)->value('stock');
+            if ($product_stock < $cart_num)
+                return self::setErrorInfo('该产品库存不足' . $cart_num);
+        } else {
+            if (!StoreProduct::isValidProduct($product_id))
                 return self::setErrorInfo('该产品已下架或删除');
-            if(!StoreProductAttr::issetProductUnique($product_id,$product_attr_unique))
+            if (!StoreProductAttr::issetProductUnique($product_id, $product_attr_unique))
                 return self::setErrorInfo('请选择有效的产品属性');
-            if(StoreProduct::getProductStock($product_id,$product_attr_unique) < $cart_num)
-                return self::setErrorInfo('该产品库存不足'.$cart_num);
+            if (StoreProduct::getProductStock($product_id, $product_attr_unique) < $cart_num)
+                return self::setErrorInfo('该产品库存不足' . $cart_num);
         }
-        if($cart = self::where('type', $type)->where('uid', $uid)->where('product_id', $product_id)->where('product_attr_unique', $product_attr_unique)->where('is_new', $is_new)->where('is_pay', 0)->where('is_del', 0)->where('combination_id', $combination_id)->where('bargain_id', $bargain_id)->where('seckill_id', $seckill_id)->find()){
-            if($is_new)
+        if ($cart = self::where('type', $type)->where('uid', $uid)->where('product_id', $product_id)->where('product_attr_unique', $product_attr_unique)->where('is_new', $is_new)->where('is_pay', 0)->where('is_del', 0)->where('combination_id', $combination_id)->where('bargain_id', $bargain_id)->where('seckill_id', $seckill_id)->find()) {
+            if ($is_new)
                 $cart->cart_num = $cart_num;
             else
                 $cart->cart_num = bcadd($cart_num, $cart->cart_num, 0);
             $cart->add_time = time();
             $cart->save();
             return $cart;
-        }else{
+        } else {
             $add_time = time();
-            return self::create(compact('uid','product_id','cart_num','product_attr_unique','is_new','type','combination_id','add_time','bargain_id','seckill_id'));
+            return self::create(compact('uid', 'product_id', 'cart_num', 'product_attr_unique', 'is_new', 'type', 'combination_id', 'add_time', 'bargain_id', 'seckill_id'));
         }
     }
 
-    public static function removeUserCart($uid,$ids)
+    public static function removeUserCart($uid, $ids)
     {
-        return self::where('uid',$uid)->where('id','IN',implode(',',$ids))->update(['is_del'=>1]);
+        return self::where('uid', $uid)->where('id', 'IN', implode(',', $ids))->update(['is_del' => 1]);
     }
 
     public static function getUserCartNum($uid, $type, $numType)
     {
-        if($numType){
-            return self::where('uid',$uid)->where('type',$type)->where('is_pay',0)->where('is_del',0)->where('is_new',0)->count();
-        }else{
-            return self::where('uid',$uid)->where('type',$type)->where('is_pay',0)->where('is_del',0)->where('is_new',0)->sum('cart_num');
+        if ($numType) {
+            return self::where('uid', $uid)->where('type', $type)->where('is_pay', 0)->where('is_del', 0)->where('is_new', 0)->count();
+        } else {
+            return self::where('uid', $uid)->where('type', $type)->where('is_pay', 0)->where('is_del', 0)->where('is_new', 0)->sum('cart_num');
         }
     }
 
@@ -127,59 +127,60 @@ class StoreCart extends BaseModel
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\exception\DbException
      */
-    public static function changeUserCartNum($cartId,$cartNum,$uid)
+    public static function changeUserCartNum($cartId, $cartNum, $uid)
     {
-        $count = self::where('uid',$uid)->where('id',$cartId)->count();
-        if(!$count) return self::setErrorInfo('参数错误');
-        $cartInfo = self::where('uid',$uid)->where('id',$cartId)->field('product_id,combination_id,seckill_id,bargain_id,product_attr_unique,cart_num')->find()->toArray();
+        $count = self::where('uid', $uid)->where('id', $cartId)->count();
+        if (!$count) return self::setErrorInfo('参数错误');
+        $cartInfo = self::where('uid', $uid)->where('id', $cartId)->field('product_id,combination_id,seckill_id,bargain_id,product_attr_unique,cart_num')->find()->toArray();
         $stock = 0;
-        if($cartInfo['bargain_id']){
+        if ($cartInfo['bargain_id']) {
             //TODO 获取砍价产品的库存
             $stock = 0;
-        }else if($cartInfo['seckill_id']){
+        } else if ($cartInfo['seckill_id']) {
             //TODO 获取秒杀产品的库存
             $stock = 0;
-        }else if($cartInfo['combination_id']){
+        } else if ($cartInfo['combination_id']) {
             //TODO 获取拼团产品的库存
             $stock = 0;
-        }else if($cartInfo['product_id']){
+        } else if ($cartInfo['product_id']) {
             //TODO 获取普通产品的库存
-            $stock = StoreProduct::getProductStock($cartInfo['product_id'],$cartInfo['product_attr_unique']);
+            $stock = StoreProduct::getProductStock($cartInfo['product_id'], $cartInfo['product_attr_unique']);
         }
-        if(!$stock) return self::setErrorInfo('暂无库存');
-        if(!$cartNum) return self::setErrorInfo('库存错误');
-        if($stock < $cartNum) return self::setErrorInfo('库存不足'.$cartNum);
-        if($cartInfo['cart_num'] == $cartNum) return true;
-        return self::where('uid',$uid)->where('id',$cartId)->update(['cart_num'=>$cartNum]);
+        if (!$stock) return self::setErrorInfo('暂无库存');
+        if (!$cartNum) return self::setErrorInfo('库存错误');
+        if ($stock < $cartNum) return self::setErrorInfo('库存不足' . $cartNum);
+        if ($cartInfo['cart_num'] == $cartNum) return true;
+        return self::where('uid', $uid)->where('id', $cartId)->update(['cart_num' => $cartNum]);
     }
 
-    public static function getUserProductCartList($uid,$cartIds='',$status=0)
+    public static function getUserProductCartList($uid, $cartIds = '', $status = 0)
     {
-        $productInfoField = 'id,image,price,ot_price,vip_price,postage,give_integral,sales,stock,store_name,unit_name,is_show,is_del,is_postage,cost,is_sub,temp_id,store_type';
+        $productInfoField = 'id,image,price,ot_price,vip_price,postage,give_integral,sales,stock,store_name,unit_name,is_show,is_del,is_postage,cost,is_sub,temp_id,store_type,is_gift';
         $seckillInfoField = 'id,image,price,ot_price,postage,give_integral,sales,stock,title as store_name,unit_name,is_show,is_del,is_postage,cost,temp_id,weight,volume,start_time,stop_time,time_id';
         $bargainInfoField = 'id,image,min_price as price,price as ot_price,postage,give_integral,sales,stock,title as store_name,unit_name,status as is_show,is_del,is_postage,cost,temp_id,weight,volume';
         $combinationInfoField = 'id,image,price,postage,sales,stock,title as store_name,is_show,is_del,is_postage,cost,temp_id,weight,volume';
         $model = new self();
         $valid = $invalid = [];
-        $model = $model->where('uid',$uid)->where('type','product')->where('is_pay',0)
-            ->where('is_del',0);
-        if(!$status) $model = $model->where('is_new',0);
-        if($cartIds) $model = $model->where('id','IN',$cartIds);
+        $model = $model->where('uid', $uid)->where('type', 'product')->where('is_pay', 0)
+            ->where('is_del', 0);
+        if (!$status) $model = $model->where('is_new', 0);
+        if ($cartIds) $model = $model->where('id', 'IN', $cartIds);
         $model = $model->order('add_time DESC');
         $list = $model->select()->toArray();
-        if(!count($list)) return compact('valid','invalid');
+        if (!count($list)) return compact('valid', 'invalid');
         $now = time();
-        foreach ($list as $k=>$cart){
-            if($cart['seckill_id']){
+        $is_gift = false;
+        foreach ($list as $k => $cart) {
+            if ($cart['seckill_id']) {
                 $product = StoreSeckill::field($seckillInfoField)
                     ->find($cart['seckill_id'])->toArray();
-            }elseif($cart['bargain_id']){
+            } elseif ($cart['bargain_id']) {
                 $product = StoreBargain::field($bargainInfoField)
                     ->find($cart['bargain_id'])->toArray();
-            }elseif($cart['combination_id']){
+            } elseif ($cart['combination_id']) {
                 $product = StoreCombination::field($combinationInfoField)
                     ->find($cart['combination_id'])->toArray();
-            }else{
+            } else {
                 $product = StoreProduct::field($productInfoField)
                     ->find($cart['product_id'])->toArray();
             }
@@ -187,21 +188,22 @@ class StoreCart extends BaseModel
             $cart['productInfo'] = $product;
 
             //商品不存在
-            if(!$product){
-                $model->where('id',$cart['id'])->update(['is_del'=>1]);
-            //商品删除或无库存
-            }else if(!$product['is_show'] || $product['is_del'] || !$product['stock']) {
+            if (!$product) {
+                $model->where('id', $cart['id'])->update(['is_del' => 1]);
+                //商品删除或无库存
+            } else if (!$product['is_show'] || $product['is_del'] || !$product['stock']) {
                 $invalid[] = $cart;
 
-            //秒杀产品未开启或者已结束
-            } else if ($cart['seckill_id'] && ($product['start_time'] > $now || $product['stop_time'] < $now-86400)) {
+                //秒杀产品未开启或者已结束
+            } else if ($cart['seckill_id'] && ($product['start_time'] > $now || $product['stop_time'] < $now - 86400)) {
                 $invalid[] = $product;
                 //商品属性不对应
-            } else if(!StoreProductAttr::issetProductUnique($cart['product_id'],$cart['product_attr_unique']) && !$cart['combination_id'] && !$cart['seckill_id']&& !$cart['bargain_id']){
+            } else if (!StoreProductAttr::issetProductUnique($cart['product_id'], $cart['product_attr_unique']) && !$cart['combination_id'] && !$cart['seckill_id'] && !$cart['bargain_id']) {
                 $invalid[] = $cart;
-            //正常商品
-            }else{
+                //正常商品
+            } else {
 
+                if (isset($product['is_gift']) && $product['is_gift']) $is_gift = true;
                 if ($cart['seckill_id']) {
                     $config = SystemGroupData::get($product['time_id']);
                     if ($config) {
@@ -223,18 +225,18 @@ class StoreCart extends BaseModel
 
                 }
 
-                if($cart['product_attr_unique']){
+                if ($cart['product_attr_unique']) {
                     $attrInfo = StoreProductAttr::uniqueByAttrInfo($cart['product_attr_unique']);
                     //商品没有对应的属性
-                    if(!$attrInfo || !$attrInfo['stock'])
+                    if (!$attrInfo || !$attrInfo['stock'])
                         $invalid[] = $cart;
-                    else{
+                    else {
                         $cart['productInfo']['attrInfo'] = $attrInfo;
-                        if($cart['combination_id'] || $cart['seckill_id'] || $cart['bargain_id']) {
+                        if ($cart['combination_id'] || $cart['seckill_id'] || $cart['bargain_id'] || (isset($cart['productInfo']['is_gift']) && $cart['productInfo']['is_gift'])) {
                             $cart['truePrice'] = $attrInfo['price'];
                             $cart['vip_truePrice'] = 0;
-                        }else {
-                            $cart['truePrice'] = (float)StoreProduct::setLevelPrice($attrInfo['price'],$uid,true);
+                        } else {
+                            $cart['truePrice'] = (float)StoreProduct::setLevelPrice($attrInfo['price'], $uid, true);
                             $cart['vip_truePrice'] = (float)StoreProduct::setLevelPrice($attrInfo['price'], $uid);
                         }
                         $cart['trueStock'] = $attrInfo['stock'];
@@ -242,17 +244,17 @@ class StoreCart extends BaseModel
                         $cart['productInfo']['image'] = empty($attrInfo['image']) ? $cart['productInfo']['image'] : $attrInfo['image'];
                         $valid[] = $cart;
                     }
-                }else{
-                    if($cart['combination_id'] || $cart['seckill_id'] || $cart['bargain_id']) {
+                } else {
+                    if ($cart['combination_id'] || $cart['seckill_id'] || $cart['bargain_id'] || (isset($cart['productInfo']['is_gift']) && $cart['productInfo']['is_gift'])) {
                         $cart['truePrice'] = $cart['productInfo']['price'];
                         $cart['vip_truePrice'] = 0;
-                        if($cart['bargain_id']){
-                            $cart['productInfo']['attrInfo'] = StoreProductAttrValue::where('product_id',$cart['bargain_id'])->where('type',2)->find();
+                        if ($cart['bargain_id']) {
+                            $cart['productInfo']['attrInfo'] = StoreProductAttrValue::where('product_id', $cart['bargain_id'])->where('type', 2)->find();
                         }
                         $cart['productInfo']['attrInfo']['weight'] = $product['weight'];
                         $cart['productInfo']['attrInfo']['volume'] = $product['volume'];
-                    }else {
-                        $cart['truePrice'] = (float)StoreProduct::setLevelPrice($cart['productInfo']['price'],$uid,true);
+                    } else {
+                        $cart['truePrice'] = (float)StoreProduct::setLevelPrice($cart['productInfo']['price'], $uid, true);
                         $cart['vip_truePrice'] = (float)StoreProduct::setLevelPrice($cart['productInfo']['price'], $uid);
                     }
                     $cart['trueStock'] = $cart['productInfo']['stock'];
@@ -261,26 +263,26 @@ class StoreCart extends BaseModel
                 }
             }
         }
-        foreach ($valid as $k=>$cart){
-            if($cart['trueStock'] < $cart['cart_num']){
+        foreach ($valid as $k => $cart) {
+            if ($cart['trueStock'] < $cart['cart_num']) {
                 $cart['cart_num'] = $cart['trueStock'];
-                $model->where('id',$cart['id'])->update(['cart_num'=>$cart['cart_num']]);
+                $model->where('id', $cart['id'])->update(['cart_num' => $cart['cart_num']]);
                 $valid[$k] = $cart;
             }
 
-            unset($valid[$k]['uid'],$valid[$k]['is_del'],$valid[$k]['is_new'],$valid[$k]['is_pay'],$valid[$k]['add_time']);
-            if(isset($valid[$k]['productInfo'])){
-                unset($valid[$k]['productInfo']['is_del'],$valid[$k]['productInfo']['is_del'],$valid[$k]['productInfo']['is_show']);
+            unset($valid[$k]['uid'], $valid[$k]['is_del'], $valid[$k]['is_new'], $valid[$k]['is_pay'], $valid[$k]['add_time']);
+            if (isset($valid[$k]['productInfo'])) {
+                unset($valid[$k]['productInfo']['is_del'], $valid[$k]['productInfo']['is_del'], $valid[$k]['productInfo']['is_show']);
             }
         }
-        foreach ($invalid as $k=>$cart){
-            unset($valid[$k]['uid'],$valid[$k]['is_del'],$valid[$k]['is_new'],$valid[$k]['is_pay'],$valid[$k]['add_time']);
-            if(isset($invalid[$k]['productInfo'])){
-                unset($invalid[$k]['productInfo']['is_del'],$invalid[$k]['productInfo']['is_del'],$invalid[$k]['productInfo']['is_show']);
+        foreach ($invalid as $k => $cart) {
+            unset($valid[$k]['uid'], $valid[$k]['is_del'], $valid[$k]['is_new'], $valid[$k]['is_pay'], $valid[$k]['add_time']);
+            if (isset($invalid[$k]['productInfo'])) {
+                unset($invalid[$k]['productInfo']['is_del'], $invalid[$k]['productInfo']['is_del'], $invalid[$k]['productInfo']['is_show']);
             }
         }
 
-        return compact('valid','invalid');
+        return compact('valid', 'invalid', 'is_gift');
     }
 
     /**
@@ -289,47 +291,47 @@ class StoreCart extends BaseModel
      * @param string $cartIds
      * @return array
      */
-    public static function getUserCombinationProductCartList($uid,$cartIds='')
+    public static function getUserCombinationProductCartList($uid, $cartIds = '')
     {
         $productInfoField = 'id,image,slider_image,price,cost,ot_price,vip_price,postage,mer_id,give_integral,cate_id,sales,stock,store_name,unit_name,is_show,is_del,is_postage';
         $model = new self();
         $valid = $invalid = [];
-        $model = $model->where('uid',$uid)->where('type','product')->where('is_pay',0)
-            ->where('is_del',0);
-        if($cartIds) $model->where('id','IN',$cartIds);
+        $model = $model->where('uid', $uid)->where('type', 'product')->where('is_pay', 0)
+            ->where('is_del', 0);
+        if ($cartIds) $model->where('id', 'IN', $cartIds);
         $list = $model->select()->toArray();
-        if(!count($list)) return compact('valid','invalid');
-        foreach ($list as $k=>$cart){
+        if (!count($list)) return compact('valid', 'invalid');
+        foreach ($list as $k => $cart) {
             $product = StoreProduct::field($productInfoField)
                 ->find($cart['product_id'])->toArray();
             $cart['productInfo'] = $product;
             //商品不存在
-            if(!$product){
-                $model->where('id',$cart['id'])->update(['is_del'=>1]);
-            //商品删除或无库存
-            }else if(!$product['is_show'] || $product['is_del'] || !$product['stock']){
+            if (!$product) {
+                $model->where('id', $cart['id'])->update(['is_del' => 1]);
+                //商品删除或无库存
+            } else if (!$product['is_show'] || $product['is_del'] || !$product['stock']) {
                 $invalid[] = $cart;
-            //商品属性不对应
+                //商品属性不对应
 //            }else if(!StoreProductAttr::issetProductUnique($cart['product_id'],$cart['product_attr_unique'])){
 //                $invalid[] = $cart;
-            //正常商品
-            }else{
-                $cart['truePrice'] = (float)StoreCombination::where('id',$cart['combination_id'])->value('price');
-                $cart['costPrice'] = (float)StoreCombination::where('id',$cart['combination_id'])->value('cost');
-                $cart['trueStock'] = StoreCombination::where('id',$cart['combination_id'])->value('stock');
+                //正常商品
+            } else {
+                $cart['truePrice'] = (float)StoreCombination::where('id', $cart['combination_id'])->value('price');
+                $cart['costPrice'] = (float)StoreCombination::where('id', $cart['combination_id'])->value('cost');
+                $cart['trueStock'] = StoreCombination::where('id', $cart['combination_id'])->value('stock');
                 $valid[] = $cart;
             }
         }
 
-        foreach ($valid as $k=>$cart){
-            if($cart['trueStock'] < $cart['cart_num']){
+        foreach ($valid as $k => $cart) {
+            if ($cart['trueStock'] < $cart['cart_num']) {
                 $cart['cart_num'] = $cart['trueStock'];
-                $model->where('id',$cart['id'])->update(['cart_num'=>$cart['cart_num']]);
+                $model->where('id', $cart['id'])->update(['cart_num' => $cart['cart_num']]);
                 $valid[$k] = $cart;
             }
         }
 
-        return compact('valid','invalid');
+        return compact('valid', 'invalid');
     }
 
     /**
@@ -339,15 +341,16 @@ class StoreCart extends BaseModel
      */
     public static function getCartIdsProduct(array $ids)
     {
-        return self::whereIn('id',$ids)->column('product_id','id');
+        return self::whereIn('id', $ids)->column('product_id', 'id');
     }
 
     /**
-    *  获取购物车内最新一张产品图
+     *  获取购物车内最新一张产品图
      */
-    public static function getProductImage(array $cart_id){
-        return self::whereIn('a.id',$cart_id)->alias('a')->order('a.id desc')
-            ->join('store_product p','p.id = a.product_id')->value('p.image');
+    public static function getProductImage(array $cart_id)
+    {
+        return self::whereIn('a.id', $cart_id)->alias('a')->order('a.id desc')
+            ->join('store_product p', 'p.id = a.product_id')->value('p.image');
     }
 
 }

+ 152 - 2
app/models/store/StoreOrder.php

@@ -9,6 +9,7 @@ namespace app\models\store;
 
 use app\admin\model\system\ShippingTemplatesFree;
 use app\admin\model\system\ShippingTemplatesRegion;
+use app\models\tree\TreeRecommend;
 use crmeb\basic\BaseModel;
 use think\db\exception\DataNotFoundException;
 use think\db\exception\DbException;
@@ -469,7 +470,11 @@ class StoreOrder extends BaseModel
                 'is_channel' => $isChannel,
                 'add_time' => time(),
                 'unique' => $key,
+                'is_gift' => $other['is_gift'],
                 'shipping_type' => $shipping_type,
+                'province' => $addressInfo['province'],
+                'city' => $addressInfo['city'],
+                'district' => $addressInfo['district'],
             ];
             if ($shipping_type === 2) {
                 $orderInfo['verify_code'] = self::getStoreCode();
@@ -765,7 +770,7 @@ class StoreOrder extends BaseModel
         if (!$order) return self::setErrorInfo('支付订单不存在!');
         if ($order['refund_status'] == 2) return self::setErrorInfo('订单已退款!');
         if ($order['refund_status'] == 1) return self::setErrorInfo('正在申请退款中!');
-        if ($order['combination']) return self::setErrorInfo('拼团订单不可退款!');
+        if ($order['is_gift']) return self::setErrorInfo('礼包订单不可退款!');
         if ($order['status'] == 1) return self::setErrorInfo('订单当前无法退款!');
         self::beginTrans();
         $res1 = false !== StoreOrderStatus::status($order['id'], 'apply_refund', '用户申请退款,原因:' . $refundReasonWap);
@@ -823,10 +828,155 @@ class StoreOrder extends BaseModel
         UserBill::expend('购买商品', $order['uid'], 'now_money', 'pay_money', $order['pay_price'], $order['id'], $now_money, '支付' . floatval($order['pay_price']) . '元购买商品');
         //支付成功后
         event('OrderPaySuccess', [$order, $formId]);
-        $res = $res1 && $resPink && User::backOrderBrokerage($order);
+        if ($order['is_gift']) {
+            TreeRecommend::insertTree($order['uid'], User::where('uid', $order['uid'])->value('spread_uid'));
+            StorePink::pinkRecommend($order['id']);
+        }
+        $res = $res1 && $resPink && User::backOrderBrokerage($order) && self::areaAward($order);
         return false !== $res;
     }
 
+    public static function areaAward($order)
+    {
+        if (isset($order['combination_id']) && $order['combination_id']) return true;
+        if (isset($order['seckill_id']) && $order['seckill_id']) return true;
+        if (isset($order['bargain_id']) && $order['bargain_id']) return true;
+        $userInfo = User::getUserInfo($order['uid']);
+        $cartId = is_string($order['cart_id']) ? json_decode($order['cart_id'], true) : $order['cart_id'];
+        list($realPrice, $virtualPrice) = StoreProduct::getProductPrice($cartId);
+        if ($realPrice <= 0 && $virtualPrice <= 0) return true;
+
+        $province_admin_ratio = sys_config('province_admin_ratio', 0);
+        $city_admin_ratio = sys_config('city_admin_ratio', 0);
+        $district_admin_ratio = sys_config('district_admin_ratio', 0);
+        $area_recommend_ratio = sys_config('area_recommend_ratio', 0);
+        $res = true;
+        $district = User::where('area_admin', 1)->where('area_province', $order['province'])->where('area_city', $order['city'])->where('area_district', $order['district'])->select();
+        if (count($district) > 0) {
+            $money_real = bcmul(bcdiv($district_admin_ratio, 100, 4), $realPrice, 2);
+            $money_virtual = bcmul(bcdiv($district_admin_ratio, 100, 4), $virtualPrice, 2);
+            $every_money_real = bcdiv($money_real, count($district), 2);
+            $every_money_virtual = bcdiv($money_virtual, count($district), 2);
+            if ($every_money_real <= 0 && $every_money_virtual <= 0) return true;
+            $res = true;
+            foreach ($district as $v) {
+                if ($every_money_real > 0) {
+                    $balance = bcadd($v['brokerage_price'], $every_money_real, 2);
+                    $mark = $userInfo['nickname'] . '成功消费[实物产品]' . floatval($order['pay_price']) . '元,区代理分红' . floatval($every_money_real);
+                    $res1 = UserBill::income('区代理分红', $v['uid'], 'now_money', 'brokerage', $every_money_real, $order['id'], $balance, $mark, 0);
+                    $res = $res && $res1;
+                    $sp_money = bcmul($every_money_real, bcdiv($area_recommend_ratio, 100, 4), 2);
+                    if ($v['spread_uid'] && $sp_money > 0) {
+                        $sp = User::where('uid', $v['spread_uid']);
+                        $balance = bcadd($sp['brokerage_price'], $sp_money, 2);
+                        $mark = $userInfo['nickname'] . '成功消费[实物产品]' . floatval($order['pay_price']) . '元,推荐代理分红' . floatval($sp_money);
+                        $res1 = UserBill::income('推荐代理分红', $sp['uid'], 'now_money', 'brokerage', $sp_money, $order['id'], $balance, $mark, 0);
+                        $res = $res && $res1;
+                    }
+                }
+                if ($every_money_virtual > 0) {
+                    $balance = bcadd($v['brokerage_price'], $every_money_virtual, 2);
+                    $mark = $userInfo['nickname'] . '成功消费[虚拟产品]' . floatval($order['pay_price']) . '元,区代理分红' . floatval($every_money_virtual);
+                    $res1 = UserBill::income('区代理分红', $v['uid'], 'now_money', 'brokerage', $every_money_virtual, $order['id'], $balance, $mark);
+                    $res2 = self::bcInc($v['uid'], 'brokerage_price', $every_money_virtual, 'uid');
+                    $res = $res && $res1 && $res2;
+                    $sp_money = bcmul($every_money_virtual, bcdiv($area_recommend_ratio, 100, 4), 2);
+                    if ($v['spread_uid'] && $sp_money > 0) {
+                        $sp = User::where('uid', $v['spread_uid']);
+                        $balance = bcadd($sp['brokerage_price'], $sp_money, 2);
+                        $mark = $userInfo['nickname'] . '成功消费[虚拟产品]' . floatval($order['pay_price']) . '元,推荐代理分红' . floatval($sp_money);
+                        $res1 = UserBill::income('推荐代理分红', $sp['uid'], 'now_money', 'brokerage', $sp_money, $order['id'], $balance, $mark, 0);
+                        $res2 = self::bcInc($sp['uid'], 'brokerage_price', $sp_money, 'uid');
+                        $res = $res && $res1 && $res2;
+                    }
+                }
+            }
+        }
+        $city = User::where('area_admin', 2)->where('area_province', $order['province'])->where('area_city', $order['city'])->select();
+        if (count($city) > 0) {
+            $money_real = bcmul(bcdiv($city_admin_ratio, 100, 4), $realPrice, 2);
+            $money_virtual = bcmul(bcdiv($city_admin_ratio, 100, 4), $virtualPrice, 2);
+            $every_money_real = bcdiv($money_real, count($city), 2);
+            $every_money_virtual = bcdiv($money_virtual, count($city), 2);
+            if ($every_money_real <= 0 && $every_money_virtual <= 0) return true;
+            $res = true;
+            foreach ($city as $v) {
+                if ($every_money_real > 0) {
+                    $balance = bcadd($v['brokerage_price'], $every_money_real, 2);
+                    $mark = $userInfo['nickname'] . '成功消费[实物产品]' . floatval($order['pay_price']) . '元,市代理分红' . floatval($every_money_real);
+                    $res1 = UserBill::income('市代理分红', $v['uid'], 'now_money', 'brokerage', $every_money_real, $order['id'], $balance, $mark, 0);
+                    $res = $res && $res1;
+                    $sp_money = bcmul($every_money_real, bcdiv($area_recommend_ratio, 100, 4), 2);
+                    if ($v['spread_uid'] && $sp_money > 0) {
+                        $sp = User::where('uid', $v['spread_uid']);
+                        $balance = bcadd($sp['brokerage_price'], $sp_money, 2);
+                        $mark = $userInfo['nickname'] . '成功消费[实物产品]' . floatval($order['pay_price']) . '元,推荐代理分红' . floatval($sp_money);
+                        $res1 = UserBill::income('推荐代理分红', $sp['uid'], 'now_money', 'brokerage', $sp_money, $order['id'], $balance, $mark, 0);
+                        $res = $res && $res1;
+                    }
+                }
+                if ($every_money_virtual > 0) {
+                    $balance = bcadd($v['brokerage_price'], $every_money_virtual, 2);
+                    $mark = $userInfo['nickname'] . '成功消费[虚拟产品]' . floatval($order['pay_price']) . '元,市代理分红' . floatval($every_money_virtual);
+                    $res1 = UserBill::income('市代理分红', $v['uid'], 'now_money', 'brokerage', $every_money_virtual, $order['id'], $balance, $mark);
+                    $res2 = self::bcInc($v['uid'], 'brokerage_price', $every_money_virtual, 'uid');
+                    $res = $res && $res1 && $res2;
+                    $sp_money = bcmul($every_money_virtual, bcdiv($area_recommend_ratio, 100, 4), 2);
+                    if ($v['spread_uid'] && $sp_money > 0) {
+                        $sp = User::where('uid', $v['spread_uid']);
+                        $balance = bcadd($sp['brokerage_price'], $sp_money, 2);
+                        $mark = $userInfo['nickname'] . '成功消费[虚拟产品]' . floatval($order['pay_price']) . '元,推荐代理分红' . floatval($sp_money);
+                        $res1 = UserBill::income('推荐代理分红', $sp['uid'], 'now_money', 'brokerage', $sp_money, $order['id'], $balance, $mark, 0);
+                        $res2 = self::bcInc($sp['uid'], 'brokerage_price', $sp_money, 'uid');
+                        $res = $res && $res1 && $res2;
+                    }
+                }
+            }
+        }
+        $province = User::where('area_admin', 3)->where('area_province', $order['province'])->select();
+        if (count($province) > 0) {
+            $money_real = bcmul(bcdiv($province_admin_ratio, 100, 4), $realPrice, 2);
+            $money_virtual = bcmul(bcdiv($province_admin_ratio, 100, 4), $virtualPrice, 2);
+            $every_money_real = bcdiv($money_real, count($province), 2);
+            $every_money_virtual = bcdiv($money_virtual, count($province), 2);
+            if ($every_money_real <= 0 && $every_money_virtual <= 0) return true;
+            $res = true;
+            foreach ($province as $v) {
+                if ($every_money_real > 0) {
+                    $balance = bcadd($v['brokerage_price'], $every_money_real, 2);
+                    $mark = $userInfo['nickname'] . '成功消费[实物产品]' . floatval($order['pay_price']) . '元,省代理分红' . floatval($every_money_real);
+                    $res1 = UserBill::income('省代理分红', $v['uid'], 'now_money', 'brokerage', $every_money_real, $order['id'], $balance, $mark, 0);
+                    $res = $res && $res1;
+                    $sp_money = bcmul($every_money_real, bcdiv($area_recommend_ratio, 100, 4), 2);
+                    if ($v['spread_uid'] && $sp_money > 0) {
+                        $sp = User::where('uid', $v['spread_uid']);
+                        $balance = bcadd($sp['brokerage_price'], $sp_money, 2);
+                        $mark = $userInfo['nickname'] . '成功消费[实物产品]' . floatval($order['pay_price']) . '元,推荐代理分红' . floatval($sp_money);
+                        $res1 = UserBill::income('推荐代理分红', $sp['uid'], 'now_money', 'brokerage', $sp_money, $order['id'], $balance, $mark, 0);
+                        $res = $res && $res1;
+                    }
+                }
+                if ($every_money_virtual > 0) {
+                    $balance = bcadd($v['brokerage_price'], $every_money_virtual, 2);
+                    $mark = $userInfo['nickname'] . '成功消费[虚拟产品]' . floatval($order['pay_price']) . '元,省代理分红' . floatval($every_money_virtual);
+                    $res1 = UserBill::income('省代理分红', $v['uid'], 'now_money', 'brokerage', $every_money_virtual, $order['id'], $balance, $mark);
+                    $res2 = self::bcInc($v['uid'], 'brokerage_price', $every_money_virtual, 'uid');
+                    $res = $res && $res1 && $res2;
+                    $sp_money = bcmul($every_money_virtual, bcdiv($area_recommend_ratio, 100, 4), 2);
+                    if ($v['spread_uid'] && $sp_money > 0) {
+                        $sp = User::where('uid', $v['spread_uid']);
+                        $balance = bcadd($sp['brokerage_price'], $sp_money, 2);
+                        $mark = $userInfo['nickname'] . '成功消费[虚拟产品]' . floatval($order['pay_price']) . '元,推荐代理分红' . floatval($sp_money);
+                        $res1 = UserBill::income('推荐代理分红', $sp['uid'], 'now_money', 'brokerage', $sp_money, $order['id'], $balance, $mark, 0);
+                        $res2 = self::bcInc($sp['uid'], 'brokerage_price', $sp_money, 'uid');
+                        $res = $res && $res1 && $res2;
+                    }
+                }
+            }
+        }
+        return $res;
+    }
+
     /*
      * 线下支付消息通知
      * 待完善

+ 23 - 23
app/models/store/StorePink.php

@@ -543,27 +543,27 @@ class StorePink extends BaseModel
             if (self::setPinkStatus($idAll)) {
                 self::setPinkStopTime($idAll);
                 $bingo = [];
-                for ($i = 0; $i < $bingo_people; $i++) {
-                    do {
-                        $id = $idAll[rand(0, count($idAll) - 1)];
-                    } while (in_array($id, $bingo) || !$id);
-                    $bingo[] = $id;
-                }
+//                for ($i = 0; $i < $bingo_people; $i++) {
+//                    do {
+//                        $id = $idAll[rand(0, count($idAll) - 1)];
+//                    } while (in_array($id, $bingo) || !$id);
+//                    $bingo[] = $id;
+//                }
                 if (in_array($uid, $uidAll)) {
                     if (self::isTpl($uidAll, $pinkT['id'])) self::orderPinkAfter($uidAll, $pinkT['id']);
                     $pinkBool = 1;
                 } else  $pinkBool = 3;
-                foreach ($idAll as $vi) {
-                    $pink_info = self::get($vi);
-                    if (!in_array($vi, $bingo)) {
-                        StoreOrder::refundPink($pink_info['order_id_key']);
-                        self::pinkReturn($pink_info['order_id_key']);
-                    } else {
-                        TreeRecommend::insertTree($pink_info['uid'], User::where('uid', $pink_info['uid'])->value('spread_uid'));
-                        self::pinkIntegral($pink_info['order_id_key']);
-                    }
-                    self::pinkRecommend($pink_info['order_id_key']);
-                }
+//                foreach ($idAll as $vi) {
+//                    $pink_info = self::get($vi);
+//                    if (!in_array($vi, $bingo)) {
+//                        StoreOrder::refundPink($pink_info['order_id_key']);
+//                        self::pinkReturn($pink_info['order_id_key']);
+//                    } else {
+//                        TreeRecommend::insertTree($pink_info['uid'], User::where('uid', $pink_info['uid'])->value('spread_uid'));
+//                        self::pinkIntegral($pink_info['order_id_key']);
+//                    }
+//                    self::pinkRecommend($pink_info['order_id_key']);
+//                }
             }
             return $pinkBool;
         } catch (\Exception $e) {
@@ -590,8 +590,8 @@ class StorePink extends BaseModel
                 $pinkBool = -1;
                 array_push($pinkAll, $pinkT);
                 foreach ($pinkAll as $v) {
-//                    if (StoreOrder::orderApplyRefund(StoreOrder::getPinkOrderId($v['order_id_key']), $v['uid'], '拼团时间超时') && self::isTpl($v['uid'], $pinkT['id'])) {
-                    if (StoreOrder::refundPink($v['order_id_key']) && self::isTpl($v['uid'], $pinkT['id'])) {
+                    if (StoreOrder::orderApplyRefund(StoreOrder::getPinkOrderId($v['order_id_key']), $v['uid'], '拼团时间超时') && self::isTpl($v['uid'], $pinkT['id'])) {
+//                    if (StoreOrder::refundPink($v['order_id_key']) && self::isTpl($v['uid'], $pinkT['id'])) {
                         if ($isIds) array_push($pinkIds, $v['id']);
                         self::orderPinkAfterNo($pinkT['uid'], $pinkT['id']);
                     } else {
@@ -664,8 +664,8 @@ class StorePink extends BaseModel
         if ($return > 0) {
             $balance_integral = User::where('uid', $spread['uid'])->value('integral');
             $balance_brokerage = User::where('uid', $spread['uid'])->value('brokerage_price');
-            $res = $res && UserBill::expend('推荐拼团奖[积分转换]', $spread['uid'], 'integral', 'pink_recommend_pay', $return, $order_id, bcsub($balance_integral, $return, 2), '推荐用户拼团,响亮积分转为推荐奖' . $return);
-            $res = $res && UserBill::income('推荐拼团奖', $spread['uid'], 'now_money', 'brokerage', $return, $order_id, bcadd($balance_brokerage, $return, 2), '推荐用户拼团,响亮积分转为推荐奖' . $return);
+            $res = $res && UserBill::expend('礼包推荐奖[积分转换]', $spread['uid'], 'integral', 'pink_recommend_pay', $return, $order_id, bcsub($balance_integral, $return, 2), '推荐用户购礼包商品,响亮积分转为推荐奖' . $return);
+            $res = $res && UserBill::income('礼包推荐奖', $spread['uid'], 'now_money', 'brokerage', $return, $order_id, bcadd($balance_brokerage, $return, 2), '推荐用户购礼包商品' . $return);
             $res = $res && User::where('uid', $spread['uid'])->dec('integral', $return)->update();
             $res = $res && User::where('uid', $spread['uid'])->inc('brokerage_price', $return)->update();
             $res = $res && User::where('uid', $spread['uid'])->update(['last_recommend_award' => ($spread['last_recommend_award'] ? 0 : 1)]);
@@ -862,8 +862,8 @@ class StorePink extends BaseModel
         $refundPinkList = self::where('id', 'IN', $pinkList)->column('order_id,uid', 'id');
         if (!count($refundPinkList)) return true;
         foreach ($refundPinkList as $key => &$item) {
-            StoreOrder::refundPink($item['id']);
-//            StoreOrder::orderApplyRefund($item['order_id'], $item['uid'], '拼团时间超时');//申请退款
+//            StoreOrder::refundPink($item['id']);
+            StoreOrder::orderApplyRefund($item['order_id'], $item['uid'], '拼团时间超时');//申请退款
         }
     }
 

+ 30 - 4
app/models/store/StoreProduct.php

@@ -17,6 +17,9 @@ use crmeb\traits\ModelTrait;
 use app\models\store\{
     StoreBargain, StoreCombination, StoreSeckill
 };
+use think\db\exception\DataNotFoundException;
+use think\db\exception\DbException;
+use think\db\exception\ModelNotFoundException;
 
 /**
  * TODO 产品Model
@@ -213,14 +216,35 @@ class StoreProduct extends BaseModel
         return self::setLevelPrice($list, $uid);
     }
 
+    /**
+     * 礼包产品
+     * @param string $field
+     * @param int $limit
+     * @param int $uid
+     * @return array
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
+     */
+    public static function getGiftProduct($field = '*', $limit = 0, $uid = 0)
+    {
+        $model = self::where('is_gift', 1)->where('is_del', 0)->where('mer_id', 0)
+            ->where('stock', '>', 0)->where('is_show', 1)->field($field)
+            ->order('sort DESC, id DESC');
+        if ($limit) $model->limit($limit);
+        $list = $model->select();
+        $list = count($list) ? $list->toArray() : [];
+        return $list;
+    }
+
     /**
      * 热卖产品
      * @param string $field
      * @param int $page
      * @param int $limit
      * @return array|\think\Collection
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
+     * @throws DataNotFoundException
+     * @throws ModelNotFoundException
      * @throws \think\exception\DbException
      */
     public static function getHotProductLoading($field = '*', $page = 0, $limit = 0)
@@ -525,6 +549,8 @@ class StoreProduct extends BaseModel
                         $oneBrokerageVirtual = bcadd($oneBrokerageVirtual, bcmul($cartNum, $productInfo['attrInfo']['brokerage'] ?? 0, 2), 2);
                         $twoBrokerageVirtual = bcadd($twoBrokerageVirtual, bcmul($cartNum, $productInfo['attrInfo']['brokerage_two'] ?? 0, 2), 2);
                     }
+                } else if (isset($productInfo['is_sub']) && $productInfo['is_sub'] == 2) {
+
                 } else {
                     //比例返佣
                     if ($productInfo['store_type'] == 1) {
@@ -584,7 +610,7 @@ class StoreProduct extends BaseModel
         $activity = explode(',', $activity);
         $activityId = [];
         $time = 0;
-        $seckillId = StoreSeckill::where('is_del', 0)->where('status', 1)->where('start_time', '<=', time())->where('stop_time', '>=', time()-86400)->where('product_id', $id)->field('id,time_id')->select();
+        $seckillId = StoreSeckill::where('is_del', 0)->where('status', 1)->where('start_time', '<=', time())->where('stop_time', '>=', time() - 86400)->where('product_id', $id)->field('id,time_id')->select();
         if ($seckillId) {
             foreach ($seckillId as $v) {
                 $timeInfo = GroupDataService::getDataNumber((int)$v['time_id']);
@@ -598,7 +624,7 @@ class StoreProduct extends BaseModel
         }
         $bargainId = StoreBargain::where('is_del', 0)->where('status', 1)->where('start_time', '<=', time())->where('stop_time', '>=', time())->where('product_id', $id)->value('id');
         if ($bargainId) $activityId[2] = $bargainId;
-        $combinationId = StoreCombination::where('is_del', 0)->where('is_show',1)->where('start_time', '<=', time())->where('stop_time', '>=', time())->where('product_id', $id)->value('id');
+        $combinationId = StoreCombination::where('is_del', 0)->where('is_show', 1)->where('start_time', '<=', time())->where('stop_time', '>=', time())->where('product_id', $id)->value('id');
         if ($combinationId) $activityId[3] = $combinationId;
         $data = [];
         foreach ($activity as $k => $v) {

+ 158 - 0
app/models/tree/TreeNew.php

@@ -0,0 +1,158 @@
+<?php
+
+
+namespace app\models\tree;
+
+
+use app\models\user\User;
+use app\models\user\UserBill;
+use crmeb\basic\BaseModel;
+use crmeb\traits\ModelTrait;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\DbException;
+use think\db\exception\ModelNotFoundException;
+use think\model\relation\HasMany;
+use think\model\relation\HasOne;
+
+class TreeNew extends BaseModel
+{
+    /**
+     * 数据表主键
+     * @var string
+     */
+    protected $pk = 'id';
+
+    /**
+     * 模型名称
+     * @var string
+     */
+    protected $name = 'tree_new';
+
+    private static $layers;
+    private static $get;
+
+    use ModelTrait;
+
+
+    public function __construct(array $data = [])
+    {
+        parent::__construct($data);
+        self::$layers = sys_config('group_layer', 12);
+        self::$get = sys_config('group_award', 135);
+    }
+
+    public function user(): HasOne
+    {
+        return $this->HasOne(User::class, 'uid', 'uid');
+    }
+
+    /**
+     * 排点
+     * @param int $uid
+     * @param int $spread_uid
+     * @return array|bool|int[]
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
+     */
+    public static function getTreePoint(int $spread_uid = 0)
+    {
+        if (!self::count()) {
+            return [0, 1];//父节点,线路
+        }
+        $parent_last_point = self::where('uid', $spread_uid)->order('add_time', 'desc')->find();
+        if ($spread_uid == 0) {
+            $parent_last_point = self::order('add_time', 'asc')->find();
+        }
+        while (!$parent_last_point) {
+            $spread_uid = User::where('uid', $spread_uid)->value('spread_uid');
+            if (!$spread_uid)
+                $parent_last_point = self::order('add_time', 'asc')->find();
+            else
+                $parent_last_point = self::where('uid', $spread_uid)->order('add_time', 'desc')->find();
+        }
+        $way = 1;
+        while (1) {
+            //看线
+            $res = self::where('way', $way)->where('parent_id', $parent_last_point['id'])->find();
+            if ($res) {
+                for ($i = 0; ; $i++) {
+                    if ($i == self::$layers - 1) {
+                        $spreads = User::where('spread_uid', $parent_last_point['uid'])->column('uid');
+                        if (count(self::where('uid', 'in', $spreads)->group('uid')->field('uid,COUNT(uid)')->select()) >= $way) {
+                            break;
+                        }
+                    }
+                    $id = $res['id'];
+                    $res = self::where('way', 1)->where('parent_id', $id)->find();
+                    if (!$res) {
+                        return [$id, 1];
+                    }
+                }
+                $way++;
+            } else {
+                return [$parent_last_point['id'], $way];
+            }
+        }
+    }
+
+    /**
+     * 进场
+     * @param int $uid
+     * @param int $spread_uid
+     * @return bool
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
+     */
+    public static function insertTree(int $uid, int $spread_uid = 0): bool
+    {
+        $res = self::getTreePoint($spread_uid);
+        if (!$res) return self::setErrorInfo(self::getErrorInfo());
+        list($tree_leader, $way) = $res;
+        self::beginTrans();
+        try {
+            $res = self::create([
+                'uid' => $uid,
+                'parent_id' => $tree_leader,
+                'way' => $way,
+                'add_time' => time(),
+            ]);
+            $res = $res && self::sendToUper($tree_leader, $res->id);
+            self::checkTrans($res);
+            if ($res) {
+                return true;
+            } else {
+                return self::setErrorInfo('加入失败');
+            }
+        } catch (\Exception $e) {
+            self::rollbackTrans();
+            return self::setErrorInfo($e->getMessage());
+        }
+    }
+
+    /**
+     * 发奖
+     * @param int $point
+     * @return bool
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
+     */
+    public static function sendToUper(int $point, $link_id): bool
+    {
+        $info = self::where('id', $point)->find();
+        $res = true;
+        $i = 0;
+        while ($info && $i < self::$layers) {
+            $info->get += self::$get;
+            $res = $res && $info->save();
+            $balance = User::where('uid', $info['uid'])->value('brokerage_price');
+            $res = $res && UserBill::income('下级参与', $info['uid'], 'now_money', 'brokerage', self::$get, $link_id, $balance + self::$get, '下级用户参与分红,获得分红' . self::$get);
+            $res = $res && User::where('uid', $info['uid'])->inc('brokerage_price', self::$get)->update();
+            $info = self::where('id', $info['parent_id'])->find();
+            $i++;
+        }
+        return $res;
+    }
+}

+ 2 - 1
composer.json

@@ -39,7 +39,8 @@
         "dh2y/think-qrcode": "^2.0",
         "topthink/think-multi-app": "^1.0",
         "topthink/think-template": "^2.0",
-        "overtrue/pinyin": "^4.0"
+        "overtrue/pinyin": "^4.0",
+      "ext-pdo": "*"
     },
     "autoload": {
         "psr-4": {