FeatureService.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. package cn.cslg.pas.service.business;
  2. import cn.cslg.pas.common.TreeBuild;
  3. import cn.cslg.pas.common.dto.QuerySplitDTO;
  4. import cn.cslg.pas.common.dto.business.SelectClaimDTO;
  5. import cn.cslg.pas.common.dto.invalidDTO.QueryClaimSplitHistoryDTO;
  6. import cn.cslg.pas.common.dto.invalidDTO.UpdateFeatureDTO;
  7. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  8. import cn.cslg.pas.common.model.cronModel.Records;
  9. import cn.cslg.pas.common.utils.CacheUtils;
  10. import cn.cslg.pas.common.utils.LoginUtils;
  11. import cn.cslg.pas.common.utils.PatentRightUtils;
  12. import cn.cslg.pas.common.vo.*;
  13. import cn.cslg.pas.common.vo.business.SplitVO;
  14. import cn.cslg.pas.common.vo.invalidVO.QueryClaimSplitHistoryVO;
  15. import cn.cslg.pas.domain.business.*;
  16. import cn.cslg.pas.exception.XiaoShiException;
  17. import cn.cslg.pas.mapper.FeatureMapper;
  18. import cn.cslg.pas.service.business.es.EsService;
  19. import cn.cslg.pas.service.business.invalidReport.AssoGroupFeatureService;
  20. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  21. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  22. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.context.annotation.Lazy;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.transaction.annotation.Transactional;
  27. import java.io.IOException;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. /**
  31. * @Author lirj
  32. * @Date 2023/12/5
  33. */
  34. @Service
  35. public class FeatureService extends ServiceImpl<FeatureMapper, Feature> {
  36. @Autowired
  37. private CacheUtils cacheUtils;
  38. @Autowired
  39. private LoginUtils loginUtils;
  40. @Autowired
  41. private EsService esService;
  42. @Autowired
  43. private ReportProjectService reportProjectService;
  44. @Autowired
  45. private PatentSplitMessageService patentSplitMessageService;
  46. @Autowired
  47. @Lazy
  48. private InvalidStatutesService invalidStatutesService;
  49. @Autowired
  50. private ProofGroupService proofGroupService;
  51. @Autowired
  52. @Lazy
  53. private AssoGroupFeatureService assoGroupFeatureService;
  54. @Transactional(rollbackFor = Exception.class)
  55. public List<PatentRightVo> splitPatentFeature(SplitVO splitVO) throws IOException {
  56. String patentNo = splitVO.getPatentNo();
  57. Integer projectId = splitVO.getProjectId();
  58. Integer splitType = splitVO.getSplitType();
  59. Integer splitBy = splitVO.getSplitBy();
  60. Integer taskId = splitVO.getTaskId();
  61. Boolean ifReSplit = splitVO.getIfReSplit();
  62. PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  63. //根据报告ID查询报告
  64. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper();
  65. queryWrapper.eq(ReportProject::getProjectId, projectId);
  66. List<ReportProject> reportProjects = reportProjectService.list(queryWrapper);
  67. //未查到报告报错
  68. if (reportProjects.size() == 0) {
  69. throw new XiaoShiException("未查询到报告");
  70. }
  71. //查询拆分下的权要
  72. List<RePatentClaim> patentRights = this.getRightListByNo(patentNo);
  73. LambdaQueryWrapper<PatentSplitMessage> splitWrapper = new LambdaQueryWrapper<>();
  74. splitWrapper.eq(PatentSplitMessage::getPatentNo, patentNo);
  75. splitWrapper.eq(PatentSplitMessage::getProjectId, projectId);
  76. //当任务id不为空时
  77. if (taskId != null) {
  78. splitWrapper.eq(PatentSplitMessage::getTaskId, taskId);
  79. }
  80. PatentSplitMessage patentSplitMessage = patentSplitMessageService.getOne(splitWrapper, false);
  81. LambdaQueryWrapper<Feature> wrapper = new LambdaQueryWrapper<>();
  82. wrapper.eq(Feature::getProjectId, projectId)
  83. .eq(Feature::getPatentNo, patentNo);
  84. if (patentSplitMessage != null) {
  85. wrapper.eq(Feature::getSplitMessageId, patentSplitMessage.getId());
  86. }
  87. List<Feature> allFeatures = new ArrayList<>();
  88. //如果是不重拆
  89. if (!ifReSplit) {
  90. //如果拆分过
  91. if (patentSplitMessage != null) {
  92. allFeatures = this.list(wrapper);
  93. }
  94. //如果没有拆分过
  95. else {
  96. patentSplitMessage = new PatentSplitMessage();
  97. patentSplitMessage.setPatentNo(patentNo);
  98. patentSplitMessage.setProjectId(projectId);
  99. patentSplitMessage.setTenantId(personnelVO.getTenantId());
  100. patentSplitMessage.setCreateId(personnelVO.getId());
  101. if (taskId != null) {
  102. patentSplitMessage.setTaskId(taskId);
  103. }
  104. patentSplitMessage.insert();
  105. allFeatures = this.splitFeature(splitBy, splitType, patentNo, projectId, taskId, patentRights, patentSplitMessage.getId());
  106. }
  107. }
  108. //当重拆时新建
  109. else {
  110. if (patentSplitMessage == null) {
  111. throw new XiaoShiException("未拆分过,请重新选择拆分方式");
  112. }
  113. //更新拆分信息
  114. patentSplitMessage.setCreateTime(new Date());
  115. patentSplitMessage.setCreateId(personnelVO.getId());
  116. patentSplitMessage.updateById();
  117. //清除原本的
  118. this.remove(wrapper);
  119. allFeatures = this.splitFeature(splitBy, splitType, patentNo, projectId, taskId, patentRights, patentSplitMessage.getId());
  120. }
  121. //装载信息并返回
  122. List<PatentRightVo> patentRightVos = new ArrayList<>();
  123. patentRightVos = this.loadPatentRightVO(patentRights, allFeatures, projectId, patentNo);
  124. return patentRightVos;
  125. }
  126. //根据符号拆分字符串
  127. public List<String> splitStringByFlags(String sentence, List<String> flags) {
  128. List<String> sectences = new ArrayList<>();
  129. //如果字符串为空则返回一个包含空字符串的list
  130. if (sentence == null) {
  131. sectences.add("");
  132. return sectences;
  133. }
  134. sectences.add(sentence);
  135. for (int i = 0; i < flags.size(); i++) {
  136. List<String> tem = new ArrayList<>();
  137. for (int t = 0; t < sectences.size(); t++) {
  138. List<String> attrs = Arrays.asList(sectences.get(t).split(flags.get(i)));
  139. for (int v = 0; v < attrs.size(); v++) {
  140. if (v < attrs.size() - 1) {
  141. attrs.set(v, attrs.get(v) + flags.get(i));
  142. }
  143. if (attrs.get(v).equals("其特征在于" + flags.get(i))) {
  144. tem.set(tem.size() - 1, tem.get(tem.size() - 1) + attrs.get(v));
  145. } else {
  146. tem.add(attrs.get(v));
  147. }
  148. }
  149. }
  150. sectences = tem;
  151. }
  152. return sectences;
  153. }
  154. @Transactional(rollbackFor = Exception.class)
  155. public List<RePatentClaim> getRightListByNo(String patentNo) throws IOException {
  156. //从pas获得拆分后的权要
  157. SelectClaimDTO selectClaimDTO = null;
  158. try {
  159. selectClaimDTO = esService.selectClaim(patentNo);
  160. } catch (Exception e) {
  161. throw new XiaoShiException("未查询到权要");
  162. }
  163. if (selectClaimDTO == null) {
  164. throw new XiaoShiException("未查询到权要");
  165. }
  166. String patentRight = selectClaimDTO.getClaim();
  167. PatentRightParams params = new PatentRightParams();
  168. params.setContent(patentRight);
  169. params.setPatentNo(patentNo);
  170. List<RePatentClaim> patentRights = PatentRightUtils.formatPatentRight(params);
  171. patentRights.forEach(item -> {
  172. item.setRightName("权要" + (item.getSort() + 1));
  173. });
  174. return patentRights;
  175. }
  176. //获得专利拆分信息
  177. public QuerySplitVO getSplitMessage(QuerySplitDTO splitDTO) {
  178. QuerySplitVO splitVO = new QuerySplitVO();
  179. //根据项目id和专利号查询拆分信息
  180. LambdaQueryWrapper<ReportProject> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  181. lambdaQueryWrapper.eq(ReportProject::getProjectId, splitDTO.getProjectId());
  182. ReportProject reportProject = reportProjectService.getOne(lambdaQueryWrapper, false);
  183. if (reportProject == null) {
  184. throw new XiaoShiException("未查询到报告");
  185. }
  186. Integer splitType = reportProject.getSplitType();
  187. Integer splitBy = reportProject.getSplitBy();
  188. if (splitBy != null && splitType != null) {
  189. splitVO.setSplitBy(splitBy);
  190. splitVO.setSplitType(splitType);
  191. splitVO.setIfFirst(false);
  192. } else {
  193. splitVO.setSplitBy(0);
  194. splitVO.setSplitType(0);
  195. splitVO.setIfFirst(true);
  196. }
  197. return splitVO;
  198. }
  199. public List<RePatentClaim> getPatentRight(String patentNo) {
  200. try {
  201. List<RePatentClaim> patentRights = this.getRightListByNo(patentNo);
  202. return patentRights;
  203. } catch (Exception e) {
  204. throw new XiaoShiException("系统错误");
  205. }
  206. }
  207. public List<PatentRightTree> getPatentRightTree(String patentNo) {
  208. try {
  209. List<RePatentClaim> patentRights = this.getRightListByNo(patentNo);
  210. List<PatentRightTree> treeNodeList = new ArrayList<>();
  211. //装载权要原文
  212. PatentRightParams params = new PatentRightParams();
  213. params.setPatentNo(patentNo);
  214. params.setContent("");
  215. //判断若处理后的权要集合只有1个元素并且类型type=-1、排序号sort=-1,则表示本次拆分失败,则直接返回整个权要
  216. if (patentRights.size() == 1 && patentRights.get(0).getType() == -1 && patentRights.get(0).getSort() == -1) {
  217. treeNodeList.add(new PatentRightTree(patentRights.get(0).getSort(), null, patentRights.get(0).getContent()));
  218. return treeNodeList;
  219. }
  220. List<PatentRightContent> patentRightContents = this.loadPatentRightContent(patentRights);
  221. for (PatentRightContent patentRightContent : patentRightContents) {
  222. treeNodeList.add(new PatentRightTree(patentRightContent.getSort(), patentRightContent.getParentSorts(), patentRightContent.getContent()));
  223. }
  224. //开始进行权要树装载
  225. try {
  226. TreeBuild treeBuild = new TreeBuild(treeNodeList);
  227. treeNodeList = treeBuild.buildTree();
  228. } catch (Exception e) {
  229. e.printStackTrace();
  230. }
  231. return treeNodeList;
  232. } catch (Exception e) {
  233. throw new XiaoShiException("系统错误");
  234. }
  235. }
  236. private List<PatentRightContent> loadPatentRightContent(List<RePatentClaim> rePatentClaims) {
  237. List<PatentRightContent> patentRightContents = new ArrayList<>();
  238. rePatentClaims.forEach(item -> {
  239. List<Integer> sorts = new ArrayList<>();
  240. String[] a = item.getParentSort().split(",");
  241. for (int i = 0; i < a.length; i++) {
  242. sorts.add(Integer.parseInt(a[i]));
  243. }
  244. PatentRightContent patentRightContent = new PatentRightContent();
  245. patentRightContent.setContent(item.getContent());
  246. patentRightContent.setType(item.getType());
  247. patentRightContent.setSort(item.getSort());
  248. patentRightContent.setParentSorts(sorts);
  249. patentRightContents.add(patentRightContent);
  250. });
  251. return patentRightContents;
  252. }
  253. public List<Feature> splitFeature(Integer splitBy, Integer splitType, String patentNo, Integer projectId, Integer taskId, List<RePatentClaim> patentRights, Integer splitMessageId) throws IOException {
  254. List<Feature> allFeatures = new ArrayList<>();
  255. PersonnelVO personnelVO = new PersonnelVO();
  256. personnelVO.setId("1");
  257. personnelVO.setTenantId(1);
  258. List<String> flags = new ArrayList<>();
  259. List<Integer> partRightSorts = new ArrayList<>(); //权要sorts
  260. if (splitBy == 0) { //当splitBy=0时仅仅根据“,”拆解
  261. flags.add(",");
  262. flags.add(",");
  263. } else if (splitBy == 1) { //当splitBy=1时仅仅根据“;“拆解
  264. flags.add(";");
  265. flags.add(";");
  266. } else if (splitBy == 2) { //当splitBy=2时根据“;“和”,”拆解
  267. flags.add(";");
  268. flags.add(";");
  269. flags.add(",");
  270. flags.add(",");
  271. }
  272. if (splitType.equals(0)) { //当splitType=0仅拆解主权要
  273. partRightSorts = patentRights.stream().filter(item -> item.getType().equals(1)).map(RePatentClaim::getSort).collect(Collectors.toList());
  274. } else if (splitType.equals(1)) { //当splitType=1拆解全部权要
  275. partRightSorts = patentRights.stream().map(RePatentClaim::getSort).collect(Collectors.toList());
  276. }
  277. //遍历权要保存特征
  278. for (int i = 0; i < patentRights.size(); i++) {
  279. List<Feature> featureList = new ArrayList<>();
  280. //根据拆分方式返回特征
  281. List<String> contents = Arrays.asList(patentRights.get(i).getContent());
  282. //如果是需要拆解的权要
  283. if (partRightSorts.contains(patentRights.get(i).getSort())) {
  284. //获得权要的原文并且拆解
  285. contents = this.splitStringByFlags(patentRights.get(i).getContent(), flags);
  286. }
  287. for (int t = 0; t < contents.size(); t++) {
  288. Feature feature = new Feature();
  289. feature.setRightSort(patentRights.get(i).getSort());
  290. feature.setPatentNo(patentNo);
  291. feature.setProjectId(projectId);
  292. feature.setSysOrder(t + 1);
  293. feature.setContent(contents.get(t));
  294. feature.setCreateId(personnelVO.getId());
  295. feature.setRightType(patentRights.get(i).getType());
  296. feature.setTenantId(personnelVO.getTenantId());
  297. feature.setSplitMessageId(splitMessageId);
  298. if (taskId != null) {
  299. feature.setProjectTaskId(taskId);
  300. }
  301. featureList.add(feature);
  302. }
  303. if (featureList.size() > 0) {
  304. this.saveBatch(featureList);
  305. allFeatures.addAll(featureList);
  306. }
  307. }
  308. return allFeatures;
  309. }
  310. public List<PatentRightVo> loadPatentRightVO(List<RePatentClaim> patentRights, List<Feature> allFeatures, Integer projectId, String patentNo) {
  311. List<PatentRightVo> patentRightVos = new ArrayList<>();
  312. //将拆解的权要和特征装载到对象PatentRightVo
  313. for (int i = 0; i < patentRights.size(); i++) {
  314. List<Feature> featureList = new ArrayList<>();
  315. Integer sort = patentRights.get(i).getSort();
  316. featureList = allFeatures.stream().filter(item -> item.getRightSort().equals(sort)).collect(Collectors.toList());
  317. PatentRightVo patentRightVo = new PatentRightVo();
  318. patentRightVo.setPatentNo(patentRights.get(i).getPatentNo());
  319. patentRightVo.setFeatures(featureList);
  320. patentRightVo.setContent(patentRights.get(i).getContent());
  321. patentRightVo.setSort(patentRights.get(i).getSort() + 1);
  322. patentRightVo.setType(patentRights.get(i).getType());
  323. patentRightVo.setContentOut(patentRights.get(i).getContentOut());
  324. patentRightVo.setProjectId(projectId);
  325. patentRightVo.setRightName("权要" + (sort + 1));
  326. patentRightVo.setSignPatentNo(patentNo);
  327. patentRightVos.add(patentRightVo);
  328. }
  329. return patentRightVos;
  330. }
  331. public Records queryClaimSplitHistory(QueryClaimSplitHistoryDTO queryClaimSplitHistoryDTO) {
  332. List<QueryClaimSplitHistoryVO> queryClaimSplitHistoryVOS = new ArrayList<>();
  333. Integer claimId = queryClaimSplitHistoryDTO.getClaimId();
  334. Long current = queryClaimSplitHistoryDTO.getCurrent();
  335. Long size = queryClaimSplitHistoryDTO.getSize();
  336. //根据id查询无效发条
  337. LambdaQueryWrapper<InvalidStatutes> queryWrapper = new LambdaQueryWrapper<>();
  338. queryWrapper.eq(InvalidStatutes::getClaimId, claimId);
  339. List<InvalidStatutes> invalidStatutes = invalidStatutesService.list(queryWrapper);
  340. //根据无效发条查询证据组合
  341. if (invalidStatutes.size() != 0) {
  342. List<Integer> statutesIds = invalidStatutes.stream().map(InvalidStatutes::getId).collect(Collectors.toList());
  343. //根据无效法条id查询证据组合
  344. LambdaQueryWrapper<ProofGroup> queryWrapper1 = new LambdaQueryWrapper<>();
  345. queryWrapper1.in(ProofGroup::getInvalidStatutesId, statutesIds);
  346. List<ProofGroup> proofGroups = proofGroupService.list(queryWrapper1);
  347. if (proofGroups.size() > 0) {
  348. proofGroups.forEach(item -> {
  349. //根据id 查询特征
  350. Integer groupId = item.getId();
  351. LambdaQueryWrapper<AssoGroupFeature> queryWrapper2 = new LambdaQueryWrapper<>();
  352. queryWrapper2.eq(AssoGroupFeature::getGroupId, groupId);
  353. List<AssoGroupFeature> assoGroupFeatures = assoGroupFeatureService.list(queryWrapper2);
  354. if (assoGroupFeatures != null && assoGroupFeatures.size() != 0) {
  355. List<Integer> featureIds = assoGroupFeatures.stream().map(AssoGroupFeature::getFeatureId).collect(Collectors.toList());
  356. if (featureIds.size() != 0) {
  357. LambdaQueryWrapper<Feature> queryWrapper3 = new LambdaQueryWrapper<>();
  358. queryWrapper3.in(Feature::getId, featureIds);
  359. List<Feature> featureList = this.list(queryWrapper3);
  360. if (featureList.size() != 0) {
  361. QueryClaimSplitHistoryVO queryClaimSplitHistoryVO = new QueryClaimSplitHistoryVO();
  362. List<QueryClaimSplitHistoryVO.GroupFeature> features = new ArrayList<>();
  363. featureList.forEach(i -> {
  364. QueryClaimSplitHistoryVO.GroupFeature tem = new QueryClaimSplitHistoryVO.GroupFeature();
  365. tem.setFeatureText(i.getContent());
  366. tem.setId(i.getId());
  367. AssoGroupFeature assoGroupFeature = assoGroupFeatures.stream().filter(t -> t.getFeatureId().equals(i.getId())).findFirst().orElse(null);
  368. if (assoGroupFeature != null) {
  369. tem.setSysOrder(assoGroupFeature.getFeatureOrder());
  370. }
  371. features.add(tem);
  372. });
  373. queryClaimSplitHistoryVO.setFeatureSplitContent(features);
  374. queryClaimSplitHistoryVOS.add(queryClaimSplitHistoryVO);
  375. }
  376. }
  377. }
  378. });
  379. }
  380. }
  381. Records records = new Records();
  382. records.setData(queryClaimSplitHistoryVOS);
  383. return records;
  384. }
  385. /**
  386. * 获得已经拆分过的特征
  387. *
  388. * @param splitVO
  389. */
  390. public List<Feature> getSplitedFeature(SplitVO splitVO) {
  391. List<PatentRightVo> patentRightVos = new ArrayList<>();
  392. Integer projectId = splitVO.getProjectId();
  393. String patentNo = splitVO.getPatentNo();
  394. //当未传入专利号时,从报告里拿标的专利
  395. if (patentNo == null || patentNo.equals("")) {
  396. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  397. queryWrapper.eq(ReportProject::getProjectId, projectId);
  398. ReportProject reportProject = reportProjectService.getOne(queryWrapper, false);
  399. if (reportProject == null) {
  400. throw new XiaoShiException("未查到报告");
  401. }
  402. patentNo = reportProject.getSignPatentNo();
  403. }
  404. LambdaQueryWrapper<PatentSplitMessage> splitWrapper = new LambdaQueryWrapper<>();
  405. splitWrapper.eq(PatentSplitMessage::getPatentNo, patentNo);
  406. splitWrapper.eq(PatentSplitMessage::getProjectId, projectId);
  407. PatentSplitMessage patentSplitMessage = patentSplitMessageService.getOne(splitWrapper, false);
  408. LambdaQueryWrapper<Feature> wrapper = new LambdaQueryWrapper<>();
  409. wrapper.eq(Feature::getProjectId, projectId)
  410. .eq(Feature::getPatentNo, patentNo)
  411. .eq(Feature::getSplitMessageId, patentSplitMessage.getId());
  412. List<Feature> allFeatures = this.list(wrapper);
  413. return allFeatures;
  414. }
  415. public void saveBatchFeature(UpdateFeatureDTO updateFeatureDTO) {
  416. List<UpdateFeatureDTO.ChangedFeatures> features = updateFeatureDTO.getFeaturesList();
  417. Integer projectId = updateFeatureDTO.getProjectId();
  418. if (features == null) {
  419. features = new ArrayList<>();
  420. }
  421. if (projectId == null) {
  422. throw new XiaoShiException("未选择报告");
  423. }
  424. LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
  425. queryWrapper.eq(ReportProject::getProjectId, projectId);
  426. ReportProject reportProject = reportProjectService.getOne(queryWrapper, false);
  427. if (reportProject == null) {
  428. throw new XiaoShiException("报告不存在");
  429. }
  430. String signPatentNo = reportProject.getSignPatentNo();
  431. //根据标的专利号和报告id查询拆分信息
  432. LambdaQueryWrapper<PatentSplitMessage> queryWrapper1 = new LambdaQueryWrapper<>();
  433. queryWrapper1.eq(PatentSplitMessage::getPatentNo, signPatentNo)
  434. .eq(PatentSplitMessage::getProjectId, projectId);
  435. PatentSplitMessage patentSplitMessage =patentSplitMessageService.getOne(queryWrapper1,false);
  436. if(patentSplitMessage==null){
  437. throw new XiaoShiException("未进行拆分过");
  438. }
  439. }
  440. }