account_id; $where = [ ['merchant_id', '=', $merchant_id] ]; $ids = SaasReservationTeacher::where($where)->pluck('consult_account_id'); $list = ConsultAccount::where($where)->whereNotIn('id', $ids)->get(); return $this->success('ok', $list); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约老师列表 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function reservationTeacherList(Request $request) { try { $merchant_id = $request->account_id; $list = SaasReservationTeacher::with('consultAccount') ->where('merchant_id', $merchant_id) ->orderBy('id','desc') ->paginate(); return $this->success('ok', $list); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约老师数据添加 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function reservationTeacherAdd(Request $request) { try { $merchant_id = $request->account_id; $consult_account_id = $request->input('consult_account_id'); $check = SaasReservationTeacher::where('merchant_id', $merchant_id) ->where('consult_account_id', $consult_account_id) ->first(); if ($check) { return $this->failure('预约老师已添加过了'); } $check = ConsultAccount::where('merchant_id', $merchant_id) ->where('id', $consult_account_id) ->first(); if (!$check) { return $this->failure('老师数据未找到'); } $model = new SaasReservationTeacher; $model->merchant_id = $merchant_id; $model->consult_account_id = $consult_account_id; if (!$model->save()) { return $this->failure('数据添加失败'); } return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约老师配置时间数据列表 * @param Request $request * @param $id * @return \Illuminate\Http\JsonResponse|string */ public function consultSchedulingList(Request $request, $id) { try { $merchant_id = $request->account_id; $keyword = $request->input('keyword'); $where = [ ['merchant_id', '=', $merchant_id], ['reservation_teacher_id', '=', $id], ]; if($keyword){ $where[] = ['date','like',"%{$keyword}%"]; } $list = SaasReservationConsultScheduling::where($where) ->selectRaw("*,left(date_range,5) as start_time,right(date_range,5) as end_time") ->orderBy('date', 'desc') ->orderBy('start_time', 'asc') ->paginate(); foreach ($list as $item){ $item->already_reservation_num = (new ConsultationRecords())->getAlreadyReservationNum($merchant_id,$item->id); } return $this->success('ok', $list); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约老师配置时间数据列表v2 * @param Request $request * @param $id * @return \Illuminate\Http\JsonResponse|string */ public function consultSchedulingListV2(Request $request, $id) { try { $merchant_id = $request->account_id; $start_date = $request->input('start_date'); if (!$start_date) { return $this->failure('开始日期不能为空'); } $end_date = $request->input('end_date'); if (!$end_date) { return $this->failure('结束日期不能为空'); } $where = [ ['merchant_id', '=', $merchant_id], ['reservation_teacher_id', '=', $id], ]; $list = SaasReservationConsultScheduling::where($where) ->whereBetween('date', [$start_date, $end_date]) ->selectRaw("*,left(date_range,5) as start_time,right(date_range,5) as end_time") ->orderBy('date', 'desc') ->orderBy('start_time', 'asc') ->get(); foreach ($list as $item){ $item->already_reservation_num = (new ConsultationRecords())->getAlreadyReservationNum($merchant_id,$item->id); } return $this->success('ok', $list); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约老师配置时间添加 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function consultSchedulingAdd(Request $request) { try { $merchant_id = $request->account_id; $date = $request->input('date') ?? ''; if (empty($date)) { return $this->failure('日期不能为空'); } $reservation_teacher_id = $request->input('reservation_teacher_id') ?? ''; if (empty($reservation_teacher_id)) { return $this->failure('reservation_teacher_id不能为空'); } $date_range = $request->input('date_range') ?? ''; if (empty($date_range)) { return $this->failure('时间段不能为空'); } $can_reservation_num = $request->input('can_reservation_num', 0); $is_show = $request->input('is_show', 0); $where = [ ['merchant_id', '=', $merchant_id], ['reservation_teacher_id', '=', $reservation_teacher_id], ['date', '=', $date], ['date_range', '=', $date_range], ]; $check = SaasReservationConsultScheduling::where($where)->first(); if ($check) { return $this->failure('日期/时间段数据已存在'); } $date_range_arr = explode('-',$date_range); $date_range_arr[0] = strtotime($date_range_arr[0]); $date_range_arr[1] = strtotime($date_range_arr[1]); $data = SaasReservationConsultScheduling::where('merchant_id',$merchant_id) ->where('reservation_teacher_id',$reservation_teacher_id) ->where('date',$date) ->pluck('date_range'); foreach ($data as $item) { $history_date_range = explode('-', $item); $history_date_range[0] = strtotime($history_date_range[0]); $history_date_range[1] = strtotime($history_date_range[1]); if ($date_range_arr[0] > $history_date_range[0] && $date_range_arr[0] < $history_date_range[1]) { return $this->failure('冲突其他已设置的时间段'.$item); } if ($date_range_arr[1] > $history_date_range[0] && $date_range_arr[1] < $history_date_range[1]) { return $this->failure('冲突其他已设置的时间段'.$item); } } $model = new SaasReservationConsultScheduling; $model->merchant_id = $merchant_id; $model->reservation_teacher_id = $reservation_teacher_id; $model->date = $date; $model->date_range = $date_range; $model->can_reservation_num = $can_reservation_num; $model->residue_num = $can_reservation_num; $model->is_show = $is_show; if (!$model->save()) { return $this->failure('添加数据失败'); } return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约老师配置时间添加 - 批量v2 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function consultSchedulingBatchAddV2(Request $request) { try { $validator = Validator::make($request->all(), [ 'week_repeat' => 'required|array', 'start_date' => 'required', 'end_date' => 'required', 'reservation_teacher_id' => 'required', 'date_range' => 'required', 'can_reservation_num' => 'required', 'is_show' => 'numeric' ], [ 'week_repeat.required' => '重复日期不能为空', 'start_date.required' => '开始日期不能为空', 'end_date.required' => '结束日期不能为空', 'date_range.required' => '预约时间段不能为空' ]); $error = $validator->errors()->first(); if ($error) { return $this->failure($error); } $merchant_id = $request->account_id; $week_repeat = $request->input('week_repeat'); $start_date = $request->input('start_date'); $end_date = $request->input('end_date'); $reservation_teacher_id = $request->input('reservation_teacher_id', 0); $date_range = $request->input('date_range', ''); $can_reservation_num = $request->input('can_reservation_num', 0); $is_show = $request->input('is_show', 0); $week_array = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; $diff = array_diff($week_array, $week_repeat); if (count($diff) != (count($week_array) - count($week_repeat))) { return $this->failure('重复日期数据错误'); } //组装写入数据 $data = []; $created_at = $updated_at = date('Y-m-d H:i:s'); $start_date_time = strtotime($start_date); $end_date_time = strtotime($end_date); for ($i = $start_date_time; $i <= $end_date_time; $i += 86400) { $date = date('Y-m-d', $i); //日期 $week = date('w', strtotime($date)); $week_text = $week_array[$week]; //周几 if (in_array($week_text, $week_repeat)) { $residue_num = $can_reservation_num; $data[] = compact('merchant_id', 'reservation_teacher_id', 'date', 'date_range', 'can_reservation_num', 'residue_num', 'is_show','created_at','updated_at'); } } //检验是否冲突其他时间段 foreach ($data as $item) { $date_range = explode('-', $item['date_range']); $start_time = $date_range[0]; $end_time = $date_range[1]; $check = SaasReservationConsultScheduling::query() ->where('merchant_id', $merchant_id) ->where('reservation_teacher_id', $reservation_teacher_id) ->where('date', $item['date']) ->where('is_show', 1) ->where(function ($query) use ($start_time, $end_time) { $query->orWhereRaw("(LEFT(date_range,5) > '$start_time' and LEFT(date_range,5) < '$end_time')") ->orWhereRaw("(LEFT(date_range,5) <= '$start_time' and RIGHT(date_range,5) >= '$end_time')") ->orWhereRaw("(RIGHT(date_range, 5) > '$start_time' and RIGHT(date_range, 5) < '$end_time')"); }) ->first(); if ($check) { $error = "{$item['date']} {$item['date_range']}冲突其他已设置的时间段{$check['date']} {$check['date_range']}"; return $this->failure($error); } } $res = (new SaasReservationConsultScheduling)->insert($data); if (!$res) { return $this->failure('添加数据失败'); } return $this->success('ok'); } catch (\Exception $e) { return $this->failure($e->getMessage()); } } /** * 预约老师配置时间添加 - 批量 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function consultSchedulingBatchAdd(Request $request) { try { $merchant_id = $request->account_id; $date = $request->input('date') ?? ''; if (empty($date)) { return $this->failure('日期不能为空'); } $reservation_teacher_id = $request->input('reservation_teacher_id') ?? ''; if (empty($reservation_teacher_id)) { return $this->failure('reservation_teacher_id不能为空'); } $batch_scheduling = $request->input('batch_scheduling') ?? ''; $batch_scheduling = json_decode($batch_scheduling,true); if(!$batch_scheduling){ return $this->failure('批量设置数据不能为空'); } //已设置过的时间段 $date_range_map = SaasReservationConsultScheduling::where('merchant_id',$merchant_id) ->where('reservation_teacher_id',$reservation_teacher_id) ->where('date',$date) ->pluck('date_range'); $data = []; $date_time = date('Y-m-d H:i:s'); $created_at = $updated_at = $date_time; foreach ($batch_scheduling as $item) { $date_range = $item['date_range'] ?? ''; if (!$date_range) { return $this->failure('有时间段数据未填写'); } //对比时间段是否冲突已设置时间段 $date_range_arr = explode('-', $date_range); $start_time = strtotime($date_range_arr[0]); $end_time = strtotime($date_range_arr[1]); foreach ($date_range_map as $val) { if ($date_range == $val) { return $this->failure("{$date_range}时间段已设置过"); } $history_date_range = explode('-', $val); $history_start_time = strtotime($history_date_range[0]); $history_end_time = strtotime($history_date_range[1]); $c1 = $start_time >= $history_start_time && $start_time < $history_end_time; $c2 = $end_time > $history_start_time && $end_time < $history_end_time; if ($c1 || $c2) { return $this->failure("{$date_range}冲突其他已设置的时间段{$val}"); } } $can_reservation_num = $item['can_reservation_num'] ?? 0; $is_show = $item['is_show'] ?? 0; $row = compact('merchant_id', 'reservation_teacher_id', 'date','date_range', 'can_reservation_num', 'is_show','created_at','updated_at'); $data[] = $row; } $res = (new SaasReservationConsultScheduling)->insert($data); if (!$res) { return $this->failure('添加数据失败'); } return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约老师配置时间编辑 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function consultSchedulingEdit(Request $request) { try { $merchant_id = $request->account_id; $id = $request->input('id'); if (empty($id)) { return $this->failure('id不能为空'); } $date = $request->input('date') ?? ''; if (empty($date)) { return $this->failure('日期不能为空'); } $reservation_teacher_id = $request->input('reservation_teacher_id') ?? ''; if (empty($reservation_teacher_id)) { return $this->failure('reservation_teacher_id不能为空'); } $date_range = $request->input('date_range') ?? ''; if (empty($date_range)) { return $this->failure('时间段不能为空'); } $can_reservation_num = $request->input('can_reservation_num', 0); $is_show = $request->input('is_show', 0); $model = SaasReservationConsultScheduling::find($id); if (!$model) { return $this->failure('数据不存在'); } if ($date != $model->date || $date_range != $model->date_range) { $where = [ ['merchant_id', '=', $merchant_id], ['reservation_teacher_id', '=', $reservation_teacher_id], ['date', '=', $date], ['date_range', '=', $date_range], ]; $check = SaasReservationConsultScheduling::where($where)->first(); if ($check) { return $this->failure('日期/时间段数据已存在'); } } //已经预约人数 $already_reservation_num = (new ConsultationRecords())->getAlreadyReservationNum($merchant_id,$id); $residue_num = $can_reservation_num - $already_reservation_num; if($residue_num < 0){ return $this->failure('可预约人数不能小于已预约人数'); } $date_range_arr = explode('-',$date_range); $date_range_arr[0] = strtotime($date_range_arr[0]); $date_range_arr[1] = strtotime($date_range_arr[1]); $data = SaasReservationConsultScheduling::where('merchant_id',$merchant_id) ->where('reservation_teacher_id',$reservation_teacher_id) ->where('date',$date) ->where('id', '!=', $model->id) ->pluck('date_range'); foreach ($data as $item) { if($date_range == $item){ continue; } $history_date_range = explode('-', $item); $history_date_range[0] = strtotime($history_date_range[0]); $history_date_range[1] = strtotime($history_date_range[1]); if ($date_range_arr[0] > $history_date_range[0] && $date_range_arr[0] < $history_date_range[1]) { return $this->failure('冲突其他已设置的时间段'.$item); } if ($date_range_arr[1] > $history_date_range[0] && $date_range_arr[1] < $history_date_range[1]) { return $this->failure('冲突其他已设置的时间段'.$item); } } $model->merchant_id = $merchant_id; $model->reservation_teacher_id = $reservation_teacher_id; $model->date = $date; $model->date_range = $date_range; $model->can_reservation_num = $can_reservation_num; $model->residue_num = $residue_num; $model->is_show = $is_show; $model->save(); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约咨询配置时间删除 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function consultSchedulingDel(Request $request) { try { $merchant_id = $request->account_id; $id = $request->input('id'); if (empty($id)) { return $this->failure('id不能为空'); } $where = [ ['merchant_id', '=', $merchant_id], ['id', '=', $id], ]; $data = SaasReservationConsultScheduling::where($where)->first(); if ($data) { $data->delete(); } return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure($e->getMessage()); } } /** * 预约指定时间段记录 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function reservationRecord(Request $request) { try { $merchant_id = $request->account_id; $scheduling_id = $request->input('scheduling_id'); $list = ConsultationRecords::with('reservationConsult') ->select('name','phone','created_at','scheduling_id') ->where('merchant_id',$merchant_id) ->where('scheduling_id',$scheduling_id) ->where('pay_status',1) ->paginate(); return $this->success('ok',$list); }catch (\Exception $e){ $this->getError($e); return $this->failure($e->getMessage()); } } /** * 更改开关状态 * @param Request $request * @return \Illuminate\Http\JsonResponse|string */ public function schedulingChangeIsShow(Request $request) { try { $merchant_id = $request->account_id; $id = $request->id; $is_show = $request->is_show ?? null; $data = SaasReservationConsultScheduling::where('id',$id)->where('merchant_id',$merchant_id)->first(); if($id && !is_null($is_show) && $data){ $data->is_show = $is_show; $data->save(); } return $this->success('ok'); }catch (\Exception $e){ $this->getError($e); return $this->failure($e->getMessage()); } } }