FinalInvalidStatueService.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. package cn.cslg.pas.service;
  2. import cn.cslg.pas.common.dto.FinalProofGroupDTO;
  3. import cn.cslg.pas.common.dto.InvalidReasonDTO;
  4. import cn.cslg.pas.common.dto.GetInvalidReasonClaimsDTO;
  5. import cn.cslg.pas.common.dto.invalidDTO.PatentClaimDTO;
  6. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  7. import cn.cslg.pas.common.model.finalInvalid.FinalProfGroupEditDTO;
  8. import cn.cslg.pas.common.model.finalInvalid.FinalProfGroupQueryDTO;
  9. import cn.cslg.pas.common.model.finalInvalid.FinalProfGroupVO;
  10. import cn.cslg.pas.common.utils.CacheUtils;
  11. import cn.cslg.pas.common.utils.LoginUtils;
  12. import cn.cslg.pas.common.vo.GetInvalidReasonClaimsVO;
  13. import cn.cslg.pas.common.vo.invalidVO.PatentClaimHistoryVO;
  14. import cn.cslg.pas.domain.BaseEntity;
  15. import cn.cslg.pas.domain.FinalInvalidStatue;
  16. import cn.cslg.pas.domain.FinalProofGroup;
  17. import cn.cslg.pas.domain.business.InvalidStatutes;
  18. import cn.cslg.pas.exception.XiaoShiException;
  19. import cn.cslg.pas.mapper.FinalInvalidStatueMapper;
  20. import cn.cslg.pas.mapper.FinalProofGroupMapper;
  21. import cn.cslg.pas.service.business.InvalidStatutesService;
  22. import cn.cslg.pas.service.business.ProofGroupService;
  23. import cn.cslg.pas.service.business.invalidReport.PatentClaimHistoryService;
  24. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  25. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  26. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  27. import lombok.RequiredArgsConstructor;
  28. import org.apache.commons.lang3.ObjectUtils;
  29. import org.apache.commons.lang3.StringUtils;
  30. import org.springframework.beans.BeanUtils;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Propagation;
  34. import org.springframework.transaction.annotation.Transactional;
  35. import org.springframework.util.CollectionUtils;
  36. import java.util.*;
  37. import java.util.stream.Collectors;
  38. /**
  39. * @author admin
  40. * @description 针对表【final_invalid_statue(最终无效理由和证据)】的数据库操作Service实现
  41. * @createDate 2024-06-20 17:09:07
  42. */
  43. @Service
  44. @RequiredArgsConstructor
  45. public class FinalInvalidStatueService extends ServiceImpl<FinalInvalidStatueMapper, FinalInvalidStatue> {
  46. private final InvalidStatutesService invalidStatutesService;
  47. private final PatentClaimHistoryService patentClaimHistoryService;
  48. private static List<Integer> inStatueIds = Arrays.asList(2, 3, 4);
  49. private final ProofGroupService proofGroupService;
  50. private final FinalProofGroupService finalProofGroupService;
  51. private final FinalInvalidStatueMapper invalidStatueMapper;
  52. private final FinalProofGroupMapper proofGroupMapper;
  53. @Autowired
  54. private CacheUtils cacheUtils;
  55. @Autowired
  56. private LoginUtils loginUtils;
  57. public void ImportByProjectId(Integer projectId, Integer statueType) {
  58. }
  59. @Transactional(rollbackFor = Exception.class)
  60. public void importFinalInvalidStatutes(Integer projectId) {
  61. //删除原来保存数据
  62. this.removeFinalInvalidStatus(projectId);
  63. //根据projectId 查询无效理由和证据
  64. LambdaQueryWrapper<InvalidStatutes> queryWrapper = new LambdaQueryWrapper<>();
  65. queryWrapper.eq(InvalidStatutes::getProjectId, projectId);
  66. List<InvalidStatutes> invalidStatutes = invalidStatutesService.list(queryWrapper);
  67. for (InvalidStatutes invalidStatute : invalidStatutes) {
  68. FinalInvalidStatue finalInvalidStatue = new FinalInvalidStatue();
  69. Integer claimId = invalidStatute.getClaimId();
  70. finalInvalidStatue.setStatuteId(invalidStatute.getStatutesId());
  71. Map<String, String> claimMess = this.getClaimText(claimId);
  72. finalInvalidStatue.setClaimText(claimMess.get("claimText"));
  73. finalInvalidStatue.setCourtOpinions1(claimMess.get("court1"));
  74. finalInvalidStatue.setCourtOpinions2(claimMess.get("court2"));
  75. if (claimMess.get("index") != null) {
  76. Integer index = Integer.parseInt(claimMess.get("index").toString());
  77. finalInvalidStatue.setClaimOrder(index);
  78. }
  79. finalInvalidStatue.setProjectId(projectId);
  80. finalInvalidStatue.insert();
  81. finalProofGroupService.addFinalProofGroup(invalidStatute.getId(), finalInvalidStatue);
  82. }
  83. }
  84. public Map<String, String> getClaimText(Integer claimId) {
  85. String claimText = "";
  86. PatentClaimDTO patentClaimDTO = new PatentClaimDTO();
  87. patentClaimDTO.setClaimId(claimId);
  88. PatentClaimHistoryVO patentClaimHistoryVO = patentClaimHistoryService.queryPatentClaimHistory(patentClaimDTO);
  89. if (patentClaimHistoryVO.getSecondClaimVO() != null && patentClaimHistoryVO.getSecondClaimVO().getOperateType().equals(0)) {
  90. claimText = patentClaimHistoryVO.getSecondClaimVO().getContent();
  91. } else if (patentClaimHistoryVO.getFirstClaimVO() != null && patentClaimHistoryVO.getFirstClaimVO().getOperateType().equals(0)) {
  92. claimText = patentClaimHistoryVO.getFirstClaimVO().getContent();
  93. } else {
  94. claimText = patentClaimHistoryVO.getOriginalClaimVO().getContent();
  95. }
  96. Map<String, String> map = new HashMap<>();
  97. map.put("claimText", claimText);
  98. map.put("court1", patentClaimHistoryVO.getOriginalClaimVO().getCourtDecision1());
  99. map.put("court2", patentClaimHistoryVO.getOriginalClaimVO().getCourtDecision2());
  100. if (patentClaimHistoryVO.getOriginalClaimVO().getSysOrder() != null) {
  101. map.put("index", patentClaimHistoryVO.getOriginalClaimVO().getSysOrder().toString());
  102. }
  103. return map;
  104. }
  105. public List<FinalProfGroupVO> queryFinalProofGroup(FinalProfGroupQueryDTO finalProfGroupQueryDTO) {
  106. List<FinalProfGroupVO> finalProfGroupVOS = new ArrayList<>();
  107. Integer projectId = finalProfGroupQueryDTO.getId();
  108. Integer statusType = finalProfGroupQueryDTO.getStatueType();
  109. //根据projectId查询最终无效理由和证据
  110. LambdaQueryWrapper<FinalInvalidStatue> queryWrapper = new LambdaQueryWrapper<>();
  111. queryWrapper.eq(FinalInvalidStatue::getProjectId, projectId)
  112. .orderByAsc(FinalInvalidStatue::getStatuteId)
  113. .orderByAsc(FinalInvalidStatue::getClaimOrder);
  114. if (statusType != null) {
  115. if (statusType.equals(1)) {
  116. queryWrapper.in(FinalInvalidStatue::getStatuteId, inStatueIds);
  117. } else {
  118. queryWrapper.notIn(FinalInvalidStatue::getStatuteId, inStatueIds);
  119. }
  120. }
  121. List<FinalInvalidStatue> finalInvalidStatues = this.list(queryWrapper);
  122. if (finalInvalidStatues.size() == 0) {
  123. return finalProfGroupVOS;
  124. }
  125. List<Integer> ids = finalInvalidStatues.stream().map(FinalInvalidStatue::getId).collect(Collectors.toList());
  126. List<FinalProofGroup> finalProofGroups = new ArrayList<>();
  127. LambdaQueryWrapper<FinalProofGroup> queryWrapper1 = new LambdaQueryWrapper<>();
  128. queryWrapper1.in(FinalProofGroup::getFinalInvalidStatueId, ids);
  129. finalProofGroups = finalProofGroupService.list(queryWrapper1);
  130. for (FinalInvalidStatue finalInvalidStatue : finalInvalidStatues) {
  131. Integer id = finalInvalidStatue.getId();
  132. List<FinalProofGroup> statueGroups = finalProofGroups.stream().filter(item -> item.getFinalInvalidStatueId().equals(id)).collect(Collectors.toList());
  133. statueGroups.forEach(item -> {
  134. FinalProfGroupVO finalProfGroupVO = new FinalProfGroupVO();
  135. if (finalInvalidStatue != null) {
  136. finalProfGroupVO.setInvalidStatue(finalInvalidStatue);
  137. }
  138. finalProfGroupVO.setId(item.getId());
  139. finalProfGroupVO.setPresentOpinions(item.getPresentOpinions());
  140. finalProfGroupVO.setInvalidReason(item.getInvalidReason());
  141. finalProfGroupVO.setRbDecision(item.getRbDecision());
  142. finalProfGroupVOS.add(finalProfGroupVO);
  143. });
  144. }
  145. return finalProfGroupVOS;
  146. }
  147. public void editProofGroup(FinalProfGroupEditDTO finalProfGroupEditDTO) {
  148. Integer invalidStatueId = finalProfGroupEditDTO.getInvalidStatueId();
  149. Integer proofGroupId = finalProfGroupEditDTO.getProofGroupId();
  150. String editField = finalProfGroupEditDTO.getEditField();
  151. String fieldContent = finalProfGroupEditDTO.getFieldContent();
  152. switch (editField) {
  153. case "invalidReason":
  154. FinalProofGroup finalProofGroup1 = finalProofGroupService.getById(proofGroupId);
  155. finalProofGroup1.setInvalidReason(fieldContent);
  156. finalProofGroup1.updateById();
  157. break;
  158. case "presentOpinions":
  159. FinalProofGroup finalProofGroup2 = finalProofGroupService.getById(proofGroupId);
  160. finalProofGroup2.setPresentOpinions(fieldContent);
  161. finalProofGroup2.updateById();
  162. break;
  163. case "rbDecision":
  164. FinalProofGroup finalProofGroup3 = finalProofGroupService.getById(proofGroupId);
  165. finalProofGroup3.setRbDecision(fieldContent);
  166. finalProofGroup3.updateById();
  167. break;
  168. case "courtOpinions1":
  169. FinalInvalidStatue finalInvalidStatue1 = this.getById(invalidStatueId);
  170. Integer claimOrder = finalInvalidStatue1.getClaimOrder();
  171. UpdateWrapper<FinalInvalidStatue> updateWrapper = new UpdateWrapper<>();
  172. // Lambda表达式
  173. updateWrapper.lambda().set(FinalInvalidStatue::getCourtOpinions1, fieldContent)
  174. .eq(FinalInvalidStatue::getClaimOrder, claimOrder)
  175. .eq(FinalInvalidStatue::getProjectId, finalInvalidStatue1.getProjectId());
  176. this.update(updateWrapper);
  177. break;
  178. case "courtOpinions2":
  179. FinalInvalidStatue finalInvalidStatue2 = this.getById(invalidStatueId);
  180. Integer claimOrder2 = finalInvalidStatue2.getClaimOrder();
  181. UpdateWrapper<FinalInvalidStatue> updateWrapper2 = new UpdateWrapper<>();
  182. // Lambda表达式
  183. updateWrapper2.lambda().set(FinalInvalidStatue::getCourtOpinions2, fieldContent)
  184. .eq(FinalInvalidStatue::getClaimOrder, claimOrder2)
  185. .eq(FinalInvalidStatue::getProjectId, finalInvalidStatue2.getProjectId());
  186. this.update(updateWrapper2);
  187. break;
  188. case "claimText":
  189. FinalInvalidStatue finalInvalidStatue3 = this.getById(invalidStatueId);
  190. Integer claimOrder3 = finalInvalidStatue3.getClaimOrder();
  191. UpdateWrapper<FinalInvalidStatue> updateWrapper3 = new UpdateWrapper<>();
  192. // Lambda表达式
  193. updateWrapper3.lambda().set(FinalInvalidStatue::getClaimText, fieldContent)
  194. .eq(FinalInvalidStatue::getClaimOrder, claimOrder3)
  195. .eq(FinalInvalidStatue::getProjectId, finalInvalidStatue3.getProjectId());
  196. this.update(updateWrapper3);
  197. break;
  198. case "statuteId":
  199. FinalInvalidStatue finalInvalidStatue4 = this.getById(invalidStatueId);
  200. finalInvalidStatue4.setStatuteId(Integer.parseInt(fieldContent));
  201. finalInvalidStatue4.updateById();
  202. }
  203. }
  204. public void removeFinalInvalidStatus(Integer projectId) {
  205. LambdaQueryWrapper<FinalInvalidStatue> queryWrapper = new LambdaQueryWrapper<>();
  206. queryWrapper.eq(FinalInvalidStatue::getProjectId, projectId);
  207. LambdaQueryWrapper<FinalProofGroup> queryWrapper1 = new LambdaQueryWrapper<>();
  208. queryWrapper1.eq(FinalProofGroup::getProjectId, projectId);
  209. this.remove(queryWrapper);
  210. finalProofGroupService.remove(queryWrapper1);
  211. }
  212. /**
  213. * 添加无效理由
  214. * @param vo
  215. * @return
  216. */
  217. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  218. public Integer addInvalidReason(InvalidReasonDTO vo) {
  219. final Integer claimSort = vo.getClaimSort();
  220. final Integer statuteId = vo.getStatuteId();
  221. final String claimText = vo.getClaimText();
  222. final Long count = invalidStatueMapper.selectCount(new LambdaQueryWrapper<FinalInvalidStatue>()
  223. .eq(FinalInvalidStatue::getStatuteId, statuteId)
  224. .eq(FinalInvalidStatue::getClaimOrder, claimSort));
  225. if (count > 0) {
  226. throw new XiaoShiException("该法条下已存在相同权利要求");
  227. }
  228. FinalInvalidStatue statue = new FinalInvalidStatue();
  229. statue.setStatuteId(statuteId);
  230. statue.setClaimOrder(claimSort);
  231. statue.setClaimText(claimText);
  232. statue.setProjectId(vo.getProjectId());
  233. //获取登陆人信息 用于设置创建人
  234. PersonnelVO personnelVO = new PersonnelVO();
  235. personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  236. if (ObjectUtils.isEmpty(personnelVO)) {
  237. throw new XiaoShiException("未获取到创建人");
  238. }
  239. statue.setCreateId(personnelVO.getId());
  240. statue.setCreateTime(new Date());
  241. statue.insert();
  242. return statue.getId();
  243. }
  244. /**
  245. * 查询三性/非三性无效理由
  246. * @param vo
  247. * @return
  248. */
  249. public List<GetInvalidReasonClaimsVO> getInvalidReasonClaims(GetInvalidReasonClaimsDTO vo) {
  250. List<GetInvalidReasonClaimsVO> claimsVOS = new ArrayList<>();
  251. Integer projectId = vo.getProjectId();
  252. Integer statusType = vo.getStatueType();
  253. //根据projectId查询最终无效理由和证据
  254. LambdaQueryWrapper<FinalInvalidStatue> queryWrapper = new LambdaQueryWrapper<>();
  255. queryWrapper.eq(FinalInvalidStatue::getProjectId, projectId)
  256. .orderByAsc(FinalInvalidStatue::getStatuteId)
  257. .orderByAsc(FinalInvalidStatue::getClaimOrder);
  258. if (statusType != null) {
  259. if (statusType == 1) {
  260. queryWrapper.in(FinalInvalidStatue::getStatuteId, inStatueIds);
  261. } else {
  262. queryWrapper.notIn(FinalInvalidStatue::getStatuteId, inStatueIds);
  263. }
  264. }
  265. List<FinalInvalidStatue> statueList = this.list(queryWrapper);
  266. if (CollectionUtils.isEmpty(statueList)) {
  267. return claimsVOS;
  268. }
  269. List<Integer> invalidStatueIds = statueList.stream().map(FinalInvalidStatue::getId).collect(Collectors.toList());
  270. List<FinalProofGroup> proofGroups = proofGroupMapper.selectList(new LambdaQueryWrapper<FinalProofGroup>()
  271. .in(FinalProofGroup::getFinalInvalidStatueId, invalidStatueIds)
  272. .orderByAsc(FinalProofGroup::getFeatureSort));
  273. for (FinalInvalidStatue statue : statueList) {
  274. Integer invalidStatueId = statue.getId();
  275. List<FinalProofGroup> statueGroups = proofGroups.stream().filter(item -> item.getFinalInvalidStatueId().equals(invalidStatueId)).collect(Collectors.toList());
  276. // List<FinalProofGroup> statueGroups = proofGroups.stream().filter(item -> item.getFinalInvalidStatueId().equals(invalidStatueId))
  277. // .filter(i -> i.getFeatureSort() != null).sorted(Comparator.comparing(FinalProofGroup::getFeatureSort)).collect(Collectors.toList());
  278. statueGroups.forEach(item -> {
  279. GetInvalidReasonClaimsVO claimsVO = new GetInvalidReasonClaimsVO();
  280. InvalidReasonDTO invalidReasonDTO = new InvalidReasonDTO();
  281. invalidReasonDTO.setInvalidStatueId(statue.getId());
  282. invalidReasonDTO.setStatuteId(statue.getStatuteId());
  283. invalidReasonDTO.setProjectId(statue.getProjectId());
  284. invalidReasonDTO.setClaimSort(statue.getClaimOrder());
  285. invalidReasonDTO.setClaimText(statue.getClaimText());
  286. claimsVO.setInvalidReasonDTO(invalidReasonDTO);
  287. claimsVO.setProofGroupId(item.getId());
  288. claimsVO.setInvalidStatueId(statue.getId());
  289. claimsVO.setProjectId(item.getProjectId());
  290. claimsVO.setInvalidReason(item.getInvalidReason());
  291. claimsVO.setPresentOpinions(item.getPresentOpinions());
  292. claimsVO.setRbDecision(item.getRbDecision());
  293. claimsVO.setFeatureSort(item.getFeatureSort());
  294. claimsVO.setFeatureContent(item.getFeatureContent());
  295. claimsVO.setCourtOpinions1(item.getCourtOpinions1());
  296. claimsVO.setCourtOpinions2(item.getCourtOpinions2());
  297. claimsVOS.add(claimsVO);
  298. });
  299. }
  300. return claimsVOS;
  301. }
  302. /**
  303. * 修改无效理由
  304. * @param vo
  305. * @return
  306. */
  307. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  308. public Integer editInvalidReason(InvalidReasonDTO vo) {
  309. final Integer claimSort = vo.getClaimSort();
  310. final Integer statuteId = vo.getStatuteId();
  311. final String claimText = vo.getClaimText();
  312. final Long count = invalidStatueMapper.selectCount(new LambdaQueryWrapper<FinalInvalidStatue>()
  313. .eq(FinalInvalidStatue::getStatuteId, statuteId)
  314. .eq(FinalInvalidStatue::getClaimOrder, claimSort));
  315. if (count > 0) {
  316. throw new XiaoShiException("该法条下已存在相同权利要求");
  317. }
  318. FinalInvalidStatue statue = invalidStatueMapper.selectById(vo.getInvalidStatueId());
  319. statue.setStatuteId(statuteId);
  320. statue.setClaimOrder(claimSort);
  321. statue.setClaimText(claimText);
  322. statue.setProjectId(vo.getProjectId());
  323. statue.updateById();
  324. return statue.getId();
  325. }
  326. /**
  327. * 删除无效理由
  328. * @param vo
  329. */
  330. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  331. public void delInvalidReason(InvalidReasonDTO vo) {
  332. Integer invalidStatueId = vo.getInvalidStatueId();
  333. List<FinalProofGroup> proofGroups = proofGroupMapper.selectList(new LambdaQueryWrapper<FinalProofGroup>()
  334. .eq(FinalProofGroup::getFinalInvalidStatueId, invalidStatueId));
  335. if (!CollectionUtils.isEmpty(proofGroups)) {
  336. List<Integer> list = proofGroups.stream().map(BaseEntity::getId).collect(Collectors.toList());
  337. proofGroupMapper.deleteBatchIds(list);
  338. }
  339. invalidStatueMapper.deleteById(invalidStatueId);
  340. }
  341. /**
  342. * 添加特征
  343. * @param vo
  344. * @return
  345. */
  346. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  347. public Integer addFeature(FinalProofGroupDTO vo) {
  348. editProofSort(vo.getInvalidStatueId(), vo.getFeatureSort(), 1);
  349. FinalProofGroup proofGroup = new FinalProofGroup();
  350. proofGroup.setFinalInvalidStatueId(vo.getInvalidStatueId());
  351. BeanUtils.copyProperties(vo, proofGroup);
  352. //获取登陆人信息 用于设置创建人
  353. PersonnelVO personnelVO = new PersonnelVO();
  354. personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  355. if (ObjectUtils.isEmpty(personnelVO)) {
  356. throw new XiaoShiException("未获取到创建人");
  357. }
  358. proofGroup.setCreateId(personnelVO.getId());
  359. proofGroup.setCreateTime(new Date());
  360. proofGroup.insert();
  361. return proofGroup.getId();
  362. }
  363. /**
  364. * 修改特征序号
  365. * @param invalidStatueId
  366. * @param featureSort
  367. * @param type
  368. */
  369. public void editProofSort(Integer invalidStatueId, Integer featureSort, Integer type) {
  370. List<FinalProofGroup> proofGroups = proofGroupMapper.selectList(new LambdaQueryWrapper<FinalProofGroup>()
  371. .eq(FinalProofGroup::getFinalInvalidStatueId, invalidStatueId)
  372. .ge(FinalProofGroup::getFeatureSort, featureSort));
  373. if (!CollectionUtils.isEmpty(proofGroups)) {
  374. for (FinalProofGroup proofGroup : proofGroups) {
  375. proofGroup.setId(proofGroup.getId());
  376. if (type == 1) {
  377. proofGroup.setFeatureSort(featureSort + 1);
  378. } else {
  379. proofGroup.setFeatureSort(featureSort - 1);
  380. }
  381. proofGroup.updateById();
  382. }
  383. }
  384. }
  385. /**
  386. * 编辑特征
  387. * @param vo
  388. * @return
  389. */
  390. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  391. public Integer editFeature(FinalProofGroupDTO vo) {
  392. FinalProofGroup proofGroup = proofGroupMapper.selectById(vo.getProofGroupId());
  393. proofGroup.setFinalInvalidStatueId(vo.getInvalidStatueId());
  394. BeanUtils.copyProperties(vo, proofGroup);
  395. proofGroup.updateById();
  396. return proofGroup.getId();
  397. }
  398. /**
  399. * 删除特征
  400. * @param vo
  401. */
  402. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  403. public void delFeature(FinalProofGroupDTO vo) {
  404. FinalProofGroup proofGroup = proofGroupMapper.selectById(vo.getProofGroupId());
  405. editProofSort(proofGroup.getFinalInvalidStatueId(), proofGroup.getFeatureSort(), 2);
  406. proofGroupMapper.deleteById(proofGroup.getId());
  407. }
  408. }