<?php namespace App\Http\Services; use App\Http\Controllers\Filter\SupplierExaminationFilter; use App\Http\Transformers\SupplierExaminationTransformer; use App\Model\IntracodeModel; use App\Model\SupplierChannelModel; use App\Model\SupplierExaminationModel; use Maatwebsite\Excel\Facades\Excel; class SupplierExaminationService { public function getSupplierExaminationList($request) { $limit = $request->get('limit', 10); $filter = new SupplierExaminationFilter(); $query = $filter->listFilter($request); $list = $query->paginate($limit)->toArray(); $transformer = new SupplierExaminationTransformer(); $list['data'] = $transformer->transformList($list['data']); return $list; } //保存 public function saveSupplierExamination($data) { $data['examine_time'] = strtotime($data['examine_time']); if (!empty($data['id'])) { $data['update_time'] = time(); return SupplierExaminationModel::where('id', $data['id'])->update($data); } else { $data['create_time'] = time(); return SupplierExaminationModel::insert($data); } } //删除 public function deleteSupplierExaminations($ids) { return SupplierExaminationModel::whereIn('id', $ids)->delete(); } //上传 public function ImportSupplierExamination($filePath) { ini_set('memory_limit', -1); try { $content = file_get_contents($filePath); $fileType = mb_detect_encoding($content, array('UTF-8', 'GBK', 'LATIN1', 'BIG5')); Excel::load($filePath, function ($reader) { $data = $reader->getSheet(0)->toArray(); $dataMd5 = md5(json_encode($data)); if (SupplierExaminationModel::where('data_md5', $dataMd5)->exists()) { throw new \Exception('该文件已经上传过,请选择其它文件'); } //获取所有采购员用于校验 $channelUsers = (new IntracodeModel())->getAllEncode(); $channelUserNames = array_column($channelUsers, 'name'); $supplierNames = (new SupplierChannelModel())->where('is_type', 0)->pluck('supplier_name')->toArray(); //拼装数据插入校验,校验完成插入数据库 $examineData = []; foreach ($data as $index => $item) { $lineNo = $index + 1; //检测模板头部 if ($index == 0) { if (!$this->checkImportCsvHeader($item)) { throw new \Exception('文件不是标准上传模板'); } continue; } $item = array_map(function ($value) { return trim($value); }, $item); $examineTime = $item[0]; $channelUserName = $item[1]; $supplierName = $item[2]; $skuName = $item[3]; $brandName = $item[4]; $amount = $item[5]; $examineAmount = $item[6]; $unhealthyAmount = $item[7]; $abnormalLevel = (int)$item[8]; $unhealthyContent = $item[9]; $examineResult = $item[10]; $handleWay = $item[11]; $remark = $item[12]; if (empty($supplierName)) { throw new \Exception("存在供应商名称为空的数据(第${lineNo}行),请修改后再次提交"); } if (!in_array($supplierName,$supplierNames)) { throw new \Exception("存在无效供应商的数据(第${lineNo}行),请修改后再次提交"); } if (!in_array($channelUserName,$channelUserNames)) { throw new \Exception("存在无效的采购员(第${lineNo}行),请修改后再次提交"); } if (!is_integer($amount)) { throw new \Exception("数量只能为纯数字(第${lineNo}行),请修改后再次提交"); } if (!is_integer($examineAmount)) { throw new \Exception("检测数量只能为纯数字(第${lineNo}行),请修改后再次提交"); } if (!is_integer($unhealthyAmount)) { throw new \Exception("不良数量只能为纯数字(第${lineNo}行),请修改后再次提交"); } if (!in_array($abnormalLevel,[1,2,3])) { throw new \Exception("存在不合理的异常等级,等级必须为纯数字1,2,3 (第${lineNo}行),请修改后再次提交"); } $examineData[] = [ 'examine_time' => $examineTime ? strtotime($examineTime) : '', 'purchase_name' => $channelUserName, 'supplier_name' => $supplierName, 'sku_name' => $skuName, 'brand_name' => $brandName, 'amount' => $amount, 'examine_amount' => $examineAmount, 'unhealthy_amount' => $unhealthyAmount, 'abnormal_level' => $abnormalLevel, 'unhealthy_content' => $unhealthyContent, 'examine_result' => $examineResult, 'handle_way' => $handleWay, 'remark' => $remark, 'data_md5' => $dataMd5, ]; } $examineData = collect($examineData); foreach ($examineData->chunk(50) as $chunk) { SupplierExaminationModel::insert($chunk->toArray()); } return true; }, $fileType); } catch (\Exception $exception) { return $exception->getMessage(); } finally { unlink($filePath); } return true; } private function checkImportCsvHeader($header) { $validHeader = [ '检货时间', '采购员', '供应商', '型号', '品牌', '数量', '检验数量', '不良数', '异常等级', '不良现象', '检验结果', '处理方式', '备注' ]; return $validHeader == $header; } }