fix: 导入模板校验问题
This commit is contained in:
+86
-78
@@ -34,6 +34,7 @@ import com.jero.modules.personal.entity.LawsBrowsingHistory;
|
|||||||
import com.jero.modules.personal.entity.LawsStandardCollection;
|
import com.jero.modules.personal.entity.LawsStandardCollection;
|
||||||
import com.jero.modules.personal.service.ILawsBrowsingHistoryService;
|
import com.jero.modules.personal.service.ILawsBrowsingHistoryService;
|
||||||
import com.jero.modules.personal.service.ILawsStandardCollectionService;
|
import com.jero.modules.personal.service.ILawsStandardCollectionService;
|
||||||
|
import com.jero.modules.split.common.FileUnZip;
|
||||||
import com.jero.modules.split.entity.SarFileSplitInfoEO;
|
import com.jero.modules.split.entity.SarFileSplitInfoEO;
|
||||||
import com.jero.modules.split.service.ISarFileSplitInfoService;
|
import com.jero.modules.split.service.ISarFileSplitInfoService;
|
||||||
import com.jero.modules.sys.utils.UserUtils;
|
import com.jero.modules.sys.utils.UserUtils;
|
||||||
@@ -51,6 +52,7 @@ import com.jero.modules.tag.enums.TableNameEnum;
|
|||||||
import com.jero.modules.tag.service.ILawsAreaService;
|
import com.jero.modules.tag.service.ILawsAreaService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.poi.ss.usermodel.*;
|
import org.apache.poi.ss.usermodel.*;
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
@@ -66,7 +68,6 @@ import javax.annotation.Resource;
|
|||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
@@ -74,7 +75,6 @@ import java.time.LocalDate;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipFile;
|
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1352,84 +1352,92 @@ public class LawsCommonServiceImpl implements ILawsCommonService {
|
|||||||
if (!Objects.requireNonNull(file.getOriginalFilename()).toLowerCase().endsWith(".zip")) {
|
if (!Objects.requireNonNull(file.getOriginalFilename()).toLowerCase().endsWith(".zip")) {
|
||||||
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.PLEASE_UPLOAD_ZIP));
|
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.PLEASE_UPLOAD_ZIP));
|
||||||
}
|
}
|
||||||
Path tempDirWithPrefix = Files.createTempDirectory("temp");
|
|
||||||
File tempFile = new File(tempDirWithPrefix.toFile(), Objects.requireNonNull(file.getOriginalFilename()));
|
|
||||||
file.transferTo(tempFile);
|
|
||||||
|
|
||||||
ZipEntry targetExcelEntry = null;
|
Path path = Files.createTempDirectory("temp");
|
||||||
Map<String, File> fileMap = new HashMap<>();
|
File saveDirectory = new File(path.toUri());
|
||||||
try (ZipFile zipFile = new ZipFile(tempFile, Charset.forName("GBK"))) {
|
if (!saveDirectory.isDirectory()) {
|
||||||
Enumeration<? extends ZipEntry> entries = zipFile.entries();
|
boolean mkdir = saveDirectory.mkdir();
|
||||||
// 文件数量校验
|
|
||||||
boolean foundExcel = false; // 初始化标志以检测是否存在Excel文件
|
|
||||||
|
|
||||||
// 文件数量校验
|
|
||||||
while (entries.hasMoreElements()) {
|
|
||||||
ZipEntry entry = entries.nextElement();
|
|
||||||
String entryName = entry.getName();
|
|
||||||
boolean isRootLevel = !entryName.contains("/"); // '/' 作为目录分隔符
|
|
||||||
|
|
||||||
// 检查根目录下的Excel文件数量
|
|
||||||
if (!entry.isDirectory() && isRootLevel && (entryName.endsWith(".xlsx") || entryName.endsWith(".xls"))) {
|
|
||||||
if (foundExcel) { // 如果已找到Excel文件,则添加错误信息
|
|
||||||
throw new JeroBootException("压缩包根目录下仅能存在一个 Excel 为导入数据");
|
|
||||||
} else {
|
|
||||||
foundExcel = true; // 找到Excel文件,更新标志
|
|
||||||
targetExcelEntry = entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (targetExcelEntry == null) {
|
|
||||||
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 数据内容格式校验
|
|
||||||
try (Workbook workbook = new XSSFWorkbook(zipFile.getInputStream(targetExcelEntry))) {
|
|
||||||
// 检测是否是空Excel
|
|
||||||
Sheet sheet = workbook.getSheetAt(0);
|
|
||||||
// 验证前三行是否有数据
|
|
||||||
esUtil.isEmptyExcel(sheet);
|
|
||||||
// 获取标题行中文 转换为LawsTag对象
|
|
||||||
Row hearderRow = sheet.getRow(0);
|
|
||||||
// 获取全部字段
|
|
||||||
List<LawsTag> fieldList = lawsCommonMapper.getFieldList(tableName);
|
|
||||||
// 筛选表单显示的字段
|
|
||||||
// 找到所有标题Map
|
|
||||||
Map<String, LawsTag> headerMap = fieldList.stream().filter(lawsTag -> YesOrNoEnum.YES.getValue()
|
|
||||||
.equals(lawsTag.getIsShowForm().toString())).collect(Collectors.toMap(
|
|
||||||
LawsTag::getDbFieldTxt, lawsTag -> lawsTag
|
|
||||||
));
|
|
||||||
// 按照实际顺序创建headerList
|
|
||||||
List<LawsTag> headerList = new ArrayList<>();
|
|
||||||
for (Cell cell : hearderRow) {
|
|
||||||
headerList.add(headerMap.get(cell.toString().replace("*", "")));
|
|
||||||
}
|
|
||||||
// 如果是企标的话手动添加稽查内容字段
|
|
||||||
if (TableNameEnum.ENTERPRISE_STANDARDS.getTableName().equals(tableName)) {
|
|
||||||
LawsTag inspectContentTag = new LawsTag();
|
|
||||||
inspectContentTag.setDbFieldTxt("稽查内容");
|
|
||||||
inspectContentTag.setFieldShowType(FieldShowTypeEnum.INSPECT_CONTENT_FILE_UPLOAD.getValue());
|
|
||||||
inspectContentTag.setDbFieldName(FieldCommon.CHECK_LIST);
|
|
||||||
inspectContentTag.setFieldMustInput(YesOrNoEnum.NO.getValue());
|
|
||||||
headerList.remove(headerList.size() - 1);
|
|
||||||
headerList.add(inspectContentTag);
|
|
||||||
}
|
|
||||||
// 从数据行开始遍历
|
|
||||||
for (int i = 3; i < sheet.getPhysicalNumberOfRows(); i++) {
|
|
||||||
Map<String, Object> parameterMap = new HashMap<>();
|
|
||||||
for (int j = 0; j < headerList.size(); j++) {
|
|
||||||
// 获取当前单元格
|
|
||||||
Cell cell = sheet.getRow(i).getCell(j);
|
|
||||||
// 获取当前单元格内容对应的字段
|
|
||||||
LawsTag tag = headerList.get(j);
|
|
||||||
// 调用导入工具类的校验方法
|
|
||||||
errMsgList.addAll(importUtil.allColumnValid(cell, tag, i, j, parameterMap, fileMap));
|
|
||||||
}
|
|
||||||
insertDataList.add(parameterMap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return errMsgList;
|
|
||||||
}
|
}
|
||||||
|
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path + File.separator + file.getOriginalFilename()));
|
||||||
|
// 解压缩
|
||||||
|
String zipEntryName = FileUnZip.unZipFiles(path + File.separator + file.getOriginalFilename(), String.valueOf(path));
|
||||||
|
|
||||||
|
// 判断压缩包下是否只有一个文件夹
|
||||||
|
File fileTemp = new File(path.toUri());
|
||||||
|
int length = Objects.requireNonNull(fileTemp.listFiles()).length;
|
||||||
|
if (length > 2) {
|
||||||
|
FileUnZip.deleteDir(saveDirectory);
|
||||||
|
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR));
|
||||||
|
}
|
||||||
|
File fileNew = new File(zipEntryName);
|
||||||
|
List<File> fileList = new ArrayList<>();
|
||||||
|
for (File file1 : Objects.requireNonNull(fileNew.listFiles())) {
|
||||||
|
if (file1.getName().contains(".xls") || file1.getName().contains(".xlsx")) {
|
||||||
|
fileList.add(file1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fileList.size() == 0) {
|
||||||
|
FileUnZip.deleteDir(saveDirectory);
|
||||||
|
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR));
|
||||||
|
} else if (fileList.size() > 1) {
|
||||||
|
FileUnZip.deleteDir(saveDirectory);
|
||||||
|
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR));
|
||||||
|
}
|
||||||
|
List<File> excelfilelist = FileUnZip.readImpExcelFile(zipEntryName);
|
||||||
|
System.gc();
|
||||||
|
if (excelfilelist.size() != 1) {
|
||||||
|
FileUnZip.deleteDir(saveDirectory);
|
||||||
|
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据内容格式校验
|
||||||
|
Map<String, File> fileMap = new HashMap<>();
|
||||||
|
try (Workbook workbook = new XSSFWorkbook(Files.newInputStream(excelfilelist.get(0).toPath()))) {
|
||||||
|
// 检测是否是空Excel
|
||||||
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
|
// 验证前三行是否有数据
|
||||||
|
esUtil.isEmptyExcel(sheet);
|
||||||
|
// 获取标题行中文 转换为LawsTag对象
|
||||||
|
Row hearderRow = sheet.getRow(0);
|
||||||
|
// 获取全部字段
|
||||||
|
List<LawsTag> fieldList = lawsCommonMapper.getFieldList(tableName);
|
||||||
|
// 筛选表单显示的字段
|
||||||
|
// 找到所有标题Map
|
||||||
|
Map<String, LawsTag> headerMap = fieldList.stream().filter(lawsTag -> YesOrNoEnum.YES.getValue()
|
||||||
|
.equals(lawsTag.getIsShowForm().toString())).collect(Collectors.toMap(
|
||||||
|
LawsTag::getDbFieldTxt, lawsTag -> lawsTag
|
||||||
|
));
|
||||||
|
// 按照实际顺序创建headerList
|
||||||
|
List<LawsTag> headerList = new ArrayList<>();
|
||||||
|
for (Cell cell : hearderRow) {
|
||||||
|
headerList.add(headerMap.get(cell.toString().replace("*", "")));
|
||||||
|
}
|
||||||
|
// 如果是企标的话手动添加稽查内容字段
|
||||||
|
if (TableNameEnum.ENTERPRISE_STANDARDS.getTableName().equals(tableName)) {
|
||||||
|
LawsTag inspectContentTag = new LawsTag();
|
||||||
|
inspectContentTag.setDbFieldTxt("稽查内容");
|
||||||
|
inspectContentTag.setFieldShowType(FieldShowTypeEnum.INSPECT_CONTENT_FILE_UPLOAD.getValue());
|
||||||
|
inspectContentTag.setDbFieldName(FieldCommon.CHECK_LIST);
|
||||||
|
inspectContentTag.setFieldMustInput(YesOrNoEnum.NO.getValue());
|
||||||
|
headerList.remove(headerList.size() - 1);
|
||||||
|
headerList.add(inspectContentTag);
|
||||||
|
}
|
||||||
|
// 从数据行开始遍历
|
||||||
|
for (int i = 3; i < sheet.getPhysicalNumberOfRows(); i++) {
|
||||||
|
Map<String, Object> parameterMap = new HashMap<>();
|
||||||
|
for (int j = 0; j < headerList.size(); j++) {
|
||||||
|
// 获取当前单元格
|
||||||
|
Cell cell = sheet.getRow(i).getCell(j);
|
||||||
|
// 获取当前单元格内容对应的字段
|
||||||
|
LawsTag tag = headerList.get(j);
|
||||||
|
// 调用导入工具类的校验方法
|
||||||
|
errMsgList.addAll(importUtil.allColumnValid(cell, tag, i, j, parameterMap, fileMap));
|
||||||
|
}
|
||||||
|
insertDataList.add(parameterMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return errMsgList;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user