feat: 老法规导入-标准号代替被代替问题 数据修复接口

This commit is contained in:
2023-12-29 17:44:36 +08:00
parent f382c56517
commit f9fa5e59fd
3 changed files with 276 additions and 0 deletions
@@ -60,6 +60,17 @@ public class OldSystemController {
oldSystemService.importExcelOldSystem(file, type, response);
}
@PostMapping("/importOldSystemStateAndReplaceStandardFix")
@AutoLog(value = "老法规系统-老法规企标国标外标数据修正")
@ApiOperation(value="老法规系统-老法规企标国标外标数据修正", notes="老法规系统-老法规企标国标外标数据修正", produces = "application/octet-stream")
@ApiOperationSupport(order = 12)
public void importOldSystemDataFix(@RequestParam("file") MultipartFile file,
@ApiParam(value = "0不导入 1导入企标 2导入国标 3外标", required = true)
@RequestParam("type") String type,
HttpServletResponse response) {
oldSystemService.importOldSystemDataFix(file, type, response);
}
@PostMapping("/importOldESAuthAllExcel")
@AutoLog(value = "老法规系统-老法规企标所有人权限数据导入")
@ApiOperation(value="老法规系统-老法规企标所有人权限数据导入", notes="老法规系统-老法规企标所有人权限数据导入", produces = "application/octet-stream")
@@ -82,4 +82,11 @@ public interface OldSystemService {
*/
void importGbStandSystem(MultipartFile file, HttpServletResponse response, String type);
/**
* 老法规数据导入状态和代替标准数据修正
* @param file
* @param type
* @param response
*/
void importOldSystemDataFix(MultipartFile file, String type, HttpServletResponse response);
}
@@ -187,6 +187,264 @@ public class OldSystemServiceImpl implements OldSystemService {
}
}
@Override
public void importOldSystemDataFix(MultipartFile file, String type, HttpServletResponse response) {
List<OldSystemImportDTO> errImportList = new ArrayList<>();
// 验证文件是否为压缩格式file.getContentType()).contains("xls")
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("导入失败,数据为空");
}
// 导入企标
switch (type) {
case "0":
break;
case "1":
// 导入企标
this.oldSysESDataFix(allDatalist, errImportList);
break;
case "2":
// 导入国标
this.oldSysGBDataFix(allDatalist, errImportList);
break;
case "3":
// 导入外标
this.oldSysFBDataFix(allDatalist, errImportList);
}
if (!errImportList.isEmpty()) {
this.exportWithExcel(response, errImportList, "OldSystemStandardErrorData.xls");
}
}
private void oldSysFBDataFix(List<OldSystemImportDTO> allDatalist, List<OldSystemImportDTO> errImportList) {
List<OldSystemImportDTO> fbDatalist = allDatalist.stream().filter(o -> o.getBzfl().contains("ISO") ||
o.getBzfl().contains("引进") ||
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());
long startTime = System.currentTimeMillis();
// 转换数据
List<LawsOverseasStandard> fbList = new ArrayList<>();
// 导入企标
for (OldSystemImportDTO dto : fbDatalist) {
LawsOverseasStandard fb = new LawsOverseasStandard();
String tdbzh = dto.getTdbzh();
String btdbzh = dto.getBtdbzh();
// 先将标准号中的中文横杠替换为英文横杠
String newBzh = dto.getBzh().replace("", "-");
fb.setStandardNumber(newBzh);
fb.setStandardName(dto.getBzmc());
String standardState = dto.getBzzt();
fb.setStandardState(standardState.equals("现行有效") ? "6" : "7");
fb.setSubstituteStandardNumber(tdbzh);
fb.setReplacedByStandardNumber(btdbzh);
fbList.add(fb);
}
List<LawsOverseasStandard> existingEntities = overseasStandardService.list();
Map<String, LawsOverseasStandard> dataMap = existingEntities.stream()
.collect(Collectors.toMap(LawsOverseasStandard::getStandardNumber, d -> d));
for (LawsOverseasStandard fb : fbList) {
LawsOverseasStandard dbData = dataMap.get(fb.getStandardNumber());
dbData.setStandardState(fb.getStandardState());
String tdbzh = fb.getSubstituteStandardNumber();
String btdbzh = fb.getReplacedByStandardNumber();
// 代替标准号
// 先删除已经存储的关联
String standardNumber = dbData.getStandardNumber();
if (StringUtils.isNotBlank(tdbzh)) {
lawsReplacedStandardService.removeRelation(standardNumber, 1);
lawsReplacedStandardService.addRelationOldSystemSync(tdbzh, standardNumber, 1);
}
// 被代替标准号
if (StringUtils.isNotBlank(btdbzh)) {
List<String> replaceCodeList = Arrays.asList(btdbzh.split(","));
replaceCodeList.forEach(replaceCode -> {
lawsReplacedStandardService.removeRelation(replaceCode, 1);
lawsReplacedStandardService.addRelationOldSystemSync(standardNumber, replaceCode, 1);
});
}
LambdaUpdateWrapper<LawsOverseasStandard> fbWrapper = new LambdaUpdateWrapper<>();
fbWrapper.eq(LawsOverseasStandard::getId, dbData.getId());
fbWrapper.set(LawsOverseasStandard::getStandardState, dbData.getStandardState());
overseasStandardService.update(fbWrapper);
}
// 获取当前时间戳(毫秒)
long endTime = System.currentTimeMillis();
// 计算执行时间(毫秒)
long executionTime = endTime - startTime;
log.info("代码执行时间:" + executionTime + " 毫秒");
}
private void oldSysGBDataFix(List<OldSystemImportDTO> allDatalist, List<OldSystemImportDTO> errImportList) {
List<OldSystemImportDTO> gbDatalist = allDatalist.stream().filter(o ->
o.getBzfl().contains("国家标准/") || // “/”是为了避免匹配到“美国国家标准”这个外标
o.getBzfl().contains("团体标准") ||
o.getBzfl().contains("地方标准") ||
o.getBzfl().contains("行业标准")).collect(Collectors.toList());
log.info("国标相关数据条数:{}", gbDatalist.size());
// 首先,使用Map来记录每个标准号出现的次数
Map<String, Long> frequencyMap = gbDatalist.stream()
.collect(Collectors.groupingBy(OldSystemImportDTO::getBzh, Collectors.counting()));
// 然后,过滤掉那些出现次数超过1次的数据
gbDatalist = gbDatalist.stream()
.filter(dto -> frequencyMap.get(dto.getBzh()) == 1)
.collect(Collectors.toList());
log.info("删除掉所有重复的数据后相关数据条数:{}", gbDatalist.size());
long startTime = System.currentTimeMillis();
// 转换数据
List<LawsDomesticStandard> gbList = new ArrayList<>();
// 导入企标
for (OldSystemImportDTO dto : gbDatalist) {
LawsDomesticStandard db = new LawsDomesticStandard();
String tdbzh = dto.getTdbzh();
String btdbzh = dto.getBtdbzh();
// 先将标准号中的中文横杠替换为英文横杠
String newBzh = dto.getBzh().replace("", "-");
db.setStandardNumber(newBzh);
db.setStandardName(dto.getBzmc());
String standardState = dto.getBzzt();
db.setStandardState(standardState.equals("现行有效") ? "6" : "7");
db.setSubstituteStandardNumber(tdbzh);
db.setReplacedByStandardNumber(btdbzh);
gbList.add(db);
}
List<LawsDomesticStandard> existingEntities = domesticStandardService.list();
Map<String, LawsDomesticStandard> dataMap = existingEntities.stream()
.collect(Collectors.toMap(LawsDomesticStandard::getStandardNumber, d -> d));
for (LawsDomesticStandard gb : gbList) {
LawsDomesticStandard dbData = dataMap.get(gb.getStandardNumber());
dbData.setStandardState(gb.getStandardState());
String tdbzh = gb.getSubstituteStandardNumber();
String btdbzh = gb.getReplacedByStandardNumber();
// 代替标准号
// 先删除已经存储的关联
String standardNumber = dbData.getStandardNumber();
if (StringUtils.isNotBlank(tdbzh)) {
lawsReplacedStandardService.removeRelation(standardNumber, 1);
lawsReplacedStandardService.addRelationOldSystemSync(tdbzh, standardNumber, 1);
}
// 被代替标准号
if (StringUtils.isNotBlank(btdbzh)) {
List<String> replaceCodeList = Arrays.asList(btdbzh.split(","));
replaceCodeList.forEach(replaceCode -> {
lawsReplacedStandardService.removeRelation(replaceCode, 1);
lawsReplacedStandardService.addRelationOldSystemSync(standardNumber, replaceCode, 1);
});
}
LambdaUpdateWrapper<LawsDomesticStandard> gbWrapper = new LambdaUpdateWrapper<>();
gbWrapper.eq(LawsDomesticStandard::getId, dbData.getId());
gbWrapper.set(LawsDomesticStandard::getStandardState, dbData.getStandardState());
domesticStandardService.update(gbWrapper);
}
// 获取当前时间戳(毫秒)
long endTime = System.currentTimeMillis();
// 计算执行时间(毫秒)
long executionTime = endTime - startTime;
log.info("代码执行时间:" + executionTime + " 毫秒");
}
private void oldSysESDataFix(List<OldSystemImportDTO> esDatalist, List<OldSystemImportDTO> errImportList) {
esDatalist = esDatalist.stream().filter(o -> o.getBzfl().contains("企业标准"))
.collect(Collectors.toList());
log.info("企标相关数据条数:{}", esDatalist.size());
// 首先,使用Map来记录每个标准号出现的次数
Map<String, Long> frequencyMap = esDatalist.stream()
.collect(Collectors.groupingBy(OldSystemImportDTO::getBzh, Collectors.counting()));
// 然后,过滤掉那些出现次数超过1次的数据
esDatalist = esDatalist.stream()
.filter(dto -> frequencyMap.get(dto.getBzh()) == 1)
.collect(Collectors.toList());
log.info("删除掉所有重复的数据后相关数据条数:{}", esDatalist.size());
long startTime = System.currentTimeMillis();
// 转换数据
List<LawsEnterpriseStandard> esList = new ArrayList<>();
// 导入企标
for (OldSystemImportDTO dto : esDatalist) {
LawsEnterpriseStandard es = new LawsEnterpriseStandard();
String tdbzh = dto.getTdbzh();
String btdbzh = dto.getBtdbzh();
es.setOldSystemId(dto.getId());
es.setStandardNumber(dto.getBzh());
es.setStandardName(dto.getBzmc());
String standardState = dto.getBzzt();
es.setStandardState(standardState.equals("现行有效") ? "8" : "9");
es.setSubstituteStandardNumber(tdbzh);
es.setReplacedByStandardNumber(btdbzh);
esList.add(es);
}
List<LawsEnterpriseStandard> existingEntities = esService.list();
Map<String, LawsEnterpriseStandard> dataMap = existingEntities.stream()
.collect(Collectors.toMap(LawsEnterpriseStandard::getOldSystemId, d -> d));
for (LawsEnterpriseStandard es : esList) {
LawsEnterpriseStandard dbData = dataMap.get(es.getOldSystemId());
dbData.setStandardState(es.getStandardState());
String tdbzh = es.getSubstituteStandardNumber();
String btdbzh = es.getReplacedByStandardNumber();
// 代替标准号
// 先删除已经存储的关联
String standardNumber = dbData.getStandardNumber();
if (StringUtils.isNotBlank(tdbzh)) {
lawsReplacedStandardService.removeRelation(standardNumber, 1);
lawsReplacedStandardService.addRelationOldSystemSync(tdbzh, standardNumber, 1);
}
// 被代替标准号
if (StringUtils.isNotBlank(btdbzh)) {
List<String> replaceCodeList = Arrays.asList(btdbzh.split(","));
replaceCodeList.forEach(replaceCode -> {
lawsReplacedStandardService.removeRelation(replaceCode, 1);
lawsReplacedStandardService.addRelationOldSystemSync(standardNumber, replaceCode, 1);
});
}
LambdaUpdateWrapper<LawsEnterpriseStandard> esWrapper = new LambdaUpdateWrapper<>();
esWrapper.eq(LawsEnterpriseStandard::getId, dbData.getId());
esWrapper.set(LawsEnterpriseStandard::getStandardState, dbData.getStandardState());
esService.update(esWrapper);
}
// 获取当前时间戳(毫秒)
long endTime = System.currentTimeMillis();
// 计算执行时间(毫秒)
long executionTime = endTime - startTime;
log.info("代码执行时间:" + executionTime + " 毫秒");
}
private void oldSysFBImport(List<OldSystemImportDTO> allDatalist, List<OldSystemImportDTO> errImportList) {
List<OldSystemImportDTO> fbDatalist = allDatalist.stream().filter(o -> o.getBzfl().contains("ISO") ||
o.getBzfl().contains("引进") ||