From 9cc05f3d5b2479b1cad1119fa2c66fbffd3c5c69 Mon Sep 17 00:00:00 2001 From: caihaohan Date: Fri, 1 Dec 2023 11:45:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=80=81=E6=B3=95=E8=A7=84=E5=A4=96?= =?UTF-8?q?=E6=A0=87=E5=AF=BC=E5=85=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/activiti/util/ExcelUtils.java | 9 + .../enterprise/entity/OldSystemImportDTO.java | 15 +- .../controller/OldSystemController.java | 16 +- .../laws/oldSystem/entity/ESAuthDept.java | 2 + .../laws/oldSystem/entity/ESAuthUser.java | 2 + .../entity/OldSystemDepartRelation.java | 1 + .../standard/entity/LawsOverseasStandard.java | 3 + .../ILawsEnterpriseStandardService.java | 8 + .../LawsEnterpriseStandardServiceImpl.java | 516 ++++++++++++++---- .../standard/util/StandardSplitUtils.java | 116 ++++ 10 files changed, 572 insertions(+), 116 deletions(-) create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/standard/util/StandardSplitUtils.java diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java b/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java index 8484097f..283816d0 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java @@ -24,6 +24,8 @@ import javax.annotation.Resource; import java.io.InputStream; import java.lang.reflect.Field; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -350,4 +352,11 @@ public class ExcelUtils { return ""; } + // 判断是否有中文字符 + public static boolean containsChinese(String text) { + Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]"); + Matcher matcher = pattern.matcher(text); + return matcher.find(); + } + } diff --git a/laws-modules/src/main/java/com/jero/modules/laws/enterprise/entity/OldSystemImportDTO.java b/laws-modules/src/main/java/com/jero/modules/laws/enterprise/entity/OldSystemImportDTO.java index bc51330f..299d7a5b 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/enterprise/entity/OldSystemImportDTO.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/enterprise/entity/OldSystemImportDTO.java @@ -1,5 +1,6 @@ package com.jero.modules.laws.enterprise.entity; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import org.jeecgframework.poi.excel.annotation.Excel; @@ -51,11 +52,11 @@ public class OldSystemImportDTO { @Excel(name = "ZTC", width = 15, orderNum = "12") private String ztc; - @Excel(name = "FBRQ", width = 15, orderNum = "13", format = "yyyyMMdd") - private Date fbrq; + @Excel(name = "FBRQ", width = 15, orderNum = "13") + private String fbrq; - @Excel(name = "SSRQ", width = 15, orderNum = "14", format = "yyyyMMdd") - private Date ssrq; + @Excel(name = "SSRQ", width = 15, orderNum = "14") + private String ssrq; @Excel(name = "TY", width = 15, orderNum = "15") private String ty; @@ -168,12 +169,16 @@ public class OldSystemImportDTO { @Excel(name = "BZCOUNTRY", width = 15, orderNum = "51") private String bzcountry; + @Excel(name = "错误信息", width = 35, orderNum = "52") + @TableField(exist = false) + private String errorInfo; + /** * 判断是否是空行 * @return 如果所有字段都为null或空字符串,返回true,否则返回false */ public boolean isEmptyRow() { - return id == null && bzh == null && status == null && cybzh == null + return id == null && status == null && cybzh == null && bzmc == null && bzywmc == null && bzfl == null && bzyytype == null && bzdjtype == null && bzlbtype == null && bzlcgj == null && bzsydw == null && ztc == null && fbrq == null && ssrq == null && ty == null diff --git a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/controller/OldSystemController.java b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/controller/OldSystemController.java index a9135303..18eb330c 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/controller/OldSystemController.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/controller/OldSystemController.java @@ -23,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.Map; @ApiSupport(order = 10101) @Api(tags="老法规系统") @@ -52,11 +53,11 @@ public class OldSystemController { private ILawsEnterpriseStandardService enterpriseStandardService; @PostMapping("/importOldSystemExcel") - @AutoLog(value = "老法规系统-老法规企标国标数据导入") - @ApiOperation(value="老法规系统-老法规企标国标数据导入", notes="老法规系统-老法规企标国标数据导入", produces = "application/octet-stream") + @AutoLog(value = "老法规系统-老法规企标国标外标数据导入") + @ApiOperation(value="老法规系统-老法规企标国标外标数据导入", notes="老法规系统-老法规企标国标外标数据导入", produces = "application/octet-stream") @ApiOperationSupport(order = 2) public void importOldSystemESZip(@RequestParam("file") MultipartFile file, - @ApiParam(value = "0不导入 1导入企标 2导入国标 3一起导入", required = true) + @ApiParam(value = "0不导入 1导入企标 2导入国标 3外标", required = true) @RequestParam("type") String type, HttpServletResponse response) { enterpriseStandardService.importExcelOldSystem(file, type, response); @@ -88,4 +89,13 @@ public class OldSystemController { enterpriseStandardService.importOldESAuthDeptExcel(file, response); } + @PostMapping("/filterChineseStandardNo") + @AutoLog(value = "老法规系统-过滤带中文的标准号") + @ApiOperation(value="老法规系统-过滤带中文的标准号", notes="老法规系统-过滤带中文的标准号", produces = "application/octet-stream") + @ApiOperationSupport(order = 6) + public void filterChineseStandardNo(@RequestParam("file") MultipartFile file, + HttpServletResponse response) throws IOException { + enterpriseStandardService.filterChineseStandardNo(file, response); + } + } diff --git a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthDept.java b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthDept.java index 78fbc8cb..4519bd2e 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthDept.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthDept.java @@ -1,5 +1,6 @@ package com.jero.modules.laws.oldSystem.entity; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; @@ -42,6 +43,7 @@ public class ESAuthDept { @Excel(name = "错误信息", width = 35) @ApiModelProperty(value = "错误信息") + @TableField(exist = false) private String errorInfo; public boolean isEmptyRow() { diff --git a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthUser.java b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthUser.java index 213c6cf0..5c9a4b91 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthUser.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/ESAuthUser.java @@ -1,5 +1,6 @@ package com.jero.modules.laws.oldSystem.entity; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; @@ -43,6 +44,7 @@ public class ESAuthUser { @Excel(name = "错误信息", width = 35, orderNum = "7") @ApiModelProperty(value = "错误信息") + @TableField(exist = false) private String errorInfo; public boolean isEmptyRow() { diff --git a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/OldSystemDepartRelation.java b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/OldSystemDepartRelation.java index 31268f12..d42dcc75 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/OldSystemDepartRelation.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/oldSystem/entity/OldSystemDepartRelation.java @@ -80,6 +80,7 @@ public class OldSystemDepartRelation implements Serializable { */ @Excel(name = "错误信息", width = 35) @ApiModelProperty(value = "错误信息") + @TableField(exist = false) private String errorInfo; @TableField(exist = false) diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/LawsOverseasStandard.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/LawsOverseasStandard.java index 086f2215..3ae64beb 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/LawsOverseasStandard.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/LawsOverseasStandard.java @@ -181,4 +181,7 @@ public class LawsOverseasStandard implements Serializable { @Excel(name = "草案", width = 15) @ApiModelProperty(value = "草案") private java.lang.String draft; + /**标准号*/ + @ApiModelProperty(value = "标准号") + private java.lang.String standardNumberTemp; } diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsEnterpriseStandardService.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsEnterpriseStandardService.java index 25ecfe90..893069e8 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsEnterpriseStandardService.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsEnterpriseStandardService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; /** * @author ThinkBook @@ -53,4 +54,11 @@ public interface ILawsEnterpriseStandardService extends IService allDatalist = null; - List esDatalist = new ArrayList<>(); - List gbDatalist = new ArrayList<>(); - List fbDatalist = new ArrayList<>(); try { // 获取当前时间戳(毫秒) @@ -157,27 +166,8 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl allDatalist, List errImportList) { + List fbDatalist = allDatalist.stream().filter(o -> o.getBzfl().contains("ISO") || + o.getBzfl().contains("引进") || + o.getBzfl().contains("国外")).collect(Collectors.toList()); + log.info("外标相关数据条数:{}", fbDatalist.size()); + + // 找到所有人 并且用 姓名加工号做key + Map allUserMap = sysUserService.list().stream().collect(Collectors.toMap(o -> o.getRealname() + o.getUsername(), o -> o)); + + // 现所有部门 + List curDepartList = departService.list(); + Map> curDeptMap = curDepartList.stream().collect(Collectors.groupingBy(SysDepart::getDepartName)); + + // 部门关系列表 + List list = oldDeptService.list(); + list = list.stream().filter(o -> StrUtil.isNotBlank(o.getOldOrgName())).collect(Collectors.toList()); + Map> oldDeptMap = list.stream().collect(Collectors.groupingBy(OldSystemDepartRelation::getOldOrgName)); + + // 文件关联 + List ossFileList = new ArrayList<>(); + long startTime = System.currentTimeMillis(); + // 转换数据 + List fbList = new ArrayList<>(); + for (OldSystemImportDTO dto : fbDatalist) { + try { + LawsOverseasStandard fb = new LawsOverseasStandard(); + + // 先将标准号中的中文横杠替换为英文横杠 + String newBzh = dto.getBzh().replace("—", "-"); + fb.setStandardNumber(newBzh); + String cybzh = dto.getCybzh(); + // 采用标准号为空跳过拆分 + if (StrUtil.isNotBlank(cybzh)){ + // 执行拆分 + Map map = StandardSplitUtils.simpleSplitStandardNumber(newBzh, cybzh); + fb.setStandardClass(map.get(FieldCommon.STANDARD_CLASS)); + fb.setStandardNumberTemp(map.get(FieldCommon.STANDARD_NUMBER_TEMP)); + fb.setYearNumber(map.get(FieldCommon.YEAR_NUMBER)); + } + + fb.setStandardName(dto.getBzmc()); + fb.setStandardEnglishName(dto.getBzywmc()); + + // 发布日期和实施日期入库之前需要校验 为空或者不符合规则的不入库 + String fbrq = dto.getFbrq(); + String ssrq = dto.getSsrq(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + if (StrUtil.isNotBlank(fbrq)) { + Date newDate = sdf.parse(fbrq.trim()); + if (newDate != null) { + fb.setReleaseDate(newDate); + } else { + throw new JeroBootException("发布日期格式不正确,标准编号:" + dto.getBzh()); + } + } + if (StrUtil.isNotBlank(ssrq)) { + Date newDate = sdf.parse(ssrq.trim()); + if (newDate != null) { + fb.setImplementationDate(newDate); + } else { + throw new JeroBootException("实施日期格式不正确,标准编号:" + dto.getBzh()); + } + } + + String standardState = dto.getBzzt(); + fb.setStandardState(standardState.equals("现行有效") ? "6" : "7"); + // 代替被代替特殊逻辑 + fb.setSubstituteStandardNumber(dto.getTdbzh()); + fb.setReplacedByStandardNumber(dto.getBtdbzh()); + + // 责任部门暂不导入 +// String zrbm = dto.getZrbm(); +// if (oldDeptMap.get(zrbm) != null && oldDeptMap.get(zrbm).get(0) != null) { +// String curOrgName = oldDeptMap.get(zrbm).get(0).getCurOrgName(); +// if (StrUtil.isNotBlank(curOrgName)) { +// List departList = curDeptMap.get(curOrgName); +// if (departList.size() != 0) { +// gb.setResponsibleDepartment(departList.get(0).getId()); +// } +// } +// } + String zrr = dto.getZrr(); + String zrrid = dto.getZrrid(); + if (StrUtil.isNotBlank(zrr) && StrUtil.isNotBlank(zrrid)) { + SysUser sysUser = allUserMap.get(zrr + zrrid); + if (sysUser != null) { + fb.setResponsibleDepartmentUser(sysUser.getId()); + } else { + throw new JeroBootException("未找到责任人,姓名:" + zrr + ",工号:" + zrrid + ",标准编号:" + 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(dto.getBzh()); +// ossFile.setFileName(FileUtil.getName(filePath)); +// ossFile.setStandardFileType("publish_of_original"); +// ossFileList.add(ossFile); +// } +// } + fbList.add(fb); + } catch (Exception e) { + log.error("导入转换外标数据时发生错误:{}", e.getMessage()); + log.error("错误数据:{}", dto.toString()); + dto.setErrorInfo(e.getMessage()); + errImportList.add(dto); + } + } + // 保存数据 + // 1. 首先获取所有现有的国标标准号 + List existingEntities = overseasStandardService.list(); + + // 2. 创建一个Map,用于快速查找是否存在相同的标准号 + Map standardNumberToEntityMap = new HashMap<>(); + for (LawsOverseasStandard existingEntity : existingEntities) { + standardNumberToEntityMap.put(existingEntity.getStandardNumber(), existingEntity); + } + + // 3. 将文件关系列表转为Map,用于快速查找 +// Map> standardNumberToFileMap = ossFileList.stream().collect(Collectors.groupingBy(OSSFile::getStandardNo)); + + // 4. 遍历待保存或更新的列表,设置ID + StringBuilder oldIds = new StringBuilder(); + StringBuilder newIds = new StringBuilder(); + for (LawsOverseasStandard entity : fbList) { + LawsOverseasStandard existingEntity = standardNumberToEntityMap.get(entity.getStandardNumber()); + if (existingEntity != null) { + // 如果存在,则执行更新操作 + // 删除替代 + lawsReplacedStandardService.removeRelation(existingEntity.getStandardNumber(), 1); + // 删除文件关联 + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(OSSFile::getStandardId, existingEntity.getId()); + ossFileService.remove(wrapper); + // 拼接老id + oldIds.append(existingEntity.getId()).append(","); + + entity.setId(existingEntity.getId()); + } + String tdbzh = entity.getSubstituteStandardNumber(); + String btdbzh = entity.getReplacedByStandardNumber(); + // 代替标准号 + if (StringUtils.isNotBlank(tdbzh)) { + lawsReplacedStandardService.addRelation(btdbzh, tdbzh, 1); + } + // 被代替标准号 + if (StringUtils.isNotBlank(btdbzh)) { + List replaceCodeList = Arrays.asList(btdbzh.split(";")); + replaceCodeList.forEach(replaceCode -> { + lawsReplacedStandardService.addRelation(replaceCode, btdbzh, 1); + }); + } + entity.setSubstituteStandardNumber(null); + entity.setReplacedByStandardNumber(null); + // 构建updateWrapper 将其余字段全部设为null + + overseasStandardService.saveOrUpdate(entity); + + String standardId = entity.getId(); + // 保存文件关联 +// List ossFiles = standardNumberToFileMap.get(entity.getStandardNumber()); +// if (ossFiles != null && !ossFiles.isEmpty()) { +// OSSFile ossFile = ossFiles.get(0); +// ossFile.setStandardId(standardId); +// ossFileService.save(ossFile); +// } + } + log.info("老法规外标覆盖导入完成"); + // 获取当前时间戳(毫秒) + long endTime = System.currentTimeMillis(); + // 计算执行时间(毫秒) + long executionTime = endTime - startTime; + log.info("代码执行时间:" + executionTime + " 毫秒"); + // es中删除数据 +// if (oldIds.length() > 0) { +// oldIds = new StringBuilder(oldIds.substring(0, oldIds.length() - 1)); +// lawsHomeSearchService.updateEsData(LawsHomeSearchCommon.LAWS_OVERSEAS_STANDARD, oldIds.toString(), LawsHomeSearchCommon.LAWS_ES_DELETE); +// } +// // 同步es数据库 +// if (newIds.length() > 0) { +// newIds = new StringBuilder(newIds.substring(0, newIds.length() - 1)); +// lawsHomeSearchService.updateEsData(LawsHomeSearchCommon.LAWS_OVERSEAS_STANDARD, newIds.toString(), LawsHomeSearchCommon.LAWS_ES_ADD); +// } + } + @Override public void importOldESAuthAllExcel(MultipartFile file, HttpServletResponse response) { List errImportList = new ArrayList<>(); @@ -247,13 +412,7 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl esWrapper = new LambdaQueryWrapper<>(); List esList = this.list(esWrapper.isNotNull(LawsEnterpriseStandard::getOldSystemId)); Map esMap = esList.stream().collect(Collectors.toMap(LawsEnterpriseStandard::getOldSystemId, o -> o)); - + // 获取所有有关联的新部门 LambdaQueryWrapper sysDeptWrapper = new LambdaQueryWrapper<>(); sysDeptWrapper.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); @@ -485,6 +632,71 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl chineseStandardNo = new ArrayList<>(); + // 验证文件是否为压缩格式 + if (!Objects.requireNonNull(file.getOriginalFilename()).contains("xls")) { + throw new JeroBootException("文件格式不正确,请上传Excel。"); + } + ImportParams params = new ImportParams(); + params.setTitleRows(0); + params.setNeedSave(true); + + // 获取数据 + List datalist = new ArrayList<>(); + List emptyData = new ArrayList<>(); + List chineseData = new ArrayList<>(); + try { + // 获取当前时间戳(毫秒) + long startTime = System.currentTimeMillis(); + params.setSheetNum(1); + try (InputStream newInputStream = file.getInputStream()) { + datalist = ExcelImportUtil.importExcel(newInputStream, OldSystemImportDTO.class, params); + } + + // 空行数据 + emptyData = datalist.stream().filter(OldSystemImportDTO::isEmptyRow).collect(Collectors.toList()); + // 删除空行之后的数据 + datalist.removeIf(OldSystemImportDTO::isEmptyRow); + + datalist = datalist.stream().filter(data -> !this.containsChinese(data.getBzh())).collect(Collectors.toList()); + // 剔除不导入的数据 国家标准/GJB国家军用标准 +// datalist = datalist.stream().filter(data -> !data.getBzfl().equals("国家标准/GJB国家军用标准")).collect(Collectors.toList()); +// // 删除政策 文件 之后的数据 +// datalist = datalist.stream().filter(data -> !this.containsChinese(data.getBzh())).collect(Collectors.toList()); +//// // 只取用国标数据 +//// datalist = datalist.stream().filter(data -> data.getBzfl().startsWith("国家标准")).collect(Collectors.toList()); +//// // 只取用外标数据 +// datalist = datalist.stream().filter(data -> data.getBzfl().contains("国外") || data.getBzfl().contains("ISO")) +// .collect(Collectors.toList()); + + + // 区分数据 + log.info("获取数据成功,总数据条数:{}", datalist.size()); + // 删选标准分类不为空且是企标的数据 + + log.info("企标相关数据条数:{}", datalist.size()); + // 获取当前时间戳(毫秒) + long endTime = System.currentTimeMillis(); + // 计算执行时间(毫秒) + long executionTime = endTime - startTime; + log.info("数据转换执行时间:" + executionTime + " 毫秒"); + } catch (Exception e) { + log.error("导入失败;{}", e.getMessage()); + } + this.exportWithExcel(response, datalist, "needImportAllData.xls"); + if (false) { + this.exportWithExcel(response, chineseStandardNo, "ChineseStandardNo.xls"); + } + } + + public boolean containsChinese(String text) { + Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]"); + Matcher matcher = pattern.matcher(text); + return matcher.find(); + } + public void exportWithExcel(HttpServletResponse response, List dtoList, String fileName) { try { // 设置导出参数 @@ -504,8 +716,12 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl allDatalist, List errImportList) { + List gbDatalist = allDatalist.stream().filter(o -> o.getBzfl().contains("国家") || + o.getBzfl().contains("地方") || + o.getBzfl().contains("行业")).collect(Collectors.toList()); + log.info("国标相关数据条数:{}", gbDatalist.size()); - private void oldSysGBImport(List gbDatalist, List errImportList) { // 找到所有人 并且用 姓名加工号做key Map allUserMap = sysUserService.list().stream().collect(Collectors.toMap(o -> o.getRealname() + o.getUsername(), o -> o)); @@ -526,27 +742,40 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl map = StandardSplitUtils.splitDomesticStandardNumber(newBzh); + gb.setStandardClass(map.get(FieldCommon.STANDARD_CLASS)); + gb.setStandardNumberTemp(map.get(FieldCommon.STANDARD_NUMBER_TEMP)); + gb.setYearNumber(map.get(FieldCommon.YEAR_NUMBER)); gb.setStandardName(dto.getBzmc()); gb.setStandardEnglishName(dto.getBzywmc()); // 发布日期和实施日期入库之前需要校验 为空或者不符合规则的不入库 - gb.setReleaseDate(dto.getFbrq()); - gb.setImplementationDate(dto.getSsrq()); + String fbrq = dto.getFbrq(); + String ssrq = dto.getSsrq(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + if (StrUtil.isNotBlank(fbrq)) { + Date newDate = sdf.parse(fbrq.trim()); + if (newDate != null) { + gb.setReleaseDate(newDate); + } else { + throw new JeroBootException("发布日期格式不正确,标准编号:" + dto.getBzh()); + } + } + if (StrUtil.isNotBlank(ssrq)) { + Date newDate = sdf.parse(ssrq.trim()); + if (newDate != null) { + gb.setImplementationDate(newDate); + } else { + throw new JeroBootException("实施日期格式不正确,标准编号:" + dto.getBzh()); + } + } String standardState = dto.getBzzt(); gb.setStandardState(standardState.equals("现行有效") ? "6" : "7"); @@ -554,20 +783,26 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl departList = curDeptMap.get(curOrgName); - if (departList.size() != 0) { - gb.setResponsibleDepartment(departList.get(0).getId()); - } - } - } + // 责任部门暂不导入 +// String zrbm = dto.getZrbm(); +// if (oldDeptMap.get(zrbm) != null && oldDeptMap.get(zrbm).get(0) != null) { +// String curOrgName = oldDeptMap.get(zrbm).get(0).getCurOrgName(); +// if (StrUtil.isNotBlank(curOrgName)) { +// List departList = curDeptMap.get(curOrgName); +// if (departList.size() != 0) { +// gb.setResponsibleDepartment(departList.get(0).getId()); +// } +// } +// } String zrr = dto.getZrr(); String zrrid = dto.getZrrid(); if (StrUtil.isNotBlank(zrr) && StrUtil.isNotBlank(zrrid)) { - gb.setResponsibleDepartmentUser(allUserMap.get(zrr + zrrid).getId()); + SysUser sysUser = allUserMap.get(zrr + zrrid); + if (sysUser != null) { + gb.setResponsibleDepartmentUser(sysUser.getId()); + } else { + throw new JeroBootException("未找到责任人,姓名:" + zrr + ",工号:" + zrrid + ",标准编号:" + dto.getBzh()); + } } // 根据文件路径获取文件Id @@ -584,15 +819,17 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl existingEntities = domesticStandardService.list(); // 2. 创建一个Map,用于快速查找是否存在相同的标准号 @@ -637,13 +874,24 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl updateWrapper = this.getDomesticUpdateWrapper(entity); + domesticStandardService.update(entity, updateWrapper); + } else { + // 如果不存在,则执行保存操作 + domesticStandardService.save(entity); + } String standardId = entity.getId(); - // 保存文件关联 //TODO 处理空指针 -// OSSFile ossFile = standardNumberToFileMap.get(entity.getStandardNumber()).get(0); -// ossFile.setStandardId(standardId); -// ossFileService.save(ossFile); -// entity.setId(standardId); + // 保存文件关联 +// List ossFiles = standardNumberToFileMap.get(entity.getStandardNumber()); +// if (ossFiles != null && !ossFiles.isEmpty()) { +// OSSFile ossFile = ossFiles.get(0); +// ossFile.setStandardId(standardId); +// ossFileService.save(ossFile); +// } } log.info("老法规国标覆盖导入完成"); // 获取当前时间戳(毫秒) @@ -663,6 +911,43 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl getDomesticUpdateWrapper(LawsDomesticStandard entity) { + // 遍历是实体类的所有字段,如果有值则不拼接update语句,如果没有值则拼接语句 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", entity.getId()); + Field[] fields = entity.getClass().getDeclaredFields(); + // 创建一个不做处理的数组 + List ignoreFields = Arrays.asList("id", + "serialVersionUID", "delFlag", + "createBy", "createTime", "updateBy", "updateTime", "orgCode"); + for (Field field : fields) { + if (!ignoreFields.contains(field.getName())) { + field.setAccessible(true); + String dbColumnName = convertFieldNameToDbColumnName(field.getName()); + if (field.get(entity) == null) { + updateWrapper.set(dbColumnName, null); + } else { + updateWrapper.set(dbColumnName, field.get(entity)); + } + } + } + return updateWrapper; + } + + // 定义一个方法来执行字段名转换 + private String convertFieldNameToDbColumnName(String fieldName) { + StringBuilder dbColumnName = new StringBuilder(); + for (char c : fieldName.toCharArray()) { + if (Character.isUpperCase(c)) { + dbColumnName.append("_").append(Character.toLowerCase(c)); + } else { + dbColumnName.append(c); + } + } + return dbColumnName.toString(); + } + private void oldSysESImport(List esDatalist, List errImportList) { long startTime = System.currentTimeMillis(); // 转换数据 @@ -679,10 +964,25 @@ public class LawsEnterpriseStandardServiceImpl extends ServiceImpl splitDomesticStandardNumber(String standardNumber) { + // 定义多个正则表达式来匹配不同的标准号格式 + String[] regexPatterns = { + "^([A-Za-z0-9/]+) (\\d+(?:\\.\\d+)?)-(\\d+)$" + }; + + Map map = new HashMap<>(); + boolean isMatched = false; + for (String regex : regexPatterns) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(standardNumber); + if (matcher.find()) { + String dsCode = matcher.group(1).trim(); + String sequenceNumber = matcher.group(2).trim(); + String yearNum = matcher.group(3).trim(); + + map.put(FieldCommon.STANDARD_CLASS, dsCode); + map.put(FieldCommon.STANDARD_NUMBER_TEMP, sequenceNumber); + map.put(FieldCommon.YEAR_NUMBER, yearNum); + isMatched = true; + break; // 匹配成功,跳出循环 + } + } + if (!isMatched) { + log.error("国标标准号" + standardNumber + "拆分失败"); + throw new RuntimeException("国标标准号" + standardNumber + "拆分失败"); + } + return map; + } + + // 标准简单拆分 + public static Map simpleSplitStandardNumber(String bzh, String cybzh) { + // 将bzh根据空格分成两部分 + String[] cybzhArr = cybzh.split(" "); + String sCode = cybzhArr[0].trim(); + String sequenceNumber = cybzhArr[1].trim(); + String yearNum = null; + if (!bzh.equals(cybzh)) { + yearNum = bzh.replaceAll(cybzh, "").replaceFirst("-", "").trim(); + // 如果类别和顺序号不为空则返回成功, 否则抛异常 + if (StrUtil.isBlank(yearNum)) { + log.error("标准号" + bzh + "拆分失败,标准号和采用标准号不一致,但年代号为空"); + throw new RuntimeException("标准号" + bzh + "拆分失败,标准号和采用标准号不一致,但年代号为空"); + } + } + + // 如果类别和顺序号不为空则返回成功, 否则抛异常 + if (StrUtil.isBlank(sCode) || StrUtil.isBlank(sequenceNumber)) { + log.error("标准号" + bzh + "拆分失败"); + throw new RuntimeException("标准号" + bzh + "拆分失败"); + } + + Map map = new HashMap<>(); + map.put(FieldCommon.STANDARD_CLASS, sCode); + map.put(FieldCommon.STANDARD_NUMBER_TEMP, sequenceNumber); + map.put(FieldCommon.YEAR_NUMBER, yearNum); + return map; + } + + + // 海外标准拆分 + public static Map splitOverseaStandardNumber(String standardNumber) { + // 定义多个正则表达式来匹配不同的标准号格式 + String[] regexPatterns = { + "^([A-Za-z0-9/]+) (\\d+(?:\\.\\d+)?)-(\\d+)$" + }; + + Map map = new HashMap<>(); + boolean isMatched = false; + for (String regex : regexPatterns) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(standardNumber); + if (matcher.find()) { + String dsCode = matcher.group(1).trim(); + String sequenceNumber = matcher.group(2).trim(); + String yearNum = matcher.group(3).trim(); + + map.put(FieldCommon.STANDARD_CLASS, dsCode); + map.put(FieldCommon.STANDARD_NUMBER_TEMP, sequenceNumber); + map.put(FieldCommon.YEAR_NUMBER, yearNum); + isMatched = true; + break; // 匹配成功,跳出循环 + } + } + if (!isMatched) { + log.error("海外标准号" + standardNumber + "拆分失败"); + throw new RuntimeException("海外标准号" + standardNumber + "拆分失败"); + } + return map; + } + + + + +}