123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- <?php namespace App\Http\Controllers\Api;
- use App\Http\Controllers\Api\Api;
- use App\Models\Course as Model;
- use App\Models\Orders as Orders;
- use App\Models\Product;
- use App\Models\Product\Skus as ProductSkus;
- use App\Http\Requests\Api\Course as Request;
- use App\Models\Business;
- use App\Models\CustomAddr;
- use App\Models\OrdersProduct;
- use App\Models\CourseSchedule;
- use App\Models\CourseReservation;
- use Illuminate\Support\Facades\DB;
- /**
- * 课程接口
- *
- * @author jun
- *
- * */
- class Course extends Api{
- /**
- * 预约课程 /api/course/reservation
- *
- * @param string $car_info 需要下单的产品ID
- * @param string $buyer_number 需要下单的数量
- *
- * */
- public function reservation(Request $request,Model $Model,OrdersProduct $OrdersProduct,CourseSchedule $CourseSchedule,CourseReservation $CourseReservation){
- // 接口验签
- // $this->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()]]);
- }
- }
- }
|