Commit 4987d99e by 杨树贤

导入csv问题

parent b011c852
......@@ -9,6 +9,7 @@ use App\Http\Transformers\SupplierExaminationTransformer;
use App\Model\IntracodeModel;
use App\Model\SupplierChannelModel;
use App\Model\SupplierExaminationModel;
use App\Utils\CsvValueBinder;
use Maatwebsite\Excel\Facades\Excel;
class SupplierExaminationService
......@@ -54,139 +55,143 @@ class SupplierExaminationService
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('该文件已经上传过,请选择其它文件');
$result = $reader->getSheet(0)->toArray();
$header = $result[0];
if (!$this->checkImportCsvHeader($header)) {
throw new \Exception('文件不是标准上传模板,请核对后再上传');
}
}, $fileType);
$valueBinder = new CsvValueBinder();
$data = Excel::setValueBinder($valueBinder)->load($filePath, $fileType)->get();
if (empty($data)) {
throw new \Exception('上传数据不能为空');
}
$data = $data->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;
$item = array_map(function ($value) {
return trim($value);
}, $item);
$orderSn = $item[0];
$purchaseSn = $item[1];
$examineTime = $item[2];
$salesName = $item[3];
$channelUserName = $item[4];
$ticketType = $item[5];
$supplierName = $item[6];
$skuName = $item[7];
$brandName = $item[8];
$amount = $item[9];
$batch = $item[10];
$producingArea = $item[11];
$stockInDate = $item[12];
$incomeSn = $item[13];
$deliverySn = $item[14];
$tallyRequest = $item[15];
$examineRequest = $item[16];
$unhealthyAmount = $item[17];
$abnormalLevel = $item[18];
$unhealthyContent = $item[19];
$examineResult = $item[20];
$remark = $item[21];
if (empty($supplierName)) {
throw new \Exception("供应商名称不能为空! (第${lineNo}行),请修改后再次提交");
}
//获取所有采购员用于校验
$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);
$orderSn = $item[0];
$purchaseSn = $item[1];
$examineTime = $item[2];
$salesName = $item[3];
$channelUserName = $item[4];
$ticketType = $item[5];
$supplierName = $item[6];
$skuName = $item[7];
$brandName = $item[8];
$amount = $item[9];
$batch = $item[10];
$producingArea = $item[11];
$stockInDate = $item[12];
$incomeSn = $item[13];
$deliverySn = $item[14];
$tallyRequest = $item[15];
$examineRequest = $item[16];
$unhealthyAmount = $item[17];
$abnormalLevel = $item[18];
$unhealthyContent = $item[19];
$examineResult = $item[20];
$remark = $item[21];
if (empty($supplierName)) {
throw new \Exception("供应商名称不能为空! (第${lineNo}行),请修改后再次提交");
}
if (empty($examineTime)) {
throw new \Exception("检货时间不能为空! (第${lineNo}行),请修改为 2000-01-01 这种格式后再次提交");
}
if (!isDateTime($examineTime)) {
throw new \Exception("检货时间格式不规范! (第${lineNo}行),请修改为 2000-01-01 这种格式后再次提交");
}
if (!empty($stockInDate) && !isDateTime($stockInDate)) {
throw new \Exception("入库日期时间格式不规范! (第${lineNo}行),请修改后再次提交");
}
if (!in_array($supplierName, $supplierNames)) {
throw new \Exception("存在无效供应商(供应商系统不存在)的数据(第${lineNo}行),请修改后再次提交");
}
if (!in_array($channelUserName, $channelUserNames)) {
throw new \Exception("存在无效的采购员(第${lineNo}行),请修改后再次提交");
}
if (empty($skuName)) {
throw new \Exception("型号不能为空! (第${lineNo}行),请修改后再次提交");
}
if (empty($brandName)) {
throw new \Exception("品牌不能为空! (第${lineNo}行),请修改后再次提交");
}
if (!is_numeric($amount) || empty($amount)) {
throw new \Exception("数量只能为纯数字且不能为空! (第${lineNo}行),请修改后再次提交");
}
if (!is_numeric($unhealthyAmount) || empty($unhealthyAmount)) {
throw new \Exception("不良数量只能为纯数字且不能为空 (第${lineNo}行),请修改后再次提交");
}
if (empty($examineResult) || !in_array($examineResult,
array_values(config('field.SupplierExamineResult')))) {
throw new \Exception("检验结果只能(退货|特批入库|正常入库)其中一个且不能为空 (第${lineNo}行),请修改后再次提交");
}
if (!empty($abnormalLevel) && !in_array($abnormalLevel, [1, 2, 3])) {
throw new \Exception("存在不合理的异常等级,等级必须为纯数字1,2,3或者不填 (第${lineNo}行),请修改后再次提交");
}
$examineData[] = [
'order_sn' => $orderSn,
'purchase_sn' => $purchaseSn,
'examine_time' => $examineTime ? strtotime($examineTime) : 0,
'sales_name' => $salesName,
'purchase_name' => $channelUserName,
'ticket_type' => $ticketType,
'supplier_name' => $supplierName,
'sku_name' => $skuName,
'brand_name' => $brandName,
'amount' => $amount,
'batch' => $batch,
'producing_area' => $producingArea,
'stock_in_date' => $stockInDate ? strtotime($stockInDate) : 0,
'income_sn' => $incomeSn,
'delivery_sn' => $deliverySn,
'tally_request' => $tallyRequest,
'examine_request' => $examineRequest,
'unhealthy_amount' => $unhealthyAmount,
'abnormal_level' => $abnormalLevel,
'unhealthy_content' => $unhealthyContent,
'examine_result' => $examineResult,
'remark' => $remark,
'create_time' => time(),
'data_md5' => $dataMd5,
'create_uid' => request()->user->userId,
'create_name' => request()->user->name,
];
if (empty($examineTime)) {
throw new \Exception("检货时间不能为空! (第${lineNo}行),请修改为 2000-01-01 这种格式后再次提交");
}
$examineData = collect($examineData);
if (!isDateTime($examineTime)) {
throw new \Exception("检货时间格式不规范! (第${lineNo}行),请修改为 2000-01-01 这种格式后再次提交");
}
foreach ($examineData->chunk(50) as $chunk) {
SupplierExaminationModel::insert($chunk->toArray());
if (!empty($stockInDate) && !isDateTime($stockInDate)) {
throw new \Exception("入库日期时间格式不规范! (第${lineNo}行),请修改后再次提交");
}
return true;
}, $fileType);
if (!in_array($supplierName, $supplierNames)) {
throw new \Exception("存在无效供应商(供应商系统不存在)的数据(第${lineNo}行),请修改后再次提交");
}
if (!in_array($channelUserName, $channelUserNames)) {
throw new \Exception("存在无效的采购员(第${lineNo}行),请修改后再次提交");
}
if (empty($skuName)) {
throw new \Exception("型号不能为空! (第${lineNo}行),请修改后再次提交");
}
if (empty($brandName)) {
throw new \Exception("品牌不能为空! (第${lineNo}行),请修改后再次提交");
}
if (!is_numeric($amount) || empty($amount)) {
throw new \Exception("数量只能为纯数字且不能为空! (第${lineNo}行),请修改后再次提交");
}
if (!is_numeric($unhealthyAmount) || empty($unhealthyAmount)) {
throw new \Exception("不良数量只能为纯数字且不能为空 (第${lineNo}行),请修改后再次提交");
}
if (empty($examineResult) || !in_array($examineResult,
array_values(config('field.SupplierExamineResult')))) {
throw new \Exception("检验结果只能(退货|特批入库|正常入库)其中一个且不能为空 (第${lineNo}行),请修改后再次提交");
}
if (!empty($abnormalLevel) && !in_array($abnormalLevel, [1, 2, 3])) {
throw new \Exception("存在不合理的异常等级,等级必须为纯数字1,2,3或者不填 (第${lineNo}行),请修改后再次提交");
}
$examineData[] = [
'order_sn' => $orderSn,
'purchase_sn' => $purchaseSn,
'examine_time' => $examineTime ? strtotime($examineTime) : 0,
'sales_name' => $salesName,
'purchase_name' => $channelUserName,
'ticket_type' => $ticketType,
'supplier_name' => $supplierName,
'sku_name' => $skuName,
'brand_name' => $brandName,
'amount' => $amount,
'batch' => $batch,
'producing_area' => $producingArea,
'stock_in_date' => $stockInDate ? strtotime($stockInDate) : 0,
'income_sn' => $incomeSn,
'delivery_sn' => $deliverySn,
'tally_request' => $tallyRequest,
'examine_request' => $examineRequest,
'unhealthy_amount' => $unhealthyAmount,
'abnormal_level' => $abnormalLevel,
'unhealthy_content' => $unhealthyContent,
'examine_result' => $examineResult,
'remark' => $remark,
'create_time' => time(),
'data_md5' => $dataMd5,
'create_uid' => request()->user->userId,
'create_name' => request()->user->name,
];
}
$examineData = collect($examineData);
foreach ($examineData->chunk(50) as $chunk) {
SupplierExaminationModel::insert($chunk->toArray());
}
return true;
} catch (\Exception $exception) {
return $exception->getMessage();
} finally {
unlink($filePath);
return true;
}
return true;
}
private function checkImportCsvHeader($header)
......
......@@ -248,4 +248,5 @@ function makePassword($length)
function isDateTime($dateTime){
$ret = strtotime($dateTime);
return $ret !== FALSE && $ret != -1;
}
\ No newline at end of file
}
<?php
namespace App\Utils;
use PHPExcel_Cell;
use PHPExcel_Cell_DataType;
use PHPExcel_Cell_IValueBinder;
use PHPExcel_Cell_DefaultValueBinder;
class CsvValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
{
public function bindValue(PHPExcel_Cell $cell, $value = null)
{
if (is_numeric($value)) {
$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
return true;
}
return parent::bindValue($cell, $value);
}
}
\ No newline at end of file
......@@ -363,7 +363,7 @@ return array(
|
*/
'heading' => 'false',
'heading' => 'true',
/*
|--------------------------------------------------------------------------
......
销售订单号,采购订单号,*检货时间,销售,*采购员,A/B单,*供应商,*型号,*品牌,*数量,批次,产地,入库日期,来货单号,送货单,理货要求,验货要求,*不良数,异常等级,不良现象,*检验结果,备注
1202206066763112,1202206066763133,2020/2/3,123,易敏,123,深圳市华之电科技有限公司,123,123,123,123,123,2020/2/3,123,123,123,123,123,1,特批入库,特批入库,123
1202206066763114444,120220606676313555,2020/2/3,123,易敏,123,深圳市华之电科技有限公司,123,123,123,123,123,2020/2/3,123,123,123,123,123,1,特批入库,特批入库,123
......@@ -64,7 +64,7 @@
{type: 'checkbox'},
{field: 'id', title: 'ID', align: 'center', width: 80},
{field: 'order_sn', title: '销售订单号', align: 'center', width: 150},
{field: 'purchase_sn', title: '采购订单号', align: 'center', width: 150},
{field: 'purchase_sn', title: '采购订单号', align: 'center', width: 160},
{
field: 'examine_time', title: '检货时间', align: 'center', width: 130
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment