Browse Source

Merge branch 'dev'

gorden 6 months ago
parent
commit
8490c42c44

+ 2 - 2
app/admin/controller/finance/IncomeAndExpendController.php

@@ -63,7 +63,7 @@ class IncomeAndExpendController
                     ->groupBy('data_income_pay_type')
                     ->first();
 
-                $qrcode = Db::table("data_income_{$month}")
+                $money = Db::table("data_income_{$month}")
                     ->where('data_income_days', $currentDay)
                     ->where('data_income_pay_type', 'MONEY')
                     ->whereIn('join_data_income_dept_id', $premisesKey)
@@ -76,7 +76,7 @@ class IncomeAndExpendController
             $statistics['income_wxpay'] += $dayData['income']['wxpay'];
             $dayData['income']['alipay'] = $alipay->data_income_amount ?? 0.00;
             $statistics['income_alipay'] += $dayData['income']['alipay'];
-            $dayData['income']['money'] = $qrcode->data_income_amount ?? 0.00;
+            $dayData['income']['money'] = $money->data_income_amount ?? 0.00;
             $statistics['income_money'] += $dayData['income']['money'];
 
             $dayData['income']['amount'] = $dayData['income']['wxpay'] + $dayData['income']['alipay'] + $dayData['income']['money'];

+ 87 - 15
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\Coupon;
 use app\model\CouponDetail;
 use app\model\Family;
 use app\model\FamilyMember;
@@ -473,31 +474,31 @@ class MemberController
             ->select('coupon.coupon_name', 'coupon.coupon_classify')
             ->get()
             ->toArray();
-        $data = ['manjian'=>0,'diyong'=>0,'zhekou'=>0,'lijian'=>0,'zengpin'=>0,'fuli'=>0,'nianka'=>0,'jika'=>0,'yueka'=>0];
+        $data = ['manjian' => 0, 'diyong' => 0, 'zhekou' => 0, 'lijian' => 0, 'zengpin' => 0, 'fuli' => 0, 'nianka' => 0, 'jika' => 0, 'yueka' => 0];
         foreach ($coupons as $item) {
-            if ($item['coupon_classify'] == '满减券'){
+            if ($item['coupon_classify'] == '满减券') {
                 $data['manjian'] += 1;
-            }elseif ($item['coupon_classify'] == '抵用券'){
+            } elseif ($item['coupon_classify'] == '抵用券') {
                 $data['diyong'] += 1;
-            }elseif ($item['coupon_classify'] == '折扣券'){
+            } elseif ($item['coupon_classify'] == '折扣券') {
                 $data['zhekou'] += 1;
-            }elseif ($item['coupon_classify'] == '立减券'){
+            } elseif ($item['coupon_classify'] == '立减券') {
                 $data['lijian'] += 1;
-            }elseif ($item['coupon_classify'] == '赠品券'){
+            } elseif ($item['coupon_classify'] == '赠品券') {
                 $data['zengpin'] += 1;
-            }elseif ($item['coupon_classify'] == '福利券'){
+            } elseif ($item['coupon_classify'] == '福利券') {
                 $data['fuli'] += 1;
-            }elseif ($item['coupon_classify'] == '年卡'){
+            } elseif ($item['coupon_classify'] == '年卡') {
                 $data['nianka'] += 1;
-            }elseif ($item['coupon_classify'] == '季卡'){
+            } elseif ($item['coupon_classify'] == '季卡') {
                 $data['jika'] += 1;
-            }elseif ($item['coupon_classify'] == '月卡'){
+            } elseif ($item['coupon_classify'] == '月卡') {
                 $data['yueka'] += 1;
             }
         }
-        $data['total'] = $data['manjian']+$data['diyong']+$data['zhekou']+$data['lijian']+$data['zengpin']+$data['fuli']+$data['nianka']+$data['jika']+$data['yueka'];
+        $data['total'] = $data['manjian'] + $data['diyong'] + $data['zhekou'] + $data['lijian'] + $data['zengpin'] + $data['fuli'] + $data['nianka'] + $data['jika'] + $data['yueka'];
 
-        return json_success('',$data);
+        return json_success('', $data);
     }
 
     /**
@@ -528,9 +529,16 @@ class MemberController
         ])
             ->leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
             ->where('join_coupon_detail_member_id', $memberId)
-            ->where('coupon.coupon_classify', $classify);
+            ->where('coupon.coupon_classify', $classify)
+            ->groupBy('join_coupon_detail_member_id', 'join_detail_coupon_id');
         $total = $coupons->count();
-        $rows = $coupons->select('coupon_detail.*', 'coupon.coupon_name', 'coupon.coupon_classify','coupon_value')
+        $rows = $coupons->select('coupon_detail.join_coupon_detail_member_id', 'coupon_detail.join_detail_coupon_id'
+            , 'coupon.coupon_name', 'coupon.coupon_classify', 'coupon.coupon_value')
+            ->selectRaw('COUNT(1) as total, 
+                COUNT(IF(app_coupon_detail.coupon_detail_status="USED",1,NULL)) as used_total, 
+                COUNT(IF(app_coupon_detail.coupon_detail_status="ACTIVED" or app_coupon_detail.coupon_detail_status="WAITING",1,NULL)) as unused_total,
+                MAX(app_coupon_detail.coupon_detail_deadline_datetime) as deadline_datetime')
+            ->orderBy('deadline_datetime','DESC')
             ->forPage($page, $pageSize)
             ->get()
             ->toArray();
@@ -549,7 +557,71 @@ class MemberController
             $item['member_name'] = MemberService::getMemberName($mobile, $certName, $nickname);
             unset($item['member'], $item['cert'], $item['info']);
 
-            $data[$item['coupon_classify']][] = $item;
+            $item['invalid_total'] = $item['total'] - $item['used_total'] - $item['unused_total'];
+            // 优惠券分类
+            $coupon = Coupon::with('category')->where('coupon_id', $item['join_detail_coupon_id'])
+                ->select('coupon_id', 'join_coupon_category_id')
+                ->first();
+            if (!empty($coupon) && !empty($coupon->category)) {
+                $item['category_name'] = $coupon->category->category_name;
+            }
+        }
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+
+    /**
+     * @Desc 我的卡券 领取记录
+     * @Author Gorden
+     * @Date 2024/8/22 18:45
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
+    public function couponDetail(Request $request)
+    {
+        $memberId = $request->get('member_id', '');
+        $couponId = $request->get('coupon_id', '');
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 20);
+
+        $coupons = CouponDetail::with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            },
+            'info' => function ($query) {
+                $query->select('join_info_member_id', 'member_info_nickname');
+            }
+        ])
+            ->leftJoin('coupon', 'coupon.coupon_id', '=', 'coupon_detail.join_detail_coupon_id')
+            ->where('join_coupon_detail_member_id', $memberId)
+            ->where('coupon.coupon_id', $couponId);
+        $total = $coupons->count();
+        $rows = $coupons->select('coupon_detail.*', 'coupon.coupon_name', 'coupon.coupon_classify', 'coupon.coupon_value')
+            ->orderBy('coupon_detail_deadline_datetime', 'desc')
+            ->forPage($page, $pageSize)
+            ->get()
+            ->toArray();
+
+        foreach ($rows as &$item) {
+            $mobile = $certName = $nickname = '';
+            if (!empty($item['member']) && !empty($item['member']['member_mobile'])) {
+                $mobile = $item['member']['member_mobile'];
+            }
+            if (!empty($item['cert']) && !empty($item['cert']['member_cert_name'])) {
+                $certName = $item['cert']['member_cert_name'];
+            }
+            if (!empty($item['info']) && !empty($item['info']['member_info_nickname'])) {
+                $nickname = $item['info']['member_info_nickname'];
+            }
+            $item['member_name'] = MemberService::getMemberName($mobile, $certName, $nickname);
+            unset($item['member'], $item['cert'], $item['info']);
+            if (!empty($coupon) && !empty($coupon->category)) {
+                $item['category_name'] = $coupon->category->category_name;
+            }
         }
 
         return json_success('', compact('rows', 'page', 'pageSize', 'total'));

+ 109 - 50
app/admin/controller/member/WriteOffController.php

@@ -3,7 +3,9 @@
 namespace app\admin\controller\member;
 
 use app\controller\Curd;
+use app\model\Appointment;
 use app\model\MemberBenefit;
+use app\model\MemberQuota;
 use app\model\RuleAddedComponent;
 use app\model\SysUser;
 use support\Db;
@@ -20,55 +22,54 @@ class WriteOffController extends Curd
     {
         $page = $request->get('page', 1);
         $pageSize = $request->get('pageSize', 50);
-        $keywords = $request->get('keywords','');
-        $userId = $request->get('user_id','');
-        $premises = $request->get('premises','');
-        $date = $request->get('date',[]);
+        $keywords = $request->get('keywords', '');
+        $userId = $request->get('user_id', '');
+        $premises = $request->get('premises', '');
+        $date = $request->get('date', []);
 
         $appointmentList = Db::table('appointment')
-            ->leftJoin('member','member.member_id' ,'=','appointment.join_appointment_member_id')
-            ->leftJoin('member_cert','member_cert.join_cert_member_id' ,'=','appointment.join_appointment_member_id')
-            ->select('appointment.appointment_id as quota_id', 'appointment.join_appointment_member_id as member_id','appointment.appointment_classify as classify', 'appointment.appointment_done_json as used_json', 'appointment.appointment_done_datetime as used_time','appointment.join_appointment_member_benefit_id as benefit_id',
-                'member.member_mobile','member_cert.member_cert_name'
+            ->leftJoin('member', 'member.member_id', '=', 'appointment.join_appointment_member_id')
+            ->leftJoin('member_cert', 'member_cert.join_cert_member_id', '=', 'appointment.join_appointment_member_id')
+            ->select('appointment.appointment_id as quota_id', 'appointment.join_appointment_member_id as member_id', 'appointment.appointment_classify as classify', 'appointment.appointment_done_json as used_json', 'appointment.appointment_done_datetime as used_time', 'appointment.join_appointment_member_benefit_id as benefit_id',
+                'member.member_mobile', 'member_cert.member_cert_name','appointment_extend_json as extend_json'
             )
-            ->when($keywords != '',function($query) use ($keywords){
-                $query->where('member.member_mobile','like','%'.$keywords.'%');
-            })->when(!empty($date),function($query) use ($date){
-                $date[0] = date('Y-m-d',strtotime($date[0])).' 00:00:00';
-                $date[1] = date('Y-m-d',strtotime($date[1])). ' 23:59:59';
-                $query->whereBetween('appointment.appointment_done_datetime',$date);
+            ->when($keywords != '', function ($query) use ($keywords) {
+                $query->where('member.member_mobile', 'like', '%' . $keywords . '%');
+            })->when(!empty($date), function ($query) use ($date) {
+                $date[0] = date('Y-m-d', strtotime($date[0])) . ' 00:00:00';
+                $date[1] = date('Y-m-d', strtotime($date[1])) . ' 23:59:59';
+                $query->whereBetween('appointment.appointment_done_datetime', $date);
             })
-            ->when($userId != '',function($query) use ($userId){
-                $query->whereJsonContains('appointment.appointment_done_json->charge->charge_user_id',$userId);
+            ->when($userId != '', function ($query) use ($userId) {
+                $query->whereJsonContains('appointment.appointment_done_json->charge->charge_user_id', $userId);
             })
-            ->when($premises != '',function($query) use ($premises){
-                $query->whereJsonContains('appointment.appointment_done_json->charge->charge_premises',$premises);
+            ->when($premises != '', function ($query) use ($premises) {
+                $query->whereJsonContains('appointment.appointment_done_json->charge->charge_premises', $premises);
             })
             ->where('appointment_status', 'DONE');
         $quotaList = Db::table('member_quota')
-            ->leftJoin('member','member.member_id' ,'=','member_quota.join_quota_member_id')
-            ->leftJoin('member_cert','member_cert.join_cert_member_id' ,'=','member_quota.join_quota_member_id')
-            ->select('member_quota.member_quota_id as quota_id', 'member_quota.join_quota_member_id as member_id','member_quota.member_quota_category as classify', 'member_quota.member_quota_used_json as used_json', "member_quota.member_quota_extend_json->writeOffTime as used_time","member_quota.join_member_rule_added_component_id as benefit_id",
-                'member.member_mobile','member_cert.member_cert_name')
-                
-            ->when($keywords != '',function($query) use ($keywords){
-                $query->where('member.member_mobile','like','%'.$keywords.'%');
-            })->when(!empty($date),function($query) use ($date){
-                $date[0] = date('Y-m-d',strtotime($date[0])).' 00:00:00';
-                $date[1] = date('Y-m-d',strtotime($date[1])). ' 23:59:59';
-                $query->whereBetween('member_quota.member_quota_extend_json->writeOffTime',$date);
+            ->leftJoin('member', 'member.member_id', '=', 'member_quota.join_quota_member_id')
+            ->leftJoin('member_cert', 'member_cert.join_cert_member_id', '=', 'member_quota.join_quota_member_id')
+            ->select('member_quota.member_quota_id as quota_id', 'member_quota.join_quota_member_id as member_id', 'member_quota.member_quota_category as classify', 'member_quota.member_quota_used_json as used_json', "member_quota.member_quota_extend_json->writeOffTime as used_time", "member_quota.join_member_rule_added_component_id as benefit_id",
+                'member.member_mobile', 'member_cert.member_cert_name','member_quota_extend_json as extend_json')
+            ->when($keywords != '', function ($query) use ($keywords) {
+                $query->where('member.member_mobile', 'like', '%' . $keywords . '%');
+            })->when(!empty($date), function ($query) use ($date) {
+                $date[0] = date('Y-m-d', strtotime($date[0])) . ' 00:00:00';
+                $date[1] = date('Y-m-d', strtotime($date[1])) . ' 23:59:59';
+                $query->whereBetween('member_quota.member_quota_extend_json->writeOffTime', $date);
             })
-            ->when($userId != '',function($query) use ($userId){
-                $query->whereJsonContains('member_quota.member_quota_used_json->charge->charge_user_id',$userId);
+            ->when($userId != '', function ($query) use ($userId) {
+                $query->whereJsonContains('member_quota.member_quota_used_json->charge->charge_user_id', $userId);
             })
-            ->when($premises != '',function($query) use ($premises){
-                $query->whereJsonContains('member_quota.member_quota_used_json->charge->charge_premises',$premises);
+            ->when($premises != '', function ($query) use ($premises) {
+                $query->whereJsonContains('member_quota.member_quota_used_json->charge->charge_premises', $premises);
             })
             ->where('member_quota_status', 'USED')
             ->union($appointmentList);
-            $total = $quotaList->count('*');
+        $total = $quotaList->count('*');
 
-            $quotaList = $quotaList->orderBy('used_time', 'DESC')
+        $quotaList = $quotaList->orderBy('used_time', 'DESC')
             ->forPage($page, $pageSize)
             ->get();
 
@@ -78,23 +79,30 @@ class WriteOffController extends Curd
             $premises = '';
             $benefitName = '';
             if (!empty($item->used_json)) {
-                $usedJson = json_decode($item->used_json,true);
-                if (isset($usedJson['charge']) && isset($usedJson['charge']['charge_user_id'])){
-                    $username = SysUser::where('user_id',$usedJson['charge']['charge_user_id'])->value('user_name');
+                $usedJson = json_decode($item->used_json, true);
+                if (isset($usedJson['charge']) && isset($usedJson['charge']['charge_user_id'])) {
+                    $username = SysUser::where('user_id', $usedJson['charge']['charge_user_id'])->value('user_name');
                 }
-                if (isset($usedJson['charge']) && isset($usedJson['charge']['charge_premises'])){
+                if (isset($usedJson['charge']) && isset($usedJson['charge']['charge_premises'])) {
                     $premises = $usedJson['charge']['charge_premises'];
                 }
-                if (substr($item->quota_id,0,2) == 'AP'){
-                    $benefitName = MemberBenefit::where('member_benefit_id',$item->benefit_id)->value('member_benefit_name');
-                }elseif (substr($item->quota_id,0,2) == 'MQ'){
-                    $benefitName = RuleAddedComponent::where('rule_added_component_id',$item->benefit_id)->value('rule_added_component_name');
+                if (substr($item->quota_id, 0, 2) == 'AP') {
+                    $benefitName = MemberBenefit::where('member_benefit_id', $item->benefit_id)->value('member_benefit_name');
+                } elseif (substr($item->quota_id, 0, 2) == 'MQ') {
+                    $benefitName = RuleAddedComponent::where('rule_added_component_id', $item->benefit_id)->value('rule_added_component_name');
+                }
+            }
+            $remark = [];
+            if (!empty($item->extend_json)){
+                $extendJson = json_decode($item->extend_json,true);
+                if (isset($extendJson['remark'])){
+                    $remark = $extendJson['remark'];
                 }
             }
             $classify = "SERVICE";
-            if(substr($item->quota_id,0,2) == "MQ"){
+            if (substr($item->quota_id, 0, 2) == "MQ") {
                 $classify = "QUOTA";
-            }elseif(!empty($item->classify) && $item->classify == 'PACKAGE'){
+            } elseif (!empty($item->classify) && $item->classify == 'PACKAGE') {
                 $classify = "PACKAGE";
             }
             $rows[] = [
@@ -102,15 +110,66 @@ class WriteOffController extends Curd
                 'username' => $username,
                 'premises' => $premises,
                 'benefit_name' => $benefitName,
-                'used_time'=>$item->used_time,
-                'member_name' => $item->member_cert_name ?  $item->member_cert_name.'-' : '',
-                'member_mobile' => $item->member_mobile ?  $item->member_mobile : '',
-                'classify'=>$classify,
-                'nbr'=>1
+                'used_time' => $item->used_time,
+                'member_name' => $item->member_cert_name ? $item->member_cert_name : '',
+                'member_mobile' => $item->member_mobile ? $item->member_mobile : '',
+                'classify' => $classify,
+                'nbr' => 1,
+                'remark'=>$remark
             ];
 
         }
 
         return json_success('', compact('rows', 'page', 'pageSize', 'total'));
     }
+
+    /**
+     * @Desc 核销备注
+     * @Author Gorden
+     * @Date 2024/9/4 17:05
+     *
+     * @param Request $request
+     * @return \support\Response
+     */
+    public function remark(Request $request)
+    {
+        $quotaId = $request->post('quota_id', '');
+        if (!$quotaId) {
+            return json_fail('参数异常');
+        }
+        $extendJson = [];
+        if (substr($quotaId, 0, 2) == 'AP') {
+            $appointment = Appointment::where('appointment_id', $quotaId)->first();
+            if (!empty($appointment->appointment_extend_json)) {
+                $extendJson = json_decode($appointment->appointment_extend_json, true);
+            }
+        } elseif (substr($quotaId, 0, 2) == 'MQ') {
+            $quota = MemberQuota::where('member_quota_id', $quotaId)->first();
+            if (!empty($quota->member_quota_extend_json)) {
+                $extendJson = json_decode($quota->member_quota_extend_json, true);
+            }
+        }
+        if (empty($appointment) && empty($quota)) {
+            return json_fail("数据异常");
+        }
+        try {
+            $extendJson['remark'] = [
+                'premises_id' => $request->post('premises_id', ''),
+                'premises_name' => $request->post('premises_name', ''),
+                'business' => $request->post('business', ''),
+                'service' => $request->post('service', '')
+            ];
+            if (!empty($appointment)){
+                $appointment->appointment_extend_json = json_encode($extendJson,JSON_UNESCAPED_UNICODE);
+                $appointment->save();
+            }elseif (!empty($quota)){
+                $quota->member_quota_extend_json = json_encode($extendJson,JSON_UNESCAPED_UNICODE);
+                $quota->save();
+            }
+
+            return json_success('success');
+        } catch (\Exception $e) {
+            return json_fail('备注保存失败');
+        }
+    }
 }

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

@@ -2,13 +2,27 @@
 
 namespace app\admin\controller\order;
 
+use app\admin\service\member\MemberService;
+use app\admin\service\order\OrderService;
 use app\admin\validate\order\OrderValidate;
 use app\controller\Curd;
+use app\model\Appointment;
 use app\model\Goods;
+use app\model\GoodsComponent;
+use app\model\GoodsRunning;
+use app\model\GoodsSku;
+use app\model\Member;
+use app\model\MemberAccount;
 use app\model\Order;
 use app\model\OrderSheet;
+use app\model\PayDetail;
+use app\model\SysDept;
+use support\Db;
+use support\exception\BusinessException;
+use support\Redis;
 use support\Request;
 use support\Response;
+use Webman\Event\Event;
 
 class KangyangCityController extends Curd{
     public function __construct()
@@ -168,4 +182,617 @@ class KangyangCityController extends Curd{
 
         return $items;
     }
+
+    /**
+     * @Desc 下单+支付
+     * @Author Gorden
+     * @Date 2024/9/5 13:13
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function insert(Request $request): Response
+    {
+        $params = $request->post();
+        // 判断餐品是否连带着服务或实体
+        $goodsClassifys = array_unique(array_column($params['goodsContentList'], 'goods_classify'));
+        if (in_array('MEALS', $goodsClassifys) && count($goodsClassifys) > 1) {
+            return json_fail('餐饮餐品不支持和其他类型的产品一起下单');
+        }
+        if (in_array('MEALS', $goodsClassifys)) {
+            $params['submit_goods_classify'] = 'MEALS';
+        }
+        if (in_array('PACKAGE', $goodsClassifys)) {
+            $params['submit_goods_classify'] = 'PACKAGE';
+        }
+        if (!empty($params['dept_premises_id'])) {
+            $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
+        }
+
+        $params['goods_classify'] = $goodsClassifys[0];
+        Db::beginTransaction();
+        try {
+            // 验证线下付款密码
+            if ($params['settlement_now'] == 'Y' && $params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['OFFLINE', 'MONEY'])) {
+                $password = $params['offline_password'];
+                if ($password != '666888') {
+                    throw new BusinessException('密码错误,请重新输入');
+                }
+            }
+            // 下单账户
+            if (empty($params['join_order_member_id']) && !empty($params['mobile'])) {
+                if (Member::where('member_mobile', $params['mobile'])->exists()) {
+                    throw new BusinessException('会员已存在');
+                }
+                $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('YmdHis') . random_string(6, 'up');
+                // 创建会员
+                MemberService::createMember($params);
+            } else if (empty($params['join_order_member_id']) && empty($params['mobile'])) {
+                $params['join_order_member_id'] = Member::where('member_mobile', '0000')->value('member_id');
+            }
+            if (empty($params['join_order_member_id'])) {
+                throw new BusinessException('检查下单账户');
+            }
+
+            $qrcodePayAmount = 0;
+            $params['orderId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
+            $params['orderGroupId'] = 'OD' . date('YmdHis') . random_string(6, 'up');
+
+            $systemStatus = 'SENDING';  // 待发货
+            // 立即结算
+            if ($params['settlement_now'] == 'Y') {
+                if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'VIP'])) {
+                    $params['order_is_complete'] = 'Y';
+                    $systemStatus = 'DONE';
+                }
+                if ($params['goods_classify'] == 'PACKAGE' && $params['delivery'] == 'ARRIVAL') {
+                    $systemStatus = "WAITING";
+                }
+            }
+
+            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';
+            }
+            if (($params['pay_constitute'] == 'Y' || $params['pay_category'] == 'QRCODE') && $params['settlement_now'] == 'Y' && !empty($params['qrcode_nbr'])) {     // 付款码
+                // 提交过来的支付分类
+                $submitPayCategory = $params['pay_category'];
+                // 账户支付的金额
+                $accountAmount = $params['order_amount_pay'];
+                if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0) {
+                    // 组合支付,支付金额改成需要付款码需要支付的金额
+                    $params['order_amount_pay'] = $qrcodePayAmount;
+                }
+                if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount <= 0) {
+                    $params['order_status_system'] = $systemStatus;
+                    $params['order_status_payment'] = 'SUCCESS';
+                }
+                // 不组合或者组合后需要付款码的金额>0
+                if ($params['pay_constitute'] == 'N' || ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0)) {
+                    $result = OrderService::qrcodePay($params);
+                    $result = json_encode($result);
+                    $params['pay_json_response'] = $result;
+                    $result = json_decode($result, true);
+
+                    $prefix = substr($params['qrcode_nbr'], 0, 2);
+                    if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
+                        $params['pay_category'] = 'WXPAY';
+                        if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
+                            $params['order_status_system'] = 'PAYING';
+                            $params['order_status_payment'] = 'PENDING';
+                            $params['order_is_complete'] = 'N';
+//                            Db::rollBack();
+//                            return json_fail('支付失败');
+                        } else {
+                            $params['order_status_system'] = $systemStatus;
+                            $params['order_status_payment'] = 'SUCCESS';
+                        }
+                    } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
+                        $params['pay_category'] = 'ALIPAY';
+                        if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
+                            $params['order_status_system'] = 'PAYING';
+                            $params['order_status_payment'] = 'PENDING';
+                            $params['order_is_complete'] = 'N';
+//                            Db::rollBack();
+//                            return json_fail('支付失败');
+                        } else {
+                            $params['order_status_system'] = $systemStatus;
+                            $params['order_status_payment'] = 'SUCCESS';
+                        }
+                    } else {
+                        throw new BusinessException('付款码无效');
+                    }
+
+                    // 组合支付,追加加一条支付记录 pay_detail
+                    if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0 && $params['order_status_payment'] == 'SUCCESS') {
+                        $insertPayDetailData = [
+                            'join_pay_member_id' => $params['join_order_member_id'],
+                            'join_pay_order_id' => $params['orderGroupId'],
+                            'pay_status' => 'SUCCESS',
+                            'pay_category' => $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);
+
+                        // 组合支付,还原提交的支付分类
+                        $params['pay_category'] = $submitPayCategory;
+                    }
+
+                    // 账户支付的金额
+                    $params['order_amount_pay'] = $accountAmount;
+                }
+            }
+
+            $orderConfigJson = [];
+            // 配送方式
+            if (isset($params['delivery']) && ($params['delivery'] == 'PICKUP' || $params['delivery'] == 'ARRIVAL')) { // 自提/ 到店
+                $orderConfigJson['premises'] = $params['dept_premises_id'];
+            } else if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
+                // $params['order_express_json'] = json_encode([
+                //     'express' => 'Y',
+                // ]);
+            }
+            $params['order_amount_pay'] = $params['order_amount_pay'] + $qrcodePayAmount;
+            $params['order_config_json'] = json_encode($orderConfigJson);
+            // 写入主订单
+            $this->insertMain($params);
+            // 订单详情
+            $sheetId = $this->insertSheet($params);
+            // 支付记录
+            $params['order_amount_pay'] = $params['order_amount_pay'] - $qrcodePayAmount;
+            $this->insertPayDetail($params);
+
+            $params['order_express_goods'] = json_encode(['sheet' => [$sheetId]]);
+
+            // 2.4W 康养城
+            if ($params['goods_classify'] == 'VIP' && $params['order_status_payment'] == 'SUCCESS') {
+                $params['member_id'] = $params['join_order_member_id'];
+                Event::dispatch('order.kangyangCityVIP.grant', $params);
+            }
+
+            Db::commit();
+
+            // 会员升级
+            if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y' && $params['order_status_payment'] == 'SUCCESS') {
+                Event::dispatch('order.complete', $params);
+            }
+
+            if ($params['settlement_now'] == 'Y' && $params['order_status_payment'] != 'SUCCESS') {
+                _syslog("订单", "支付异常,检查是否有轮询");
+                return json_throw(2001, '支付异常', ['order_id' => $params['orderId']]);
+            }
+            _syslog("订单", "创建订单成功");
+            return json_success('创建订单成功');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            dump($e->getTrace());
+            _syslog("订单", $e->getMessage());
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            dump($e->getTrace());
+            _syslog("订单", "创建订单失败");
+            return json_fail('创建订单失败');
+        }
+    }
+
+    /**
+     * @Desc 支付
+     * @Author Gorden
+     * @Date 2024/9/5 13:12
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function pay(Request $request)
+    {
+        $params = $request->post();
+        // 验证线下付款密码
+        if ($params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['OFFLINE', 'MONEY'])) {
+            $password = $params['offline_password'];
+            if ($password != '666888') {
+                return json_fail("密码错误,请重新输入");
+            }
+        }
+
+        $order = Order::where('order_id', $params['order_id'])->first();
+        if (!$order) {
+            return json_fail('订单异常');
+        }
+        if ($order->order_status_system != 'PAYING') {
+            return json_fail('订单不是可支付状态');
+        }
+
+        $params['orderId'] = $params['order_id'];
+        $params['orderGroupId'] = $order->order_groupby;
+
+        $goods = Goods::where('goods_id', $params['join_sheet_goods_id'])
+            ->select('goods_id', 'goods_name', 'goods_classify')
+            ->first();
+        if (!$goods) {
+            return json_fail('产品数据异常');
+        }
+        $goods = $goods->toArray();
+        $params['goods_classify'] = $goods['goods_classify'] ?? '';
+
+        $systemStatus = 'SENDING';  // 待发货
+        // 立即结算
+        if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'VIP'])) {
+            $order->order_is_complete = 'Y';
+            $systemStatus = 'DONE';
+        }
+        if ($params['goods_classify'] == 'PACKAGE' && $params['delivery'] == 'ARRIVAL') {
+            $systemStatus = "WAITING";
+        }
+        Db::beginTransaction();
+        try {
+            // 组合支付时,付款码应收金额
+            $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'];
+                }
+            }
+            if (($params['pay_constitute'] == 'Y' || $params['pay_category'] == 'QRCODE') && !empty($params['qrcode_nbr'])) {     // 付款码
+                // 提交过来的支付分类
+                $submitPayCategory = $params['pay_category'];
+                // 账户支付的金额
+                $accountAmount = $params['order_amount_pay'];
+                if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0) {
+                    // 组合支付,改成需要付款码需要支付的金额
+                    $params['order_amount_pay'] = $qrcodePayAmount;
+                }
+                // 去支付
+                $result = OrderService::qrcodePay($params);
+                $result = json_encode($result);
+                $params['pay_json_response'] = $result;
+                $result = json_decode($result, true);
+
+                $prefix = substr($params['qrcode_nbr'], 0, 2);
+                if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
+                    $params['pay_category'] = 'WXPAY';
+                    if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
+                        $order->order_status_system = 'PAYING';
+                        $order->order_status_payment = 'PENDING';
+                        $order->order_is_complete = 'N';
+//                        Db::rollBack();
+//                        return json_fail('支付失败');
+                    } else {
+                        $order->order_status_system = $systemStatus;
+                        $order->order_status_payment = 'SUCCESS';
+                    }
+                } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
+                    $params['pay_category'] = 'ALIPAY';
+                    if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
+                        $order->order_status_system = 'PAYING';
+                        $order->order_status_payment = 'PENDING';
+                        $order->order_is_complete = 'N';
+//                        Db::rollBack();
+//                        return json_fail('支付失败');
+                    } else {
+                        $order->order_status_system = $systemStatus;
+                        $order->order_status_payment = 'SUCCESS';
+                    }
+                } else {
+                    throw new BusinessException('付款码无效');
+                }
+
+                // 组合支付,追加加一条支付记录 pay_detail
+                if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0) {
+                    $insertPayDetailData = [
+                        'join_pay_member_id' => $params['join_order_member_id'],
+                        'join_pay_order_id' => $params['orderGroupId'],
+                        'pay_status' => 'SUCCESS',
+                        'pay_category' => $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'],
+                        'join_pay_object_json' => !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]',
+                        'pay_addtimes' => time()
+                    ];
+
+                    PayDetail::insert($insertPayDetailData);
+
+                    // 组合支付,还原提交的支付分类
+                    $params['pay_category'] = $submitPayCategory;
+                }
+
+                // 账户支付的金额
+                $params['order_amount_pay'] = $accountAmount;
+            }
+            $orderConfigJson = [];
+            if (!empty($order->order_config_json)) {
+                $orderConfigJson = json_decode($order->order_config_json, true);
+            }
+            $orderConfigJson['preferential'] = $params['preferential'] ?? '';
+            if (isset($orderConfigJson['tableid']) && !empty($orderConfigJson['tableid'])) {
+                SysDept::where('dept_id', $orderConfigJson['tableid'])->where('dept_category', '桌台')->update(['dept_status' => 'ACTIVED']);
+            }
+            $order->order_config_json = json_encode($orderConfigJson);
+            $order->order_amount_pay = $params['order_amount_pay'] + $qrcodePayAmount;
+            // 康养城订单,支付完就结束了
+            if ($order->order_status_payment == 'SUCCESS' && $params['goods_classify'] == 'VIP') {
+                $order->order_is_complete = 'Y';
+            }
+            // 主订单
+            $order->save();
+
+            // sheet
+            if ($order->order_status_payment == 'SUCCESS') {
+                OrderSheet::where('join_sheet_order_id', $params['order_id'])->update([
+                    'order_sheet_status' => $systemStatus,
+                ]);
+            }
+            // payDetail
+            $payData = [
+                'pay_amount' => $params['order_amount_pay']
+            ];
+            if ($order->order_status_payment == 'SUCCESS') {
+                $payData['pay_paytimes'] = date('Y-m-d H:i:s');
+                $payData['pay_status'] = 'SUCCESS';
+            }
+            if ($params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['WXPAY', 'ALIPAY'])) {
+                $payData['pay_prepayid'] = $params['pay_category'];
+                $payData['pay_json_response'] = $params['pay_json_response'];
+            } else if ($params['pay_category'] == 'CASH') {
+                $payData['pay_prepayid'] = $params['join_order_member_id'] . '-CASH';
+            } else if ($params['pay_category'] == 'WELFARE') {
+                $payData['pay_prepayid'] = $params['join_order_member_id'] . '-WELFARE';
+            } else if ($params['pay_category'] == 'CARD') {
+                $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';
+            }
+            // 如果 是APP 过来的菜订单,可能没有paydetail
+            if (!PayDetail::where('join_pay_order_id', $order->order_groupby)->where('pay_category', '<>', 'WXPAY')->where('pay_category', '<>', 'ALIPAY')->exists()) {
+                $payData['join_pay_member_id'] = $params['join_order_member_id'];
+                $payData['join_pay_order_id'] = $order->order_groupby;
+                $payData['pay_status'] = $payData['pay_status'] == 'SUCCESS' ? $payData['pay_status'] : 'WAITING';
+                $payData['pay_category'] = $params['goods_classify'] ?? '';
+                $payData['pay_json_request'] = json_encode($params);   // {"pay-result": "支付成功", "result-datetime": "2024-07-29 18:38:21"}
+                $payData['pay_json_response'] = $payData['pay_status'] == 'SUCCESS' ? json_encode([
+                    'pay-result' => '支付成功', 'result-datetime' => date('Y-m-d H:i:s')
+                ]) : '[]';
+                $payData['join_pay_object_json'] = !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]';
+                $payData['pay_addtimes'] = time();
+
+                PayDetail::insert($payData);
+            } else {
+                // 更新非微信支付宝的支付记录
+                PayDetail::where('join_pay_order_id', $order->order_groupby)->where('pay_category', '<>', 'WXPAY')->where('pay_category', '<>', 'ALIPAY')->update($payData);
+            }
+
+            // 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);
+            }
+
+            Db::commit();
+
+            if ($order->order_is_complete == 'Y' && $order->order_status_payment == 'SUCCESS') {
+                Event::dispatch('order.complete', $params);
+            }
+
+            if ($order->order_status_payment != 'SUCCESS') {
+                _syslog("订单", "支付异常,检查是否有轮询");
+                return json_throw(2001, '支付异常', ['order_id' => $params['orderId']]);
+            }
+            _syslog("订单", "订单支付成功");
+            return json_success('支付成功');
+        } catch (BusinessException $e) {
+            dump($e->getMessage());
+            Db::rollBack();
+            _syslog("订单", "订单支付失败:" . $e->getMessage());
+            return json_fail("支付失败:" . $e->getMessage());
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            Db::rollBack();
+            _syslog("订单", "订单支付失败");
+            return json_fail('支付失败');
+        }
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/6/7 10:30
+     *
+     * @param $params
+     * @return void
+     * @throws BusinessException
+     */
+    public function insertMain($params)
+    {
+        try {
+            $orderCategory = 'NORMAL';
+            if (!empty($params['order_category'])) {
+                $orderCategory = $params['order_category'];
+            } else if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
+                $orderCategory = 'DISHES';
+            } else if (isset($params['goods_classify'])) {
+                $orderCategory = $params['goods_classify'];
+            }
+            if (empty($params['order_extend_json'])) {
+                $params['order_extend_json'] = [];
+            } else {
+                if (is_json($params['order_extend_json'])) {
+                    $params['order_extend_json'] = json_decode($params['order_extend_json'], true);
+                }
+            }
+            // 推荐人
+            $params['order_extend_json']['referee'] = $params['referee'] ?? '';
+
+            $data = [
+                'order_id' => $params['orderId'],
+                'order_groupby' => $params['orderGroupId'],
+                'join_order_member_id' => $params['join_order_member_id'],
+                'order_name' => date('Y-m-d H:i:s') . '-订单',
+                'order_amount_total' => $params['order_amount_total'],
+                'order_amount_pay' => $params['order_amount_pay'],
+                'order_category' => $orderCategory,
+                'order_is_complete' => $params['order_is_complete'] ?? 'N',
+                'order_status_system' => $params['order_status_system'],
+                'order_status_payment' => $params['order_status_payment'],
+                'order_status_storage' => $params['order_status_storage'],
+                'order_platform' => $params['order_platform'],
+                'order_remark' => $params['order_remark'] ?? '',
+                'order_discount_json' => $params['order_discount_json'] ?? '[]',
+                'order_config_json' => $params['order_config_json'] ?? '[]',
+                'order_express_json' => $params['order_express_json'] ?? '[]',
+                'order_extend_json' => $params['order_extend_json'] ? json_encode($params['order_extend_json']) : '[]',
+                'order_addtimes' => time()
+            ];
+
+            Order::insert($data);
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            throw new BusinessException('订单创建信息失败');
+        }
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/6/7 10:25
+     *
+     * @param $params
+     * @return void
+     * @throws BusinessException
+     */
+    public function insertSheet($params)
+    {
+        try {
+            $orderSheetIds = [];
+            foreach ($params['goodsContentList'] as $goods) {
+                //{"unit": "份", "table": null, "premises": "15"}
+                $price = floatval($goods['goods_sales_price']);
+                $extendJson['unit'] = $goods['sku_name'];
+                if (isset($params['submit_premises_id'])) {
+                    $extendJson['premises'] = $params['submit_premises_id'];
+                }
+                if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
+                    $extendJson['table'] = null;
+                }
+                $data = [
+                    'join_sheet_member_id' => $params['join_order_member_id'],
+                    'join_sheet_order_id' => $params['orderId'],
+                    'join_sheet_goods_id' => $goods['goods_id'],
+                    'join_sheet_goods_sku_id' => $goods['sku_id'],
+                    'order_sheet_status' => $params['settlement_now'] == 'Y' && $params['order_status_payment'] == 'SUCCESS' ? 'DONE' : 'PAYING',
+                    'order_sheet_category' => (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') ? 'DISHES' : 'NORMAL',
+                    'order_sheet_num' => $goods['nbr'],
+                    'order_sheet_price' => $goods['goods_sales_price'],
+                    'order_sheet_amount' => $price * $goods['nbr'],
+                    'order_sheet_pay' => $price * $goods['nbr'],
+                    'order_sheet_task_status' => 'NONE',
+                    'order_sheet_remark' => $params['order_remark'] ?? '',
+                    'order_sheet_addtimes' => time(),
+                    'order_sheet_extend_json' => json_encode($extendJson)
+                ];
+
+                $orderSheetId = OrderSheet::insertGetId($data);
+                $orderSheetIds[] = $orderSheetId;
+
+                // 减库存,规格和总库存
+                if (!isset($params['submit_goods_classify']) || !in_array($params['submit_goods_classify'], ['MEALS', 'PACKAGE'])) {
+                    $goodsSku = GoodsSku::where('goods_sku_id', $goods['sku_id'])->first();
+                    $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json, true);
+                    if (isset($skuStorageJson['storage']) && !empty($skuStorageJson['storage'])) {
+                        $skuStorageJson['storage'] = $skuStorageJson['storage'] - $goods['nbr'];
+                    }
+
+                    if (!isset($skuStorageJson['storage']) || (!empty($skuStorageJson['storage']) && $skuStorageJson['storage'] < 0)) {
+                        throw new BusinessException('库存不足');
+                    }
+                    $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
+                    $goodsSku->save();
+                }
+
+
+                $goodsRunning = GoodsRunning::where('join_running_goods_id', $goods['goods_id'])->first();
+                $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
+                if ($goodsRunning->goods_running_storage < 0) {
+                    throw new BusinessException('库存不足');
+                }
+                $goodsRunning->goods_running_sale = $goodsRunning->goods_running_sale + $goods['nbr'];
+                $goodsRunning->save();
+            }
+            return $orderSheetIds;
+        } catch (\support\exception\BusinessException $e) {
+            dump($e->getMessage() . '||' . $e->getLine());
+            throw new BusinessException($e->getMessage());
+        } catch (\Exception $e) {
+            dump($e->getMessage() . '||' . $e->getLine());
+            throw new BusinessException('订单创建失败');
+        }
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/6/7 10:35
+     *
+     * @param $params
+     * @return void
+     * @throws BusinessException
+     */
+    public function insertPayDetail($params)
+    {
+        try {
+            if (in_array($params['pay_category'], ['WXPAY', 'ALIPAY'])) {
+                $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 {
+                $payPrepayid = $params['join_order_member_id'] . '-' . $params['pay_category'];
+            }
+            $data = [
+                'join_pay_member_id' => $params['join_order_member_id'],
+                'join_pay_order_id' => $params['orderGroupId'],
+                'pay_status' => $params['settlement_now'] == 'Y' && $params['order_status_payment'] == 'SUCCESS' ? 'SUCCESS' : 'WAITING',
+                'pay_category' => $params['goods_classify'],
+                'pay_amount' => $params['order_amount_pay'],
+                'pay_prepayid' => $payPrepayid,
+                'pay_paytimes' => date('Y-m-d H:i:s'),
+                'join_pay_object_json' => !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]',
+                'pay_json_request' => json_encode($params),
+                'pay_json_response' => $params['pay_json_response'] ?? '[]',
+                'pay_remark' => $params['order_remark'] ?? '',
+                'pay_addtimes' => time(),
+            ];
+
+            PayDetail::insert($data);
+        } catch (\Exception $e) {
+            dump($e->getMessage());
+            throw new BusinessException('创建支付记录失败');
+        }
+    }
 }

+ 2 - 2
app/admin/controller/order/PayDetailController.php

@@ -90,7 +90,7 @@ class PayDetailController extends Curd
             }
         }
         $model = $model->where(function ($query) {
-            $query->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY'])
+            $query->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY','OFFLINE_WXPAY','OFFLINE_ALIPAY'])
                 ->orWhere('pay_prepayid', 'like', '%CASH%');
         });
 
@@ -238,7 +238,7 @@ class PayDetailController extends Curd
         Db::beginTransaction();
         try {
             $data = $this->insertRechargeInput($request);
-            $data['pay_prepayid'] = $data['join_pay_member_id'] . '-CASH';
+            $data['pay_prepayid'] = $request->post('pay_prepayid', '');
 
             $payDetailId = $this->doInsert($data);
             (new RechargeController)->disposePaySuccess($payDetailId);

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

@@ -481,6 +481,7 @@ class RefundController extends Curd
                 'pay_amount' => $amount,
                 'pay_paytimes' => date('Y-m-d H:i:s'),
                 'pay_prepayid' => $prepayid,
+                'join_pay_object_json' => json_encode(['order_id'=>$order->order_id]),
                 'pay_json_request' => json_encode(['order_id' => $order->order_id]),
                 'pay_json_response' => json_encode($response),
                 'pay_addtimes' => time()

+ 83 - 23
app/admin/controller/order/WholeController.php

@@ -512,6 +512,9 @@ class WholeController extends Curd
                 if (isset($orderExtendJson['cancel_times'])) {
                     $order->cancel_times = $orderExtendJson['cancel_times'];
                 }
+                if (isset($orderExtendJson['free_remark'])) {
+                    $order->free_remark = $orderExtendJson['free_remark'];
+                }
             }
             $discount = ['coupon_name' => '', 'classify' => '', 'value' => 0];
             if (!empty($order->order_discount_json)) {
@@ -525,17 +528,17 @@ class WholeController extends Curd
                             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'] . '), ';
+                        $discount['coupon_name'] .= $coupon->coupon_classify . ':' . $coupon->coupon_name . '(优惠¥' . sprintf("%.2f", $discountItem['coupon_value']) . '), ';
                     }
                     if (empty($discountItem['coupon_id']) && !empty($discountItem['coupon_classify'])) {
                         if (!empty($discountItem['coupon_detail_id'])) {
-                            $discount['classify'] .= $discountItem['coupon_detail_id'][0] . '(优惠¥' . round($discountItem['coupon_value'], 2) . '), ';
+                            $discount['classify'] .= $discountItem['coupon_detail_id'][0] . '(优惠¥' . sprintf("%.2f", $discountItem['coupon_value']) . '), ';
                         } else {
-                            $discount['classify'] .= $discountItem['coupon_classify'] . '(优惠¥' . round($discountItem['coupon_value'], 2) . '), ';
+                            $discount['classify'] .= $discountItem['coupon_classify'] . '(优惠¥' . sprintf("%.2f", $discountItem['coupon_value']) . '), ';
                         }
                     }
                     if (!empty($discountItem['coupon_value'])) {
-                        $discount['value'] += round($discountItem['coupon_value'], 2);
+                        $discount['value'] += $discountItem['coupon_value'];
                     }
                 }
                 if (!empty($discount['coupon_name'])) {
@@ -545,6 +548,7 @@ class WholeController extends Curd
                     $discount['classify'] = rtrim($discount['classify'], ', ');
                 }
             }
+            $discount['value'] = sprintf("%.2f", $discount['value']);
             $order->discount = $discount;
 
             $order->premises = $order->premises ?? $premises;
@@ -1156,7 +1160,7 @@ class WholeController extends Curd
             }
 
             // // 买的单个服务
-            if ($order->order_status_payment == 'SUCCESS') {
+            if ($order->order_status_payment == 'SUCCESS' && empty($appointment)) {
                 foreach ($params['goodsContentList'] as $goods) {
                     $params['join_sheet_goods_id'] = $goods['goods_id'];
                     if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
@@ -1209,12 +1213,14 @@ class WholeController extends Curd
                 Event::dispatch('order.kangyangCityVIP.grant', $params);
             }
 
-            if ($order->order_is_complete == 'Y') {
+            Db::commit();
+
+            // 会员升级
+            if ($order->order_is_complete == 'Y' && $order->order_status_payment == 'SUCCESS') {
                 Event::dispatch('order.complete', $params);
+                Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
             }
 
-            Db::commit();
-
             // 打小票
             if (!empty($premises) && $params['goods_classify'] == 'MEALS') {
                 dump("pay 打小票");
@@ -1599,7 +1605,7 @@ class WholeController extends Curd
                 $appointment->save();
             }
             // 买单个服务
-            if ($order->order_status_payment == 'SUCCESS') {
+            if ($order->order_status_payment == 'SUCCESS' && empty($appointment)) {
                 foreach ($params['goodsContentList'] as $goods) {
                     $params['join_sheet_goods_id'] = $goods['goods_id'];
                     if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
@@ -1651,12 +1657,13 @@ class WholeController extends Curd
                 Event::dispatch('order.kangyangCityVIP.grant', $params);
             }
 
-            if ($order->order_is_complete == 'Y') {
+            Db::commit();
+            // 会员升级
+            if ($order->order_is_complete == 'Y' && $order->order_status_payment == 'SUCCESS') {
                 Event::dispatch('order.complete', $params);
+                Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
             }
 
-            Db::commit();
-
             // 打小票
             if (!empty($premises) && $params['goods_classify'] == "MEALS") {
                 dump('payCons 打小票');
@@ -2331,12 +2338,15 @@ 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();
 
+            // 会员升级
+            if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y' && $params['order_status_payment'] == 'SUCCESS') {
+                Event::dispatch('order.complete', $params);
+                Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
+            }
+
             // 打小票
             if (!empty($premises) && isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
                 dump("insert 打小票");
@@ -2813,12 +2823,14 @@ class WholeController extends Curd
                 Event::dispatch('order.kangyangCityVIP.grant', $params);
             }
 
-            if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y') {
+            Db::commit();
+
+            // 会员升级
+            if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y' && $params['order_status_payment'] == 'SUCCESS') {
                 Event::dispatch('order.complete', $params);
+                Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
             }
 
-            Db::commit();
-
             // 打小票
             if (!empty($premises) && isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
 //            if (!empty($premises)){
@@ -3432,6 +3444,12 @@ class WholeController extends Curd
 
             // 事件通知
             Event::dispatch('client_message.delivery', $params);
+            if ($params['express_type'] == '自提') {
+                $order = Order::where('order_id', $request->post('order_id'))->select('join_order_member_id')->first();
+                if (!empty($order)) {
+                    Event::dispatch('order_pay.member_level.up', $order->join_order_member_id);
+                }
+            }
 
             Db::commit();
 
@@ -3768,6 +3786,7 @@ class WholeController extends Curd
             $express = new OrderExpress();
             $express->order_express_type = $params['order_express_type'];
             $express->join_express_order_id = $params['orderId'];
+            $express->join_express_dept_id = $params['submit_premises_id'] ?? '';
             $express->order_express_goods = $params['order_express_goods'];
             $express->order_express_city = $params['order_express_city'];
             $express->order_express_address = $params['order_express_address'];
@@ -4305,7 +4324,7 @@ class WholeController extends Curd
                 'order_status_system' => !empty($systemStatus) ? $systemStatus : self::$systemStatus[$item['order_status_system']],
                 'order_status_payment' => self::$paymentStatus[$item['order_status_payment']],
                 'pay_way' => $item['order_status_payment'] == 'SUCCESS' ? ($payWay ?? '') : '',
-                'pay_times' => $item['order_status_payment'] == 'SUCCESS' ? ($payTimes ?? '') : '',
+                'pay_times' => $item['order_status_payment'] == 'SUCCESS' || $item['order_status_payment'] == 'FREE' ? ($payTimes ?? '') : '',
                 'order_addtimes' => date('Y-m-d H:i:s', strtotime($item['order_addtimes'])),
             ];
         }
@@ -4401,16 +4420,19 @@ class WholeController extends Curd
     {
         $orderId = $request->post('order_id', '');
         $orderStatusPayment = $request->post('order_status_payment', '');
+        $freeRemark = $request->post('free_remark', '');
         $order = Order::where('order_id', $orderId)
-            ->select('order_id', 'order_status_payment', 'order_config_json')
+            ->select('order_id', 'order_groupby', 'order_status_payment', 'order_config_json', 'order_amount_total', 'order_discount_json', 'order_extend_json')
             ->first();
         Db::beginTransaction();
         try {
             if ($orderStatusPayment == 'AWAITING' && $order->order_status_payment != 'PENDING') {
-                return json_fail('当前订单不允许挂账');
+                throw new BusinessException("当前订单不允许挂账");
+            } else if ($orderStatusPayment == 'FREE' && $order->order_status_payment != 'PENDING') {
+                throw new BusinessException("当前订单不允许免单");
             }
             // 挂账,释放餐桌
-            if ($order->order_status_payment == 'PENDING' && $orderStatusPayment == 'AWAITING') {
+            if (in_array($orderStatusPayment, ['AWAITING', 'FREE'])) {
                 $order->order_status_payment = $orderStatusPayment;
                 // 如果有餐桌,释放
                 if (!empty($order->order_config_json)) {
@@ -4420,10 +4442,47 @@ class WholeController extends Curd
                     }
                 }
             }
+            if ($orderStatusPayment == 'FREE') {
+                $orderDiscountJson = [];
+                if (!empty($order->order_discount_json)) {
+                    $orderDiscountJson = json_decode($order->order_discount_json, true);
+                }
+                $orderDiscountJson[date('Y-m-d H:i:s')] = [
+                    'coupon_id' => null,
+                    'coupon_value' => $order->order_amount_total,
+                    'coupon_classify' => '免单',
+                    'coupon_detail_id' => ['免单'],
+                    'coupon_classify_en' => ['free']
+                ];
+                $orderExtendJson = [];
+                if (!empty($order->order_extend_json)) {
+                    $orderExtendJson = json_decode($order->order_extend_json, true);
+                }
+                $orderExtendJson['free_remark'] = $freeRemark;
+                $order->order_discount_json = json_encode($orderDiscountJson, JSON_UNESCAPED_UNICODE);
+                $order->order_extend_json = json_encode($orderExtendJson, JSON_UNESCAPED_UNICODE);
+                $order->order_is_complete = 'Y';
+                $order->order_status_system = 'DONE';
+                $order->order_amount_pay = 0;
+
+                // sheet表
+                OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'DONE']);
+                // payDetail 表
+                PayDetail::where('join_pay_order_id', $order->order_groupby)
+                    ->update([
+                        'pay_status' => 'SUCCESS',
+                        'pay_amount' => 0,
+                        'pay_prepayid' => 'MONEY',
+                        'pay_paytimes' => date('Y-m-d H:i:s')
+                    ]);
+            }
             $order->save();
 
             Db::commit();
             return json_success('success');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
             return json_fail('修改订单状态失败');
@@ -4502,6 +4561,7 @@ class WholeController extends Curd
         'PENDING' => "待支付",
         'CANCEL' => "取消支付",
         'SUCCESS' => "支付成功",
-        'AWAITING' => "挂账"
+        'AWAITING' => "挂账",
+        'FREE' => "免单"
     ];
 }

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

@@ -356,7 +356,7 @@ 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', '桌台')->orderBy('dept_status','ASC')->get()->toArray();
+            $tables = SysDept::where('dept_super_id', $restaurant->dept_id)->where('dept_category', '桌台')->orderBy('dept_sort','ASC')->get()->toArray();
 
             foreach ($tables as $table) {
                 $tableList[] = [

+ 31 - 11
app/admin/service/member/MemberService.php

@@ -3,6 +3,7 @@
 namespace app\admin\service\member;
 
 use app\model\ClientPoints;
+use app\model\CouponDetail;
 use app\model\Device;
 use app\model\Family;
 use app\model\FamilyMember;
@@ -81,7 +82,7 @@ class MemberService
                 $query->whereBetween('member.member_addtimes', $addtime);
             })
             ->select('member_id', 'member_is_vip', 'member_is_owner', 'member_classify', 'member_status', 'member_mobile', 'member_from', 'member_addtimes', 'member_extend_json',
-                'member_info.member_info_nickname', 'member_info.member_info_headimg',
+                'member_info.member_info_nickname', 'member_info.member_info_headimg','member_info.member_info_referee','member_info.member_info_business','member_info.member_info_service',
                 'member_role.member_role_id', 'member_role.member_role_name',
                 'member_cert.member_cert_birth', 'member_cert.member_cert_gender', 'member_cert.member_cert_name', 'member_cert.member_cert_nbr', 'member_cert.member_cert_province', 'member_cert.member_cert_addr', 'member_cert.member_cert_face', 'member_cert.member_cert_photo', 'member_cert.member_cert_nation',
 //                'member_account.member_account_surplus'
@@ -94,10 +95,14 @@ class MemberService
             ->toArray();
 
         foreach ($rows as &$row) {
+            $row['coupon_count'] = CouponDetail::where('join_coupon_detail_member_id',$row['member_id'])->count();
             $row['member_mobile'] = substr($row['member_mobile'], 0, 3) . '****' . substr($row['member_mobile'], 7);
             $row['info'] = [
                 'member_info_nickname' => !empty($row['member_info_nickname']) ? $row['member_info_nickname'] : substr($row['member_mobile'], -4, 4) . '用户',
-                'member_info_headimg' => !empty($row['member_info_headimg']) ? $row['member_info_headimg'] : ''
+                'member_info_headimg' => !empty($row['member_info_headimg']) ? $row['member_info_headimg'] : '',
+                'member_info_referee' => !empty($row['member_info_referee']) ? $row['member_info_referee'] : '',
+                'member_info_business' => !empty($row['member_info_business']) ? $row['member_info_business'] : '',
+                'member_info_service' => !empty($row['member_info_service']) ? $row['member_info_service'] : ''
             ];
             $row['cert'] = [
                 'member_cert_birth' => $row['member_cert_birth'],
@@ -235,7 +240,7 @@ class MemberService
                 $addtime[1] = strtotime($addtime[1]);
                 $query->whereBetween('member.member_addtimes', $addtime);
             })->select('member_id', 'member_is_owner', 'member_classify', 'member_status', 'member_mobile', 'member_from', 'member_addtimes', 'member_extend_json',
-                'member_info.member_info_nickname', 'member_info.member_info_headimg',
+                'member_info.member_info_nickname', 'member_info.member_info_headimg','member_info.member_info_referee','member_info.member_info_business','member_info.member_info_service',
                 'member_role.member_role_id', 'member_role.member_role_name',
                 'member_cert.member_cert_birth', 'member_cert.member_cert_gender', 'member_cert.member_cert_name', 'member_cert.member_cert_nbr', 'member_cert.member_cert_province', 'member_cert.member_cert_addr', 'member_cert.member_cert_face', 'member_cert.member_cert_photo', 'member_cert.member_cert_nation',
 //                'member_account.member_account_surplus'
@@ -247,7 +252,10 @@ class MemberService
         foreach ($rows as $row) {
             $row['info'] = [
                 'member_info_nickname' => !empty($row['member_info_nickname']) ? $row['member_info_nickname'] : substr($row['member_mobile'], -4, 4) . '用户',
-                'member_info_headimg' => !empty($row['member_info_headimg']) ? $row['member_info_headimg'] : ''
+                'member_info_headimg' => !empty($row['member_info_headimg']) ? $row['member_info_headimg'] : '',
+                'member_info_referee' => !empty($row['member_info_referee']) ? $row['member_info_referee'] : '',
+                'member_info_business' => !empty($row['member_info_business']) ? $row['member_info_business'] : '',
+                'member_info_service' => !empty($row['member_info_service']) ? $row['member_info_service'] : ''
             ];
             $row['cert'] = [
                 'member_cert_name' => $row['member_cert_name'],
@@ -299,7 +307,10 @@ class MemberService
                 'points' => isset($account['points']) ? $account['points']['member_account_surplus'] + $account['points']['member_account_added'] : 0,
                 'is_auth' => $row['is_auth'],
                 'level' => $row['member_role_name'] ?? '普通用户',
-                'member_addtimes' => $row['member_addtimes']
+                'member_addtimes' => $row['member_addtimes'],
+                'member_info_referee' => $row['info']['member_info_referee'] ?? '',
+                'member_info_business' => $row['info']['member_info_business'] ?? '',
+                'member_info_service' => $row['info']['member_info_service'] ?? '',
             ];
         }
         return json_success('', $exportData);
@@ -317,7 +328,10 @@ class MemberService
         $member = $member->toArray();
         $member['info'] = [
             'member_info_nickname' => !empty($member['info']) && !empty($member['info']['member_info_nickname']) ? $member['info']['member_info_nickname'] : substr($member['member_mobile'], -4, 4) . '用户',
-            'member_info_headimg' => !empty($member['info']) && !empty($member['info']['member_info_headimg']) ? $member['info']['member_info_headimg'] : ''
+            'member_info_headimg' => !empty($member['info']) && !empty($member['info']['member_info_headimg']) ? $member['info']['member_info_headimg'] : '',
+            'member_info_referee' => !empty($member['info']) && !empty($member['info']['member_info_referee']) ? $member['info']['member_info_referee'] : '',
+            'member_info_business' => !empty($member['info']) && !empty($member['info']['member_info_business']) ? $member['info']['member_info_business'] : '',
+            'member_info_service' => !empty($member['info']) && !empty($member['info']['member_info_service']) ? $member['info']['member_info_service'] : '',
         ];
         $member['cert'] = [
             'member_cert_birth' => $member['cert']['member_cert_birth'] ?? '',
@@ -731,7 +745,7 @@ class MemberService
                 }
             }
 
-            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送"])) {
+            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送",'登录活动积分'])) {
                 $point['balance_type'] = 'add';
             } else {
                 $point['balance_type'] = 'cut';
@@ -739,7 +753,7 @@ class MemberService
 
             if ($key == 0) {
                 $point['balance'] = number_format($balance, 2, '.', '');
-                if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送"])) {
+                if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送",'登录活动积分'])) {
                     $balance = $balance - $point['client_points_nbr'];
                 } else {
                     $balance = $balance + $point['client_points_nbr'];
@@ -747,7 +761,7 @@ class MemberService
 
                 continue;
             }
-            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送"])) {
+            if (in_array($point['client_points_category'], ["评价", "消费", "活动", "赠送",'登录活动积分'])) {
                 $point['balance'] = number_format($balance, 2, '.', '');
                 $balance = $balance - $point['client_points_nbr'];
 //                $point['balance'] = $balance = $nowPoint = number_format($balance - $point['client_points_nbr'], 2, '.', '');
@@ -849,7 +863,10 @@ class MemberService
             $infoData = [
                 'join_info_member_id' => $memberId,
                 'member_info_nickname' => $params['account_name'] ?? '',
-                'member_info_headimg' => !empty($params['avatar']) ? getenv('SYSTEM_AVATAR_DOMAIN') . str_replace(getenv('STORAGE_DOMAIN'), '', $params['avatar']) : ''
+                'member_info_headimg' => !empty($params['avatar']) ? getenv('SYSTEM_AVATAR_DOMAIN') . str_replace(getenv('STORAGE_DOMAIN'), '', $params['avatar']) : '',
+                'member_info_referee' => $params['member_info_referee'] ?? '',
+                'member_info_business' => $params['member_info_business'] ?? '',
+                'member_info_service' => $params['member_info_service'] ?? '',
             ];
             MemberInfo::insert($infoData);
 
@@ -939,7 +956,10 @@ class MemberService
             $infoData = [
                 'join_info_member_id' => $memberId,
                 'member_info_nickname' => $params['account_name'],
-                'member_info_headimg' => $avatar
+                'member_info_headimg' => $avatar,
+                'member_info_referee' => $params['member_info_referee'] ?? '',
+                'member_info_business' => $params['member_info_business'] ?? '',
+                'member_info_service' => $params['member_info_service'] ?? '',
             ];
             if (!MemberInfo::where('join_info_member_id', $params['member_id'])->exists()) {
                 MemberInfo::insert($infoData);

+ 39 - 9
app/admin/service/notify/RechargeService.php

@@ -8,6 +8,7 @@ use app\model\MemberQuota;
 use app\model\MemberRole;
 use app\model\Order;
 use app\model\OrderSheet;
+use app\model\PayDetail;
 use app\model\RuleAdded;
 use app\model\RuleAddedComponent;
 use Monolog\Handler\IFTTTHandler;
@@ -64,15 +65,44 @@ class RechargeService
         if (!$memberAccount) {
             throw new BusinessException('账户异常');
         }
-        $income = floatval($memberAccount->member_account_income);
-        $expend = floatval($memberAccount->member_account_expend);
-        $money = max($income, $expend);
-
-        $memberRoles = MemberRole::where('member_role_status', 'ACTIVED')->get()->toArray();
-        foreach ($memberRoles as $role) {
-            if ($money >= floatval($role['member_role_range_begin']) && $money < floatval($role['member_role_range_end'])) {
-                return $role['member_role_id'];
-            }
+//        $income = floatval($memberAccount->member_account_income);
+//        $expend = floatval($memberAccount->member_account_expend);
+//        $money = max($income, $expend);
+
+        $recharge = PayDetail::where('join_pay_member_id',$memberId)
+            ->where('pay_category','RECHARGE')
+            ->where('pay_status','SUCCESS')
+            ->where(function($query){
+                $query->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY','OFFLINE_WXPAY','OFFLINE_ALIPAY','MONEY'])
+                    ->orWhere('pay_prepayid', 'like', '%CASH%');
+            })
+            ->sum('pay_amount');
+//        $expend = PayDetail::where('join_pay_member_id',$memberId)
+//            ->whereIn('pay_category',['GOODS','SERVICE','CHNMED','CHNNCD','PACKAGE','MEALS'])
+//            ->where('pay_status','SUCCESS')
+//            ->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY','OFFLINE_WXPAY','OFFLINE_ALIPAY','MONEY'])
+//            ->sum('pay_amount');
+        $paySuccessDetail = PayDetail::where('join_pay_member_id',$memberId)
+            ->where('pay_status','SUCCESS')
+            ->whereIn('pay_category',['GOODS','SERVICE','CHNMED','CHNNCD','PACKAGE','MEALS'])
+            ->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY','OFFLINE_WXPAY','OFFLINE_ALIPAY','MONEY']);
+        $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;
+
+        $money = max($recharge, $amount);
+        $memberRole = MemberRole::where('member_role_range_begin' ,'<=',$money)
+            ->where('member_role_range_end','>',$money)
+            ->first();
+        if (!empty($memberRole->member_role_id)){
+            return $memberRole->member_role_id;
         }
 
         return false;

+ 10 - 3
app/admin/service/order/OrderService.php

@@ -15,6 +15,7 @@ use support\Db;
 use support\exception\BusinessException;
 use support\Log as SupportLog;
 use support\Redis;
+use Webman\Event\Event;
 use Yansongda\Pay\Exceptions\GatewayException;
 use Yansongda\Pay\Log;
 use Yansongda\Pay\Pay;
@@ -47,6 +48,9 @@ class OrderService
                 // 订单详情表
                 OrderSheet::where('join_sheet_order_id', $order->order_id)->update(['order_sheet_status' => 'DONE']);
 
+                // 会员升级
+                Event::dispatch('order_pay.member_level.up', $order->join_order_member_id);
+
                 // 7天后自动完成 order_is_complete=Y
 //                $redis = Redis::connection();
 //                $key = Order::AUTOMATIC_COMPLETE_PREFIX . date('Ymd', strtotime("+7 days"));
@@ -76,13 +80,16 @@ class OrderService
 
             foreach ($orderIds as $orderId) {
                 $order = Order::where('order_id', $orderId)
-                    ->select('order_is_complete', 'order_category', 'order_status_system')
+                    ->select('order_is_complete', 'order_category', 'order_status_system', 'join_order_member_id')
                     ->first();
                 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']);
                     // sheet表
                     OrderSheet::where('join_sheet_order_id', $orderId)->update(['order_sheet_status' => 'DONE']);
+
+                    // 会员升级
+                    Event::dispatch('order_pay.member_level.up', $order->join_order_member_id);
                 }
             }
 
@@ -376,7 +383,7 @@ class OrderService
             'pay_prepayid' => $params['pay_category'],
             'pay_json_request' => json_encode($params),
             'pay_json_response' => $params['pay_json_response'] ?? '[]',
-            'join_pay_object_json' => !empty($params['orderId']) ? json_encode(['order_id'=>$params['orderId']]) : '[]',
+            'join_pay_object_json' => !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]',
             'pay_addtimes' => time()
         ];
 
@@ -410,7 +417,7 @@ class OrderService
         $payDetail->pay_amount = $params['order_amount_pay'];
         $payDetail->pay_paytimes = date('Y-m-d H:i:s');
         $payDetail->pay_status = 'SUCCESS';
-        $payDetail->join_pay_object_json = !empty($params['orderId']) ? json_encode(['order_id'=>$params['orderId']]) : '[]';
+        $payDetail->join_pay_object_json = !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]';
         $payDetail->save();
     }
 

+ 1 - 0
app/admin/service/statistics/OrderService.php

@@ -20,6 +20,7 @@ class OrderService
 
         $data['todayRevenue'] = PayDetail::whereRaw('CAST(UNIX_TIMESTAMP(pay_paytimes) as SIGNED) > ? ' , [$todayTimeUnix])
             ->where('join_pay_order_id','<>','')
+            ->where('pay_status', 'SUCCESS')
             ->where('pay_category', '<>', 'RETURN')
             ->where('pay_category', '<>', 'RECHARGE')
             ->where('pay_category', '<>', 'CLEAR')

+ 41 - 29
app/event/MemberLevelEvent.php

@@ -8,55 +8,67 @@ use app\model\MemberAccount;
 use app\model\MemberRole;
 use app\model\PayDetail;
 use support\Db;
+use support\exception\BusinessException;
 
 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;
+        try {
+            $member = Member::where('member_id', $memberId)->select('member_id', 'join_member_role_id', 'member_mobile')->first();
+            if ($member->member_mobile == '0000') {
+                throw new BusinessException("散客不参与升级");
+            }
+//            $account = MemberAccount::where('join_account_member_id',$memberId)->where('member_account_classify','CASH')->first();
+//            $income = $account->member_account_income;
+
+            $recharge = PayDetail::where('join_pay_member_id', $memberId)
+                ->where('pay_category', 'RECHARGE')
+                ->where('pay_status', 'SUCCESS')
+                ->where(function ($query) {
+                    $query->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY', 'OFFLINE_WXPAY', 'OFFLINE_ALIPAY', 'MONEY'])
+                        ->orWhere('pay_prepayid', 'like', '%CASH%');
+                })
+                ->sum('pay_amount');
 
-            $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%');
+            $paySuccessDetail = PayDetail::where('join_pay_member_id', $memberId)
+                ->where('pay_status', 'SUCCESS')
+                ->whereIn('pay_category', ['GOODS', 'SERVICE', 'CHNMED', 'CHNNCD', 'PACKAGE', 'MEALS'])
+                ->where(function ($query) {
+                    $query->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY', 'OFFLINE_WXPAY', 'OFFLINE_ALIPAY', 'MONEY']);
                 });
             $payAmount = $paySuccessDetail->sum('pay_amount');
-            $paySuccessDetail = $paySuccessDetail->select('pay_id','join_pay_order_id','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')
+            $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)
+            $resultAmount = max($recharge, $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){
+            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_id)->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();
+                    RechargeService::disposeAdded($memberRole->member_role_id, $memberId);
                 }
-            }elseif (!empty($memberRole->member_role_id) && empty($member->join_member_role_id)){
+            } 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();
+                RechargeService::disposeAdded($memberRole->member_role_id, $memberId);
             }
+            Db::commit();
+            _syslog("会员升级", "会员升级成功", false, ['member' => $memberId], 1001);
+        }catch (BusinessException $e){
+            Db::rollBack();
+            _syslog("会员升级","会员升级失败,原因:".$e->getMessage(),false,['member'=>$memberId],1001);
         }catch (\Exception $e){
             Db::rollBack();
             _syslog("会员升级","会员升级失败,原因:".$e->getMessage(),false,['member'=>$memberId],1001);

+ 4 - 0
route/admin.php

@@ -671,6 +671,7 @@ Route::group('/admin', function () {
         ]);
         Route::group('/writeOff',function(){
             Route::get('/list',[\app\admin\controller\member\WriteOffController::class,'list']);
+            Route::post('/remark',[\app\admin\controller\member\WriteOffController::class,'remark']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
@@ -685,6 +686,7 @@ Route::group('/admin', function () {
             Route::get('/vipInfo', [\app\admin\controller\member\MemberController::class, 'vipInfo']);
             Route::get('/coupon', [\app\admin\controller\member\MemberController::class, 'coupon']);
             Route::get('/couponCount', [\app\admin\controller\member\MemberController::class, 'couponCount']);
+            Route::get('/couponDetail', [\app\admin\controller\member\MemberController::class, 'couponDetail']);
             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']);
@@ -936,6 +938,8 @@ Route::group('/admin', function () {
         // 康养城订单
         Route::group('/kangyangCity', function () {
             Route::get('/list', [\app\admin\controller\order\KangyangCityController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\order\KangyangCityController::class, 'insert']);
+            Route::post('/pay', [\app\admin\controller\order\KangyangCityController::class, 'pay']);
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);