FeatureService.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. package cn.cslg.pas.service.business;
  2. import cn.cslg.pas.common.TreeBuild;
  3. import cn.cslg.pas.common.dto.PatentColumnDTO;
  4. import cn.cslg.pas.common.dto.QueryPatentClaimDTO;
  5. import cn.cslg.pas.common.dto.QuerySplitDTO;
  6. import cn.cslg.pas.common.dto.business.SelectClaimDTO;
  7. import cn.cslg.pas.common.dto.invalidDTO.QueryClaimSplitHistoryDTO;
  8. import cn.cslg.pas.common.dto.invalidDTO.UpdateFeatureDTO;
  9. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  10. import cn.cslg.pas.common.model.cronModel.Records;
  11. import cn.cslg.pas.common.utils.CacheUtils;
  12. import cn.cslg.pas.common.utils.LoginUtils;
  13. import cn.cslg.pas.common.utils.PatentRightUtils;
  14. import cn.cslg.pas.common.vo.*;
  15. import cn.cslg.pas.common.vo.business.SplitVO;
  16. import cn.cslg.pas.common.vo.invalidVO.QueryClaimSplitHistoryVO;
  17. import cn.cslg.pas.domain.business.*;
  18. import cn.cslg.pas.domain.es.PatentTranslate;
  19. import cn.cslg.pas.domain.es.Text;
  20. import cn.cslg.pas.exception.XiaoShiException;
  21. import cn.cslg.pas.mapper.FeatureMapper;
  22. import cn.cslg.pas.service.ClaimMessageService;
  23. import cn.cslg.pas.service.business.es.EsService;
  24. import cn.cslg.pas.service.business.invalidReport.AssoGroupFeatureService;
  25. import cn.cslg.pas.service.business.invalidReport.PatentClaimService;
  26. import cn.cslg.pas.service.common.PatentStarApiService;
  27. import cn.cslg.pas.service.common.TranslateService;
  28. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  29. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  30. import co.elastic.clients.elasticsearch.core.SearchRequest;
  31. import co.elastic.clients.elasticsearch.core.SearchResponse;
  32. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  33. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  34. import org.apache.commons.lang3.StringUtils;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.context.annotation.Lazy;
  37. import org.springframework.stereotype.Service;
  38. import org.springframework.transaction.annotation.Transactional;
  39. import org.springframework.util.CollectionUtils;
  40. import java.io.IOException;
  41. import java.util.*;
  42. import java.util.stream.Collectors;
  43. /**
  44. * @Author lirj
  45. * @Date 2023/12/5
  46. */
  47. @Service
  48. public class FeatureService extends ServiceImpl<FeatureMapper, Feature> {
  49. @Autowired
  50. private CacheUtils cacheUtils;
  51. @Autowired
  52. private LoginUtils loginUtils;
  53. @Autowired
  54. private EsService esService;
  55. @Autowired
  56. private ReportProjectService reportProjectService;
  57. @Autowired
  58. private PatentSplitMessageService patentSplitMessageService;
  59. @Autowired
  60. @Lazy
  61. private InvalidStatutesService invalidStatutesService;
  62. @Autowired
  63. private ProofGroupService proofGroupService;
  64. @Autowired
  65. @Lazy
  66. private AssoGroupFeatureService assoGroupFeatureService;
  67. @Autowired
  68. private PatentStarApiService patentStarApiService;
  69. @Autowired
  70. private ClaimMessageService claimMessageService;
  71. @Autowired
  72. private PatentClaimService patentClaimService;
  73. @Autowired
  74. private TranslateService translateService;
  75. @Transactional(rollbackFor = Exception.class)
  76. public List<PatentRightVo> splitPatentFeature(SplitVO splitVO) throws IOException {
  77. String patentNo = splitVO.getPatentNo();
  78. Integer projectId = splitVO.getProjectId();
  79. Integer splitType = splitVO.getSplitType();
  80. Integer splitBy = splitVO.getSplitBy();
  81. Integer taskId = splitVO.getTaskId();
  82. Boolean ifReSplit = splitVO.getIfReSplit();
  83. PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  84. //根据报告ID查询报告
  85. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper();
  86. queryWrapper.eq(ReportProject::getProjectId, projectId);
  87. List<ReportProject> reportProjects = reportProjectService.list(queryWrapper);
  88. //未查到报告报错
  89. if (reportProjects.size() == 0) {
  90. throw new XiaoShiException("未查询到报告");
  91. }
  92. //查询拆分下的权要
  93. List<RePatentClaim> patentRights = this.getRightListByNo(patentNo);
  94. if (patentRights.size() == 0) {
  95. return new ArrayList<>();
  96. }
  97. LambdaQueryWrapper<PatentSplitMessage> splitWrapper = new LambdaQueryWrapper<>();
  98. splitWrapper.eq(PatentSplitMessage::getPatentNo, patentNo);
  99. splitWrapper.eq(PatentSplitMessage::getProjectId, projectId);
  100. //当任务id不为空时
  101. if (taskId != null) {
  102. splitWrapper.eq(PatentSplitMessage::getTaskId, taskId);
  103. }
  104. PatentSplitMessage patentSplitMessage = patentSplitMessageService.getOne(splitWrapper, false);
  105. LambdaQueryWrapper<Feature> wrapper = new LambdaQueryWrapper<>();
  106. wrapper.eq(Feature::getProjectId, projectId)
  107. .eq(Feature::getPatentNo, patentNo);
  108. if (patentSplitMessage != null) {
  109. wrapper.eq(Feature::getSplitMessageId, patentSplitMessage.getId());
  110. }
  111. List<Feature> allFeatures = new ArrayList<>();
  112. //如果是不重拆
  113. if (!ifReSplit) {
  114. //如果拆分过
  115. if (patentSplitMessage != null) {
  116. allFeatures = this.list(wrapper);
  117. }
  118. //如果没有拆分过
  119. else {
  120. patentSplitMessage = new PatentSplitMessage();
  121. patentSplitMessage.setPatentNo(patentNo);
  122. patentSplitMessage.setProjectId(projectId);
  123. patentSplitMessage.setTenantId(personnelVO.getTenantId());
  124. patentSplitMessage.setCreateId(personnelVO.getId());
  125. if (taskId != null) {
  126. patentSplitMessage.setTaskId(taskId);
  127. }
  128. patentSplitMessage.insert();
  129. allFeatures = this.splitFeature(splitBy, splitType, patentNo, projectId, taskId, patentRights, patentSplitMessage.getId());
  130. }
  131. }
  132. //当重拆时新建
  133. else {
  134. if (patentSplitMessage == null) {
  135. throw new XiaoShiException("未拆分过,请重新选择拆分方式");
  136. }
  137. //更新拆分信息
  138. patentSplitMessage.setCreateTime(new Date());
  139. patentSplitMessage.setCreateId(personnelVO.getId());
  140. patentSplitMessage.updateById();
  141. //清除原本的
  142. this.remove(wrapper);
  143. allFeatures = this.splitFeature(splitBy, splitType, patentNo, projectId, taskId, patentRights, patentSplitMessage.getId());
  144. }
  145. //装载信息并返回
  146. List<PatentRightVo> patentRightVos = new ArrayList<>();
  147. patentRightVos = this.loadPatentRightVO(patentRights, allFeatures, projectId, patentNo);
  148. return patentRightVos;
  149. }
  150. //根据符号拆分字符串
  151. public List<String> splitStringByFlags(String sentence, List<String> flags) {
  152. List<String> sectences = new ArrayList<>();
  153. //如果字符串为空则返回一个包含空字符串的list
  154. if (sentence == null) {
  155. sectences.add("");
  156. return sectences;
  157. }
  158. sectences.add(sentence);
  159. for (int i = 0; i < flags.size(); i++) {
  160. List<String> tem = new ArrayList<>();
  161. for (int t = 0; t < sectences.size(); t++) {
  162. List<String> attrs = Arrays.asList(sectences.get(t).split(flags.get(i)));
  163. for (int v = 0; v < attrs.size(); v++) {
  164. if (v < attrs.size() - 1) {
  165. attrs.set(v, attrs.get(v) + flags.get(i));
  166. }
  167. if (attrs.get(v).equals("其特征在于" + flags.get(i))) {
  168. tem.set(tem.size() - 1, tem.get(tem.size() - 1) + attrs.get(v));
  169. } else {
  170. tem.add(attrs.get(v));
  171. }
  172. }
  173. }
  174. sectences = tem;
  175. }
  176. return sectences;
  177. }
  178. @Transactional(rollbackFor = Exception.class)
  179. public List<RePatentClaim> getRightListByNo(String patentNo) throws IOException {
  180. //从pas获得拆分后的权要
  181. SelectClaimDTO selectClaimDTO = null;
  182. try {
  183. selectClaimDTO = esService.selectClaim(patentNo);
  184. } catch (Exception e) {
  185. throw new XiaoShiException("未查询到权要");
  186. }
  187. if (selectClaimDTO == null) {
  188. throw new XiaoShiException("未查询到权要");
  189. }
  190. String patentRight = selectClaimDTO.getClaim();
  191. PatentRightParams params = new PatentRightParams();
  192. params.setContent(patentRight);
  193. params.setPatentNo(patentNo);
  194. List<RePatentClaim> patentRights = PatentRightUtils.formatPatentRight(params);
  195. patentRights.forEach(item -> {
  196. item.setRightName("权要" + (item.getSort() + 1));
  197. });
  198. return patentRights;
  199. }
  200. @Transactional(rollbackFor = Exception.class)
  201. public List<RePatentClaim> getRightListByNo(String patentNo, String appNo) throws IOException {
  202. //从pas获得拆分后的权要
  203. SelectClaimDTO selectClaimDTO = null;
  204. String patentRight = "";
  205. try {
  206. if (appNo != null) {
  207. selectClaimDTO = patentStarApiService.getOrginCalim(appNo);
  208. if (selectClaimDTO != null && selectClaimDTO.getClaimContent() != null && selectClaimDTO.getClaimContent().size() != 0) {
  209. patentRight = selectClaimDTO.getClaimContent().get(0).getTextContent();
  210. }
  211. } else if (patentNo != null) {
  212. selectClaimDTO = esService.selectClaim(patentNo);
  213. patentRight = selectClaimDTO.getClaim();
  214. }
  215. } catch (Exception e) {
  216. throw new XiaoShiException("未查询到权要");
  217. }
  218. if (selectClaimDTO == null) {
  219. throw new XiaoShiException("未查询到权要");
  220. }
  221. PatentRightParams params = new PatentRightParams();
  222. params.setContent(patentRight);
  223. params.setPatentNo(patentNo);
  224. List<RePatentClaim> patentRights = PatentRightUtils.formatPatentRight(params);
  225. patentRights.forEach(item -> {
  226. item.setRightName("权要" + (item.getSort() + 1));
  227. });
  228. return patentRights;
  229. }
  230. //获得专利拆分信息
  231. public QuerySplitVO getSplitMessage(QuerySplitDTO splitDTO) {
  232. QuerySplitVO splitVO = new QuerySplitVO();
  233. //根据项目id和专利号查询拆分信息
  234. LambdaQueryWrapper<ReportProject> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  235. lambdaQueryWrapper.eq(ReportProject::getProjectId, splitDTO.getProjectId());
  236. ReportProject reportProject = reportProjectService.getOne(lambdaQueryWrapper, false);
  237. if (reportProject == null) {
  238. throw new XiaoShiException("未查询到报告");
  239. }
  240. Integer splitType = reportProject.getSplitType();
  241. Integer splitBy = reportProject.getSplitBy();
  242. if (splitBy != null && splitType != null) {
  243. splitVO.setSplitBy(splitBy);
  244. splitVO.setSplitType(splitType);
  245. splitVO.setIfFirst(false);
  246. } else {
  247. splitVO.setSplitBy(0);
  248. splitVO.setSplitType(0);
  249. splitVO.setIfFirst(true);
  250. }
  251. return splitVO;
  252. }
  253. public List<RePatentClaim> getPatentRight(String patentNo) {
  254. try {
  255. List<RePatentClaim> patentRights = this.getRightListByNo(patentNo);
  256. return patentRights;
  257. } catch (Exception e) {
  258. throw new XiaoShiException("系统错误");
  259. }
  260. }
  261. public List<PatentRightTree> getPatentRightTree(String patentNo, String appNo) {
  262. try {
  263. List<RePatentClaim> patentRights = this.getRightListByNo(patentNo, appNo);
  264. Long total = translateService.getTranslateByPatentNo(patentNo);
  265. if (total < 1) {
  266. PatentColumnDTO columnDTO = translateService.getPatentByPatentNo(patentNo);
  267. List<Text> claim = columnDTO.getClaim();
  268. if (!CollectionUtils.isEmpty(claim)) {
  269. Text text = claim.get(0);
  270. for (RePatentClaim rePatentClaim : patentRights) {
  271. if (rePatentClaim.getContent().contains("&nbsp;")) {
  272. String replace = rePatentClaim.getContent().replace("&nbsp;", " ");
  273. rePatentClaim.setContent(replace);
  274. }
  275. //原文
  276. translateService.loadingTranslate(patentNo, "3", text.getLanguage(), true,
  277. rePatentClaim.getSort(), rePatentClaim.getParentSort(), rePatentClaim.getContent());
  278. }
  279. }
  280. }
  281. List<PatentRightTree> treeNodeList = new ArrayList<>();
  282. //装载权要原文
  283. // PatentRightParams params = new PatentRightParams();
  284. // params.setPatentNo(patentNo);
  285. // params.setContent("");
  286. //判断若处理后的权要集合只有1个元素并且类型type=-1、排序号sort=-1,则表示本次拆分失败,则直接返回整个权要
  287. if (patentRights.size() == 1 && (patentRights.get(0).getType() == null || patentRights.get(0).getType() == -1) && patentRights.get(0).getSort() == -1) {
  288. List<String> list = translateService.getTranslateOrder(patentNo, patentRights.get(0).getSort());
  289. String translateContent = "";
  290. if (!CollectionUtils.isEmpty(list)) {
  291. translateContent = list.get(0);
  292. }
  293. treeNodeList.add(new PatentRightTree(patentRights.get(0).getSort(), null, patentRights.get(0).getContent(), translateContent));
  294. return treeNodeList;
  295. }
  296. List<PatentRightContent> patentRightContents = this.loadPatentRightContent(patentRights);
  297. for (PatentRightContent patentRightContent : patentRightContents) {
  298. List<String> list = translateService.getTranslateOrder(patentNo, patentRightContent.getSort());
  299. String translateContent = "";
  300. if (!CollectionUtils.isEmpty(list)) {
  301. translateContent = list.get(0);
  302. }
  303. treeNodeList.add(new PatentRightTree(patentRightContent.getSort(), patentRightContent.getParentSorts(), patentRightContent.getContent(), translateContent));
  304. }
  305. //开始进行权要树装载
  306. try {
  307. TreeBuild treeBuild = new TreeBuild(treeNodeList);
  308. treeNodeList = treeBuild.buildTree();
  309. } catch (Exception e) {
  310. e.printStackTrace();
  311. }
  312. return treeNodeList;
  313. } catch (Exception e) {
  314. throw new XiaoShiException(e.getMessage());
  315. }
  316. }
  317. private List<PatentRightContent> loadPatentRightContent(List<RePatentClaim> rePatentClaims) {
  318. List<PatentRightContent> patentRightContents = new ArrayList<>();
  319. rePatentClaims.forEach(item -> {
  320. List<Integer> sorts = new ArrayList<>();
  321. String[] a = item.getParentSort().split(",");
  322. for (int i = 0; i < a.length; i++) {
  323. sorts.add(Integer.parseInt(a[i]));
  324. }
  325. PatentRightContent patentRightContent = new PatentRightContent();
  326. patentRightContent.setContent(item.getContent());
  327. patentRightContent.setType(item.getType());
  328. patentRightContent.setSort(item.getSort());
  329. patentRightContent.setParentSorts(sorts);
  330. patentRightContents.add(patentRightContent);
  331. });
  332. return patentRightContents;
  333. }
  334. public List<Feature> splitFeature(Integer splitBy, Integer splitType, String patentNo, Integer projectId, Integer taskId, List<RePatentClaim> patentRights, Integer splitMessageId) throws IOException {
  335. List<Feature> allFeatures = new ArrayList<>();
  336. PersonnelVO personnelVO = new PersonnelVO();
  337. personnelVO.setId("1");
  338. personnelVO.setTenantId(1);
  339. List<String> flags = new ArrayList<>();
  340. List<Integer> partRightSorts = new ArrayList<>(); //权要sorts
  341. if (splitBy == 0) { //当splitBy=0时仅仅根据“,”拆解
  342. flags.add(",");
  343. flags.add(",");
  344. } else if (splitBy == 1) { //当splitBy=1时仅仅根据“;“拆解
  345. flags.add(";");
  346. flags.add(";");
  347. } else if (splitBy == 2) { //当splitBy=2时根据“;“和”,”拆解
  348. flags.add(";");
  349. flags.add(";");
  350. flags.add(",");
  351. flags.add(",");
  352. }
  353. if (splitType.equals(0)) { //当splitType=0仅拆解主权要
  354. partRightSorts = patentRights.stream().filter(item -> item.getType().equals(1)).map(RePatentClaim::getSort).collect(Collectors.toList());
  355. } else if (splitType.equals(1)) { //当splitType=1拆解全部权要
  356. partRightSorts = patentRights.stream().map(RePatentClaim::getSort).collect(Collectors.toList());
  357. }
  358. //遍历权要保存特征
  359. for (int i = 0; i < patentRights.size(); i++) {
  360. List<Feature> featureList = new ArrayList<>();
  361. //根据拆分方式返回特征
  362. List<String> contents = Arrays.asList(patentRights.get(i).getContent());
  363. //如果是需要拆解的权要
  364. if (partRightSorts.contains(patentRights.get(i).getSort())) {
  365. //获得权要的原文并且拆解
  366. contents = this.splitStringByFlags(patentRights.get(i).getContent(), flags);
  367. }
  368. for (int t = 0; t < contents.size(); t++) {
  369. Feature feature = new Feature();
  370. feature.setRightSort(patentRights.get(i).getSort());
  371. feature.setPatentNo(patentNo);
  372. feature.setProjectId(projectId);
  373. feature.setSysOrder(t + 1);
  374. feature.setContent(contents.get(t));
  375. feature.setCreateId(personnelVO.getId());
  376. feature.setRightType(patentRights.get(i).getType());
  377. feature.setTenantId(personnelVO.getTenantId());
  378. feature.setSplitMessageId(splitMessageId);
  379. if (taskId != null) {
  380. feature.setProjectTaskId(taskId);
  381. }
  382. featureList.add(feature);
  383. }
  384. if (featureList.size() > 0) {
  385. this.saveBatch(featureList);
  386. allFeatures.addAll(featureList);
  387. }
  388. }
  389. return allFeatures;
  390. }
  391. public List<PatentRightVo> loadPatentRightVO(List<RePatentClaim> patentRights, List<Feature> allFeatures, Integer projectId, String patentNo) {
  392. List<PatentRightVo> patentRightVos = new ArrayList<>();
  393. //将拆解的权要和特征装载到对象PatentRightVo
  394. for (int i = 0; i < patentRights.size(); i++) {
  395. List<Feature> featureList = new ArrayList<>();
  396. Integer sort = patentRights.get(i).getSort();
  397. featureList = allFeatures
  398. .stream()
  399. .filter(item -> item.getRightSort().equals(sort))
  400. .sorted(Comparator.comparing(Feature::getSysOrder,
  401. Comparator.nullsLast(Integer::compareTo)))
  402. .collect(Collectors.toList());
  403. PatentRightVo patentRightVo = new PatentRightVo();
  404. patentRightVo.setPatentNo(patentRights.get(i).getPatentNo());
  405. patentRightVo.setFeatures(featureList);
  406. patentRightVo.setContent(patentRights.get(i).getContent());
  407. patentRightVo.setSort(patentRights.get(i).getSort() + 1);
  408. patentRightVo.setType(patentRights.get(i).getType());
  409. patentRightVo.setContentOut(patentRights.get(i).getContentOut());
  410. patentRightVo.setProjectId(projectId);
  411. patentRightVo.setRightName("权要" + (sort + 1));
  412. patentRightVo.setSignPatentNo(patentNo);
  413. patentRightVos.add(patentRightVo);
  414. }
  415. return patentRightVos;
  416. }
  417. public Records queryClaimSplitHistory(QueryClaimSplitHistoryDTO queryClaimSplitHistoryDTO) {
  418. List<QueryClaimSplitHistoryVO> queryClaimSplitHistoryVOS = new ArrayList<>();
  419. Integer claimId = queryClaimSplitHistoryDTO.getClaimId();
  420. Long current = queryClaimSplitHistoryDTO.getCurrent();
  421. Long size = queryClaimSplitHistoryDTO.getSize();
  422. //根据id查询无效发条
  423. LambdaQueryWrapper<InvalidStatutes> queryWrapper = new LambdaQueryWrapper<>();
  424. queryWrapper.eq(InvalidStatutes::getClaimId, claimId);
  425. List<InvalidStatutes> invalidStatutes = invalidStatutesService.list(queryWrapper);
  426. //根据无效发条查询证据组合
  427. if (invalidStatutes.size() != 0) {
  428. List<Integer> statutesIds = invalidStatutes.stream().map(InvalidStatutes::getId).collect(Collectors.toList());
  429. //根据无效法条id查询证据组合
  430. LambdaQueryWrapper<ProofGroup> queryWrapper1 = new LambdaQueryWrapper<>();
  431. queryWrapper1.in(ProofGroup::getInvalidStatutesId, statutesIds);
  432. List<ProofGroup> proofGroups = proofGroupService.list(queryWrapper1);
  433. if (proofGroups.size() > 0) {
  434. proofGroups.forEach(item -> {
  435. //根据id 查询特征
  436. Integer groupId = item.getId();
  437. LambdaQueryWrapper<AssoGroupFeature> queryWrapper2 = new LambdaQueryWrapper<>();
  438. queryWrapper2.eq(AssoGroupFeature::getGroupId, groupId);
  439. List<AssoGroupFeature> assoGroupFeatures = assoGroupFeatureService.list(queryWrapper2);
  440. if (assoGroupFeatures != null && assoGroupFeatures.size() != 0) {
  441. List<Integer> featureIds = assoGroupFeatures.stream().map(AssoGroupFeature::getFeatureId).collect(Collectors.toList());
  442. if (featureIds.size() != 0) {
  443. LambdaQueryWrapper<Feature> queryWrapper3 = new LambdaQueryWrapper<>();
  444. queryWrapper3.in(Feature::getId, featureIds);
  445. List<Feature> featureList = this.list(queryWrapper3);
  446. if (featureList.size() != 0) {
  447. QueryClaimSplitHistoryVO queryClaimSplitHistoryVO = new QueryClaimSplitHistoryVO();
  448. List<QueryClaimSplitHistoryVO.GroupFeature> features = new ArrayList<>();
  449. featureList.forEach(i -> {
  450. QueryClaimSplitHistoryVO.GroupFeature tem = new QueryClaimSplitHistoryVO.GroupFeature();
  451. tem.setFeatureText(i.getContent());
  452. tem.setId(i.getId());
  453. AssoGroupFeature assoGroupFeature = assoGroupFeatures.stream().filter(t -> t.getFeatureId().equals(i.getId())).findFirst().orElse(null);
  454. if (assoGroupFeature != null) {
  455. tem.setSysOrder(assoGroupFeature.getFeatureOrder());
  456. }
  457. features.add(tem);
  458. });
  459. queryClaimSplitHistoryVO.setFeatureSplitContent(features);
  460. queryClaimSplitHistoryVOS.add(queryClaimSplitHistoryVO);
  461. }
  462. }
  463. }
  464. });
  465. }
  466. }
  467. Records records = new Records();
  468. records.setData(queryClaimSplitHistoryVOS);
  469. return records;
  470. }
  471. /**
  472. * 获得已经拆分过的特征
  473. *
  474. * @param splitVO
  475. */
  476. public List<Feature> getSplitedFeature(SplitVO splitVO) {
  477. List<PatentRightVo> patentRightVos = new ArrayList<>();
  478. Integer projectId = splitVO.getProjectId();
  479. String patentNo = splitVO.getPatentNo();
  480. //当未传入专利号时,从报告里拿标的专利
  481. if (patentNo == null || patentNo.equals("")) {
  482. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  483. queryWrapper.eq(ReportProject::getProjectId, projectId);
  484. ReportProject reportProject = reportProjectService.getOne(queryWrapper, false);
  485. if (reportProject == null) {
  486. throw new XiaoShiException("未查到报告");
  487. }
  488. patentNo = reportProject.getSignPatentNo();
  489. }
  490. LambdaQueryWrapper<PatentSplitMessage> splitWrapper = new LambdaQueryWrapper<>();
  491. splitWrapper.eq(PatentSplitMessage::getPatentNo, patentNo);
  492. splitWrapper.eq(PatentSplitMessage::getProjectId, projectId);
  493. PatentSplitMessage patentSplitMessage = patentSplitMessageService.getOne(splitWrapper, false);
  494. List<Feature> allFeatures = new ArrayList<>();
  495. if (patentSplitMessage == null) {
  496. return allFeatures;
  497. }
  498. LambdaQueryWrapper<Feature> wrapper = new LambdaQueryWrapper<>();
  499. wrapper.eq(Feature::getProjectId, projectId)
  500. .eq(Feature::getPatentNo, patentNo)
  501. .eq(Feature::getSplitMessageId, patentSplitMessage.getId());
  502. allFeatures = this.list(wrapper);
  503. return allFeatures;
  504. }
  505. /**
  506. * 保存特征
  507. *
  508. * @param updateFeatureDTO
  509. * @return
  510. */
  511. public List<Integer> saveBatchFeature(UpdateFeatureDTO updateFeatureDTO) {
  512. List<UpdateFeatureDTO.ChangedFeatures> features = updateFeatureDTO.getFeaturesList();
  513. Integer projectId = updateFeatureDTO.getProjectId();
  514. if (features == null) {
  515. features = new ArrayList<>();
  516. }
  517. if (projectId == null) {
  518. throw new XiaoShiException("未选择报告");
  519. }
  520. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  521. queryWrapper.eq(ReportProject::getProjectId, projectId);
  522. ReportProject reportProject = reportProjectService.getOne(queryWrapper, false);
  523. if (reportProject == null) {
  524. throw new XiaoShiException("报告不存在");
  525. }
  526. String signPatentNo = reportProject.getSignPatentNo();
  527. //根据标的专利号和报告id查询拆分信息
  528. LambdaQueryWrapper<PatentSplitMessage> queryWrapper1 = new LambdaQueryWrapper<>();
  529. queryWrapper1.eq(PatentSplitMessage::getPatentNo, signPatentNo)
  530. .eq(PatentSplitMessage::getProjectId, projectId);
  531. PatentSplitMessage patentSplitMessage = patentSplitMessageService.getOne(queryWrapper1, false);
  532. if (patentSplitMessage == null) {
  533. throw new XiaoShiException("未进行拆分过");
  534. }
  535. List<Integer> ids = this.saveFeatures(features, patentSplitMessage.getId(), projectId, signPatentNo);
  536. return ids;
  537. }
  538. /**
  539. * 批量添加特征
  540. *
  541. * @param features
  542. * @param splitMessageId
  543. * @param projectId
  544. * @return
  545. */
  546. public List<Integer> saveFeatures(List<UpdateFeatureDTO.ChangedFeatures> features, Integer splitMessageId, Integer projectId, String patentNo) {
  547. List<Integer> addIds = new ArrayList<>();
  548. LambdaQueryWrapper<Feature> queryWrapper = new LambdaQueryWrapper<>();
  549. queryWrapper.select(Feature::getId);
  550. queryWrapper.eq(Feature::getSplitMessageId, splitMessageId);
  551. List<Feature> featureList = this.list(queryWrapper);
  552. List<Integer> ids = featureList.stream().map(Feature::getId).collect(Collectors.toList());
  553. PersonnelVO personnelVO = new PersonnelVO();
  554. personnelVO.setId("1");
  555. personnelVO.setTenantId(1);
  556. List<Feature> addFeatures = new ArrayList<>();
  557. Integer order = 1;
  558. for (UpdateFeatureDTO.ChangedFeatures item : features) {
  559. Integer id = item.getId();
  560. if (id == null || !ids.contains(id)) {
  561. Feature feature = new Feature();
  562. feature.setCreateId(personnelVO.getId());
  563. feature.setSplitMessageId(splitMessageId);
  564. feature.setContent(item.getContent());
  565. feature.setExplainText(item.getExplainText());
  566. feature.setRightSort(item.getRightSort());
  567. feature.setProjectId(projectId);
  568. feature.setSysOrder(order);
  569. feature.setPatentNo(patentNo);
  570. feature.setRightType(item.getRightType());
  571. feature.setTenantId(personnelVO.getTenantId());
  572. feature.insert();
  573. } else {
  574. ids.remove(id);
  575. Feature feature = this.getById(id);
  576. feature.setSysOrder(order);
  577. feature.setContent(item.getContent());
  578. feature.setExplainText(item.getExplainText());
  579. feature.updateById();
  580. }
  581. order++;
  582. }
  583. //添加特征
  584. if (addFeatures.size() != 0) {
  585. addIds = addFeatures.stream().map(Feature::getId).collect(Collectors.toList());
  586. }
  587. if (ids.size() != 0) {
  588. this.removeBatchByIds(ids);
  589. }
  590. return addIds;
  591. }
  592. public List<RePatentClaim> getPatentRight(QueryPatentClaimDTO queryPatentClaimDTO) {
  593. try {
  594. List<RePatentClaim> patentRights = new ArrayList<>();
  595. Integer taskId = queryPatentClaimDTO.getTaskId();
  596. Integer projectId = queryPatentClaimDTO.getProjectId();
  597. String patentNo = queryPatentClaimDTO.getPatentNo();
  598. Integer literatureId = queryPatentClaimDTO.getLiteratureId();
  599. ClaimMessage claimMessage = claimMessageService.getClaimMessage(taskId, projectId, patentNo, literatureId);
  600. if (claimMessage == null) {
  601. patentRights = this.getRightListByNo(patentNo);
  602. } else {
  603. Integer claimMessageId = claimMessage.getId();
  604. LambdaQueryWrapper<PatentClaim> queryWrapper = new LambdaQueryWrapper<>();
  605. queryWrapper.eq(PatentClaim::getClaimMessageId, claimMessageId);
  606. List<PatentClaim> patentClaimList = patentClaimService.list(queryWrapper);
  607. for (PatentClaim item : patentClaimList) {
  608. RePatentClaim rePatentClaim = this.domainToRe(item);
  609. patentRights.add(rePatentClaim);
  610. }
  611. }
  612. return patentRights;
  613. } catch (Exception e) {
  614. throw new XiaoShiException("系统错误");
  615. }
  616. }
  617. private RePatentClaim domainToRe(PatentClaim patentClaim) {
  618. RePatentClaim rePatentClaim = new RePatentClaim();
  619. rePatentClaim.setContent(patentClaim.getContent());
  620. rePatentClaim.setId(patentClaim.getId());
  621. rePatentClaim.setSort(patentClaim.getSysOrder());
  622. rePatentClaim.setParentSort(patentClaim.getParentOrder());
  623. rePatentClaim.setType(patentClaim.getClaimType());
  624. return rePatentClaim;
  625. }
  626. }