Преглед на файлове

Merge branch 'master' into custom_manager

yb преди 7 месеца
родител
ревизия
d374e8a70f
променени са 38 файла, в които са добавени 1328 реда и са изтрити 226 реда
  1. 188 1
      app/admin/controller/client/EvaluateController.php
  2. 26 2
      app/admin/controller/client/MessageController.php
  3. 7 0
      app/admin/controller/customer/IndexController.php
  4. 3 0
      app/admin/controller/dashboard/DashboardController.php
  5. 4 0
      app/admin/controller/device/DeviceController.php
  6. 1 1
      app/admin/controller/goods/EntityGoodsController.php
  7. 8 2
      app/admin/controller/marketing/DeptPremisesController.php
  8. 1 1
      app/admin/controller/member/AccountController.php
  9. 12 0
      app/admin/controller/member/MemberController.php
  10. 1 0
      app/admin/controller/order/DishesController.php
  11. 23 5
      app/admin/controller/order/GoodsController.php
  12. 171 0
      app/admin/controller/order/KangyangCityController.php
  13. 7 0
      app/admin/controller/order/RefundController.php
  14. 1 0
      app/admin/controller/order/ServicesController.php
  15. 182 41
      app/admin/controller/order/WholeController.php
  16. 3 0
      app/admin/controller/sys_manage/CategoryController.php
  17. 7 2
      app/admin/controller/sys_manage/RestaurantController.php
  18. 143 94
      app/admin/controller/sys_manage/RestaurantTableController.php
  19. 35 8
      app/admin/service/goods/GoodsService.php
  20. 209 29
      app/admin/service/member/MemberService.php
  21. 8 0
      app/admin/service/order/AppointmentService.php
  22. 13 4
      app/admin/service/order/OrderService.php
  23. 1 1
      app/admin/service/statistics/AppointmentService.php
  24. 27 0
      app/admin/service/statistics/ChatMessageService.php
  25. 14 1
      app/admin/service/statistics/GoodsService.php
  26. 11 2
      app/admin/service/statistics/OrderService.php
  27. 0 2
      app/admin/service/sys_manage/UploadService.php
  28. 1 1
      app/admin/validate/member/MemberValidate.php
  29. 34 0
      app/api/controller/scan/QrcodeController.php
  30. 77 26
      app/command/WelfareAccountCommand.php
  31. 2 2
      app/common/Qrcode.php
  32. 31 0
      app/event/order/KangyangCityEvent.php
  33. 23 0
      app/model/ChatMessage.php
  34. 6 0
      app/model/ClientMessage.php
  35. 21 0
      app/model/GoodsEvaluate.php
  36. 3 0
      config/event.php
  37. 21 1
      route/admin.php
  38. 3 0
      route/api.php

+ 188 - 1
app/admin/controller/client/EvaluateController.php

@@ -4,7 +4,9 @@ namespace app\admin\controller\client;
 
 use app\controller\Curd;
 use app\model\ClientFavorite;
+use app\model\Goods;
 use app\model\GoodsEvaluate;
+use support\exception\BusinessException;
 use support\Request;
 use support\Response;
 
@@ -17,9 +19,24 @@ class EvaluateController extends Curd
 
     public function select(Request $request): Response
     {
+        $goodsName = $request->get('goods_name','');
+        $searchTimes = $request->get('goods_evaluate_addtimes',[]);
+
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
         $order = $request->get('order', 'desc');
         $field = $field ?? 'goods_evaluate_addtimes';
+
+        if ($goodsName != ''){
+            $goodsIds = Goods::where('goods_name','like','%'.$goodsName.'%')->pluck('goods_id')->toArray();
+            $where['join_evaluate_goods_id'] = ['in',implode(',',$goodsIds)];
+        }
+        if(!empty($searchTimes)){
+            $searchTimes[0] = !empty($searchTimes[0]) ? strtotime($searchTimes[0]) : time();
+            $searchTimes[1] = !empty($searchTimes[1]) ? strtotime($searchTimes[1]) : time();
+
+            $where['goods_evaluate_addtimes'] = $searchTimes;
+        }
+
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
@@ -31,7 +48,10 @@ class EvaluateController extends Curd
             },
             'goods' => function ($query) {
                 $query->select('goods_id', 'goods_name');
-            }
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            },
         ]);
         foreach ($where as $column => $value) {
             if (is_array($value)) {
@@ -67,4 +87,171 @@ class EvaluateController extends Curd
         }
         return $model;
     }
+
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item){
+            if (!empty($item->goods_evaluate_json)){
+                $imagesStr = '';
+                $goodsEvaluateJson = json_decode($item->goods_evaluate_json,true);
+                if (isset($goodsEvaluateJson['images'])){
+                    foreach ($goodsEvaluateJson['images'] as $images){
+                        $imagesStr = $imagesStr .= getenv('STORAGE_DOMAIN').$images.',';
+                    }
+                }
+                $item->goods_evaluate_json = rtrim($imagesStr,',');
+            }
+        }
+        return $items;
+    }
+
+    public function info(Request $request):Response
+    {
+        $goodsEvaluateId = $request->get('goods_evaluate_id','');
+        if (!$goodsEvaluateId){
+            return json_fail('参数异常');
+        }
+
+        $evaluate = GoodsEvaluate::with([
+            'member'=>function($query){
+                $query->select('member_id','member_mobile');
+            },
+            'cert' => function ($query){
+                $query->select('join_cert_member_id','member_cert_name');
+            },
+            'info' => function ($query){
+                $query->select('join_info_member_id','member_info_nickname','member_info_headimg');
+            },
+            'goods' => function($query){
+                $query->select('goods_id','goods_name','goods_cover','goods_sales_price');
+            },
+            'order' => function($query){
+                $query->select('order_id','order_amount_pay','order_is_complete','order_status_system','order_status_payment','order_addtimes');
+            }
+        ])->where('goods_evaluate_id',$goodsEvaluateId)
+            ->first();
+
+        if (!empty($evaluate->goods_evaluate_json)){
+            $imagesStr = '';
+            $goodsEvaluateJson = json_decode($evaluate->goods_evaluate_json,true);
+            foreach($goodsEvaluateJson as $file){
+                if (isset($file['file'])){
+                    $imagesStr = $imagesStr .= getenv('APP_IMAGE_DOMAIN').$file['file']['file_savepath'].$file['file']['file_savename'].',';
+                }
+            }
+            // if (isset($goodsEvaluateJson['images'])){
+            //     foreach ($goodsEvaluateJson['images'] as $images){
+            //         $imagesStr = $imagesStr .= getenv('STORAGE_DOMAIN').$images.',';
+            //         $originStr = $originStr .= str_replace('/thumb','',$imagesStr);
+            //     }
+            // }
+            // $evaluate->goods_evaluate_json_origin = rtrim($originStr,',');
+            $evaluate->goods_evaluate_json = rtrim($imagesStr,',');
+        }
+
+        if (!empty($evaluate->info)){
+            $evaluate->info->member_info_headimg = $evaluate->info->member_info_headimg ?? getenv('STORAGE_DOMAIN').'/images/avatar_default.png';
+            $evaluate->info->member_info_nickname ?? substr($evaluate->member->member_mobile,-4).'用户';
+        }
+        if (!empty($evaluate->goods)){
+            $evaluate->goods->goods_cover = getenv('STORAGE_DOMAIN').$evaluate->goods->goods_cover;
+            $evaluate->goods->goods_cover_origin = str_replace('/thumb','',$evaluate->goods->goods_cover);
+        }
+
+        return json_success('success',$evaluate);
+    }
+
+    /**
+     * 添加
+     * @param Request $request
+     * @return Response
+     * @throws BusinessException
+     */
+    public function insert(Request $request): Response
+    {
+        try {
+            $data = $this->insertInput($request);
+            $this->doInsert($data);
+            
+        } catch (BusinessException $customException) {
+            return json_fail($customException->getMessage());
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            return json_fail('数据写入失败');
+        }
+        return json_success('success');
+    }
+
+    /**
+     * 插入前置方法
+     * @param Request $request
+     * @return array
+     * @throws BusinessException
+     */
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+
+        if (!empty($data['goods_evaluate_json'])){
+            $goodsEvaluateJson = explode(',',$data['goods_evaluate_json']);
+            foreach ($goodsEvaluateJson as $key => $item){
+                $goodsEvaluateJson[$key] = str_replace(getenv('STORAGE_DOMAIN'), '', $item);
+            }
+
+            $data['goods_evaluate_json'] = json_encode(['images'=>$goodsEvaluateJson]);
+        }
+        
+        return $data;
+    }
+
+    /**
+     * 更新
+     * @param Request $request
+     * @return Response
+     * @throws BusinessException
+     */
+    public function update(Request $request): Response
+    {
+        try {
+            [$id, $data] = $this->updateInput($request);
+            $this->doUpdate($id, $data);
+        } catch (BusinessException $e) {
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            return json_fail('数据更新失败');
+        }
+
+        return json_success('success');
+    }
+
+    /**
+     * 更新前置方法
+     * @param Request $request
+     * @return array
+     * @throws BusinessException
+     */
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+
+        if (!empty($data['goods_evaluate_json'])){
+            $goodsEvaluateJson = explode(',',$data['goods_evaluate_json']);
+            foreach ($goodsEvaluateJson as $key => $item){
+                $goodsEvaluateJson[$key] = str_replace(getenv('STORAGE_DOMAIN'), '', $item);
+            }
+
+            $data['goods_evaluate_json'] = json_encode(['images'=>$goodsEvaluateJson]);
+        }
+
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+
 }

+ 26 - 2
app/admin/controller/client/MessageController.php

@@ -4,6 +4,7 @@ namespace app\admin\controller\client;
 
 use app\controller\Curd;
 use app\model\ClientMessage;
+use app\model\Member;
 use support\exception\BusinessException;
 use support\Request;
 use support\Response;
@@ -26,7 +27,7 @@ class MessageController extends Curd
 
     protected function doSelect(array $where, string $field = null, string $order = 'desc')
     {
-        $model = $this->model->with(['member', 'cert']);
+        $model = $this->model->with(['member', 'cert','info']);
         foreach ($where as $column => $value) {
             if (is_array($value)) {
                 if ($value[0] === 'like' || $value[0] === 'not like') {
@@ -118,6 +119,29 @@ class MessageController extends Curd
         return $data;
     }
 
+    /**
+     * 群发
+     */
+    public function groupInsert(Request $request)
+    {
+        try {
+            $params = $request->post();
+            $memberIds = Member::where('member_status','ACTIVED')->pluck('member_id');
+            foreach ($memberIds as $memberId){
+                $params['join_client_message_send'] = 'SYSTEM';
+                $params['join_client_message_recv_member_id'] = $memberId;
+                $data = $this->insertInput($params);
+                $this->doInsert($data);
+            }
+        } catch (BusinessException $customException) {
+            return json_fail($customException->getMessage());
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            return json_fail('数据写入失败11');
+        }
+        return json_success('success');
+    }
+
     protected function updateInput(Request $request): array
     {
         $params = $request->post();
@@ -155,7 +179,7 @@ class MessageController extends Curd
     public static $classify = [
         'WARNING' => '预警消息',
         'REMIND' => '提醒消息',
-        'NOTICE' =>'系统临时通知提醒',
+        'NOTICE' =>'系统通知',
         'APPOINTMENT'=>'预约(服务)消息',
         'ORDER'=>'订单消息',
         'CHAT'=>'未读消息'

+ 7 - 0
app/admin/controller/customer/IndexController.php

@@ -58,6 +58,7 @@ class IndexController extends Curd
         if (empty($user->join_user_role_id)) {
             return json_fail("请先关联角色");
         }
+        $type = $request->get('type','');
         $role = SysRole::find($user->join_user_role_id);
         $selfAndChildIds = SysRole::where('role_path', 'like', $role->role_path . "%")
             ->where('role_id', '<>', $role->role_id)
@@ -69,6 +70,12 @@ class IndexController extends Curd
         $order = $request->get('order', 'desc');
         $field = $field ?? 'created_at';
         $where['creator'] = ['in', $userIds];
+        if(!empty($type)){
+            $where['created_at'] = [
+                strtotime(date('Y-m-d').' 00:00:00'),
+                strtotime(date('Y-m-d').' 23:59:59')
+            ];
+        }
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }

+ 3 - 0
app/admin/controller/dashboard/DashboardController.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\dashboard;
 
 use app\admin\service\statistics\AppointmentService;
+use app\admin\service\statistics\ChatMessageService;
 use app\admin\service\statistics\CustomerService;
 use app\admin\service\statistics\DeviceService;
 use app\admin\service\statistics\GoodsService;
@@ -24,6 +25,8 @@ class DashboardController
         $data['order'] = OrderService::getOrder();
         // 商品
         $data['goods'] = GoodsService::getGoods();
+        // 咨询
+        $data['chat'] = ChatMessageService::getChatMessage();
 
         return json_success('', $data);
     }

+ 4 - 0
app/admin/controller/device/DeviceController.php

@@ -23,7 +23,11 @@ class DeviceController extends Curd
     {
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
         $order = $request->get('order', 'desc');
+        $type = $request->get('type','');
         $field = $field ?? 'device_addtimes';
+        if ($type == 'bind'){
+            $where['device_status'] = 'ACTIVED';
+        }
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }

+ 1 - 1
app/admin/controller/goods/EntityGoodsController.php

@@ -87,7 +87,7 @@ class EntityGoodsController
             return json_fail($validate->getError());
         }
 
-        $params['goods_classify'] = 'GOODS';
+        $params['goods_classify'] = $params['goods_classify'] ?? 'GOODS';
         return GoodsService::insert($params);
     }
 

+ 8 - 2
app/admin/controller/marketing/DeptPremisesController.php

@@ -20,9 +20,15 @@ class DeptPremisesController extends Curd
         $this->validateClass = new DeptValidate();
     }
 
-    public function selectList()
+    public function selectList(Request $request)
     {
-        $premisses = SysDept::where('dept_category', '营业场所')
+        $category = $request->get('category','');
+        if ($category == 'dishes'){
+            $category = '餐厅';
+        }else{
+            $category = '营业场所';
+        }
+        $premisses = SysDept::where('dept_category', $category)
             ->select('dept_id as key', 'dept_name as label','dept_address as address','dept_position as position','dept_extend_json')
             ->get()
             ->toArray();

+ 1 - 1
app/admin/controller/member/AccountController.php

@@ -17,7 +17,7 @@ class AccountController extends Curd
 
     public function my($id)
     {
-        $account = MemberAccount::where('join_account_member_id', $id)->get()->toArray();
+        $account = MemberAccount::where('join_account_member_id', $id)->where('member_account_status','ACTIVED')->get()->toArray();
         if (!$account) {
             // 账户表
             $accountData = [

+ 12 - 0
app/admin/controller/member/MemberController.php

@@ -37,6 +37,7 @@ class MemberController
             })->get();
         $data = [];
         foreach ($res as $item) {
+            // $item->member_mobile = substr($item->member_mobile,0,3).'****'.substr($item->member_mobile,7);
             $name = '';
             if(!empty($item->member_cert_name)){
                 $name = $item->member_cert_name;
@@ -68,6 +69,7 @@ class MemberController
             ->get()
             ->toArray();
         foreach ($members as &$member) {
+            // $member['member_mobile'] = substr($member['member_mobile'],0,3).'****'.substr($member['member_mobile'],7);
             $member['member_json'] = json_decode($member['member_json'], true);
             $member['username'] = $member['member_mobile'];
             $member['user_id'] = $member['member_json']['user'] ? $member['member_json']['user']['user_id'] : '';
@@ -344,6 +346,16 @@ class MemberController
         return MemberService::info($memberId);
     }
 
+    public function vipInfo(Request $request)
+    {
+        $memberId = $request->get('member_id', '');
+        if (!$memberId) {
+            return json_fail("参数错误");
+        }
+
+        return MemberService::vipInfo($request);
+    }
+
     public function welfareInfo(Request $request)
     {
         $memberId = $request->get('member_id', '');

+ 1 - 0
app/admin/controller/order/DishesController.php

@@ -40,6 +40,7 @@ class DishesController extends Curd{
         // $where['order_category'] = 'DISHES';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
             $where['order_is_complete'] = 'N';
+            $where['order_category'] = ['<>','RETURN'];
         }
 
         // if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {

+ 23 - 5
app/admin/controller/order/GoodsController.php

@@ -39,6 +39,9 @@ class GoodsController extends Curd{
         $field = $field ?? 'order_addtimes';
         // $where['pay_detail.pay_category'] = 'GOODS';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
+            if ($where['order_status_system'] == 'SENDING'){
+                $where['order_express.order_express_type'] = '配送';
+            }
             $where['order_is_complete'] = 'N';
         }
 
@@ -76,6 +79,13 @@ class GoodsController extends Curd{
                 }
             }
         // }
+        
+        // 自提订单        
+        if (!empty($where['order_status_system']) && $where['order_status_system'] == 'PICKUP'){
+            $where['order_is_complete'] = 'N';
+            $where['order_status_system'] = 'SENDING';
+            $where['order_express.order_express_type'] = '自提';
+        }
 
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
@@ -100,10 +110,11 @@ class GoodsController extends Curd{
 //                }
 //                $query->select('orders_return_id', 'join_return_order_id', 'order_return_status');
 //            },
-            'express' => function ($query) {
-                $query->select('join_express_order_id', 'order_express_type');
-            }
-        ])->leftJoin('order_return','order_return.join_return_order_id','=','order.order_id');
+            // 'express' => function ($query) {
+            //     $query->select('join_express_order_id', 'order_express_type');
+            // }
+        ])->leftJoin('order_return','order_return.join_return_order_id','=','order.order_id')
+        ->leftJoin('order_express','order_express.join_express_order_id','=','order.order_id');
         // ->leftJoin('order_sheet','join_sheet_order_id','=','order.order_id');
         foreach ($where as $column => $value) {
             if (is_array($value)) {
@@ -137,7 +148,7 @@ class GoodsController extends Curd{
         if ($field) {
             $model = $model->orderBy($field, $order);
         }
-        $model = $model->select('order.*','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status','order_return.order_return_apply_json','order_return.order_return_remark');
+        $model = $model->select('order.*','order_express.join_express_order_id','order_express.order_express_type','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status','order_return.order_return_apply_json','order_return.order_return_remark');
         return $model;
     }
 
@@ -165,6 +176,13 @@ class GoodsController extends Curd{
                     'order_return_remark'=>$item['order_return_remark']
                 ];
             }
+            if (isset($item['join_express_order_id'])){
+                $item['express'] = [
+                    'join_express_order_id'=>$item['join_express_order_id'],
+                    'order_express_type'=>$item['order_express_type']
+                ];
+                unset($item['join_express_order_id'],$item['order_express_type']);
+            }
         }
 
         return $items;

+ 171 - 0
app/admin/controller/order/KangyangCityController.php

@@ -0,0 +1,171 @@
+<?php
+
+namespace app\admin\controller\order;
+
+use app\admin\validate\order\OrderValidate;
+use app\controller\Curd;
+use app\model\Goods;
+use app\model\Order;
+use app\model\OrderSheet;
+use support\Request;
+use support\Response;
+
+class KangyangCityController extends Curd{
+    public function __construct()
+    {
+        $this->model = new Order();
+        $this->validate = true;
+        $this->validateClass = new OrderValidate();
+    }
+
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 15:01
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        if (!empty($where['order_addtimes'])) {
+            $where['order_addtimes'][0] = strtotime($where['order_addtimes'][0]);
+            $where['order_addtimes'][1] = strtotime($where['order_addtimes'][1]);
+        }
+
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'order_addtimes';
+        // $where['order_id'] = '';
+        $where['order_category'] = 'VIP';
+        // $goodsClassify = 'VIP';
+        $goodsName = $request->get('goods_name','');
+        if (!empty($goodsName) && empty($goodsClassify)){
+            $goodsIds = Goods::where('goods_name','like','%'.$request->get('goods_name').'%')->pluck('goods_id')->toArray();
+        }
+        // else if(!empty($goodsClassify)){
+        //     if($goodsClassify == 'SERVICE'){
+        //         $goodsModel = Goods::whereIn('goods_classify',['SERVICE','CHNMED','CHNNCD']);
+        //     }else{
+        //         $goodsModel = Goods::where('goods_classify',$goodsClassify);
+        //     }
+
+        //     if(!empty($goodsName)){
+        //         $goodsModel->where('goods_name','like','%'.$goodsName.'%');
+        //     }
+
+        //     $goodsIds = $goodsModel->pluck('goods_id')->toArray();
+        // }
+        if(!empty($goodsIds)){
+            $orderIds = OrderSheet::whereIn('join_sheet_goods_id',$goodsIds)->pluck('join_sheet_order_id')->toArray();
+            if($orderIds){
+                $where['order_id'] = ['in',implode(',',$orderIds)];
+            }
+        }
+
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'sheets' => function ($query) {
+                $query->select('join_sheet_order_id', 'order_sheet_id', 'join_sheet_goods_id', 'order_sheet_num','order_sheet_price');
+            },
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            },
+//            'return' => function ($query) use ($where){
+//                if (isset($where['return'])){
+//                    dump($where['return']);
+//                    $query = $query->where('order_return_status',$where['return']);
+//                }
+//                $query->select('orders_return_id', 'join_return_order_id', 'order_return_status');
+//            },
+            // 'express' => function ($query) {
+            //     $query->select('join_express_order_id', 'order_express_type');
+            // }
+        ])->leftJoin('order_return','order_return.join_return_order_id','=','order.order_id')
+        ->leftJoin('order_express','order_express.join_express_order_id','=','order.order_id');
+        // ->leftJoin('order_sheet','join_sheet_order_id','=','order.order_id');
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        $model = $model->select('order.*','order_express.join_express_order_id','order_express.order_express_type','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status','order_return.order_return_apply_json','order_return.order_return_remark');
+        return $model;
+    }
+
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            $sheetDeng = '';
+            $item['sheet'] = $item['sheets'][0] ?? [];
+            if (!empty($item['sheet'])) {
+                $goods = Goods::where('goods_id', $item['sheet']['join_sheet_goods_id'])->first();
+                if(count($item['sheets']) > 1 && $goods->goods_classify == 'MEALS'){
+                    $sheetDeng = ' 等餐品';
+                }
+                $item['sheet']['goods_name'] = ($goods && $goods->goods_name) ? $goods->goods_name.$sheetDeng : '';
+                $item['sheet']['goods_classify'] = $goods->goods_classify ?? '';
+                $item['sheet']['order_sheet_num'] = intval($item['sheet']['order_sheet_num']);
+            }
+            unset($item['sheets']);
+            if (isset($item['orders_return_id'])){
+                $item['return'] = [
+                    'orders_return_id'=>$item['orders_return_id'],
+                    'join_return_order_id' => $item['join_return_order_id'],
+                    'order_return_status' => $item['order_return_status'],
+                    'order_return_apply_json' => $item['order_return_apply_json'],
+                    'order_return_remark'=>$item['order_return_remark']
+                ];
+            }
+            if (isset($item['join_express_order_id'])){
+                $item['express'] = [
+                    'join_express_order_id'=>$item['join_express_order_id'],
+                    'order_express_type'=>$item['order_express_type']
+                ];
+                unset($item['join_express_order_id'],$item['order_express_type']);
+            }
+            // if (!empty($item['order_extend_json'])){
+            //     $orderExtendJson = json_decode($item['order_extend_json'],true);
+            //     $item['referee'] = $orderExtendJson['referee'] ?? '';
+            // }
+        }
+
+        return $items;
+    }
+}

+ 7 - 0
app/admin/controller/order/RefundController.php

@@ -26,8 +26,15 @@ class RefundController extends Curd
     {
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
         $order = $request->get('order', 'desc');
+        $type = $request->get('type','');
         $field = $field ?? 'order_return_addtimes';
         $where['order_return_category'] = '退款';
+        if ($type == 'today'){
+            $where['order_return_addtimes'] = [
+                strtotime(date('Y-m-d').' 00:00:00'),
+                strtotime(date('Y-m-d').' 23:59:59')
+            ];
+        }
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }

+ 1 - 0
app/admin/controller/order/ServicesController.php

@@ -40,6 +40,7 @@ class ServicesController extends Curd{
         // $where['order_category'] = ['in','SERVICE,CHNMED,CHNNCD'];
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
             $where['order_is_complete'] = 'N';
+            $where['order_category'] = ['<>','RETURN'];
         }
 
         // if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {

+ 182 - 41
app/admin/controller/order/WholeController.php

@@ -71,8 +71,20 @@ class WholeController extends Curd
         }
 
         $order = $request->get('order', 'desc');
+        $type = $request->get('type', '');
+        if ($type == 'todayOrder' && empty($where['order_addtimes'])){
+            $where['order_addtimes'][0] = strtotime(date('Y-m-d').' 00:00:00');
+            $where['order_addtimes'][1] = strtotime(date('Y-m-d').' 23:59:59');
+        }else if ($type == 'todayOrderAmount'){
+            $where['order_status_payment'] = 'SUCCESS';
+            $where['order_addtimes'][0] = strtotime(date('Y-m-d').' 00:00:00');
+            $where['order_addtimes'][1] = strtotime(date('Y-m-d').' 23:59:59');
+        }
         $field = $field ?? 'order_addtimes';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
+            if ($where['order_status_system'] == 'SENDING'){
+                $where['order_express.order_express_type'] = '配送';
+            }
             $where['order_is_complete'] = 'N';
             $where['order_category'] = isset($where['order_category']) ? $where['order_category'] : ['in','SYSTEM,NORMAL,DISHES'];
         }
@@ -115,6 +127,12 @@ class WholeController extends Curd
             // 充值订单不显示
             $where['order_category'] = ['<>','RECHARGE'];
         }
+        // 自提订单        
+        if (!empty($where['order_status_system']) && $where['order_status_system'] == 'PICKUP'){
+            $where['order_is_complete'] = 'N';
+            $where['order_status_system'] = 'SENDING';
+            $where['order_express.order_express_type'] = '自提';
+        }
 
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
@@ -139,10 +157,11 @@ class WholeController extends Curd
 //                }
 //                $query->select('orders_return_id', 'join_return_order_id', 'order_return_status');
 //            },
-            'express' => function ($query) {
-                $query->select('join_express_order_id', 'order_express_type');
-            }
-        ])->leftJoin('order_return','order_return.join_return_order_id','=','order.order_id');
+            // 'express' => function ($query) {
+            //     $query->select('join_express_order_id', 'order_express_type');
+            // }
+        ])->leftJoin('order_return','order_return.join_return_order_id','=','order.order_id')
+        ->leftJoin('order_express','order_express.join_express_order_id','=','order.order_id');
         // ->leftJoin('order_sheet','join_sheet_order_id','=','order.order_id');
         foreach ($where as $column => $value) {
             if (is_array($value)) {
@@ -176,7 +195,7 @@ class WholeController extends Curd
         if ($field) {
             $model = $model->orderBy($field, $order);
         }
-        $model = $model->select('order.*','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status','order_return.order_return_apply_json','order_return.order_return_remark');
+        $model = $model->select('order.*','order_express.join_express_order_id','order_express.order_express_type','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status','order_return.order_return_apply_json','order_return.order_return_remark');
         return $model;
     }
 
@@ -204,6 +223,13 @@ class WholeController extends Curd
                     'order_return_remark'=>$item['order_return_remark']
                 ];
             }
+            if (isset($item['join_express_order_id'])){
+                $item['express'] = [
+                    'join_express_order_id'=>$item['join_express_order_id'],
+                    'order_express_type'=>$item['order_express_type']
+                ];
+                unset($item['join_express_order_id'],$item['order_express_type']);
+            }
         }
 
         return $items;
@@ -414,8 +440,12 @@ class WholeController extends Curd
         $order->sheet_amount = number_format($sheetAmount,2);
 
         $payDetail = PayDetail::where('join_pay_order_id', $order->order_groupby)
-            ->select('pay_id', 'pay_category', 'pay_prepayid', 'pay_paytimes', 'pay_status', 'pay_amount')
+            ->select('pay_id', 'pay_category', 'pay_prepayid', 'pay_paytimes', 'pay_status', 'pay_amount','pay_extend_json')
             ->first();
+        if(!empty($payDetail) && !empty($payDetail->pay_extend_json)){
+            $payExtendJson = json_decode($payDetail->pay_extend_json,true);
+            $payDetail->cancel_times = $payExtendJson['cancel_times'] ?? '';
+        }
         $refund = OrderReturn::where('join_return_order_id',$orderId)
             ->select('order_return_status','order_return_apply_datetime','order_return_apply_json','order_return_accept_datetime','order_return_refund_json','order_return_extend_json')
             ->first();
@@ -431,7 +461,7 @@ class WholeController extends Curd
         }
 
 
-        if (!empty($payDetail->pay_prepayid)) {
+        if (!empty($payDetail) && !empty($payDetail->pay_prepayid)) {
             $categoryArray = explode('-', $payDetail->pay_prepayid);
             if (isset($categoryArray[1])) {
                 $payDetail->pay_category = $categoryArray[1];
@@ -468,6 +498,10 @@ class WholeController extends Curd
                 $order->dept_table_id = $orderConfigJson['tableid'];
             }
         }
+        if (!empty($order->order_extend_json)){
+            $orderExtendJson = json_decode($order->order_extend_json,true);
+            $order->referee = $orderExtendJson['referee'] ?? '';
+        }
 
         $order->premises = $premises;
         $data = [
@@ -558,14 +592,26 @@ class WholeController extends Curd
     public function updateSheet($params)
     {
         try{
+            // 判断餐品是否连带着服务或实体
+            $goodsClassifys = array_unique(array_column($params['goodsContentList'],'goods_classify'));
+            if (in_array('MEALS',$goodsClassifys) && count($goodsClassifys) > 1){
+                return json_fail('餐饮餐品不支持和其他类型的产品一起下单');
+            }
+            if (in_array('MEALS',$goodsClassifys)){
+                $params['submit_goods_classify'] = 'MEALS';
+            }
             foreach ($params['goodsContentList'] as $sheet){
                 // 先还原库存
+                
                 $orderSheet = OrderSheet::where('order_sheet_id',$sheet['order_sheet_id'])->first();
-                $goodsSku = GoodsSku::where('goods_sku_id',$orderSheet->join_sheet_goods_sku_id)->first();
-                $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
-                $skuStorageJson['storage'] = $skuStorageJson['storage'] + $orderSheet->order_sheet_num;
-                $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
-                $goodsSku->save();
+                if (!isset($params['submit_goods_classify']) || $params['submit_goods_classify'] != 'MEALS'){
+                    $goodsSku = GoodsSku::where('goods_sku_id',$orderSheet->join_sheet_goods_sku_id)->first();
+                    $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
+                    $skuStorageJson['storage'] = $skuStorageJson['storage'] + $orderSheet->order_sheet_num;
+                    $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
+                    $goodsSku->save();
+                }
+                
 
                 $goodsRunning = GoodsRunning::where('join_running_goods_id',$orderSheet->join_sheet_goods_id)->first();
                 $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage + $orderSheet->order_sheet_num;
@@ -574,20 +620,24 @@ class WholeController extends Curd
 
                 $data=[
                     'order_sheet_num'=>$sheet['nbr'],
-                    'join_sheet_goods_sku_id'=>$sheet['sku_id']
+                    'join_sheet_goods_sku_id'=>$sheet['sku_id'],
+                    'order_sheet_amount'=>$sheet['nbr'] * $orderSheet->order_sheet_price,
+                    'order_sheet_pay'=>$sheet['nbr'] * $orderSheet->order_sheet_price,
                 ];
                 OrderSheet::where('order_sheet_id',$sheet['order_sheet_id'])->update($data);
 
                 // 减库存
-                $goodsSku = GoodsSku::where('goods_sku_id',$sheet['sku_id'])->first();
-                $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
-                $skuStorageJson['storage'] = $skuStorageJson['storage'] - $sheet['nbr'];
-                if ($skuStorageJson['storage'] < 0){
-                    throw new BusinessException('库存不足');
+                if (!isset($params['submit_goods_classify']) || $params['submit_goods_classify'] != 'MEALS'){
+                    $goodsSku = GoodsSku::where('goods_sku_id',$sheet['sku_id'])->first();
+                    $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
+                    $skuStorageJson['storage'] = $skuStorageJson['storage'] - $sheet['nbr'];
+                    if ($skuStorageJson['storage'] < 0){
+                        throw new BusinessException('库存不足');
+                    }
+                    $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
+                    $goodsSku->save();
                 }
-                $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
-                $goodsSku->save();
-
+                
                 $goodsRunning = GoodsRunning::where('join_running_goods_id',$orderSheet->join_sheet_goods_id)->first();
                 $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $sheet['nbr'];
                 if ($goodsRunning->goods_running_storage < 0){
@@ -662,6 +712,9 @@ class WholeController extends Curd
         if (!$order){
             return json_fail('订单异常');
         }
+        if ($order->order_status_system != 'PAYING'){
+            return json_fail('订单不是可支付状态');
+        }
         if (!empty($order->order_config_json)){
             $orderConfigJson = json_decode($order->order_config_json,true);
             if (isset($orderConfigJson['premises'])){
@@ -683,7 +736,7 @@ class WholeController extends Curd
 
         $systemStatus = 'SENDING';  // 待发货
         // 立即结算
-        if(in_array($params['goods_classify'],['SERVICE','CHNMED','CHNNCD','MEALS'])){
+        if(in_array($params['goods_classify'],['SERVICE','CHNMED','CHNNCD','MEALS','VIP'])){
             $systemStatus = 'DONE';
         }
         Db::beginTransaction();
@@ -931,6 +984,11 @@ class WholeController extends Curd
             }
             $order->order_config_json = json_encode($orderConfigJson);
             $order->order_amount_pay = $params['order_amount_pay']+$qrcodePayAmount;
+            // 康养城订单,支付完就结束了
+            if ($order->order_status_payment == 'SUCCESS' && $params['goods_classify'] == 'VIP'){
+                $order->order_is_complete = 'Y';
+            }
+
             // 主订单
             $order->save();
 
@@ -1033,6 +1091,12 @@ class WholeController extends Curd
             //         ]);
             //     }
             // }
+            
+            // 2.4W 康养城
+            if ($params['goods_classify'] == 'VIP' && intval($params['order_amount_pay']) == 24000 && $order->order_status_payment == 'SUCCESS'){
+                $params['member_id'] = $params['join_order_member_id'];
+                Event::dispatch('order.kangyangCityVIP.grant',$params);
+            }
 
             Db::commit();
             
@@ -1155,6 +1219,27 @@ class WholeController extends Curd
 
         Db::beginTransaction();
         try {
+            // 验证库存
+            foreach($params['goodsContentList'] as $goods){
+                // 减库存,规格和总库存
+                if (!isset($params['submit_goods_classify']) || $params['submit_goods_classify'] != 'MEALS'){
+                    $goodsSku = GoodsSku::where('goods_sku_id',$goods['sku_id'])->first();
+                    $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
+                    if (isset($skuStorageJson['storage']) && !empty($skuStorageJson['storage'])){
+                        $skuStorageJson['storage'] = $skuStorageJson['storage'] - $goods['nbr'];
+                    }
+                    if (!isset($skuStorageJson['storage']) || (!empty($skuStorageJson['storage']) && $skuStorageJson['storage'] < 0)){
+                        throw new BusinessException('库存不足');
+                    }
+                }
+                
+
+                $goodsRunning = GoodsRunning::where('join_running_goods_id',$goods['goods_id'])->first();
+                $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
+                if ($goodsRunning->goods_running_storage < 0){
+                    throw new BusinessException('库存不足');
+                }
+            }
             // 余额、福利、储值卡 验证短信
             if ($params['settlement_now'] == 'Y' && $params['pay_constitute'] == 'N' && in_array($params['pay_category'],['CASH','CARD','WELFARE'])){
                 $code = $params['sms_code'];
@@ -1200,7 +1285,7 @@ class WholeController extends Curd
             // 立即结算
             if($params['settlement_now'] == 'Y'){
                 $params['order_is_complete'] = 'Y';
-                if(in_array($params['goods_classify'],['SERVICE','CHNMED','CHNNCD','MEALS'])){
+                if(in_array($params['goods_classify'],['SERVICE','CHNMED','CHNNCD','MEALS','VIP'])){
                     $systemStatus = 'DONE';
                 }
             }
@@ -1448,16 +1533,16 @@ class WholeController extends Curd
             }
 
             // 配送方式
-            if ($params['delivery'] == 'PICKUP' || $params['delivery'] == 'ARRIVAL') { // 自提/ 到店
+            if (isset($params['delivery']) && ($params['delivery'] == 'PICKUP' || $params['delivery'] == 'ARRIVAL')) { // 自提/ 到店
                 $orderConfigJson['premises'] = $params['dept_premises_id'];
-            } else if ($params['delivery'] == 'LOGISTICS') {
+            } else if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
                 // $params['order_express_json'] = json_encode([
                 //     'express' => 'Y',
                 // ]);
             }
             $params['order_amount_pay'] = $params['order_amount_pay'] + $qrcodePayAmount;
 
-            if (in_array($params['delivery'],['PICKUP','ARRIVAL']) && !empty($params['dept_premises_id'])){
+            if (isset($params['delivery']) && in_array($params['delivery'],['PICKUP','ARRIVAL']) && !empty($params['dept_premises_id'])){
                 // $premises = SysDept::where('dept_name',$params['dept_premises_id'])->where('dept_category','营业场所')->first();
                 if (!$premises){
                     Db::rollBack();
@@ -1491,11 +1576,11 @@ class WholeController extends Curd
             $this->insertPayDetail($params);
 
             $params['order_express_goods'] = json_encode(['sheet' => [$sheetId]]);
-            if ($params['delivery'] == 'LOGISTICS') {
+            if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
                 $params['order_express_type'] = '配送';
                 // 入配送
                 $this->saveExpress($params);
-            } else if ($params['delivery'] == 'PICKUP') {
+            } else if (isset($params['delivery']) && $params['delivery'] == 'PICKUP') {
                 $params['order_express_type'] = '自提';
                 if (!$premises) {
                     throw new BusinessException('自提门店不存在');
@@ -1573,7 +1658,11 @@ class WholeController extends Curd
             //     }
             // }
 
-            
+            // 2.4W 康养城
+            if ($params['goods_classify'] == 'VIP' && intval($params['order_amount_pay']) == 24000 && $params['order_status_payment'] == 'SUCCESS'){
+                $params['member_id'] = $params['join_order_member_id'];
+                Event::dispatch('order.kangyangCityVIP.grant',$params);
+            }
 
             Db::commit();
             
@@ -1626,11 +1715,13 @@ class WholeController extends Curd
             return json_success('创建订单成功');
         }catch(BusinessException $e){
             Db::rollBack();
+            dump($e->getMessage());
             dump($e->getTrace());
             _syslog("订单",$e->getMessage());
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
+            dump($e->getMessage());
             dump($e->getTrace());
             _syslog("订单","创建订单失败");
             return json_fail('创建订单失败');
@@ -1649,6 +1740,24 @@ class WholeController extends Curd
     public function insertMain($params)
     {
         try {
+            $orderCategory = 'NORMAL';
+            if (!empty($params['order_category'])){
+                $orderCategory = $params['order_category'];
+            }else if(isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS'){
+                $orderCategory = 'DISHES';
+            }else if (isset($params['goods_classify'])){
+                $orderCategory = $params['goods_classify'];
+            }
+            if (empty($params['order_extend_json'])){
+                $params['order_extend_json'] = [];
+            }else{
+                if(is_json($params['order_extend_json'])){
+                    $params['order_extend_json'] = json_decode($params['order_extend_json'],true);
+                }
+            }
+            // 推荐人
+            $params['order_extend_json']['referee'] = $params['referee']  ?? '';
+            
             $data = [
                 'order_id' => $params['orderId'],
                 'order_groupby' => $params['orderGroupId'],
@@ -1656,7 +1765,7 @@ class WholeController extends Curd
                 'order_name' => date('Y-m-d H:i:s') . '-订单',
                 'order_amount_total' => $params['order_amount_total'],
                 'order_amount_pay' => $params['order_amount_pay'],
-                'order_category' => (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') ? 'DISHES' : $params['goods_classify'],
+                'order_category' => $orderCategory,
                 'order_is_complete' => $params['order_is_complete'] ?? 'N',
                 'order_status_system' => $params['order_status_system'],
                 'order_status_payment' => $params['order_status_payment'],
@@ -1665,7 +1774,7 @@ class WholeController extends Curd
                 'order_remark' => $params['order_remark'] ?? '',
                 'order_config_json' => $params['order_config_json'] ?? '[]',
                 'order_express_json' => $params['order_express_json'] ?? '[]',
-                'order_extend_json' => $params['order_extend_json'] ?? '[]',
+                'order_extend_json' => $params['order_extend_json'] ? json_encode($params['order_extend_json']) : '[]',
                 'order_addtimes' => time()
             ];
 
@@ -1718,14 +1827,20 @@ class WholeController extends Curd
                 OrderSheet::insertGetId($data); 
 
                 // 减库存,规格和总库存
-                $goodsSku = GoodsSku::where('goods_sku_id',$goods['sku_id'])->first();
-                $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
-                $skuStorageJson['storage'] = $skuStorageJson['storage'] - $goods['nbr'];
-                if ($skuStorageJson['storage'] < 0){
-                    throw new BusinessException('库存不足');
+                if (!isset($params['submit_goods_classify']) || $params['submit_goods_classify'] != 'MEALS'){
+                    $goodsSku = GoodsSku::where('goods_sku_id',$goods['sku_id'])->first();
+                    $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
+                    if (isset($skuStorageJson['storage']) && !empty($skuStorageJson['storage'])){
+                        $skuStorageJson['storage'] = $skuStorageJson['storage'] - $goods['nbr'];
+                    }
+
+                    if (!isset($skuStorageJson['storage']) || (!empty($skuStorageJson['storage']) && $skuStorageJson['storage'] < 0)){
+                        throw new BusinessException('库存不足');
+                    }
+                    $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
+                    $goodsSku->save();
                 }
-                $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
-                $goodsSku->save();
+                
 
                 $goodsRunning = GoodsRunning::where('join_running_goods_id',$goods['goods_id'])->first();
                 $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
@@ -1737,8 +1852,10 @@ class WholeController extends Curd
             }
             return true;
         }catch(\support\exception\BusinessException $e){
+            dump($e->getMessage().'||'.$e->getLine());
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
+            dump($e->getMessage().'||'.$e->getLine());
             throw new BusinessException('订单创建失败');
         }
     }
@@ -1896,6 +2013,15 @@ class WholeController extends Curd
                     $payDetail->pay_amount = $payDetail->pay_amount + $data['order_sheet_pay'];
                 }
                 
+                // 减总库存
+                $goodsRunning = GoodsRunning::where('join_running_goods_id',$goods['goods_id'])->first();
+                $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
+                if ($goodsRunning->goods_running_storage < 0){
+                    throw new BusinessException('库存不足');
+                }
+
+                $goodsRunning->goods_running_sale = $goodsRunning->goods_running_sale + $goods['nbr'];
+                $goodsRunning->save();
                 
                 OrderSheet::insertGetId($data); 
             }
@@ -1966,6 +2092,9 @@ class WholeController extends Curd
                     'order_status_system' => 'CONFIRM',
                     'order_status_storage' => 'DONE'
                 ];
+                $orderSheetData = [
+                    'order_sheet_status' => 'CONFIRM'
+                ];
 
                 // 7天后自动完成
 //                $redis = Redis::connection();
@@ -1978,6 +2107,9 @@ class WholeController extends Curd
                     'order_status_system' => 'RECVING',
                     'order_status_storage' => 'EXPRESSING'
                 ];
+                $orderSheetData = [
+                    'order_sheet_status' => 'RECVING'
+                ];
 
                 // 15天后自动完成订单
                 $redis = Redis::connection();
@@ -2001,6 +2133,8 @@ class WholeController extends Curd
 
             // 该订单状态
             Order::where('order_id', $request->post('order_id'))->update($orderData);
+            // 该订单Sheet状态
+            OrderSheet::where('join_sheet_order_id', $request->post('order_id'))->update($orderSheetData);
 
             // 入配送记录表            
             $model->join_express_order_id = $params['order_id'];
@@ -2327,7 +2461,10 @@ class WholeController extends Curd
             'refund' => function ($query) {
                 $query->select('join_return_order_id', 'orders_return_id', 'order_return_status');
             },
-        ])->where('join_sheet_member_id', $memberId)
+        ])
+        ->leftJoin('order','order.order_id','order_sheet.join_sheet_order_id')
+            ->where('join_sheet_member_id', $memberId)
+            ->where('order.order_category','<>','RECHARGE')
             ->when(!empty($datetime), function($query) use ($datetime){
                 $datetime[0] = strtotime($datetime[0]);
                 $datetime[1] = strtotime($datetime[1]);
@@ -2752,6 +2889,7 @@ class WholeController extends Curd
             return json_fail('请选择打印设备');
         }
         $premises = SysDept::where('dept_name',$premiseName)->where('dept_category','营业场所')->where('dept_status','ACTIVED')->first();
+        $restaurant = SysDept::where('dept_name',$premiseName)->where('dept_category','餐厅')->where('dept_status','ACTIVED')->first();
         $order = Order::where('order_id',$orderId)->first();
 
         try {
@@ -2760,8 +2898,11 @@ class WholeController extends Curd
                     return json_fail('无法打印未支付的结账单');
                 }
 
-                if (!empty($premises)){
-                    $restaurant = SysDept::where('dept_super_id',$premises->dept_id)->where('dept_category','餐厅')->first();
+                if (!empty($premises) || $restaurant){
+                    if(empty($restaurant)){
+                        $restaurant = SysDept::where('dept_super_id',$premises->dept_id)->where('dept_category','餐厅')->first();
+                    }
+                    
                     if (!empty($restaurant->dept_extend_json)){
                         $deptExtendJson = json_decode($restaurant->dept_extend_json,true);
                         $voteData = [

+ 3 - 0
app/admin/controller/sys_manage/CategoryController.php

@@ -49,6 +49,9 @@ class CategoryController extends Curd
     public function afterQuery($items){
         $categoryDatas = [];
         foreach($items as &$item){
+            if (empty($item->category_super_path)){
+                $item->category_super_path = '#'.$item['category_id'].'#';
+            }
             $categorys = SysCategory::where('category_super_path','like',$item->category_super_path.'%')
                 ->where('category_status','ACTIVED')
                 ->paginate(1000)

+ 7 - 2
app/admin/controller/sys_manage/RestaurantController.php

@@ -152,8 +152,13 @@ class RestaurantController extends Curd{
 
         $printerList = [];
         try{
-            $premise = SysDept::where('dept_name',$premiseName)->where('dept_category','营业场所')->first();
-            $resraurant = SysDept::where('dept_super_id',$premise->dept_id)->where('dept_category','餐厅')->first();
+
+            $resraurant = SysDept::where('dept_name',$premiseName)->where('dept_category','餐厅')->first();
+            if (!$resraurant){
+                $premise = SysDept::where('dept_name',$premiseName)->where('dept_category','营业场所')->first();
+                $resraurant = SysDept::where('dept_super_id',$premise->dept_id)->where('dept_category','餐厅')->first();
+            }
+            
             if (!empty($resraurant->dept_extend_json)){
                 $deptExtendJson = json_decode($resraurant->dept_extend_json,true);
                 if (isset($deptExtendJson['printer'])){

+ 143 - 94
app/admin/controller/sys_manage/RestaurantTableController.php

@@ -12,23 +12,24 @@ use support\Request;
 use support\Response;
 use Tinywan\Jwt\JwtToken;
 
-class RestaurantTableController extends Curd{
+class RestaurantTableController extends Curd
+{
     public function __construct()
     {
         $this->model = new SysDept();
     }
 
 
-    public function select(Request $request):Response
+    public function select(Request $request): Response
     {
         $uid = JwtToken::getCurrentId();
-        $user = SysUser::where('user_id',$uid)->first();
-        $restaurant = SysDept::where('dept_category','餐厅')->where(function($query) use ($user) {
-            $query->where('dept_id',$user->join_user_dept_id)->orWhere('dept_super_id',$user->join_user_dept_id);
+        $user = SysUser::where('user_id', $uid)->first();
+        $restaurant = SysDept::where('dept_category', '餐厅')->where(function ($query) use ($user) {
+            $query->where('dept_id', $user->join_user_dept_id)->orWhere('dept_super_id', $user->join_user_dept_id);
         })->first();
         // $restaurant = SysDept::where('dept_category','餐厅')->where('dept_super_id',$user->join_user_dept_id)->first();
-        if(!$restaurant){
-            return  json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
+        if (!$restaurant) {
+            return json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
         }
 
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
@@ -37,7 +38,7 @@ class RestaurantTableController extends Curd{
         $order = $request->get('order', 'desc');
         $field = $field ?? 'dept_sort';
         $query = $this->doSelect($where, $field, $order);
-        
+
         return $this->doFormat($query, $format, $limit);
     }
 
@@ -86,12 +87,12 @@ class RestaurantTableController extends Curd{
     public function insert(Request $request): Response
     {
         $uid = JwtToken::getCurrentId();
-        $user = SysUser::where('user_id',$uid)->first();
-        $restaurant = SysDept::where('dept_category','餐厅')->where(function($query) use ($user) {
-            $query->where('dept_id',$user->join_user_dept_id)->orWhere('dept_super_id',$user->join_user_dept_id);
+        $user = SysUser::where('user_id', $uid)->first();
+        $restaurant = SysDept::where('dept_category', '餐厅')->where(function ($query) use ($user) {
+            $query->where('dept_id', $user->join_user_dept_id)->orWhere('dept_super_id', $user->join_user_dept_id);
         })->first();
-        if(!$restaurant){
-            return  json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
+        if (!$restaurant) {
+            return json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
         }
 
         Db::beginTransaction();
@@ -110,7 +111,7 @@ class RestaurantTableController extends Curd{
                 throw new BusinessException('创建桌台失败');
             }
             // 更新部门path
-            $path = $restaurant-> dept_super_path . $deptId . '/';
+            $path = $restaurant->dept_super_path . $deptId . '/';
             if (!SysDept::where('dept_id', $deptId)->update(['dept_super_path' => $path])) {
                 throw new BusinessException('创建桌台失败');
             }
@@ -129,30 +130,30 @@ class RestaurantTableController extends Curd{
     public function batchInsert(Request $request)
     {
         $params = $request->post();
-        if(intval($params['dept_code_nbr']) < 1){
+        if (intval($params['dept_code_nbr']) < 1) {
             return json_fail('数量不足,无法批量生成!');
         }
-        if(intval($params['dept_code']) < 1 || intval($params['dept_code'])+intval($params['dept_code']) > 999){
+        if (intval($params['dept_code']) < 1 || intval($params['dept_code']) + intval($params['dept_code']) > 999) {
             return json_fail('请填写数字,且生成后不可大于999!');
         }
 
         $uid = JwtToken::getCurrentId();
-        $user = SysUser::where('user_id',$uid)->first();
-        $restaurant = SysDept::where('dept_category','餐厅')->where(function($query) use ($user) {
-            $query->where('dept_id',$user->join_user_dept_id)->orWhere('dept_super_id',$user->join_user_dept_id);
+        $user = SysUser::where('user_id', $uid)->first();
+        $restaurant = SysDept::where('dept_category', '餐厅')->where(function ($query) use ($user) {
+            $query->where('dept_id', $user->join_user_dept_id)->orWhere('dept_super_id', $user->join_user_dept_id);
         })->first();
-        if(!$restaurant){
-            return  json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
+        if (!$restaurant) {
+            return json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
         }
 
         Db::beginTransaction();
         try {
             $data = $this->insertInput($request);
-            for($i=0;$i<$params['dept_code_nbr'];$i++){
-                $number = $i+intval($params['dept_code']);
+            for ($i = 0; $i < $params['dept_code_nbr']; $i++) {
+                $number = $i + intval($params['dept_code']);
                 $data['dept_category'] = '桌台';
-                $data['dept_name'] = $number.'号桌';
-                $data['dept_code'] = $restaurant->dept_code.'-'.$number;
+                $data['dept_name'] = $number . '号桌';
+                $data['dept_code'] = $restaurant->dept_code . '-' . $number;
                 $data['dept_super_id'] = $restaurant->dept_id;
                 $data['dept_city'] = $restaurant->dept_city;
                 $data['dept_telephone'] = $restaurant->dept_telephone;
@@ -165,7 +166,7 @@ class RestaurantTableController extends Curd{
                     throw new BusinessException('批量创建桌台失败');
                 }
                 // 更新部门path
-                $path = $restaurant-> dept_super_path . $deptId . '/';
+                $path = $restaurant->dept_super_path . $deptId . '/';
                 if (!SysDept::where('dept_id', $deptId)->update(['dept_super_path' => $path])) {
                     throw new BusinessException('批量创建桌台失败');
                 }
@@ -205,93 +206,137 @@ class RestaurantTableController extends Curd{
     public function exportTable(Request $request)
     {
         $uid = JwtToken::getCurrentId();
-        $user = SysUser::where('user_id',$uid)->first();
-        $restaurant = SysDept::where('dept_category','餐厅')->where(function($query) use ($user) {
-            $query->where('dept_id',$user->join_user_dept_id)->orWhere('dept_super_id',$user->join_user_dept_id);
+        $user = SysUser::where('user_id', $uid)->first();
+        $restaurant = SysDept::where('dept_category', '餐厅')->where(function ($query) use ($user) {
+            $query->where('dept_id', $user->join_user_dept_id)->orWhere('dept_super_id', $user->join_user_dept_id);
         })->first();
-        if(!$restaurant){
-            return  json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
+        if (!$restaurant) {
+            return json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
         }
 
         $premisesId = '';
-        if($restaurant->dept_category == '营业场所'){
+        if ($restaurant->dept_category == '营业场所') {
             $premisesId = $restaurant->dept_id;
-        }else{
-            $dept = SysDept::where('dept_id',$restaurant->dept_super_id)->first();
-            if ($dept && $dept->dept_category == '营业场所'){
+        } else {
+            $dept = SysDept::where('dept_id', $restaurant->dept_super_id)->first();
+            if ($dept && $dept->dept_category == '营业场所') {
                 $premisesId = $dept->dept_id;
             }
         }
-        if (empty($premisesId)){
+        if (empty($premisesId)) {
             return json_fail('没有查找到营业场所');
         }
 
-        $deptId = $request->get('dept_id',[]);
-        $deptName = $request->get('dept_name','');
+        $deptId = $request->get('dept_id', []);
+        $deptName = $request->get('dept_name', '');
 
-        $tables = SysDept::where('dept_category','桌台')
-            ->where('dept_super_id',$restaurant->dept_id)
-            ->when(!empty($deptId),function ($query) use ($deptId){
-                $query->whereIn('dept_id',$deptId);
-            })->when(!empty($deptName),function ($query) use ($deptName){
-                $query->where('dept_name','like',$deptName);
+        $tables = SysDept::where('dept_category', '桌台')
+            ->where('dept_super_id', $restaurant->dept_id)
+            ->when(!empty($deptId), function ($query) use ($deptId) {
+                $query->whereIn('dept_id', $deptId);
+            })->when(!empty($deptName), function ($query) use ($deptName) {
+                $query->where('dept_name', 'like', $deptName);
             })->get()
             ->toArray();
         $data = [];
-        foreach ($tables as $table){
+        foreach ($tables as $table) {
             $data[] = [
-                'dept_name'=>  $table['dept_name'],
-                'dept_code'=> $table['dept_code'],
-                'qrcode_content'=>json_encode([
-                    'action'=>'scan-dishes',
-                    'data'=>[
-                        'premises'=>$premisesId,
-                        'table'=>$table['dept_name'],
-                        'dept'=>$table['dept_id']
+                'dept_name' => $table['dept_name'],
+                'dept_code' => $table['dept_code'],
+                'qrcode_content' => json_encode([
+                    'action' => 'scan-dishes',
+                    'data' => [
+                        'premises' => $premisesId,
+                        'table' => $table['dept_name'],
+                        'dept' => $table['dept_id']
                     ]
-                ],JSON_UNESCAPED_UNICODE),
+                ], JSON_UNESCAPED_UNICODE),
             ];
         }
 
-        return json_success('',$data);
+        return json_success('', $data);
     }
 
     public function downloadQrcode(Request $request)
     {
-        $tableId = $request->get('table_id','');
+        $tableId = $request->get('table_id', '');
         $uid = JwtToken::getCurrentId();
-        $user = SysUser::where('user_id',$uid)->first();
-        $restaurant = SysDept::where('dept_category','餐厅')->where(function($query) use ($user) {
-            $query->where('dept_id',$user->join_user_dept_id)->orWhere('dept_super_id',$user->join_user_dept_id);
+        $user = SysUser::where('user_id', $uid)->first();
+        $restaurant = SysDept::where('dept_category', '餐厅')->where(function ($query) use ($user) {
+            $query->where('dept_id', $user->join_user_dept_id)->orWhere('dept_super_id', $user->join_user_dept_id);
         })->first();
-        if(!$restaurant){
-            return  json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
+        if (!$restaurant) {
+            return json_fail('您所在的营业场所没有餐厅,请联系管理员添加!');
         }
-        $fileName = 'table-'.md5($tableId);
+        $fileName = 'table-' . md5($tableId);
         // 图片已存在,删除之前的
-        if (file_exists(public_path() . "/storage/qrcode/".$fileName.'.png')){
-            unlink(public_path() . "/storage/qrcode/".$fileName.'.png');
+        if (file_exists(public_path() . "/storage/qrcode/" . $fileName . '.png')) {
+            unlink(public_path() . "/storage/qrcode/" . $fileName . '.png');
+        }
+
+        $table = SysDept::where('dept_id', $tableId)->where('dept_category', '桌台')->first();
+        $restaurant = SysDept::where('dept_id', $table->dept_super_id)->first();
+        // $premises = SysDept::where('dept_id',$restaurant->dept_super_id)->first();
+        // if (!$premises){
+        //     return json_fail('营业场所不存在');
+        // }
+        // $qrcodeContent = [
+        //     'action'=>'scan-dishes',
+        //     'data'=>[
+        //         'premises'=>$table->dept_super_id,
+        //         'table'=>$table->dept_name,
+        //         'dept'=>$table->dept_id
+        //     ]
+        // ];
+        // $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxc6274da7198e3eb4&redirect_uri=https%3A%2F%2Fh5.wanyuewellness.com.cn%2F%23%2Fpages%2Findex%2FWeChatGuide?scan="
+        // . urlencode(json_encode($qrcodeContent)).
+//        "%7B%22action%22%3A%22scan-dishes%22%2C%22data%22%3A%7B%22premises%22%3A15%2C%22table%22%3A%221%E5%8F%B7%E5%8F%B0%22%2C%22tableid%22%3A16%7D%7D
+        // "&response_type=code&scope=snsapi_base&connect_redirect=1&state=#wechat_redirect";
+        $url = getenv('TABLE_QRCODE_DOMAIN') . "/qr?tid=" . $table->dept_id;
+        $qrcode = new Qrcode();
+        $qrcode->setLabel($restaurant->dept_name . "(" . $table->dept_name . ")");
+        $qrcode = $qrcode->create($url, $fileName);
+        if ($qrcode !== false) {
+            return json_success('success', ['url' => getenv('STORAGE_DOMAIN') . '/storage/qrcode/' . $fileName . '.png']);
+        }
+    }
+
+    public function batchDownloadQrcode(Request $request)
+    {
+        $uid = JwtToken::getCurrentId();
+        $user = SysUser::where('user_id', $uid)->first();
+        $restaurant = SysDept::where('dept_category', '餐厅')->where(function ($query) use ($user) {
+            $query->where('dept_id', $user->join_user_dept_id)->orWhere('dept_super_id', $user->join_user_dept_id);
+        })->first();
+
+        $tables = SysDept::where('dept_super_id',$restaurant->dept_id)
+            ->where('dept_category','桌台')
+            ->where('dept_status','<>','DISABLED')
+            ->get()
+            ->toArray();
+        $zip = new \ZipArchive();
+        $filename = public_path().'/storage/qrcode/zip/'.$restaurant->dept_name.'-桌台.zip';
+        if (file_exists($filename)){
+            unlink($filename);
         }
 
-        $table = SysDept::where('dept_id',$tableId)->where('dept_category','桌台')->first();
-        $restaurant = SysDept::where('dept_id',$table->dept_super_id)->first();
-        $premises = SysDept::where('dept_id',$restaurant->dept_super_id)->first();
-        if (!$premises){
-            return json_fail('营业场所不存在');
+        if ($zip->open($filename, \ZipArchive::CREATE) !== TRUE) {
+            return json_fail("创建压缩文件失败");
         }
-        $qrcodeContent = [
-            'action'=>'scan-dishes',
-            'data'=>[
-                'premises'=>$premises->dept_id,
-                'table'=>$table->dept_name,
-                'dept'=>$table->dept_id
-            ]
-        ];
-
-        $qrcode = (new Qrcode)->create(json_encode($qrcodeContent,JSON_UNESCAPED_UNICODE),$fileName);
-        if ($qrcode !== false){
-            return json_success('success',['url'=>getenv('STORAGE_DOMAIN').'/storage/qrcode/'.$fileName.'.png']);
+        foreach ($tables as $table){
+            $fileName = $restaurant->dept_name.'-'.$table['dept_name'];
+            $url = getenv('TABLE_QRCODE_DOMAIN') . "/qr?tid=" . $table['dept_id'];
+            $qrcode = new Qrcode();
+            $qrcode->setLabel($restaurant->dept_name . "(" . $table['dept_name'] . ")");
+            $qrcode = $qrcode->create($url, $fileName);
+            if ($qrcode !== false) {
+                $zip->addFile(public_path().'/storage/qrcode/' . $fileName . '.png',$fileName . '.png');
+//                return json_success('success', ['url' => getenv('STORAGE_DOMAIN') . '/storage/qrcode/' . $fileName . '.png']);
+            }
         }
+        $zip->close();
+
+        return json_success('success', ['url' => getenv('STORAGE_DOMAIN') . '/storage/qrcode/zip/' . $restaurant->dept_name.'-桌台.zip']);
     }
 
     /**
@@ -299,28 +344,32 @@ class RestaurantTableController extends Curd{
      */
     public function selectListByPremiseName(Request $request)
     {
-        $premiseName = $request->get('premise','');
+        $premiseName = $request->get('premise', '');
 
         $tableList = [];
-        try{
-            $premise = SysDept::where('dept_name',$premiseName)->where('dept_category','营业场所')->where('dept_status','ACTIVED')->first();
+        try {
+
+            $restaurant = SysDept::where('dept_name', $premiseName)->where('dept_category', '餐厅')->where('dept_status', 'ACTIVED')->first();
+            if (!$restaurant) {
+                $premise = SysDept::where('dept_name', $premiseName)->where('dept_category', '营业场所')->where('dept_status', 'ACTIVED')->first();
 
-            $restaurant = SysDept::where('dept_super_id',$premise->dept_id)->where('dept_category','餐厅')->where('dept_status','ACTIVED')->first();
+                $restaurant = SysDept::where('dept_super_id', $premise->dept_id)->where('dept_category', '餐厅')->where('dept_status', 'ACTIVED')->first();
+            }
 
-            $tables = SysDept::where('dept_super_id',$restaurant->dept_id)->where('dept_category','桌台')->get()->toArray();
+            $tables = SysDept::where('dept_super_id', $restaurant->dept_id)->where('dept_category', '桌台')->get()->toArray();
 
-            foreach($tables as $table){
+            foreach ($tables as $table) {
                 $tableList[] = [
-                    'key'=>$table['dept_id'],
-                    'label'=>$table['dept_name'],
-                    'disabled'=>$table['dept_status'] == 'ACTIVED' ? false : true
+                    'key' => $table['dept_id'],
+                    'label' => $table['dept_name'],
+                    'disabled' => $table['dept_status'] == 'ACTIVED' ? false : true
                 ];
             }
 
-            return json_success('',$tableList);
-        }catch(\Exception $e){
-            return json_success('',$tableList);
+            return json_success('', $tableList);
+        } catch (\Exception $e) {
+            return json_success('', $tableList);
         }
-        
+
     }
 }

+ 35 - 8
app/admin/service/goods/GoodsService.php

@@ -153,6 +153,7 @@ class GoodsService
         $goodsName = $request->get('goods_name', '');
         $categoryId = $request->get('join_goods_category_id', null);
         $goodsCategory = $request->get('goods_category', null);
+        $type = $request->get('type','');
         if ($categoryId != null) {
             $categoryPath = SysCategory::where('category_id', $categoryId)->value('category_super_path');
             $categoryPath .= '#' . $categoryId . '#';
@@ -178,7 +179,8 @@ class GoodsService
             'user' => function ($query) {
                 $query->select('user_id', 'user_name');
             }
-        ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'creator_user_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_attribute_json', 'goods_addtimes', 'goods_updatetimes')
+        ])->leftJoin('goods_running','goods_running.join_running_goods_id','=','goods.goods_id')
+            ->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'creator_user_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_attribute_json', 'goods_addtimes', 'goods_updatetimes')
             ->when($goodsName != '', function ($query) use ($goodsName) {
                 $query->where(function ($q) use ($goodsName) {
                     $q->where('goods_name', 'like', '%' . $goodsName . '%')
@@ -195,6 +197,10 @@ class GoodsService
                 } else if ($classify != 'GOODS' && empty($categoryId)) {
                     $query->where('goods_classify', $classify);
                 }
+            })->when( !empty($type),function ($query) use ($type){
+                if ($type == 'storageWarning'){
+                    $query->where('goods_running.goods_running_storage','<=',2);
+                }
             })
             ->orderBy('goods_sort', 'DESC')
             ->orderBy('goods_addtimes', 'DESC')
@@ -202,7 +208,8 @@ class GoodsService
             ->get()
             ->toArray();
 
-        $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
+        $total = Goods::leftJoin('goods_running','goods_running.join_running_goods_id','=','goods.goods_id')
+        ->when($goodsName != '', function ($query) use ($goodsName) {
             $query->where(function ($q) use ($goodsName) {
                 $q->where('goods_name', 'like', '%' . $goodsName . '%')
                     ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
@@ -217,7 +224,11 @@ class GoodsService
             } else if ($classify != 'GOODS' && empty($categoryId)) {
                 $query->where('goods_classify', $classify);
             }
-        })
+        })->when( !empty($type),function ($query) use ($type){
+                if ($type == 'storageWarning'){
+                    $query->where('goods_running.goods_running_storage','<=',2);
+                }
+            })
             ->count();
 
         foreach ($rows as &$row) {
@@ -506,17 +517,30 @@ class GoodsService
     public static function selectCascaderList(Request $request)
     {
         $categoryIds = $request->get('category_id','');
-        if (!$categoryIds){
+        $categorySuperId = $request->get('category_super_id','');
+        $joinGoodsCategoryId = $request->get('join_goods_category_id','');
+        if (!$categoryIds && !$categorySuperId && !$joinGoodsCategoryId){
             return json_fail('参数异常');
         }
         $data = [];
-        $categorys = SysCategory::whereIn('category_id',$categoryIds)
+        $categorys = [];
+        if (!empty($categoryIds)){
+            $categorys = SysCategory::whereIn('category_id',$categoryIds)
+            ->where('category_status','ACTIVED')
+            ->select('category_id as id','category_name as name','category_super_id as pid','category_super_path')
+            ->orderBy('category_sort','DESC')
+            ->get()
+            ->toArray();
+            $data = array_merge($data,$categorys);
+        }else if(!empty($categorySuperId)){
+            $categorys = SysCategory::where('category_super_id',$categorySuperId)
             ->where('category_status','ACTIVED')
             ->select('category_id as id','category_name as name','category_super_id as pid','category_super_path')
             ->orderBy('category_sort','DESC')
             ->get()
             ->toArray();
-        $data = array_merge($data,$categorys);
+            $data = array_merge($data,$categorys);
+        }
 
         foreach ($categorys as $category){
             // if(empty($category['category_super_path'])){
@@ -530,8 +554,11 @@ class GoodsService
                 ->toArray();
             $data = array_merge($data,$subCategory);
         }
-
-        $goodsCategoryIds = array_column($data,'id');
+        if (empty($data) && !empty($joinGoodsCategoryId)){
+            $goodsCategoryIds = $joinGoodsCategoryId;
+        }else{
+            $goodsCategoryIds = array_column($data,'id');
+        }
         $goods = Goods::with('sku')
             ->whereIn('join_goods_category_id',$goodsCategoryIds)
             ->where('goods_status','ON')

+ 209 - 29
app/admin/service/member/MemberService.php

@@ -34,8 +34,13 @@ class MemberService
         $level = $request->get('level','');
         $isAuth = $request->get('is_auth','');
         $addtime = $request->get('member_addtimes',[]);
+        $type = $request->get('type','');
 
-        $rows = Member::with('account')
+        $rows = Member::with([
+                'account' => function($query){
+                    $query->where('member_account_status','ACTIVED');
+                }
+            ])
             ->where('member_is_owner', 'N')
             ->leftJoin('member_info', 'member_info.join_info_member_id', 'member.member_id')
             ->leftJoin('member_cert', 'member_cert.join_cert_member_id', 'member.member_id')
@@ -62,8 +67,17 @@ class MemberService
                 $addtime[0] = strtotime($addtime[0]);
                 $addtime[1] = strtotime($addtime[1]);
                 $query->whereBetween('member.member_addtimes', $addtime);
+            })->when(!empty($type),function ($query) use ($type) {
+                if ($type == 'todayAdd'){
+                    $addtime[0] = strtotime(date('Y-m-d').' 00:00:00');
+                    $addtime[1] = strtotime(date('Y-m-d').' 23:59:59');
+                }else if ($type == 'monthAdd'){
+                    $addtime[0] = strtotime(date('Y-m-01').' 00:00:00');
+                    $addtime[1] = strtotime(date('Y-m-t').' 23:59:59');
+                }
+                $query->whereBetween('member.member_addtimes', $addtime);
             })
-            ->select('member_id', 'member_is_owner', 'member_classify', 'member_status', 'member_mobile', 'member_from', 'member_addtimes', 'member_extend_json',
+            ->select('member_id','member_is_vip', 'member_is_owner', 'member_classify', 'member_status', 'member_mobile', 'member_from', 'member_addtimes', 'member_extend_json',
                 'member_info.member_info_nickname', 'member_info.member_info_headimg',
                 'member_role.member_role_id', 'member_role.member_role_name',
                 'member_cert.member_cert_birth', 'member_cert.member_cert_gender', 'member_cert.member_cert_name', 'member_cert.member_cert_nbr', 'member_cert.member_cert_province', 'member_cert.member_cert_addr', 'member_cert.member_cert_face', 'member_cert.member_cert_photo', 'member_cert.member_cert_nation',
@@ -77,6 +91,7 @@ class MemberService
             ->toArray();
 
         foreach ($rows as &$row) {
+            $row['member_mobile'] = substr($row['member_mobile'],0,3).'****'.substr($row['member_mobile'],7);
             $row['info'] = [
                 'member_info_nickname' => !empty($row['member_info_nickname']) ? $row['member_info_nickname'] : substr($row['member_mobile'],-4,4).'用户',
                 'member_info_headimg' => !empty($row['member_info_headimg']) ? $row['member_info_headimg'] : ''
@@ -127,6 +142,14 @@ class MemberService
                             'member_account_surplus' => $item['member_account_surplus'],
                             'member_account_added' => $item['member_account_added'],
                         ];
+                    } else if ($item['member_account_classify'] == 'VIP') {
+                        $account['vip'] = [
+                            'member_account_name' => $item['member_account_name'],
+                            'member_account_income' => $item['member_account_income'],
+                            'member_account_expend' => $item['member_account_expend'],
+                            'member_account_surplus' => $item['member_account_surplus'],
+                            'member_account_added' => $item['member_account_added'],
+                        ];
                     }
                 }
             }
@@ -275,10 +298,166 @@ class MemberService
         $member = Member::with('cert','info')
             ->where('member_id', $memberId)
             ->first();
+        if (!$member){
+            return json_fail('查询错误');
+        }
+        $member = $member->toArray();
+        $member['info'] = [
+            'member_info_nickname' => !empty($member['info']) && !empty($member['info']['member_info_nickname']) ? $member['info']['member_info_nickname'] : substr($member['member_mobile'],-4,4).'用户',
+            'member_info_headimg' => !empty($member['info']) && !empty($member['info']['member_info_headimg']) ? $member['info']['member_info_headimg'] : ''
+        ];
+        $member['cert'] = [
+            'member_cert_birth' => $member['cert']['member_cert_birth'] ?? '',
+            'member_cert_gender' => $member['cert']['member_cert_gender'] ?? '',
+            'member_cert_name' => $member['cert']['member_cert_name'] ?? '',
+            'member_cert_nbr' => $member['cert']['member_cert_nbr'] ?? '',
+            'member_cert_province' => !empty($member['cert']) && !empty($member['cert']['member_cert_province']) && is_json($member['cert']['member_cert_province']) ? json_decode($member['cert']['member_cert_province']) : '',
+            'member_cert_addr' => $member['cert']['member_cert_addr'] ?? '',
+            'member_cert_face' => !empty($member['cert']) && !empty($member['cert']['member_cert_face']) ? getenv('STORAGE_DOMAIN') . $member['cert']['member_cert_face'] : '',
+            'member_cert_photo' => !empty($member['cert']) && !empty($member['cert']['member_cert_photo']) ? getenv('STORAGE_DOMAIN') . $member['cert']['member_cert_photo'] : '',
+            'member_cert_nation' => $member['cert']['member_cert_nation'] ?? '',
+        ];
+
+        $member['is_auth'] = "未认证";
+        if (!empty($member['cert']['member_cert_nbr']) && !empty($member['cert']['member_cert_name'])) {
+            $member['is_auth'] = "已认证";
+        }
+
+        $member['source'] = "APP";
+        $member['belong'] = [];
+        if (!empty($member['member_extend_json'])) {
+            $extendJson = json_decode($member['member_extend_json'], true);
+            if (isset($extendJson['come_from'])) {
+                $member['source'] = $extendJson['come_from'] ?? '';
+            }
+            if (isset($extendJson['belong'])){
+                $user = SysUser::where('user_id',$extendJson['belong']['user_id'])->select('user_name','user_mobile')->first();
+                if($user){
+                    $member['belong']['user_id'] = $extendJson['belong']['user_id'];
+                    $member['belong']['username'] = $user->user_name;
+                    $member['belong']['user_mobile'] = $user->user_mobile;
+                }
+                $member['belong']['deptName'] = SysDept::where('dept_id',$extendJson['belong']['premises'])->value('dept_name');
+            }
+        }
 
         return json_success('', $member);
     }
 
+    /**
+     * VIP账户明细
+     */
+    public static function vipInfo(Request $request)
+    {
+        $memberId = $request->get('member_id', '');
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 20);
+
+        $account = MemberAccount::where('join_account_member_id', $memberId)
+            ->where('member_account_classify', 'VIP')
+            ->first();
+        $balance = $account->member_account_surplus + $account->member_account_added;
+
+        $info = PayDetail::where(function ($query) use ($memberId) {
+            $query->where('join_pay_member_id', $memberId)
+                // ->whereIn('pay_prepayid', ['W06', 'A01'])
+                ->where('pay_category', 'VIP')
+                ->where('pay_status', 'SUCCESS');
+        })->orWhere(function ($query) use ($memberId) {
+            $query->where('join_pay_member_id', $memberId)
+                ->where('pay_prepayid','like', '%VIP%')
+                ->where('pay_status', 'SUCCESS');
+        })->orderByDesc('pay_addtimes')
+            ->get()
+            ->toArray();
+        $data = [];
+        foreach ($info as $key => $item) {
+            $categoryIds = [];
+            if(!empty($item['join_pay_order_id'])){
+                $orderIds = Order::where('order_groupby', $item['join_pay_order_id'])->pluck('order_id');
+                $goodsIds = OrderSheet::whereIn('join_sheet_order_id', $orderIds)->pluck('join_sheet_goods_id');
+                $categoryIds = Goods::whereIn('goods_id', $goodsIds)->pluck('join_goods_category_id');
+            }
+            
+
+            $categoryName = [];
+            foreach ($categoryIds as $id) {
+                $category = SysCategory::where('category_id', $id)->first();
+                if (!empty($category->category_super_path)) {
+                    $path = explode('#', $category->category_super_path);
+                    $ids = array_filter($path);
+                    $categoryName[] = SysCategory::where('category_id', current($ids))->value('category_name');
+                } else {
+                    $categoryName[] = $category->category_name;
+                }
+            }
+            $item['goods_category'] = implode(',', array_unique($categoryName));
+            if(mb_substr($item['goods_category'],0,7) == '自定义金额充值'){
+                $item['goods_category'] = '自定义金额充值';
+            }
+
+            if (in_array($item['pay_category'], ['VIP', 'REFUND'])) {
+                $item['balance_type'] = 'add';
+            } else {
+                $item['balance_type'] = 'cut';
+            }
+            if ($key == 0 && in_array($item['pay_category'], ['VIP', 'REFUND'])) {
+                if (!empty($item['pay_extend_json'])) {
+                    $extendJson = json_decode($item['pay_extend_json'], true);
+                    if (!isset($extendJson['added_amount'])) {
+                        $extendJson['added_amount'] = 0;
+                    }
+                    if (isset($extendJson['added_amount']) && floatval($extendJson['added_amount']) > 0) {
+                        $data[] = [
+                            'join_pay_member_id' => $item['join_pay_member_id'],
+                            'pay_addtimes' => $item['pay_addtimes'],
+                            'pay_amount' => $extendJson['added_amount'],
+                            'pay_category' => 'ADDED',
+                            'balance' => number_format($balance, 2, '.', ''),
+                            'balance_type' => 'add',
+                        ];
+                    }
+                    $balance = $balance - $extendJson['added_amount'];
+                }
+
+                $item['balance'] = number_format($balance, 2, '.', '');
+                $balance = $balance - $item['pay_amount'];
+                $data[] = $item;
+                continue;
+            }
+
+            if (in_array($item['pay_category'], ['VIP', 'REFUND'])) {
+                if (!empty($item['pay_extend_json'])) {
+                    $extendJson = json_decode($item['pay_extend_json'], true);
+                    if (isset($extendJson['added_amount']) && floatval($extendJson['added_amount']) > 0) {
+                        $data[] = [
+                            'join_pay_member_id' => $item['join_pay_member_id'],
+                            'pay_addtimes' => $item['pay_addtimes'],
+                            'pay_amount' => $extendJson['added_amount'],
+                            'pay_category' => 'ADDED',
+                            'balance' => number_format($balance, 2, '.', ''),
+                            'balance_type' => 'add',
+                        ];
+                        $balance = $balance - $extendJson['added_amount'];
+                    }
+                }
+                $item['balance'] = number_format($balance, 2, '.', '');
+                $balance = $balance - $item['pay_amount'];
+            } else {
+                $item['balance'] = number_format($balance, 2, '.', '');
+                $balance = $balance + $item['pay_amount'];
+            }
+
+            $data[] = $item;
+        }
+
+        $total = count($data);
+        $start = ($page-1)*$pageSize;
+        $rows = array_slice($data,$start,$pageSize);
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+
     public static function welfareInfo(Request $request)
     {
         $memberId = $request->get('member_id', '');
@@ -580,6 +759,7 @@ class MemberService
                 'member_classify' => $params['classify'] ?? '',
                 'member_status' => $params['status'] ?? 'ISABLED',
                 'member_mobile' => $params['mobile'] ?? '',
+                'member_category' => $params['member_category'] ?? '后台添加',
 //                'member_from' => $params['source'],
                 // 'member_extend_json' => json_encode(['come_from' => $params['source']]),
                 'member_addtimes' => time(),
@@ -615,18 +795,18 @@ class MemberService
             // 现金/余额账户
             MemberAccount::insert($accountData);
             // 福利账户
-            if (!empty($params['member_classify']) && $params['member_classify'] == 'EMPLOY'){
-                $welfareData = [
-                    'join_account_member_id'=>$memberId,
-                    'member_account_classify'=>'WELFARE',
-                    'member_account_status'=>'ACTIVED',
-                    'member_account_category'=>'NORMAL',
-                    'member_account_nbr'=>$memberId.'-WELFARE',
-                    'member_account_name'=>'福利账户',
-                    'member_account_addtimes'=>time()
-                ];
-                MemberAccount::insert($welfareData);
-            }
+//            if (!empty($params['member_classify']) && $params['member_classify'] == 'EMPLOY'){
+//                $welfareData = [
+//                    'join_account_member_id'=>$memberId,
+//                    'member_account_classify'=>'WELFARE',
+//                    'member_account_status'=>'ACTIVED',
+//                    'member_account_category'=>'NORMAL',
+//                    'member_account_nbr'=>$memberId.'-WELFARE',
+//                    'member_account_name'=>'福利账户',
+//                    'member_account_addtimes'=>time()
+//                ];
+//                MemberAccount::insert($welfareData);
+//            }
 
             // member cert
             $certData = [
@@ -662,7 +842,7 @@ class MemberService
             return json_fail("数据添加失败");
         }
 
-        return json_success('数据添加成功');
+        return json_success('数据添加成功',['member_id'=>$memberId]);
     }
 
     /**
@@ -701,7 +881,7 @@ class MemberService
                 'member_is_owner' => $params['is_owner'],
                 'member_classify' => $params['member_classify'],
                 'member_status' => $params['status'],
-                'member_mobile' => $params['mobile'],
+                // 'member_mobile' => $params['mobile'],
 //                'member_from' => $params['source'],
                 'member_extend_json' => json_encode($extendJson)
             ];
@@ -745,18 +925,18 @@ class MemberService
                 MemberInfo::where('join_info_member_id', $params['member_id'])->update($infoData);
             }
             // 福利账户
-            if (!empty($params['member_classify']) && $params['member_classify'] == 'EMPLOY' && !MemberAccount::where('member_account_nbr',$memberId.'-WELFARE')->exists()){
-                $welfareData = [
-                    'join_account_member_id'=>$memberId,
-                    'member_account_classify'=>'WELFARE',
-                    'member_account_status'=>'ACTIVED',
-                    'member_account_category'=>'NORMAL',
-                    'member_account_nbr'=>$memberId.'-WELFARE',
-                    'member_account_name'=>'福利账户',
-                    'member_account_addtimes'=>time()
-                ];
-                MemberAccount::insert($welfareData);
-            }
+//            if (!empty($params['member_classify']) && $params['member_classify'] == 'EMPLOY' && !MemberAccount::where('member_account_nbr',$memberId.'-WELFARE')->exists()){
+//                $welfareData = [
+//                    'join_account_member_id'=>$memberId,
+//                    'member_account_classify'=>'WELFARE',
+//                    'member_account_status'=>'ACTIVED',
+//                    'member_account_category'=>'NORMAL',
+//                    'member_account_nbr'=>$memberId.'-WELFARE',
+//                    'member_account_name'=>'福利账户',
+//                    'member_account_addtimes'=>time()
+//                ];
+//                MemberAccount::insert($welfareData);
+//            }
 
             Db::commit();
         } catch (\Exception $e) {
@@ -965,6 +1145,6 @@ class MemberService
     {
         $id = SysSerial::getSerial();
 
-        return "ME" . str_pad($id, 16, "0", STR_PAD_LEFT) . random_string(6, 'up');
+        return "MR" . str_pad($id, 16, "0", STR_PAD_LEFT) . random_string(6, 'up');
     }
 }

+ 8 - 0
app/admin/service/order/AppointmentService.php

@@ -34,6 +34,7 @@ class AppointmentService
         $status = $request->get('status', '');
         $premisesName = $request->get('premises', '');
         $appointmentMode = $request->get('appointment_mode', '');
+        $type = $request->get('type','');
 
         $rows = Db::table('appointment')
             ->leftJoin('member', 'member.member_id', '=', 'appointment.join_appointment_member_id')
@@ -62,6 +63,13 @@ class AppointmentService
                 }else{
                     $query->where('appointment_mode',$appointmentMode);
                 }
+            })->when(!empty($type), function ($query) use ($type){
+                if ($type == 'todayDONE'){
+                    $query->where('appointment_status','DONE');
+                    $query->whereBetween('appointment_addtimes',[strtotime(date('Y-m-d').' 00:00:00'),strtotime(date('Y-m-d').' 23:59:59')]);
+                }elseif ($type == 'todayAppointment'){
+                    $query->where('appointment_datetime',date('Y-m-d'));
+                }
             });
 
         $total = $rows->count('member.member_id');

+ 13 - 4
app/admin/service/order/OrderService.php

@@ -133,11 +133,20 @@ class OrderService
                 // 订单详情表
                 OrderSheet::where('join_sheet_order_id', $order->order_id)->update(['order_sheet_status' => 'CANCEL']);
                 // 支付表
-                PayDetail::where('pay_id', $order->order_groupby)->update([
-                    'pay_status' => 'CANCEL',
-                ]);
+                $payDetail = PayDetail::where('join_pay_order_id', $order->order_groupby)->first();
+                if(!empty($payDetail)){
+                    $payExtendJson = [];
+                    if (!empty($payDetail->pay_extend_json)){
+                        $payExtendJson = json_decode($payDetail->pay_extend_json,true);
+                    }
+                    $payExtendJson['cancel_times'] = date('Y-m-d H:i:s'); 
+                    PayDetail::where('join_pay_order_id', $order->order_groupby)->update([
+                        'pay_status' => 'CANCEL',
+                        'pay_extend_json' => json_encode($payExtendJson)
+                    ]);
+                }
             }
-
+            
             Db::commit();
         } catch (\Exception $e) {
             Db::rollBack();

+ 1 - 1
app/admin/service/statistics/AppointmentService.php

@@ -16,7 +16,7 @@ class AppointmentService
         // 今日预约
         $data['todayAppointment'] = Appointment::where('appointment_datetime', date('Y-m-d'))->count('appointment_id');
         // 今日服务
-        $today = Db::select("select service_time,count(*) as total from (select left(appointment_doing_datetime,10) as service_time from app_appointment where appointment_doing_datetime != '') as appointment where service_time =".date('Y-m-d'));
+        $today = Db::select("select service_time,count(*) as total from (select left(appointment_doing_datetime,10) as service_time from app_appointment where appointment_status = 'DONE') as appointment where service_time ='".date('Y-m-d')."'");
         $data['todayService'] = $today[0]->total;
 
         return $data;

+ 27 - 0
app/admin/service/statistics/ChatMessageService.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\service\statistics;
+
+use app\model\Appointment;
+use app\model\ChatMessage;
+use support\Db;
+
+class ChatMessageService
+{
+    public static function getChatMessage()
+    {
+        // 今日咨询
+        $todayStartUnix = strtotime(date('Y-m-d'));
+        $chats= ChatMessage::whereBetween('chat_message_addtimes',[$todayStartUnix,time()])->get()->toArray();
+        $memberIds = [];
+        foreach ($chats as $chat){
+            if (substr($chat['join_message_send_id'],0,2) == 'MR'){
+                $memberIds[$chat['join_message_send_id']] = $chat['join_message_send_id'];
+            }
+        }
+
+        $data['todayChat'] = count($memberIds);
+
+        return $data;
+    }
+}

+ 14 - 1
app/admin/service/statistics/GoodsService.php

@@ -4,12 +4,25 @@ namespace app\admin\service\statistics;
 
 use app\model\Goods;
 use app\model\GoodsRunning;
+use app\model\SysCategory;
 
 class GoodsService
 {
     public static function getGoods()
     {
-        $data['storageWarning'] = GoodsRunning::where("goods_running_storage",'<=',10)->count();
+        $categoryPath = SysCategory::where('category_id', 5)->value('category_super_path');
+        $categoryPath .= '#5#';
+        $categoryIds = SysCategory::where('category_super_path', 'like', $categoryPath . '%')->pluck('category_id')->toArray();
+        $categoryIds[] = 5;
+        if (!empty($categoryIds)) {
+            $categoryId = $categoryIds;
+        } else {
+            $categoryId = [5];
+        }
+        $data['storageWarning'] = GoodsRunning::leftJoin('goods','goods.goods_id','=','goods_running.join_running_goods_id')
+            ->where("goods_running_storage",'<=',2)
+            ->whereIn('goods.join_goods_category_id',$categoryId)
+            ->count();
 
         return $data;
     }

+ 11 - 2
app/admin/service/statistics/OrderService.php

@@ -13,13 +13,22 @@ class OrderService
         // 今日订单
         $todayTimeUnix = strtotime(date('Y-m-d'));
         // 今日订单
-        $data['todayOrder'] = Order::where('order_addtimes', '>', $todayTimeUnix)->count();
+        $data['todayOrder'] = Order::where('order_addtimes', '>', $todayTimeUnix)->where('order_category', '<>', 'RECHARGE')->count();
         // 今日收入
         $data['todayRevenue'] = Order::where('order_status_payment', 'SUCCESS')
             ->where('order_addtimes', '>', $todayTimeUnix)
+            ->where('order_category', '<>', 'RETURN')
+            ->where('order_category', '<>', 'RECHARGE')
+            ->sum('order_amount_pay');
+        // 今日充值额
+        $data['todayRecharge'] = Order::where('order_status_payment', 'SUCCESS')
+            ->where('order_addtimes', '>', $todayTimeUnix)
+            ->where('order_category', 'RECHARGE')
+            ->where('order_status_payment','SUCCESS')
             ->sum('order_amount_pay');
         // 今日退单
-        $data['todayRefund'] = OrderReturn::where('order_return_addtimes', '>', $todayTimeUnix)->count();
+        $data['todayRefund'] = OrderReturn::where('order_return_addtimes', '>', $todayTimeUnix)
+            ->count();
 
 
         // 柱状图

+ 0 - 2
app/admin/service/sys_manage/UploadService.php

@@ -18,8 +18,6 @@ class UploadService
     {
         try {
             $res = Storage::uploadFile($config);
-
-            dump($res);
             $data = [
                 'fileName'=>$res[0]['origin_name'],
                 'url' => getenv("STORAGE_DOMAIN").$config['uri'] . date('Ymd') . '/thumb/' . $res[0]['save_name'],

+ 1 - 1
app/admin/validate/member/MemberValidate.php

@@ -29,7 +29,7 @@ class MemberValidate extends Validate
     protected $scene = [
         'add' => ['avatar', 'source', 'is_owner', 'classify', 'birth', 'gender', 'status', 'mobile', 'addr', 'cert_name',
             'cert_nbr', 'member_cert_face', 'member_cert_photo'],
-        'update' => ['member_id', 'avatar', 'source', 'is_owner', 'classify', 'birth', 'gender', 'status', 'mobile', 'addr', 'cert_name',
+        'update' => ['member_id', 'avatar', 'source', 'is_owner', 'classify', 'birth', 'gender', 'status', 'addr', 'cert_name',
             'cert_nbr', 'member_cert_face', 'member_cert_photo']
     ];
 }

+ 34 - 0
app/api/controller/scan/QrcodeController.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace app\api\controller\scan;
+
+use app\model\SysDept;
+use support\Request;
+
+class QrcodeController{
+    public function index(Request $request)
+    {
+        $tableId = $request->get('tid','');
+        if (!empty($tableId)){
+            $table = SysDept::where('dept_id',$tableId)->where('dept_category','桌台')->first();
+            if (!$table){
+                echo "桌台不存在";
+                exit();
+            }
+
+            $qrcodeContent = [
+                'action'=>'scan-dishes',
+                'data'=>[
+                    'premises'=>$table->dept_super_id,
+                    'table'=>$table->dept_name,
+                    'dept'=>$table->dept_id
+                ]
+            ];
+            $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxc6274da7198e3eb4&redirect_uri=https%3A%2F%2Fh5.wanyuewellness.com.cn%2F%23%2Fpages%2Findex%2FWeChatGuide?scan="
+            . urlencode(json_encode($qrcodeContent)).
+            "&response_type=code&scope=snsapi_base&connect_redirect=1&state=#wechat_redirect";
+
+            return redirect($url,302);
+        }
+    }
+}

+ 77 - 26
app/command/WelfareAccountCommand.php

@@ -6,6 +6,7 @@ use app\model\Member;
 use app\model\MemberAccount;
 use app\model\Order;
 use app\model\PayDetail;
+use support\Db;
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
@@ -22,45 +23,95 @@ class WelfareAccountCommand extends Command
      */
     protected function configure()
     {
-        $this->addArgument('name', InputArgument::OPTIONAL, '余额账户转福利账户');
+        // $this->addArgument('name', InputArgument::OPTIONAL, '余额账户转福利账户');
+        $this->addArgument('name', InputArgument::OPTIONAL, '福利账户余额清空');
     }
 
-
     protected function execute(InputInterface $input, OutputInterface $output): int
     {
-        $members = Member::select('member_id', 'member_classify')->get()->toArray();
-        foreach ($members as $member) {
-            if (!MemberAccount::where('join_account_member_id', $member['member_id'])->where('member_account_classify', 'WELFARE')->exists()) {
-                if (!$this->generateWelfareAccount($member['member_id'])) {
-                    echo "会员【" . $member['member_id'] . "】跳过\n";
+        $accounts = MemberAccount::where('member_account_classify','WELFARE')->get()->toArray();
+        Db::beginTransaction();
+        try{
+            
+            foreach($accounts as $account){
+                if ($account['member_account_income'] == '0.00'){
+                    echo "会员【" . $account['join_account_member_id'] . "】跳过\n";
                     continue;
                 }
+                // 更新余额账户
+                MemberAccount::where('member_account_id',$account['member_account_id'])->update([
+                    'member_account_expend' => $account['member_account_expend'] + $account['member_account_surplus'],
+                    'member_account_surplus' => 0
+                ]);
+
+                // 插入清零记录
+                $this->generatePayDetail($account);
+                echo "会员【" . $account['join_account_member_id'] . "】已处理完成\n";
             }
-            if ($member['member_classify'] != 'EMPLOY') {
-                Member::where('member_id', $member['member_id'])->update(['member_classify' => 'EMPLOY']);
-            }
-            // 改所有的充值记录
-            PayDetail::where('join_pay_member_id', $member['member_id'])->where('pay_category', 'RECHARGE')->where('pay_amount','1000.00')->update(['pay_prepayid' => $member['member_id'] . '-WELFARE']);
-
-            // 改所有的付款记录
-            PayDetail::where('join_pay_member_id', $member['member_id'])->where('pay_prepayid', $member['member_id'] . '-CASH')->update(['pay_prepayid' => $member['member_id'] . '-WELFARE']);
+            Db::commit();
 
-            // 余额账户清空
-           MemberAccount::where('join_account_member_id', $member['member_id'])->where('member_account_classify', 'CASH')->update([
-               'member_account_income' => 0,
-               'member_account_expend' => 0,
-               'member_account_surplus' => 0,
-               'member_account_added' => 0,
+            return self::SUCCESS;
+        }catch(\Exception $e){
+            dump($e->getMessage());
 
-           ]);
-
-
-            echo "会员【" . $member['member_id'] . "】已处理完成\n";
+            Db::rollBack();
         }
 
-        return self::SUCCESS;
     }
 
+    /**
+     * 生成清零记录
+     */
+    private function generatePayDetail($account)
+    {
+        $payDetailData = [
+            'join_pay_member_id'=>$account['join_account_member_id'],
+            'pay_status'=>'SUCCESS',
+            'pay_category'=>'CLEAR',
+            'pay_amount'=>$account['member_account_surplus'],
+            'pay_paytimes'=>date('Y-m-d H:i:s'),
+            'pay_prepayid'=>$account['member_account_nbr'],
+            'pay_addtimes'=>time()
+        ];
+        
+        PayDetail::insert($payDetailData);
+    }
+
+    // protected function execute(InputInterface $input, OutputInterface $output): int
+    // {
+    //     $members = Member::select('member_id', 'member_classify')->get()->toArray();
+    //     foreach ($members as $member) {
+    //         if (!MemberAccount::where('join_account_member_id', $member['member_id'])->where('member_account_classify', 'WELFARE')->exists()) {
+    //             if (!$this->generateWelfareAccount($member['member_id'])) {
+    //                 echo "会员【" . $member['member_id'] . "】跳过\n";
+    //                 continue;
+    //             }
+    //         }
+    //         if ($member['member_classify'] != 'EMPLOY') {
+    //             Member::where('member_id', $member['member_id'])->update(['member_classify' => 'EMPLOY']);
+    //         }
+    //         // 改所有的充值记录
+    //         PayDetail::where('join_pay_member_id', $member['member_id'])->where('pay_category', 'RECHARGE')->where('pay_amount','1000.00')->update(['pay_prepayid' => $member['member_id'] . '-WELFARE']);
+
+    //         // 改所有的付款记录
+    //         PayDetail::where('join_pay_member_id', $member['member_id'])->where('pay_prepayid', $member['member_id'] . '-CASH')->update(['pay_prepayid' => $member['member_id'] . '-WELFARE']);
+
+    //         // 余额账户清空
+    //        MemberAccount::where('join_account_member_id', $member['member_id'])->where('member_account_classify', 'CASH')->update([
+    //            'member_account_income' => 0,
+    //            'member_account_expend' => 0,
+    //            'member_account_surplus' => 0,
+    //            'member_account_added' => 0,
+
+    //        ]);
+
+
+    //         echo "会员【" . $member['member_id'] . "】已处理完成\n";
+    //     }
+
+    //     return self::SUCCESS;
+    // }
+
     private function generateWelfareAccount($memberId)
     {
         $cashAccount = MemberAccount::where('join_account_member_id', $memberId)->where('member_account_classify', 'CASH')->first();

+ 2 - 2
app/common/Qrcode.php

@@ -14,7 +14,7 @@ use Endroid\QrCode\Writer\PngWriter;
 class Qrcode{
     private $logo = null;
     private $label = null;
-    private $size = 600;
+    private $size = 400;
     
     public function __construct() 
     {
@@ -52,7 +52,7 @@ class Qrcode{
             ->setEncoding(new Encoding('UTF-8'))    //设置编码格式
             ->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())    //设置纠错级别为低
             ->setSize($this->size)      //大小
-            ->setMargin(20)             //边距
+            ->setMargin(30)             //边距
             ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())     //设置圆轮大小边距
             ->setForegroundColor(new Color(0, 0, 0))        //前景色
             ->setBackgroundColor(new Color(255, 255, 255));       //背景色

+ 31 - 0
app/event/order/KangyangCityEvent.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace app\event\order;
+
+use app\model\Member;
+use app\model\MemberAccount;
+
+class KangyangCityEvent{
+    public function grant($params)
+    {
+        dump("进入event");
+        // 会员VIP 标识
+        Member::where('member_id',$params['member_id'])->update(['member_is_vip'=>'Y']);
+        // 康养城VIP账户
+        if (!MemberAccount::where('join_account_member_id',$params['member_id'])->where('member_account_classify','VIP')->exists()){
+            $account = [
+                'join_account_member_id' => $params['member_id'],
+                'member_account_classify' => 'VIP',
+                'member_account_status' => 'ACTIVED',
+                'member_account_category'=>'NORMAL',
+                'member_account_nbr' => $params['member_id'].'-VIP',
+                'member_account_name' => 'VIP账户',
+                'member_account_income'=>24000,
+                'member_account_surplus' => 24000,
+                'member_account_addtimes'=>time(),
+            ];
+
+            MemberAccount::insert($account);
+        }   
+    }
+}

+ 23 - 0
app/model/ChatMessage.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\model;
+
+use support\Model;
+
+class ChatMessage extends Model
+{
+    protected $table = 'chat_message';
+
+    protected $primaryKey = 'chat_message_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'chat_message_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(\DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+}

+ 6 - 0
app/model/ClientMessage.php

@@ -33,4 +33,10 @@ class ClientMessage extends Model
         return $this->hasOne(MemberCert::class, 'join_cert_member_id', 'join_client_message_recv_member_id')
             ->select('join_cert_member_id', 'member_cert_name');
     }
+
+    public function info()
+    {
+        return $this->hasOne(MemberInfo::class, 'join_info_member_id', 'join_client_message_recv_member_id')
+            ->select('join_info_member_id', 'member_info_nickname');
+    }
 }

+ 21 - 0
app/model/GoodsEvaluate.php

@@ -34,6 +34,19 @@ class GoodsEvaluate extends Model
         return $this->hasOne(Member::class, 'member_id', 'join_evaluate_member_id');
     }
 
+    /**
+     * 关联Cert
+     */
+    public function cert()
+    {
+        return $this->hasOne(MemberCert::class, 'join_cert_member_id', 'join_evaluate_member_id');
+    }
+
+    public function info()
+    {
+        return $this->hasOne(MemberInfo::class, 'join_info_member_id', 'join_evaluate_member_id');
+    }
+
     /**
      * @Desc 关联商品
      * @Author Gorden
@@ -45,4 +58,12 @@ class GoodsEvaluate extends Model
     {
         return $this->hasOne(Goods::class, 'goods_id', 'join_evaluate_goods_id');
     }
+
+    /**
+     * 关联订单
+     */
+    public function order()
+    {
+        return $this->hasOne(Order::class, 'order_id', 'join_evaluate_order_id');
+    }
 }

+ 3 - 0
config/event.php

@@ -10,4 +10,7 @@ return [
     'client_message.return_status' => [
         [\app\event\ClientMessageEvent::class, 'returnStatus']
     ],
+    'order.kangyangCityVIP.grant' => [
+        [\app\event\order\KangyangCityEvent::class, 'grant']
+    ]
 ];

+ 21 - 1
route/admin.php

@@ -197,6 +197,8 @@ Route::group('/admin', function () {
             Route::get('/exportTable', [\app\admin\controller\sys_manage\RestaurantTableController::class, 'exportTable']);
             Route::get('/downQrcode', [\app\admin\controller\sys_manage\RestaurantTableController::class, 'downloadQrcode']);
             Route::get('/selectListByPremiseName', [\app\admin\controller\sys_manage\RestaurantTableController::class, 'selectListByPremiseName']);
+            Route::get('/batchDownloadQrcode', [\app\admin\controller\sys_manage\RestaurantTableController::class, 'batchDownloadQrcode']);
+
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
@@ -667,6 +669,7 @@ Route::group('/admin', function () {
             Route::get('/selectMemberAllQuota', [\app\admin\controller\member\MemberController::class, 'selectMemberAllQuota']);
             Route::get('/selectMemberAllQuotaByAppointment', [\app\admin\controller\member\MemberController::class, 'selectMemberAllQuotaByAppointment']);
             Route::get('/welfareInfo', [\app\admin\controller\member\MemberController::class, 'welfareInfo']);
+            Route::get('/vipInfo', [\app\admin\controller\member\MemberController::class, 'vipInfo']);
             Route::get('/balanceInfo', [\app\admin\controller\member\MemberController::class, 'balanceInfo']);
             Route::get('/pointInfo', [\app\admin\controller\member\MemberController::class, 'pointInfo']);
             Route::get('/list', [\app\admin\controller\member\MemberController::class, 'list']);
@@ -900,6 +903,12 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        // 康养城订单
+        Route::group('/kangyangCity', function () {
+            Route::get('/list', [\app\admin\controller\order\KangyangCityController::class, 'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
         // 服务订单
         Route::group('/services', function () {
             Route::get('/list', [\app\admin\controller\order\ServicesController::class, 'select']);
@@ -974,7 +983,7 @@ Route::group('/admin', function () {
             // 我的积分
             Route::get('/points/list', [\app\admin\controller\client\PointsController::class, 'select']);
             // 我的评价
-            Route::get('/evaluate/list', [\app\admin\controller\client\EvaluateController::class, 'select']);
+            // Route::get('/evaluate/list', [\app\admin\controller\client\EvaluateController::class, 'select']);
             // 我的购物车
             Route::get('/cart/list', [\app\admin\controller\client\CartController::class, 'select']);
             // 我的优惠券
@@ -984,11 +993,22 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        
+        /* 评价管理 */
+        Route::group('/evaluate', function () {
+            Route::get('/list', [\app\admin\controller\client\EvaluateController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\client\EvaluateController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\client\EvaluateController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\client\EvaluateController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);;
         /* 消息管理 */
         Route::group('/message', function () {
             Route::group('', function () {
                 Route::get('/list', [\app\admin\controller\client\MessageController::class, 'select']);
                 Route::post('/add', [\app\admin\controller\client\MessageController::class, 'insert']);
+                Route::post('/groupAdd', [\app\admin\controller\client\MessageController::class, 'groupInsert']);
                 Route::post('/update', [\app\admin\controller\client\MessageController::class, 'update']);
                 Route::delete('/delete', [\app\admin\controller\client\MessageController::class, 'delete']);
             })->middleware([

+ 3 - 0
route/api.php

@@ -7,4 +7,7 @@ Route::group('/api',function (){
         Route::post('/alipay',[\app\api\controller\pay\AlipayController::class,'index']);
         Route::post('/wxpay',[\app\api\controller\pay\WxpayController::class,'index']);
     });
+    Route::group('/scan',function (){
+        Route::get('/qrcode',[\app\api\controller\scan\QrcodeController::class,'index']);
+    });
 });