Merge branch 'fourthStage' into fiveStage

This commit is contained in:
fengchenchen
2024-03-02 16:26:49 +08:00
9 changed files with 581 additions and 99 deletions
@@ -3,12 +3,14 @@ package com.jero.modules.docking.asms.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jero.common.api.vo.Result;
import com.jero.modules.docking.asms.entity.LawsAsmsDomestic;
import com.jero.modules.docking.asms.service.ILawsAsmsDomesticService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jero.modules.docking.asms.service.impl.SynchronizationAsmsService;
import lombok.extern.slf4j.Slf4j;
import com.jero.common.system.base.controller.JeroController;
import org.springframework.beans.factory.annotation.Autowired;
@@ -35,7 +37,8 @@ import org.apache.poi.ss.formula.functions.T;
public class LawsAsmsDomesticController extends JeroController<LawsAsmsDomestic, ILawsAsmsDomesticService> {
@Autowired
private ILawsAsmsDomesticService lawsAsmsDomesticService;
@Resource
private SynchronizationAsmsService synchronizationAsmsService;
/**
* 分页列表查询
*
@@ -162,4 +165,15 @@ public class LawsAsmsDomesticController extends JeroController<LawsAsmsDomestic,
lawsAsmsDomesticService.cleanData();
return Result.OK("清理成功!");
}
/**
* 根据标准号同步拆分
*
* @return
*/
@GetMapping(value = "/syncSplitByStandardNumber")
public Result<LawsAsmsDomestic> syncSplitByStandardNumber(@RequestParam(name="standardNumber") String standardNumber) {
synchronizationAsmsService.syncSplitByStandardNumber(standardNumber);
return Result.OK("!");
}
}
@@ -4,6 +4,8 @@ import com.jero.modules.docking.asms.entity.LawsAsmsOpenApi;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletRequest;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
@@ -81,7 +83,10 @@ public interface ILawsAsmsOpenApiService extends IService<LawsAsmsOpenApi> {
**/
void syncBatch(List<String> idList);
/**
@NotNull
String disposeImg(String articleContent);
/**
* @Author: liao
* @Date: 2023/10/18 16:20
* @Description: 批量删除原字典配置项
File diff suppressed because one or more lines are too long
@@ -2,12 +2,14 @@ package com.jero.modules.docking.asms.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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.service.ILawsAsmsOpenApiService;
import com.jero.modules.docking.asms.util.AlphanumericComparator;
import com.jero.modules.docking.asms.util.AsmsPostUtil;
import com.jero.modules.laws.common.util.DateUtil;
@@ -35,13 +37,18 @@ 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.jetbrains.annotations.NotNull;
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.http.*;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.InputStream;
@@ -92,6 +99,10 @@ public class SynchronizationAsmsService {
private IOSSFileService ossFileService;
@Autowired
private IDocumentSplitService documentSplitService;
@Autowired
private RestTemplate restTemplate;
@Resource
private ILawsAsmsOpenApiService lawsAsmsOpenApiService;
private final static String filePath = "asms/";
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
@@ -388,7 +399,35 @@ public class SynchronizationAsmsService {
lawsDocumentSplit.setInfoId(sarFileSplitInfoEO.getId());
lawsDocumentSplit.setItemNum(eMap.get("termsNum"));
lawsDocumentSplit.setItemTitle(eMap.get("termsName"));
lawsDocumentSplit.setItemContent(eMap.get("articleContent"));
// 条文内容
String articleContent = eMap.get("articleContent");
try {
// 处理图片
articleContent = lawsAsmsOpenApiService.disposeImg(articleContent);
}catch (Exception e){
log.error(e.getMessage());
log.error("图片处理失败!");
}
// 处理表格
if (articleContent.contains("<table style=")){
articleContent = "<p>" + articleContent + "</p>";
}
// 重复性校验
LawsDocumentSplit lawsDocumentSplits = lawsDocumentSplitMapper.selectOne(
new LambdaQueryWrapper<LawsDocumentSplit>()
.eq(LawsDocumentSplit::getInfoId, lawsDocumentSplit.getInfoId())
.eq(LawsDocumentSplit::getItemNum, lawsDocumentSplit.getItemNum())
.eq(LawsDocumentSplit::getItemTitle, lawsDocumentSplit.getItemTitle()));
if (!Objects.isNull(lawsDocumentSplits)){
// 合并
String itemContent = StringUtils.isNotBlank(lawsDocumentSplits.getItemContent()) ? lawsDocumentSplits.getItemContent() : "";
lawsDocumentSplitMapper.update(null,
new LambdaUpdateWrapper<LawsDocumentSplit>()
.set(LawsDocumentSplit::getItemContent, itemContent + articleContent)
.eq(LawsDocumentSplit::getId, lawsDocumentSplits.getId()));
return;
}
lawsDocumentSplit.setItemContent(articleContent);
lawsDocumentSplit.setCreateTime(getSimpleDate2(eMap.get("createTime")));
lawsDocumentSplit.setUpdateTime(getSimpleDate2(eMap.get("updateTime")));
@@ -436,17 +475,20 @@ public class SynchronizationAsmsService {
});
long time2 = System.currentTimeMillis();
log.info("=====================同步DocumentSplit条文数据:{}条,耗时:{}毫秒=====================", n[0], time2 - time1);
String regex = "[^a-zA-Z0-9.]";
insertSplitList.forEach(sarFileSplitInfoEO -> {
String infoId = sarFileSplitInfoEO.getId();
List<LawsDocumentSplit> lawsDocumentSplitList = infoMap.get(infoId);
List<String> itemNumList = lawsDocumentSplitList.stream().map(LawsDocumentSplit::getItemNum).collect(Collectors.toList());
List<String> itemNumList = new ArrayList<>();
for (LawsDocumentSplit lawsDocumentSplit : lawsDocumentSplitList) {
String itemNum = lawsDocumentSplit.getItemNum();
itemNumList.add(itemNum.replaceAll(regex, ""));
}
// 对目录排序
Collections.sort(itemNumList, new AlphanumericComparator());
Map<String, Long> sortMap = new HashMap<>();
for (int i = 0; i < itemNumList.size(); i++) {
sortMap.put(itemNumList.get(i), i+2L);
sortMap.put(itemNumList.get(i), i + 2L);
}
List<SarFileSplitMenuEO> sarFileSplitMenuEOList = new java.util.ArrayList<>();
// 根目录
@@ -467,12 +509,12 @@ public class SynchronizationAsmsService {
sarFileSplitMenuEO.setId(id);
sarFileSplitMenuEO.setInfoId(infoId);
sarFileSplitMenuEO.setName(itemNum);
sarFileSplitMenuEO.setDisplaySeq(sortMap.get(itemNum));
sarFileSplitMenuEO.setDisplaySeq(sortMap.get(itemNum.replaceAll(regex, "")));
sarFileSplitMenuEO.setValidFlag(0);
String itemTitle = lawsDocumentSplit.getItemTitle();
sarFileSplitMenuEO.setItemName(itemTitle.substring(0, Math.min(10, itemTitle.length())));
sarFileSplitMenuEOList.add(sarFileSplitMenuEO);
idMap.put(itemNum, id);
idMap.put(itemNum.replaceAll(regex, ""), id);
lawsDocumentSplit.setMenuId(id);
lawsDocumentSplitMapper.updateById(lawsDocumentSplit);
@@ -480,7 +522,276 @@ public class SynchronizationAsmsService {
// 设置父id
sarFileSplitMenuEOList.forEach(sarFileSplitMenuEO -> {
String itemNum = sarFileSplitMenuEO.getName();
String itemNum = sarFileSplitMenuEO.getName().replaceAll(regex, "");
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);
}
});
if (!sarFileSplitMenuEOList.isEmpty()) {
sarFileSplitMenuEOMapper.insertForeach(sarFileSplitMenuEOList);
}
});
long time3 = System.currentTimeMillis();
log.info("=====================生成拆分详情左侧目录耗时:{}毫秒=====================", time3 - time2);
insertSplitList.forEach(sarFileSplitInfoEO -> {
String infoId = sarFileSplitInfoEO.getId();
List<LawsDocumentSplit> lawsDocumentSplitList = infoMap.get(infoId);
lawsDocumentSplitList.forEach(lawsDocumentSplit -> {
String itemContent = lawsDocumentSplit.getItemContent();
// 使用 jsoup 解析 HTML
Document doc = Jsoup.parse(itemContent);
// 选择所有的 <p> 元素
Elements paragraphs = doc.select("p");
// 存储提取的文本内容
List<String> textContents = new java.util.ArrayList<>();
for (Element paragraph : paragraphs) {
// 获取每个 <p> 元素的文本内容并添加到集合中
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);
}
});
});
for (SarFileSplitInfoEO sarFileSplitInfoEO : insertSplitList) {
HashMap<String, Object> parameter = new HashMap<>();
parameter.put("id", sarFileSplitInfoEO.getId());
documentSplitService.publish(parameter);
}
long time4 = System.currentTimeMillis();
log.info("=====================生成条文详情耗时:{}毫秒=====================", time4 - time3);
long end = System.currentTimeMillis();
log.info("=====================全部同步完成,耗时:{} 毫秒=====================", end - start);
log.info("=====================定时任务同步结束=====================");
}
public void syncSplitByStandardNumber(String standardNumber) {
log.info("=====================定时同步文档拆分=====================");
long start = System.currentTimeMillis();
// 文档拆分
String url = "xiaobodata/openApi/article/search";
Map<String, String> paramMap = new HashMap<>();
paramMap.put("pageNo", "1");
paramMap.put("pageSize", "2");
Map<String, Object> totalMap = asmsPostUtil.sendGetReq2(url, paramMap);
Integer total = (Integer) totalMap.get("total");
paramMap.put("pageSize", total.toString());
List<Map<String, String>> mapList = asmsPostUtil.sendGetReq(url, paramMap);
if (Objects.isNull(mapList)) {
log.info("=====================没有获取到ASMS系统数据,同步结束=====================");
return;
}
List<SarFileSplitInfoEO> insertSplitList = new ArrayList<>();
mapList.forEach(eMap -> {
String code = eMap.get("code").trim();
String name = eMap.get("name");
if (!code.contains(standardNumber)) {
return;
}
LambdaQueryWrapper<LawsDomesticStandard> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(LawsDomesticStandard::getStandardNumber, code);
LawsDomesticStandard lawsDomesticStandard = lawsDomesticStandardService.getOne(queryWrapper);
if (Objects.isNull(lawsDomesticStandard)) {
return;
}
LambdaQueryWrapper<OSSFile> 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.setAuthor("云平台");
sarFileSplitInfoEO.setSplitResult("成功");
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";
List<SysDictItem> sysDictItemList = sysDictItemService.list();
Map<String, String> paramMap1 = new HashMap<>();
Map<String, String> paramMap2 = new HashMap<>();
Map<String, String> paramMap3 = new HashMap<>();
Map<String, List<LawsDocumentSplit>> infoMap = new HashMap<>();
int[] n = {0};
for (SarFileSplitInfoEO sarFileSplitInfoEO : insertSplitList) {
paramMap.put("standardCode", sarFileSplitInfoEO.getSerialNumber());
paramMap1.put("standardCode", sarFileSplitInfoEO.getSerialNumber());
List<Map<String, String>> mapListAll = asmsPostUtil.sendGetReq(splitUrl, paramMap1);
List<LawsDocumentSplit> insertDocumentList = new ArrayList<>();
for (Map<String, String> eMap : mapListAll) {
// 单个法规的条文解读详情
paramMap2.put("standardCode", sarFileSplitInfoEO.getSerialNumber());
paramMap2.put("termsCode", eMap.get("termsNum"));
Map<String, Object> objectMap = asmsPostUtil.sendGetReq2("xiaobodata/openApi/article/interpretation/details", paramMap2);
// 单个法规的条文标签详情
paramMap3.put("standardCode", sarFileSplitInfoEO.getSerialNumber());
paramMap3.put("termsCode", eMap.get("termsNum"));
Map<String, Object> 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"));
String articleContent = eMap.get("articleContent");
String disposeImg = articleContent;
try {
// 处理图片
disposeImg = lawsAsmsOpenApiService.disposeImg(articleContent);
}catch (Exception e){
log.error(e.getMessage());
log.error("图片处理失败!");
}
lawsDocumentSplit.setItemContent(disposeImg);
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.setFunctionGroupCode((String) objectMap2.get("groupingNum"));
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());
if (StringUtils.isNotBlank(lawsDocumentSplit.getLawsRequireType())) {
lawsDocumentSplit.setLawsRequireType(getItemValues(lawsDocumentSplit.getLawsRequireType().replace(",", ";"),
"1702212236079886338", sysDictItemList)); // 法规要求类型
}
if (StringUtils.isNotBlank(lawsDocumentSplit.getFunctionClassification())) {
lawsDocumentSplit.setFunctionClassification(getItemValues(lawsDocumentSplit.getFunctionClassification().replace(",", ";"),
"1702212237296234497", sysDictItemList)); // 功能分类
}
if (StringUtils.isNotBlank(lawsDocumentSplit.getFunctionProfessional())) {
lawsDocumentSplit.setFunctionProfessional(getItemValues(lawsDocumentSplit.getFunctionProfessional().replace(",", ";"),
"1702202280677044226", sysDictItemList)); // 功能专业
}
if (StringUtils.isNotBlank(lawsDocumentSplit.getApplications())) {
lawsDocumentSplit.setApplications(getItemValues(lawsDocumentSplit.getApplications().replace(",", ";"),
"1702518672924110850", sysDictItemList)); // 适用车型
}
if (StringUtils.isNotBlank(lawsDocumentSplit.getDynamicType())) {
lawsDocumentSplit.setDynamicType(getItemValues(lawsDocumentSplit.getDynamicType().replace(",", ";"),
"1702518671166697474", sysDictItemList)); // 动力类型
}
insertDocumentList.add(lawsDocumentSplit);
lawsDocumentSplitMapper.insert(lawsDocumentSplit);
n[0]++;
}
;
infoMap.put(sarFileSplitInfoEO.getId(), insertDocumentList);
}
;
long time2 = System.currentTimeMillis();
log.info("=====================同步DocumentSplit条文数据:{}条,耗时:{}毫秒=====================", n[0], time2 - time1);
String regex = "[^a-zA-Z0-9.]";
insertSplitList.forEach(sarFileSplitInfoEO -> {
String infoId = sarFileSplitInfoEO.getId();
List<LawsDocumentSplit> lawsDocumentSplitList = infoMap.get(infoId);
List<String> itemNumList = new ArrayList<>();
for (LawsDocumentSplit lawsDocumentSplit : lawsDocumentSplitList) {
String itemNum = lawsDocumentSplit.getItemNum();
itemNumList.add(itemNum.replaceAll(regex, ""));
}
// 对目录排序
Collections.sort(itemNumList, new AlphanumericComparator());
Map<String, Long> sortMap = new HashMap<>();
for (int i = 0; i < itemNumList.size(); i++) {
sortMap.put(itemNumList.get(i), i + 2L);
}
List<SarFileSplitMenuEO> 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<String, String> 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.replaceAll(regex, "")));
sarFileSplitMenuEO.setValidFlag(0);
String itemTitle = lawsDocumentSplit.getItemTitle();
sarFileSplitMenuEO.setItemName(itemTitle.substring(0, Math.min(10, itemTitle.length())));
sarFileSplitMenuEOList.add(sarFileSplitMenuEO);
idMap.put(itemNum.replaceAll(regex, ""), id);
lawsDocumentSplit.setMenuId(id);
lawsDocumentSplitMapper.updateById(lawsDocumentSplit);
});
// 设置父id
sarFileSplitMenuEOList.forEach(sarFileSplitMenuEO -> {
String itemNum = sarFileSplitMenuEO.getName().replaceAll(regex, "");
String[] split = itemNum.split("\\.");
if (split.length == 1) {
sarFileSplitMenuEO.setPId(rootId);
@@ -525,7 +836,7 @@ public class SynchronizationAsmsService {
sarFileSplitItemsValEO.setType("TEXT");
sarFileSplitItemsValEO.setItemId(lawsDocumentSplit.getId());
sarFileSplitItemsValEO.setItemContent(textContents.get(i));
sarFileSplitItemsValEO.setDisplaySeq(i+1);
sarFileSplitItemsValEO.setDisplaySeq(i + 1);
sarFileSplitItemsValEO.setValidFlag(0);
sarFileSplitItemsValEOService.insertSelective(sarFileSplitItemsValEO);
}
@@ -643,5 +954,4 @@ public class SynchronizationAsmsService {
return StringUtils.join(itemValues, ",");
}
}
@@ -36,6 +36,11 @@ public class AsmsPostUtil {
private String host;
@Value("${asms.username}")
private String username;
public String getHost() {
return host;
}
@Value("${asms.password}")
private String password;
@Value("${asms.expire}")