You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* 预约
*/
namespace App\Http\Controllers\Mobile;
use App\Helpers\ResponseCode;
use App\Helpers\StarterResponseCode;
use App\Models\Appointment;
use App\Models\AppointmentConfig;
use App\Models\Config;
use App\Models\User;
use App\Repositories\DoorRepository;
use Illuminate\Support\Facades\Validator;
class ScheduleController extends CommonController
{
/**
* @OA\Get(
* path="/api/mobile/schedule/index",
* tags={"小程序-预约管理"},
* summary="预约列表",
* description="",
* @OA\Parameter(name="status", in="query", @OA\Schema(type="string", format="date"), description="status"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="string", format="date"), description="页码"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description=""
* )
* )
*/
public function index()
{
$all = \request()->all();
$list = Appointment::with('appointmentAccompany')
->where(function ($query) use ($all) {
if (isset($all['status'])) {
$query->where('status', $all['status']);
}
})->where('user_id', $this->getUserId())->orderBy('id', 'desc')
->paginate(10);
return $this->success($list);
}
/**
* @OA\Get(
* path="/api/mobile/schedule/detail",
* tags={"小程序-预约管理"},
* summary="预约详情",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string", format="date"), description="id"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description=""
* )
* )
*/
public function detail()
{
$all = \request()->all();
$messages = [
'id.numeric' => 'id必填',
];
$validator = Validator::make($all, [
'id' => 'required|numeric',
], $messages);
if ($validator->fails()) {
return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$list = Appointment::with( 'appointmentAccompany')
->where('user_id', $this->getUserId())
->find($all['id']);
// 获取二维码
$doorRepository = new DoorRepository();
// 获取门禁二维码
$list['qrcode'] = $doorRepository->getEmpQrCode($list, $out);
return $this->success($list);
}
/**
* @OA\Get(
* path="/api/mobile/schedule/check",
* tags={"小程序-预约管理"},
* summary="检测是否可预约",
* description="",
* @OA\Parameter(name="site", in="query", @OA\Schema(type="integer"), description="预约地点id从config接口获取"),
* @OA\Parameter(name="myself", in="query", @OA\Schema(type="integer"), description="是否检测自己的数据0否1是"),
* @OA\Parameter(name="start_time", in="query", @OA\Schema(type="string", format="date-time"), description="开始时间,例如2023-01-01 11:11:11"),
* @OA\Parameter(name="end_time", in="query", @OA\Schema(type="string", format="date-time"), description="结束时间,例如2023-01-01 11:11:11"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description=""
* )
* )
*/
public function check()
{
$all = \request()->all();
$messages = [
'start_time.required' => '开始时间必填',
'end_time.required' => '结束时间必填',
'site.required' => '地点必填',
'myself.required' => '是否检测自己的数据必填',
];
$validator = Validator::make($all, [
'start_time' => 'required',
'end_time' => 'required',
'site' => 'required',
'myself' => 'required',
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$userId = 0;
if ($all['myself'] == 1) $userId = $this->getUserId();
$appointment = Appointment::checkAppointment($all['start_time'], $all['end_time'], $all['site'], $userId);
if ($appointment) {
return $this->success($appointment);
}
return $this->success([]);
}
/**
* @OA\Post(
* path="/api/mobile/schedule/save",
* tags={"小程序-预约管理"},
* summary="创建更新预约",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string", format="date"), description="存在更新,不存在新增"),
* @OA\Parameter(name="date", in="query", @OA\Schema(type="string", format="date"), description="预约日期"),
* @OA\Parameter(name="start_time", in="query", @OA\Schema(type="string", format="date-time"), description="开始时间,例如2023-01-01 11:11:11"),
* @OA\Parameter(name="end_time", in="query", @OA\Schema(type="string", format="date-time"), description="结束时间,例如2023-01-01 11:11:11"),
* @OA\Parameter(name="content", in="query", @OA\Schema(type="string"), description="预约事项"),
* @OA\Parameter(name="site", in="query", @OA\Schema(type="integer"), description="预约地点id从config接口获取"),
* @OA\Parameter(name="plate", in="query", @OA\Schema(type="string"), description="车牌号。多个英文逗号分隔"),
* @OA\Parameter(name="accompany_total", in="query", @OA\Schema(type="integer"), description="陪同人数"),
* @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), description="状态 0未审核 1审核通过 2审核不通过3取消"),
* @OA\Parameter(name="reason", in="query", @OA\Schema(type="string"), description="审核不通过原因"),
* @OA\Parameter(name="accompany", in="query", @OA\Schema(type="string"), description="陪同人员二维数组包括nameidcardmobile"),
* @OA\Parameter(name="idcard", in="query", @OA\Schema(type="string"), required=true, description="身份证号码"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description=""
* )
* )
*/
public function save()
{
$all = \request()->all();
$messages = [
'date.required' => '日期必填',
'start_time.required' => '开始时间必填',
'end_time.required' => '结束时间必填',
'content.required' => '预约事项必填',
'site.required' => '地点必填',
'accompany_total.required' => '陪同人数必填',
];
$validator = Validator::make($all, [
'date' => 'required',
'start_time' => 'required',
'end_time' => 'required',
'content' => 'required',
'site' => 'required',
'accompany_total' => 'required'
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
// 会议室同行人数不能超过上限
$appointmentConfig = AppointmentConfig::find($all['site']);
if (isset($all['id'])) {
$model = Appointment::find($all['id']);
} else {
$model = new Appointment();
// 检测是否有预约次数
if (empty(User::getHasAppointment($this->getUserId()))) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '预约次数不足']);
}
if ($appointmentConfig->room) {
if ((count($all['accompany']) + 1) > $appointmentConfig->total) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '会议室同行人数不能超过上限']);
}
}
$all['code'] = randStr(8);
}
// 判断游客只能预约特定项目
if (empty($this->getUser()->mobile) && $appointmentConfig->use_student == 1) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '游客暂无法预约']);
}
// 预约时间必须是当前时间之后
if (time() >= strtotime($all['start_time'])) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '预约开始时间必须晚于当前时间']);
}
// 判断空闲了会议室才能预约
if ($appointmentConfig->value) {
$appointment = Appointment::checkAppointment($all['start_time'], $all['end_time'], $all['site']);
if ($appointment) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '会议室已被占用']);
}
}
$all['user_id'] = $this->getUserId();
$all['name'] = $this->getUser()->name;
$all['mobile'] = $this->getUser()->mobile;
$model->fill($all);
$model->save();
// 写入陪同人员
if (isset($all['accompany']) && !empty($all['accompany'])) {
$model->appointmentAccompany()->createMany($all['accompany']);
}
// 短信通知审核人
$smsSign = Config::getValueByKey('sms_sign');
$appointment_mobile = Config::getValueByKey('appointment_mobile');
$appointment_mobile = explode(',', $appointment_mobile);
$content = "{$smsSign}您收到一个新预约,【{$this->getUser()->name}】申请预约【{$appointmentConfig->name}】,预约时间:{$model->start_time}-{$model->end_time},请您登陆管理后台进行审核。";
foreach ($appointment_mobile as $mobile) {
ymSms($mobile, $content);
}
return $this->success($model);
}
/**
* @OA\Get(
* path="/api/mobile/schedule/cancel",
* tags={"小程序-预约管理"},
* summary="取消预约",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string", format="date"), description="id"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description=""
* )
* )
*/
public function cancel()
{
$all = \request()->all();
$messages = [
'id.numeric' => 'id必填',
];
$validator = Validator::make($all, [
'id' => 'required|numeric',
], $messages);
if ($validator->fails()) {
return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$detail = Appointment::where('user_id', $this->getUserId())->find($all['id']);
if ($detail) {
$detail->status = 3;
$detail->save();
// 取消预约
Appointment::sendCancelAppoin($detail);
}
return $this->success($detail);
}
}