<?php namespace App\Http\Services; use App\Http\Validators\SupplierValidator; use App\Model\LogModel; use App\Model\SupplierChannelModel; use App\Model\SupplierContactModel; class SupplierAuditService { public function auditSupplier($supplierId, $status, $rejectReason) { $model = new SupplierChannelModel(); //先找出原来供应商的状态 $supplierModel = new SupplierChannelModel(); $supplier = $supplierModel->where('supplier_id', $supplierId)->first()->toArray(); //如果需要复审并且审核状态为审核中,则代表这次审核为第一次审核或者供应商类型从临时修改为正式 if ($supplier['status'] == SupplierChannelModel::STATUS_IN_REVIEW && $supplier['need_review'] == 1) { //第一次审核,通过是将审核状态置为待复审 //通过 if ($status == SupplierChannelModel::STATUS_PASSED) { $dbStatus = SupplierChannelModel::STATUS_NEED_REVIEW; } else { //不通过 $dbStatus = $status; } $update = [ 'update_time' => time(), 'status' => $dbStatus, 'reject_reason' => $rejectReason, ]; $result = $model->where('supplier_id', $supplierId)->update($update); //如果是待复审状态,通过的话还要将是否需要复审状态置为0 } elseif ($supplier['status'] === SupplierChannelModel::STATUS_NEED_REVIEW) { if ($status == SupplierChannelModel::STATUS_PASSED) { $result = $model->where('supplier_id', $supplierId)->update([ 'update_time' => time(), 'status' => $status, 'reject_reason' => $rejectReason, 'need_review' => 0, ]); $supplier['need_review'] = 0; } else { $result = $model->where('supplier_id', $supplierId)->update([ 'update_time' => time(), 'status' => $status, 'reject_reason' => $rejectReason, ]); } //剩下的就是普通的审核 } else { $result = $model->where('supplier_id', $supplierId)->update([ 'update_time' => time(), 'status' => $status, 'reject_reason' => $rejectReason, ]); } $action = '审核供应商'; if ($result) { //如果状态是复审 if ($supplier['status'] == SupplierChannelModel::STATUS_NEED_REVIEW) { $auditStatus = $status == SupplierChannelModel::STATUS_PASSED ? '复审通过 ' . $rejectReason : '复审不通过,原因是 : ' . $rejectReason; $action = '复审供应商'; } else { $auditStatus = $status == SupplierChannelModel::STATUS_PASSED ? '审核通过 ' . $rejectReason : '审核不通过,原因是 : ' . $rejectReason; } $logService = new LogService(); $content = $auditStatus; $logService->AddLog($supplierId, LogModel::UPDATE_OPERATE, $action, $content); } //复审通过状态的供应商才会同步到金蝶 if ($supplier['need_review'] == 0) { //发送队列消息同步到金蝶 $service = new SyncSupplierService(); $service->syncSupplierToErp($supplierId); if ($status == SupplierChannelModel::STATUS_PASSED) { if (!checkPerm('IgnoreCompanyCheck')) { //判断有公司信息才允许同步给一体化 $regionType = $supplier['region'] == SupplierChannelModel::REGION_CN ? 1 : 2; if ($regionType == 2) { (new SyncSupplierService())->syncSupplierToUnited($supplierId); } else { $supplier['tax_number'] = $supplier['supplier_name'] ?: $supplier['tax_number']; $company = (new CompanyService())->getCompanyInfo($supplier['supplier_name'], $supplier['tax_number'], $regionType); if (!empty($company)) { if (!empty($company['tax_number'])) { SupplierChannelModel::where('supplier_id', $supplierId)->update([ 'tax_number' => $company['tax_number'], ]); } //同步给一体化系统 (new SyncSupplierService())->syncSupplierToUnited($supplierId); } } } else { (new SyncSupplierService())->syncSupplierToUnited($supplierId); } } } return $result; } public function CheckCanApplyInReview($supplierIds) { foreach ($supplierIds as $supplierId) { $supplier = SupplierChannelModel::where('supplier_id', $supplierId)->first()->toArray(); //要将部分字段从0改成'',要不然表单验证会有问题 $needChangeField = [ 'pay_type', 'currency', 'supplier_group', 'supplier_type', 'settlement_type', ]; foreach ($supplier as $key => &$value) { if (in_array($key, $needChangeField) && empty($value)) { $value = ''; } } unset($value); $validator = new SupplierValidator(); return $validator->checkSave($supplier, true); } } //判断是否是可以由当前用户审核 //要判断审核供应商的最后修改人,是不是属于当前审批人的部门或者部下,是才能让他审核 public function CheckCanAuditSupplier($supplierId) { //忽略上面所说的限制(权限) if (checkPerm('IgnoreAuditCheck')) { return true; } $supplierModel = new SupplierChannelModel(); $supplier = $supplierModel->where('supplier_id', $supplierId)->first()->toArray(); $auditUserId = request()->user->userId; $logModel = new LogModel(); //找出不能跳过审核检查并且是更新操作的日志,默认都是不能跳过 $log = $logModel->where('supplier_id', $supplierId) ->where('type', LogModel::UPDATE_OPERATE) ->where('ignore_audit_check', 0)->orderBy('id', 'desc')->first(); $log = $log ? $log->toArray() : []; //判断供应商,如果是第一次新增的供应商,要去判断创建人是否属于审核人相关的部门 //别问我为啥不加多一个状态,这个审核流程是突然改成这样子的,没法加... if (empty($log)) { $lastUpdateUserId = $supplier['create_uid']; } else { $lastUpdateUserId = $log['admin_id']; if ($lastUpdateUserId == 1000) { return true; } } //专门给采购助理这个账号要做特殊逻辑,采购系统那边没有按照正常流程去判断,导致这个账号的部门分布完全不合理,所以供应商系统这边只能恶心自己去加特殊跳过了 if ($lastUpdateUserId == config('field.AssistantUserId')) { return true; } //审批人只能审批自己的部下修改的供应商 $departmentService = new DepartmentService(); $subordinateUserIds = $departmentService->getSubordinateUserIds($auditUserId); if (in_array($lastUpdateUserId, $subordinateUserIds) || in_array($supplier['create_uid'], $subordinateUserIds)) { return true; } return false; } //判断是否为待跟进供应商 public function checkIsNeedToFollowUpSupplier($supplierId) { $model = new SupplierChannelModel(); $supplier = $model->where('supplier_id', $supplierId)->first(); //针对非禁止交易状态的供应商重新分配渠道员,且必填信息不完整 if (!empty($supplier) && ($supplier['status'] != SupplierChannelModel::STATUS_DISABLE)) { //开始检查 //如果全部必填字段都有了,就返回false(不需要跟进) if ($this->checkHasAllRequireField($supplier)) { return false; } else { return true; } } //或者单纯只是禁用状态的供应商重新分配渠道员,也是要处理待跟进状态 if (!empty($supplier) && ($supplier['status'] == SupplierChannelModel::STATUS_DISABLE)) { //开始检查 return true; } return false; } //检查必填字段,false缺少必填字段 public function checkHasAllRequireField($supplier) { //先检查基础字段 if (empty($supplier['supplier_name']) || empty($supplier['region']) || empty($supplier['legal_representative'])) { return false; } if (empty($supplier['stockup_type']) || empty($supplier['supplier_group']) || empty($supplier['qualification_photos'])) { return false; } //再检查营业执照是否有 if (isset($supplier['qualification_photos']['business_license']) && empty($supplier['qualification_photos']['business_license'])) { return false; } //检查是否有联系方式 $contactModel = new SupplierContactModel(); $count = $contactModel->where('supplier_id', $supplier['supplier_id'])->count(); //没有联系方式,就需要去跟进 if (!$count) { return false; } //联系方式和当前采购数量对不上,也要跟进 $channelUserNumber = count(explode(',', $supplier['channel_uid'])); if ($channelUserNumber != $count) { return false; } return true; } //判断是否要进入审核中状态,因为部分字段修改是不需要走审核的,这是更新之前的校验 public function checkNeedAudit($supplierId, $channel) { $notNeedAuditField = [ 'register_company_name', 'supplier_name_en', 'province_id', 'city_id', 'established_time', 'credit_investigation', 'system_tags', 'customer_tags', 'sku_tag', 'sku_tag', 'sku_tag', 'sku_upload_ruler', 'sku_audit_ruler', 'stockup_type' ]; //先找出目前数据库里面的数据 $selectField = array_keys($channel); $model = new SupplierChannelModel; $status = $model->where('supplier_id', $supplierId)->value('status'); //只要是未通过的,都要进入审核 if ($status == SupplierChannelModel::STATUS_REJECT) { return true; } $supplier = $model->select($selectField)->where('supplier_id', $supplierId)->first()->toArray(); //如果有忽略审核的权限并且不需要复审,那么状态就是不需要审核直接通过 $canIgnoreAudit = $this->checkCanIgnoreSupplierAudit($supplierId); if ($canIgnoreAudit) { return false; } $changeField = []; foreach ($supplier as $key => $value) { if ($value != $channel[$key]) { $changeField[] = $key; } } foreach ($changeField as $field) { //只要有一个不存在于不需要审核的字段,就返回需要审核 if (!in_array($field, $notNeedAuditField)) { return true; } else { if ($field === 'stockup_type') { //还要单独判断供应商的stockup_type,只有是操作芯链这个值的时候,才不去审核,真是服了 $oldStockupType = explode(',', trim($supplier['stockup_type'], '')); $newStockupType = explode(',', trim($channel['stockup_type'], '')); if (count($oldStockupType) > count($newStockupType)) { $modifyStockupType = array_diff($oldStockupType, $newStockupType); } else { $modifyStockupType = array_diff($newStockupType, $oldStockupType); } if (array_values($modifyStockupType) != ['5']) { return true; } } } } return false; } //判断是否可以直接忽略修改审核 public function checkCanIgnoreSupplierAudit($supplierId) { $needReview = SupplierChannelModel::where('supplier_id', $supplierId)->value('need_review'); //如果有忽略审核的权限并且不需要复审,那么状态就是不需要审核直接通过 if (checkPerm('IgnoreUpdateAudit') && !$needReview) { return true; } else { return false; } } }