563 lines
22 KiB
PHP
563 lines
22 KiB
PHP
<?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());
|
|
}
|
|
}
|
|
|
|
|
|
} |