verify_sign(); // 验证参数 $request->scene('reservation')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $scheduleId = (int)request('schedule_id',''); $courseId = (int)request('course_id',''); //订单课程预约信息 $ordersProductInfo = $OrdersProduct->query() ->whereColumn('course_number','>','reservation_number') ->where([['course_id','=',$courseId],['custom_uid','=',$uid],['status','=',2]]) ->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'=>'您购买的课程节数已用完']]); $ordersProductId = (int)$ordersProductInfo['id']; //上课表信息 $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'=>'此时段课程已预满']]); if ($courseScheduleInfo['start_time'] <= time()) 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','=',$ordersProductInfo['id'])->increment('reservation_number'); if (!$update) // 返回结果 return json_send(['code'=>'error','msg'=>'预约失败','data'=>['id'=>$ordersProductId,'error'=>'更新订单预约数据']]); // 更新课程表预约数据 $updateSchedule = $CourseSchedule->query()->where('id','=',$scheduleId)->update(['reservation_number'=>$courseScheduleInfo['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,Orders $orders){ // 接口验签 // $this->verify_sign(); // 验证参数 $request->scene('get_list')->validate(); // 检查登录 $uid = $this->checkLogin(); // 接收参数 $status = request('status',0); $limit = request('limit',10); // 显示 //$map[] = ['orders.custom_uid','=',$uid]; $map = []; // 查询状态 if( $status ) $map[] = ['course.status','=',$status]; // 查询订单课程 // $Paginator = $orders->query() // ->join('orders_product','orders_product.order_id','=','orders.id') // ->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); $Paginator = $Model->query() ->select('course.*', DB::raw('count(kailin_course_reservation.id) as course_reservation_number')) ->leftJoin('course_reservation','course.id','=','course_reservation.course_id') ->where($map) ->groupBy('course.id') ->paginate($limit); 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], ]; // 查询状态 $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) ->orderBy('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: $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()]]); } } }