Ver código fonte

Merge branch 'master' into custom_manager

yb 6 meses atrás
pai
commit
b27bcad982

+ 18 - 15
app/admin/controller/client/EvaluateController.php

@@ -94,12 +94,17 @@ class EvaluateController extends Curd
             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.',';
+                if (isset($goodsEvaluateJson['photo'])){
+                    foreach ($goodsEvaluateJson['photo'] as $images){
+                        if (isset($images['file'])){
+                            $imagesStr .= getenv('APP_IMAGE_DOMAIN').$images['file']['file_savepath'].$images['file']['file_savename'].',';
+                        }
                     }
                 }
-                $item->goods_evaluate_json = rtrim($imagesStr,',');
+                if (isset($goodsEvaluateJson['desc'])){
+                    $item->desc = $goodsEvaluateJson['desc'];
+                }
+                $item->photos = rtrim($imagesStr,',');
             }
         }
         return $items;
@@ -134,19 +139,17 @@ class EvaluateController extends Curd
         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['photo'])){
+                foreach($goodsEvaluateJson['photo'] as $file){
+                    if (isset($file['file'])){
+                        $imagesStr .= getenv('APP_IMAGE_DOMAIN').$file['file']['file_savepath'].$file['file']['file_savename'].',';
+                    }
                 }
+                $evaluate->photos = rtrim($imagesStr,',');
+            }
+            if (isset($goodsEvaluateJson['desc'])){
+                $evaluate->desc = $goodsEvaluateJson['desc'];
             }
-            // 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)){

+ 1 - 1
app/admin/controller/content/ApartmentController.php

@@ -8,7 +8,7 @@ use support\exception\BusinessException;
 use support\Request;
 use support\Response;
 
-class ApartMentController extends Curd
+class ApartmentController extends Curd
 {
     public function __construct()
     {

+ 454 - 10
app/admin/controller/coupon/CouponController.php

@@ -6,11 +6,16 @@ use app\admin\validate\coupon\CouponValidate;
 use app\admin\validate\device\DeviceValidate;
 use app\controller\Curd;
 use app\model\Coupon;
+use app\model\CouponGoods;
 use app\model\Device;
+use app\model\Member;
+use app\model\SysDept;
 use app\model\SysSerial;
+use support\Db;
 use support\exception\BusinessException;
 use support\Request;
 use support\Response;
+use Tinywan\Jwt\JwtToken;
 
 class CouponController extends Curd
 {
@@ -32,21 +37,108 @@ class CouponController extends Curd
      */
     public function select(Request $request): Response
     {
+        $joinCouponCategoryId = $request->get('join_coupon_category_id',[]);
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        if (!empty($joinCouponCategoryId)){
+            $where['join_coupon_category_id'] = ['in',implode(',',$joinCouponCategoryId)];
+        }
         $order = $request->get('order', 'desc');
         $field = $field ?? 'coupon_addtimes';
         $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([
+            'category' => function ($query) {
+                $query->select('category_id', 'category_name');
+            },
+            'user'
+        ]);
+        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);
+        }
+        return $model;
+    }
+
+    protected function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            if (!empty($item['coupon_json'])) {
+                $couponJson = json_decode($item['coupon_json'], true);
+                if (isset($couponJson['member'])) {
+                    if (isset($couponJson['member']['list']) && !empty($couponJson['member']['list'])) {
+                        $item['coupon_use_member'] = 'member';
+                        $item['memberList'] = $couponJson['member']['list'];
+                    } else if (isset($couponJson['member']['where']) && !empty($couponJson['member']['where'])) {
+                        if (trim($couponJson['member']['where']) == '1') {
+                            $item['coupon_use_member'] = 'all';
+                        } else {
+                            $item['coupon_use_member'] = 'condition';
+                            $where = str_replace('`', '', urldecode($couponJson['member']['where']));
+                            $whereArr = explode('=', $where);
+//                            dump($whereArr);
+                            if (isset($whereArr[0]) && trim($whereArr[0]) == 'member_is_vip') {
+                                $item['condition'] = 'is_vip';
+                            } else if (isset($whereArr[0]) && trim($whereArr[0]) == 'member_classify') {
+                                if (isset($whereArr[1]) && str_replace("'", '', trim($whereArr[1])) == 'MEMBER') {
+                                    $item['condition'] = 'is_member';
+                                } else if (isset($whereArr[1]) && str_replace("'", '', trim($whereArr[1])) == 'EMPLOY') {
+                                    $item['condition'] = 'is_employ';
+                                }
+                            }
+                        }
+                    }
+                }
+                if (isset($couponJson['premises'])) {
+                    $item['premises'] = $couponJson['premises'];
+                } else {
+                    $item['premises_range'] = 'all';
+                }
+            }
+        }
+
+        return $items;
+    }
+
     public function selectList()
     {
-        $coupons = Coupon::where('coupon_status','ACTIVED')
-            ->select('coupon_id','coupon_name')
+        $coupons = Coupon::where('coupon_status', 'ACTIVED')
+            ->select('coupon_id', 'coupon_name')
             ->get()
             ->toArray();
 
-        return json_success('',$coupons);
+        return json_success('', $coupons);
     }
 
 //    public function afterQuery($items)
@@ -59,28 +151,380 @@ class CouponController extends Curd
 //        return $items;
 //    }
 
+    /**
+     * @Desc 添加优惠券
+     * @Author Gorden
+     * @Date 2024/8/14 15:16
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function insert(Request $request): Response
+    {
+        if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) {
+            return json_fail($this->validateClass->getError());
+        }
+        $goods = $request->post('goodsContentList', []);
+        if (empty($goods)) {
+            return json_fail("请选择关联的产品");
+        }
+
+        Db::beginTransaction();
+        try {
+            $data = $this->insertInput($request);
+            $data['coupon_creator_user_id'] = JwtToken::getCurrentId();
+            $this->doInsert($data);
+            // 关联优惠券和商品、规格
+            $this->insertCouponGoods($goods, $data['coupon_id']);
+            Db::commit();
+
+            return json_success('success');
+        } catch (BusinessException $customException) {
+            Db::rollBack();
+            dump($customException->getMessage());
+            return json_fail($customException->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            return json_fail('数据写入失败');
+        }
+    }
+
+    /**
+     * @Desc 关联优惠券、产品、规格
+     * @Author Gorden
+     * @Date 2024/8/14 14:32
+     *
+     * @param $goods
+     * @param $couponId
+     * @return void
+     * @throws BusinessException
+     */
+    public function insertCouponGoods($goods, $couponId)
+    {
+        try {
+            foreach ($goods as $good) {
+                CouponGoods::insert([
+                    'join_goods_coupon_id' => $couponId,
+                    'join_coupon_goods_id' => $good['goods_id'],
+                    'join_coupon_goods_sku_id' => $good['sku_id'],
+                    'coupon_goods_json' => '[]',
+                    'coupon_goods_extend_json' => '[]',
+                    'coupon_goods_addtimes' => time()
+                ]);
+            }
+        } catch (\Exception $e) {
+            throw new BusinessException("关联产品失败");
+        }
+    }
+
     protected function insertInput(Request $request): array
     {
-        $data = $this->inputFilter($request->post());
-        $data['coupon_id'] = "CO" . str_pad(SysSerial::getSerial(), 16, '0') . random_string(8, 'up');
-        $data['coupon_begindate'] = date("Y-m-d H:i:s", strtotime($data['coupon_begindate']));
-        $data['coupon_enddate'] = date("Y-m-d H:i:s", strtotime($data['coupon_enddate']));
+        $params = $request->post();
+        $data = $this->inputFilter($params);
+        $data['coupon_id'] = "CU" . str_pad(SysSerial::getSerial(), 6, '0') . random_string(6, 'up');
+        $data['coupon_validdate_begin'] = date("Y-m-d H:i:s", strtotime($data['coupon_validdate_begin']));
+        $data['coupon_validdate_end'] = date("Y-m-d H:i:s", strtotime($data['coupon_validdate_end']));
+        $couponJson = [];
+        if ($params['coupon_use_member'] == 'member' && isset($params['member_list'])) {
+            $couponJson['member']['list'] = $params['member_list'];
+        } else if ($params['coupon_use_member'] == 'condition') {
+            if (isset($params['condition']) && $params['condition'] == 'is_vip') {
+                $couponJson['member']['range'] = 'VIP会员';
+                $couponJson['member']['where'] = urlencode(" `member_is_vip` = 'Y'");
+            } elseif (isset($params['condition']) && $params['condition'] == 'is_employ') {
+                $couponJson['member']['range'] = '公司员工';
+                $couponJson['member']['where'] = urlencode(" `member_classify` = 'EMPLOY'");
+            } elseif (isset($params['condition']) && $params['condition'] == 'is_member') {
+                $couponJson['member']['range'] = '会员';
+                $couponJson['member']['where'] = urlencode(" `member_classify` = 'MEMBER'");
+            }
+        } else if ($params['coupon_use_member'] == 'all') {
+            $couponJson['member']['range'] = '不限';
+            $couponJson['member']['where'] = urlencode(" 1");
+        }
+
+        if (!empty($params['premises_range']) && $params['premises_range'] == 'all') {
+            $couponJson['premises_range'] = '所有门店可用';
+        } elseif (!empty($params['premises_range']) && $params['premises_range'] == 'part') {
+            $couponJson['premises'] = $params['premises'];
+            $couponJson['premises_range'] = '部分门店可用';
+        }
+
+        $data['coupon_json'] = json_encode($couponJson, JSON_UNESCAPED_UNICODE);
 
         return $data;
     }
 
+    /**
+     * @Desc 修改优惠券
+     * @Author Gorden
+     * @Date 2024/8/14 15:48
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function update(Request $request): Response
+    {
+        if ($this->validate && !$this->validateClass->scene('update')->check($request->post())) {
+            return json_fail($this->validateClass->getError());
+        }
+
+        Db::beginTransaction();
+        try {
+            [$id, $data] = $this->updateInput($request);
+            $this->updateCouponGoods($request->post('goodsContentList'), $id);
+            $this->doUpdate($id, $data);
+            Db::commit();
+
+            return json_success('success');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            return json_fail('数据更新失败');
+        }
+
+    }
+
+    public function updateCouponGoods($goods, $couponId)
+    {
+        try {
+            $couponGoodsIds = CouponGoods::where('join_goods_coupon_id', $couponId)->pluck('join_coupon_goods_id')->toArray();
+            $goodsIds = array_column($goods, 'goods_id');
+            // 新的差集
+            $goodsDiff = array_diff($goodsIds, $couponGoodsIds);
+            // 旧的差集
+            $couponDiff = array_diff($couponGoodsIds, $goodsIds);
+            foreach ($goods as $good) {
+                // 更新两个中都有的
+                if (in_array($good['goods_id'], $couponGoodsIds)) {
+                    CouponGoods::where('join_goods_coupon_id', $couponId)->where('join_coupon_goods_id', $good['goods_id'])->update(['join_coupon_goods_sku_id' => $good['sku_id']]);
+                } elseif (in_array($good['goods_id'], $goodsDiff)) {       // 新加的
+                    CouponGoods::insert([
+                        'join_goods_coupon_id' => $couponId,
+                        'join_coupon_goods_id' => $good['goods_id'],
+                        'join_coupon_goods_sku_id' => $good['sku_id'],
+                        'coupon_goods_json' => '[]',
+                        'coupon_goods_extend_json' => '[]',
+                        'coupon_goods_addtimes' => time()
+                    ]);
+                }
+            }
+            if (!empty($couponDiff)) {   // 去掉的
+                foreach ($couponDiff as $item) {
+                    CouponGoods::where('join_goods_coupon_id', $couponId)->where('join_coupon_goods_id', $item)->delete();
+                }
+            }
+        } catch (\Exception $e) {
+            throw new BusinessException('关联产品更新失败');
+        }
+    }
+
     protected function updateInput(Request $request): array
     {
+        $params = $request->post();
         $primary_key = $this->model->getKeyName();
         $id = $request->post($primary_key);
-        $data = $this->inputFilter($request->post());
-        $data['coupon_begindate'] = date("Y-m-d H:i:s", strtotime($data['coupon_begindate']));
-        $data['coupon_enddate'] = date("Y-m-d H:i:s", strtotime($data['coupon_enddate']));
+        $data = $this->inputFilter($params);
+        $data['coupon_validdate_begin'] = date("Y-m-d H:i:s", strtotime($data['coupon_validdate_begin']));
+        $data['coupon_validdate_end'] = date("Y-m-d H:i:s", strtotime($data['coupon_validdate_end']));
         $model = $this->model->find($id);
         if (!$model) {
             throw new BusinessException('记录不存在', 2);
         }
+        $couponJson = [];
+        if (!empty($model->coupon_json)) {
+            $couponJson = json_decode($model->coupon_json, true);
+        }
+        if ($params['coupon_use_member'] == 'member' && isset($params['member_list'])) {
+            $couponJson['member']['list'] = $params['member_list'];
+            if (isset($couponJson['member']['range'])) {
+                $couponJson['member']['range'] = '';
+            }
+            if (isset($couponJson['member']['where'])) {
+                $couponJson['member']['where'] = '';
+            }
+        } else if ($params['coupon_use_member'] == 'condition') {
+            if (isset($params['condition']) && $params['condition'] == 'is_vip') {
+                $couponJson['member']['range'] = 'VIP会员';
+                $couponJson['member']['where'] = urlencode(" `member_is_vip` = 'Y'");
+            } elseif (isset($params['condition']) && $params['condition'] == 'is_employ') {
+                $couponJson['member']['range'] = '公司员工';
+                $couponJson['member']['where'] = urlencode(" `member_classify` = 'EMPLOY'");
+            } elseif (isset($params['condition']) && $params['condition'] == 'is_member') {
+                $couponJson['member']['range'] = '会员';
+                $couponJson['member']['where'] = urlencode(" `member_classify` = 'MEMBER'");
+            }
+            if (isset($couponJson['member']['list'])) {
+                $couponJson['member']['list'] = [];
+            }
+        } else if ($params['coupon_use_member'] == 'all') {
+            $couponJson['member']['range'] = '不限';
+            $couponJson['member']['where'] = urlencode(" 1");
+
+            if (isset($couponJson['member']['list'])) {
+                $couponJson['member']['list'] = [];
+            }
+        }
+
+        if (!empty($params['premises_range']) && $params['premises_range'] == 'all') {
+            $couponJson['premises_range'] = '所有门店可用';
+            unset($couponJson['premises']);
+        } elseif (!empty($params['premises_range']) && $params['premises_range'] == 'part') {
+            $couponJson['premises'] = $params['premises'];
+            $couponJson['premises_range'] = '部分门店可用';
+        }
+
+        $data['coupon_json'] = json_encode($couponJson, JSON_UNESCAPED_UNICODE);
+
         unset($data[$primary_key]);
         return [$id, $data];
     }
+
+    /**
+     * 优惠券详情
+     */
+    public function info(Request $request): Response
+    {
+        $couponId = $request->get('coupon_id', '');
+        if (!$couponId) {
+            return json_fail('参数异常');
+        }
+        $coupon = Coupon::where('coupon_id', $couponId)->first();
+        if (!$coupon) {
+            return json_fail('数据异常');
+        }
+        // 拼选择的商品
+        $couponGoods = CouponGoods::with([
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_id as id', 'goods_name as name', 'join_goods_category_id as pid', 'goods_classify', 'goods_sales_price', 'goods_cover');
+            },
+            'skus',
+            'sku'
+        ])->where('join_goods_coupon_id', $couponId)
+            ->get()
+            ->toArray();
+        $goodsIds = [];
+        $goodsContent = [];
+        foreach ($couponGoods as $couponGood) {
+            $goodsIds[] = $couponGood['join_coupon_goods_id'];
+            $content = [
+                'goods_id' => $couponGood['join_coupon_goods_id'],
+                'sku_id' => $couponGood['join_coupon_goods_sku_id'],
+            ];
+            if (isset($couponGood['goods'])) {
+                $content['goods_name'] = $couponGood['goods']['name'];
+                $content['goods_classify'] = $couponGood['goods']['goods_classify'];
+                $content['goods_cover'] = getenv('STORAGE_DOMAIN').$couponGood['goods']['goods_cover'];
+            }
+            if (isset($couponGood['sku']) && isset($couponGood['sku']['goods_sku_specs_json'])) {
+//                $skuSpecsJson = json_decode($couponGood['sku']['goods_sku_specs_json'], true);
+//                $skuName = '';
+//                foreach ($skuSpecsJson as $item) {
+//                    if (is_array($item)) {
+//                        $item = implode('', $item);
+//                    }
+//                    $skuName .= $item . ',';
+//                }
+//                $content['sku_name'] = rtrim($skuName, ',');
+                $content['goods_sales_price'] = $couponGood['sku']['goods_sku_sales_price'];
+            }
+            if (isset($couponGood['skus'])) {
+                foreach ($couponGood['skus'] as $key => $skus) {
+                    if (!empty($skus['goods_sku_specs_json'])) {
+                        $skuSpecsJson = json_decode($skus['goods_sku_specs_json'], true);
+                        $skuName = '';
+                        foreach ($skuSpecsJson as $item) {
+                            if (is_array($item)) {
+                                $item = implode('', $item);
+                            }
+                            $skuName .= $item . ',';
+                        }
+                        $couponGood['skus'][$key]['sku_name'] = rtrim($skuName, ',');
+                    }
+                }
+                $content['skus'] = $couponGood['skus'];
+            }
+            $goodsContent[] = $content;
+        }
+        // 选中的会员
+        $memberLists = [];
+        // 可用门店
+        $premises = [];
+        if (!empty($coupon->coupon_json)) {
+            $couponJson = json_decode($coupon->coupon_json, true);
+            if (isset($couponJson['member']) && isset($couponJson['member']['list']) && !empty($couponJson['member']['list'])) {
+                $res = Db::table('member')
+                    ->leftjoin('member_cert', 'member.member_id', '=', 'member_cert.join_cert_member_id')
+                    ->leftjoin('member_info', 'member.member_id', '=', 'member_info.join_info_member_id')
+                    ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name', 'member_info.member_info_nickname')
+                    ->where('member_status', 'ACTIVED')
+                    ->whereIn('member_id', $couponJson['member']['list'])
+                    ->get();
+                $memberLists = [];
+                foreach ($res as $item) {
+                    $name = '';
+                    if (!empty($item->member_cert_name)) {
+                        $name = $item->member_cert_name;
+                    } else if (!empty($item->member_info_nickname)) {
+                        $name = $item->member_info_nickname;
+                    }
+                    $value = !empty($name) ? $name . '-' : '';
+                    if ($item->member_mobile != '0000') {
+                        $value .= $item->member_mobile;
+                    }
+                    if (empty($value)) {
+                        $value = $item->member_mobile;
+                    }
+                    $value = rtrim($value, '-');
+                    $memberLists[] = [
+                        'key' => $item->member_id,
+                        'value' => $value,
+                    ];
+                }
+            }
+            if (isset($couponJson['premises']) && !empty($couponJson['premises'])) {
+                $premises = SysDept::whereIn('dept_id', $couponJson['premises'])
+                    ->select('dept_id', 'dept_name')
+                    ->get()
+                    ->toArray();
+            }
+        }
+
+        $data = [
+            'goods_ids' => $goodsIds,
+            'goods_content' => $goodsContent,
+            'member_lists' => $memberLists,
+            'premises_list' => $premises
+        ];
+
+        return json_success('', $data);
+    }
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     * @throws BusinessException
+     */
+    public function delete(Request $request): Response
+    {
+        $ids = $this->deleteInput($request);
+        Db::beginTransaction();
+        try {
+            // 删除优惠券关联的产品
+            foreach ($ids as $id) {
+                CouponGoods::where('join_goods_coupon_id', $id)->delete();
+            }
+            $this->doDelete($ids);
+            Db::commit();
+            return json_success('success');
+        } catch (\Exception $e) {
+            Db::rollBack();
+            return json_fail('删除失败');
+        }
+    }
 }

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

@@ -6,10 +6,12 @@ use app\admin\service\sys_manage\DeptService;
 use app\admin\validate\sys_manage\DeptValidate;
 use app\controller\Curd;
 use app\model\SysDept;
+use app\model\SysUser;
 use support\Db;
 use support\exception\BusinessException;
 use support\Request;
 use support\Response;
+use Tinywan\Jwt\JwtToken;
 
 class DeptPremisesController extends Curd
 {
@@ -23,13 +25,37 @@ class DeptPremisesController extends Curd
     public function selectList(Request $request)
     {
         $category = $request->get('category','');
+        $type = $request->get('type','');
+
         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')
+
+        $deptId = '';
+        if ($type == 'user'){
+            $user = SysUser::where('user_id',JwtToken::getCurrentId())->first();
+            if (!empty($user->join_user_dept_id)){
+                $restaurant = SysDept::where('dept_id',$user->join_user_dept_id)->where('dept_category','餐厅')->first();
+                
+                if (empty($restaurant)){
+                    $premise = SysDept::where('dept_id',$user->join_user_dept_id)->where('dept_category','营业场所')->first();
+                    if (!empty($premise)){
+                        $restaurant = SysDept::where('dept_super_id',$premise->dept_id)->where('dept_category','餐厅')->first();
+                    }
+                }
+                if (!empty($restaurant)){
+                    $deptId = $restaurant->dept_id;
+                }
+            }
+        }
+
+        $premisses = SysDept::where('dept_category', $category);
+        if (!empty($deptId)){
+            $premisses = $premisses->where('dept_id',$deptId);
+        }
+        $premisses = $premisses->select('dept_id as key', 'dept_name as label','dept_address as address','dept_position as position','dept_extend_json')
             ->get()
             ->toArray();
 
@@ -147,6 +173,41 @@ class DeptPremisesController extends Curd
     {
         $data = $this->inputFilter($request->post());
 
+        $work = $request->post('dept_work', []);
+        $dateWeek = $request->post('dept_week', []);
+        $extendJson = [];
+        if (isset($work[0]) && isset($work[1])) {
+            $start = date('H:i', strtotime($work[0]));
+            $end = date('H:i', strtotime($work[1]));
+            $extendJson['times'] = $start . '~' . $end;
+        } elseif (!isset($work[0]) && isset($extendJson['times'])) {
+            unset($extendJson['times']);
+        }
+
+        if ($dateWeek) {
+            $newDates = [];
+            foreach ($dateWeek as $date) {
+                $key = self::$week[$date];
+                $newDates[$key] = $date;
+            }
+            ksort($newDates);
+
+            $currentDate = current($newDates);
+            $lastDate = end($newDates);
+
+            $weekStr = '';
+            if (self::$week[$lastDate] - self::$week[$currentDate] + 1 > count($newDates)) {
+                $weekStr = implode(',', $newDates);
+            } else if (self::$week[$lastDate] - self::$week[$currentDate] + 1 == count($newDates)) {
+                $weekStr = $currentDate . '至' . $lastDate;
+            }
+
+            $extendJson['weeks'] = $weekStr;
+            $extendJson['week'] = $dateWeek;
+        }
+
+        $data['dept_extend_json'] = json_encode($extendJson);
+
         return $data;
     }
 

+ 1 - 0
app/admin/controller/medical/DeptController.php

@@ -37,6 +37,7 @@ class DeptController extends Curd
         // if (!isset($where['dept_category'])) {
         //     $where['dept_category'] = '医护科室';
         // }
+        $where['dept_category'] = ['<>','桌台'];
         $limit = 1000;
         $format = 'tree';
         $order = $request->get('order', 'desc');

+ 36 - 11
app/admin/controller/member/MemberController.php

@@ -4,6 +4,7 @@ namespace app\admin\controller\member;
 
 use app\admin\service\member\MemberService;
 use app\admin\validate\member\MemberValidate;
+use app\model\CouponDetail;
 use app\model\Family;
 use app\model\FamilyMember;
 use app\model\Member;
@@ -27,8 +28,10 @@ class MemberController
         $res = Db::table('member')
             ->leftjoin('member_cert', 'member.member_id', '=', 'member_cert.join_cert_member_id')
             ->leftjoin('member_info', 'member.member_id', '=', 'member_info.join_info_member_id')
-            ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name','member_info.member_info_nickname')
+            ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name', 'member_info.member_info_nickname')
             ->where('member.member_is_owner', $isOwner)
+            ->where('member_status', 'ACTIVED')
+            // ->where('member_mobile','<>','0000')
             ->where(function ($query) use ($keywords) {
                 $query->where('member.member_mobile', 'like', '%' . $keywords . '%')
                     ->orWhere("member.member_id", 'like', '%' . $keywords . '%')
@@ -39,21 +42,30 @@ class MemberController
         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)){
+            if (!empty($item->member_cert_name)) {
                 $name = $item->member_cert_name;
-            }else if(!empty($item->member_info_nickname)){
+            } else if (!empty($item->member_info_nickname)) {
                 $name = $item->member_info_nickname;
             }
+            $value = !empty($name) ? $name . '-' : '';
+            if ($item->member_mobile != '0000') {
+                $value .= $item->member_mobile;
+            }
+            if (empty($value)) {
+                $value = $item->member_mobile;
+            }
+            $value = rtrim($value, '-');
             $data[] = [
                 'key' => $item->member_id,
-                'value' => !empty($name) ? $name . '-' . $item->member_mobile : $item->member_mobile,
+                'value' => $value,
             ];
         }
 
         return json_success('', $data);
     }
 
-    public function exportMember(Request $request){
+    public function exportMember(Request $request)
+    {
 
         return MemberService::exportMember($request);
     }
@@ -111,9 +123,9 @@ class MemberController
 
     public function selectMemberAllQuota(Request $request)
     {
-        $memberId = $request->get('member_id','');
+        $memberId = $request->get('member_id', '');
         $orderId = $request->get('order_id', '');
-        $goodsId = $request->get('goods_id','');
+        $goodsId = $request->get('goods_id', '');
         $person = $request->get('person', '');
         $selectType = $request->get('select_type', 'ALL');
 
@@ -187,9 +199,9 @@ class MemberController
      */
     public function selectMemberAllQuotaByAppointment(Request $request)
     {
-        $memberId = $request->get('member_id','');
+        $memberId = $request->get('member_id', '');
         $orderId = $request->get('order_id', '');
-        $goodsId = $request->get('goods_id','');
+        $goodsId = $request->get('goods_id', '');
         $person = $request->get('person', '');
         $selectType = $request->get('select_type', 'ALL');
 
@@ -227,7 +239,7 @@ class MemberController
             ->groupBy('join_quota_member_id', 'join_member_rule_added_component_id')
             ->get()
             ->toArray();
-            
+
         $data['quota'] = [];
         foreach ($quotas as $quota) {
             $usedNum = MemberQuota::where('join_quota_member_id', $quota['join_quota_member_id'])
@@ -333,7 +345,6 @@ class MemberController
 
     public function list(Request $request)
     {
-
         return MemberService::list($request);
     }
 
@@ -445,4 +456,18 @@ class MemberController
     {
         return MemberService::deleteDevice($request);
     }
+
+    public function coupon(Request $request)
+    {
+        $memberId = $request->get('member_id','');
+        $active = $request->get('active','');
+
+        $coupons = CouponDetail::where('join_coupon_detail_member_id',$memberId)
+            ->leftJoin('coupon','coupon.coupon_id','=','coupon_detail.join_detail_coupon_id')
+            ->groupBy('join_detail_coupon_id')
+            ->get()
+            ->toArray();
+
+        dump($coupons);
+    }
 }

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

@@ -44,7 +44,7 @@ class RuleAddedComponentController extends Curd
                     $goodsInfo = [];
                     if (isset($item2['goods_id'])) {
                         $goodsInfo['goods_name'] = $item2['goods_name'];
-                        $sku = GoodsSku::where('goods_sku_id', $item2['goods_sku_id'])->select('goods_sku_id', 'goods_sku_sales_price', 'goods_sku_specs_json')->first();
+                        $sku = GoodsSku::where('goods_sku_id', $item2['goods_sku_id'])->where('goods_sku_status','ON')->select('goods_sku_id', 'goods_sku_sales_price', 'goods_sku_specs_json')->first();
                         if (!empty($sku->goods_sku_specs_json)) {
                             $specsJson = json_decode($sku->goods_sku_specs_json, true);
                             $skuTitle = '';

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

@@ -66,7 +66,7 @@ class RuleAddedController extends Curd
                     if (isset($item['goods_id'])) {
                         $goodsInfo['goods_name'] = $item['goods_name'];
 //                        $goods = Goods::where('goods_id',$item['goods_id'])->select('goods_name');
-                        $sku = GoodsSku::where('goods_sku_id', $item['goods_sku_id'])->select('goods_sku_specs_json')->first();
+                        $sku = GoodsSku::where('goods_sku_id', $item['goods_sku_id'])->where('goods_sku_status','ON')->select('goods_sku_specs_json')->first();
                         if (!empty($sku->goods_sku_specs_json)) {
                             $specsJson = json_decode($sku->goods_sku_specs_json, true);
                             $skuTitle = '';

+ 35 - 0
app/admin/controller/notify/OrderPayController.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace app\admin\controller\notify;
+
+use support\Log;
+use support\Request;
+use Yansongda\Pay\Pay;
+
+class OrderPayController
+{
+    public function wxpay(Request $request)
+    {
+        Log::channel('pay')->info("WXPAY_NOTIFY", $request->all());
+        try {
+            $config = config('payment.wxpay');
+            $config['notify_url'] = getenv('NOTIFY_DOMAIN_ADMIN').'/notify/orderPay/wxpay';
+            Pay::wechat($config)->success()->send();
+        }catch (\Exception $e){
+            Log::channel('pay')->info("WXPAY_NOTIFY_FAIL", ['msg'=>"回复失败"]);
+        }
+
+    }
+
+    public function alipay(Request $request)
+    {
+        Log::channel('pay')->info("ALIPAY_NOTIFY", $request->all());
+        try {
+            $config = config('payment.alipay');
+            $config['notify_url'] = getenv('NOTIFY_DOMAIN_ADMIN').'/notify/orderPay/alipay';
+            Pay::alipay($config)->success()->send();
+        }catch (\Exception $e){
+            Log::channel('pay')->info("ALIPAY_NOTIFY_FAIL", ['msg'=>"回复失败"]);
+        }
+    }
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 1012 - 121
app/admin/controller/order/WholeController.php


+ 5 - 5
app/admin/controller/sms/SmsController.php

@@ -51,7 +51,7 @@ class SmsController
             Redis::expire($key, 600);
 
             Sms::app()->send($mobile, [
-                'template' => 'SMS_240865706',
+                'template' => 'SMS_469030007',
                 'data' => [
                     'code' => $code
                 ],
@@ -96,7 +96,7 @@ class SmsController
             Redis::expire($key, 600);
 
             Sms::app()->send($mobile, [
-                'template' => 'SMS_240865706',
+                'template' => 'SMS_469030007',
                 'data' => [
                     'code' => $code
                 ],
@@ -126,7 +126,7 @@ class SmsController
             Redis::expire($key, 600);
 
             Sms::app()->send($mobile, [
-                'template' => 'SMS_240865706',
+                'template' => 'SMS_469030007',
                 'data' => [
                     'code' => $code
                 ],
@@ -155,7 +155,7 @@ class SmsController
             Redis::expire($key, 600);
 
             Sms::app()->send($mobile, [
-                'template' => 'SMS_240865706',
+                'template' => 'SMS_469030007',
                 'data' => [
                     'code' => $code
                 ],
@@ -187,7 +187,7 @@ class SmsController
             Redis::expire($key, 600);
 
             Sms::app()->send($mobile, [
-                'template' => 'SMS_240865706',
+                'template' => 'SMS_469030007',
                 'data' => [
                     'code' => $code
                 ],

+ 143 - 0
app/admin/controller/sys_manage/RestaurantController.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\sys_manage;
 
 use app\controller\Curd;
+use app\model\Supplier;
 use app\model\SysDept;
 use app\model\SysUser;
 use support\Db;
@@ -70,6 +71,27 @@ class RestaurantController extends Curd{
         }
         return $model;
     }
+    
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            if (!empty($item->dept_extend_json)) {
+                $extendJson = json_decode($item->dept_extend_json, true);
+                $item->dept_week = $extendJson['week'] ?? [];
+                $item->dept_work = [];
+                $deptWork = [];
+                if (!empty($extendJson['times'])) {
+                    $times = explode('~', $extendJson['times']);
+                    $deptWork[] = date('Y-m-d H:i:s', strtotime(date('Y-m-d ') . $times[0]));
+                    $deptWork[] = date('Y-m-d H:i:s', strtotime(date('Y-m-d ') . $times[1]));
+                }
+
+                $item->dept_work = $deptWork;
+            }
+        }
+
+        return $items;
+    }
 
     public function insert(Request $request): Response
     {
@@ -100,6 +122,17 @@ class RestaurantController extends Curd{
             if (!SysDept::where('dept_id', $deptId)->update(['dept_super_path' => $path])) {
                 throw new BusinessException('创建餐厅失败');
             }
+            // 新餐厅到供应商里
+            $supplierData = [
+                'join_supplier_category_id'=>55,
+                'join_supplier_dept_id'=>$deptId,
+                'supplier_status'=>'ACTIVED',
+                'supplier_category'=>'DEPT',
+                'supplier_name' => $data['dept_name'],
+                'supplier_addtimes'=>time()
+            ];
+            Supplier::insert($supplierData);
+
             Db::commit();
         } catch (BusinessException $customException) {
             Db::rollBack();
@@ -111,6 +144,49 @@ class RestaurantController extends Curd{
         }
         return json_success('success');
     }
+    
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+
+        $work = $request->post('dept_work', []);
+        $dateWeek = $request->post('dept_week', []);
+        $extendJson = [];
+        if (isset($work[0]) && isset($work[1])) {
+            $start = date('H:i', strtotime($work[0]));
+            $end = date('H:i', strtotime($work[1]));
+            $extendJson['times'] = $start . '~' . $end;
+        } elseif (!isset($work[0]) && isset($extendJson['times'])) {
+            unset($extendJson['times']);
+        }
+
+        if ($dateWeek) {
+            $newDates = [];
+            foreach ($dateWeek as $date) {
+                $key = self::$week[$date];
+                $newDates[$key] = $date;
+            }
+            ksort($newDates);
+
+            $currentDate = current($newDates);
+            $lastDate = end($newDates);
+
+            $weekStr = '';
+            if (self::$week[$lastDate] - self::$week[$currentDate] + 1 > count($newDates)) {
+                $weekStr = implode(',', $newDates);
+            } else if (self::$week[$lastDate] - self::$week[$currentDate] + 1 == count($newDates)) {
+                $weekStr = $currentDate . '至' . $lastDate;
+            }
+
+            $extendJson['weeks'] = $weekStr;
+            $extendJson['week'] = $dateWeek;
+        }
+
+        $data['dept_extend_json'] = json_encode($extendJson);
+
+        return $data;
+    }
+
 
     /**
      * 更新
@@ -142,6 +218,73 @@ class RestaurantController extends Curd{
 
         return json_success('success');
     }
+    
+    /**
+     * 更新前置方法
+     * @param Request $request
+     * @return array
+     * @throws BusinessException
+     */
+    protected function updateInput(Request $request): array
+    {
+        $work = $request->post('dept_work', []);
+        $dateWeek = $request->post('dept_week', []);
+        $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);
+        }
+        $extendJson = [];
+        if (!empty($model->dept_extend_json)) {
+            $extendJson = json_decode($model->dept_extend_json, true);
+        }
+        if (isset($work[0]) && isset($work[1])) {
+            $start = date('H:i', strtotime($work[0]));
+            $end = date('H:i', strtotime($work[1]));
+            $extendJson['times'] = $start . '~' . $end;
+        } elseif (!isset($work[0]) && isset($extendJson['times'])) {
+            unset($extendJson['times']);
+        }
+
+        if ($dateWeek) {
+            $newDates = [];
+            foreach ($dateWeek as $date) {
+                $key = self::$week[$date];
+                $newDates[$key] = $date;
+            }
+            ksort($newDates);
+
+            $currentDate = current($newDates);
+            $lastDate = end($newDates);
+
+            $weekStr = '';
+            if (self::$week[$lastDate] - self::$week[$currentDate] + 1 > count($newDates)) {
+                $weekStr = implode(',', $newDates);
+            } else if (self::$week[$lastDate] - self::$week[$currentDate] + 1 == count($newDates)) {
+                $weekStr = $currentDate . '至' . $lastDate;
+            }
+
+            $extendJson['weeks'] = $weekStr;
+            $extendJson['week'] = $dateWeek;
+        }
+
+        $data['dept_extend_json'] = json_encode($extendJson);
+
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+
+    public static $week = [
+        '周一' => 1,
+        '周二' => 2,
+        '周三' => 3,
+        '周四' => 4,
+        '周五' => 5,
+        '周六' => 6,
+        '周日' => 7,
+    ];
 
     /**
      * 场所名获取餐厅打印机

+ 2 - 2
app/admin/controller/sys_manage/RestaurantTableController.php

@@ -356,13 +356,13 @@ class RestaurantTableController extends Curd
                 $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', '桌台')->orderBy('dept_status','ASC')->get()->toArray();
 
             foreach ($tables as $table) {
                 $tableList[] = [
                     'key' => $table['dept_id'],
                     'label' => $table['dept_name'],
-                    'disabled' => $table['dept_status'] == 'ACTIVED' ? false : true
+                    'disabled' => $table['dept_status'] == 'ACTIVED' ? false : true,
                 ];
             }
 

+ 205 - 73
app/admin/service/goods/GoodsService.php

@@ -4,6 +4,7 @@ namespace app\admin\service\goods;
 
 use app\common\Tree;
 use app\model\Appointment;
+use app\model\Coupon;
 use app\model\Goods;
 use app\model\GoodsComponent;
 use app\model\GoodsDetail;
@@ -11,6 +12,7 @@ use app\model\GoodsLabel;
 use app\model\GoodsRunning;
 use app\model\GoodsSku;
 use app\model\OrderSheet;
+use app\model\Supplier;
 use app\model\SysCategory;
 use app\model\SysDept;
 use app\model\SysSerial;
@@ -153,7 +155,9 @@ 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','');
+        $goodsSupplierId = $request->get('join_goods_supplier_id', null);
+        $goodsStatus = $request->get('goods_status', null);
+        $type = $request->get('type', '');
         if ($categoryId != null) {
             $categoryPath = SysCategory::where('category_id', $categoryId)->value('category_super_path');
             $categoryPath .= '#' . $categoryId . '#';
@@ -179,7 +183,7 @@ class GoodsService
             'user' => function ($query) {
                 $query->select('user_id', 'user_name');
             }
-        ])->leftJoin('goods_running','goods_running.join_running_goods_id','=','goods.goods_id')
+        ])->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) {
@@ -197,10 +201,14 @@ 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);
+            })->when(!empty($type), function ($query) use ($type) {
+                if ($type == 'storageWarning') {
+                    $query->where('goods_running.goods_running_storage', '<=', 2);
                 }
+            })->when(!empty($goodsSupplierId), function ($query) use ($goodsSupplierId) {
+                $query->where('join_goods_supplier_id', $goodsSupplierId);
+            })->when(!empty($goodsStatus), function ($query) use ($goodsStatus) {
+                $query->where('goods_status', $goodsStatus);
             })
             ->orderBy('goods_sort', 'DESC')
             ->orderBy('goods_addtimes', 'DESC')
@@ -208,26 +216,30 @@ class GoodsService
             ->get()
             ->toArray();
 
-        $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 . '%');
-            });
-        })->when($categoryId != null, function ($query) use ($categoryId) {
-            $query->whereIn('join_goods_category_id', $categoryId);
-        })->when($goodsCategory != null, function ($query) use ($goodsCategory) {
-            $query->where('goods_category', $goodsCategory);
-        })->when($classify != '', function ($query) use ($classify, $categoryId) {
-            if ($classify == 'GOODS' && empty($categoryId)) {
-                $query->whereIn('join_goods_category_id', ['6', '7', '8', '9', '10', '11', '12', '30']);
-            } 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);
+        $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 . '%');
+                });
+            })->when($categoryId != null, function ($query) use ($categoryId) {
+                $query->whereIn('join_goods_category_id', $categoryId);
+            })->when($goodsCategory != null, function ($query) use ($goodsCategory) {
+                $query->where('goods_category', $goodsCategory);
+            })->when($classify != '', function ($query) use ($classify, $categoryId) {
+                if ($classify == 'GOODS' && empty($categoryId)) {
+                    $query->whereIn('join_goods_category_id', ['6', '7', '8', '9', '10', '11', '12', '30']);
+                } 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);
                 }
+            })->when(!empty($goodsSupplierId), function ($query) use ($goodsSupplierId) {
+                $query->where('join_goods_supplier_id', $goodsSupplierId);
+            })->when(!empty($goodsStatus), function ($query) use ($goodsStatus) {
+                $query->where('goods_status', $goodsStatus);
             })
             ->count();
 
@@ -516,58 +528,78 @@ class GoodsService
 
     public static function selectCascaderList(Request $request)
     {
-        $categoryIds = $request->get('category_id','');
-        $categorySuperId = $request->get('category_super_id','');
-        $joinGoodsCategoryId = $request->get('join_goods_category_id','');
-        if (!$categoryIds && !$categorySuperId && !$joinGoodsCategoryId){
+        $categoryIds = $request->get('category_id', '');
+        $categorySuperId = $request->get('category_super_id', '');
+        $joinGoodsCategoryId = $request->get('join_goods_category_id', '');
+        $type = $request->get('type', '');
+        if (!$categoryIds && !$categorySuperId && !$joinGoodsCategoryId) {
             return json_fail('参数异常');
         }
         $data = [];
         $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);
+        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);
         }
 
-        foreach ($categorys as $category){
+        foreach ($categorys as $category) {
             // if(empty($category['category_super_path'])){
-                $category['category_super_path'] = '#'.$category['id'].'#';
+            $category['category_super_path'] = '#' . $category['id'] . '#';
             // }
-            $subCategory = SysCategory::where('category_super_path','like','%'.$category['category_super_path'].'%')
-                ->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')
+            $subCategory = SysCategory::where('category_super_path', 'like', '%' . $category['category_super_path'] . '%')
+                ->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,$subCategory);
+            $data = array_merge($data, $subCategory);
         }
-        if (empty($data) && !empty($joinGoodsCategoryId)){
+        if (empty($data) && !empty($joinGoodsCategoryId)) {
             $goodsCategoryIds = $joinGoodsCategoryId;
-        }else{
-            $goodsCategoryIds = array_column($data,'id');
+        } else {
+            $goodsCategoryIds = array_column($data, 'id');
         }
         $goods = Goods::with('sku')
-            ->whereIn('join_goods_category_id',$goodsCategoryIds)
-            ->where('goods_status','ON')
-            ->select('goods_id','goods_id as id','goods_name as name','join_goods_category_id as pid','goods_attribute_json','goods_classify')
-            ->orderBy('goods_sort','DESC')
-            ->orderBy('goods_addtimes','DESC')
+            ->leftJoin('goods_running', 'goods_running.join_running_goods_id', '=', 'goods.goods_id')
+            ->where('goods_running.goods_running_storage', '>', 0)
+            ->whereIn('join_goods_category_id', $goodsCategoryIds)
+            ->where('goods_status', 'ON');
+
+        if ($type == 'dishes') {
+            $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();
+            $supplier = Supplier::where('join_supplier_dept_id', $restaurant->dept_id)->first();
+            if ($supplier) {
+                $goods = $goods->where('join_goods_supplier_id', $supplier->supplier_id);
+            }
+        }
+
+
+        $goods = $goods->select('goods_id', 'goods_id as id', 'goods_name as name', 'join_goods_category_id as pid', 'goods_attribute_json', 'goods_classify', 'goods_sales_price', 'goods_cover', 'goods_running.goods_running_storage')
+            ->orderBy('goods_sort', 'DESC')
+            ->orderBy('goods_addtimes', 'DESC')
             ->get()
             ->toArray();
         foreach ($goods as &$good) {
+            $good['goods_cover'] = getenv('STORAGE_DOMAIN') . $good['goods_cover'];
+            $good['goods_running_storage'] = intval($good['goods_running_storage']);
+            $good['nbr'] = 0;
             if (!empty($good['sku'])) {
                 foreach ($good['sku'] as $key => $sku) {
                     if (!empty($sku['goods_sku_specs_json'])) {
@@ -575,14 +607,14 @@ class GoodsService
 
                         $skuName = '';
                         foreach ($good['sku'][$key]['goods_sku_specs_json'] as $specsKey => $skuSpecs) {
-                            $keyStr = ($specsKey  == '规格') ? '' : ($specsKey.':');
+                            $keyStr = ($specsKey == '规格') ? '' : ($specsKey . ':');
                             if (is_array($skuSpecs)) {
-                                $skuName = $skuName  .$keyStr . ' ' . implode(' ', $skuSpecs) . '; ';
+                                $skuName = $skuName . $keyStr . ' ' . implode(' ', $skuSpecs) . '; ';
                             } else {
-                                $skuName = $skuName .$keyStr . ' ' . $skuSpecs . '; ';
+                                $skuName = $skuName . $keyStr . ' ' . $skuSpecs . '; ';
                             }
                         }
-                        $good['sku'][$key]['sku_name'] = rtrim($skuName,'; ');
+                        $good['sku'][$key]['sku_name'] = rtrim($skuName, '; ');
                     }
                 }
             } else {
@@ -602,11 +634,55 @@ class GoodsService
             }
         }
 
-        $data = array_merge($data,$goods);
-        
+        $data = array_merge($data, $goods);
         $tree = new Tree($data);
+        $cascaderData = $tree->getTree();
+
+        foreach ($cascaderData as $key1 => $cascader1) {
+            if (isset($cascader1['children'])) {
+                foreach ($cascader1['children'] as $key2 => $cascader2) {
+                    if (isset($cascader2['children'])) {
+                        foreach ($cascader2['children'] as $key3 => $cascader3) {
+                            if (isset($cascader3['children'])) {
+                                foreach ($cascader3['children'] as $key4 => $cascader4) {
+                                    if (!isset($cascader4['goods_id'])) {
+                                        unset($cascaderData[$key1]['children'][$key2]['children'][$key3]['children'][$key4]);
+                                    }
+                                }
+                            } else if (!isset($cascader3['goods_id'])) {
+                                unset($cascaderData[$key1]['children'][$key2]['children'][$key3]);
+                            }
+                            if (isset($cascader3['children']) && count($cascaderData[$key1]['children'][$key2]['children']) == 0) {
+                                unset($cascaderData[$key1]['children'][$key2]);
+                            }
+                            if (isset($cascader3['children']) && count($cascaderData[$key1]['children'][$key2]['children'][$key3]['children']) > 0) {
+                                $cascaderData[$key1]['children'][$key2]['children'][$key3]['children'] = array_values($cascaderData[$key1]['children'][$key2]['children'][$key3]['children']);
+                            }
+                        }
+                    } else if (!isset($cascader2['goods_id'])) {
+                        unset($cascaderData[$key1]['children'][$key2]);
+                    }
+                    if (isset($cascader2['children']) && count($cascaderData[$key1]['children'][$key2]['children']) == 0) {
+                        unset($cascaderData[$key1]['children'][$key2]);
+                    }
+                    if (isset($cascader2['children']) && isset($cascaderData[$key1]['children'][$key2]) && count($cascaderData[$key1]['children'][$key2]['children']) > 0) {
+                        $cascaderData[$key1]['children'][$key2]['children'] = array_values($cascaderData[$key1]['children'][$key2]['children']);
+                    }
+                }
+            } else if (!isset($cascader1['goods_id'])) {
+                unset($cascaderData[$key1]);
+            }
+            if (isset($cascader1['children']) && count($cascaderData[$key1]['children']) == 0) {
+
+                unset($cascaderData[$key1]);
+            }
+            if (isset($cascader1['children']) && isset($cascaderData[$key1]) && count($cascaderData[$key1]['children']) > 0) {
+                $cascaderData[$key1]['children'] = array_values($cascaderData[$key1]['children']);
+            }
+        }
+        $cascaderData = array_values($cascaderData);
 
-        return json_success('success', $tree->getTree());
+        return json_success('success', $cascaderData);
     }
 
     /**
@@ -664,7 +740,7 @@ class GoodsService
                 $running = [];
             }
             // Sku表
-            $skus = GoodsSku::where('join_sku_goods_id', $goodsId)->get();
+            $skus = GoodsSku::where('join_sku_goods_id', $goodsId)->where('goods_sku_status','ON')->get();
             if (!empty($skus)) {
                 $skus = $skus->toArray();
                 $submitList = [];
@@ -700,8 +776,17 @@ class GoodsService
                 $skus = [];
             }
 
+            // 供应商表
+            $supplier = [];
+            if (isset($main['join_goods_supplier_id']) && !empty($main['join_goods_supplier_id'])) {
+                $supplierModel = Supplier::where('supplier_id', $main['join_goods_supplier_id'])->select('supplier_id', 'supplier_name')->first();
+                if (!empty($supplierModel)) {
+                    $supplier = $supplierModel->toArray();
+                }
+            }
+
             // 合并数据
-            $data = array_merge($main, $detail, $label, $running, ['sku' => $skus]);
+            $data = array_merge($main, $detail, $label, $running, ['sku' => $skus], ['supplier' => $supplier]);
             $data['goods_sku_json_label'] = [];
 
             $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : [];
@@ -748,6 +833,9 @@ class GoodsService
                     $data['goods_service_premises'] = $extendJson['service_premises_id'];
                 }
             }
+            if (!empty($extendJson['coupon'])) {
+                $data['coupon_list'] = $extendJson['coupon'];
+            }
 
             $data['express_json'] = [];
             if (!empty($data['goods_express_json'])) {
@@ -938,7 +1026,7 @@ class GoodsService
                     if (empty($item['join_component_goods_id'])) {
                         continue;
                     }
-                    $skus = GoodsSku::where('join_sku_goods_id', $item['join_component_goods_id'])
+                    $skus = GoodsSku::where('join_sku_goods_id', $item['join_component_goods_id'])->where('goods_sku_status','ON')
                         ->select('goods_sku_id', 'join_sku_goods_id', 'goods_sku_specs_json', 'goods_sku_sales_price')
                         ->get()
                         ->toArray();
@@ -1122,7 +1210,7 @@ class GoodsService
                 $goods->goods_attribute_json = json_encode($attributeJson);
             }
             $goods->save();
-            $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->first();
+            $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->where('goods_sku_status','ON')->first();
             $sku->goods_sku_status = $params['goods_status'];
             $sku->goods_sku_specs_json = json_encode(['规格' => $params['goods_sales_price'] . '元']);
             $sku->goods_sku_market_price = $params['goods_sales_price'];
@@ -1607,6 +1695,28 @@ class GoodsService
                 $attributeJson['time'] = $attributeJsonTime;
                 $model->goods_attribute_json = json_encode($attributeJson);
             }
+            if (!empty($params['coupon_id']) && !empty($params['coupon_nbr'])) {
+                if (!empty($model->goods_attribute_json) && !is_array($model->goods_attribute_json)) {
+                    $attributeJson = json_decode($model->goods_attribute_json, true);
+                } elseif (empty($model->goods_attribute_json)) {
+                    $attributeJson = [];
+                }
+                $coupons = Coupon::whereIn('coupon_id', $params['coupon_id'])
+                    ->select('coupon_id', 'coupon_name')
+                    ->get()
+                    ->toArray();
+                $couponList = [];
+                foreach ($coupons as $coupon) {
+                    if (isset($params['coupon_nbr'][$coupon['coupon_id']])) {
+                        $couponList[$coupon['coupon_id']] = [
+                            'num' => $params['coupon_nbr'][$coupon['coupon_id']],
+                            'name' => $coupon['coupon_name']
+                        ];
+                    }
+                }
+                $attributeJson['coupon'] = $couponList;
+                $model->goods_attribute_json = json_encode($attributeJson, JSON_UNESCAPED_UNICODE);
+            }
             if ($model->save()) {
                 return $model->goods_id;
             }
@@ -1962,6 +2072,27 @@ class GoodsService
                 $attributeJson['month'] = $months;
                 $data['goods_attribute_json'] = json_encode($attributeJson, JSON_UNESCAPED_UNICODE);
             }
+            if (!empty($params['coupon_id']) && !empty($params['coupon_nbr'])) {
+                $attributeJson = [];
+                if (!empty($row->goods_attribute_json)) {
+                    $attributeJson = json_decode($row->goods_attribute_json, true);
+                }
+                $coupons = Coupon::whereIn('coupon_id', $params['coupon_id'])
+                    ->select('coupon_id', 'coupon_name')
+                    ->get()
+                    ->toArray();
+                $couponList = [];
+                foreach ($coupons as $coupon) {
+                    if (isset($params['coupon_nbr'][$coupon['coupon_id']])) {
+                        $couponList[$coupon['coupon_id']] = [
+                            'num' => $params['coupon_nbr'][$coupon['coupon_id']],
+                            'name' => $coupon['coupon_name']
+                        ];
+                    }
+                }
+                $attributeJson['coupon'] = $couponList;
+                $data['goods_attribute_json'] = json_encode($attributeJson, JSON_UNESCAPED_UNICODE);
+            }
             if (!empty($params['goods_premisses'])) {
                 if (!empty($data['goods_attribute_json']) && !is_array($data['goods_attribute_json'])) {
                     if (is_json($data['goods_attribute_json'])) {
@@ -2301,14 +2432,14 @@ class GoodsService
                     $specsJson = json_encode($skuArr);
                     $skuTitle = str_replace('-', ',', $item['sku']) . $params['goods_name'];
                     if ($operation == 'update' && !empty($item['sku_id'])) {
-                        $model = GoodsSku::where('goods_sku_id', $item['sku_id'])->first();
+                        $model = GoodsSku::where('goods_sku_id', $item['sku_id'])->where('goods_sku_status','ON')->first();
                         if (!$model) {
                             $model = new GoodsSku();
                         } else {
                             unset($skusOldIds[$model->goods_sku_id]);
                         }
                     } else {
-                        $model = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->where('goods_sku_title', $skuTitle)->first();
+                        $model = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->where('goods_sku_status','ON')->where('goods_sku_title', $skuTitle)->first();
                         if (!$model) {
                             $model = new GoodsSku();
                         } else {
@@ -2329,7 +2460,8 @@ class GoodsService
                 }
             }
             if ($operation == 'update' && !empty($skusOldIds)) {
-                GoodsSku::whereIn('goods_sku_id', $skusOldIds)->delete();
+                // GoodsSku::whereIn('goods_sku_id', $skusOldIds)->delete();
+                GoodsSku::whereIn('goods_sku_id', $skusOldIds)->update(['goods_sku_status' => 'DISABLED']);
             }
 
             Db::commit();

+ 3 - 1
app/admin/service/member/MemberService.php

@@ -42,6 +42,7 @@ class MemberService
                 }
             ])
             ->where('member_is_owner', 'N')
+            ->where('member_mobile','<>', '0000')
             ->leftJoin('member_info', 'member_info.join_info_member_id', 'member.member_id')
             ->leftJoin('member_cert', 'member_cert.join_cert_member_id', 'member.member_id')
 //            ->leftjoin('member_account', 'member.member_id', '=', 'member_account.join_account_member_id')
@@ -194,6 +195,7 @@ class MemberService
 
         $rows = Member::with('account')
             ->where('member_is_owner', 'N')
+            ->where('member_mobile','<>', '0000')
             ->leftJoin('member_info', 'member_info.join_info_member_id', 'member.member_id')
             ->leftJoin('member_cert', 'member_cert.join_cert_member_id', 'member.member_id')
 //            ->leftjoin('member_account', 'member.member_id', '=', 'member_account.join_account_member_id')
@@ -757,7 +759,7 @@ class MemberService
                 'member_id' => $memberId,
                 'member_is_owner' => $params['is_owner'] ?? 'N',
                 'member_classify' => $params['classify'] ?? '',
-                'member_status' => $params['status'] ?? 'ISABLED',
+                'member_status' => $params['status'] ?? 'PENDING',
                 'member_mobile' => $params['mobile'] ?? '',
                 'member_category' => $params['member_category'] ?? '后台添加',
 //                'member_from' => $params['source'],

+ 2 - 2
app/admin/service/order/AppointmentService.php

@@ -106,7 +106,7 @@ class AppointmentService
                 $row->appointment_times = $applyJson['times'] ?? '';
             }
 
-            $skus = GoodsSku::where('join_sku_goods_id',$row->join_appointment_goods_id)
+            $skus = GoodsSku::where('join_sku_goods_id',$row->join_appointment_goods_id)->where('goods_sku_status','ON')
                 ->where('goods_sku_id',$row->join_appointment_goods_sku_id)
                 ->select('goods_sku_id','goods_sku_specs_json','goods_sku_sales_price')
                 ->get();
@@ -207,7 +207,7 @@ class AppointmentService
             }
             $applyJson = json_decode($appointment->appointment_apply_json,true);
             $goods = Goods::where('goods_id',$appointment->join_appointment_goods_id)->first();
-            $sku = GoodsSku::where('goods_sku_id',$appointment->join_appointment_goods_sku_id)->first();
+            $sku = GoodsSku::where('goods_sku_id',$appointment->join_appointment_goods_sku_id)->where('goods_sku_status','ON')->first();
             $orderId = 'OD' . date('YmdHis') . random_string(6, 'up');
             $groupBy = 'OD' . date('YmdHis') . random_string(6, 'up');
             $order = [

+ 212 - 46
app/admin/service/order/OrderService.php

@@ -11,6 +11,7 @@ use app\model\PayDetail;
 use app\model\SysDept;
 use support\Db;
 use support\exception\BusinessException;
+use support\Log as SupportLog;
 use support\Redis;
 use Yansongda\Pay\Log;
 use Yansongda\Pay\Pay;
@@ -38,7 +39,7 @@ class OrderService
                 Order::where('order_id', $order->order_id)->update([
                     'order_is_complete' => 'Y',
                     'order_status_system' => 'CONFIRM',
-                    'order_status_storage'=> 'DONE'
+                    'order_status_storage' => 'DONE'
                 ]);
                 // 订单详情表
                 OrderSheet::where('join_sheet_order_id', $order->order_id)->update(['order_sheet_status' => 'DONE']);
@@ -70,15 +71,15 @@ class OrderService
             $key = Order::AUTOMATIC_COMPLETE_PREFIX . date('Ymd');
             $orderIds = $redis->smembers($key);
 
-            foreach ($orderIds as $orderId){
-                $order = Order::where('order_id',$orderId)
-                    ->select('order_is_complete','order_category','order_status_system')
+            foreach ($orderIds as $orderId) {
+                $order = Order::where('order_id', $orderId)
+                    ->select('order_is_complete', 'order_category', 'order_status_system')
                     ->first();
-                if ($order && $order->order_is_complete != 'Y' && $order->order_category != 'RETURN' && in_array($order->order_status_system,['RECVING','SIGNED','CONFIRM'])){
+                if ($order && $order->order_is_complete != 'Y' && $order->order_category != 'RETURN' && in_array($order->order_status_system, ['RECVING', 'SIGNED', 'CONFIRM'])) {
                     // 更新主表
-                    Order::where('order_id',$orderId)->update(['order_is_complete'=>'Y','order_status_system'=>'CONFIRM','order_status_storage'=>'DONE']);
+                    Order::where('order_id', $orderId)->update(['order_is_complete' => 'Y', 'order_status_system' => 'CONFIRM', 'order_status_storage' => 'DONE']);
                     // sheet表
-                    OrderSheet::where('join_sheet_order_id',$orderId)->update(['order_sheet_status'=>'DONE']);
+                    OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'DONE']);
                 }
             }
 
@@ -97,8 +98,11 @@ class OrderService
             Db::beginTransaction();
             $timeUnix = strtotime("-30 minutes");
             $orders = Order::where('order_status_system', 'PAYING')
-                ->where('order_category','<>','DISHES')
-                ->where('order_platform','<>','SYSTEM')     // 后台产生的订单不自动取消
+                ->where('order_category', '<>', 'DISHES')     // 点餐不自动取消
+                // ->where('order_platform','<>','SYSTEM')     // 后台产生的订单不自动取消
+                ->where(function ($query) {
+                    $query->where('order_platform', '<>', 'SYSTEM')->orWhereNull('order_platform');
+                })
                 ->where('order_addtimes', '<', $timeUnix)
                 ->get();
             foreach ($orders as $order) {
@@ -109,21 +113,21 @@ class OrderService
                     'order_status_payment' => 'CANCEL'
                 ]);
                 $sheets = OrderSheet::where('join_sheet_order_id', $order->order_id)->get();
-                foreach ($sheets as $sheet){
+                foreach ($sheets as $sheet) {
                     // 还原库存
-                    $goodsSku = GoodsSku::where('goods_sku_id',$sheet->join_sheet_goods_sku_id)->first();
-                    if (!empty($goodsSku) && !empty($goodsSku->goods_sku_storage_json)){
-                        $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json,true);
-                        if (isset($skuStorageJson['storage'])){
+                    $goodsSku = GoodsSku::where('goods_sku_id', $sheet->join_sheet_goods_sku_id)->first();
+                    if (!empty($goodsSku) && !empty($goodsSku->goods_sku_storage_json)) {
+                        $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json, true);
+                        if (isset($skuStorageJson['storage']) && !empty($skuStorageJson['storage'])) {
                             $skuStorageJson['storage'] = $skuStorageJson['storage'] + $sheet->order_sheet_num;
                             $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
                             $goodsSku->save();
                         }
                     }
-                    
 
-                    $goodsRunning = GoodsRunning::where('join_running_goods_id',$sheet->join_sheet_goods_id)->first();
-                    if(!empty($goodsRunning)){
+
+                    $goodsRunning = GoodsRunning::where('join_running_goods_id', $sheet->join_sheet_goods_id)->first();
+                    if (!empty($goodsRunning)) {
                         $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage + $sheet->order_sheet_num;
                         $goodsRunning->goods_running_sale = $goodsRunning->goods_running_sale - $sheet->order_sheet_num;
                         $goodsRunning->save();
@@ -134,19 +138,19 @@ class OrderService
                 OrderSheet::where('join_sheet_order_id', $order->order_id)->update(['order_sheet_status' => 'CANCEL']);
                 // 支付表
                 $payDetail = PayDetail::where('join_pay_order_id', $order->order_groupby)->first();
-                if(!empty($payDetail)){
+                if (!empty($payDetail)) {
                     $payExtendJson = [];
-                    if (!empty($payDetail->pay_extend_json)){
-                        $payExtendJson = json_decode($payDetail->pay_extend_json,true);
+                    if (!empty($payDetail->pay_extend_json)) {
+                        $payExtendJson = json_decode($payDetail->pay_extend_json, true);
                     }
-                    $payExtendJson['cancel_times'] = date('Y-m-d H:i:s'); 
+                    $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();
@@ -168,13 +172,13 @@ class OrderService
 
     public static function generateAppointmentApplyData($params)
     {
-        $member = Member::with('cert','info')
-            ->where('member_id',$params['join_order_member_id'])
+        $member = Member::with('cert', 'info')
+            ->where('member_id', $params['join_order_member_id'])
             ->first();
         $name = '';
-        if (!empty($member) && !empty($member->cert) && !empty($member->cert->member_cert_name)){
+        if (!empty($member) && !empty($member->cert) && !empty($member->cert->member_cert_name)) {
             $name = $member->cert->member_cert_name;
-        }else if (!empty($member) && !empty($member->info) && !empty($member->info->member_info_nickname)){
+        } else if (!empty($member) && !empty($member->info) && !empty($member->info->member_info_nickname)) {
             $name = $member->info->member_info_nickname;
         }
 
@@ -192,46 +196,208 @@ class OrderService
      */
     public static function qrcodePay($params)
     {
+        $log = SupportLog::channel('pay');
+        $log->info("PAY_PARAMS", json_decode(json_encode($params), true));
         $params['order_amount_pay'] = floatval($params['order_amount_pay']);
         $qrcodeNbr = $params['qrcode_nbr'];
-        $prefix = substr($qrcodeNbr,0,2);
+        $prefix = substr($qrcodeNbr, 0, 2);
+        // 模拟数据
+//         $result = [
+//             'return_code'=>'SUCCESS',
+//             'result_code' => 'SUCCESS'
+//         ];
+//        $result=[
+//            'code'=> '10000',
+//            'msg' => 'Success'
+//        ];
+//         return $result;
         // 微信支付
-        if(in_array($prefix,[10,11,12,13,14,15])){
+        if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
             $payData = [
                 'out_trade_no' => $params['orderGroupId'],
-                'body'         => '万悦康养订单',
-                'total_fee'    => $params['order_amount_pay']*100,
-                'auth_code'    => $params['qrcode_nbr'],
+                'body' => '万悦康养订单',
+                'total_fee' => $params['order_amount_pay'] * 100,
+                'auth_code' => $params['qrcode_nbr'],
             ];
-            try{
-                $result = Pay::wechat(config('payment.wxpay'))->pos($payData);
-            }catch(\Exception $e){
-                Log::error("WXPAY",['msg'=>$e->getMessage()]);
+            try {
+                $config = config('payment.wxpay');
+                $config['notify_url'] = getenv('NOTIFY_DOMAIN_ADMIN').'/notify/orderPay/wxpay';
+                Pay::wechat($config)->pos($payData);
+                $result = self::findWxpay($params['orderGroupId'], 0);
+            } catch (\Exception $e) {
+                $log->error("WXPAY", ['msg' => $e->getMessage()]);
                 throw new BusinessException("支付失败");
             }
+            try{
+                $log->info("WXPAY_RETURN", json_decode(json_encode($result), true));
+            }catch (\Exception $e){}
 
-            Log::info("WXPAY_RETURN",json_decode(json_encode($result),true));
 
-        }else if(in_array($prefix,[25,26,27,28,29,30])){
+        } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
             $payData = [
                 'out_trade_no' => $params['orderGroupId'],
                 'total_amount' => $params['order_amount_pay'],
-                'subject'      => '万悦康养订单',
-                'auth_code'    => $params['qrcode_nbr'],
+                'subject' => '万悦康养订单',
+                'auth_code' => $params['qrcode_nbr'],
             ];
-            try{
-                $result = Pay::alipay(config('payment.alipay'))->pos($payData);
-            }catch(\Exception $e){
-                Log::error("ALIPAY",['msg'=>$e->getMessage()]);
+            try {
+                $config = config('payment.alipay');
+                $config['notify_url'] = getenv('NOTIFY_DOMAIN_ADMIN').'/notify/orderPay/alipay';
+                Pay::alipay($config)->pos($payData);
+                $result = self::findAlipay($params['orderGroupId'], 0);
+            } catch (\Exception $e) {
+                $log->error("ALIPAY", ['msg' => $e->getMessage()]);
                 throw new BusinessException("支付失败");
             }
-            
-            Log::info("ALIPAY_RETURN",json_decode(json_encode($result),true));
 
-        }else{
+            try{
+                $log->info("ALIPAY_RETURN", json_decode(json_encode($result), true));
+            }catch (\Exception $e){}
+        } else {
             throw new BusinessException("二维码无效");
         }
 
         return $result;
     }
+
+    /**
+     * @Desc 查询微信支付
+     * @Author Gorden
+     * @Date 2024/8/16 14:55
+     *
+     * @param $orderId
+     * @param $nbr 循环次数
+     * @return mixed|void
+     * @throws BusinessException
+     */
+    public static function findWxpay($orderId, $nbr = 0)
+    {
+        if ($nbr >= 6) {
+            throw new BusinessException("订单查询失败");
+        }
+        try {
+            $result = Pay::wechat(config('payment.wxpay'))->find($orderId, 'pos');
+            $result = json_decode(json_encode($result), true);
+        } catch (\Exception $e) {
+            SupportLog::channel('pay')->error("WXPAY", ['msg' => $e->getMessage()]);
+            throw new BusinessException("订单查询失败");
+        }
+
+        if (!empty($result['return_code']) && $result['return_code'] == 'SUCCESS' && !empty($result['result_code']) && $result['result_code'] == 'SUCCESS') {
+            return $result;
+        } else {
+            sleep(5);
+            self::findWxpay($orderId, $nbr + 1);
+        }
+    }
+
+    /**
+     * @Desc 查询支付宝订单
+     * @Author Gorden
+     * @Date 2024/8/16 15:16
+     *
+     * @param $orderId
+     * @param $nbr 循环次数
+     * @return mixed|void
+     * @throws BusinessException
+     */
+    public static function findAlipay($orderId, $nbr = 0)
+    {
+        if ($nbr >= 6) {
+            throw new BusinessException("订单查询失败");
+        }
+        try {
+            $result = Pay::alipay(config('payment.alipay'))->find($orderId);
+            $result = json_decode(json_encode($result), true);
+        } catch (\Exception $e) {
+            SupportLog::channel('pay')->error("ALIPAY", ['msg' => $e->getMessage()]);
+            throw new BusinessException("订单查询失败");
+        }
+
+        if (!empty($result['code']) && $result['code'] == '10000' && !empty($result['trade_status']) && $result['trade_status'] == 'TRADE_SUCCESS') {
+            return $result;
+        } else {
+            sleep(5);
+            self::findAlipay($orderId, $nbr + 1);
+        }
+    }
+
+    /**
+     * 验证产品库存
+     */
+    public static function checkGoodsStorage($params)
+    {
+        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('库存不足');
+            }
+        }
+    }
+
+    /**
+     * 下单时结算的组合支付payDetail
+     */
+    public static function createPayDetail($params)
+    {
+        $insertPayDetailData = [
+            'join_pay_member_id' => $params['join_order_member_id'],
+            'join_pay_order_id' => $params['orderGroupId'],
+            'pay_status' => 'SUCCESS',
+            'pay_category' => !empty($params['submit_goods_classify']) ? $params['submit_goods_classify'] : $params['goods_classify'],
+            'pay_amount' => $params['order_amount_pay'],
+            'pay_paytimes' => date('Y-m-d H:i:s'),
+            'pay_prepayid' => $params['pay_category'],
+            'pay_json_request' => json_encode($params),
+            'pay_json_response' => $params['pay_json_response'] ?? '[]',
+            'pay_addtimes' => time()
+        ];
+
+        PayDetail::insert($insertPayDetailData);
+    }
+
+    /**
+     * 组合支付,PayDetail
+     */
+    public static function createPayConstituteDetail($params, $payDetail)
+    {
+        $qrcodePrepayId = '';
+        if (in_array($params['pay_category'], ['WXPAY', 'ALIPAY'])) {
+            $qrcodePrepayId = $params['join_order_member_id'] . '-QRCODE';
+        }
+        if (!$payDetail || ($payDetail->pay_prepayid != $params['pay_category'] && $payDetail->pay_prepayid != $qrcodePrepayId)) {
+            $payDetail = new PayDetail();
+            $payDetail->join_pay_member_id = $params['join_order_member_id'];
+            $payDetail->join_pay_order_id = $params['orderGroupId'];
+            $payDetail->pay_category = $params['goods_classify'] ?? '';
+            $payDetail->pay_prepayid = $params['pay_category'];
+            $payDetail->pay_json_request = json_encode($params);
+            $payDetail->pay_json_response = $params['pay_json_response'] ?? json_encode([
+                'pay-result' => '支付成功', 'result-datetime' => date('Y-m-d H:i:s')
+            ]);
+            $payDetail->pay_addtimes = time();
+        }
+        if ($payDetail->pay_prepayid == $qrcodePrepayId) {
+            $payDetail->pay_prepayid = $params['pay_category'];
+        }
+        $payDetail->pay_json_response = $params['pay_json_response'] ?? json_encode([
+            'pay-result' => '支付成功', 'result-datetime' => date('Y-m-d H:i:s')
+        ]);
+        $payDetail->pay_amount = $params['order_amount_pay'];
+        $payDetail->pay_paytimes = date('Y-m-d H:i:s');
+        $payDetail->pay_status = 'SUCCESS';
+        $payDetail->save();
+    }
 }

+ 5 - 5
app/admin/validate/coupon/CouponValidate.php

@@ -12,11 +12,11 @@ class CouponValidate extends Validate
      */
     protected $rule = [
         'coupon_id' => 'require|alphaDash',
-        'coupon_status|优惠券状态' => 'require|in:ACTIVED,DISABLED',
+//        'coupon_status|优惠券状态' => 'require|in:ACTIVED,DISABLED',
         'coupon_category|分类' => 'max:32',
         'coupon_name|名称' => 'require|max:32',
-        'coupon_begindate|启用日期' => 'require',
-        'coupon_enddate|过期时间' => 'require',
+        'coupon_validdate_begin|启用日期' => 'require',
+        'coupon_validdate_end|过期时间' => 'require',
     ];
 
     /**
@@ -24,7 +24,7 @@ class CouponValidate extends Validate
      * @var array[]
      */
     protected $scene = [
-        'add' => ['coupon_status', 'coupon_category', 'coupon_name', 'coupon_begindate', 'coupon_enddate'],
-        'update' => ['coupon_id', 'coupon_status', 'coupon_category', 'coupon_name', 'coupon_begindate', 'coupon_enddate'],
+        'add' => ['coupon_category', 'coupon_name', 'coupon_validdate_begin', 'coupon_validdate_end'],
+        'update' => ['coupon_id', 'coupon_category', 'coupon_name', 'coupon_validdate_begin', 'coupon_validdate_end'],
     ];
 }

+ 37 - 0
app/command/TestCommand.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace app\command;
+
+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;
+use Symfony\Component\Console\Output\OutputInterface;
+use Webman\Event\Event;
+
+class TestCommand extends Command
+{
+
+    protected static $defaultName = 'TestCommand';
+    protected static $defaultDescription = 'TestCommand Desc';
+
+    /**
+     * @return void
+     */
+    protected function configure()
+    {
+        // $this->addArgument('name', InputArgument::OPTIONAL, '余额账户转福利账户');
+        $this->addArgument('name', InputArgument::OPTIONAL, '福利账户余额清空');
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        Event::dispatch('order_pay.member_level.up','MR20240624091039F5HSLY');
+
+        return self::SUCCESS;
+    }
+}

+ 65 - 0
app/event/MemberLevelEvent.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace app\event;
+
+use app\admin\service\notify\RechargeService;
+use app\model\Member;
+use app\model\MemberAccount;
+use app\model\MemberRole;
+use app\model\PayDetail;
+use support\Db;
+
+class MemberLevelEvent
+{
+    public function payOrderLevelUp($memberId)
+    {
+        Db::beginTransaction();
+        try{
+            $member = Member::where('member_id',$memberId)->select('member_id','join_member_role_id')->first();
+            $account = MemberAccount::where('join_account_member_id',$memberId)->where('member_account_classify','CASH')->first();
+            $income = $account->member_account_income;
+
+            $paySuccessDetail = PayDetail::where('join_pay_member_id',$memberId)
+                ->where('pay_status','SUCCESS')
+                ->where('pay_category','<>','RECHARGE')
+                ->where(function ($query){
+                    $query->where('pay_prepayid','WXPAY')
+                        ->orWhere('pay_prepayid','ALIPAY')
+                        ->orWhere('pay_prepayid','like','%CASH%');
+                });
+            $payAmount = $paySuccessDetail->sum('pay_amount');
+            $paySuccessDetail = $paySuccessDetail->select('pay_id','join_pay_order_id','pay_amount')
+                ->get()
+                ->toArray();
+            $orderIds = array_column($paySuccessDetail,'join_pay_order_id');
+            $refundAmount = PayDetail::whereIn('join_pay_order_id',$orderIds)
+                ->where('pay_category','REFUND')
+                ->where('pay_status','SUCCESS')
+                ->sum('pay_amount');
+            $amount = $payAmount - $refundAmount;
+            $resultAmount = max($income,$amount);
+            $memberRole = MemberRole::where('member_role_range_begin' ,'<=',$resultAmount)
+                ->where('member_role_range_end','>',$resultAmount)
+                ->first();
+            if(!empty($memberRole->member_role_id) && !empty($member->join_member_role_id) && $memberRole->member_role_id != $member->join_member_role_id){
+                $oldRole = MemberRole::where('member_role_id',$member->join_member_role_i)->first();
+                if (!empty($oldRole->member_role_range_begin) && $oldRole->member_role_range_begin < $memberRole->member_role_range_begin){
+                    $member->join_member_role_id = $memberRole->member_role_id;
+                    $member->save();
+                    RechargeService::disposeAdded($memberRole->member_role_id,$memberId);
+                    _syslog("会员升级","会员升级成功",false,['member'=>$memberId],1001);
+                    Db::commit();
+                }
+            }elseif (!empty($memberRole->member_role_id) && empty($member->join_member_role_id)){
+                $member->join_member_role_id = $memberRole->member_role_id;
+                $member->save();
+                RechargeService::disposeAdded($memberRole->member_role_id,$memberId);
+                _syslog("会员升级","会员升级成功",false,['member'=>$memberId],1001);
+                Db::commit();
+            }
+        }catch (\Exception $e){
+            Db::rollBack();
+            _syslog("会员升级","会员升级失败,原因:".$e->getMessage(),false,['member'=>$memberId],1001);
+        }
+    }
+}

+ 36 - 5
app/event/order/KangyangCityEvent.php

@@ -2,17 +2,21 @@
 
 namespace app\event\order;
 
+use app\model\CouponDetail;
+use app\model\Goods;
 use app\model\Member;
 use app\model\MemberAccount;
+use app\model\SysSerial;
 
 class KangyangCityEvent{
     public function grant($params)
     {
-        dump("进入event");
+        dump($params);
         // 会员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()){
+        $memberAccount = MemberAccount::where('join_account_member_id',$params['member_id'])->where('member_account_classify','VIP')->first();
+        if (!$memberAccount){
             $account = [
                 'join_account_member_id' => $params['member_id'],
                 'member_account_classify' => 'VIP',
@@ -20,12 +24,39 @@ class KangyangCityEvent{
                 '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_income'=>$params['order_amount_pay'],
+                'member_account_surplus' => $params['order_amount_pay'],
                 'member_account_addtimes'=>time(),
             ];
 
             MemberAccount::insert($account);
-        }   
+        }else{
+            // 重复购买
+            $memberAccount->member_account_income = $memberAccount->member_account_income +$params['order_amount_pay'];
+            $memberAccount->member_account_surplus = $memberAccount->member_account_surplus +$params['order_amount_pay'];
+            $memberAccount->save();
+        }
+        //发放优惠券
+        $goods = Goods::where('goods_id',$params['join_sheet_goods_id'])->select('goods_attribute_json')->first();
+        if (!empty($goods) && !empty($goods->goods_attribute_json)){
+            $goodsAttributeJson = json_decode($goods->goods_attribute_json,true);
+            if (!empty($goodsAttributeJson['coupon'])){
+                foreach ($goodsAttributeJson['coupon'] as $key => $coupon){
+                    $num = $coupon['num'];
+                    for ($i=0;$i<$num;$i++){
+                        CouponDetail::insert([
+                            'coupon_detail_id'=>'CUDT'.str_pad(SysSerial::getSerial(), 8, "0", STR_PAD_LEFT) . random_string(6, 'up'),
+                            'join_detail_coupon_id'=>$key,
+                            'join_coupon_detail_member_id'=>$params['member_id'],
+                            'coupon_detail_status'=>'PENDING',
+                            'coupon_detail_gain_datetime'=>date('Y-m-d H:i:s'),
+                            'coupon_detail_json'=>'[]',
+                            'coupon_detail_extend_json'=>'[]',
+                            'coupon_detail_addtimes'=>time()
+                        ]);
+                    }
+                }
+            }
+        }
     }
 }

+ 2 - 2
app/functions.php

@@ -77,9 +77,9 @@ if (!function_exists('_syslog')) {
         $model = new \app\model\SysLog();
         $model->log_admin_id = $logAdminId;
         $model->log_name = $name;
-        $model->log_route = \request()->uri() ?? \request()->route->getPath();
+        $model->log_route = \request() && \request()->uri() ? \request()->uri() : (\request() && \request()->route && \request()->route->getPath() ? \request()->route->getPath() : '');
         $model->log_operation = $operation;
-        $model->log_ip = \request()->getRealIp();
+        $model->log_ip = \request() && \request()->getRealIp() ? \request()->getRealIp() : '0.0.0.0';
         $model->log_request_params = $requestParams ? json_encode($requestParams) : json_encode(\request()->all());
         $model->log_operation_data = $operationData ? json_encode($operationData) : null;
         $model->save();

+ 8 - 0
app/model/Coupon.php

@@ -23,4 +23,12 @@ class Coupon extends Model
     {
         return $date->format('Y-m-d H:i:s');
     }
+
+    public function category(){
+        return $this->hasOne(SysCategory::class,'category_id','join_coupon_category_id')->select('category_id','category_name');
+    }
+
+    public function user(){
+        return $this->hasOne(SysUser::class,'user_id','coupon_creator_user_id')->select('user_id','user_name');
+    }
 }

+ 36 - 0
app/model/CouponGoods.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class CouponGoods extends Model
+{
+    protected $table = 'coupon_goods';
+
+    protected $primaryKey = 'coupon_goods_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'coupon_goods_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    public function goods(){
+        return $this->hasOne(Goods::class,'goods_id','join_coupon_goods_id');
+    }
+
+    public function skus(){
+        return $this->hasMany(GoodsSku::class,'join_sku_goods_id','join_coupon_goods_id');
+    }
+
+    public function sku(){
+        return $this->hasOne(GoodsSku::class,'goods_sku_id','join_coupon_goods_sku_id');
+    }
+}

+ 3 - 0
config/event.php

@@ -12,5 +12,8 @@ return [
     ],
     'order.kangyangCityVIP.grant' => [
         [\app\event\order\KangyangCityEvent::class, 'grant']
+    ],
+    'order_pay.member_level.up' => [
+        [\app\event\MemberLevelEvent::class,'payOrderLevelUp']
     ]
 ];

+ 16 - 0
config/log.php

@@ -29,4 +29,20 @@ return [
             ]
         ],
     ],
+    'pay' => [
+        'handlers' => [
+            [
+                'class' => Monolog\Handler\RotatingFileHandler::class,
+                'constructor' => [
+                    runtime_path() . '/logs/pay.log',
+                    7, //$maxFiles
+                    Monolog\Logger::DEBUG,
+                ],
+                'formatter' => [
+                    'class' => Monolog\Formatter\LineFormatter::class,
+                    'constructor' => [null, 'Y-m-d H:i:s', true],
+                ],
+            ]
+        ],
+    ],
 ];

+ 10 - 2
route/admin.php

@@ -300,8 +300,8 @@ Route::group('/admin', function () {
             Route::post('/update', [\app\admin\controller\sys_manage\FinanceController::class, 'update']);
         });
         Route::group('/apartment', function () {
-            Route::get('/info', [\app\admin\controller\content\ApartMentController::class, 'info']);
-            Route::post('/update', [\app\admin\controller\content\ApartMentController::class, 'update']);
+            Route::get('/info', [\app\admin\controller\content\ApartmentController::class, 'info']);
+            Route::post('/update', [\app\admin\controller\content\ApartmentController::class, 'update']);
         });
         Route::group('/banner', function () {
             Route::get('/list', [\app\admin\controller\sys_manage\BannerController::class, 'select']);
@@ -681,6 +681,7 @@ Route::group('/admin', function () {
             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('/coupon', [\app\admin\controller\member\MemberController::class, 'coupon']);
             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']);
@@ -865,6 +866,7 @@ Route::group('/admin', function () {
         Route::group('', function () {
             Route::get('/list', [\app\admin\controller\coupon\CouponController::class, 'select']);
             Route::get('/selectList', [\app\admin\controller\coupon\CouponController::class, 'selectList']);
+            Route::get('/info', [\app\admin\controller\coupon\CouponController::class, 'info']);
             Route::post('/add', [\app\admin\controller\coupon\CouponController::class, 'insert']);
             Route::post('/update', [\app\admin\controller\coupon\CouponController::class, 'update']);
             Route::delete('/delete', [\app\admin\controller\coupon\CouponController::class, 'delete']);
@@ -882,6 +884,7 @@ Route::group('/admin', function () {
             Route::post('/delivery', [\app\admin\controller\order\WholeController::class, 'delivery']);
             Route::get('/myOrder', [\app\admin\controller\order\WholeController::class, 'myOrder']);
             Route::post('/add', [\app\admin\controller\order\WholeController::class, 'insert']);
+            Route::post('/addConstitute', [\app\admin\controller\order\WholeController::class, 'insertConstitute']);
             Route::post('/delete', [\app\admin\controller\order\WholeController::class, 'delete']);
             Route::post('/doRefund', [\app\admin\controller\order\WholeController::class, 'doRefund']);
             Route::post('/writeOffDishes', [\app\admin\controller\order\WholeController::class, 'writeOffDishes']);
@@ -890,8 +893,11 @@ Route::group('/admin', function () {
             Route::get('/chooseBenefitList', [\app\admin\controller\order\WholeController::class, 'chooseBenefitList']);
             Route::post('/writeOffBenefit', [\app\admin\controller\order\WholeController::class, 'writeOffBenefit']);
             Route::post('/pay', [\app\admin\controller\order\WholeController::class, 'pay']);
+            Route::post('/payConstitute', [\app\admin\controller\order\WholeController::class, 'payConstitute']);
             Route::post('/addDishes', [\app\admin\controller\order\WholeController::class, 'addDishes']);
+            Route::post('/cutMeals', [\app\admin\controller\order\WholeController::class, 'cutMeals']);
             Route::post('/customPrinter', [\app\admin\controller\order\WholeController::class, 'customPrinter']);
+            Route::post('/cancelOrder', [\app\admin\controller\order\WholeController::class, 'cancelOrder']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
@@ -1076,4 +1082,6 @@ Route::group('/admin', function () {
 
 Route::group('/notify', function () {
     Route::post('/recharge/paySuccess', [\app\admin\controller\notify\RechargeController::class, 'paySuccess']);
+    Route::post('/orderPay/wxpay', [\app\admin\controller\notify\OrderPayController::class, 'wxpay']);
+    Route::post('/orderPay/alipay', [\app\admin\controller\notify\OrderPayController::class, 'alipay']);
 });

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff