love_php/app/Http/Controllers/Server/Admin/ReservationConsultController.php

563 lines
22 KiB
PHP
Raw Normal View History

2026-04-02 09:20:51 +08:00
<?php
namespace App\Http\Controllers\Server\Admin;
use App\Http\Controllers\Controller;
use App\Models\ConsultAccount;
use App\Models\ConsultationRecords;
use App\Models\SaasReservationConsultScheduling;
use App\Models\SaasReservationTeacher;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class ReservationConsultController extends Controller
{
/**
* 选择预约老师列表
* @param Request $request
* @return \Illuminate\Http\JsonResponse|string
*/
public function consultAccountList(Request $request)
{
try {
$merchant_id = $request->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());
}
}
}