feat: 老法规文件导入逻辑

This commit is contained in:
2023-12-04 15:02:28 +08:00
parent 7358a7fcdc
commit 6b8415e1c4
5 changed files with 201 additions and 7 deletions
@@ -179,5 +179,6 @@ public class FieldCommon {
public static final String TRY_FLAG = "try_flag";
public static final String RELEASE_DATE = "release_date";
public static final String TRIAL_PERIOD = "trial_period";
// 关联文件
public static final String ASSOCIATED_FILE = "associated_file";
}
@@ -98,4 +98,13 @@ public class OldSystemController {
enterpriseStandardService.filterChineseStandardNo(file, response);
}
@PostMapping("/importFileRelationExcel")
@AutoLog(value = "老法规系统-导入文件附件等关联关系")
@ApiOperation(value="老法规系统-导入文件附件等关联关系", notes="老法规系统-导入文件附件等关联关系", produces = "application/octet-stream")
@ApiOperationSupport(order = 7)
public void importFileRelationExcel(@RequestParam("file") MultipartFile file,
HttpServletResponse response) throws IOException {
enterpriseStandardService.importFileRelationExcel(file, response);
}
}
@@ -56,9 +56,16 @@ public interface ILawsEnterpriseStandardService extends IService<LawsEnterpriseS
void importOldESAuthDeptExcel(MultipartFile file, HttpServletResponse response);
/**
* g
* 过滤中文标准号
* @param file
* @param response
*/
void filterChineseStandardNo(MultipartFile file, HttpServletResponse response) throws IOException;
/**
* 导入文件关系Excel
* @param file
* @param response
*/
void importFileRelationExcel(MultipartFile file, HttpServletResponse response);
}
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.CommonAPI;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.constant.CommonConstant;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.vo.SysDictItemCore;
import com.jero.common.util.MessageUtils;
@@ -207,6 +208,11 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl<LawsEnterpris
o.getBzfl().contains("国外")).collect(Collectors.toList());
log.info("外标相关数据条数:{}", fbDatalist.size());
// 过滤字段 根据标准号字段去重
fbDatalist = fbDatalist.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(OldSystemImportDTO::getBzh))), ArrayList::new));
log.info("根据标准号去重后的外标相关数据条数:{}", fbDatalist.size());
// 找到所有人 并且用 姓名加工号做key
Map<String, SysUser> allUserMap = sysUserService.list().stream().collect(Collectors.toMap(o -> o.getRealname() + o.getUsername(), o -> o));
@@ -691,6 +697,114 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl<LawsEnterpris
}
}
@Override
public void importFileRelationExcel(MultipartFile file, HttpServletResponse response) {
List<OldSystemImportDTO> errImportList = new ArrayList<>();
// 验证文件是否为压缩格式
if (!Objects.requireNonNull(file.getOriginalFilename()).contains("xls")) {
throw new JeroBootException("文件格式不正确,请上传Excel。");
}
ImportParams params = new ImportParams();
params.setTitleRows(0);
params.setNeedSave(true);
// 获取数据
List<OldSystemImportDTO> allDatalist = null;
try {
// 获取当前时间戳(毫秒)
long startTime = System.currentTimeMillis();
@Cleanup
InputStream inputStream = file.getInputStream();
allDatalist = ExcelImportUtil.importExcel(inputStream, OldSystemImportDTO.class, params);
// 删除空行
allDatalist.removeIf(OldSystemImportDTO::isEmptyRow);
log.info("获取数据成功,数据条数:{}", allDatalist.size());
// 获取当前时间戳(毫秒)
long endTime = System.currentTimeMillis();
// 计算执行时间(毫秒)
long executionTime = endTime - startTime;
log.info("数据转换执行时间:" + executionTime + " 毫秒");
} catch (Exception e) {
log.error("导入失败;{}", e.getMessage());
}
if (allDatalist == null) {
throw new JeroBootException("导入失败,数据为空");
}
// 查询所有企标
LambdaQueryWrapper<LawsEnterpriseStandard> esWrapper = new LambdaQueryWrapper<>();
esWrapper.eq(LawsEnterpriseStandard::getDelFlag, YesOrNoEnum.NO.getValue());
List<LawsEnterpriseStandard> esList = this.list(esWrapper);
// 查询所有外标
LambdaQueryWrapper<LawsOverseasStandard> fbWrapper = new LambdaQueryWrapper<>();
fbWrapper.eq(LawsOverseasStandard::getDelFlag, YesOrNoEnum.NO.getValue());
List<LawsOverseasStandard> fbList = overseasStandardService.list(fbWrapper);
// 查询所有国标
LambdaQueryWrapper<LawsDomesticStandard> gbWrapper = new LambdaQueryWrapper<>();
gbWrapper.eq(LawsDomesticStandard::getDelFlag, YesOrNoEnum.NO.getValue());
List<LawsDomesticStandard> gbList = domesticStandardService.list(gbWrapper);
Map<String, String> standardMap = esList.stream().collect(Collectors.toMap(LawsEnterpriseStandard::getStandardNumber, LawsEnterpriseStandard::getId));
standardMap.putAll(fbList.stream().collect(Collectors.toMap(LawsOverseasStandard::getStandardNumber, LawsOverseasStandard::getId)));
standardMap.putAll(gbList.stream().collect(Collectors.toMap(LawsDomesticStandard::getStandardNumber, LawsDomesticStandard::getId)));
// 文件关联
List<OSSFile> ossFileList = new ArrayList<>();
long startTime = System.currentTimeMillis();
// 转换数据
for (OldSystemImportDTO dto : allDatalist) {
try {
// 将标准号中的括号删除
String standardFileType = StandardSplitUtils.getStandardFileTypeByBZH(dto.getBzh());
String standardNo = StandardSplitUtils.extractStandardNumber(dto.getBzh());
String standardId = null;
for (String s : standardMap.keySet()) {
if (s.contains(standardNo)) {
standardId = standardMap.get(s);
break;
}
}
if (StrUtil.isBlank(standardId)) {
throw new JeroBootException("未找到该标准,标准编号:" + dto.getBzh());
}
// 根据文件路径获取文件Id
String originPath = dto.getSclj();
if (StrUtil.isNotBlank(originPath)) {
String filePath = this.getFilePath(originPath);
if (MinioUtil.doesObjectExist(filePath)) {
// 存入关系表
OSSFile ossFile = new OSSFile();
ossFile.setUrl(filePath);
ossFile.setStandardNo(standardNo);
ossFile.setFileName(FileUtil.getName(filePath));
ossFile.setStandardFileType(standardFileType);
ossFile.setStandardId(standardId);
ossFileList.add(ossFile);
}
}
} catch (Exception e) {
log.error("导入转换外标数据时发生错误:{}", e.getMessage());
log.error("错误数据:{}", dto.toString());
dto.setErrorInfo(e.getMessage());
errImportList.add(dto);
}
}
for (OSSFile ossfile : ossFileList) {
// 保存文件关联
ossFileService.save(ossfile);
}
log.info("文件关系覆盖导入完成");
// 获取当前时间戳(毫秒)
long endTime = System.currentTimeMillis();
// 计算执行时间(毫秒)
long executionTime = endTime - startTime;
log.info("代码执行时间:" + executionTime + " 毫秒");
if (!errImportList.isEmpty()) {
this.exportWithExcel(response, errImportList, "OldSystemStandardErrorData.xls");
}
}
public boolean containsChinese(String text) {
Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]");
Matcher matcher = pattern.matcher(text);
@@ -724,6 +838,11 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl<LawsEnterpris
o.getBzfl().contains("行业标准")).collect(Collectors.toList());
log.info("国标相关数据条数:{}", gbDatalist.size());
// 过滤字段 根据标准号字段去重
gbDatalist = gbDatalist.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(OldSystemImportDTO::getBzh))), ArrayList::new));
log.info("根据标准号去重后的国标相关数据条数:{}", gbDatalist.size());
// 找到所有人 并且用 姓名加工号做key
Map<String, SysUser> allUserMap = sysUserService.list().stream().collect(Collectors.toMap(o -> o.getRealname() + o.getUsername(), o -> o));
@@ -954,6 +1073,12 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl<LawsEnterpris
}
private void oldSysESImport(List<OldSystemImportDTO> esDatalist, List<OldSystemImportDTO> errImportList) {
log.info("企标相关数据条数:{}", esDatalist.size());
// 过滤字段 根据标准号字段去重
esDatalist = esDatalist.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(OldSystemImportDTO::getBzh))), ArrayList::new));
log.info("根据标准号去重后的企标相关数据条数:{}", esDatalist.size());
long startTime = System.currentTimeMillis();
// 转换数据
List<LawsEnterpriseStandard> esList = new ArrayList<>();
@@ -969,11 +1094,12 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl<LawsEnterpris
es.setStandardName(dto.getBzmc());
es.setStandardEnglishName(dto.getBzywmc());
String fbrq = dto.getFbrq().trim();
String ssrq = dto.getSsrq().trim();
// 发布日期和实施日期入库之前需要校验 为空或者不符合规则的不入库
String fbrq = dto.getFbrq();
String ssrq = dto.getSsrq();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
if (StrUtil.isNotBlank(fbrq)) {
Date newDate = sdf.parse(fbrq);
Date newDate = sdf.parse(fbrq.trim());
if (newDate != null) {
es.setReleaseDate(newDate);
} else {
@@ -981,7 +1107,7 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl<LawsEnterpris
}
}
if (StrUtil.isNotBlank(ssrq)) {
Date newDate = sdf.parse(ssrq);
Date newDate = sdf.parse(ssrq.trim());
if (newDate != null) {
es.setImplementationDate(newDate);
} else {
@@ -989,7 +1115,7 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl<LawsEnterpris
}
}
String standardState = dto.getBzzt();
es.setStandardState(standardState.equals("现行有效") ? "8" : "9");
es.setStandardState(standardState.equals("现行有效") ? "6" : "7");
es.setGradeClassification(null);
// 代替被代替特殊逻辑
es.setSubstituteStandardNumber(dto.getTdbzh());
@@ -110,7 +110,58 @@ public class StandardSplitUtils {
return map;
}
// 获取字符串中的中文
public static String extractChineseText(String input) {
// 使用正则表达式匹配中文字符
Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]+");
Matcher matcher = pattern.matcher(input);
// 用于存储提取的中文字符
StringBuilder chineseText = new StringBuilder();
// 遍历匹配结果并将中文字符追加到chineseText中
while (matcher.find()) {
chineseText.append(matcher.group());
}
return chineseText.toString();
}
// 根据标准号获取文件类型
public static String getStandardFileTypeByBZH(String bzh) {
String fileType = extractChineseText(bzh);
switch (fileType) {
case "附件":
return FieldCommon.ASSOCIATED_FILE;
case "发布稿":
return FieldCommon.FILE_PUBLISH_OF_ORIGINAL;
case "修改单":
return FieldCommon.FILE_MODIFICATION_LIST;
case "报批稿":
return FieldCommon.FILE_DRAFT_FOR_REVIEW;
case "草案":
return FieldCommon.FILE_DRAFT;
}
throw new RuntimeException("标准号" + bzh + "文件类型获取失败");
}
// 从带有文件名的字符串中提取标准号
public static String extractStandardNumber(String bzh) {
// 使用正则表达式匹配标准号部分
Pattern pattern = Pattern.compile("[A-Z0-9\\s-]+");
Matcher matcher = pattern.matcher(bzh);
// 用于存储提取的标准号部分
StringBuilder standardNumber = new StringBuilder();
// 遍历匹配结果并将标准号部分追加到standardNumber中
if (matcher.find()) {
standardNumber.append(matcher.group().trim());
}
if (StrUtil.isBlank(standardNumber.toString())) {
// 如果没有匹配项,返回空字符串
throw new RuntimeException("标准号" + bzh + "获取标准号失败");
}
return standardNumber.toString();
}
}