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

<?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'));
}
}
});
}
}