MergePersonService.java 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176
  1. package cn.cslg.pas.service.business;
  2. import cn.cslg.pas.common.dto.GetAllCountryDTO;
  3. import cn.cslg.pas.common.dto.GetAllPersonDTO;
  4. import cn.cslg.pas.common.dto.MergePersonQueryDTO;
  5. import cn.cslg.pas.common.dto.PatentColumnDTO;
  6. import cn.cslg.pas.common.dto.es.EsMergePersonDTO;
  7. import cn.cslg.pas.common.dto.patentCount.GetEsAllPersonDTO;
  8. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  9. import cn.cslg.pas.common.model.cronModel.Records;
  10. import cn.cslg.pas.common.utils.CacheUtils;
  11. import cn.cslg.pas.common.utils.LoginUtils;
  12. import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
  13. import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
  14. import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
  15. import cn.cslg.pas.common.vo.business.*;
  16. import cn.cslg.pas.domain.BaseEntity;
  17. import cn.cslg.pas.domain.business.FollowUp;
  18. import cn.cslg.pas.domain.business.MergePerson;
  19. import cn.cslg.pas.domain.business.SystemDict;
  20. import cn.cslg.pas.domain.es.*;
  21. import cn.cslg.pas.exception.UnLoginException;
  22. import cn.cslg.pas.exception.XiaoShiException;
  23. import cn.cslg.pas.mapper.MergePersonMapper;
  24. import cn.cslg.pas.mapper.SystemDictMapper;
  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.FieldValue;
  32. import co.elastic.clients.elasticsearch._types.InlineScript;
  33. import co.elastic.clients.elasticsearch._types.Refresh;
  34. import co.elastic.clients.elasticsearch._types.Script;
  35. import co.elastic.clients.elasticsearch._types.aggregations.*;
  36. import co.elastic.clients.elasticsearch._types.query_dsl.IdsQuery;
  37. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  38. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  39. import co.elastic.clients.elasticsearch.core.*;
  40. import co.elastic.clients.elasticsearch.core.search.Hit;
  41. import co.elastic.clients.elasticsearch.core.search.TrackHits;
  42. import co.elastic.clients.json.JsonData;
  43. import com.alibaba.fastjson.JSON;
  44. import com.alibaba.fastjson.JSONArray;
  45. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  46. import com.baomidou.mybatisplus.core.metadata.IPage;
  47. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  48. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  49. import com.github.pagehelper.PageHelper;
  50. import com.google.gson.JsonArray;
  51. import lombok.extern.slf4j.Slf4j;
  52. import org.apache.commons.lang3.ObjectUtils;
  53. import org.apache.commons.lang3.StringUtils;
  54. import org.springframework.beans.BeanUtils;
  55. import org.springframework.beans.factory.annotation.Autowired;
  56. import org.springframework.stereotype.Service;
  57. import org.springframework.transaction.annotation.Propagation;
  58. import org.springframework.transaction.annotation.Transactional;
  59. import org.springframework.util.CollectionUtils;
  60. import java.io.IOException;
  61. import java.util.*;
  62. import java.util.function.BiConsumer;
  63. import java.util.regex.Matcher;
  64. import java.util.regex.Pattern;
  65. import java.util.stream.Collectors;
  66. /**
  67. * @Author xiexiang
  68. * @Date 2024/01/02
  69. */
  70. @Slf4j
  71. @Service
  72. public class MergePersonService extends ServiceImpl<MergePersonMapper, MergePerson> {
  73. @Autowired
  74. private ElasticsearchClient client;
  75. @Autowired
  76. private CacheUtils cacheUtils;
  77. @Autowired
  78. private LoginUtils loginUtils;
  79. @Autowired
  80. private MergePersonMapper mergePersonMapper;
  81. @Autowired
  82. private FormatQueryService formatQueryService;
  83. @Autowired
  84. private SystemDictMapper systemDictMapper;
  85. /**
  86. * 专利列表上新增或编辑发明人/权利人/申请人合并共享接口
  87. * @param commonVO
  88. * @return
  89. * @throws Exception
  90. */
  91. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  92. public Integer commonMerge(MergePersonCommonVO commonVO) throws Exception {
  93. Integer mergeId = null;
  94. if (commonVO.getId() != null) {
  95. MergePerson person = mergePersonMapper.selectById(commonVO.getId());
  96. List<String> names = JSON.parseArray(person.getMergedName(), String.class);
  97. String delDiffName = "";
  98. if (!commonVO.getName().equals(person.getName())) {
  99. names.add(person.getName());
  100. delDiffName = person.getName();
  101. }
  102. loadMerging(commonVO, names, person,delDiffName);
  103. } else {
  104. loadMerging(commonVO, new ArrayList<>(), null, null);
  105. }
  106. return mergeId;
  107. }
  108. /**
  109. * 封装合并
  110. * @param commonVO
  111. * @param names
  112. * @param person
  113. * @param delDiffName
  114. * @return
  115. * @throws Exception
  116. */
  117. public Integer loadMerging(MergePersonCommonVO commonVO, List<String> names, MergePerson person,String delDiffName) throws Exception {
  118. Integer mergeId = null;
  119. Integer projectId = commonVO.getProjectId();
  120. Integer type = commonVO.getType();
  121. List<GetAllPersonDTO> mergePersonDTOS = commonVO.getMergePersonDTOS();
  122. List<GetAllPersonDTO> delMergePersonDTOS = commonVO.getDelMergePersonDTOS();
  123. if (!CollectionUtils.isEmpty(mergePersonDTOS)) {
  124. List<Integer> mergeIds = mergePersonDTOS.stream().map(GetAllPersonDTO::getMergeId).filter(Objects::nonNull).collect(Collectors.toList());
  125. if (!CollectionUtils.isEmpty(mergeIds)) {
  126. List<MergePerson> personList = mergePersonMapper.selectBatchIds(mergeIds);
  127. for (MergePerson mergePerson : personList) {
  128. List<String> getNames = JSON.parseArray(mergePerson.getMergedName(), String.class);
  129. names.addAll(getNames);
  130. String personName = mergePerson.getName();
  131. loadNewChild(type, projectId, personName,false);
  132. }
  133. mergePersonMapper.deleteBatchIds(mergeIds);
  134. }
  135. List<String> mergeNameList = mergePersonDTOS.stream().filter(i -> i.getMergeId() == null).map(GetAllPersonDTO::getName).collect(Collectors.toList());
  136. if (!CollectionUtils.isEmpty(mergeNameList)) {
  137. names.addAll(mergeNameList);
  138. }
  139. }
  140. if (!CollectionUtils.isEmpty(delMergePersonDTOS)) {
  141. List<String> delNames = delMergePersonDTOS.stream().map(GetAllPersonDTO::getName).collect(Collectors.toList());
  142. names.removeAll(delNames);
  143. loadNewChild(type, projectId, person.getName(),true);
  144. }
  145. if (commonVO.getId() != null) {
  146. mergePersonMapper.deleteById(commonVO.getId());
  147. }
  148. if (!CollectionUtils.isEmpty(names)) {
  149. List<String> collect = names.stream().distinct().collect(Collectors.toList());
  150. if (!CollectionUtils.isEmpty(collect)) {
  151. mergeId = merge(commonVO, collect,delDiffName);
  152. }
  153. }
  154. return mergeId;
  155. }
  156. /**
  157. * 封装子文档
  158. * @param type
  159. * @param projectId
  160. * @param personName
  161. * @param flag
  162. * @throws Exception
  163. */
  164. private void loadNewChild(Integer type, Integer projectId, String personName,boolean flag) throws Exception {
  165. List<Hit<Patent>> hits = searchChild(type, projectId, personName);
  166. List<String> patentIds = new ArrayList<>();
  167. List<PatentMergePerson> list = new ArrayList<>();
  168. for (Hit<Patent> hit : hits) {
  169. String routing = hit.routing();
  170. patentIds.add(routing);
  171. if (flag) {
  172. Patent patent = hit.source();
  173. if (type == 0) {
  174. if (!CollectionUtils.isEmpty(patent.getMergeApplicant())) {
  175. List<PatentMergePerson> applicant = patent.getMergeApplicant();
  176. List<PatentMergePerson> collect = applicant.stream().filter(i -> i.getIfMerged().equals(Boolean.TRUE)).collect(Collectors.toList());
  177. list.addAll(collect);
  178. }
  179. if (!CollectionUtils.isEmpty(patent.getMergeRightHolder())) {
  180. List<PatentMergePerson> rights = patent.getMergeRightHolder();
  181. List<PatentMergePerson> collect = rights.stream().filter(i -> i.getIfMerged().equals(Boolean.TRUE)).collect(Collectors.toList());
  182. list.addAll(collect);
  183. }
  184. } else {
  185. if (!CollectionUtils.isEmpty(patent.getMergeInventor())) {
  186. List<PatentMergePerson> inventors = patent.getMergeInventor();
  187. List<PatentMergePerson> collect = inventors.stream().filter(i -> i.getIfMerged().equals(Boolean.TRUE)).collect(Collectors.toList());
  188. list.addAll(collect);
  189. }
  190. }
  191. }
  192. }
  193. //删除原子文档
  194. deleteChild(patentIds, type, projectId);
  195. //查询父文档拿出对应type的数据后添加新的子文档
  196. searchPatent(patentIds, type, projectId);
  197. if (flag) {
  198. List<String> collect = list.stream().map(PatentMergePerson::getName).distinct().filter(i -> !i.equals(personName)).collect(Collectors.toList());
  199. if (!CollectionUtils.isEmpty(collect)) {
  200. for (String key : collect) {
  201. LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
  202. .eq(MergePerson::getProjectId, projectId)
  203. .eq(MergePerson::getName, key)
  204. .eq(MergePerson::getType,type);
  205. MergePerson mergePerson = mergePersonMapper.selectOne(wrapper);
  206. String mergedName = mergePerson.getMergedName();
  207. List<String> mergedNames = JSONArray.parseArray(mergedName, String.class);
  208. againMerge(mergedNames,type,projectId,key);
  209. }
  210. }
  211. }
  212. }
  213. /**
  214. * 已存在的合并记录移除名称,不影响另一个合并记录
  215. * @param list
  216. * @param type
  217. * @param projectId
  218. * @param name
  219. * @throws Exception
  220. */
  221. private void againMerge(List<String> list, Integer type, Integer projectId, String name) throws Exception {
  222. List<Hit<Patent>> hits = searchChildDoc(list, type, projectId);
  223. //更新合并后的数据
  224. final int num = CollectionUtils.isEmpty(hits) ? 1 : hits.size();
  225. for (Hit<Patent> hit : hits) {
  226. String id = hit.id();
  227. Patent patent = hit.source();
  228. createPatent(patent, type, list, name, num);
  229. Integer count = updateChild(patent, id, hit.routing());
  230. if (count < 0) {
  231. throw new XiaoShiException("合并失败");
  232. }
  233. }
  234. }
  235. /**
  236. * 进行合并
  237. * @param commonVO
  238. * @param list
  239. * @param delDiffName
  240. * @return
  241. * @throws Exception
  242. */
  243. private Integer merge(MergePersonCommonVO commonVO, List<String> list, String delDiffName) throws Exception {
  244. Integer projectId = commonVO.getProjectId();
  245. Integer type = commonVO.getType();
  246. String name = commonVO.getName();
  247. //保存合并记录
  248. Integer mergeId = saveMerge(commonVO, list,delDiffName);
  249. //查询合并后的数据
  250. if (StringUtils.isNotEmpty(delDiffName)) {
  251. list.add(delDiffName);
  252. }
  253. List<Hit<Patent>> hits = searchChildDoc(list, type, projectId);
  254. //更新合并后的数据
  255. final int num = CollectionUtils.isEmpty(hits) ? 1 : hits.size();
  256. for (Hit<Patent> hit : hits) {
  257. String id = hit.id();
  258. Patent patent = hit.source();
  259. createPatent(patent, type, list, name, num);
  260. Integer count = updateChild(patent, id, hit.routing());
  261. if (count < 0) {
  262. throw new XiaoShiException("合并失败");
  263. }
  264. }
  265. return mergeId;
  266. }
  267. /**
  268. * 新增合并记录
  269. * @param vo
  270. * @param mergeNames
  271. * @param delDiffName
  272. * @return
  273. */
  274. private Integer saveMerge(MergePersonCommonVO vo, List<String> mergeNames, String delDiffName) {
  275. List<GetAllPersonDTO> mergePersonDTOS = vo.getMergePersonDTOS();
  276. List<String> names = new ArrayList<>();
  277. if (!CollectionUtils.isEmpty(mergeNames)) {
  278. names = mergeNames;
  279. } else {
  280. names = mergePersonDTOS.stream().map(GetAllPersonDTO::getName).collect(Collectors.toList());
  281. }
  282. if (StringUtils.isNotEmpty(delDiffName)) {
  283. names.remove(delDiffName);
  284. }
  285. //获取登陆人信息 用于设置创建人
  286. PersonnelVO personnelVO = new PersonnelVO();
  287. personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  288. //判断是否名称重复
  289. LambdaQueryWrapper<MergePerson> wrapper = new LambdaQueryWrapper<MergePerson>()
  290. .eq(MergePerson::getProjectId, vo.getProjectId())
  291. .eq(MergePerson::getType, vo.getType())
  292. .eq(MergePerson::getName, vo.getName());
  293. List<MergePerson> list = mergePersonMapper.selectList(wrapper);
  294. if (!list.isEmpty()) {
  295. throw new XiaoShiException("合并名称不可重复");
  296. }
  297. MergePerson person = new MergePerson();
  298. BeanUtils.copyProperties(vo, person);
  299. person.setMergedName(JSONArray.toJSONString(names));
  300. person.setCreateId(personnelVO.getId());
  301. person.setCreateTime(new Date());
  302. person.insert();
  303. return person.getId();
  304. }
  305. /**
  306. * 封装合并人的名称,被合并名称进行替换成合并名称
  307. * @param patent
  308. * @param type
  309. * @param mergedName
  310. * @param name
  311. * @param num
  312. */
  313. private void createPatent(Patent patent, Integer type, List<String> mergedName, String name, int num) {
  314. if (type == 0) {
  315. if (!CollectionUtils.isEmpty(patent.getMergeApplicant())) {
  316. List<PatentMergePerson> mergeApplicant = patent.getMergeApplicant();
  317. for (PatentMergePerson applicant : mergeApplicant) {
  318. if (mergedName.contains(applicant.getName().toUpperCase(Locale.ROOT))) {
  319. applicant.setName(name);
  320. applicant.setIfMerged(true);
  321. applicant.setMergedNum(num);
  322. }
  323. }
  324. List<PatentMergePerson> applicantList = new ArrayList<>();
  325. Map<String, List<PatentMergePerson>> map = mergeApplicant.stream().filter(i -> StringUtils.isNotEmpty(i.getName())).collect(Collectors.groupingBy(PatentMergePerson::getName));
  326. for (String key : map.keySet()) {
  327. applicantList.add(map.get(key).get(0));
  328. }
  329. patent.setMergeApplicant(applicantList);
  330. }
  331. if (!CollectionUtils.isEmpty(patent.getMergeRightHolder())) {
  332. List<PatentMergePerson> mergeRightHolder = patent.getMergeRightHolder();
  333. for (PatentMergePerson right : mergeRightHolder) {
  334. if (mergedName.contains(right.getName().toUpperCase(Locale.ROOT))) {
  335. right.setName(name);
  336. right.setIfMerged(true);
  337. right.setMergedNum(num);
  338. }
  339. }
  340. List<PatentMergePerson> rightList = new ArrayList<>();
  341. Map<String, List<PatentMergePerson>> map = mergeRightHolder.stream().filter(i -> StringUtils.isNotEmpty(i.getName())).collect(Collectors.groupingBy(PatentMergePerson::getName));
  342. for (String key : map.keySet()) {
  343. rightList.add(map.get(key).get(0));
  344. }
  345. patent.setMergeRightHolder(rightList);
  346. }
  347. } else {
  348. if (!CollectionUtils.isEmpty(patent.getMergeInventor())) {
  349. List<PatentMergePerson> mergeInventor = patent.getMergeInventor();
  350. for (PatentMergePerson inventor : mergeInventor) {
  351. if (mergedName.contains(inventor.getName().toUpperCase(Locale.ROOT))) {
  352. inventor.setName(name);
  353. inventor.setIfMerged(true);
  354. inventor.setMergedNum(num);
  355. }
  356. }
  357. List<PatentMergePerson> inventorList = new ArrayList<>();
  358. Map<String, List<PatentMergePerson>> map = mergeInventor.stream().filter(i -> StringUtils.isNotEmpty(i.getName())).collect(Collectors.groupingBy(PatentMergePerson::getName));
  359. for (String key : map.keySet()) {
  360. inventorList.add(map.get(key).get(0));
  361. }
  362. patent.setMergeInventor(inventorList);
  363. }
  364. }
  365. }
  366. /**
  367. * 根据多个已合并名称查询合并后的数据
  368. * @param mergedNames
  369. * @param type
  370. * @param projectId
  371. * @return
  372. * @throws IOException
  373. */
  374. private List<Hit<Patent>> searchChildDoc(List<String> mergedNames,Integer type,Integer projectId) throws IOException {
  375. SearchRequest.Builder builder = new SearchRequest.Builder();
  376. //设置查询索引
  377. builder.index("patent");
  378. List<Query> queries = new ArrayList<>();
  379. if (type == 0) {
  380. for (String mergedName : mergedNames) {
  381. //合并申请人
  382. Query idQ1 = QueryBuilders.term(i -> i.field("merge_applicant.project_id").value(projectId));
  383. Query q1 = QueryBuilders.term(i -> i.field("merge_applicant.name.raw").value(mergedName));
  384. Query bool = QueryBuilders.bool(i -> i.must(idQ1, q1));
  385. Query query1 = QueryBuilders.nested(i -> i.path("merge_applicant").query(bool));
  386. //合并权利人
  387. Query idQ2 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  388. Query q2 = QueryBuilders.term(i -> i.field("merge_right_holder.name.raw").value(mergedName));
  389. Query bool1 = QueryBuilders.bool(i -> i.must(idQ2, q2));
  390. Query query2 = QueryBuilders.nested(i -> i.path("merge_right_holder").query(bool1));
  391. queries.add(query1);
  392. queries.add(query2);
  393. }
  394. } else {
  395. for (String mergedName : mergedNames) {
  396. Query idQ = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  397. Query q = QueryBuilders.term(i -> i.field("merge_inventor.name.raw").value(mergedName));
  398. Query bool = QueryBuilders.bool(i -> i.must(idQ, q));
  399. Query query = QueryBuilders.nested(i -> i.path("merge_inventor").query(bool));
  400. queries.add(query);
  401. }
  402. }
  403. Query query = QueryBuilders.bool(i -> i.should(queries));
  404. builder.query(query);
  405. builder.size(1000);
  406. builder.trackTotalHits(TrackHits.of(i -> i.enabled(true)));
  407. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  408. return response.hits().hits();
  409. }
  410. /**
  411. * 根据已合并名称查询合并后的数据
  412. * @param type
  413. * @param projectId
  414. * @param mergedName
  415. * @return
  416. * @throws IOException
  417. */
  418. private List<Hit<Patent>> searchChild(Integer type, Integer projectId, String mergedName) throws IOException {
  419. SearchRequest.Builder builder = new SearchRequest.Builder();
  420. //设置查询索引
  421. builder.index("patent");
  422. List<Query> queries = new ArrayList<>();
  423. if (type == 0) {
  424. //合并申请人
  425. Query idQ1 = QueryBuilders.term(i -> i.field("merge_applicant.project_id").value(projectId));
  426. Query q1 = QueryBuilders.term(i -> i.field("merge_applicant.name.raw").value(mergedName));
  427. Query bool = QueryBuilders.bool(i -> i.must(idQ1, q1));
  428. Query query1 = QueryBuilders.nested(i -> i.path("merge_applicant").query(bool));
  429. //合并权利人
  430. Query idQ2 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  431. Query q2 = QueryBuilders.term(i -> i.field("merge_right_holder.name.raw").value(mergedName));
  432. Query bool1 = QueryBuilders.bool(i -> i.must(idQ2, q2));
  433. Query query2 = QueryBuilders.nested(i -> i.path("merge_right_holder").query(bool1));
  434. queries.add(query1);
  435. queries.add(query2);
  436. } else {
  437. Query idQ = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  438. Query q = QueryBuilders.term(i -> i.field("merge_inventor.name.raw").value(mergedName));
  439. Query bool = QueryBuilders.bool(i -> i.must(idQ, q));
  440. Query query = QueryBuilders.nested(i -> i.path("merge_inventor").query(bool));
  441. queries.add(query);
  442. }
  443. Query query = QueryBuilders.bool(i -> i.should(queries));
  444. builder.query(query);
  445. builder.size(1000);
  446. builder.trackTotalHits(TrackHits.of(i -> i.enabled(true)));
  447. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  448. return response.hits().hits();
  449. }
  450. /**
  451. * 合并人员详情
  452. *
  453. * @param vo
  454. * @return
  455. */
  456. public MergePersonQueryDTO selectMergePersonDetail(MergePersonIdVO vo) {
  457. MergePersonQueryDTO dto = new MergePersonQueryDTO();
  458. MergePerson person = mergePersonMapper.selectById(vo.getId());
  459. if (ObjectUtil.isNotEmpty(person)) {
  460. BeanUtils.copyProperties(person, dto);
  461. List<String> names = JSONArray.parseArray(person.getMergedName(), String.class);
  462. dto.setMergedName(names);
  463. }
  464. return dto;
  465. }
  466. /**
  467. * 获取所有发明人/权利人/申请人
  468. *
  469. * @param vo
  470. * @return
  471. * @throws Exception
  472. */
  473. public Records getAllMergePerson(GetAllPersonVO vo) throws Exception {
  474. Integer projectId = vo.getProjectId();
  475. Long pageNum = vo.getPageNum();
  476. Long pageSize = vo.getPageSize();
  477. Integer type = vo.getType();
  478. String condition = vo.getSearchQuery();
  479. //es获取的名称
  480. List<GetAllPersonDTO> personList = new ArrayList<>();
  481. SearchRequest.Builder builder = new SearchRequest.Builder();
  482. //设置查询索引
  483. builder.index("patent");
  484. String operate = "";
  485. if (StringUtils.isNotEmpty(condition)) {
  486. //1. 解析检索条件
  487. treeNode tree = expressManager.getInstance().Parse(condition, false);
  488. operateNode operateNode = (operateNode) tree;
  489. operate = operateNode.getoperate().getShowName();
  490. //3. 从es中检索数据
  491. Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent", projectId);
  492. builder.query(q);
  493. if (type == 0) {
  494. this.loadAppAndRightAgg(builder,pageNum.intValue(),pageSize.intValue());
  495. } else {
  496. this.loadInventorAgg(builder,pageNum.intValue(),pageSize.intValue());
  497. }
  498. } else {
  499. if (type == 0) {
  500. //申请人
  501. Query query = this.loadQueryByType(type, projectId);
  502. builder.query(query);
  503. this.loadAppAndRightAgg(builder,pageNum.intValue(),pageSize.intValue());
  504. } else {
  505. Query query = this.loadQueryByType(type, projectId);
  506. builder.query(query);
  507. this.loadInventorAgg(builder,pageNum.intValue(),pageSize.intValue());
  508. }
  509. }
  510. builder.trackTotalHits(i -> i.enabled(true));
  511. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  512. Aggregate totalAgg = response.aggregations().get("totalAgg");
  513. Aggregate totalAggregate = totalAgg.nested().aggregations().get("statsBucket");
  514. long total = totalAggregate.statsBucket().count();
  515. Aggregate totalAgg1 = null;
  516. if (type == 0) {
  517. totalAgg1 = response.aggregations().get("totalAgg1");
  518. Aggregate totalAggregate1 = totalAgg1.nested().aggregations().get("statsBucket1");
  519. long count = totalAggregate1.statsBucket().count();
  520. total = Math.max(total, count);
  521. }
  522. List<String> mergeList = new ArrayList<>();
  523. if (StringUtils.isNotEmpty(condition)) {
  524. Aggregate terms = totalAgg.nested().aggregations().get("terms");
  525. List<StringTermsBucket> termsBucketList = terms.sterms().buckets().array();
  526. Aggregate terms1 = null;
  527. if (type == 0) {
  528. terms1 = totalAgg1.nested().aggregations().get("terms1");
  529. List<StringTermsBucket> termsBucketList1 = terms1.sterms().buckets().array();
  530. termsBucketList.addAll(termsBucketList1);
  531. }
  532. if (condition.contains("AND") && operate.equals("AND")) {
  533. String[] parts = condition.split(" AND ");
  534. for (String part : parts) {
  535. List<String> expresses = getConditionExpress(part);
  536. List<String> merges = termsBucketList.stream().map(StringTermsBucket::key).map(FieldValue::stringValue).distinct()
  537. .filter(value -> expresses.stream().anyMatch(express -> value.contains(express.toUpperCase(Locale.ROOT))))
  538. .collect(Collectors.toList());
  539. total = total > merges.size() ? merges.size() : total;
  540. merges = merges.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
  541. if (CollectionUtils.isEmpty(mergeList)) {
  542. mergeList.addAll(merges);
  543. } else {
  544. merges.retainAll(mergeList);
  545. mergeList = new ArrayList<>(merges);
  546. total = total > mergeList.size() ? mergeList.size() : total;
  547. }
  548. }
  549. } else {
  550. List<String> expresses = getConditionExpress(condition);
  551. List<String> merges = termsBucketList.stream().map(StringTermsBucket::key).map(FieldValue::stringValue).distinct()
  552. .filter(value -> expresses.stream().anyMatch(express -> value.contains(express.toUpperCase(Locale.ROOT))))
  553. .collect(Collectors.toList());
  554. total = total > merges.size() ? merges.size() : total;
  555. merges = merges.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
  556. mergeList.addAll(merges);
  557. }
  558. } else {
  559. loadMergeList(type, response, mergeList);
  560. }
  561. List<String> nameList = mergeList.stream().distinct().collect(Collectors.toList());
  562. if (!CollectionUtils.isEmpty(nameList)) {
  563. personList = this.loadMergedDetail(nameList, projectId, type);
  564. }
  565. List<GetAllPersonDTO> collect = personList.stream().filter(i -> !StringUtils.isEmpty(i.getName())).collect(Collectors.toList());
  566. while (collect.size() > pageSize) {
  567. collect.remove(collect.size() - 1); // 从列表末尾开始删除
  568. }
  569. List<GetAllPersonDTO> list = collect.stream().sorted(Comparator.comparing(GetAllPersonDTO::getName)).collect(Collectors.toList());
  570. Records records = new Records();
  571. records.setCurrent(pageNum);
  572. records.setSize(pageSize);
  573. records.setData(list);
  574. records.setTotal(total);
  575. return records;
  576. }
  577. /**
  578. * 发明人/权利人/申请人合并记录删除
  579. *
  580. * @param vo
  581. * @return
  582. * @throws Exception
  583. */
  584. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  585. public Integer delMergePerson(MergePersonIdVO vo) throws Exception {
  586. Integer type = vo.getType();
  587. //1.查询合并记录
  588. MergePerson mergePerson = mergePersonMapper.selectById(vo.getId());
  589. //合并后的名称
  590. String name = mergePerson.getName();
  591. //专题库id
  592. Integer projectId = mergePerson.getProjectId();
  593. //2.查询合并后的数据
  594. List<Hit<Patent>> hits = searchChild(type, projectId, name);
  595. List<String> patentIds = new ArrayList<>();
  596. for (Hit<Patent> hit : hits) {
  597. String routing = hit.routing();
  598. patentIds.add(routing);
  599. }
  600. //3.删除原子文档
  601. deleteChild(patentIds, type, projectId);
  602. //4.查询父文档拿出对应type的数据后添加新的子文档
  603. searchPatent(patentIds, type, projectId);
  604. //5.删除合并记录
  605. mergePersonMapper.deleteById(vo.getId());
  606. return vo.getId();
  607. }
  608. public List<GetAllPersonDTO> loadMergedDetail(List<String> nameList, Integer projectId, Integer type) {
  609. List<GetAllPersonDTO> personList = new ArrayList<>();
  610. for (String name : nameList) {
  611. MergePerson person = mergePersonMapper.selectOne(new LambdaQueryWrapper<MergePerson>()
  612. .eq(MergePerson::getProjectId, projectId)
  613. .eq(MergePerson::getType, type)
  614. .eq(MergePerson::getName, name));
  615. if (!ObjectUtils.isEmpty(person)) {
  616. GetAllPersonDTO dto = new GetAllPersonDTO();
  617. dto.setName(name);
  618. dto.setMergeId(person.getId());
  619. dto.setProjectId(person.getProjectId());
  620. dto.setType(person.getType());
  621. dto.setRemark(person.getRemark());
  622. dto.setAbbreviation(person.getAbbreviation());
  623. dto.setCountry(person.getCountry());
  624. dto.setProvince(person.getProvince());
  625. dto.setAddress(person.getAddress());
  626. personList.add(dto);
  627. } else {
  628. GetAllPersonDTO dto = new GetAllPersonDTO();
  629. dto.setName(name);
  630. personList.add(dto);
  631. }
  632. }
  633. return personList;
  634. }
  635. public void loadMergeList(Integer type,SearchResponse<Patent> response,List<String> mergeList) {
  636. if (type == 0) {
  637. Aggregate agg = response.aggregations().get("Agg");
  638. Aggregate nestedAgg = agg.nested().aggregations().get("nestedAgg");
  639. List<StringTermsBucket> buckets = nestedAgg.sterms().buckets().array();
  640. Aggregate rightAgg = response.aggregations().get("rightAgg");
  641. Aggregate rightNestedAgg = rightAgg.nested().aggregations().get("rightNestedAgg");
  642. List<StringTermsBucket> bucketList = rightNestedAgg.sterms().buckets().array();
  643. if (buckets.size() >= bucketList.size()) {
  644. for (StringTermsBucket bucket : buckets) {
  645. String value = bucket.key().stringValue();
  646. mergeList.add(value);
  647. }
  648. for (StringTermsBucket bucket : bucketList) {
  649. String value = bucket.key().stringValue();
  650. mergeList.add(value);
  651. }
  652. } else {
  653. for (StringTermsBucket bucket : bucketList) {
  654. String value = bucket.key().stringValue();
  655. mergeList.add(value);
  656. }
  657. for (StringTermsBucket bucket : buckets) {
  658. String value = bucket.key().stringValue();
  659. mergeList.add(value);
  660. }
  661. }
  662. } else {
  663. Aggregate inventorAgg = response.aggregations().get("Agg");
  664. Aggregate inventorNestedAgg = inventorAgg.nested().aggregations().get("nestedAgg");
  665. List<StringTermsBucket> bucketList = inventorNestedAgg.sterms().buckets().array();
  666. if (!CollectionUtils.isEmpty(bucketList)) {
  667. for (StringTermsBucket bucket : bucketList) {
  668. String value = bucket.key().stringValue();
  669. mergeList.add(value);
  670. }
  671. }
  672. }
  673. }
  674. public Query loadQueryByType(Integer type,Integer projectId) {
  675. Map<Integer, Query> map = new HashMap<>();
  676. Query q1 = QueryBuilders.term(i -> i.field("merge_applicant.project_id").value(projectId));
  677. Query nestedQ1 = QueryBuilders.nested(i -> i.path("merge_applicant").query(q1));
  678. Query q2 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  679. Query nestedQ2 = QueryBuilders.nested(i -> i.path("merge_right_holder").query(q2));
  680. Query bool = QueryBuilders.bool(i -> i.should(nestedQ1, nestedQ2));
  681. map.put(0, bool);
  682. Query q = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  683. Query nestedQ = QueryBuilders.nested(i -> i.path("merge_inventor").query(q));
  684. map.put(2, nestedQ);
  685. return map.get(type);
  686. }
  687. public void loadAppAndRightAgg(SearchRequest.Builder builder, Integer pageNum, Integer pageSize) {
  688. Aggregation bucketSort = AggregationBuilders.bucketSort(i -> i.from((pageNum - 1) * pageSize).size(pageSize));
  689. Aggregation termAgg = new Aggregation.Builder().terms(i -> i.field("merge_applicant.name.raw").size(100000))
  690. .aggregations(new HashMap() {{
  691. put("termAgg", bucketSort);
  692. }}).build();
  693. Aggregation aggregation = new Aggregation.Builder().nested(new NestedAggregation.Builder().
  694. path("merge_applicant").build())
  695. .aggregations(new HashMap() {{
  696. put("nestedAgg", termAgg);
  697. }}).build();
  698. builder.aggregations("Agg", aggregation);
  699. //对聚合结果统计出总数
  700. Aggregation terms = AggregationBuilders.terms(i -> i.field("merge_applicant.name.raw").size(100000));
  701. BucketsPath bucketsPath = BucketsPath.of(i -> i.single("terms>_count"));
  702. Aggregation statsBucket = AggregationBuilders.statsBucket(i -> i.bucketsPath(bucketsPath));
  703. Aggregation totalAgg = new Aggregation.Builder().nested(new NestedAggregation.Builder().
  704. path("merge_applicant").build())
  705. .aggregations(new HashMap() {{
  706. put("terms", terms);
  707. put("statsBucket", statsBucket);
  708. }}).build();
  709. builder.aggregations("totalAgg", totalAgg);
  710. //权利人
  711. Aggregation bucketSort1 = AggregationBuilders.bucketSort(i -> i.from((pageNum - 1) * pageSize).size(pageSize));
  712. Aggregation termAgg1 = new Aggregation.Builder().terms(i -> i.field("merge_right_holder.name.raw").size(100000))
  713. .aggregations(new HashMap() {{
  714. put("rightTermAgg", bucketSort1);
  715. }}).build();
  716. Aggregation aggregation1 = new Aggregation.Builder().nested(new NestedAggregation.Builder().
  717. path("merge_right_holder").build())
  718. .aggregations(new HashMap() {{
  719. put("rightNestedAgg", termAgg1);
  720. }}).build();
  721. builder.aggregations("rightAgg", aggregation1);
  722. // //对聚合结果统计出总数
  723. Aggregation terms1 = AggregationBuilders.terms(i -> i.field("merge_right_holder.name.raw").size(100000));
  724. BucketsPath bucketsPath1 = BucketsPath.of(i -> i.single("terms1>_count"));
  725. Aggregation statsBucket1 = AggregationBuilders.statsBucket(i -> i.bucketsPath(bucketsPath1));
  726. Aggregation totalAgg1 = new Aggregation.Builder().nested(new NestedAggregation.Builder().
  727. path("merge_right_holder").build())
  728. .aggregations(new HashMap() {{
  729. put("terms1", terms1);
  730. put("statsBucket1", statsBucket1);
  731. }}).build();
  732. builder.aggregations("totalAgg1", totalAgg1);
  733. }
  734. public void loadInventorAgg(SearchRequest.Builder builder, Integer pageNum, Integer pageSize) {
  735. Aggregation bucketSort = AggregationBuilders.bucketSort(i -> i.from((pageNum - 1) * pageSize).size(pageSize));
  736. Aggregation termAgg = new Aggregation.Builder().terms(i -> i.field("merge_inventor.name.raw").size(100000))
  737. .aggregations(new HashMap() {{
  738. put("termAgg", bucketSort);
  739. }}).build();
  740. Aggregation aggregation = new Aggregation.Builder().nested(new NestedAggregation.Builder().
  741. path("merge_inventor").build())
  742. .aggregations(new HashMap() {{
  743. put("nestedAgg", termAgg);
  744. }}).build();
  745. builder.aggregations("Agg", aggregation);
  746. //对聚合结果统计出总数
  747. Aggregation terms = AggregationBuilders.terms(i -> i.field("merge_inventor.name.raw").size(100000));
  748. BucketsPath bucketsPath = BucketsPath.of(i -> i.single("terms>_count"));
  749. Aggregation statsBucket = AggregationBuilders.statsBucket(i -> i.bucketsPath(bucketsPath));
  750. Aggregation totalAgg = new Aggregation.Builder().nested(new NestedAggregation.Builder().
  751. path("merge_inventor").build())
  752. .aggregations(new HashMap() {{
  753. put("terms", terms);
  754. put("statsBucket", statsBucket);
  755. }}).build();
  756. builder.aggregations("totalAgg", totalAgg);
  757. }
  758. private List<String> getConditionExpress(String input) {
  759. // 编写正则表达式来匹配 = 后面的双括号内的内容
  760. String regex = "=\\(\\(([^)]*)\\)\\)";
  761. // 编译正则表达式
  762. Pattern pattern = Pattern.compile(regex);
  763. // 创建matcher对象
  764. Matcher matcher = pattern.matcher(input);
  765. // 使用List来存储结果,因为数组的大小是固定的
  766. List<String> values = new ArrayList<>();
  767. // 查找所有匹配项
  768. while (matcher.find()) {
  769. // 提取双括号中的内容
  770. String content = matcher.group(1);
  771. // 将提取的内容添加到列表中
  772. values.add(content);
  773. }
  774. List<String> list = new ArrayList<>();
  775. List<String> collect = values.stream().filter(cn.cslg.pas.common.utils.StringUtils::isNotEmpty).distinct().collect(Collectors.toList());
  776. for (String s : collect) {
  777. List<String> split = splitWithQuotes(s);
  778. list.addAll(split);
  779. }
  780. List<String> list1 = new ArrayList<>();
  781. for (String s : list) {
  782. if (s.contains("\"")) {
  783. String replace = s.replace("\"", "");
  784. list1.add(replace);
  785. } else {
  786. list1.add(s);
  787. }
  788. }
  789. return list1.stream().filter(cn.cslg.pas.common.utils.StringUtils::isNotEmpty).distinct().collect(Collectors.toList());
  790. }
  791. public static List<String> splitWithQuotes(String input) {
  792. List<String> result = new ArrayList<>();
  793. StringBuilder currentPart = new StringBuilder();
  794. boolean inQuotes = false;
  795. for (int i = 0; i < input.length(); i++) {
  796. char c = input.charAt(i);
  797. if (c == '"' || c == '\'') {
  798. // 切换引号状态
  799. inQuotes = !inQuotes;
  800. // 如果我们不是在引号内,并且前面有内容,则添加当前部分到结果中
  801. if (!inQuotes && currentPart.length() > 0) {
  802. result.add(currentPart.toString());
  803. currentPart.setLength(0); // 重置当前部分
  804. }
  805. // 引号内的字符直接添加到当前部分
  806. currentPart.append(c);
  807. // 如果引号后面紧跟着的是空格,并且我们刚刚离开了引号,则跳过这个空格
  808. if (i + 1 < input.length() && input.charAt(i + 1) == ' ' && !inQuotes) {
  809. i++; // 跳过空格
  810. }
  811. } else if (c == ' ' && !inQuotes) {
  812. // 如果我们在空格处且不在引号内,则添加当前部分到结果中,并重置当前部分
  813. if (currentPart.length() > 0) {
  814. result.add(currentPart.toString());
  815. currentPart.setLength(0);
  816. }
  817. } else {
  818. // 其他字符直接添加到当前部分
  819. currentPart.append(c);
  820. }
  821. }
  822. // 添加最后一个部分(如果有的话)
  823. if (currentPart.length() > 0) {
  824. result.add(currentPart.toString());
  825. }
  826. // 将List转换为数组
  827. return result;
  828. }
  829. //添加子文档
  830. private void addChild(List<PatentPerson> personList, Integer projectId, String id, String joinName, Integer type) throws Exception {
  831. List<PatentMergePerson> mergePersonList = createMergePersonList(personList, projectId);
  832. // 根据type决定设置哪个字段
  833. Map<Integer, BiConsumer<Patent, List<PatentMergePerson>>> setterMap = new HashMap<>();
  834. setterMap.put(0, (patent, list) -> patent.setMergeApplicant(list));
  835. setterMap.put(1, (patent, list) -> patent.setMergeRightHolder(list));
  836. setterMap.put(2, (patent, list) -> patent.setMergeInventor(list));
  837. BiConsumer<Patent, List<PatentMergePerson>> setter = setterMap.getOrDefault(type, (p, l) -> {});
  838. // 通用添加逻辑
  839. String child = addChildCommon(id, joinName, mergePersonList, setter);
  840. if (StringUtils.isEmpty(child)) {
  841. throw new XiaoShiException("添加子文档失败");
  842. }
  843. // 如果type为0,还需要额外添加一个字段
  844. if (type == 0) {
  845. setter = setterMap.get(1); // 假设第二个字段是mergeRightHolder
  846. String child1 = addChildCommon(id, joinName, mergePersonList, setter);
  847. if (StringUtils.isEmpty(child1)) {
  848. throw new XiaoShiException("添加子文档失败");
  849. }
  850. }
  851. }
  852. private List<PatentMergePerson> createMergePersonList(List<PatentPerson> personList, Integer projectId) {
  853. List<PatentMergePerson> mergePersonList = new ArrayList<>();
  854. if (!CollectionUtils.isEmpty(personList)) {
  855. for (PatentPerson person : personList) {
  856. PatentMergePerson merge = new PatentMergePerson();
  857. merge.setName(person.getName());
  858. merge.setType(person.getType());
  859. merge.setOrder(person.getOrder());
  860. merge.setProjectId(String.valueOf(projectId));
  861. mergePersonList.add(merge);
  862. }
  863. }
  864. return mergePersonList;
  865. }
  866. private String addChildCommon(String id, String joinName, List<PatentMergePerson> mergePersonList, BiConsumer<Patent, List<PatentMergePerson>> setter) throws Exception {
  867. Patent newPatent = new Patent();
  868. PatentJoin patentJoin = new PatentJoin();
  869. patentJoin.setParent(id);
  870. patentJoin.setName(joinName);
  871. newPatent.setPatentJoin(patentJoin);
  872. setter.accept(newPatent, mergePersonList);
  873. return this.addChildToES(newPatent, id);
  874. }
  875. private void deleteChild(List<String> ids, Integer type, Integer projectId) throws IOException {
  876. SearchRequest.Builder builder = new SearchRequest.Builder();
  877. //设置查询索引
  878. builder.index("patent");
  879. List<Query> queries = new ArrayList<>();
  880. if (type == 0) {
  881. //合并申请人
  882. Query q = QueryBuilders.term(i -> i.field("merge_applicant.project_id").value(projectId));
  883. Query query1 = QueryBuilders.nested(i -> i.path("merge_applicant").query(q));
  884. //合并权利人
  885. Query q1 = QueryBuilders.term(i -> i.field("merge_right_holder.project_id").value(projectId));
  886. Query query2 = QueryBuilders.nested(i -> i.path("merge_right_holder").query(q1));
  887. queries.add(query1);
  888. queries.add(query2);
  889. } else {
  890. Query q = QueryBuilders.term(i -> i.field("merge_inventor.project_id").value(projectId));
  891. Query query = QueryBuilders.nested(i -> i.path("merge_inventor").query(q));
  892. queries.add(query);
  893. }
  894. Query query = QueryBuilders.bool(i -> i.should(queries));
  895. Query idQ = QueryBuilders.ids(i -> i.values(ids));
  896. Query parentQ = QueryBuilders.hasParent(i -> i.parentType("patent").query(idQ));
  897. Query bool = QueryBuilders.bool(i -> i.must(parentQ, query));
  898. builder.query(bool);
  899. builder.size(1000);
  900. builder.trackTotalHits(TrackHits.of(i -> i.enabled(true)));
  901. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  902. List<Hit<Patent>> hits = response.hits().hits();
  903. List<String> idList = new ArrayList<>();
  904. for (Hit<Patent> hit : hits) {
  905. String id = hit.id();
  906. idList.add(id);
  907. }
  908. //删除子文档
  909. delete(idList);
  910. }
  911. //查询专利父文档
  912. private void searchPatent(List<String> ids, Integer type, Integer projectId) throws Exception {
  913. SearchRequest.Builder builder = new SearchRequest.Builder();
  914. //设置查询索引
  915. builder.index("patent");
  916. Query query = QueryBuilders.ids(i -> i.values(ids));
  917. builder.query(query);
  918. builder.size(1000);
  919. builder.trackTotalHits(TrackHits.of(i -> i.enabled(true)));
  920. SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
  921. List<Hit<Patent>> hits = response.hits().hits();
  922. for (Hit<Patent> hit : hits) {
  923. String id = hit.id();
  924. Patent patent = hit.source();
  925. if (type == 0) {
  926. if (!CollectionUtils.isEmpty(patent.getApplicant())) {
  927. this.addChild(patent.getApplicant(), projectId, id, "merge_applicat",type);
  928. }
  929. if (!CollectionUtils.isEmpty(patent.getRightHolder())) {
  930. addChild(patent.getRightHolder(), projectId, id, "merge_right_holder",type);
  931. }
  932. } else {
  933. if (!CollectionUtils.isEmpty(patent.getInventor())) {
  934. addChild(patent.getInventor(), projectId, id, "merge_inventor",type);
  935. }
  936. }
  937. }
  938. }
  939. /**
  940. * 获取所有国家列表查询
  941. *
  942. * @return
  943. */
  944. public List<GetAllCountryDTO> getAllCountry() {
  945. List<GetAllCountryDTO> list = new ArrayList<>();
  946. List<SystemDict> countries = systemDictMapper.selectList(new LambdaQueryWrapper<SystemDict>()
  947. .eq(SystemDict::getType, "COUNTRIES"));
  948. if (!CollectionUtils.isEmpty(countries)) {
  949. countries.forEach(county -> {
  950. GetAllCountryDTO dto = new GetAllCountryDTO();
  951. dto.setLabel(county.getLabel());
  952. dto.setValue(county.getValue());
  953. dto.setType(county.getType());
  954. list.add(dto);
  955. });
  956. }
  957. return list;
  958. }
  959. /**
  960. * 获取国内省份列表查询
  961. *
  962. * @return
  963. */
  964. public List<GetAllCountryDTO> getAllProvince() {
  965. List<GetAllCountryDTO> list = new ArrayList<>();
  966. List<SystemDict> countries = systemDictMapper.selectList(new LambdaQueryWrapper<SystemDict>()
  967. .eq(SystemDict::getType, "PROVINCE"));
  968. if (!CollectionUtils.isEmpty(countries)) {
  969. countries.forEach(county -> {
  970. GetAllCountryDTO dto = new GetAllCountryDTO();
  971. dto.setLabel(county.getLabel());
  972. dto.setValue(county.getValue());
  973. dto.setType(county.getType());
  974. list.add(dto);
  975. });
  976. }
  977. return list;
  978. }
  979. /**
  980. * @param patent
  981. * @throws Exception
  982. */
  983. public String addChildToES(Patent patent, String id) throws Exception {
  984. IndexResponse indexResponse = client.index(i -> i
  985. .index("patent")
  986. .routing(id)
  987. //传入user对象
  988. .document(patent).refresh(Refresh.True)
  989. );
  990. return indexResponse.id();
  991. }
  992. //更新patent
  993. public Integer updateChild(Patent patent, String id, String routing) {
  994. UpdateRequest<Patent, Patent> req;
  995. req = UpdateRequest.of(
  996. b -> b.index("patent")
  997. .id(id)
  998. .routing(routing)
  999. .doc(patent).refresh(Refresh.True)
  1000. );
  1001. try {
  1002. client.update(req, Patent.class);
  1003. return 1;
  1004. } catch (IOException e) {
  1005. return -1;
  1006. }
  1007. }
  1008. public Integer delete(List<String> ids) {
  1009. Query query = QueryBuilders.ids(n -> n.values(ids));
  1010. DeleteByQueryRequest request = DeleteByQueryRequest.of(i -> i.index("patent").refresh(true).query(query));
  1011. try {
  1012. client.deleteByQuery(request);
  1013. return 1;
  1014. } catch (IOException e) {
  1015. throw new XiaoShiException("删除失败");
  1016. }
  1017. }
  1018. /**
  1019. * 删除申请人/权利人/发明人合并名称
  1020. *
  1021. * @param id
  1022. * @return
  1023. */
  1024. public Integer delSingleMerge(String id, Integer type, String name) {
  1025. String source = "";
  1026. if (type == 0) {
  1027. source = "if (ctx._source.merge_applicant != null) { ctx._source.merge_applicant.removeIf(item -> item.name == params.name); } if (ctx._source.merge_right_holder != null) { ctx._source.merge_right_holder .removeIf(item -> item.name == params.name); }";
  1028. } else {
  1029. source = "if (ctx._source.merge_inventor != null) { ctx._source.merge_inventor.removeIf(item -> item.name == params.name); }";
  1030. }
  1031. String finalSource = source;
  1032. InlineScript inlineScript = InlineScript.of(i -> i.lang("painless").params("name", JsonData.of(name)).source(finalSource));
  1033. Script script = Script.of(i -> i.inline(inlineScript));
  1034. Query query = QueryBuilders.term(i -> i.field("_id").value(id));
  1035. UpdateByQueryRequest request = UpdateByQueryRequest.of(i -> i.index("patent").script(script).query(query));
  1036. try {
  1037. client.updateByQuery(request);
  1038. return 1;
  1039. } catch (IOException e) {
  1040. return -1;
  1041. }
  1042. }
  1043. public Integer add(String id, Integer type, List<PatentMergePerson> mergePersonList) {
  1044. Integer flag = null;
  1045. for (PatentMergePerson mergePerson : mergePersonList) {
  1046. Map<String, JsonData> map = new HashMap<>();
  1047. map.put("name", JsonData.of(mergePerson.getName()));
  1048. map.put("project_id", JsonData.of(mergePerson.getProjectId()));
  1049. map.put("type", JsonData.of(mergePerson.getType()));
  1050. map.put("order", JsonData.of(mergePerson.getOrder()));
  1051. String source = "";
  1052. if (type == 0) {
  1053. source = "if (ctx._source.merge_applicant != null) {ctx._source.merge_applicant.add(params.data)} else { List list = new ArrayList();list.add(params.data);ctx._source.merge_applicant = list;}" +
  1054. "if (ctx._source.merge_right_holder != null) { ctx._source.merge_right_holder.add(params.data)} else { List list = new ArrayList();list.add(params.data);ctx._source.merge_right_holder = list;}";
  1055. } else {
  1056. source = "if (ctx._source.merge_inventor != null) {ctx._source.merge_inventor.add(params.data)} else { List list = new ArrayList();list.add(params.data);ctx._source.merge_inventor = list;}";
  1057. }
  1058. String finalSource = source;
  1059. InlineScript inlineScript = InlineScript.of(i -> i.lang("painless").params("data", JsonData.of(map)).source(finalSource));
  1060. Script script = Script.of(i -> i.inline(inlineScript));
  1061. Query query = QueryBuilders.term(i -> i.field("_id").value(id));
  1062. UpdateByQueryRequest request = UpdateByQueryRequest.of(i -> i.index("patent").script(script).query(query));
  1063. try {
  1064. client.updateByQuery(request);
  1065. flag += 1;
  1066. } catch (IOException e) {
  1067. flag += -1;
  1068. }
  1069. }
  1070. return flag;
  1071. }
  1072. public Integer edit(String id, Integer type, String oldName, String newName) {
  1073. String source = "";
  1074. if (type == 0) {
  1075. source = "if (ctx._source.merge_applicant != null) {for (item in ctx._source.merge_applicant) {if(item['name']==params.oldName){item['name']=params.newName}}}" +
  1076. "if (ctx._source.merge_right_holder != null) {for (item in ctx._source.merge_right_holder) {if(item['name']==params.oldName){item['name']=params.newName}}}";
  1077. } else {
  1078. source = "if (ctx._source.merge_inventor != null) {for (item in ctx._source.merge_inventor) {if(item['name']==params.oldName){item['name']=params.newName}}}";
  1079. }
  1080. String finalSource = source;
  1081. Map<String, JsonData> map = new HashMap<>();
  1082. map.put("oldName", JsonData.of(oldName));
  1083. map.put("newName", JsonData.of(newName));
  1084. InlineScript inlineScript = InlineScript.of(i -> i.lang("painless").params(map).source(finalSource));
  1085. Script script = Script.of(i -> i.inline(inlineScript));
  1086. Query query = QueryBuilders.term(i -> i.field("_id").value(id));
  1087. UpdateByQueryRequest request = UpdateByQueryRequest.of(i -> i.index("patent").script(script).query(query));
  1088. try {
  1089. client.updateByQuery(request);
  1090. return 1;
  1091. } catch (IOException e) {
  1092. return -1;
  1093. }
  1094. }
  1095. /**
  1096. * 删除申请人/权利人/发明人合并名称
  1097. *
  1098. * @param patent
  1099. * @param id
  1100. * @return
  1101. */
  1102. public Integer delMergePerson(Patent patent, String id, Integer type, String name) {
  1103. String source = "";
  1104. if (type == 0) {
  1105. source = "if (ctx._source.merge_applicant != null) { ctx._source.merge_applicant.removeIf(item -> item.name == params.name); } if (ctx._source.merge_right_holder != null) { ctx._source.merge_right_holder .removeIf(item -> item.name == params.name); }";
  1106. } else {
  1107. source = "if (ctx._source.merge_inventor != null) { ctx._source.merge_inventor.removeIf(item -> item.name == params.name); }";
  1108. }
  1109. String finalSource = source;
  1110. InlineScript inlineScript = InlineScript.of(i -> i.lang("painless").params("name", JsonData.of(name)).source(finalSource));
  1111. Script script = Script.of(i -> i.inline(inlineScript));
  1112. Query query = QueryBuilders.term(i -> i.field("_id").value(id));
  1113. UpdateByQueryRequest request = UpdateByQueryRequest.of(i -> i.index("patent").script(script).query(query));
  1114. try {
  1115. client.updateByQuery(request);
  1116. return 1;
  1117. } catch (IOException e) {
  1118. return -1;
  1119. }
  1120. }
  1121. }