xiexiang 1 năm trước cách đây
mục cha
commit
ef4d5905e1

+ 4 - 1
src/main/java/cn/cslg/pas/common/dto/business/GetFeatureSplitDTO.java

@@ -1,6 +1,5 @@
 package cn.cslg.pas.common.dto.business;
 
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 /**
@@ -15,6 +14,10 @@ public class GetFeatureSplitDTO {
      */
     private Integer projectId;
 
+    private String patentNo;
+
+    private Integer taskId;
+
     /**
      * 是否重拆
      */

+ 8 - 0
src/main/java/cn/cslg/pas/common/dto/business/TortCompareRecordDTO.java

@@ -16,9 +16,17 @@ public class TortCompareRecordDTO {
      */
     private Integer projectId;
 
+    /**
+     * 专利号
+     */
     private Integer taskId;
 
     /**
+     * 专利号
+     */
+    private String patentNo;
+
+    /**
      * 特征与侵权分析对比结果DTO
      */
     private List<TortDTO> tortDTOS;

+ 1 - 0
src/main/java/cn/cslg/pas/common/dto/business/TortDTO.java

@@ -39,4 +39,5 @@ public class TortDTO {
      */
     private Integer compareResult;
 
+    private Boolean ifChange;
 }

+ 120 - 0
src/main/java/cn/cslg/pas/controller/FTOController.java

@@ -0,0 +1,120 @@
+package cn.cslg.pas.controller;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.business.GetFeatureSplitDTO;
+import cn.cslg.pas.common.dto.business.ProductMessageDTO;
+import cn.cslg.pas.common.dto.business.TortCompareRecordDTO;
+import cn.cslg.pas.common.dto.business.TortTaskDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.common.vo.business.ProductMessageVO;
+import cn.cslg.pas.common.vo.business.TortCompareRecordVO;
+import cn.cslg.pas.exception.ConditionException;
+import cn.cslg.pas.exception.UnLoginException;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.business.FTOCompareRecordService;
+import cn.cslg.pas.service.business.ProductMessageService;
+import cn.cslg.pas.service.business.ProjectTaskService;
+import cn.cslg.pas.service.business.TortCompareRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * FTOTort
+ * @Author xiexiang
+ * @Date 2023/12/8
+ */
+@Slf4j
+@RequestMapping(Constants.API_XiaoSHI + "/fto")
+@RestController
+public class FTOController {
+    @Autowired
+    private TortCompareRecordService tortCompareRecordService;
+
+    @Autowired
+    private FTOCompareRecordService ftoCompareRecordService;
+
+    @Autowired
+    private ProjectTaskService projectTaskService;
+
+    @Operation(summary = "发起人查询侵权分析对比结果(包含拆分特征)")
+    @PostMapping("/getFTOCompareRecord")
+    public Response getFTOCompareRecord(@RequestBody GetFeatureSplitDTO getFeatureSplitDTO) throws Exception {
+        TortCompareRecordVO tortCompareRecordVO = ftoCompareRecordService.getTortCompareRecord(getFeatureSplitDTO);
+        return Response.success(tortCompareRecordVO);
+    }
+
+    @Operation(summary = "保存侵权对比结果")
+    @PostMapping("/addTortCompareRecord")
+    public Response addTortCompareRecord(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
+        if (tortCompareRecordDTO != null) {
+            List<Integer> ids = new ArrayList<>();
+            try {
+                ids = tortCompareRecordService.addTortCompareRecord(tortCompareRecordDTO);
+            } catch (Exception e) {
+                if (e instanceof XiaoShiException) {
+                    return Response.error(e.getMessage());
+                } else if (e instanceof UnLoginException) {
+                    return Response.unLogin(e.getMessage());
+                } else if (e instanceof ConditionException) {
+                    return Response.conditionError(e.getMessage());
+                }
+            }
+            Records records = new Records();
+            records.setData(ids);
+            return Response.success(records);
+        } else {
+            return Response.error("入参为null");
+        }
+    }
+
+
+
+    @Operation(summary = "添加侵权分析协同任务")
+    @PostMapping("/addTortTask")
+    public Response addTortTask(@RequestBody TortTaskDTO tortTaskDTO){
+        Integer id = projectTaskService.addTortTask(tortTaskDTO);
+        Records records = new Records();
+        records.setData(id);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "保存侵权分析协同任务对比结果")
+    @PostMapping("/addTortTaskResult")
+    public Response addTortTaskResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
+        List<Integer> ids = tortCompareRecordService.addTortTaskResult(tortCompareRecordDTO);
+        Records records = new Records();
+        records.setData(ids);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "查询侵权分析协同前后对比结果")
+    @GetMapping("/getAllTortTaskResult")
+    public Response getAllTortTaskResult(Integer taskId){
+        Integer type = 1;
+        TortCompareRecordVO tortCompareRecordVO = tortCompareRecordService.getAllTortTaskResult(null, taskId, type);
+        return Response.success(tortCompareRecordVO);
+    }
+
+    @Operation(summary = "确认侵权分析对比结果")
+    @PostMapping("/addFinalTortResult")
+    public Response addFinalTortResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
+        List<Integer> ids = tortCompareRecordService.addFinalTortResult(tortCompareRecordDTO);
+        Records records = new Records();
+        records.setData(ids);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "查询最终结果")
+    @GetMapping("/getTortFinalResult")
+    public Response getTortFinalResult(Integer projectId, Integer taskId){
+        Integer type = 2;
+        TortCompareRecordVO tortCompareRecordVO = tortCompareRecordService.getAllTortTaskResult(projectId, taskId, type);
+        return Response.success(tortCompareRecordVO);
+    }
+}

+ 4 - 4
src/main/java/cn/cslg/pas/controller/TortController.java

@@ -54,7 +54,7 @@ public class TortController {
         return Response.success(records);
     }
 
-    @Operation(summary = "保存侵权对比结果")
+    @Operation(summary = "保存侵权分析对比结果")
     @PostMapping("/addTortCompareRecord")
     public Response addTortCompareRecord(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
         if (tortCompareRecordDTO != null) {
@@ -78,7 +78,7 @@ public class TortController {
         }
     }
 
-    @Operation(summary = "发起人查询侵权分析对比结果(包含拆分特征)")
+    @Operation(summary = "查询侵权分析对比结果(包含拆分特征)")
     @PostMapping("/getTortCompareRecord")
     public Response getTortCompareRecord(@RequestBody GetFeatureSplitDTO getFeatureSplitDTO) throws Exception {
         TortCompareRecordVO tortCompareRecordVO = tortCompareRecordService.getTortCompareRecord(getFeatureSplitDTO);
@@ -94,7 +94,7 @@ public class TortController {
         return Response.success(records);
     }
 
-    @Operation(summary = "保存侵权分析协同任务对比结果")
+    @Operation(summary = "保存协同任务对比结果")
     @PostMapping("/addTortTaskResult")
     public Response addTortTaskResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
         List<Integer> ids = tortCompareRecordService.addTortTaskResult(tortCompareRecordDTO);
@@ -111,7 +111,7 @@ public class TortController {
         return Response.success(tortCompareRecordVO);
     }
 
-    @Operation(summary = "确认侵权分析对比结果")
+    @Operation(summary = "保存最终对比结果")
     @PostMapping("/addFinalTortResult")
     public Response addFinalTortResult(@RequestBody TortCompareRecordDTO tortCompareRecordDTO){
         List<Integer> ids = tortCompareRecordService.addFinalTortResult(tortCompareRecordDTO);

+ 2 - 0
src/main/java/cn/cslg/pas/domain/business/CompareLiterature.java

@@ -37,6 +37,8 @@ public class CompareLiterature extends BaseEntity<CompareLiterature> {
     private String description;
     @TableField(value = "if_approval")
     private Boolean ifApproval;
+    @TableField(value = "project_task_id")
+    private Integer projectTaskId;
     @TableField(value = "create_id")
     private String createId;
     @TableField(value = "create_time")

+ 216 - 0
src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java

@@ -1,11 +1,26 @@
 package cn.cslg.pas.service.business;
 
+import cn.cslg.pas.common.dto.business.GetFeatureSplitDTO;
+import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.common.vo.PatentRightVo;
+import cn.cslg.pas.common.vo.business.*;
+import cn.cslg.pas.domain.business.CompareLiterature;
 import cn.cslg.pas.domain.business.FTOCompareRecord;
+import cn.cslg.pas.domain.business.Feature;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.FTOCompareRecordMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * FTO
  * @Author xiexiang
@@ -14,4 +29,205 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper, FTOCompareRecord> {
+    @Autowired
+    private CacheUtils cacheUtils;
+
+    @Autowired
+    private LoginUtils loginUtils;
+
+    @Autowired
+    private FeatureService featureService;
+
+    @Autowired
+    private ReportProjectService reportProjectService;
+
+    @Autowired
+    @Lazy
+    private ProjectTaskService projectTaskService;
+
+    @Autowired
+    private CompareLiteratureService compareLiteratureService;
+
+    /**
+     * 查询侵权分析对比结果VO
+     * @param getFeatureSplitDTO
+     * @return
+     */
+    public TortCompareRecordVO getTortCompareRecord(GetFeatureSplitDTO getFeatureSplitDTO){
+        // 判断参数不能为空
+        // 分配任务id
+        Integer projectTaskId = getFeatureSplitDTO.getTaskId();
+        if (projectTaskId == null) {
+            throw new XiaoShiException("taskId不能为空");
+        }
+        // 专利号
+        String patentNo = getFeatureSplitDTO.getPatentNo();
+        if (patentNo == null) {
+            throw new XiaoShiException("patentNo不能为空");
+        }
+        if (getFeatureSplitDTO.getIfReSplit() == null) {
+            throw new XiaoShiException("ifReSplit不能为空");
+        }
+        if (getFeatureSplitDTO.getSplitBy() == null) {
+            throw new XiaoShiException("splitBy不能为空");
+        }
+        if (getFeatureSplitDTO.getSplitType() == null) {
+            throw new XiaoShiException("splitType不能为空");
+        }
+        // 根据分配任务id和专利号查询projectId
+        LambdaQueryWrapper<CompareLiterature> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CompareLiterature::getLiteratureNo, patentNo)
+                .eq(CompareLiterature::getProjectTaskId, projectTaskId);
+        CompareLiterature compareLiterature = compareLiteratureService.getOne(queryWrapper, false);
+        Integer projectId = getFeatureSplitDTO.getProjectId();
+        if (compareLiterature != null) {
+            projectId = compareLiterature.getProjectId();
+        }
+        //返回的VO类
+        TortCompareRecordVO tortCompareRecordVO = new TortCompareRecordVO();
+        tortCompareRecordVO.setProjectId(projectId);
+        //新建查询拆分特征DTO
+        SplitVO splitVO = new SplitVO();
+        BeanUtils.copyProperties(getFeatureSplitDTO, splitVO);
+        List<PatentRightVo> patentRightVos = new ArrayList<>();
+        //判断是否重拆
+        if (getFeatureSplitDTO.getIfReSplit() == true) {//重拆
+            //重拆需要清空原有对比结果表
+            // 根据分配任务id和报告id删除对比结果
+            LambdaQueryWrapper<FTOCompareRecord> deleteWrapper = new LambdaQueryWrapper<>();
+            deleteWrapper.eq(FTOCompareRecord::getProjectId, projectId)
+                    .eq(FTOCompareRecord::getProjectTaskId, projectTaskId)
+                    .eq(FTOCompareRecord::getCompareFileNumber, patentNo);
+            this.remove(deleteWrapper);
+        }
+        try {
+            //根据重拆条件拆分权要保存到特征表
+            //如果重拆需要清空特征表
+            patentRightVos = featureService.splitPatentFeature(splitVO);
+        } catch (Exception e) {
+            throw new XiaoShiException("查询特征出错");
+        }
+        //装载权要部分
+        if (!patentRightVos.isEmpty()) {
+            List<TortRightVO> tortRightVOS = this.loadTortRightVO(patentNo, projectTaskId, patentRightVos);
+            tortCompareRecordVO.setTortRightVOS(tortRightVOS);
+        } else {
+            throw new XiaoShiException("特征查询错误");
+        }
+        return tortCompareRecordVO;
+    }
+
+    /**
+     * 装载权要层
+     * @param patentRightVos
+     * @return
+     */
+    public List<TortRightVO> loadTortRightVO(String patentNo, Integer projectTaskId, List<PatentRightVo> patentRightVos){
+        //根据projectId查询
+        //新建权要层信息
+        List<TortRightVO> tortRightVOS = new ArrayList<>();
+        //遍历装载权要层信息
+        patentRightVos.forEach(item -> {
+            TortRightVO tortRightVO = new TortRightVO();
+            BeanUtils.copyProperties(item, tortRightVO);
+            //根据projectId获取对比记录
+            List<Feature> features = item.getFeatures();
+            LambdaQueryWrapper<FTOCompareRecord> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(FTOCompareRecord::getCompareFileNumber, patentNo)
+                    .eq(FTOCompareRecord::getProjectTaskId, projectTaskId);
+            List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper);
+            //装载特征与对比记录
+            List<TortVO> tortVOS = this.loadTortVO2(null, features, ftoCompareRecords);
+            tortRightVO.setTortVOS(tortVOS);
+            tortRightVOS.add(tortRightVO);
+        });
+        return tortRightVOS;
+    }
+
+    /**
+     * 发起人查询
+     * 装载特征与对比结果
+     * @param taskId
+     * @param features
+     * @param ftoCompareRecords
+     * @return
+     */
+    public List<TortVO> loadTortVO2(Integer taskId, List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
+        List<TortVO> tortVOS = new ArrayList<>();
+        for (Feature feature : features) {
+            //新建特征与侵权分析对比结果VO
+            //装载特征部分的信息
+            TortVO tortVO = this.loadFeature(feature);
+            //装载侵权分析对比结果的部分
+            FTOCompareRecordVO originalRecordVO = new FTOCompareRecordVO();
+            FTOCompareRecordVO currentRecordVO = new FTOCompareRecordVO();
+            FTOCompareRecordVO finalRecordVO = new FTOCompareRecordVO();
+            //对比结果集合不为空
+            if (!ftoCompareRecords.isEmpty()) {
+                //原始数据or最终数据
+                FTOCompareRecord originalRecord = ftoCompareRecords
+                        .stream()
+                        .filter(item -> item.getFeatureId() != null && item.getFeatureId().equals(feature.getId()) && item.getIfFinal().equals(true))
+                        .findFirst()
+                        .orElse(null);
+
+                if (originalRecord != null) {
+                    //装载
+                    originalRecordVO.setId(originalRecord.getId());
+                    originalRecordVO.setCompareResult(originalRecord.getCompareResult());
+                    originalRecordVO.setCompareDescription(originalRecord.getCompareDescription());
+                    originalRecordVO.setTargetDescription(originalRecord.getTargetDescription());
+                }
+                //协同人处理的数据
+                FTOCompareRecord currentRecord = ftoCompareRecords
+                        .stream()
+                        .filter(item -> item.getFeatureId() != null && item.getProjectTaskId() != null && item.getFeatureId().equals(feature.getId()) && item.getProjectTaskId().equals(taskId) && item.getIfOriginal().equals(false) && item.getIfFinal().equals(false))
+                        .findFirst()
+                        .orElse(null);
+                if (currentRecord != null) {
+                    //装载
+                    currentRecordVO.setId(currentRecord.getId());
+                    currentRecordVO.setCompareResult(currentRecord.getCompareResult());
+                    currentRecordVO.setCompareDescription(currentRecord.getCompareDescription());
+                    currentRecordVO.setTargetDescription(currentRecord.getTargetDescription());
+                }
+
+                FTOCompareRecord finalRecord = ftoCompareRecords
+                        .stream()
+                        .filter(item -> item.getFeatureId() != null && item.getFeatureId().equals(feature.getId()) && item.getIfFinal().equals(true))
+                        .findFirst()
+                        .orElse(null);
+                if (finalRecord != null) {
+                    //装载
+                    finalRecordVO.setId(finalRecord.getId());
+                    finalRecordVO.setCompareResult(finalRecord.getCompareResult());
+                    finalRecordVO.setCompareDescription(finalRecord.getCompareDescription());
+                    finalRecordVO.setTargetDescription(finalRecord.getTargetDescription());
+                }
+            }
+            tortVO.setOriginalRecordVO(originalRecordVO);
+            tortVO.setCurrentRecordVO(currentRecordVO);
+            tortVO.setFinalRecordVO(finalRecordVO);
+            tortVOS.add(tortVO);
+        }
+        return tortVOS;
+    }
+
+    /**
+     * 装载特征
+     * @param feature
+     * @return
+     */
+    public TortVO loadFeature(Feature feature){
+        TortVO tortVO = new TortVO();
+        tortVO.setFeatureId(feature.getId());
+        tortVO.setContent(feature.getContent());
+        tortVO.setPatentNo(feature.getPatentNo());
+        tortVO.setRightSort(feature.getRightSort());
+        tortVO.setRightType(feature.getRightType());
+        tortVO.setExplainText(feature.getExplainText());
+        tortVO.setFormId(feature.getFromId());
+        tortVO.setSysOrder(feature.getSysOrder());
+        return tortVO;
+    }
 }

+ 3 - 1
src/main/java/cn/cslg/pas/service/business/ReportProjectService.java

@@ -239,6 +239,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             throw new UnLoginException("未登录");
         }
         String userId = personnelVO.getId();
+
         /**
          * 装载project
          */
@@ -251,7 +252,6 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             //根据创建人的租户类型设置project的委托类型
             if (personnelVO.getTenantType().equals("1")) {
                 project.setEntrustType(1);
-
                 //当委托方id不为空时
                 if (reportProjectDTO.getEntrustId() != null) {
                     project.setEntrustId(reportProjectDTO.getEntrustId());
@@ -281,6 +281,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             }
         }
         project.insert();
+
         /**
          * 装载和报告关联
          */
@@ -292,6 +293,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             assoProject.setProjectType(2);
             assoProject.insert();
         }
+
         /**
          * 装载reportProject
          */

+ 313 - 149
src/main/java/cn/cslg/pas/service/business/TortCompareRecordService.java

@@ -19,6 +19,7 @@ import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.FTOCompareRecordMapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,10 +31,11 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
- * FTO对比记录的Service层
+ * 侵权分析对比记录的Service层
  * @Author xiexiang
  * @Date 2023/12/8
  */
@@ -56,6 +58,75 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
     @Lazy
     private ProjectTaskService projectTaskService;
 
+//    /**
+//     * 新增侵权对比结果
+//     *
+//     * @param tortCompareRecordDTO
+//     * @return
+//     */
+//    public List<Integer> addTortCompareRecord(TortCompareRecordDTO tortCompareRecordDTO) {
+//        //获取登录人信息
+//        PersonnelVO personnelVO = new PersonnelVO();
+//        try {
+//            personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+//        } catch (Exception e) {
+//            throw new UnLoginException("未登录");
+//        }
+//        Integer projectId = tortCompareRecordDTO.getProjectId();
+//        if (projectId == null) {
+//            throw new XiaoShiException("projectId不能为空");
+//        }
+//        //根据projctId查询出专利号
+//        String patentNo = projectTaskService.getPatentNoByProjectId(projectId);
+//        List<TortDTO> tortDTOS = tortCompareRecordDTO.getTortDTOS();
+//        //根据专利号和projectId,删除特征
+//        LambdaQueryWrapper<Feature> deleteWrapper = new LambdaQueryWrapper<>();
+//        deleteWrapper.eq(Feature::getPatentNo, patentNo)
+//                .eq(Feature::getProjectId, projectId);
+//        featureService.remove(deleteWrapper);
+//        //根据报告id删除侵权对比结果数据
+//        LambdaQueryWrapper<FTOCompareRecord> deleteWrapper2 = new LambdaQueryWrapper<>();
+//        deleteWrapper2.eq(FTOCompareRecord::getProjectId, projectId);
+//        this.remove(deleteWrapper2);
+//        //新增侵权对比结果集合
+//        List<FTOCompareRecord> ftoCompareRecords = new ArrayList<>();
+//        //遍历传入集合
+//        if (!tortDTOS.isEmpty()) {
+//            for (TortDTO tortDTO : tortDTOS) {
+//                Feature feature = new Feature();
+//                feature.setRightSort(tortDTO.getRightSort());
+//                feature.setPatentNo(patentNo);
+//                feature.setProjectId(projectId);
+//                feature.setContent(tortDTO.getContent());
+//                feature.setExplainText(tortDTO.getExplainText());
+//                feature.setCreateId(personnelVO.getId());
+//                feature.setRightType(tortDTO.getRightType());
+//                feature.insert();
+//                //获取特征id
+//                Integer featureId = feature.getId();
+//                if (tortDTO.getCompareResult() != null || StringUtils.isNotBlank(tortDTO.getCompareDescription()) || StringUtils.isNotBlank(tortDTO.getTargetDescription())) {
+//                    //插入侵权分析对比结果
+//                    FTOCompareRecord ftoCompareRecord = new FTOCompareRecord();
+//                    ftoCompareRecord.setProjectId(projectId);
+//                    ftoCompareRecord.setFeatureId(featureId);
+//                    ftoCompareRecord.setCompareResult(tortDTO.getCompareResult());
+//                    ftoCompareRecord.setCompareDescription(tortDTO.getCompareDescription());
+//                    ftoCompareRecord.setTargetDescription(tortDTO.getTargetDescription());
+//                    ftoCompareRecord.setCreateId(personnelVO.getId());
+//                    ftoCompareRecords.add(ftoCompareRecord);
+//                }
+//            }
+//            List<Integer> ids = new ArrayList<>();
+//            if (!ftoCompareRecords.isEmpty()) {
+//                this.saveBatch(ftoCompareRecords);
+//                ids = ftoCompareRecords.stream().map(FTOCompareRecord::getId).collect(Collectors.toList());
+//            }
+//            return ids;
+//        } else {
+//            throw new XiaoShiException("未传入特征集合");
+//        }
+//    }
+
     /**
      * 新增侵权对比结果
      *
@@ -63,74 +134,146 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
      * @return
      */
     public List<Integer> addTortCompareRecord(TortCompareRecordDTO tortCompareRecordDTO) {
-        //获取登录人信息
-        PersonnelVO personnelVO = new PersonnelVO();
-        try {
-            personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
-        } catch (Exception e) {
-            throw new UnLoginException("未登录");
-        }
         Integer projectId = tortCompareRecordDTO.getProjectId();
         if (projectId == null) {
             throw new XiaoShiException("projectId不能为空");
         }
-        //根据projctId查询出专利号
-        LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ReportProject::getProjectId, projectId);
-        List<ReportProject> reportProjects = reportProjectService.list(queryWrapper);
-        String patentNo = "";
-        if (!reportProjects.isEmpty()) {
-            ReportProject reportProject = reportProjects.get(0);
-            patentNo = reportProject.getSignPatentNo();
-        } else {
-            throw new XiaoShiException("未查询到报告专利号");
-        }
         List<TortDTO> tortDTOS = tortCompareRecordDTO.getTortDTOS();
-        //根据专利号和projectId,删除特征
-        LambdaQueryWrapper<Feature> deleteWrapper = new LambdaQueryWrapper<>();
-        deleteWrapper.eq(Feature::getPatentNo, patentNo)
+        //不能将特征一次性全部删除,使用处理特征方法
+        if (!tortDTOS.isEmpty()) {
+            throw new XiaoShiException("传入特征集合不能为空");
+        }
+        //查询出原来的特征id集合
+        LambdaQueryWrapper<Feature> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(Feature::getId)
                 .eq(Feature::getProjectId, projectId);
-        featureService.remove(deleteWrapper);
-        //根据报告id删除侵权对比结果数据
+        Function<Object,Integer> f = (o -> Integer.parseInt(o.toString()));
+        List<Integer> featureIds = featureService.listObjs(queryWrapper,f);
+        // 删除特征
+        List<Integer> ids = new ArrayList<>();
+        if (!featureIds.isEmpty()) {
+            ids = this.deleteFeatures(projectId, tortDTOS, featureIds);
+        }
+        return ids;
+    }
+
+    /**
+     * 删除特征
+     * @param projectId
+     * @param tortDTOS
+     * @param featureIds
+     */
+    public List<Integer> deleteFeatures(Integer projectId,  List<TortDTO> tortDTOS, List<Integer> featureIds){
+        //新的特征和对比结果集合过滤出新的特征id
+        List<Integer> currentIds = tortDTOS.stream().map(TortDTO::getFeatureId).collect(Collectors.toList());
+        // 比对并删除featureIds中多余的数据(featureIds比currentIds多的)
+        List<Integer> idsToDelete = featureIds.stream()
+                .filter(id -> !currentIds.contains(id))
+                .collect(Collectors.toList());
+        // 如果有需要删除的ids
+        if (!idsToDelete.isEmpty()) {
+            // 删除特征
+            LambdaQueryWrapper<Feature> deleteWrapper = new LambdaQueryWrapper<>();
+            deleteWrapper.in(Feature::getId, idsToDelete);
+            featureService.remove(deleteWrapper);
+        }
+        // 删除对比记录
         LambdaQueryWrapper<FTOCompareRecord> deleteWrapper2 = new LambdaQueryWrapper<>();
-        deleteWrapper2.eq(FTOCompareRecord::getProjectId, projectId);
+        deleteWrapper2.eq(FTOCompareRecord::getProjectId, projectId)
+                .eq(FTOCompareRecord::getIfFinal, true);
         this.remove(deleteWrapper2);
-        //新增侵权对比结果集合
-        List<FTOCompareRecord> ftoCompareRecords = new ArrayList<>();
-        //遍历传入集合
-        if (!tortDTOS.isEmpty()) {
-            for (TortDTO tortDTO : tortDTOS) {
+        // 更新剩余特征和对比结果
+        List<Integer> ids = this.updateFeatures(projectId, featureIds, tortDTOS);
+        return ids;
+    }
+
+    /**
+     * 更新剩余特征和对比结果
+     * @param projectId
+     * @param featureIds
+     * @param tortDTOS
+     */
+    public List<Integer> updateFeatures(Integer projectId, List<Integer> featureIds, List<TortDTO> tortDTOS){
+        // 处理剩余特征和对比结果
+        // 根据projctId查询出专利号
+        String patentNo = projectTaskService.getPatentNoByProjectId(projectId);
+        // 获取登录人信息
+        PersonnelVO personnelVO = new PersonnelVO();
+        try {
+            personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+        } catch (Exception e) {
+            throw new UnLoginException("未登录");
+        }
+        // 重新排序
+        Integer order = 1;
+        List<Integer> ftoIds = new ArrayList<>();
+        for (TortDTO item : tortDTOS) {
+            Integer currentFeatureId = item.getFeatureId();
+            // 新的特征id不为空,并且数据库中是有这个特征的
+            if (item.getFeatureId() != null && featureIds.contains(currentFeatureId)) {
+                // 执行更新操作
+                Feature feature = featureService.getById(item.getFeatureId());
+                feature.setRightSort(item.getRightSort());
+                feature.setContent(item.getContent());
+                feature.setExplainText(item.getExplainText());
+                feature.setRightType(item.getRightType());
+                feature.setSysOrder(order);
+                feature.updateById();
+                // 新增对比结果
+                Integer id = this.addCompareRecords(projectId, item);
+                if (id != null) {
+                    ftoIds.add(id);
+                }
+            } else {
                 Feature feature = new Feature();
-                feature.setRightSort(tortDTO.getRightSort());
+                feature.setRightSort(item.getRightSort());
                 feature.setPatentNo(patentNo);
                 feature.setProjectId(projectId);
-                feature.setContent(tortDTO.getContent());
-                feature.setExplainText(tortDTO.getExplainText());
+                feature.setContent(item.getContent());
+                feature.setExplainText(item.getExplainText());
                 feature.setCreateId(personnelVO.getId());
-                feature.setRightType(tortDTO.getRightType());
+                feature.setRightType(item.getRightType());
+                feature.setSysOrder(order);
                 feature.insert();
-                //获取特征id
-                Integer featureId = feature.getId();
-                if (tortDTO.getCompareResult() != null || StringUtils.isNotBlank(tortDTO.getCompareDescription()) || StringUtils.isNotBlank(tortDTO.getTargetDescription())) {
-                    //插入侵权分析对比结果
-                    FTOCompareRecord ftoCompareRecord = new FTOCompareRecord();
-                    ftoCompareRecord.setProjectId(projectId);
-                    ftoCompareRecord.setFeatureId(featureId);
-                    ftoCompareRecord.setCompareResult(tortDTO.getCompareResult());
-                    ftoCompareRecord.setCompareDescription(tortDTO.getCompareDescription());
-                    ftoCompareRecord.setTargetDescription(tortDTO.getTargetDescription());
-                    ftoCompareRecord.setCreateId(personnelVO.getId());
-                    ftoCompareRecords.add(ftoCompareRecord);
+                item.setFeatureId(feature.getId());
+                // 新增对比结果
+                Integer id = this.addCompareRecords(projectId, item);
+                if (id != null) {
+                    ftoIds.add(id);
                 }
             }
-            List<Integer> ids = new ArrayList<>();
-            if (!ftoCompareRecords.isEmpty()) {
-                this.saveBatch(ftoCompareRecords);
-                ids = ftoCompareRecords.stream().map(FTOCompareRecord::getId).collect(Collectors.toList());
-            }
-            return ids;
+            order++ ;
+        }
+        return ftoIds;
+    }
+
+    /**
+     * 对比结果入库
+     * @param projectId
+     * @param tortDTO
+     */
+    public Integer addCompareRecords(Integer projectId, TortDTO tortDTO){
+        Integer featureId = tortDTO.getFeatureId();
+        //获取登录人信息
+        PersonnelVO personnelVO = new PersonnelVO();
+        try {
+            personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+        } catch (Exception e) {
+            throw new UnLoginException("未登录");
+        }
+        if (tortDTO.getCompareResult() != null || StringUtils.isNotBlank(tortDTO.getCompareDescription()) || StringUtils.isNotBlank(tortDTO.getTargetDescription())) {
+            //插入对比结果
+            FTOCompareRecord ftoCompareRecord = new FTOCompareRecord();
+            ftoCompareRecord.setProjectId(projectId);
+            ftoCompareRecord.setFeatureId(featureId);
+            ftoCompareRecord.setCompareResult(tortDTO.getCompareResult());
+            ftoCompareRecord.setCompareDescription(tortDTO.getCompareDescription());
+            ftoCompareRecord.setTargetDescription(tortDTO.getTargetDescription());
+            ftoCompareRecord.setCreateId(personnelVO.getId());
+            ftoCompareRecord.insert();
+            return ftoCompareRecord.getId();
         } else {
-            throw new XiaoShiException("未传入特征集合");
+            return null;
         }
     }
 
@@ -166,44 +309,21 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
         List<PatentRightVo> patentRightVos = new ArrayList<>();
         //判断是否重拆
         if (getFeatureSplitDTO.getIfReSplit() == true) {//重拆
-            //重拆需要清空原有特征表、对比结果表
+            //重拆需要清空原有对比结果表
             LambdaQueryWrapper<FTOCompareRecord> deleteWrapper = new LambdaQueryWrapper<>();
             deleteWrapper.eq(FTOCompareRecord::getProjectId, projectId);
             this.remove(deleteWrapper);
-            //清空特征表
+        }
+        try {
             //根据重拆条件拆分权要保存到特征表
-            try {
-                patentRightVos = featureService.splitPatentFeature(splitVO);
-            } catch (Exception e) {
-                throw new XiaoShiException("查询特征出错");
-            }
-        } else {
-            //不重拆
-            try {
-                patentRightVos = featureService.splitPatentFeature(splitVO);
-            } catch (Exception e) {
-                throw new XiaoShiException("查询特征出错");
-            }
+            //如果重拆需要清空特征表
+            patentRightVos = featureService.splitPatentFeature(splitVO);
+        } catch (Exception e) {
+            throw new XiaoShiException("查询特征出错");
         }
+        //装载权要部分
         if (!patentRightVos.isEmpty()) {
-            //根据projectId查询
-            //新建权要层信息
-            List<TortRightVO> tortRightVOS = new ArrayList<>();
-            //遍历装载权要层信息
-            patentRightVos.forEach(item -> {
-                TortRightVO tortRightVO = new TortRightVO();
-                BeanUtils.copyProperties(item, tortRightVO);
-                //新建特征与侵权分析对比结果VOS
-                List<TortVO> tortVOS = new ArrayList<>();
-                //特征信息
-                List<Feature> features = item.getFeatures();
-                LambdaQueryWrapper<FTOCompareRecord> queryWrapper2 = new LambdaQueryWrapper<>();
-                queryWrapper2.eq(FTOCompareRecord::getProjectId, projectId);
-                List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper2);
-                tortVOS = this.loadTortVO2(null, features, ftoCompareRecords);
-                tortRightVO.setTortVOS(tortVOS);
-                tortRightVOS.add(tortRightVO);
-            });
+            List<TortRightVO> tortRightVOS = this.loadTortRightVO(projectId, patentRightVos);
             tortCompareRecordVO.setTortRightVOS(tortRightVOS);
         } else {
             throw new XiaoShiException("特征查询错误");
@@ -212,6 +332,32 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
     }
 
     /**
+     * 装载权要层
+     * @param patentRightVos
+     * @return
+     */
+    public List<TortRightVO> loadTortRightVO(Integer projectId, List<PatentRightVo> patentRightVos){
+        //根据projectId查询
+        //新建权要层信息
+        List<TortRightVO> tortRightVOS = new ArrayList<>();
+        //遍历装载权要层信息
+        patentRightVos.forEach(item -> {
+            TortRightVO tortRightVO = new TortRightVO();
+            BeanUtils.copyProperties(item, tortRightVO);
+            //根据projectId获取对比记录
+            List<Feature> features = item.getFeatures();
+            LambdaQueryWrapper<FTOCompareRecord> queryWrapper2 = new LambdaQueryWrapper<>();
+            queryWrapper2.eq(FTOCompareRecord::getProjectId, projectId);
+            List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper2);
+            //装载特征与对比记录
+            List<TortVO> tortVOS = this.loadTortVO2(null, features, ftoCompareRecords);
+            tortRightVO.setTortVOS(tortVOS);
+            tortRightVOS.add(tortRightVO);
+        });
+        return tortRightVOS;
+    }
+
+    /**
      * 从侵权分析中获得对比结果,并复制保存
      * @param projectId
      * @param taskId
@@ -254,6 +400,7 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
         }
         Integer projectId = null;
         Integer taskId = tortCompareRecordDTO.getTaskId();
+        //根据taskId查询报告id
         if (taskId != null) {
             projectId = this.getProjectIdByTaskId(taskId);
         } else {
@@ -268,10 +415,14 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
         }
         List<TortDTO> tortDTOS = tortCompareRecordDTO.getTortDTOS();
         List<Integer> ids = new ArrayList<>();
+        //传入对比结果不为空
         if (tortDTOS != null && !tortDTOS.isEmpty()) {
             List<FTOCompareRecord> ftoCompareRecords = new ArrayList<>();
+            //遍历传入对比结果
             for (TortDTO item : tortDTOS) {
+                //由于传入的集合中有部分特征是没有对比结果的,所以选择有的部分添加到表中
                 if (item.getCompareResult() != null || StringUtils.isNotBlank(item.getCompareDescription()) || StringUtils.isNotBlank(item.getTargetDescription())) {
+                    //装载处理人处理过的对比记录
                     FTOCompareRecord ftoCompareRecord = new FTOCompareRecord();
                     ftoCompareRecord.setCompareResult(item.getCompareResult());
                     ftoCompareRecord.setCompareDescription(item.getCompareDescription());
@@ -286,13 +437,13 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
                 }
             }
             if (!ftoCompareRecords.isEmpty()) {
-                //先删除表中原来的
+                //先删除表中原有的协同后的对比记录
                 LambdaQueryWrapper<FTOCompareRecord> deleteWrapper = new LambdaQueryWrapper<>();
                 deleteWrapper.eq(FTOCompareRecord::getIfOriginal, false)
                         .eq(FTOCompareRecord::getCreateId, personnelVO.getId())
                         .eq(FTOCompareRecord::getProjectTaskId, taskId);
                 this.remove(deleteWrapper);
-                //更新
+                //更新
                 this.saveBatch(ftoCompareRecords);
                 ids = ftoCompareRecords.stream().map(FTOCompareRecord::getId).collect(Collectors.toList());
             }
@@ -302,30 +453,33 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
 
     /**
      * 查询侵权分析协同前后对比结果
+     * 三份结果:原始、协同处理、最终
      * @param taskId
      * @return
      */
     public TortCompareRecordVO getAllTortTaskResult(Integer projectId, Integer taskId, Integer type) {
-        //新建返回VO
         TortCompareRecordVO tortCompareRecordVO = new TortCompareRecordVO();
-        //根据任务id查询报告id
+        // 发起人从任务进入,没有报告id,有taskId
+        // 根据taskId查询报告id
         if (projectId == null && taskId != null) {
             projectId = this.getProjectIdByTaskId(taskId);
         }
         tortCompareRecordVO.setProjectId(projectId);
+        //根据报告id查询专利号
         String patentNo = projectTaskService.getPatentNoByProjectId(projectId);
-        //根据专利号查询权要
         try {
             List<PatentRightVo> patentRightVos = new ArrayList<>();
+            //根据专利号和报告id查询权要
             List<RePatentClaim> patentRights = featureService.getRightListByNo(patentNo);
             LambdaQueryWrapper<Feature> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(Feature::getProjectId, projectId)
                     .eq(Feature::getPatentNo, patentNo);
             List<Feature> allFeatures = featureService.list(wrapper);
             patentRightVos = featureService.loadPatentRightVO(patentRights, allFeatures, projectId, patentNo);
+            //装载权要层下的特征与对比结果
             List<TortRightVO> tortRightVOS = new ArrayList<>();
-            if (type == 1) {//查询侵权分析协同前后对比结果
-                tortRightVOS = this.loadTortRightVOS(taskId, projectId, patentRightVos);
+            if (type == 1) {//查询协同前后对比结果
+                tortRightVOS = this.loadBeforeAndAfter(taskId, projectId, patentRightVos);
             } else if (type == 2) {//发起人的查询
                 tortRightVOS = this.loadTortRightVOS2(taskId, projectId, patentRightVos);
             }
@@ -343,7 +497,7 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
      * @param patentRightVos
      * @return
      */
-    public List<TortRightVO> loadTortRightVOS(Integer taskId, Integer projectId, List<PatentRightVo> patentRightVos){
+    public List<TortRightVO> loadBeforeAndAfter(Integer taskId, Integer projectId, List<PatentRightVo> patentRightVos){
         if (patentRightVos != null && !patentRightVos.isEmpty()) {
             //新建权要层信息
             List<TortRightVO> tortRightVOS = new ArrayList<>();
@@ -357,7 +511,7 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
                 queryWrapper.eq(FTOCompareRecord::getProjectId, projectId)
                         .eq(FTOCompareRecord::getProjectTaskId, taskId);
                 List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper);
-                List<TortVO> tortVOS = this.loadTortVO(features, ftoCompareRecords);
+                List<TortVO> tortVOS = this.loadBeforeAndAfterTortVO(features, ftoCompareRecords);
                 tortRightVO.setTortVOS(tortVOS);
                 tortRightVOS.add(tortRightVO);
             });
@@ -404,7 +558,7 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
      * @param ftoCompareRecords
      * @return
      */
-    public List<TortVO> loadTortVO(List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
+    public List<TortVO> loadBeforeAndAfterTortVO(List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
         List<TortVO> tortVOS = new ArrayList<>();
         for (Feature feature : features) {
             //新建特征与侵权分析对比结果VO
@@ -422,10 +576,7 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
                         .orElse(null);
                 if (originalRecord != null) {
                     //装载
-                    originalRecordVO.setId(originalRecord.getId());
-                    originalRecordVO.setCompareResult(originalRecord.getCompareResult());
-                    originalRecordVO.setCompareDescription(originalRecord.getCompareDescription());
-                    originalRecordVO.setTargetDescription(originalRecord.getTargetDescription());
+                    originalRecordVO = this.loadVO(originalRecord);
                 }
                 //协同后
                 FTOCompareRecord currentRecord = ftoCompareRecords
@@ -435,10 +586,7 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
                         .orElse(null);
                 if (currentRecord != null) {
                     //装载
-                    currentRecordVO.setId(currentRecord.getId());
-                    currentRecordVO.setCompareResult(currentRecord.getCompareResult());
-                    currentRecordVO.setCompareDescription(currentRecord.getCompareDescription());
-                    currentRecordVO.setTargetDescription(currentRecord.getTargetDescription());
+                    currentRecordVO = this.loadVO(currentRecord);
                 } else {
                     currentRecordVO = originalRecordVO;
                 }
@@ -469,19 +617,24 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
             FTOCompareRecordVO currentRecordVO = new FTOCompareRecordVO();
             FTOCompareRecordVO finalRecordVO = new FTOCompareRecordVO();
             if (!ftoCompareRecords.isEmpty()) {
-                //原始数据or最终数据
+                // 原始数据的装载
+                // 原始数据应该是ifOriginal为true的数据
                 FTOCompareRecord originalRecord = ftoCompareRecords
                         .stream()
-                        .filter(item -> item.getFeatureId() != null && item.getFeatureId().equals(feature.getId()) && item.getIfFinal().equals(true))
+                        .filter(item -> item.getFeatureId() != null && item.getProjectTaskId() != null && item.getFeatureId().equals(feature.getId()) && item.getProjectTaskId().equals(taskId) && item.getIfOriginal().equals(true))
                         .findFirst()
                         .orElse(null);
-
                 if (originalRecord != null) {
-                    //装载
-                    originalRecordVO.setId(originalRecord.getId());
-                    originalRecordVO.setCompareResult(originalRecord.getCompareResult());
-                    originalRecordVO.setCompareDescription(originalRecord.getCompareDescription());
-                    originalRecordVO.setTargetDescription(originalRecord.getTargetDescription());
+                    originalRecordVO = this.loadVO(originalRecord);
+                } else {
+                    FTOCompareRecord record = ftoCompareRecords
+                            .stream()
+                            .filter(item -> item.getFeatureId() != null && item.getFeatureId().equals(feature.getId()) && item.getIfFinal().equals(true))
+                            .findFirst()
+                            .orElse(null);
+                    if (record != null) {
+                        originalRecordVO = this.loadVO(record);
+                    }
                 }
                 //协同人处理的数据
                 FTOCompareRecord currentRecord = ftoCompareRecords
@@ -490,24 +643,16 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
                         .findFirst()
                         .orElse(null);
                 if (currentRecord != null) {
-                    //装载
-                    currentRecordVO.setId(currentRecord.getId());
-                    currentRecordVO.setCompareResult(currentRecord.getCompareResult());
-                    currentRecordVO.setCompareDescription(currentRecord.getCompareDescription());
-                    currentRecordVO.setTargetDescription(currentRecord.getTargetDescription());
+                   currentRecordVO = this.loadVO(currentRecord);
                 }
-
+                //最终数据
                 FTOCompareRecord finalRecord = ftoCompareRecords
                         .stream()
                         .filter(item -> item.getFeatureId() != null && item.getFeatureId().equals(feature.getId()) && item.getIfFinal().equals(true))
                         .findFirst()
                         .orElse(null);
                 if (finalRecord != null) {
-                    //装载
-                    finalRecordVO.setId(finalRecord.getId());
-                    finalRecordVO.setCompareResult(finalRecord.getCompareResult());
-                    finalRecordVO.setCompareDescription(finalRecord.getCompareDescription());
-                    finalRecordVO.setTargetDescription(finalRecord.getTargetDescription());
+                    finalRecordVO = this.loadVO(finalRecord);
                 }
             }
             tortVO.setOriginalRecordVO(originalRecordVO);
@@ -525,18 +670,14 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
      */
     public List<Integer> addFinalTortResult(TortCompareRecordDTO tortCompareRecordDTO){
         List<Integer> ids = new ArrayList<>();
-        //判空
         Integer taskId = tortCompareRecordDTO.getTaskId();
+        if (taskId == null) {
+            throw new XiaoShiException("taskId不能为空");
+        }
         Integer projectId = this.getProjectIdByTaskId(taskId);
-        //首先是根据projectId,以及任务id为空,以及ifOriginal为false,ifFinal为true这几个条件删除表中的数据
-        LambdaQueryWrapper<FTOCompareRecord> removeWrapper = new LambdaQueryWrapper<>();
-        removeWrapper.eq(FTOCompareRecord::getProjectId, projectId)
-                .eq(FTOCompareRecord::getIfOriginal, false)
-                .eq(FTOCompareRecord::getIfFinal, true);
-        this.remove(removeWrapper);
-        //其次是添加一批新的数据
-        List<FTOCompareRecord> ftoCompareRecords = new ArrayList<>();
-        List<TortDTO> tortDTOS = tortCompareRecordDTO.getTortDTOS();
+        if (projectId == null) {
+            throw new XiaoShiException("查询报告错误");
+        }
         //获取登录人信息
         PersonnelVO personnelVO = new PersonnelVO();
         try {
@@ -544,25 +685,38 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
         } catch (Exception e) {
             throw new UnLoginException("未登录");
         }
-        if (tortDTOS != null && !tortDTOS.isEmpty()) {
-            for (TortDTO item : tortDTOS) {
-                if (item.getCompareResult() != null || StringUtils.isNotBlank(item.getCompareDescription()) || StringUtils.isNotBlank(item.getTargetDescription())) {
-                    FTOCompareRecord tortFinal = new FTOCompareRecord();
-                    tortFinal.setFeatureId(item.getFeatureId());
-                    tortFinal.setProjectId(projectId);
-                    tortFinal.setCompareResult(item.getCompareResult());
-                    tortFinal.setCompareDescription(item.getCompareDescription());
-                    tortFinal.setTargetDescription(item.getTargetDescription());
-                    tortFinal.setCreateId(personnelVO.getId());
-                    ftoCompareRecords.add(tortFinal);
+        try {
+            //首先是根据projectId,以及ifOriginal为false、ifFinal为true这几个条件删除表中的最终数据(最开始的数据)
+            LambdaQueryWrapper<FTOCompareRecord> removeWrapper = new LambdaQueryWrapper<>();
+            removeWrapper.eq(FTOCompareRecord::getProjectId, projectId)
+                    .eq(FTOCompareRecord::getIfOriginal, false)
+                    .eq(FTOCompareRecord::getIfFinal, true);
+            this.remove(removeWrapper);
+            //其次是添加一批新的数据
+            List<FTOCompareRecord> ftoCompareRecords = new ArrayList<>();
+            List<TortDTO> tortDTOS = tortCompareRecordDTO.getTortDTOS();
+            if (tortDTOS != null && !tortDTOS.isEmpty()) {
+                for (TortDTO item : tortDTOS) {
+                    if (item.getCompareResult() != null || StringUtils.isNotBlank(item.getCompareDescription()) || StringUtils.isNotBlank(item.getTargetDescription())) {
+                        FTOCompareRecord tortFinal = new FTOCompareRecord();
+                        tortFinal.setFeatureId(item.getFeatureId());
+                        tortFinal.setProjectId(projectId);
+                        tortFinal.setCompareResult(item.getCompareResult());
+                        tortFinal.setCompareDescription(item.getCompareDescription());
+                        tortFinal.setTargetDescription(item.getTargetDescription());
+                        tortFinal.setCreateId(personnelVO.getId());
+                        ftoCompareRecords.add(tortFinal);
+                    }
                 }
             }
+            if (!ftoCompareRecords.isEmpty()) {
+                this.saveBatch(ftoCompareRecords);
+                ids = ftoCompareRecords.stream().map(FTOCompareRecord::getId).collect(Collectors.toList());
+            }
+            return ids;
+        } catch (Exception e) {
+            throw new XiaoShiException("添加错误");
         }
-        if (!ftoCompareRecords.isEmpty()) {
-            this.saveBatch(ftoCompareRecords);
-            ids = ftoCompareRecords.stream().map(FTOCompareRecord::getId).collect(Collectors.toList());
-        }
-        return ids;
     }
 
     /**
@@ -585,7 +739,7 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
     }
 
     /**
-     * 装载权要
+     * 装载特征
      * @param feature
      * @return
      */
@@ -601,4 +755,14 @@ public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper
         tortVO.setSysOrder(feature.getSysOrder());
         return tortVO;
     }
+
+    public FTOCompareRecordVO loadVO(FTOCompareRecord ftoCompareRecord){
+        FTOCompareRecordVO ftoCompareRecordVO = new FTOCompareRecordVO();
+        ftoCompareRecordVO.setId(ftoCompareRecord.getId());
+        ftoCompareRecordVO.setCompareResult(ftoCompareRecord.getCompareResult());
+        ftoCompareRecordVO.setCompareDescription(ftoCompareRecord.getCompareDescription());
+        ftoCompareRecordVO.setTargetDescription(ftoCompareRecord.getTargetDescription());
+        return ftoCompareRecordVO;
+    }
+
 }