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