verify_sign(); // 验证参数 $request->scene('reservation')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $ordersProductId = request('orders_product_id',''); $scheduleId = request('schedule_id',''); //订单课程预约信息 $ordersProductInfo = $OrdersProduct->query()->where('id','=',$ordersProductId)->first(); if (!$ordersProductInfo) return json_send(['code'=>'error','msg'=>'订单课程不存在','data'=>['error'=>'订单课程不存在']]); if ($ordersProductInfo['course_number'] <= $ordersProductInfo['reservation_number']) return json_send(['code'=>'error','msg'=>'您购买的课程节数已用完','data'=>['error'=>'您购买的课程节数已用完']]); //上课表信息 $courseScheduleInfo = $CourseSchedule->query()->where('id','=',$scheduleId)->first(); if (!$courseScheduleInfo) return json_send(['code'=>'error','msg'=>'预约课程不存在','data'=>['error'=>'预约课程不存在']]); if ($courseScheduleInfo['course_number'] <= $ordersProductInfo['reservation_number']) return json_send(['code'=>'error','msg'=>'此时段课程已预满','data'=>['error'=>'此时段课程已预满']]); $data = [ 'orders_product_id' => $ordersProductId, 'schedule_id' => $scheduleId, 'uid' => $uid, 'order_id' => $ordersProductInfo['order_id'], 'product_id' => $ordersProductInfo['product_id'], 'course_id' => $courseScheduleInfo['course_id'], 'teacher_id' => $courseScheduleInfo['teacher_id'], 'start_time' => $courseScheduleInfo['start_time'], 'end_time' => $courseScheduleInfo['start_time'], ]; DB::beginTransaction(); // 写入数据 try { // 更新订单预约数据 $update = $OrdersProduct->query()->where('id','=',$ordersProductId)->update(['reservation_number'=>$ordersProductInfo['reservation_number']+1]); if (!$update) // 返回结果 return json_send(['code'=>'success','msg'=>'预约失败','data'=>['id'=>null]]); // 更新课程表预约数据 $updateSchedule = $CourseSchedule->query()->where('id','=',$scheduleId)->update(['reservation_number'=>$ordersProductInfo['reservation_number']+1]); if (!$updateSchedule){ DB::rollBack(); // 错误提示 return json_send(['code'=>'error','msg'=>'预约失败','data'=>['error'=>'更新课程表预约数据失败']]); } //添加到预约课程表 $reservationId = $CourseReservation->add($data); if( !$reservationId ) { // 回退数据 DB::rollBack(); // 错误提示 return json_send(['code'=>'error','msg'=>'预约失败','data'=>['error'=>'添加预约失败']]); } // 提交数据 DB::commit(); // 返回结果 return json_send(['code'=>'success','msg'=>'预约成功','data'=>['id'=>$reservationId]]); // 返回结果 } catch (\Throwable $th) { // 回退数据 DB::rollBack(); // 判断结果,如果库存扣减失败的话 if( stripos($th->getMessage(),'UNSIGNED') ) return json_send(['code'=>'error','msg'=>'预约失败','data'=>['error'=>'订单课程修改错误']]); // 下单失败提示 return json_send(['code'=>'error','msg'=>'预约失败','data'=>['error'=>$th->getMessage().$th->getLine()]]); } } /** * 获取上课列表 /api/course/get_list * * @param int $page 页码,默认1 * @param int $limit 每页条数,默认10条 * * */ public function get_list(Request $request,Model $Model,OrdersProduct $OrdersProduct){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('get_list')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $status = request('status',1); $limit = request('limit',10); // 显示 $map = [ ['orders_product.custom_uid','=',$uid], ]; // 查询状态 if( $status ) $map[] = ['orders_product.status','=',$status]; $select = [ 'orders_product.id as orders_product_id', 'orders_product.pay_total','orders_product.status', 'orders_product.price_total', 'orders_product.coupon_total', 'orders_product.pay_total', 'orders_product.course_id', 'orders_product.order_id', 'orders_product.course_number', 'orders_product.reservation_number', 'orders_product.product_id', 'course.name as course_name', 'course.address', 'course.desc', 'course.image', ]; // 查询订单课程 $Paginator = $OrdersProduct->query() ->join('course','orders_product.course_id','=','course.id') ->where($map) ->whereColumn('orders_product.reservation_number','<','orders_product.course_number') ->orderByDesc('orders_product.id') ->paginate($limit, $select); foreach ($Paginator->items() as &$orders_product) { $orders_product['image'] = path_compat($orders_product['image']); } // 获取数据 $data['total'] = $Paginator->total(); $data['current_page'] = $Paginator->currentPage(); $data['per_page'] = $Paginator->perPage(); $data['last_page'] = $Paginator->lastPage(); $data['data'] = $Paginator->items(); // 返回结果 return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]); } /** * 获取排课列表 /api/course/get_schedule_list * * */ public function get_schedule_list(Request $request,Model $Model,CourseSchedule $CourseSchedule){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('get_schedule_list')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $status = request('status',0); $limit = request('limit',10); $courseId = request('course_id',10); $ordersProductId = request('orders_product_id',10); // 显示一周的数据 $start = strtotime(date('Y-m-d')); $end = strtotime(date('Y-m-d', strtotime('+7 day')),); $map = [ ['course_schedule.course_id','=',$courseId], ['course_schedule.start_time','>',$start], ['course_schedule.end_time','<',$end], ]; // 查询状态 if( $status ) $map[] = ['course_schedule.status','=',$status]; $select = [ 'course_schedule.id', 'course_schedule.course_id', 'course_schedule.teacher_id', 'course_schedule.start_time', 'course_schedule.end_time', 'course_schedule.duration', 'course_schedule.course_number', 'course_schedule.reservation_number', 'course_teacher.name as teacher_name', 'course_teacher.desc as teacher_desc', 'course.name as course_name', 'course.image as course_image', 'course.desc as course_desc', 'course.address', ]; // 查询订单课程 $data = $CourseSchedule->query() ->join('course','course_schedule.course_id','=','course.id') ->join('course_teacher','course_schedule.teacher_id','=','course_teacher.id') ->where($map) ->orderByDesc('course_schedule.start_time') ->select($select) ->get(); //用户已预约课程 $courseReservation = CourseReservation::query()->where(['uid'=>$uid,'status'=>1])->select('schedule_id')->get()->toArray(); $reservationIds = array_column($courseReservation,'schedule_id'); $list = []; foreach ($data as &$dataItem) { $dataItem['course_image'] = path_compat($dataItem['course_image']); //按老师分组 $list[$dataItem['teacher_id']]['teacher_id'] = $dataItem['teacher_id']; $list[$dataItem['teacher_id']]['teacher_name'] = $dataItem['teacher_name']; //判断排课是否已预约:1预约,0未预约 if (in_array($dataItem['id'],$reservationIds)) { $dataItem['reservation_status'] = 1; }else{ $dataItem['reservation_status'] = 0; } $list[$dataItem['teacher_id']]['list'][] = $dataItem; } $list = array_values($list); // 返回结果 return json_send(['code'=>'success','msg'=>'获取成功','data'=>$list]); } /** * 预约列表 /api/course/reservation_list * * @param int $page 页码,默认1 * @param int $limit 每页条数,默认10条 * * */ public function reservation_list(Request $request,Model $Model,OrdersProduct $OrdersProduct,CourseSchedule $CourseSchedule,CourseReservation $CourseReservation){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('reservation_list')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $status = request('status',0); $limit = request('limit',10); $map = [ ['course_reservation.uid','=',$uid], ]; // 查询状态 if( $status ) $map[] = ['course_reservation.status','=',$status]; $select = [ 'course_reservation.*', 'course_teacher.name as teacher_name', 'course_teacher.desc as teacher_desc', 'course_teacher.pic as teacher_pic', 'course.name as course_name', 'course.address as course_address', ]; $Paginator = $CourseReservation->query() ->join('course','course_reservation.course_id','=','course.id') ->join('course_teacher','course_reservation.teacher_id','=','course_teacher.id') ->where($map) ->orderByDesc('course_reservation.id') ->paginate($limit, $select); $time = time(); foreach ($Paginator->items() as &$reservation) { $reservation['teacher_pic'] = path_compat($reservation['teacher_pic']); switch ($reservation['status']){ case 1: if ($reservation['start_time'] <= $time){ $reservation['status'] = 3; $reservation['status_name'] = '已完成'; }else{ $reservation['status_name'] = '待上课'; } break; case 2: $reservation['status_name'] = '已取消'; break; case 3: $reservation['status_name'] = '已完成'; break; } } // 获取数据 $data['total'] = $Paginator->total(); $data['current_page'] = $Paginator->currentPage(); $data['per_page'] = $Paginator->perPage(); $data['last_page'] = $Paginator->lastPage(); $data['data'] = $Paginator->items(); // 返回结果 return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]); } /** * 取消预约 /api/course/cancel_reservation * * @param int $page 页码,默认1 * @param int $limit 每页条数,默认10条 * * */ public function cancel_reservation(Request $request,Model $Model,OrdersProduct $OrdersProduct,CourseSchedule $CourseSchedule,CourseReservation $CourseReservation){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('cancel_reservation')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $ordersProductId = request('orders_product_id',''); $scheduleId = request('schedule_id',''); $id = request('id',''); //订单课程预约信息 $time = time(); $ordersProductInfo = $OrdersProduct->query()->where('id','=',$ordersProductId)->first(); if (!$ordersProductInfo) return json_send(['code'=>'error','msg'=>'订单课程不存在','data'=>['error'=>'订单课程不存在']]); //上课表信息 $courseScheduleInfo = $CourseSchedule->query()->where('id','=',$scheduleId)->first(); if (!$courseScheduleInfo) return json_send(['code'=>'error','msg'=>'预约课程不存在','data'=>['error'=>'预约课程不存在']]); if ($courseScheduleInfo['start_time'] <= $time) return json_send(['code'=>'error','msg'=>'已过上课时间','data'=>['error'=>'已过上课时间']]); DB::beginTransaction(); // 写入数据 try { // 更新订单预约数据 $update = $OrdersProduct->query()->where('id','=',$ordersProductId)->update(['reservation_number'=>$ordersProductInfo['reservation_number']-1]); if (!$update) // 返回结果 return json_send(['code'=>'success','msg'=>'取消预约失败','data'=>['id'=>null]]); //添加到预约课程表 // 更新订单预约数据 $updateReservation = $CourseReservation->query()->where('id','=',$id)->update(['status'=>2]); if (!$updateReservation) // 返回结果 return json_send(['code'=>'success','msg'=>'取消预约失败','data'=>['id'=>null]]); if( !$updateReservation ) { // 回退数据 DB::rollBack(); // 错误提示 return json_send(['code'=>'error','msg'=>'取消预约失败','data'=>['error'=>'取消预约失败']]); } // 提交数据 DB::commit(); // 返回结果 return json_send(['code'=>'success','msg'=>'取消预约成功','data'=>['id'=>$updateReservation]]); // 返回结果 } catch (\Throwable $th) { // 回退数据 DB::rollBack(); // 判断结果,如果库存扣减失败的话 if( stripos($th->getMessage(),'UNSIGNED') ) return json_send(['code'=>'error','msg'=>'取消预约失败','data'=>['error'=>'订单课程修改错误']]); // 下单失败提示 return json_send(['code'=>'error','msg'=>'取消预约失败','data'=>['error'=>$th->getMessage().$th->getLine()]]); } } }