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.
163 lines
9.0 KiB
163 lines
9.0 KiB
<?php
|
|
|
|
namespace App\Http\Requests;
|
|
|
|
use App\Models\Visit;
|
|
use App\Models\VisitArea;
|
|
use App\Models\VisitTime;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class VisitRequest extends FormRequest
|
|
{
|
|
/**
|
|
* Determine if the user is authorized to make this request.
|
|
*/
|
|
public function authorize(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get the validation rules that apply to the request.
|
|
*/
|
|
public function rules(): array
|
|
{
|
|
$id = $this->input('id');
|
|
$visitId = $this->route('id') ?? $id;
|
|
|
|
return [
|
|
'date' => 'required|date|after_or_equal:today',
|
|
'visit_time_id' => 'required|exists:visit_times,id',
|
|
'visit_area_id' => 'required|exists:visit_areas,id',
|
|
'reason' => 'required|string|max:500',
|
|
'name' => 'required|string|max:100',
|
|
'mobile' => 'required|regex:/^1[3-9]\d{9}$/',
|
|
'credent' => 'required|in:1,2',
|
|
'idcard' => 'required_if:credent,1|nullable|string|max:20',
|
|
'company_name' => 'required|string|max:200',
|
|
'type' => 'required|in:1,2,3',
|
|
'long_time' => 'boolean',
|
|
'start_date' => 'nullable|date',
|
|
'end_date' => 'nullable|date|after_or_equal:start_date',
|
|
'accpet_department_id' => 'nullable|exists:departments,id',
|
|
'accept_admin_id' => 'nullable|exists:admins,id',
|
|
'plate' => 'nullable|string|max:20',
|
|
'follw_people' => 'nullable|array',
|
|
'cars' => 'nullable|array',
|
|
'file' => 'nullable|array',
|
|
'remark' => 'nullable|string|max:1000',
|
|
'accept_goods_admin_id' => 'nullable|exists:admins,id',
|
|
'work_start_time' => 'nullable|date',
|
|
'work_end_time' => 'nullable|date|after_or_equal:work_start_time',
|
|
'car_no' => 'nullable|string|max:50',
|
|
'person_no' => 'nullable|string|max:50',
|
|
'accompany_id' => 'nullable|exists:admins,id',
|
|
'need_meal' => 'boolean',
|
|
'meal_type' => 'nullable|in:1,2,3,4',
|
|
'meal_count' => 'nullable|integer|min:1|max:100',
|
|
'meal_remark' => 'nullable|string|max:500',
|
|
'meal_preferences' => 'nullable|array',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get custom messages for validator errors.
|
|
*/
|
|
public function messages(): array
|
|
{
|
|
return [
|
|
'date.required' => __('validation.required', ['attribute' => __('visit.date')]),
|
|
'date.date' => __('validation.date', ['attribute' => __('visit.date')]),
|
|
'date.after_or_equal' => __('validation.after_or_equal', ['attribute' => __('visit.date'), 'date' => __('visit.today')]),
|
|
'visit_time_id.required' => __('validation.required', ['attribute' => __('visit.visit_time')]),
|
|
'visit_time_id.exists' => __('validation.exists', ['attribute' => __('visit.visit_time')]),
|
|
'visit_area_id.required' => __('validation.required', ['attribute' => __('visit.visit_area')]),
|
|
'visit_area_id.exists' => __('validation.exists', ['attribute' => __('visit.visit_area')]),
|
|
'reason.required' => __('validation.required', ['attribute' => __('visit.reason')]),
|
|
'reason.max' => __('validation.max.string', ['attribute' => __('visit.reason'), 'max' => 500]),
|
|
'name.required' => __('validation.required', ['attribute' => __('visit.name')]),
|
|
'name.max' => __('validation.max.string', ['attribute' => __('visit.name'), 'max' => 100]),
|
|
'mobile.required' => __('validation.required', ['attribute' => __('visit.mobile')]),
|
|
'mobile.regex' => __('validation.regex', ['attribute' => __('visit.mobile')]),
|
|
'credent.required' => __('validation.required', ['attribute' => __('visit.credent')]),
|
|
'credent.in' => __('validation.in', ['attribute' => __('visit.credent')]),
|
|
'idcard.required_if' => __('validation.required_if', ['attribute' => __('visit.idcard'), 'other' => __('visit.credent'), 'value' => __('visit.credent_id_card')]),
|
|
'idcard.max' => __('validation.max.string', ['attribute' => __('visit.idcard'), 'max' => 20]),
|
|
'company_name.required' => __('validation.required', ['attribute' => __('visit.company_name')]),
|
|
'company_name.max' => __('validation.max.string', ['attribute' => __('visit.company_name'), 'max' => 200]),
|
|
'type.required' => __('validation.required', ['attribute' => __('visit.type')]),
|
|
'type.in' => __('validation.in', ['attribute' => __('visit.type')]),
|
|
'long_time.boolean' => __('validation.boolean', ['attribute' => __('visit.long_time')]),
|
|
'start_date.date' => __('validation.date', ['attribute' => __('visit.start_date')]),
|
|
'end_date.date' => __('validation.date', ['attribute' => __('visit.end_date')]),
|
|
'end_date.after_or_equal' => __('validation.after_or_equal', ['attribute' => __('visit.end_date'), 'date' => __('visit.start_date')]),
|
|
'accpet_department_id.exists' => __('validation.exists', ['attribute' => __('visit.accept_department')]),
|
|
'accept_admin_id.exists' => __('validation.exists', ['attribute' => __('visit.accept_admin')]),
|
|
'plate.max' => __('validation.max.string', ['attribute' => __('visit.plate'), 'max' => 20]),
|
|
'follw_people.array' => __('validation.array', ['attribute' => __('visit.follow_people')]),
|
|
'cars.array' => __('validation.array', ['attribute' => __('visit.cars')]),
|
|
'file.array' => __('validation.array', ['attribute' => __('visit.file')]),
|
|
'remark.max' => __('validation.max.string', ['attribute' => __('visit.remark'), 'max' => 1000]),
|
|
'accept_goods_admin_id.exists' => __('validation.exists', ['attribute' => __('visit.accept_goods_admin')]),
|
|
'work_start_time.date' => __('validation.date', ['attribute' => __('visit.work_start_time')]),
|
|
'work_end_time.date' => __('validation.date', ['attribute' => __('visit.work_end_time')]),
|
|
'work_end_time.after_or_equal' => __('validation.after_or_equal', ['attribute' => __('visit.work_end_time'), 'date' => __('visit.work_start_time')]),
|
|
'car_no.max' => __('validation.max.string', ['attribute' => __('visit.car_no'), 'max' => 50]),
|
|
'person_no.max' => __('validation.max.string', ['attribute' => __('visit.person_no'), 'max' => 50]),
|
|
'accompany_id.exists' => __('validation.exists', ['attribute' => __('visit.accompany')]),
|
|
'need_meal.boolean' => __('validation.boolean', ['attribute' => __('visit.need_meal')]),
|
|
'meal_type.in' => __('validation.in', ['attribute' => __('visit.meal_type')]),
|
|
'meal_count.integer' => __('validation.integer', ['attribute' => __('visit.meal_count')]),
|
|
'meal_count.min' => __('validation.min.numeric', ['attribute' => __('visit.meal_count'), 'min' => 1]),
|
|
'meal_count.max' => __('validation.max.numeric', ['attribute' => __('visit.meal_count'), 'max' => 100]),
|
|
'meal_remark.max' => __('validation.max.string', ['attribute' => __('visit.meal_remark'), 'max' => 500]),
|
|
'meal_preferences.array' => __('validation.array', ['attribute' => __('visit.meal_preferences')]),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Configure the validator instance.
|
|
*/
|
|
public function withValidator($validator): void
|
|
{
|
|
$validator->after(function ($validator) {
|
|
// 检查访问区域是否可用
|
|
if ($this->has('visit_area_id')) {
|
|
$area = VisitArea::find($this->input('visit_area_id'));
|
|
if (!$area) {
|
|
$validator->errors()->add('visit_area_id', __('visit.area_not_available'));
|
|
}
|
|
}
|
|
|
|
// 检查访问时段是否可用
|
|
if ($this->has('visit_time_id')) {
|
|
$time = VisitTime::find($this->input('visit_time_id'));
|
|
if (!$time || !$time->isAvailable()) {
|
|
$validator->errors()->add('visit_time_id', __('visit.time_not_available'));
|
|
}
|
|
}
|
|
|
|
// 检查长期访问的时间范围
|
|
if ($this->input('long_time') && (!$this->has('start_date') || !$this->has('end_date'))) {
|
|
$validator->errors()->add('long_time', __('visit.long_time_requires_dates'));
|
|
}
|
|
|
|
// 检查物流车辆类型需要收货人
|
|
if ($this->input('type') == Visit::TYPE_LOGISTICS_CAR && !$this->has('accept_goods_admin_id')) {
|
|
$validator->errors()->add('accept_goods_admin_id', __('visit.logistics_car_requires_goods_admin'));
|
|
}
|
|
|
|
// 检查用餐信息
|
|
if ($this->input('need_meal')) {
|
|
if (!$this->has('meal_type')) {
|
|
$validator->errors()->add('meal_type', __('visit.meal_type_required_when_need_meal'));
|
|
}
|
|
if (!$this->has('meal_count') || $this->input('meal_count') < 1) {
|
|
$validator->errors()->add('meal_count', __('visit.meal_count_required_when_need_meal'));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|