fix: 导入模板校验问题

This commit is contained in:
2023-11-03 15:41:24 +08:00
parent a277c29b43
commit c9c2a515ec
@@ -34,6 +34,7 @@ import com.jero.modules.personal.entity.LawsBrowsingHistory;
import com.jero.modules.personal.entity.LawsStandardCollection;
import com.jero.modules.personal.service.ILawsBrowsingHistoryService;
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.service.ISarFileSplitInfoService;
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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
@@ -66,7 +68,6 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.SimpleDateFormat;
@@ -74,7 +75,6 @@ import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
@@ -1352,84 +1352,92 @@ public class LawsCommonServiceImpl implements ILawsCommonService {
if (!Objects.requireNonNull(file.getOriginalFilename()).toLowerCase().endsWith(".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;
Map<String, File> fileMap = new HashMap<>();
try (ZipFile zipFile = new ZipFile(tempFile, Charset.forName("GBK"))) {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
// 文件数量校验
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;
Path path = Files.createTempDirectory("temp");
File saveDirectory = new File(path.toUri());
if (!saveDirectory.isDirectory()) {
boolean mkdir = saveDirectory.mkdir();
}
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;
}
/**