<?php namespace App\Http\Validators; use App\Http\Services\SupplierPayTypeService; use App\Model\SupplierAttachmentModel; use App\Model\SupplierAttachmentsModel; use App\Model\SupplierChannelModel; use App\Model\SupplierContactModel; use App\Model\SupplierReceiptModel; use Validator; class SupplierValidator { //保存相关的验证,别问我为什么不用laravel自带的form-request类 //因为控制器那边已经被之前的人魔改的难用的一比,而且控制器那边还接收了一大堆统一变量 public function checkSave($validateData, $isAudit) { //整理下请求数据 $validateData = $this->transformRequestData($validateData); //这个supplierId是用来判断是新增还是修改的 $supplierId = array_get($validateData, 'supplier_id'); //如果是修改直接提交,不是点申请审核的,只需要校验供应商名称是否存在即可 if (!$isAudit) { if (empty($validateData['supplier_name'])) { return '供应商名称 不能为空'; } if (empty($supplierId)) { $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name'])->count(); } else { $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name']) ->where('supplier_id', '!=', $supplierId)->count(); } if ($count) { return "该供应商名称已经存在,请核验后再提交"; } return null; } $rules = [ 'supplier_type' => 'required', 'supplier_name' => 'required', 'legal_representative' => 'required', 'stockup_type' => 'required', 'main_brands' => 'required', 'pay_type' => 'required', 'settlement_type' => 'required', 'currency' => 'required', 'main_customers' => 'max:100', 'ticket_time' => 'max:20', 'region' => 'required', 'cn_delivery_time' => 'regex:/^\d+\-\d$/', 'us_delivery_time' => 'regex:/^\d+\-\d$/', 'shipping_address' => 'max:100', //'billing_period_detail' => 'required|max:100', 'return_address' => 'max:100', 'return_consignee' => 'max:50', 'return_phone' => 'max:50', 'cn_ratio' => 'min:1', 'us_ratio' => 'min:1', ]; $contactRuler = [ 'supplier_consignee' => 'required|max:50', 'supplier_mobile' => 'required|max:30', 'supplier_telephone' => 'required|max:30', 'supplier_email' => 'required|email', 'supplier_position' => 'required|max:30', 'can_check_uids' => 'required', ]; $errorMessageList = []; /** * --->>附件必填要求: * 如果供应商类别为正式供应商,营业执照、开票资料必须上传,供应商性质为现货商,则品质保证协议必须上传; * 如果供应商类别为临时供应商,营业执照、开票资料必须上传,品质保证协议不需要上传 **/ //只有在提交供应商是正式的时候,才会去校验附件 //校验附件这块,新增和修改判断的逻辑不一样 if (empty($supplierId)) { $attachmentFields = array_unique($validateData['field_name']); } else { $attachmentFields = SupplierAttachmentsModel::where('supplier_id', $supplierId)->get()->pluck('field_name')->toArray(); } if (!$attachmentFields) { $errorMessageList[] = '请上传附件'; } $attachmentFields = array_unique($attachmentFields); //fixed.php FileNameMapping 可以知道所有对应关系 if (!in_array('business_license', $attachmentFields)) { $errorMessageList[] = '营业执照必须上传'; } if (!in_array('billing_information', $attachmentFields)) { $errorMessageList[] = '开票资料必须上传'; } if ($validateData['supplier_type'] == 1 && $validateData['supplier_group'] == 2) { if (!in_array('quality_assurance_agreement', $attachmentFields)) { $errorMessageList[] = '供应商为正式供应商,并且供应商类型是现货商,则品质保证协议必须上传'; } } //银行信息校验 $receiptValidator = new ReceiptValidator(); if (empty($supplierId)) { $receiptData = array_only($validateData, [ 'receipt_type', 'bank_name', 'bank_adderss', 'account_no', 'account_name', 'account_adderss', 'certificate', 'swift_code', ]); $receiptValidateResult = $receiptValidator->checkSave($receiptData, true); if ($receiptValidateResult) { $errorMessageList = array_merge($errorMessageList, $receiptValidateResult); } } else { $receipts = SupplierReceiptModel::where('supplier_id', $supplierId)->get()->toArray(); if (!$receipts) { $errorMessageList[] = '供应商至少有一个财务信息,请补全'; } else { foreach ($receipts as $receipt) { $receiptValidateResult = $receiptValidator->checkSave($receipt); if ($receiptValidateResult) { $errorMessageList[] = $receiptValidateResult; } } } } //联系人校验 if (empty($supplierId)) { $rules = array_merge($rules, $contactRuler); } else { //修改的时候,还要去判断联系人是否有 //至少要有一个联系方式 $contactCount = SupplierContactModel::where('supplier_id', $supplierId)->count(); if (!$contactCount) { $errorMessageList[] = "供应商至少要有一个联系人,请补全"; } } //币种为人民币的话需要验证税号 if ($validateData['currency'] == 1) { $rules['tax_number'] = 'required'; } //如果付款方式为账期,那么月结天数一定要选 if ($validateData['pay_type'] == 1) { if (!$validateData['pay_type_value']) { $errorMessageList[] = '付款方式选择账期,月结天数必须设置'; } } //新增的时候,渠道开发 不能为空 if (empty($supplierId)) { $rules['purchase_uid'] = 'required'; } $messages = $this->messages(); $validator = Validator::make($validateData, $rules, $messages); if ($validator->fails()) { $errors = $validator->errors()->all(); $errorMessageList = array_merge($errors, $errorMessageList); } //检验名称是否已经存在数据库 if (!empty($validateData['supplier_name'])) { $companyNameCount = 0; if (empty($supplierId)) { $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name'])->count(); $companyNameCount = SupplierChannelModel::where('register_company_name', $validateData['register_company_name'])->where('register_company_name', '!=', '')->count(); } else { $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name']) ->where('supplier_id', '!=', $supplierId)->count(); } if ($count) { $errorMessageList[] = "该供应商名称已经存在,请核验后再提交"; } if ($companyNameCount) { $errorMessageList[] = "该注册公司名已经存在,请核验后再提交"; } } if (!empty($supplierId)) { //还要去判断当前提交人是否存在与其关联的联系人没有完善 $codeId = request()->user->codeId; $notCompleteContacts = SupplierContactModel::where('supplier_id', $supplierId) ->where('can_check_uids', $codeId) ->where(function ($q) { $q->where('supplier_consignee', '') ->orWhere('supplier_position', '') ->orWhere('supplier_email', '') ->orWhere('supplier_mobile', '') ->orWhere('supplier_telephone', ''); })->get(); $notCompleteContacts = !empty($notCompleteContacts) ? $notCompleteContacts->toArray() : []; if ($notCompleteContacts) { $errorMessageList[] = "存在和你相关的联系人没有完善,请先去完善相关联系人"; } } return implode('|', $errorMessageList); } private function messages() { return [ 'supplier_type.required' => '供应商类别 不能为空', 'supplier_name.required' => '供应商名称 不能为空', 'currency.required' => '结算币种 不能为空', 'legal_representative.required' => '法人代表 不能为空', 'stockup_type.required' => '合作类型 不能为空', 'pay_type.required' => '付款周期 不能为空', 'settlement_type.required' => '结算方式 不能为空', 'register_company_name.required' => '注册公司名 不能为空', 'supplier_group.required' => '公司性质 不能为空', 'supplier_address.required' => '注册地址 不能为空', 'region.required' => '所在区域 不能为空', 'purchase_uid.required' => '渠道开发员 不能为空', 'cn_ratio.min' => '人民币系数必须是大于1的浮点数', 'business_license.required' => '营业执照 不能为空', 'established_time.required' => '成立时间 不能为空', 'us_ratio.min' => '美金系数必须是大于1的浮点数', 'us_delivery_time.regex' => '香港货期格式不正确', 'cn_delivery_time.regex' => '大陆货期格式不正确', 'tax_number.required' => '如果选择币种为人民币,则公司税号 不能为空', 'supplier_consignee.required' => '联系方式的联系人 不能为空', 'supplier_consignee.max' => '联系方式的联系人不能超过50个字符', 'supplier_position.required' => '联系方式的职称 不能为空', 'supplier_position.max' => '联系方式的职称不能超过30个字符', 'supplier_telephone.required' => '联系方式的座机号 不能为空', 'supplier_mobile.required' => '联系方式的手机号 不能为空', 'supplier_mobile.max' => '联系方式的手机号不能超过30个字符', 'supplier_email.required' => '联系方式的邮箱 不能为空', 'supplier_email.email' => '联系方式的邮箱格式不对', 'can_check_uids.required' => '联系方式对应的采购员 不能为空', 'shipping_address.required' => '发货地址 不能为空', 'shipping_address.max' => '发货地址不能超过100个字符', 'return_address.max' => '退货地址不能超过100个字符', 'return_consignee.max' => '退货收货人不能超过50个字符', 'return_phone.max' => '退货收货人电话不能超过50个字符', 'main_brands.required' => '主营品牌 不能为空', 'main_customers.max' => '3-5家客户描述不能超过100个字符', 'ticket_time.max' => '到票时间不能超过20个字符', 'billing_period_detail.required' => '账期详情 不能为空', 'billing_period_detail.max' => '账期详情不能超过100个字符', ]; } public function transformRequestData( $validateData ) { foreach ($validateData as &$item) { if (!is_array($item)) { $item = trim($item); } } return $validateData; } }