diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/job/AsmsDomesticJob.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/job/AsmsDomesticJob.java new file mode 100644 index 00000000..cd581935 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/job/AsmsDomesticJob.java @@ -0,0 +1,20 @@ +package com.jero.modules.docking.asms.job; + +import com.jero.common.util.SpringContextUtils; +import com.jero.modules.docking.asms.service.impl.SynchronizationAsmsService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +/** + * @Author: liao + * @Date: 2023/11/3 13:43 + * @Description: 同步asms国内法规 + */ +public class AsmsDomesticJob implements Job { + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + SynchronizationAsmsService bean = SpringContextUtils.getBean(SynchronizationAsmsService.class); + bean.syncDomestic(); + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/job/AsmsSplitJob.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/job/AsmsSplitJob.java new file mode 100644 index 00000000..e107b4eb --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/job/AsmsSplitJob.java @@ -0,0 +1,20 @@ +package com.jero.modules.docking.asms.job; + +import com.jero.common.util.SpringContextUtils; +import com.jero.modules.docking.asms.service.impl.SynchronizationAsmsService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +/** + * @Author: liao + * @Date: 2023/11/3 13:44 + * @Description: 同步asms文档拆分 + */ +public class AsmsSplitJob implements Job { + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + SynchronizationAsmsService bean = SpringContextUtils.getBean(SynchronizationAsmsService.class); + bean.syncSplit(); + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/service/impl/SynchronizationAsmsService.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/service/impl/SynchronizationAsmsService.java new file mode 100644 index 00000000..b84ee8b0 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/asms/service/impl/SynchronizationAsmsService.java @@ -0,0 +1,590 @@ +package com.jero.modules.docking.asms.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.MinioUtil; +import com.jero.common.util.UUIDUtils; +import com.jero.modules.docking.asms.entity.LawsAsmsDomestic; +import com.jero.modules.docking.asms.mapper.LawsAsmsOpenApiMapper; +import com.jero.modules.docking.asms.service.ILawsAsmsDomesticService; +import com.jero.modules.docking.asms.util.AlphanumericComparator; +import com.jero.modules.docking.asms.util.AsmsPostUtil; +import com.jero.modules.laws.common.util.DateUtil; +import com.jero.modules.laws.documenttool.entity.LawsDocumentSplit; +import com.jero.modules.laws.documenttool.mapper.LawsDocumentSplitMapper; +import com.jero.modules.laws.standard.entity.LawsDomesticStandard; +import com.jero.modules.laws.standard.service.ILawsDomesticStandardService; +import com.jero.modules.laws.standard.service.ILawsReplacedStandardService; +import com.jero.modules.laws.standardization.entity.LawsStandardization; +import com.jero.modules.laws.standardization.service.ILawsStandardizationService; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.service.IOSSFileService; +import com.jero.modules.split.entity.SarFileSplitInfoEO; +import com.jero.modules.split.entity.SarFileSplitItemsValEO; +import com.jero.modules.split.entity.SarFileSplitMenuEO; +import com.jero.modules.split.mapper.SarFileSplitMenuEOMapper; +import com.jero.modules.split.service.ISarFileSplitInfoService; +import com.jero.modules.split.service.ISarFileSplitItemsValEOService; +import com.jero.modules.split.service.ISarFileSplitMenuEOService; +import com.jero.modules.system.entity.SysDictItem; +import com.jero.modules.system.service.ISysDictItemService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * @Author: liao + * @Date: 2023/11/3 13:46 + * @Description: 定时同步asms + */ +@Component +@Slf4j +public class SynchronizationAsmsService { + + @Autowired + private AsmsPostUtil asmsPostUtil; + @Autowired + private ISysDictItemService sysDictItemService; + @Autowired + private ILawsAsmsDomesticService lawsAsmsDomesticService; + @Autowired + private LawsAsmsOpenApiMapper lawsAsmsOpenApiMapper; + @Autowired + private ILawsStandardizationService lawsStandardizationService; + @Autowired + private ILawsDomesticStandardService lawsDomesticStandardService; + @Autowired + private ISarFileSplitInfoService sarFileSplitInfoService; + @Autowired + private LawsDocumentSplitMapper lawsDocumentSplitMapper; + @Autowired + private ISarFileSplitMenuEOService sarFileSplitMenuEOService; + @Autowired + private SarFileSplitMenuEOMapper sarFileSplitMenuEOMapper; + @Autowired + private ISarFileSplitItemsValEOService sarFileSplitItemsValEOService; + @Autowired + private ILawsReplacedStandardService lawsReplacedStandardService; + @Autowired + private IOSSFileService ossFileService; + + private final static String filePath = "asms/"; + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static SimpleDateFormat oldDateFormat = new SimpleDateFormat("yyyy年MM月dd日"); + + /** + * @Author: liao + * @Date: 2023/11/3 13:48 + * @Description: 定时同步国内法规 + **/ + @Transactional + public void syncDomestic() { + log.info("=====================定时同步国内法规====================="); + long start = System.currentTimeMillis(); + + // 法规列表 + String url = "xiaobodata/openApi/domesticLaws/list"; + Map paramMap = new HashMap<>(); + paramMap.put("pageNo", "1"); + paramMap.put("pageSize", "2"); + Map totalMap = asmsPostUtil.sendGetReq2(url, paramMap); + String total = (String) totalMap.get("total"); + paramMap.put("pageSize", total); + + List> mapList = asmsPostUtil.sendGetReq(url, paramMap); + if (Objects.isNull(mapList)) { + log.info("=====================没有获取到ASMS系统数据,同步结束====================="); + return; + } + List lawsAsmsDomesticList = new ArrayList(); + mapList.forEach(eMap -> { + String createTimeString = eMap.get("createTime"); + Date createTime = DateUtil.getDateSecond(createTimeString); + Date yesterday = DateUtil.getDateAddDays(new Date(), -1); + // 创建时间为昨天的数据 + if (createTime.after(DateUtil.getDayStart(yesterday)) && createTime.before(DateUtil.getDayEnd(yesterday))) { + LawsAsmsDomestic lawsAsmsDomestic = JSONObject.parseObject(JSONObject.toJSONString(eMap), LawsAsmsDomestic.class); + lawsAsmsDomestic.setCreateTimeString(createTimeString); + lawsAsmsDomestic.setUpdateTimeString(eMap.get("updateTime")); + lawsAsmsDomestic.setFocalPointName(eMap.get("focalPoint")); + lawsAsmsDomesticList.add(lawsAsmsDomestic); + } + }); + if (CollectionUtils.isEmpty(lawsAsmsDomesticList)) { + log.info("=====================昨天新增法规0条,同步结束====================="); + return; + } + + // 法规详情 + String detailUrl = "xiaobodata/openApi/domesticLaws/getInfo"; + List detailList = new ArrayList(); + Map detailMap = new HashMap<>(); + lawsAsmsDomesticList.forEach(lawsAsmsDomestic -> { + detailMap.put("lawCode", lawsAsmsDomestic.getCode()); + Map objectMap = asmsPostUtil.sendGetReq2(detailUrl, detailMap); + + LawsAsmsDomestic parseObject = JSONObject.parseObject(JSONObject.toJSONString(objectMap), LawsAsmsDomestic.class); + parseObject.setCreateTimeString((String) objectMap.get("createTime")); + parseObject.setUpdateTimeString((String) objectMap.get("updateTime")); + parseObject.setFocalPointName((String) objectMap.get("focalPoint")); + detailList.add(parseObject); + }); + + // 同步到数据库 + List sysDictItemList = sysDictItemService.list(); + List lawsStandardizationList = lawsStandardizationService.list(); + List insertDomesticList = new ArrayList<>(); + detailList.forEach(lawsAsmsDomestic -> { + String[] parts = lawsAsmsDomestic.getCode().split("[-\\s]"); // 使用空格或破折号作为分隔符 + if (parts.length < 3) { + parts = lawsAsmsDomestic.getCode().split("[—\\s]"); // 使用空格或破折号作为分隔符 + } + // 封装实例 + LawsDomesticStandard lawsDomesticStandard = new LawsDomesticStandard(); + // 对接标识 + lawsDomesticStandard.setIsAsmsImport("1"); + // 标准编号 + lawsDomesticStandard.setStandardNumber(lawsAsmsDomestic.getCode()); + // 标准类别 + lawsDomesticStandard.setStandardClass(parts[0]); + // 标准号 + lawsDomesticStandard.setStandardNumberTemp(parts[1]); + // 年代号 + lawsDomesticStandard.setYearNumber(parts[2]); + // 标准名称 + lawsDomesticStandard.setStandardName(lawsAsmsDomestic.getName()); + // 标准英文名称 + lawsDomesticStandard.setStandardEnglishName(lawsAsmsDomestic.getEnglishName()); + // 适用认证 + String itemValues = getItemValues(lawsAsmsDomestic.getApplicableCertificationListString(), + "1696008107352854529", sysDictItemList); + lawsDomesticStandard.setApplicableCertification(itemValues); + // 适用车型 + itemValues = getItemValues(lawsAsmsDomestic.getApplicableModelsListString(), + "1702518672924110850", sysDictItemList); + lawsDomesticStandard.setApplicableVehicle(itemValues); + // 采标程度 + itemValues = getItemValues(lawsAsmsDomestic.getDegreeAdoption(), + "1696042735686049793", sysDictItemList); + lawsDomesticStandard.setDegreeOfBidAcquisition(itemValues); + // 实施日期 + lawsDomesticStandard.setImplementationDate(getSimpleDate(lawsAsmsDomestic.getImplementationDate())); + // 采用国际标准号 + lawsDomesticStandard.setAdoptTheInternationalStandardNumber(lawsAsmsDomestic.getInternationalStandard()); + // 新车实施日期 + lawsDomesticStandard.setNewModelImplementationDate(getManyDateString(lawsAsmsDomestic.getNewCarImplementationDate())); + // 动力类型 + itemValues = getItemValues(lawsAsmsDomestic.getPowerTypeListString(), + "1702518671166697474", sysDictItemList); + lawsDomesticStandard.setDynamicType(itemValues); + // 在产车实施日期 + lawsDomesticStandard.setOnTheProductionDate(getManyDateString(lawsAsmsDomestic.getProductionCarImplementationDate())); + // 发布日期 + lawsDomesticStandard.setReleaseDate(getSimpleDate(lawsAsmsDomestic.getPublishDate())); + // 代替标准号 + lawsReplacedStandardService.addRelation(lawsAsmsDomestic.getReplaceCode(), lawsAsmsDomestic.getCode(), 1); + // 标准性质 + itemValues = getItemValues(lawsAsmsDomestic.getStandardNature(), + "1695010513489833985", sysDictItemList); + lawsDomesticStandard.setStandardProperty(itemValues); + // 标准状态 + itemValues = getItemValues(lawsAsmsDomestic.getStandardStatus(), + "1695991936599715842", sysDictItemList); + lawsDomesticStandard.setStandardState(itemValues); + // 分标委 + String subcommittee = lawsAsmsDomestic.getSubcommittee(); + if (StringUtils.isNotBlank(subcommittee)) { + lawsDomesticStandard.setBiddingCommittee(lawsStandardizationList.stream() + .filter(e -> subcommittee.equals(e.getName())).collect(Collectors.toList()).get(0).getId()); + } + // 创建时间 + lawsDomesticStandard.setCreateTime(getSimpleDate2(lawsAsmsDomestic.getCreateTimeString())); + // 更新时间 + lawsDomesticStandard.setUpdateTime(getSimpleDate2(lawsAsmsDomestic.getUpdateTimeString())); + + // 生成id + lawsDomesticStandard.setId(UUIDUtils.randomUUID20()); + + insertDomesticList.add(lawsDomesticStandard); + }); + // 插入国内法规标准数据库 + lawsDomesticStandardService.saveBatch(insertDomesticList, insertDomesticList.size()); + long time1 = System.currentTimeMillis(); + log.info("=====================同步国内法规标准数据:{}条,耗时:{}毫秒=====================", insertDomesticList.size(), time1 - start); + + // 同步国内法规相关文档 + String fileUrl = "xiaobodata/openApi/domesticLaws/getFile"; + insertDomesticList.forEach(lawsDomesticStandard -> { + String id = lawsDomesticStandard.getId(); + String code = lawsDomesticStandard.getStandardNumber(); + Map fileParamMap = new HashMap<>(); + fileParamMap.put("lawCode", code); + Map objectMap = asmsPostUtil.sendGetReq2(fileUrl, fileParamMap); + if (!Objects.isNull(objectMap)) { + Map standardTextPdf = (Map) objectMap.get("standardTextPdf"); + String fileName = standardTextPdf.get("fileName"); + String fileType = standardTextPdf.get("fileType"); + String uri = standardTextPdf.get("url"); + if (StringUtils.isNotBlank(uri)) { + upload(uri, fileName, fileType, id, code); + } + Map standardTextWord = (Map) objectMap.get("standardTextWord"); + fileName = standardTextWord.get("fileName"); + fileType = standardTextWord.get("fileType"); + uri = standardTextWord.get("url"); + if (StringUtils.isNotBlank(uri)) { + upload(uri, fileName, fileType, id, code); + } + } + }); + long time2 = System.currentTimeMillis(); + log.info("=====================同步国内法规文件耗时:{}毫秒=====================", time2 - time1); + + long end = System.currentTimeMillis(); + log.info("=====================全部同步完成,耗时:{} 毫秒=====================", end - start); + log.info("=====================定时任务同步结束====================="); + } + + /** + * @Author: liao + * @Date: 2023/11/3 13:49 + * @Description: 同步文档拆分 + **/ + @Transactional + public void syncSplit() { + log.info("=====================定时同步文档拆分====================="); + long start = System.currentTimeMillis(); + + // 文档拆分 + String url = "xiaobodata/openApi/article/search"; + Map paramMap = new HashMap<>(); + paramMap.put("pageNo", "1"); + paramMap.put("pageSize", "2"); + Map totalMap = asmsPostUtil.sendGetReq2(url, paramMap); + String total = (String) totalMap.get("total"); + paramMap.put("pageSize", total); + + List> mapList = asmsPostUtil.sendGetReq(url, paramMap); + if (Objects.isNull(mapList)) { + log.info("=====================没有获取到ASMS系统数据,同步结束====================="); + return; + } + + List allSplitList = sarFileSplitInfoService.list(); + List codeList = allSplitList.stream().map(SarFileSplitInfoEO::getSerialNumber).collect(Collectors.toList()); + + List insertSplitList = new ArrayList<>(); + mapList.forEach(eMap -> { + String code = eMap.get("code"); + if (CollectionUtils.isEmpty(codeList) || !codeList.contains(code)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(LawsDomesticStandard::getStandardNumber, code); + LawsDomesticStandard lawsDomesticStandard = lawsDomesticStandardService.getOne(queryWrapper); + + LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>(); + queryWrapper1.eq(OSSFile::getStandardId, lawsDomesticStandard.getId()); + queryWrapper1.eq(OSSFile::getStandardFileType, "publish_of_original"); + queryWrapper1.like(OSSFile::getFileName, ".docx"); + OSSFile ossFile = ossFileService.getOne(queryWrapper1); + + SarFileSplitInfoEO sarFileSplitInfoEO = new SarFileSplitInfoEO(); + sarFileSplitInfoEO.setStandardId(lawsDomesticStandard.getId()); + sarFileSplitInfoEO.setSerialNumber(lawsDomesticStandard.getStandardNumber()); + sarFileSplitInfoEO.setTitle(lawsDomesticStandard.getStandardName()); + sarFileSplitInfoEO.setFileType("publish_of_original"); + sarFileSplitInfoEO.setFileId(ossFile.getId()); + sarFileSplitInfoEO.setFileName(ossFile.getFileName()); + sarFileSplitInfoEO.setSplitStatus("1"); + sarFileSplitInfoEO.setCreateTime(getSimpleDate2(eMap.get("createTime"))); + sarFileSplitInfoEO.setUpdateTime(getSimpleDate2(eMap.get("updateTime"))); + sarFileSplitInfoEO.setIsAsmsImport("1"); + + sarFileSplitInfoEO.setId(UUIDUtils.randomUUID20()); + + insertSplitList.add(sarFileSplitInfoEO); + } + }); + if (CollectionUtils.isEmpty(insertSplitList)) { + log.info("=====================昨天新增拆分0条,同步结束====================="); + return; + } + + sarFileSplitInfoService.saveBatch(insertSplitList, insertSplitList.size()); + long time1 = System.currentTimeMillis(); + log.info("=====================同步标准拆分数据:{}条,耗时:{}毫秒=====================", insertSplitList.size(), time1 - start); + + // 单条拆分的详情 + String splitUrl = "xiaobodata/openApi/article/details"; + Map paramMap1 = new HashMap<>(); + Map paramMap2 = new HashMap<>(); + Map paramMap3 = new HashMap<>(); + Map> infoMap = new HashMap<>(); + int[] n = {0}; + insertSplitList.forEach(sarFileSplitInfoEO -> { + paramMap.put("standardCode", sarFileSplitInfoEO.getSerialNumber()); + List> mapListAll = asmsPostUtil.sendGetReq(splitUrl, paramMap1); + List insertDocumentList = new ArrayList<>(); + mapListAll.forEach(eMap -> { + // 单个法规的条文解读详情 + paramMap2.put("standardCode", sarFileSplitInfoEO.getSerialNumber()); + paramMap2.put("termsCode", eMap.get("termsNum")); + Map objectMap = asmsPostUtil.sendGetReq2("xiaobodata/openApi/article/interpretation/details", paramMap2); + + // 单个法规的条文标签详情 + paramMap3.put("standardCode", sarFileSplitInfoEO.getSerialNumber()); + paramMap3.put("termsCode", eMap.get("termsNum")); + Map objectMap2 = asmsPostUtil.sendGetReq2("xiaobodata/openApi/article/label/details", paramMap3); + + LawsDocumentSplit lawsDocumentSplit = new LawsDocumentSplit(); + lawsDocumentSplit.setInfoId(sarFileSplitInfoEO.getId()); + lawsDocumentSplit.setItemNum(eMap.get("termsNum")); + lawsDocumentSplit.setItemTitle(eMap.get("termsName")); + lawsDocumentSplit.setItemContent(eMap.get("articleContent")); + lawsDocumentSplit.setCreateTime(getSimpleDate2(eMap.get("createTime"))); + lawsDocumentSplit.setUpdateTime(getSimpleDate2(eMap.get("updateTime"))); + + lawsDocumentSplit.setInterpretationArticles((String) objectMap.get("termsInterpretation")); + + lawsDocumentSplit.setFunctionClassification((String) objectMap2.get("functionClassification")); + lawsDocumentSplit.setFunctionProfessional((String) objectMap2.get("functionProfession")); + lawsDocumentSplit.setFunctionGroupName((String) objectMap2.get("groupingName")); + lawsDocumentSplit.setFunctionGroupName((String) objectMap2.get("groupingNum")); + lawsDocumentSplit.setCerImplementDate((String) objectMap2.get("implementDateCertified")); + lawsDocumentSplit.setNewCerImplementDate((String) objectMap2.get("implementDateNewCer")); + lawsDocumentSplit.setNewRegisterImplementDate((String) objectMap2.get("implementDateNewRegister")); + lawsDocumentSplit.setLawsRequireType((String) objectMap2.get("lawsRequireType")); + lawsDocumentSplit.setApplications((String) objectMap2.get("modelsType")); + lawsDocumentSplit.setDynamicType((String) objectMap2.get("powerType")); + + lawsDocumentSplit.setId(UUIDUtils.randomUUID20()); + + insertDocumentList.add(lawsDocumentSplit); + lawsDocumentSplitMapper.insert(lawsDocumentSplit); + n[0]++; + }); + infoMap.put(sarFileSplitInfoEO.getId(), insertDocumentList); + }); + long time2 = System.currentTimeMillis(); + log.info("=====================同步DocumentSplit条文数据:{}条,耗时:{}毫秒=====================", n[0], time2 - time1); + + insertSplitList.forEach(sarFileSplitInfoEO -> { + String infoId = sarFileSplitInfoEO.getId(); + List lawsDocumentSplitList = infoMap.get(infoId); + List itemNumList = lawsDocumentSplitList.stream().map(LawsDocumentSplit::getItemNum).collect(Collectors.toList()); + + // 对目录排序 + Collections.sort(itemNumList, new AlphanumericComparator()); + Map sortMap = new HashMap<>(); + for (int i = 0; i < itemNumList.size(); i++) { + sortMap.put(itemNumList.get(i), i+2L); + } + List sarFileSplitMenuEOList = new java.util.ArrayList<>(); + // 根目录 + SarFileSplitMenuEO rootEO = new SarFileSplitMenuEO(); + String rootId = UUIDUtils.randomUUID20(); + rootEO.setId(rootId); + rootEO.setInfoId(infoId); + rootEO.setName("总目录"); + rootEO.setDisplaySeq(1L); + rootEO.setValidFlag(0); + sarFileSplitMenuEOMapper.insertSelective(rootEO); + + Map idMap = new HashMap<>(); + lawsDocumentSplitList.forEach(lawsDocumentSplit -> { + SarFileSplitMenuEO sarFileSplitMenuEO = new SarFileSplitMenuEO(); + String itemNum = lawsDocumentSplit.getItemNum(); + String id = UUIDUtils.randomUUID20(); + sarFileSplitMenuEO.setId(id); + sarFileSplitMenuEO.setInfoId(infoId); + sarFileSplitMenuEO.setName(itemNum); + sarFileSplitMenuEO.setDisplaySeq(sortMap.get(itemNum)); + sarFileSplitMenuEO.setValidFlag(0); + String itemTitle = lawsDocumentSplit.getItemTitle(); + sarFileSplitMenuEO.setItemName(itemTitle.substring(0, Math.min(10, itemTitle.length()))); + sarFileSplitMenuEOList.add(sarFileSplitMenuEO); + idMap.put(itemNum, id); + + lawsDocumentSplit.setMenuId(id); + lawsDocumentSplitMapper.updateById(lawsDocumentSplit); + }); + + // 设置父id + sarFileSplitMenuEOList.forEach(sarFileSplitMenuEO -> { + String itemNum = sarFileSplitMenuEO.getName(); + String[] split = itemNum.split("\\."); + if (split.length == 1) { + sarFileSplitMenuEO.setPId(rootId); + } else { + // 去除数组中的最后一个元素 + split = Arrays.copyOf(split, split.length - 1); + String pid = idMap.get(StringUtils.join(split, ".")); + if (StringUtils.isBlank(pid)) { + pid = rootId; + } + sarFileSplitMenuEO.setPId(pid); + } + }); + sarFileSplitMenuEOMapper.insertForeach(sarFileSplitMenuEOList); + }); + long time3 = System.currentTimeMillis(); + log.info("=====================生成拆分详情左侧目录耗时:{}毫秒=====================", time3 - time2); + + insertSplitList.forEach(sarFileSplitInfoEO -> { + String infoId = sarFileSplitInfoEO.getId(); + List lawsDocumentSplitList = infoMap.get(infoId); + lawsDocumentSplitList.forEach(lawsDocumentSplit -> { + String itemContent = lawsDocumentSplit.getItemContent(); + // 使用 jsoup 解析 HTML + Document doc = Jsoup.parse(itemContent); + + // 选择所有的

元素 + Elements paragraphs = doc.select("p"); + + // 存储提取的文本内容 + List textContents = new java.util.ArrayList<>(); + + for (Element paragraph : paragraphs) { + // 获取每个

元素的文本内容并添加到集合中 + String textContent = paragraph.text(); + textContents.add(textContent); + } + + for (int i = 0; i < textContents.size(); i++) { + SarFileSplitItemsValEO sarFileSplitItemsValEO = new SarFileSplitItemsValEO(); + sarFileSplitItemsValEO.setId(UUIDUtils.randomUUID20()); + sarFileSplitItemsValEO.setType("TEXT"); + sarFileSplitItemsValEO.setItemId(lawsDocumentSplit.getId()); + sarFileSplitItemsValEO.setItemContent(textContents.get(i)); + sarFileSplitItemsValEO.setDisplaySeq(i+1); + sarFileSplitItemsValEO.setValidFlag(0); + sarFileSplitItemsValEOService.insertSelective(sarFileSplitItemsValEO); + } + }); + }); + + long time4 = System.currentTimeMillis(); + log.info("=====================生成条文详情耗时:{}毫秒=====================", time4 - time3); + + long end = System.currentTimeMillis(); + log.info("=====================全部同步完成,耗时:{} 毫秒=====================", end - start); + log.info("=====================定时任务同步结束====================="); + } + + private void upload(String url, String fileName, String fileType, String id, String code) { + InputStream inputStream = asmsPostUtil.getFileByteArray(url); + try { + MinioUtil.upload(inputStream, filePath + url); + } catch (Exception e) { + e.printStackTrace(); + throw new JeroBootException("文件上传错误"); + } + OSSFile ossFile = new OSSFile(); + ossFile.setFileName(fileName + "." + fileType); + ossFile.setUrl(filePath + url); + ossFile.setStandardId(id); + ossFile.setStandardNo(code); + ossFile.setStandardFileType("publish_of_original"); + ossFileService.save(ossFile); + } + + private Date getSimpleDate(String dateStr) { + if (StringUtils.isBlank(dateStr)) return null; + try { + return simpleDateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + throw new JeroBootException("时间格式转换错误"); + } + } + + private Date getSimpleDate2(String dateStr) { + if (StringUtils.isBlank(dateStr)) return null; + try { + return dateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + throw new JeroBootException("时间格式转换错误"); + } + } + + /** + * @Author: liao + * @Date: 2023/10/23 15:57 + * @Description: 获取多日期字符串 + **/ + private String getManyDateString(String oldManyDateString) { + if (StringUtils.isBlank(oldManyDateString)) return ""; + List oldValueList = Arrays.asList(oldManyDateString.split("、")); + // 使用正则表达式提取日期部分 + Pattern pattern = Pattern.compile("\\d{4}年\\d{2}月\\d{2}日"); + + List valueList = new java.util.ArrayList<>(); + oldValueList.forEach(value -> { + Matcher matcher = pattern.matcher(value); + String dateStr; + if (matcher.find()) { + dateStr = matcher.group(0); + } else { + return; + } + try { + Date parse = oldDateFormat.parse(dateStr); + String format = simpleDateFormat.format(parse); + valueList.add(format); + } catch (ParseException e) { + e.printStackTrace(); + throw new JeroBootException("时间格式转换错误"); + } + }); + if (valueList.size() == 1) { + // 如果只有一个日期值,则复制成两个,用于查询和排序 + return valueList.get(0) + "," + valueList.get(0); + } + List dateList = valueList.stream() + .map(LocalDate::parse) // 解析日期字符串为 LocalDate 对象 + .sorted() // 按照日期大小进行排序 + .collect(Collectors.toList()); + + // 将排序后的 LocalDate 对象转换为字符串 + List sortedDateStrList = dateList.stream() + .map(LocalDate::toString) + .collect(Collectors.toList()); + + return String.join(",", sortedDateStrList); + } + + /** + * @Author: liao + * @Date: 2023/10/23 15:09 + * @Description: 获取字典值 + **/ + private String getItemValues(String itemTexts, String dictId, List sysDictItemList) { + if (StringUtils.isBlank(itemTexts)) return ""; + List itemTextList = Arrays.asList(itemTexts.split(";")); + List itemValues = sysDictItemList.stream() + .filter(sysDictItem -> itemTextList.contains(sysDictItem.getItemText()) && dictId.equals(sysDictItem.getDictId())) + .map(SysDictItem::getItemValue).collect(Collectors.toList()); + return StringUtils.join(itemValues, ","); + } + + +} diff --git a/laws-modules/src/main/java/com/jero/modules/laws/common/util/DateUtil.java b/laws-modules/src/main/java/com/jero/modules/laws/common/util/DateUtil.java index 70cf1e27..1c6b475d 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/common/util/DateUtil.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/common/util/DateUtil.java @@ -6,8 +6,11 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; import java.util.List; @@ -49,6 +52,48 @@ public class DateUtil { } } + /** + * @Author: liao + * @Date: 2023/11/3 14:16 + * @Description: 获取某天的开始时间 00:00:00 + **/ + public static Date getDayStart(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + return calendar.getTime(); + } + + /** + * @Author: liao + * @Date: 2023/11/3 14:16 + * @Description: 获取某天的结束时间 23.59.59.999999999 + **/ + public static Date getDayEnd(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + return calendar.getTime(); + } + + /** + * @Author: liao + * @Date: 2023/11/3 14:31 + * @Description: 将一个日期,加上n天,n可以是负数 + **/ + public static Date getDateAddDays(Date date, int n) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DAY_OF_MONTH, n); + return calendar.getTime(); + } + /** * @Author: liao * @Date: 2023/10/31 10:42 @@ -61,6 +106,8 @@ public class DateUtil { List dayStrings = new ArrayList<>(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + lastWeek = lastWeek.plusDays(1); + while (!lastWeek.isAfter(today)) { dayStrings.add(lastWeek.format(formatter)); lastWeek = lastWeek.plusDays(1);