MergePersonService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. package cn.cslg.pas.service.business;
  2. import cn.cslg.pas.common.dto.GetAllPersonDTO;
  3. import cn.cslg.pas.common.dto.MergePersonQueryDTO;
  4. import cn.cslg.pas.common.dto.PatentColumnDTO;
  5. import cn.cslg.pas.common.dto.patentCount.GetEsAllPersonDTO;
  6. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  7. import cn.cslg.pas.common.model.cronModel.Records;
  8. import cn.cslg.pas.common.utils.CacheUtils;
  9. import cn.cslg.pas.common.utils.LoginUtils;
  10. import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
  11. import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
  12. import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
  13. import cn.cslg.pas.common.vo.business.GetAllPersonVO;
  14. import cn.cslg.pas.common.vo.business.MergePersonIdVO;
  15. import cn.cslg.pas.common.vo.business.MergePersonQueryVO;
  16. import cn.cslg.pas.common.vo.business.MergePersonVO;
  17. import cn.cslg.pas.domain.BaseEntity;
  18. import cn.cslg.pas.domain.business.FollowUp;
  19. import cn.cslg.pas.domain.business.MergePerson;
  20. import cn.cslg.pas.domain.es.Patent;
  21. import cn.cslg.pas.domain.es.PatentMergePerson;
  22. import cn.cslg.pas.domain.es.PersonAddress;
  23. import cn.cslg.pas.exception.UnLoginException;
  24. import cn.cslg.pas.mapper.MergePersonMapper;
  25. import cn.cslg.pas.service.business.es.EsPatentService;
  26. import cn.cslg.pas.service.business.es.EsService;
  27. import cn.cslg.pas.service.query.FormatQueryService;
  28. import cn.hutool.core.util.ObjectUtil;
  29. import cn.hutool.core.util.PageUtil;
  30. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  31. import co.elastic.clients.elasticsearch._types.aggregations.Aggregation;
  32. import co.elastic.clients.elasticsearch._types.aggregations.AggregationBuilders;
  33. import co.elastic.clients.elasticsearch._types.aggregations.NestedAggregation;
  34. import co.elastic.clients.elasticsearch._types.aggregations.TermsAggregation;
  35. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  36. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  37. import co.elastic.clients.elasticsearch.core.SearchRequest;
  38. import co.elastic.clients.elasticsearch.core.SearchResponse;
  39. import co.elastic.clients.elasticsearch.core.search.Hit;
  40. import com.alibaba.fastjson.JSONArray;
  41. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  42. import com.baomidou.mybatisplus.core.metadata.IPage;
  43. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  44. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  45. import com.github.pagehelper.PageHelper;
  46. import com.google.gson.JsonArray;
  47. import lombok.extern.slf4j.Slf4j;
  48. import org.apache.commons.lang3.StringUtils;
  49. import org.springframework.beans.BeanUtils;
  50. import org.springframework.beans.factory.annotation.Autowired;
  51. import org.springframework.stereotype.Service;
  52. import org.springframework.transaction.annotation.Propagation;
  53. import org.springframework.transaction.annotation.Transactional;
  54. import org.springframework.util.CollectionUtils;
  55. import java.io.IOException;
  56. import java.util.*;
  57. import java.util.stream.Collectors;
  58. /**
  59. * @Author xiexiang
  60. * @Date 2024/01/02
  61. */
  62. @Slf4j
  63. @Service
  64. public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePerson> {
  65. @Autowired
  66. private ElasticsearchClient client;
  67. @Autowired
  68. private CacheUtils cacheUtils;
  69. @Autowired
  70. private LoginUtils loginUtils;
  71. @Autowired
  72. private MergePersonMapper mergePersonMapper;
  73. @Autowired
  74. private FormatQueryService formatQueryService;
  75. @Autowired
  76. private EsPatentService esPatentService;
  77. @Autowired
  78. private EsService esService;
  79. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  80. public Integer mergePerson(MergePersonVO vo) throws IOException {
  81. Integer type = vo.getType();
  82. List<String> mergedNames = vo.getMergedName();
  83. //获取登陆人信息 用于设置创建人
  84. PersonnelVO personnelVO = new PersonnelVO();
  85. try {
  86. personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  87. } catch (Exception e) {
  88. throw new UnLoginException("未登录");
  89. }
  90. MergePerson person = new MergePerson();
  91. BeanUtils.copyProperties(vo, person);
  92. person.setCreateId(personnelVO.getId());
  93. person.setCreateTime(new Date());
  94. person.insert();
  95. //todo 关联相关专利
  96. SearchRequest.Builder builder = new SearchRequest.Builder();
  97. //设置查询索引
  98. builder.index("patent");
  99. List<Query> queries = new ArrayList<>();
  100. if (type == 0) {
  101. for (String mergedName : mergedNames) {
  102. Query q = QueryBuilders.term(i -> i.field("applicant.name").value(mergedName));
  103. Query query = QueryBuilders.nested(i -> i.path("applicant").query(q));
  104. queries.add(query);
  105. }
  106. } else {
  107. for (String mergedName : mergedNames) {
  108. Query q = QueryBuilders.term(i -> i.field("inventor.name").value(mergedName));
  109. Query query = QueryBuilders.nested(i -> i.path("inventor").query(q));
  110. queries.add(query);
  111. }
  112. }
  113. Query query = QueryBuilders.bool(i -> i.should(queries));
  114. builder.query(query);
  115. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  116. List<Hit<Patent>> hits = response.hits().hits();
  117. List<String> ids = new ArrayList<>();
  118. Map<String, Patent> map = new HashMap<>();
  119. for (Hit<Patent> hit : hits) {
  120. String id = hit.id();
  121. map.put(id, hit.source());
  122. }
  123. if (!CollectionUtils.isEmpty(ids)) {
  124. List<PatentMergePerson> mergePersonList = new ArrayList<>();
  125. PatentMergePerson mergePerson = new PatentMergePerson();
  126. mergePerson.setName(vo.getName());
  127. mergePerson.setProjectId(vo.getProjectId().toString());
  128. mergePerson.setType("1");
  129. mergePerson.setOrder(1);
  130. mergePersonList.add(mergePerson);
  131. for (String id : map.keySet()) {
  132. Patent patent = map.get(id);
  133. List<PatentMergePerson> mergeApplicant = patent.getMergeApplicant();
  134. patent.setMergeApplicant(mergePersonList);
  135. patent.setMergeRightHolder(mergePersonList);
  136. esService.updateMergePerson(patent, id);
  137. }
  138. }
  139. return person.getId();
  140. }
  141. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  142. public Integer updateMergePerson(MergePersonVO vo) {
  143. //获取登陆人信息 用于设置创建人
  144. PersonnelVO personnelVO = new PersonnelVO();
  145. try {
  146. personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  147. } catch (Exception e) {
  148. throw new UnLoginException("未登录");
  149. }
  150. MergePerson person = this.getById(vo.getId());
  151. if (ObjectUtil.isNotEmpty(person)) {
  152. BeanUtils.copyProperties(vo, person);
  153. person.setCreateId(personnelVO.getId());
  154. person.setCreateTime(new Date());
  155. person.updateById();
  156. //todo 关联相关专利
  157. } else {
  158. person = new MergePerson();
  159. }
  160. return person.getId();
  161. }
  162. public Records selectMergePersonList(MergePersonQueryVO vo) {
  163. List<MergePersonQueryDTO> list = new ArrayList<>();
  164. IPage<MergePerson> page = new Page<>(vo.getPageNum(), vo.getPageSize());
  165. LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
  166. .eq(StringUtils.isNotEmpty(vo.getCountry()), MergePerson::getCountry, vo.getCountry())
  167. .like(StringUtils.isNotEmpty(vo.getName()), MergePerson::getName, vo.getName());
  168. IPage<MergePerson> record = mergePersonMapper.selectPage(page, wrapper);
  169. for (MergePerson person : record.getRecords()) {
  170. MergePersonQueryDTO dto = new MergePersonQueryDTO();
  171. dto.setId(person.getId());
  172. dto.setName(person.getName());
  173. dto.setAddress(person.getAddress());
  174. dto.setCountry(person.getCountry());
  175. dto.setRemark(person.getRemark());
  176. dto.setCreateTime(person.getCreateTime());
  177. list.add(dto);
  178. }
  179. Records records = new Records();
  180. records.setCurrent(record.getCurrent());
  181. records.setSize(record.getSize());
  182. records.setData(list);
  183. records.setTotal(record.getTotal());
  184. return records;
  185. }
  186. public Records getMergePerson(GetAllPersonVO vo) throws Exception {
  187. String searchCondition = "";
  188. Integer projectId = vo.getProjectId();
  189. Integer taskId = vo.getTaskId();
  190. Integer pageNum = vo.getPageNum();
  191. Integer pageSize = vo.getPageSize();
  192. if (taskId != null) {
  193. searchCondition = "taskId = " + taskId;
  194. } else {
  195. if (projectId != null) {
  196. searchCondition = "projectId = " + projectId;
  197. }
  198. }
  199. SearchRequest.Builder builder = new SearchRequest.Builder();
  200. //设置查询索引
  201. builder.index("patent");
  202. //1. 解析检索条件
  203. treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
  204. //格式化检索式
  205. //3. 从es中检索数据
  206. Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent");
  207. //分页
  208. if (pageNum > 0 && pageSize > 0) {
  209. builder.from((pageNum - 1) * pageSize).size(pageSize);
  210. }
  211. builder.query(q);
  212. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  213. List<Hit<Patent>> hits = response.hits().hits();
  214. long total = response.hits().total().value();
  215. List<GetEsAllPersonDTO> personDTOS = new ArrayList<>();
  216. for (Hit<Patent> hit : hits) {
  217. Patent esMess = hit.source();
  218. PersonAddress applicantAddr = null;
  219. GetEsAllPersonDTO personDTO = new GetEsAllPersonDTO();
  220. if (ObjectUtil.isNotEmpty(esMess.getApplicantAddr())) {
  221. applicantAddr = esMess.getApplicantAddr();
  222. personDTO.setAddress(applicantAddr.getAddress());
  223. personDTO.setCountry(applicantAddr.getCountry());
  224. }
  225. personDTO.setApplicant(esPatentService.loadName(esMess.getApplicant()));
  226. personDTO.setRightHolder(esPatentService.loadName(esMess.getRightHolder()));
  227. personDTO.setInventor(esPatentService.loadName(esMess.getInventor()));
  228. personDTOS.add(personDTO);
  229. }
  230. List<String> applicants = new ArrayList<>();
  231. List<String> inventors = new ArrayList<>();
  232. for (GetEsAllPersonDTO personDTO : personDTOS) {
  233. applicants.addAll(personDTO.getApplicant());
  234. inventors.addAll(personDTO.getInventor());
  235. }
  236. List<String> applicantList = applicants.stream().distinct().collect(Collectors.toList());
  237. List<String> inventorList = inventors.stream().distinct().collect(Collectors.toList());
  238. IPage<MergePerson> page = new Page<>(vo.getPageNum(), vo.getPageSize());
  239. LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
  240. .eq(StringUtils.isNotEmpty(vo.getProjectId().toString()), MergePerson::getProjectId, vo.getProjectId());
  241. IPage<MergePerson> record = mergePersonMapper.selectPage(page, wrapper);
  242. List<String> applicantMergeList = new ArrayList<>();
  243. List<String> inventorMergeList = new ArrayList<>();
  244. for (MergePerson person : record.getRecords()) {
  245. if (person.getType() == 0) {
  246. applicantMergeList = JSONArray.parseArray(person.getMergedName(), String.class);
  247. } else if (person.getType() == 2) {
  248. inventorMergeList = JSONArray.parseArray(person.getMergedName(), String.class);
  249. }
  250. }
  251. applicantList.removeAll(applicantMergeList);
  252. inventorList.removeAll(inventorMergeList);
  253. List<GetAllPersonDTO> applicantDTOS = new ArrayList<>();
  254. List<GetAllPersonDTO> inventorDTOS = new ArrayList<>();
  255. for (String applicant : applicantList) {
  256. GetAllPersonDTO dto = new GetAllPersonDTO();
  257. dto.setName(applicant);
  258. dto.setType(0);
  259. applicantDTOS.add(dto);
  260. }
  261. for (String inventor : inventorList) {
  262. GetAllPersonDTO dto = new GetAllPersonDTO();
  263. dto.setName(inventor);
  264. dto.setType(2);
  265. inventorDTOS.add(dto);
  266. }
  267. Records records = new Records();
  268. records.setCurrent(vo.getPageNum().longValue());
  269. records.setSize(vo.getPageSize().longValue());
  270. if (vo.getType() == 0) {
  271. int size = applicantDTOS.size();
  272. records.setData(applicantDTOS.stream().limit(vo.getPageSize()).collect(Collectors.toList()));
  273. if (total >= size) {
  274. records.setTotal((long)size);
  275. } else {
  276. records.setTotal(total);
  277. }
  278. } else if (vo.getType() == 2) {
  279. int size = inventorDTOS.size();
  280. records.setData(inventorDTOS.stream().limit(vo.getPageSize()).collect(Collectors.toList()));
  281. if (total >= size) {
  282. records.setTotal((long)size);
  283. } else {
  284. records.setTotal(total);
  285. }
  286. }
  287. return records;
  288. }
  289. public Integer delMergePerson(MergePersonIdVO vo) {
  290. LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
  291. .eq(BaseEntity::getId, vo.getId());
  292. this.remove(wrapper);
  293. //todo 删掉相关合并的名称
  294. return vo.getId();
  295. }
  296. }