gorden 6 months ago
parent
commit
388b94023b

+ 66 - 11
app/admin/controller/coupon/CouponController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\coupon;
 
+use app\admin\service\coupon\CouponDetailService;
 use app\admin\validate\coupon\CouponValidate;
 use app\admin\validate\device\DeviceValidate;
 use app\controller\Curd;
@@ -157,6 +158,7 @@ class CouponController extends Curd
     {
         $coupons = Coupon::where('coupon_status', 'ACTIVED')
             ->select('coupon_id', 'coupon_name')
+            ->orderBy('coupon_addtimes', 'DESC')
             ->get()
             ->toArray();
 
@@ -187,9 +189,9 @@ class CouponController extends Curd
             return json_fail($this->validateClass->getError());
         }
         $goods = $request->post('goodsContentList', []);
-        if (empty($goods)) {
-            return json_fail("请选择关联的产品");
-        }
+//        if (empty($goods)) {
+//            return json_fail("请选择关联的产品");
+//        }
 
         Db::beginTransaction();
         try {
@@ -275,7 +277,7 @@ class CouponController extends Curd
             }
         } else if ($params['coupon_use_member'] == 'all') {
             $couponJson['member']['list'] = [];
-            $couponJson['member']['range'] = '全部员';
+            $couponJson['member']['range'] = '全部员';
             $couponJson['member']['where'] = '';
         }
 
@@ -291,6 +293,64 @@ class CouponController extends Curd
         return $data;
     }
 
+    public function customSend(Request $request)
+    {
+        $chooseCoupons = $request->post('chooseCoupons', []);
+        $couponUseMember = $request->post('coupon_use_member', '');
+        $memberList = $request->post('member_list', []);
+        $condition = $request->post('condition', '');
+        if ($couponUseMember == 'condition') {
+            if ($condition == 'is_employ') {
+                $memberList = Member::where('member_classify', 'EMPLOY')->pluck('member_id')->toArray();
+            } elseif ($condition == 'is_member') {
+                $memberList = Member::where('member_classify', 'MEMBER')->pluck('member_id')->toArray();
+            } elseif ($condition == 'is_vip') {
+                $memberList = Member::where('member_is_vip', 'Y')->pluck('member_id')->toArray();
+            }
+        }
+
+        Db::beginTransaction();
+        try {
+            $couponIds = array_column($chooseCoupons, 'id');
+            $coupons = Coupon::whereIn('coupon_id', $couponIds)->get()->toArray();
+            foreach ($coupons as $coupon) {
+                foreach ($chooseCoupons as $chooseCoupon) {
+                    if ($chooseCoupon['id'] == $coupon['coupon_id']) {
+                        if (empty($chooseCoupon['gain_datetime'])) {
+                            $chooseCoupon['gain_datetime'] = date('Y-m-d H:i:s');
+                        }
+                        $params['coupon_id'] = $coupon['coupon_id'];
+                        $params['coupon_detail_gain_datetime'] = date('Y-m-d H:i:s', strtotime($chooseCoupon['gain_datetime']));
+                        if (($coupon['coupon_validdate_day'] == 0 || $coupon['coupon_validdate_day'] == '') && !empty($coupon['coupon_validdate_end'])) {
+                            $params['coupon_detail_deadline_datetime'] = $coupon['coupon_validdate_end'];
+                        } elseif ($coupon['coupon_validdate_day'] > 0) {
+                            $endUnix = strtotime($chooseCoupon['gain_datetime']);
+                            $params['coupon_detail_deadline_datetime'] = date('Y-m-d H:i:s', $endUnix + ($coupon['coupon_validdate_day'] * 24 * 3600) -1);
+                        }
+                        foreach ($memberList as $item) {
+                            $params['member_id'] = $item;
+                            if ($chooseCoupon['nbr'] > 0) {
+                                for ($i = 0; $i < $chooseCoupon['nbr']; $i++) {
+                                    CouponDetailService::customSendCoupon($params);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            Db::commit();
+            return json_success("发放成功");
+        } catch (BusinessException $e) {
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            return json_fail('优惠券发放失败');
+
+        }
+
+    }
+
     /**
      * @Desc 修改优惠券
      * @Author Gorden
@@ -489,7 +549,7 @@ class CouponController extends Curd
 //            }
         } else if ($params['coupon_use_member'] == 'all') {
             $couponJson['member']['list'] = [];
-            $couponJson['member']['range'] = '全部员';
+            $couponJson['member']['range'] = '全部员';
             $couponJson['member']['where'] = '';
 
             if (isset($couponJson['member']['list'])) {
@@ -661,12 +721,7 @@ class CouponController extends Curd
                 }
                 CouponGoods::where('join_goods_coupon_id', $id)->delete();
 
-//                CouponDetail::where('join_detail_coupon_id', $id)
-//                    ->whereIn('coupon_detail_status',['INIT','PENDING','ACTIVED'])
-//                    ->delete();
-//                CouponDetail::where('join_detail_coupon_id', $id)
-//                    ->where('coupon_detail_status','WAITING')
-//                    ->update(['coupon_detail_status'=>'DISABLED']);
+                CouponDetail::where('join_detail_coupon_id', $id)->delete();
             }
             $this->doDelete($ids);
             Db::commit();

+ 62 - 9
app/admin/controller/coupon/CouponDetailController.php

@@ -2,10 +2,12 @@
 
 namespace app\admin\controller\coupon;
 
+use app\admin\service\coupon\CouponService;
 use app\admin\service\member\MemberService;
 use app\controller\Curd;
 use app\model\Coupon;
 use app\model\CouponDetail;
+use app\model\CouponGoods;
 use support\Request;
 use support\Response;
 
@@ -120,7 +122,7 @@ class CouponDetailController extends Curd
             }
             if (!empty($item['coupon_detail_extend_json'])) {
                 $couponDetailExtendJson = json_decode($item['coupon_detail_extend_json'], true);
-                if (isset($couponDetailExtendJson['gettype'])){
+                if (isset($couponDetailExtendJson['gettype'])) {
                     $item['gettype'] = $couponDetailExtendJson['gettype'];
                 }
             }
@@ -170,21 +172,72 @@ class CouponDetailController extends Curd
      */
     public function info(Request $request): Response
     {
-        $detailId = $request->get('detail_id','');
-        if (empty($detailId)){
+        $detailId = $request->get('detail_id', '');
+        if (empty($detailId)) {
             return json_fail('参数异常');
         }
 
-        $detail = CouponDetail::where('coupon_detail_id',$detailId)
-            ->select('coupon_detail_id','coupon_detail_extend_json')
+        $detail = CouponDetail::where('coupon_detail_id', $detailId)
+            ->select('coupon_detail_id', 'coupon_detail_extend_json')
             ->first();
-        if (!empty($detail->coupon_detail_extend_json)){
-            $couponDetailExtendJson = json_decode($detail->coupon_detail_extend_json,true);
-            if (isset($couponDetailExtendJson['from'])){
+        if (!empty($detail->coupon_detail_extend_json)) {
+            $couponDetailExtendJson = json_decode($detail->coupon_detail_extend_json, true);
+            if (isset($couponDetailExtendJson['from'])) {
                 $detail['from'] = MemberService::getMemberNameByMemberId($couponDetailExtendJson['from']);
             }
         }
 
-        return json_success('',$detail);
+        return json_success('', $detail);
+    }
+
+    public function myCouponGrouping(Request $request)
+    {
+        $memberId = $request->get('member_id', '');
+        $goods = $request->get('goods', []);
+        if ($memberId == '') {
+            return json_fail("参数异常");
+        }
+
+        $goodsIds = array_column($goods, 'goods_id');
+        $couponGoods = CouponGoods::whereIn('join_coupon_goods_id', $goodsIds)->get()->toArray();
+        $couponIds = [];
+        foreach ($couponGoods as $couponGood) {
+            foreach ($goods as $good) {
+                if ($good['sku_id'] = $couponGood['join_coupon_goods_sku_id']) {
+                    $couponIds[] = $couponGood['join_goods_coupon_id'];
+                }
+            }
+        }
+
+        $details = CouponDetail::with([
+            'coupon' => function ($query) {
+                $query->select('coupon_id', 'coupon_name', 'coupon_classify', 'coupon_value', 'coupon_category', 'coupon_minimum_limit');
+            }
+        ])
+            ->whereIn('join_detail_coupon_id', $couponIds)
+            ->where('join_coupon_detail_member_id', $memberId)
+            ->where('coupon_detail_status', 'ACTIVED')
+            ->selectRaw('join_detail_coupon_id,join_coupon_detail_member_id,COUNT(*) as count')
+            ->groupBy('join_detail_coupon_id', 'join_coupon_detail_member_id')
+            ->get()
+            ->toArray();
+        $data = [];
+        foreach ($details as $detail) {
+            if (empty($detail['coupon'])) {
+                continue;
+            }
+            $classify = CouponService::couponClassifyInfo($detail['coupon']['coupon_classify'], $detail['coupon']['coupon_category'], $detail['coupon']['coupon_value'], $detail['coupon']['coupon_minimum_limit']);
+            $data[] = [
+                'coupon_id' => $detail['coupon']['coupon_id'],
+                'coupon_name' => $detail['coupon']['coupon_name'],
+                'classify' => $classify,
+                'count' => $detail['count'],
+                'coupon_classify' => $detail['coupon']['coupon_classify'],
+                'coupon_value' => $detail['coupon']['coupon_value'] ?? '',
+                'coupon_minimum_limit' => $detail['coupon']['coupon_minimum_limit'] ?? '',
+            ];
+        }
+
+        return json_success('', $data);
     }
 }

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

@@ -45,6 +45,7 @@ class AccountController extends Curd
 
         foreach ($account as &$item){
             $item['member_account_duedate'] = !empty($item['member_account_duedate']) ? date('Y-m-d H:i:s',$item['member_account_duedate']) : '长期有效';
+            $item['member_account_surplus'] = $item['member_account_surplus'] + $item['member_account_added'];
         }
 
         return json_success('', $account);

+ 35 - 31
app/admin/controller/order/DishesController.php

@@ -10,7 +10,8 @@ use app\model\OrderSheet;
 use support\Request;
 use support\Response;
 
-class DishesController extends Curd{
+class DishesController extends Curd
+{
     public function __construct()
     {
         $this->model = new Order();
@@ -30,6 +31,7 @@ class DishesController extends Curd{
     public function select(Request $request): Response
     {
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+
         if (!empty($where['order_addtimes'])) {
             $where['order_addtimes'][0] = strtotime($where['order_addtimes'][0]);
             $where['order_addtimes'][1] = strtotime($where['order_addtimes'][1]);
@@ -40,7 +42,7 @@ class DishesController extends Curd{
         // $where['order_category'] = 'DISHES';
         if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
             $where['order_is_complete'] = 'N';
-            $where['order_category'] = ['<>','RETURN'];
+            $where['order_category'] = ['<>', 'RETURN'];
         }
 
         // if (!empty($where['order_status_system']) && $where['order_status_system'] == 'RETURN') {
@@ -52,32 +54,34 @@ class DishesController extends Curd{
         //     $where['order_return.order_return_status'] = $request->get('return');
         // }
         // if ($request->get('goods_classify') || $request->get('goods_name')){
-            $where['order_id'] = '';
+//            $where['order_id'] = '';
+        if (empty($where['order_id'])){
             $goodsClassify = 'MEALS';
-            $goodsName = $request->get('goods_name','');
-            if (!empty($goodsName) && empty($goodsClassify)){
-                $goodsIds = Goods::where('goods_name','like','%'.$request->get('goods_name').'%')->pluck('goods_id')->toArray();
-            }else if(!empty($goodsClassify)){
-                if($goodsClassify == 'SERVICE'){
-                    $goodsModel = Goods::whereIn('goods_classify',['SERVICE','CHNMED','CHNNCD']);
-                }else{
-                    $goodsModel = Goods::where('goods_classify',$goodsClassify);
-                }
-
-                if(!empty($goodsName)){
-                    $goodsModel->where('goods_name','like','%'.$goodsName.'%');
-                }
+        }
+//        $goodsClassify = $request->get('goods_classify', '');
+        $goodsName = $request->get('goods_name', '');
+        if (!empty($goodsName) && empty($goodsClassify)) {
+            $goodsIds = Goods::where('goods_name', 'like', '%' . $request->get('goods_name') . '%')->pluck('goods_id')->toArray();
+        } else if (!empty($goodsClassify)) {
+            if ($goodsClassify == 'SERVICE') {
+                $goodsModel = Goods::whereIn('goods_classify', ['SERVICE', 'CHNMED', 'CHNNCD']);
+            } else {
+                $goodsModel = Goods::where('goods_classify', $goodsClassify);
+            }
 
-                $goodsIds = $goodsModel->pluck('goods_id')->toArray();
+            if (!empty($goodsName)) {
+                $goodsModel->where('goods_name', 'like', '%' . $goodsName . '%');
             }
-            if($goodsIds){
-                $orderIds = OrderSheet::whereIn('join_sheet_goods_id',$goodsIds)->pluck('join_sheet_order_id')->toArray();
-                if($orderIds){
-                    $where['order_id'] = ['in',implode(',',$orderIds)];
-                }
+
+            $goodsIds = $goodsModel->pluck('goods_id')->toArray();
+        }
+        if (!empty($goodsIds)) {
+            $orderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
+            if ($orderIds) {
+                $where['order_id'] = ['in', implode(',', $orderIds)];
             }
+        }
         // }
-
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
@@ -86,7 +90,7 @@ class DishesController extends Curd{
     {
         $model = $this->model->with([
             'sheets' => function ($query) {
-                $query->select('join_sheet_order_id', 'order_sheet_id', 'join_sheet_goods_id', 'order_sheet_num','order_sheet_price');
+                $query->select('join_sheet_order_id', 'order_sheet_id', 'join_sheet_goods_id', 'order_sheet_num', 'order_sheet_price');
             },
             'member' => function ($query) {
                 $query->select('member_id', 'member_mobile');
@@ -104,7 +108,7 @@ class DishesController extends Curd{
             'express' => function ($query) {
                 $query->select('join_express_order_id', 'order_express_type');
             }
-        ])->leftJoin('order_return','order_return.join_return_order_id','=','order.order_id');
+        ])->leftJoin('order_return', 'order_return.join_return_order_id', '=', 'order.order_id');
         // ->leftJoin('order_sheet','join_sheet_order_id','=','order.order_id');
         foreach ($where as $column => $value) {
             if (is_array($value)) {
@@ -138,7 +142,7 @@ class DishesController extends Curd{
         if ($field) {
             $model = $model->orderBy($field, $order);
         }
-        $model = $model->select('order.*','order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status','order_return.order_return_apply_json','order_return.order_return_remark');
+        $model = $model->select('order.*', 'order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status', 'order_return.order_return_apply_json', 'order_return.order_return_remark');
         return $model;
     }
 
@@ -149,21 +153,21 @@ class DishesController extends Curd{
             $item['sheet'] = $item['sheets'][0] ?? [];
             if (!empty($item['sheet'])) {
                 $goods = Goods::where('goods_id', $item['sheet']['join_sheet_goods_id'])->first();
-                if(count($item['sheets']) > 1 && $goods->goods_classify == 'MEALS'){
+                if (count($item['sheets']) > 1 && $goods && $goods->goods_classify == 'MEALS') {
                     $sheetDeng = ' 等餐品';
                 }
-                $item['sheet']['goods_name'] = ($goods && $goods->goods_name) ? $goods->goods_name.$sheetDeng : '';
+                $item['sheet']['goods_name'] = ($goods && $goods->goods_name) ? $goods->goods_name . $sheetDeng : '';
                 $item['sheet']['goods_classify'] = $goods->goods_classify ?? '';
                 $item['sheet']['order_sheet_num'] = intval($item['sheet']['order_sheet_num']);
             }
             unset($item['sheets']);
-            if (isset($item['orders_return_id'])){
+            if (isset($item['orders_return_id'])) {
                 $item['return'] = [
-                    'orders_return_id'=>$item['orders_return_id'],
+                    'orders_return_id' => $item['orders_return_id'],
                     'join_return_order_id' => $item['join_return_order_id'],
                     'order_return_status' => $item['order_return_status'],
                     'order_return_apply_json' => $item['order_return_apply_json'],
-                    'order_return_remark'=>$item['order_return_remark']
+                    'order_return_remark' => $item['order_return_remark']
                 ];
             }
         }

+ 193 - 75
app/admin/controller/order/WholeController.php

@@ -2,6 +2,7 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\coupon\CouponService;
 use app\admin\service\member\MemberService;
 use app\admin\service\order\OrderService;
 use app\admin\validate\coupon\CouponValidate;
@@ -207,7 +208,7 @@ class WholeController extends Curd
             $item['sheet'] = $item['sheets'][0] ?? [];
             if (!empty($item['sheet'])) {
                 $goods = Goods::where('goods_id', $item['sheet']['join_sheet_goods_id'])->first();
-                if (count($item['sheets']) > 1 && $goods->goods_classify == 'MEALS') {
+                if (count($item['sheets']) > 1 && !empty($goods) && $goods->goods_classify == 'MEALS') {
                     $sheetDeng = ' 等餐品';
                 }
                 $item['sheet']['goods_name'] = ($goods && $goods->goods_name) ? $goods->goods_name . $sheetDeng : '';
@@ -245,7 +246,7 @@ class WholeController extends Curd
             } else {
                 $item['payWay'] = null;
             }
-            if (isset($item['payWay']) && $item['order_status_payment'] == 'SUCCESS') {
+            if (!empty($item['payWay']) && $item['order_status_payment'] == 'SUCCESS') {
                 $payWay = explode('-', $item['payWay']);
                 if (!empty($payWay[1]) && $payWay[1] == 'CASH') {
                     $item['payWay'] = '账户余额';
@@ -255,6 +256,10 @@ class WholeController extends Curd
                     $item['payWay'] = '付款码';
                 } else if (!empty($payWay[0]) && $payWay[0] == 'OFFLINE') {
                     $item['payWay'] = '线下支付';
+                } else if (!empty($payWay[0]) && $payWay[0] == 'OFFLINE_ALIPAY') {
+                    $item['payWay'] = '线下支付-支付宝';
+                } else if (!empty($payWay[0]) && $payWay[0] == 'OFFLINE_WXPAY') {
+                    $item['payWay'] = '线下支付-微信';
                 } else if (!empty($payWay[0]) && $payWay[0] == 'WXPAY') {
                     $item['payWay'] = '微信支付';
                 } else if (!empty($payWay[0]) && $payWay[0] == 'ALIPAY') {
@@ -311,13 +316,6 @@ class WholeController extends Curd
         if ($express && $express->order_express_type == '自提') {
             $premises = $express->order_express_company;
         }
-        // if (!empty($express->order_express_code)){
-        //     $expressCode = explode(':',$express->order_express_code);
-        //     if(count($expressCode) == 2){
-        //         $express->order_express_company = $expressCode[0];
-        //         $express->order_express_code = $expressCode[1];
-        //     }
-        // }
         $sheetAmount = 0;
         foreach ($orderSheet as &$item) {
             $sheetAmount += $item['order_sheet_amount'];
@@ -417,42 +415,6 @@ class WholeController extends Curd
                         'appointment_status' => $appontment['appointment_status'],
                     ];
                 }
-                // $benifits = MemberBenefit::where('join_benefit_member_id', $item['join_sheet_member_id'])
-                //     ->where('join_benefit_order_id', $orderId)
-                //     ->get();
-                // if (!empty($benifits)) {
-                //     $item['appontment'] = [];
-                //     foreach($benifits as $benifit){
-                //         $item['benefit'] = [
-                //             'total' => intval($benifit->member_benefit_limit_count),
-                //             'used' => intval($benifit->member_benefit_used_count),
-                //             'cut' => $benifit->member_benefit_limit_count - $benifit->member_benefit_used_count,
-                //         ];
-                //         $appontments = Appointment::where('join_appointment_member_benefit_id', $benifit->member_benefit_id)
-                //             ->where('appointment_status', 'DONE')
-                //             ->select('appointment_id', 'appointment_done_datetime', 'appointment_done_json')
-                //             ->get()
-                //             ->toArray();
-                //         foreach ($appontments as $appontment) {
-                //             $doneJson = [];
-                //             $username = '';
-                //             if (!empty($appontment['appointment_done_json'])) {
-                //                 $doneJson = json_decode($appontment['appointment_done_json'], true);
-                //                 if (isset($doneJson['charge'])) {
-                //                     $username = SysUser::where('user_id', $doneJson['charge']['charge_user_id'])->value('user_name');
-                //                 }
-                //             }
-                //             $item['appontment'][] = [
-                //                 'member' => ($item['cert'] ? $item['cert']['member_cert_name'] . '-' : '') . ($item['member'] ? $item['member']['member_mobile'] : ''),
-                //                 'goods_name' => $item['goods']['goods_name'].'-'.$benifit->member_benefit_name,
-                //                 'premisses' => isset($doneJson['charge']) ? $doneJson['charge']['charge_premises'] : '',
-                //                 'username' => $username,
-                //                 'nbr' => 1,
-                //                 'done_time' => $appontment['appointment_done_datetime']
-                //             ];
-                //         }
-                //     }
-                // }
             }
             if (!empty($item['order_sheet_extend_json']) && !$express) {
                 $extendJson = json_decode($item['order_sheet_extend_json'], true);
@@ -488,27 +450,16 @@ class WholeController extends Curd
         $payDetail = !empty($payDetails) && count($payDetails) > 0 ? $payDetails[0] : [];
         if (!empty($payDetail) && !empty($payDetail->pay_extend_json)) {
             $payExtendJson = json_decode($payDetail->pay_extend_json, true);
-            $payDetail->cancel_times = $payExtendJson['cancel_times'] ?? '';
+            $order->cancel_times = $payExtendJson['cancel_times'] ?? '';
+//            $payDetail->cancel_times = $payExtendJson['cancel_times'] ?? '';
         }
         if (!empty($payDetail) && !empty($payDetail->pay_prepayid)) {
             $categoryArray = explode('-', $payDetail->pay_prepayid);
             if (isset($categoryArray[1])) {
                 $payDetail->pay_category = $categoryArray[1];
-            } else if (in_array($categoryArray[0], ['WXPAY', 'ALIPAY'])) {
-                $payDetail->pay_category = $categoryArray[0];
-            } else if ($categoryArray[0] == 'OFFLINE') {
+            } else if (in_array($categoryArray[0], ['WXPAY', 'ALIPAY', 'OFFLINE', 'OFFLINE_ALIPAY', 'OFFLINE_WXPAY', 'MONEY'])) {
                 $payDetail->pay_category = $categoryArray[0];
-            } else if ($categoryArray[0] == 'MONEY') {
-                $payDetail->pay_category = $categoryArray[0];
-            } else {
-                if (MemberAccount::where('member_account_nbr', $categoryArray[0])->where('member_account_classify', 'CARD')->exists()) {
-                    $payDetail->pay_category = 'CARD';
-                } else {
-                    $payDetail->pay_category = 'CASH';
-                }
             }
-        } else if (!empty($payDetail)) {
-            $payDetail->pay_category = 'CASH';
         }
         $refund = OrderReturn::where('join_return_order_id', $orderId)
             ->select('order_return_status', 'order_return_apply_datetime', 'order_return_apply_json', 'order_return_accept_datetime', 'order_return_refund_json', 'order_return_extend_json')
@@ -547,7 +498,39 @@ class WholeController extends Curd
         if (!empty($order->order_extend_json)) {
             $orderExtendJson = json_decode($order->order_extend_json, true);
             $order->referee = $orderExtendJson['referee'] ?? '';
+            if (isset($orderExtendJson['cancel_times'])){
+                $order->cancel_times = $orderExtendJson['cancel_times'];
+            }
+        }
+        $discount = ['coupon_name' => '', 'classify' => '', 'value' => 0];
+        if (!empty($order->order_discount_json)) {
+            $orderDiscountJson = json_decode($order->order_discount_json, true);
+            foreach ($orderDiscountJson as $discountItem) {
+                if (!empty($discountItem['coupon_id'])) {
+                    $coupon = Coupon::where('coupon_id', $discountItem['coupon_id'])
+                        ->select('coupon_name', 'coupon_classify', 'coupon_category', 'coupon_value', 'coupon_minimum_limit')
+                        ->first();
+                    if (!$coupon) {
+                        continue;
+                    }
+                    $classify = CouponService::couponClassifyInfo($coupon->coupon_classify, $coupon->coupon_category, $coupon->coupon_value, $coupon->coupon_minimum_limit);
+                    $discount['coupon_name'] .= $coupon->coupon_classify . ':' . $coupon->coupon_name . '(优惠¥' . $discountItem['coupon_value'] . '), ';
+                }
+                if (empty($discountItem['coupon_id']) && !empty($discountItem['coupon_classify'])) {
+                    $discount['classify'] .= $discountItem['coupon_classify'] . '(¥' . round($discountItem['coupon_value'], 2) . '), ';
+                }
+                if (!empty($discountItem['coupon_value'])) {
+                    $discount['value'] += $discountItem['coupon_value'];
+                }
+            }
+            if (!empty($discount['coupon_name'])) {
+                $discount['coupon_name'] = rtrim($discount['coupon_name'], ', ');
+            }
+            if (!empty($discount['classify'])) {
+                $discount['classify'] = rtrim($discount['classify'], ', ');
+            }
         }
+        $order->discount = $discount;
 
         $order->premises = $order->premises ?? $premises;
         $data = [
@@ -776,6 +759,9 @@ class WholeController extends Curd
             $orderConfigJson = json_decode($order->order_config_json, true);
             if (isset($orderConfigJson['premises'])) {
                 $premises = SysDept::where('dept_name', $orderConfigJson['premises'])->first();
+                if (!empty($premises)) {
+                    $params['submit_premises_id'] = $premises->dept_id;
+                }
             }
         }
         $params['orderId'] = $params['order_id'];
@@ -799,14 +785,32 @@ class WholeController extends Curd
         }
         Db::beginTransaction();
         try {
+            // 使用优惠券
+            $couponUseJson = [];
+            if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
+                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                if ($couponResult['pay_amount'] != $params['order_amount_pay']) {
+                    throw new BusinessException("计算优惠后,实付金额错误!");
+                }
+                // 组装优惠券使用数据,存主表优惠里
+                $couponUseJson = $couponResult['use_coupon_json'];
+                if (!empty($order->order_discount_json)) {
+                    $orderDiscountJson = json_decode($order->order_discount_json, true);
+                    if (!empty($orderDiscountJson)) {
+                        $couponUseJson = json_encode(array_merge($orderDiscountJson, json_decode($couponUseJson, true)));
+                    }
+                }
+            }
             // 存储优惠信息
-            $order->order_discount_json = json_encode($this->discountRecord($order->order_discount_json, $params));
-
+            $order->order_discount_json = json_encode($this->discountRecord($couponUseJson, $params));
             // 组合支付时,付款码应收金额
             $qrcodePayAmount = 0;
             if ($params['pay_category'] == 'OFFLINE' || $params['pay_category'] == 'MONEY') {
                 $order->order_status_system = $systemStatus;
                 $order->order_status_payment = 'SUCCESS';
+                if ($params['pay_category'] == 'OFFLINE' && !empty($params['pay_category_sub'])) {
+                    $params['pay_category'] = $params['pay_category_sub'];
+                }
             } else if ($params['pay_category'] == 'CASH') {    // 余额支付
                 $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
                     ->where('member_account_classify', 'CASH')
@@ -1083,6 +1087,10 @@ class WholeController extends Curd
                 $payData['pay_prepayid'] = $params['card_nbr'];
             } else if ($params['pay_category'] == 'OFFLINE') {
                 $payData['pay_prepayid'] = 'OFFLINE';
+            } else if ($params['pay_category'] == 'OFFLINE_ALIPAY') {
+                $payData['pay_prepayid'] = 'OFFLINE_ALIPAY';
+            } else if ($params['pay_category'] == 'OFFLINE_WXPAY') {
+                $payData['pay_prepayid'] = 'OFFLINE_WXPAY';
             } else if ($params['pay_category'] == 'MONEY') {
                 $payData['pay_prepayid'] = 'MONEY';
             }
@@ -1166,6 +1174,10 @@ class WholeController extends Curd
                 Event::dispatch('order.kangyangCityVIP.grant', $params);
             }
 
+            if ($order->order_is_complete == 'Y') {
+                Event::dispatch('order.complete', $params);
+            }
+
             Db::commit();
 
             // 打小票
@@ -1224,18 +1236,18 @@ class WholeController extends Curd
             $json = json_decode($orderDiscountJson, true);
         }
         try {
-            if (!empty($params['preferential']) && $params['preferential'] == 'wipe') {
+            if (!empty($params['preferential']) && in_array('wipe', $params['preferential'])) {
                 if (intval($params['order_amount_total'] / 10) * 10 != $params['order_amount_pay']) {
                     throw new BusinessException("抹零后实际支付金额错误");
                 }
                 $params['order_discount_amount'] = $params['order_amount_total'] - $params['order_amount_pay'];
                 $couponClassifyDesc = $couponClassify = '抹零';
-            } else if (!empty($params['preferential']) && $params['preferential'] == 'custom') {
+            } elseif (!empty($params['preferential']) && in_array('custom', $params['preferential'])) {
                 if (sprintf("%.2f", $params['order_amount_total'] - $params['order_discount_amount']) != sprintf("%.2f", $params['order_amount_pay'])) {
                     throw new BusinessException("餐厅前台优惠后实际支付金额错误");
                 }
                 $couponClassifyDesc = $couponClassify = '餐厅前台优惠';
-            } else if (!empty($params['preferential']) && intval($params['preferential']) < 100 && intval($params['preferential']) >= 50) {
+            } else if (!empty($params['preferential']) && intval($params['preferential'][0]) < 100 && intval($params['preferential'][0]) >= 50) {
                 if (($params['order_amount_total'] * intval($params['preferential'])) / 100 !== $params['order_amount_pay']) {
                     throw new BusinessException("折扣后实际支付金额错误");
                 }
@@ -1302,6 +1314,9 @@ class WholeController extends Curd
             $orderConfigJson = json_decode($order->order_config_json, true);
             if (isset($orderConfigJson['premises'])) {
                 $premises = SysDept::where('dept_name', $orderConfigJson['premises'])->first();
+                if (!empty($premises)) {
+                    $params['submit_premises_id'] = $premises->dept_id;
+                }
             }
         }
         $params['orderId'] = $params['order_id'];
@@ -1325,9 +1340,24 @@ class WholeController extends Curd
         }
         $payDetail = PayDetail::where('join_pay_order_id', $order->order_groupby)->first();
         Db::beginTransaction();
-        try {
+        try {// 使用优惠券
+            $couponUseJson = [];
+            if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
+                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                if ($couponResult['pay_amount'] != $params['order_amount_pay']) {
+                    throw new BusinessException("计算优惠后,实付金额错误!");
+                }
+                // 组装优惠券使用数据,存主表优惠里
+                $couponUseJson = $couponResult['use_coupon_json'];
+                if (!empty($order->order_discount_json)) {
+                    $orderDiscountJson = json_decode($order->order_discount_json, true);
+                    if (!empty($orderDiscountJson)) {
+                        $couponUseJson = json_encode(array_merge($orderDiscountJson, json_decode($couponUseJson, true)));
+                    }
+                }
+            }
             // 存储优惠信息
-            $order->order_discount_json = json_encode($this->discountRecord($order->order_discount_json, $params));
+            $order->order_discount_json = json_encode($this->discountRecord($couponUseJson, $params));
             $orderAmountPay = $params['order_amount_pay'];
             $constituteList = array_column($params['pay_category_constitute_list'], 'amount', 'category');// 验证金额
             $constituteAmount = 0;
@@ -1340,7 +1370,7 @@ class WholeController extends Curd
             if (!empty($params['pay_category_constitute']) && in_array('OFFLINE', $params['pay_category_constitute'])) {  //线下付款
                 $order->order_status_system = $systemStatus;
                 $order->order_status_payment = 'SUCCESS';
-                $params['pay_category'] = 'OFFLINE';
+                $params['pay_category'] = $params['pay_category_sub'] ?? 'OFFLINE';
 
                 // 线下支付金额
                 if (isset($constituteList['OFFLINE'])) {
@@ -1350,7 +1380,7 @@ class WholeController extends Curd
                 }
                 $params['order_amount_pay'] = $orderAmountPay;
             }
-            if (!empty($params['pay_category_constitute']) && in_array('MONEY', $params['pay_category_constitute'])) {  //线下付款
+            if (!empty($params['pay_category_constitute']) && in_array('MONEY', $params['pay_category_constitute'])) {  //现金付款
                 $order->order_status_system = $systemStatus;
                 $order->order_status_payment = 'SUCCESS';
                 $params['pay_category'] = 'MONEY';
@@ -1534,6 +1564,17 @@ class WholeController extends Curd
 
                 $appointment->save();
             }
+
+            // 2.4W 康养城
+            if ($params['goods_classify'] == 'VIP' && $order->order_status_payment == 'SUCCESS') {
+                $params['member_id'] = $params['join_order_member_id'];
+                Event::dispatch('order.kangyangCityVIP.grant', $params);
+            }
+
+            if ($order->order_is_complete == 'Y') {
+                Event::dispatch('order.complete', $params);
+            }
+
             Db::commit();
 
             // 打小票
@@ -1676,6 +1717,13 @@ class WholeController extends Curd
                     SysDept::where('dept_id', $orderConfigJson['tableid'])->update(['dept_status' => 'ACTIVED']);
                 }
             }
+            // 主表存取消时间吧
+            $orderExtendJson = [];
+            if (!empty($order->order_extend_json)) {
+                $orderExtendJson = json_decode($order->order_extend_json, true);
+            }
+            $orderExtendJson['cancel_times'] = date('Y-m-d H:i:s');
+            $order->order_extend_json = json_encode($orderExtendJson, JSON_UNESCAPED_UNICODE);
 
             $order->order_is_complete = 'Y';
             $order->order_status_system = 'CANCEL';
@@ -1710,8 +1758,18 @@ class WholeController extends Curd
         $params['goods_classify'] = $goodsClassifys[0];
         Db::beginTransaction();
         try {
+            // 使用优惠券
+            $couponUseJson = [];
+            if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
+                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                if ($couponResult['pay_amount'] != $params['order_amount_pay']) {
+                    throw new BusinessException("计算优惠后,实付金额错误!");
+                }
+                // 组装优惠券使用数据,存主表优惠里
+                $couponUseJson = $couponResult['use_coupon_json'];
+            }
             // 存储优惠信息
-            $params['order_discount_json'] = json_encode($this->discountRecord([], $params));
+            $params['order_discount_json'] = json_encode($this->discountRecord($couponUseJson, $params));
             // 验证库存
             foreach ($params['goodsContentList'] as $goods) {
                 // 减库存,规格和总库存
@@ -1780,13 +1838,16 @@ class WholeController extends Curd
             $systemStatus = 'SENDING';  // 待发货
             // 立即结算
             if ($params['settlement_now'] == 'Y') {
-                $params['order_is_complete'] = 'Y';
                 if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'VIP'])) {
+                    $params['order_is_complete'] = 'Y';
                     $systemStatus = 'DONE';
                 }
             }
 
             if ($params['settlement_now'] == 'Y' && ($params['pay_category'] == 'OFFLINE' || $params['pay_category'] == 'MONEY')) {
+                if ($params['pay_category'] == 'OFFLINE' && !empty($params['pay_category_sub'])) {
+                    $params['pay_category'] = $params['pay_category_sub'];
+                }
                 $params['order_status_system'] = $systemStatus;
                 $params['order_status_payment'] = 'SUCCESS';
             } else if ($params['settlement_now'] == 'Y' && $params['pay_category'] == 'CASH') {    // 余额支付
@@ -2176,6 +2237,9 @@ class WholeController extends Curd
                 $params['member_id'] = $params['join_order_member_id'];
                 Event::dispatch('order.kangyangCityVIP.grant', $params);
             }
+            if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y') {
+                Event::dispatch('order.complete', $params);
+            }
 
             Db::commit();
 
@@ -2274,8 +2338,18 @@ class WholeController extends Curd
 
         Db::beginTransaction();
         try {
+            // 使用优惠券
+            $couponUseJson = [];
+            if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
+                $couponResult = OrderService::payUseCoupon($params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
+                if ($couponResult['pay_amount'] != $params['order_amount_pay']) {
+                    throw new BusinessException("计算优惠后,实付金额错误!");
+                }
+                // 组装优惠券使用数据,存主表优惠里
+                $couponUseJson = $couponResult['use_coupon_json'];
+            }
             // 存储优惠信息
-            $params['order_discount_json'] = json_encode($this->discountRecord([], $params));
+            $params['order_discount_json'] = json_encode($this->discountRecord($couponUseJson, $params));
             $orderAmountPay = $params['order_amount_pay'];
             $constituteList = array_column($params['pay_category_constitute_list'], 'amount', 'category');
             // 验证金额
@@ -2344,7 +2418,7 @@ class WholeController extends Curd
             if (!empty($params['pay_category_constitute']) && in_array('OFFLINE', $params['pay_category_constitute'])) {      // 线下支付
                 $params['order_status_system'] = $systemStatus;
                 $params['order_status_payment'] = 'SUCCESS';
-                $params['pay_category'] = 'OFFLINE';
+                $params['pay_category'] = $params['pay_category_sub'] ?? 'OFFLINE';
 
                 // 线下支付金额
                 if (isset($constituteList['OFFLINE'])) {
@@ -2668,6 +2742,10 @@ class WholeController extends Curd
                 Event::dispatch('order.kangyangCityVIP.grant', $params);
             }
 
+            if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y') {
+                Event::dispatch('order.complete', $params);
+            }
+
             Db::commit();
 
             // 打小票
@@ -2895,6 +2973,10 @@ class WholeController extends Curd
                 $payPrepayid = $params['pay_category'];
             } else if ($params['pay_category'] == 'OFFLINE') {
                 $payPrepayid = 'OFFLINE';
+            } else if ($params['pay_category'] == 'OFFLINE_ALIPAY') {
+                $payPrepayid = 'OFFLINE_ALIPAY';
+            } else if ($params['pay_category'] == 'OFFLINE_WXPAY') {
+                $payPrepayid = 'OFFLINE_WXPAY';
             } else if ($params['pay_category'] == 'MONEY') {
                 $payPrepayid = 'MONEY';
             } else {
@@ -4091,7 +4173,7 @@ class WholeController extends Curd
             } elseif ($item['order_is_complete'] == 'R') {
                 $systemStatus = '售后已完成';
             }
-            
+
             if ($item['order_is_complete'] != 'R' && !empty($item['order_return_status']) && $item['order_return_status'] == 'PENDING') {
                 $systemStatus = '待处理';
             } elseif ($item['order_is_complete'] != 'R' && !empty($item['order_return_status']) && $item['order_return_status'] == 'DOING') {
@@ -4101,16 +4183,20 @@ class WholeController extends Curd
             } elseif ($item['order_is_complete'] != 'R' && !empty($item['order_return_status']) && $item['order_return_status'] == 'DISAGREE') {
                 $systemStatus = '不同意退款';
             }
+
             $payDetails = PayDetail::where('join_pay_order_id', $item['order_groupby'])
                 ->where('pay_status', 'SUCCESS')
-                ->where('pay_category','<>','REFUND')
+                ->where('pay_category', '<>', 'REFUND')
                 ->get()
                 ->toArray();
             if (count($payDetails) > 1) {
                 $payWay = '组合支付';
             } elseif (count($payDetails) == 1) {
                 $payWayEn = OrderService::getPayWayByPrepayId($payDetails[0]['pay_prepayid']);
-                $payWay = OrderService::$payWay[$payWayEn];
+                $payWay = '';
+                if (!empty($payWayEn)) {
+                    $payWay = OrderService::$payWay[$payWayEn];
+                }
             }
             if ($item['member']['member_mobile'] == '0000') {
                 $memberName = '散客';
@@ -4250,7 +4336,39 @@ class WholeController extends Curd
             Db::rollBack();
             return json_fail('修改订单状态失败');
         }
+    }
+
+    public function useCoupon(Request $request)
+    {
+        $goods = $request->post('goods', []);
+        $coupon = $request->post('coupon', []);
+        $payAmount = $request->post('pay_amount', 0);
+        $memberId = $request->post('member_id', '');
+        if (empty($goods) || empty($coupon) || empty($memberId)) {
+            return json_fail("参数异常");
+        }
+        foreach ($coupon as $item) {
+            if (!in_array(substr($item, 0, 2), ['CU', 'CO'])) {
+                return json_fail("参数异常");
+            }
+        }
+        $amountBalance = [
+            'pay_amount' => $payAmount,
+            'welfare_balance' => 0,
+            'cut_balance' => 0,
+        ];
+        foreach ($goods as $good) {
+            $result = OrderService::chooseCoupon($memberId, $goods, $good, $coupon, $amountBalance);
+            $amountBalance = [
+                'pay_amount' => $result['pay_amount'],
+                'welfare_balance' => $result['welfare_balance'],
+                'cut_balance' => $result['cut_balance'],
+            ];
+        }
+
+        Redis::del("ORDER:USE:COUPON:" . $memberId);
 
+        return json_success("success", ['pay_amount' => $amountBalance['pay_amount']]);
     }
 
     public static $goodsClassify = [

+ 37 - 0
app/admin/service/coupon/CouponDetailService.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace app\admin\service\coupon;
+
+use app\model\CouponDetail;
+use app\model\SysSerial;
+use support\exception\BusinessException;
+
+class CouponDetailService
+{
+    /**
+     * @Desc 手动发券
+     * @Author Gorden
+     * @Date 2024/8/27 9:57
+     *
+     * @param $params
+     * @return void
+     * @throws BusinessException
+     */
+    public static function customSendCoupon($params)
+    {
+        try {
+            CouponDetail::insert([
+                'coupon_detail_id' => 'CUDT' . str_pad(SysSerial::getSerial(), 6, '0') . random_string(6, 'up'),
+                'join_detail_coupon_id' => $params['coupon_id'],
+                'join_coupon_detail_member_id' => $params['member_id'],
+                'coupon_detail_status' => 'ACTIVED',
+                'coupon_detail_gain_datetime' => $params['coupon_detail_gain_datetime'],
+                'coupon_detail_deadline_datetime' => $params['coupon_detail_deadline_datetime'],
+                'coupon_detail_extend_json'=>json_encode(['gettype'=>'SEND']),
+                'coupon_detail_addtimes' => time(),
+            ]);
+        } catch (\Exception $e) {
+            throw new BusinessException('写入优惠券失败');
+        }
+    }
+}

+ 75 - 0
app/admin/service/coupon/CouponService.php

@@ -0,0 +1,75 @@
+<?php
+
+namespace app\admin\service\coupon;
+
+use app\model\CouponDetail;
+use support\Db;
+
+class CouponService
+{
+    /**
+     * @Desc 优惠券自动过期
+     * @Author Gorden
+     * @Date 2024/8/26 17:58
+     *
+     * @return void
+     */
+    public static function checkCouponExpired()
+    {
+        $couponDetails = Db::select("select * from app_coupon_detail where (coupon_detail_status = 'INIT' OR coupon_detail_status = 'PENDING' OR coupon_detail_status = 'ACTIVED' OR coupon_detail_status = 'WAITING') AND coupon_detail_deadline_datetime != '' AND CAST(UNIX_TIMESTAMP(coupon_detail_deadline_datetime) as SIGNED) < " . time());
+        foreach ($couponDetails as $detail) {
+            $endTimeUnix = strtotime($detail->coupon_detail_deadline_datetime);
+            if ($endTimeUnix < time()) {
+                CouponDetail::where('coupon_detail_id', $detail->coupon_detail_id)->update(['coupon_detail_status' => 'EXPIRED']);
+                echo $detail->coupon_detail_id . "已过期\n";
+            }
+        }
+    }
+
+    public static function couponClassifyInfo($classify, $category, $value, $limit)
+    {
+        try {
+            switch ($classify) {
+                case "满减券":
+                    if (!empty($limit) && $category == 'NORMAL') {
+                        return "满" . $limit . '减' . $value;
+                    }elseif (!empty($limit) && !empty($value) && $category == 'PIECE'){
+                        return "满" . intval($limit) . '件减' . $value;
+                    }
+                    break;
+                case "立减券":
+                    return "立减" . $value;
+                    break;
+                case "抵用券":
+                    return "抵用券";
+                    break;
+                case "折扣券":
+                    if (!empty($limit) && $category == 'NORMAL') {
+                        return "满" . $limit . '打' . ($value / 10) . '折';
+                    }else if (!empty($limit) && !empty($value) && $category == 'PIECE') {
+                        return "满" . intval($limit) . '件打' . ($value / 10) . '折';
+                    } else {
+                        return $value/10 . '折';
+                    }
+                    break;
+                case "赠品券":
+                    return "赠品券";
+                    break;
+                case "福利券":
+                    return '抵扣' . $value;
+                    break;
+                case "年卡":
+                    return "年卡";
+                    break;
+                case "季卡":
+                    return "季卡";
+                    break;
+                case "月卡":
+                    return "月卡";
+                    break;
+            }
+        } catch (\Exception $e) {
+        }
+
+    }
+}

+ 32 - 0
app/admin/service/order/OrderProcessService.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace app\admin\service\order;
+
+use app\model\OrderProcess;
+use support\Log;
+
+class OrderProcessService
+{
+    public static function insert($params)
+    {
+        try {
+            OrderProcess::insert([
+                'join_order_process_member_id' => $params['member_id'],
+                'join_order_process_user_id' => $params['user_id'] ?? '',
+                'join_order_process_dept_id' => $params['dept_id'] ?? 0,
+                'join_process_order_id' => $params['order_id'],
+                'order_process_key' => $params['process_key'],
+                'order_process_name' => $params['process_name'],
+                'order_process_json' => !empty($params['process_json']) ? json_encode($params['process_json']) : '[]',
+                'order_process_datetimes' => date('Y-m-d H:i:s'),
+                'order_process_remark' => $params['process_remark'] ?? '',
+                'order_process_extend_json' => !empty($params['process_extend_json']) ? json_encode($params['process_extend_json']) : '[]',
+                'order_process_addtimes' => time()
+            ]);
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            $params['msg'] = $e->getMessage();
+            Log::error("WRITE_ORDER_PROCESS_ERROR", $params);
+        }
+    }
+}

+ 356 - 8
app/admin/service/order/OrderService.php

@@ -2,6 +2,8 @@
 
 namespace app\admin\service\order;
 
+use app\model\CouponDetail;
+use app\model\CouponGoods;
 use app\model\GoodsRunning;
 use app\model\GoodsSku;
 use app\model\Member;
@@ -295,7 +297,6 @@ class OrderService
                 SupportLog::channel('pay')->error("FIND_WXPAY", ['msg' => '订单查询失败', 'order_id' => $orderId]);
                 return ['msg' => '订单查询失败'];
             }
-            dump('nbr-' . $nbr);
             sleep(5);
             SupportLog::channel('pay')->error("FIND_WXPAY", ['nbr' => $nbr, 'order_id' => $orderId]);
             return self::findWxpay($orderId, $nbr + 1);
@@ -420,17 +421,361 @@ class OrderService
         $categoryArray = explode('-', $prepayId);
         if (isset($categoryArray[1])) {
             $payWay = $categoryArray[1];
-        } else if (in_array($categoryArray[0], ['WXPAY', 'ALIPAY'])) {
-            $payWay = $categoryArray[0];
-        } else if ($categoryArray[0] == 'OFFLINE') {
-            $payWay = $categoryArray[0];
-        } else if ($categoryArray[0] == 'MONEY') {
+        } else if (in_array($categoryArray[0], ['WXPAY', 'ALIPAY', 'OFFLINE', 'OFFLINE_ALIPAY', 'OFFLINE_WXPAY', 'MONEY'])) {
             $payWay = $categoryArray[0];
         }
 
         return $payWay;
     }
 
+    /**
+     * @Desc 支付使用优惠券
+     * @Author Gorden
+     * @Date 2024/8/28 14:59
+     *
+     * @param $memberId
+     * @param $goods
+     * @param $coupon
+     * @param $payAmount
+     * @return array|mixed
+     */
+    public static function payUseCoupon($memberId, $goods, $coupon, $payAmount)
+    {
+        foreach ($coupon as $item) {
+            if (!in_array(substr($item, 0, 2), ['CU', 'CO'])) {
+                return $payAmount;
+            }
+        }
+        $amountBalance = [
+            'pay_amount' => $payAmount,
+            'welfare_balance' => 0,
+            'cut_balance' => 0,
+        ];
+        foreach ($goods as $good) {
+            $result = OrderService::useCoupon($memberId, $goods, $good, $coupon, $amountBalance);
+            $amountBalance = [
+                'pay_amount' => $result['pay_amount'],
+                'welfare_balance' => $result['welfare_balance'],
+                'cut_balance' => $result['cut_balance'],
+            ];
+        }
+
+        $couponDetailsIds = Redis::sMembers("ORDER:USE:COUPON:" . $memberId);
+        Redis::del("ORDER:USE:COUPON:" . $memberId);
+        $useCouponJson = Redis::get("ORDER:USE:COUPON:DISCOUNT:" . $memberId);
+        Redis::del("ORDER:USE:COUPON:DISCOUNT:" . $memberId);
+
+        return [
+            'pay_amount' => $amountBalance['pay_amount'],
+            'detail_ids' => $couponDetailsIds,
+            'use_coupon_json' => $useCouponJson ?? []
+        ];
+    }
+
+    public static function useCoupon($memberId, $goods, $good, $coupon, $amountBalance)
+    {
+        try {
+            $cacheKey = "ORDER:USE:COUPON:" . $memberId;
+            $cacheDiscountKey = "ORDER:USE:COUPON:DISCOUNT:" . $memberId;
+            $payAmount = $amountBalance['pay_amount'];
+            $welfareBalance = $amountBalance['welfare_balance'];
+            $cutBalance = $amountBalance['cut_balance'];
+            $goodsId = $good['goods_id'];
+            $money = $good['goods_sales_price'] * $good['nbr'];
+
+            $discountData = Redis::get($cacheDiscountKey);
+            if (empty($discountData)) {
+                $discountData = [];
+            } else {
+                $discountData = json_decode($discountData, true);
+            }
+            foreach ($coupon as $couponId) {
+                $couponDetail = CouponDetail::leftJoin('coupon_goods', 'coupon_goods.join_goods_coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
+                    ->leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
+                    ->select('coupon_detail.coupon_detail_id', 'coupon_goods.coupon_goods_id', 'coupon_id', 'coupon_classify', 'coupon_value', 'coupon_minimum_limit', 'coupon_category')
+                    ->where('coupon_goods.join_coupon_goods_id', $goodsId)
+                    ->where('coupon_goods.join_coupon_goods_sku_id', $good['sku_id'])
+                    ->where('join_goods_coupon_id', $couponId)
+                    ->where('coupon_detail.join_coupon_detail_member_id', $memberId)
+                    ->where('coupon_detail.coupon_detail_status', 'ACTIVED')
+                    ->first();
+                if (!$couponDetail) {
+                    continue;
+                }
+                // 计算优惠券包含的优惠商品的件数和总价
+                $countAndAmount = self::countAndAmount($goods, $couponId);
+                // 如果是计件
+                if ($couponDetail->coupon_category == 'PIECE' && $countAndAmount['count'] < $couponDetail->coupon_minimum_limit) {
+                    continue;
+                }
+                if (in_array($couponDetail->coupon_classify, ['立减券', '满减券'])) {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    if ($couponDetail->coupon_category == 'PIECE' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
+                        $payAmount = $payAmount - $couponDetail->coupon_value;
+                        // json记录
+                        $discountData[$couponId] = [
+                            'coupon_id' => $couponId,
+                            'coupon_value' => $couponDetail->coupon_value,
+                            'coupon_classify' => $couponDetail->coupon_classify,
+                            'coupon_detail_id' => [$couponDetail->coupon_detail_id]
+                        ];
+                        Redis::set($cacheDiscountKey, json_encode($discountData, JSON_UNESCAPED_UNICODE));
+                        CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED','coupon_detail_used_datetime'=>date('Y-m-d H:i:s')]);
+                    }
+                } elseif ($couponDetail->coupon_classify == '折扣券') {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    if ($couponDetail->coupon_category == 'PIECE' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
+                        $zhekouAmount = round($countAndAmount['amount'] * (100 - $couponDetail->coupon_value) / 100, 2);
+                        $payAmount = $payAmount - $zhekouAmount;
+                        // json记录
+                        $discountData[$couponId] = [
+                            'coupon_id' => $couponId,
+                            'coupon_value' => $zhekouAmount,
+                            'coupon_classify' => $couponDetail->coupon_classify,
+                            'coupon_detail_id' => [$couponDetail->coupon_detail_id]
+                        ];
+                        Redis::set($cacheDiscountKey, json_encode($discountData, JSON_UNESCAPED_UNICODE));
+                        CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED','coupon_detail_used_datetime'=>date('Y-m-d H:i:s')]);
+                    }
+                } elseif (in_array($couponDetail->coupon_classify, ['抵用券', '赠品券'])) {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED','coupon_detail_used_datetime'=>date('Y-m-d H:i:s')]);
+                    if ($good['nbr'] > 1) {
+                        $diyongAmount = $good['goods_sales_price'];
+                        $payAmount = $payAmount - $diyongAmount;
+                    } elseif (ceil($good['nbr']) == 1) {
+                        $diyongAmount = round($good['goods_sales_price'] * $good['nbr'], 2);
+                        $payAmount = $payAmount - $diyongAmount;
+                    }
+                    // json记录
+                    $discountData[$couponId] = [
+                        'coupon_id' => $couponId,
+                        'coupon_value' => $diyongAmount,
+                        'coupon_classify' => $couponDetail->coupon_classify,
+                        'coupon_detail_id' => [$couponDetail->coupon_detail_id]
+                    ];
+                    Redis::set($cacheDiscountKey, json_encode($discountData, JSON_UNESCAPED_UNICODE));
+                } elseif ($couponDetail->coupon_classify == '福利券') {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    CouponDetail::where('coupon_detail_id', $couponDetail->coupon_detail_id)->update(['coupon_detail_status' => 'USED','coupon_detail_used_datetime'=>date('Y-m-d H:i:s')]);
+                    $fuliAmount = 0;
+                    if (!empty($couponDetail->coupon_value)) {
+                        $fuliAmount = $couponDetail->coupon_value;
+                    }
+
+                    if ($fuliAmount >= $countAndAmount['amount']) {
+                        $preferentialAmount = $countAndAmount['amount'];
+                    }else{
+                        $preferentialAmount = $fuliAmount;
+                    }
+                    $payAmount = $payAmount - $preferentialAmount;
+
+                    // json记录
+                    $discountData[$couponId] = [
+                        'coupon_id' => $couponId,
+                        'coupon_value' => $preferentialAmount,
+                        'coupon_classify' => $couponDetail->coupon_classify,
+                        'coupon_detail_id' => [$couponDetail->coupon_detail_id]
+                    ];
+                    Redis::set($cacheDiscountKey, json_encode($discountData, JSON_UNESCAPED_UNICODE));
+                } elseif (in_array($couponDetail->coupon_classify, ['年卡', '季卡', '月卡'])) {
+                    if (Redis::sIsMember($cacheKey, $couponId) || Redis::sIsMember($cacheKey, $goodsId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    Redis::sAdd($cacheKey, $goodsId);
+                    $kaAmount = 0;
+                    if (!empty($discountData[$couponId]['coupon_value'])) {
+                        $kaAmount = $discountData[$couponId]['coupon_value'];
+                    }
+                    if ($good['nbr'] > 1) {
+                        $payAmount = $payAmount - $good['goods_sales_price'];
+                        $kaAmount = $good['goods_sales_price'];
+                    } else {
+                        $payAmount = $payAmount - $good['goods_sales_price'] * $good['nbr'];
+                        $kaAmount = $good['goods_sales_price'] * $good['nbr'];
+                    }
+
+                    // json记录
+                    $discountData[$couponId] = [
+                        'coupon_id' => $couponId,
+                        'coupon_value' => $kaAmount,
+                        'coupon_classify' => $couponDetail->coupon_classify,
+                        'coupon_detail_id' => [$couponDetail->coupon_detail_id]
+                    ];
+                    Redis::set($cacheDiscountKey, json_encode($discountData, JSON_UNESCAPED_UNICODE));
+                }
+            }
+
+            if ($payAmount < 0) {
+                $payAmount = 0;
+            }
+            $amountBalance = [
+                'pay_amount' => round($payAmount, 2),
+                'welfare_balance' => 0,
+                'cut_balance' => 0
+            ];
+            return $amountBalance;
+        } catch (\Exception $e) {
+            Redis::del("ORDER:USE:COUPON:" . $memberId);
+            Redis::del("ORDER:USE:COUPON:DISCOUNT:" . $memberId);
+            dump($e->getTrace());
+        }
+    }
+
+    /**
+     * @Desc 选择优惠券,计算
+     * @Author Gorden
+     * @Date 2024/8/28 14:18
+     *
+     * @param $memberId
+     * @param $goods
+     * @param $good
+     * @param $coupon
+     * @param $amountBalance
+     * @return array|void
+     */
+    public static function chooseCoupon($memberId, $goods, $good, $coupon, $amountBalance)
+    {
+        try {
+            $cacheKey = "ORDER:USE:COUPON:" . $memberId;
+            $payAmount = $amountBalance['pay_amount'];
+            $welfareBalance = $amountBalance['welfare_balance'];
+            $cutBalance = $amountBalance['cut_balance'];
+            $goodsId = $good['goods_id'];
+            $money = $good['goods_sales_price'] * $good['nbr'];
+            foreach ($coupon as $couponId) {
+                $couponDetail = CouponDetail::leftJoin('coupon_goods', 'coupon_goods.join_goods_coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
+                    ->leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
+                    ->select('coupon_detail.coupon_detail_id', 'coupon_goods.coupon_goods_id', 'coupon_id', 'coupon_classify', 'coupon_value', 'coupon_minimum_limit', 'coupon_category')
+                    ->where('coupon_goods.join_coupon_goods_id', $goodsId)
+                    ->where('coupon_goods.join_coupon_goods_sku_id', $good['sku_id'])
+                    ->where('join_goods_coupon_id', $couponId)
+                    ->where('coupon_detail.join_coupon_detail_member_id', $memberId)
+                    ->where('coupon_detail.coupon_detail_status', 'ACTIVED')
+                    ->first();
+                if (!$couponDetail) {
+                    continue;
+                }
+                // 计算优惠券包含的优惠商品的件数和总价
+                $countAndAmount = self::countAndAmount($goods, $couponId);
+                // 如果是计件
+                if ($couponDetail->coupon_category == 'PIECE' && $countAndAmount['count'] < $couponDetail->coupon_minimum_limit) {
+                    continue;
+                }
+                if (in_array($couponDetail->coupon_classify, ['立减券', '满减券'])) {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    if ($couponDetail->coupon_category == 'PIECE' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
+                        $payAmount = $payAmount - $couponDetail->coupon_value;
+                    }
+                } elseif ($couponDetail->coupon_classify == '折扣券') {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    if ($couponDetail->coupon_category == 'PIECE' || ($couponDetail->coupon_category == 'NORMAL' && $countAndAmount['amount'] >= $couponDetail->coupon_minimum_limit)) {
+                        $zhekouAmount = round($countAndAmount['amount'] * (100 - $couponDetail->coupon_value) / 100, 2);
+                        $payAmount = $payAmount - $zhekouAmount;
+                    }
+                } elseif (in_array($couponDetail->coupon_classify, ['抵用券', '赠品券'])) {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    if ($good['nbr'] > 1) {
+                        $diyongAmount = $good['goods_sales_price'];
+                        $payAmount = $payAmount - $diyongAmount;
+                    } elseif (ceil($good['nbr']) == 1) {
+                        $diyongAmount = round($good['goods_sales_price'] * $good['nbr'], 2);
+                        $payAmount = $payAmount - $diyongAmount;
+                    }
+                } elseif ($couponDetail->coupon_classify == '福利券') {
+                    if (Redis::sIsMember($cacheKey, $couponId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    $fuliAmount = 0;
+                    if (!empty($couponDetail->coupon_value)) {
+                        $fuliAmount = $couponDetail->coupon_value;
+                    }
+                    if ($fuliAmount >= $countAndAmount['amount']) {
+                        $preferentialAmount = $countAndAmount['amount'];
+                    }else{
+                        $preferentialAmount = $fuliAmount;
+                    }
+                    $payAmount = $payAmount - $preferentialAmount;
+                } elseif (in_array($couponDetail->coupon_classify, ['年卡', '季卡', '月卡'])) {
+                    if (Redis::sIsMember($cacheKey, $couponId) || Redis::sIsMember($cacheKey, $goodsId)) {
+                        continue;
+                    }
+                    Redis::sAdd($cacheKey, $couponId);
+                    Redis::sAdd($cacheKey, $goodsId);
+                    if ($good['nbr'] > 1) {
+                        $payAmount = $payAmount - $good['goods_sales_price'];
+                    } else {
+                        $payAmount = $payAmount - $good['goods_sales_price'] * $good['nbr'];
+                    }
+
+                }
+            }
+
+            if ($payAmount < 0) {
+                $payAmount = 0;
+            }
+            $amountBalance = [
+                'pay_amount' => round($payAmount, 2),
+                'welfare_balance' => $welfareBalance,
+                'cut_balance' => $cutBalance
+            ];
+            return $amountBalance;
+        } catch (\Exception $e) {
+            Redis::del("ORDER:USE:COUPON:" . $memberId);
+            Redis::del("ORDER:USE:COUPON:DISCOUNT:" . $memberId);
+            dump($e->getTrace());
+        }
+    }
+
+    public static function countAndAmount($goods, $couponId)
+    {
+        try {
+            $goodsIds = array_column($goods, 'goods_id');
+            $couponGoods = CouponGoods::whereIn('join_coupon_goods_id', $goodsIds)
+                ->where('join_goods_coupon_id', $couponId)
+                ->select('join_coupon_goods_id', 'join_coupon_goods_sku_id')
+                ->get()
+                ->toArray();
+            $count = 0;
+            $amount = 0;
+            foreach ($couponGoods as $couponGood) {
+                foreach ($goods as $good) {
+                    if ($good['goods_id'] == $couponGood['join_coupon_goods_id'] && $good['sku_id'] == $couponGood['join_coupon_goods_sku_id']) {
+                        $count += $good['nbr'];
+                        $amount += $good['goods_sales_price'] * $good['nbr'];
+                    }
+                }
+            }
+
+            return compact('count', 'amount');
+        } catch (\Exception $e) {
+            dump($e->getTrace());
+        }
+    }
+
 
     public static $couponClassify = [
         'wipe' => '抹零',
@@ -438,14 +783,17 @@ class OrderService
     ];
 
     public static $payWay = [
-        'WXPAY'=>'微信支付',
+        'WXPAY' => '微信支付',
         'ALIPAY' => '支付宝',
         'CASH' => '账户余额',
         'CARD' => '储值卡',
         'WELFARE' => '福利账户',
         'MONEY' => '现金',
         'OFFLINE' => '线下支付',
+        'OFFLINE_WXPAY' => '线下支付-微信',
+        'OFFLINE_ALIPAY' => '线下支付-支付宝',
         'QRCODE' => '付款码',
-        'NONE' => '付零'
+        'NONE' => '付零',
+        'VIP' => 'VIP账户'
     ];
 }

+ 9 - 5
app/admin/service/statistics/MemberService.php

@@ -22,7 +22,11 @@ class MemberService
         $data['todayCount'] = Member::where('member_addtimes', '>', $todayTime)->where('member_is_owner', 'N')->count();
         // 本月新增用户数
         $monthTime = strtotime(date('Y-m-01 00:00:00'));
-        $data['monthCount'] = Member::where('member_addtimes', '>', $monthTime)->where('member_mobile', '<>', '0000')->where('member_is_owner', 'N')->count();
+        $monthEndTime = strtotime(date('y-m-t 23:59:59'));
+        $data['monthCount'] = Member::whereBetween('member_addtimes', [$monthTime, $monthEndTime])
+            ->where('member_is_owner', 'N')
+            ->where('member_mobile', '<>', '0000')
+            ->count();
 
         // 折线图-会员
         $newAddition = Db::select("
@@ -35,13 +39,13 @@ class MemberService
             order by month asc ");
         $newAddition12Month = [];
         $months = month_12();
-        foreach ($months as $key => $month){
-            foreach ($newAddition as $item){
-                if ($month == $item->month){
+        foreach ($months as $key => $month) {
+            foreach ($newAddition as $item) {
+                if ($month == $item->month) {
                     $newAddition12Month[$key] = $item;
                 }
             }
-            if (!isset($newAddition12Month[$key])){
+            if (!isset($newAddition12Month[$key])) {
                 $std = new \stdClass();
                 $std->month = $month;
                 $std->num = 0;

+ 23 - 4
app/event/order/KangyangCityEvent.php

@@ -8,13 +8,26 @@ use app\model\Goods;
 use app\model\Member;
 use app\model\MemberAccount;
 use app\model\SysSerial;
+use support\Log;
 
 class KangyangCityEvent
 {
     public function grant($params)
     {
         // 会员VIP 标识
-        Member::where('member_id', $params['member_id'])->update(['member_is_vip' => 'Y']);
+        $member = Member::where('member_id', $params['member_id'])->select('member_mobile', 'member_is_vip', 'member_extend_json')->first();
+        $memberUpdateData = [
+            'member_is_vip' => 'Y'
+        ];
+        if (!empty($params['referee'])) {
+            $memberExtendJson = [];
+            if (!empty($member->member_extend_json)) {
+                $memberExtendJson = json_decode($member->member_extend_json, true);
+            }
+            $memberExtendJson['referee'][date('Y-m-d H:i:s')] = $params['referee'];
+            $memberUpdateData['member_extend_json'] = json_encode($memberExtendJson, JSON_UNESCAPED_UNICODE);
+        }
+        Member::where('member_id', $params['member_id'])->update($memberUpdateData);
         // 康养城VIP账户
         $memberAccount = MemberAccount::where('join_account_member_id', $params['member_id'])->where('member_account_classify', 'VIP')->first();
         if (!$memberAccount) {
@@ -48,14 +61,14 @@ class KangyangCityEvent
                         continue;
                     }
                     // 券是否过期
-                    if (!empty($couponModel->coupon_validdate_end) && strtotime($couponModel->coupon_validdate_end) < time()){
+                    if (!empty($couponModel->coupon_validdate_end) && strtotime($couponModel->coupon_validdate_end) < time()) {
                         continue;
                     }
                     $endDate = '';
                     if (!empty($couponModel->coupon_validdate_end)) {
                         $endDate = $couponModel->coupon_validdate_end;
                     } elseif ($couponModel->coupon_validdate_day > 0) {
-                        $endDate = date('Y-m-d H:i:s', time() + ($couponModel->coupon_validdate_day * 24 * 3600));
+                        $endDate = date('Y-m-d H:i:s', time() + ($couponModel->coupon_validdate_day * 24 * 3600) - 1);
                     }
 
                     $num = $coupon['num'];
@@ -68,12 +81,18 @@ class KangyangCityEvent
                             'coupon_detail_gain_datetime' => date('Y-m-d H:i:s'),
                             'coupon_detail_deadline_datetime' => $endDate,
                             'coupon_detail_json' => '[]',
-                            'coupon_detail_extend_json' => json_encode(['gettype'=>'VIP']),
+                            'coupon_detail_extend_json' => json_encode(['gettype' => 'VIP']),
                             'coupon_detail_addtimes' => time()
                         ]);
                     }
                 }
             }
         }
+        // 通知判客
+        if (!empty($member->member_mobile)) {
+            $url = getenv("MARKET_NOTICE_DOMAIN") . '/custom/market_custom/update';
+            $result = http_post($url, ['mobile' => $member->member_mobile]);
+            Log::info("MARKET_NOTICE_" . $member->member_mobile, json_decode($result, true));
+        }
     }
 }

+ 33 - 2
app/event/order/OrderProcessEvent.php

@@ -1,11 +1,42 @@
 <?php
 
-namespace app\event;
+namespace app\event\order;
+
+use app\admin\service\order\OrderProcessService;
+use app\model\OrderProcess;
+use support\Log;
+use Tinywan\Jwt\JwtToken;
 
 class OrderProcessEvent
 {
-    public function insert($params)
+    public function orderComplete($params)
     {
+        try {
+            $userId = JwtToken::getCurrentId();
+        } catch (\Exception $e) {
+        }
 
+        try {
+            $data = [
+                'process_key' => 'DONE',
+                'process_name' => '订单完成',
+                'user_id' => $userId ?? '',
+                'process_json' => $params
+            ];
+            if (!empty($params['join_order_member_id'])) {
+                $data['member_id'] = $params['join_order_member_id'];
+            }
+            if (!empty($params['orderId'])) {
+                $data['order_id'] = $params['orderId'];
+            }
+            if (!empty($params['submit_premises_id'])) {
+                $data['dept_id'] = $params['submit_premises_id'];
+            }
+            OrderProcessService::insert($data);
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            $params['msg'] = $e->getMessage();
+            Log::error("WRITE_ORDER_PROCESS_ERROR", $params);
+        }
     }
 }

+ 23 - 0
app/model/OrderProcess.php

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

+ 3 - 0
config/event.php

@@ -15,5 +15,8 @@ return [
     ],
     'order_pay.member_level.up' => [
         [\app\event\MemberLevelEvent::class,'payOrderLevelUp']
+    ],
+    'order.complete' => [
+        [\app\event\order\OrderProcessEvent::class,'orderComplete']
     ]
 ];

+ 4 - 0
process/Task.php

@@ -4,6 +4,7 @@ namespace process;
 
 use app\admin\controller\notify\RechargeController;
 use app\admin\service\client\MessageService;
+use app\admin\service\coupon\CouponService;
 use app\admin\service\goods\GoodsService;
 use app\admin\service\order\OrderService;
 use app\admin\service\order\PayDetailService;
@@ -28,6 +29,9 @@ class Task
 
             // 会员消息 30分钟未读,发送站内信
             MessageService::unreadChatMessage();
+
+            // 优惠券自动过期
+            CouponService::checkCouponExpired();
         });
 
         // 每天的2点执行,注意这里省略了秒位

+ 2 - 0
route/admin.php

@@ -870,6 +870,7 @@ Route::group('/admin', function () {
             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('/customSend', [\app\admin\controller\coupon\CouponController::class, 'customSend']);
             Route::post('/update', [\app\admin\controller\coupon\CouponController::class, 'update']);
             Route::delete('/delete', [\app\admin\controller\coupon\CouponController::class, 'delete']);
         })->middleware([
@@ -879,6 +880,7 @@ Route::group('/admin', function () {
             Route::get('/list', [\app\admin\controller\coupon\CouponDetailController::class, 'select']);
             Route::get('/info', [\app\admin\controller\coupon\CouponDetailController::class, 'info']);
             Route::post('/updateStatus', [\app\admin\controller\coupon\CouponDetailController::class, 'updateStatus']);
+            Route::get('/myCouponGrouping',[\app\admin\controller\coupon\CouponDetailController::class,'myCouponGrouping']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);