瀏覽代碼

12/9 协同任务

xiexiang 1 年之前
父節點
當前提交
1d3d3ec31f

+ 14 - 0
src/main/java/cn/cslg/pas/common/dto/business/CCPerson.java

@@ -0,0 +1,14 @@
+package cn.cslg.pas.common.dto.business;
+
+import lombok.Data;
+
+/**
+ * 抄送人
+ * @Author xiexiang
+ * @Date 2023/12/9
+ */
+@Data
+public class CCPerson {
+    private Boolean ifInner;
+    private String personId;
+}

+ 2 - 2
src/main/java/cn/cslg/pas/common/dto/business/GetAvoidDesignDTO.java

@@ -4,12 +4,12 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 /**
- * 查询回避设计方案DTO
+ * 查询特征拆分DTO
  * @Author xiexiang
  * @Date 2023/12/7
  */
 @Data
-public class GetAvoidDesignDTO {
+public class GetFeatureSplitDTO {
     /**
      * 报告id
      */

+ 62 - 0
src/main/java/cn/cslg/pas/common/dto/business/TortTaskDTO.java

@@ -0,0 +1,62 @@
+package cn.cslg.pas.common.dto.business;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 侵权分析协同任务
+ * @Author xiexiang
+ * @Date 2023/12/9
+ */
+@Data
+public class TortTaskDTO {
+    /**
+     * 主题
+     */
+    private String name;
+
+    /**
+     * 报告id
+     */
+    private Integer projectId;
+
+    /**
+     * 0标引任务
+     * 1项目开卷审核任务
+     * 2检索条件任务
+     * 3对比任务
+     * 4协同任务
+     * 5审核任务
+     * 6分配任务
+     * 7专利挖掘一批文件的审核任务
+     */
+    private Integer type;
+
+    /**
+     * 协同人
+     * 内部人员:人员id
+     * 外部人员:人员的邮箱
+     */
+    private String handler;
+
+    /**
+     * 0内部人员1外部人员
+     */
+    private Integer handlerType;
+
+    /**
+     * 截止时间
+     */
+    private Date deadLineTime;
+
+    /**
+     * 抄送人
+     */
+    public List<CCPerson> ccPeople;
+    /**
+     * 备注
+     */
+    private String description;
+}

+ 2 - 0
src/main/java/cn/cslg/pas/common/vo/business/ProjectTaskVO.java

@@ -33,6 +33,8 @@ public class ProjectTaskVO {
 
     private Integer projectType;
 
+    private String patentNo;
+
     /**
      * 0标引任务
      * 1项目开卷审核任务

+ 2 - 2
src/main/java/cn/cslg/pas/controller/AvoidDesignController.java

@@ -56,8 +56,8 @@ public class AvoidDesignController {
 
     @Operation(summary = "查询回避设计方案")
     @PostMapping("/getAvoidDesign")
-    public Response getAvoidDesign(@RequestBody GetAvoidDesignDTO getAvoidDesignDTO) throws Exception {
-        AvoidDesignWholeVO avoidDesignWholeVO = avoidDesignWholeService.getAvoidDesignWhole(getAvoidDesignDTO);
+    public Response getAvoidDesign(@RequestBody GetFeatureSplitDTO getFeatureSplitDTO) throws Exception {
+        AvoidDesignWholeVO avoidDesignWholeVO = avoidDesignWholeService.getAvoidDesignWhole(getFeatureSplitDTO);
         return Response.success(avoidDesignWholeVO);
     }
 

+ 7 - 0
src/main/java/cn/cslg/pas/controller/ProjectTaskController.java

@@ -101,4 +101,11 @@ public class ProjectTaskController {
             return Response.error("失败");
         }
     }
+
+    @Operation(summary = "根据taskId查询专利号")
+    @GetMapping("/getPatentNoByTaskId")
+    public Response getPatentNoByTaskId(Integer taskId) throws IOException {
+        String patentNo = projectTaskService.getPatentNoByTaskId(taskId);
+        return Response.success(patentNo);
+    }
 }

+ 29 - 10
src/main/java/cn/cslg/pas/controller/FTOReportController.java

@@ -1,19 +1,20 @@
 package cn.cslg.pas.controller;
 
 import cn.cslg.pas.common.core.base.Constants;
-import cn.cslg.pas.common.dto.business.GetAvoidDesignDTO;
+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.AvoidDesignWholeVO;
 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.TortCompareRecordService;
 import cn.cslg.pas.service.business.ProductMessageService;
+import cn.cslg.pas.service.business.ProjectTaskService;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,18 +24,20 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * FTO
+ * FTOTort
  * @Author xiexiang
  * @Date 2023/12/8
  */
 @Slf4j
-@RequestMapping(Constants.API_XiaoSHI + "/fto")
+@RequestMapping(Constants.API_XiaoSHI + "/tort")
 @RestController
-public class FTOReportController {
+public class TortController {
     @Autowired
     private ProductMessageService productMessageService;
     @Autowired
-    private FTOCompareRecordService ftoCompareRecordService;
+    private TortCompareRecordService tortCompareRecordService;
+    @Autowired
+    private ProjectTaskService projectTaskService;
 
     @Operation(summary = "编辑/保存标的产品信息")
     @PostMapping("/addProductMessage")
@@ -60,7 +63,7 @@ public class FTOReportController {
         if (tortCompareRecordDTO != null) {
             List<Integer> ids = new ArrayList<>();
             try {
-                ids = ftoCompareRecordService.addTortCompareRecord(tortCompareRecordDTO);
+                ids = tortCompareRecordService.addTortCompareRecord(tortCompareRecordDTO);
             } catch (Exception e) {
                 if (e instanceof XiaoShiException) {
                     return Response.error(e.getMessage());
@@ -80,8 +83,24 @@ public class FTOReportController {
 
     @Operation(summary = "查询侵权分析对比结果")
     @PostMapping("/getTortCompareRecord")
-    public Response getTortCompareRecord(@RequestBody GetAvoidDesignDTO getAvoidDesignDTO) throws Exception {
-        TortCompareRecordVO tortCompareRecordVO = ftoCompareRecordService.getTortCompareRecord(getAvoidDesignDTO);
+    public Response getTortCompareRecord(@RequestBody GetFeatureSplitDTO getFeatureSplitDTO) throws Exception {
+        TortCompareRecordVO tortCompareRecordVO = tortCompareRecordService.getTortCompareRecord(getFeatureSplitDTO);
+        return Response.success(tortCompareRecordVO);
+    }
+
+    @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 = "查询侵权分析协同任务对比结果")
+    @GetMapping("/getTortTaskResult")
+    public Response getTortTaskResult(Integer taskId) {
+        TortCompareRecordVO tortCompareRecordVO = tortCompareRecordService.getTortTaskResult(taskId);
         return Response.success(tortCompareRecordVO);
     }
 

+ 48 - 0
src/main/java/cn/cslg/pas/domain/business/AssoTaskPerson.java

@@ -0,0 +1,48 @@
+package cn.cslg.pas.domain.business;
+
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author xiexiang
+ * @Date 2023/12/9
+ */
+@Data
+@TableName("asso_task_person")
+public class AssoTaskPerson extends BaseEntity<AssoTaskPerson> {
+    /**
+     * 任务id
+     */
+    @TableField(value = "task_id")
+    private Integer taskId;
+
+    /**
+     * 人员id
+     */
+    @TableField(value = "person_id")
+    private String personId;
+
+    /**
+     * 人员id
+     * 是否是内部人员,true则为人员id,false则为邮箱
+     */
+    @TableField(value = "if_inner")
+    private Boolean ifInner;
+
+    /**
+     * 创建人id
+     */
+    @TableField(value = "create_id")
+    private String createId;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private Date createTime;
+
+}

+ 13 - 1
src/main/java/cn/cslg/pas/domain/business/FTOCompareRecord.java

@@ -46,7 +46,7 @@ public class FTOCompareRecord extends BaseEntity<FTOCompareRecord> {
     /**
      * 特征id
      */
-    @TableField(value = "featureId")
+    @TableField(value = "feature_id")
     private Integer featureId;
 
     /**
@@ -56,6 +56,18 @@ public class FTOCompareRecord extends BaseEntity<FTOCompareRecord> {
     private Integer projectTaskId;
 
     /**
+     * 是否原始
+     */
+    @TableField(value = "if_original")
+    private Boolean ifOriginal;
+
+    /**
+     * 是否最终
+     */
+    @TableField(value = "if_final")
+    private Boolean ifFinal;
+
+    /**
      * 创建人id
      */
     @TableField(value = "create_id")

+ 14 - 0
src/main/java/cn/cslg/pas/mapper/AssoTaskPersonMapper.java

@@ -0,0 +1,14 @@
+package cn.cslg.pas.mapper;
+
+import cn.cslg.pas.domain.business.AssoTaskPerson;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 任务与抄送人关联表
+ * @Author xiexiang
+ * @Date 2023/12/9
+ */
+@Repository
+public interface AssoTaskPersonMapper extends BaseMapper<AssoTaskPerson> {
+}

+ 18 - 0
src/main/java/cn/cslg/pas/service/business/AssoTaskPersonService.java

@@ -0,0 +1,18 @@
+package cn.cslg.pas.service.business;
+
+import cn.cslg.pas.domain.business.AssoTaskPerson;
+import cn.cslg.pas.mapper.AssoTaskPersonMapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 任务与抄送人关联Service
+ * @Author xiexiang
+ * @Date 2023/12/9
+ */
+@Service
+@Slf4j
+public class AssoTaskPersonService extends ServiceImpl<AssoTaskPersonMapper, AssoTaskPerson> {
+}

+ 9 - 12
src/main/java/cn/cslg/pas/service/business/AvoidDesignWholeService.java

@@ -1,8 +1,7 @@
 package cn.cslg.pas.service.business;
 
 import cn.cslg.pas.common.dto.business.AvoidDesignWholeDTO;
-import cn.cslg.pas.common.dto.business.GetAvoidDesignDTO;
-import cn.cslg.pas.common.model.cronModel.Personnel;
+import cn.cslg.pas.common.dto.business.GetFeatureSplitDTO;
 import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
@@ -16,12 +15,10 @@ import cn.cslg.pas.exception.UnLoginException;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.AvoidDesignWholeMapper;
 import cn.cslg.pas.service.permissions.PermissionService;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
@@ -80,22 +77,22 @@ public class AvoidDesignWholeService extends ServiceImpl<AvoidDesignWholeMapper,
 
     /**
      * 查询回避设计方案
-     * @param getAvoidDesignDTO
+     * @param getFeatureSplitDTO
      * @return
      */
-    public AvoidDesignWholeVO getAvoidDesignWhole(GetAvoidDesignDTO getAvoidDesignDTO) throws IOException {
+    public AvoidDesignWholeVO getAvoidDesignWhole(GetFeatureSplitDTO getFeatureSplitDTO) throws IOException {
         //判断参数不能为空
-        Integer projectId = getAvoidDesignDTO.getProjectId();
+        Integer projectId = getFeatureSplitDTO.getProjectId();
         if (projectId == null) {
             throw new XiaoShiException("projectId为空");
         }
-        if (getAvoidDesignDTO.getIfReSplit() == null) {
+        if (getFeatureSplitDTO.getIfReSplit() == null) {
             throw new XiaoShiException("ifReSplit不能为空");
         }
-        if (getAvoidDesignDTO.getSplitBy() == null) {
+        if (getFeatureSplitDTO.getSplitBy() == null) {
             throw new XiaoShiException("splitBy不能为空");
         }
-        if (getAvoidDesignDTO.getSplitType() == null) {
+        if (getFeatureSplitDTO.getSplitType() == null) {
             throw new XiaoShiException("splitType不能为空");
         }
         //返回的VO类
@@ -108,11 +105,11 @@ public class AvoidDesignWholeService extends ServiceImpl<AvoidDesignWholeMapper,
         String patentNo = reportProject.getSignPatentNo();
         //新建查询拆分特征DTO
         SplitVO splitVO = new SplitVO();
-        BeanUtils.copyProperties(getAvoidDesignDTO, splitVO);
+        BeanUtils.copyProperties(getFeatureSplitDTO, splitVO);
         splitVO.setPatentNo(patentNo);
         List<PatentRightVo> patentRightVos = new ArrayList<>();
         //判断是否重拆
-        if (getAvoidDesignDTO.getIfReSplit() == true) {//重拆
+        if (getFeatureSplitDTO.getIfReSplit() == true) {//重拆
             //重拆需要清空原有特征表、回避设计方向表、回避设计总体方向表
             //清空回避设计方向表
             LambdaQueryWrapper<AvoidDesign> deleteWrapper = new LambdaQueryWrapper<>();

+ 110 - 9
src/main/java/cn/cslg/pas/service/business/ProjectTaskService.java

@@ -74,13 +74,23 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
     @Autowired
     private ProjectService projectService;
 
+    @Autowired
+    private AssoTaskPersonService assoTaskPersonService;
+
+    @Autowired
+    private TortCompareRecordService tortCompareRecordService;
+
+    @Autowired
+    private ReportProjectService reportProjectService;
+
 
     /**
      * 项目开卷审核任务
+     *
      * @param patentDigProjectTaskDTO
      * @return
      */
-    public Object  addProjectOpenAuditTask(PatentDigProjectTaskDTO patentDigProjectTaskDTO){
+    public Object addProjectOpenAuditTask(PatentDigProjectTaskDTO patentDigProjectTaskDTO) {
         PatentDigProjectDTO patentDigProjectDTO = patentDigProjectTaskDTO.getPatentDigProjectDTO();
         ProjectTaskDTO projectTaskDTO = patentDigProjectTaskDTO.getProjectTaskDTO();
         //如果专利挖掘项目DTO不为空,则需要先建立专利挖掘项目
@@ -111,10 +121,11 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
 
     /**
      * 新建任务
+     *
      * @param projectTaskDTO
      * @return
      */
-    public Integer addTask(ProjectTaskDTO projectTaskDTO){
+    public Integer addTask(ProjectTaskDTO projectTaskDTO) {
         //判断专题库id不为空
         if (projectTaskDTO.getProjectId() == null) {
             throw new XiaoShiException("专题库id不能为空!");
@@ -183,15 +194,16 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
 
     /**
      * 查询任务
+     *
      * @param queryRequest
      * @return
      * @throws Exception
      */
     @Override
     public Object queryMessage(QueryRequest queryRequest) throws Exception {
-        List<String> sqls = formatQueryService.reSqls(queryRequest,"projectTask");
+        List<String> sqls = formatQueryService.reSqls(queryRequest, "projectTask");
         //根据sql查询任务信息
-        List<ProjectTaskVO> projectTaskVOS = projectTaskMapper.getProjectTask(sqls.get(0),sqls.get(1),sqls.get(2));
+        List<ProjectTaskVO> projectTaskVOS = projectTaskMapper.getProjectTask(sqls.get(0), sqls.get(1), sqls.get(2));
         //查询总数
         Long total = projectTaskMapper.getProjectTaskCount(sqls.get(0));
         //装载事件信息
@@ -206,6 +218,7 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
 
     /**
      * 装载任务
+     *
      * @param projectTaskVOS
      * @throws IOException
      */
@@ -267,6 +280,7 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
 
     /**
      * 根据任务id查询任务详情以及处理结果以及审核历史
+     *
      * @param taskId
      * @return
      */
@@ -413,6 +427,7 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
 
     /**
      * 装载任务详情的集合
+     *
      * @param taskDetailsVO
      * @throws IOException
      */
@@ -534,10 +549,11 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
 
     /**
      * 取消/完成任务
+     *
      * @param taskId
      * @param type
      */
-    public void finishTask(Integer taskId, Integer type){
+    public void finishTask(Integer taskId, Integer type) {
         //处理人直接完成任务
         LambdaQueryWrapper<ProjectTask> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(ProjectTask::getId, taskId);
@@ -640,7 +656,7 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
         return null;
     }
 
-    public List<Project> getProjectInfo(List<Integer> projectIds){
+    public List<Project> getProjectInfo(List<Integer> projectIds) {
         LambdaQueryWrapper<Project> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.in(Project::getId, projectIds);
         List<Project> projects = projectService.list(queryWrapper);
@@ -660,15 +676,100 @@ public class ProjectTaskService extends ServiceImpl<ProjectTaskMapper, ProjectTa
     }
 
     /**
-     * TODO 添加侵权分析审核任务
+     * TODO 添加侵权分析协同任务
      */
-
-    public void addTortTask(){
+    public Integer addTortTask(TortTaskDTO tortTaskDTO) {
         //1.保存任务信息 project_task表
+        if (tortTaskDTO == null) {
+            throw new XiaoShiException("入参不能为空!");
+        }
+        //判断报告id不为空
+        if (tortTaskDTO.getProjectId() == null) {
+            throw new XiaoShiException("报告id不能为空!");
+        }
+        //判断协同人员类型不为空
+        if (tortTaskDTO.getHandlerType() == null) {
+            throw new XiaoShiException("协同人员类型不能为空!");
+        }
+        //判断任务名称不为空
+        tortTaskDTO.setName(tortTaskDTO.getName().trim());
+        String name = tortTaskDTO.getName();
+        if (name == null || name.equals("")) {
+            throw new XiaoShiException("任务名称不能为空!");
+        }
+        tortTaskDTO.setType(4);
+        //获取登录人信息
+        PersonnelVO personnelVO = new PersonnelVO();
+        try {
+            personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+        } catch (Exception e) {
+            throw new UnLoginException("未登录");
+        }
+        ProjectTask projectTask = new ProjectTask();
+        BeanUtils.copyProperties(tortTaskDTO, projectTask);
+        projectTask.setCreateId(personnelVO.getId());
+        projectTask.setStatus(2);
+        projectTask.insert();
+        Integer taskId = projectTask.getId();
         //2.保存任务和人员关联表信息
+        if (taskId != null) {
+            List<CCPerson> ccPeople = tortTaskDTO.getCcPeople();
+            this.addTaskAndCCPeople(personnelVO.getId(), taskId, ccPeople);
+        } else {
+            throw new XiaoShiException("创建任务失败,未读取到任务id");
+        }
         //3.从侵权分析中获得对比结果,并复制保存
+        tortCompareRecordService.copyTortCompareRecords(tortTaskDTO.getProjectId(), taskId, personnelVO.getId());
         //4.发送邮件通知协同人和抄送人
+        return projectTask.getId();
+    }
 
+    /**
+     * 保存任务和人员关联表信息
+     *
+     * @param taskId
+     * @param ccPeople
+     */
+    public void addTaskAndCCPeople(String createId, Integer taskId, List<CCPerson> ccPeople) {
+        if (createId == null && createId.equals("")) {
+            throw new XiaoShiException("createId不能为空");
+        }
+        if (taskId == null) {
+            throw new XiaoShiException("taskId不能为空");
+        }
+        if (ccPeople != null && !ccPeople.isEmpty()) {
+            List<AssoTaskPerson> assoTaskPeople = new ArrayList<>();
+            ccPeople.forEach(item -> {
+                AssoTaskPerson assoTaskPerson = new AssoTaskPerson();
+                assoTaskPerson.setPersonId(item.getPersonId());
+                assoTaskPerson.setIfInner(item.getIfInner());
+                assoTaskPerson.setTaskId(taskId);
+                assoTaskPerson.setCreateId(createId);
+                assoTaskPeople.add(assoTaskPerson);
+            });
+            assoTaskPersonService.saveBatch(assoTaskPeople);
+        }
     }
 
+    public String getPatentNoByTaskId(Integer taskId) {
+        //根据任务id查询报告id
+        LambdaQueryWrapper<ProjectTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProjectTask::getId, taskId);
+        ProjectTask projectTask = this.getOne(queryWrapper, false);
+        if (projectTask != null) {
+            Integer projectId = projectTask.getProjectId();
+            //根据报告id查询专利号
+            LambdaQueryWrapper<ReportProject> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.eq(ReportProject::getProjectId, projectId);
+            ReportProject reportProject = reportProjectService.getOne(queryWrapper1, false);
+            if (reportProject != null) {
+                String patentNo = reportProject.getSignPatentNo();
+                return patentNo;
+            } else {
+                throw new XiaoShiException("报告为空");
+            }
+        } else {
+            throw new XiaoShiException("projectTask为空");
+        }
+    }
 }

+ 138 - 18
src/main/java/cn/cslg/pas/service/business/FTOCompareRecordService.java

@@ -1,19 +1,20 @@
 package cn.cslg.pas.service.business;
 
-import cn.cslg.pas.common.dto.business.GetAvoidDesignDTO;
+import cn.cslg.pas.common.dto.business.GetFeatureSplitDTO;
 import cn.cslg.pas.common.dto.business.TortCompareRecordDTO;
 import cn.cslg.pas.common.dto.business.TortDTO;
 import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 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.RePatentClaim;
 import cn.cslg.pas.common.vo.business.SplitVO;
 import cn.cslg.pas.common.vo.business.TortCompareRecordVO;
 import cn.cslg.pas.common.vo.business.TortRightVO;
 import cn.cslg.pas.common.vo.business.TortVO;
-import cn.cslg.pas.domain.business.AvoidDesign;
 import cn.cslg.pas.domain.business.FTOCompareRecord;
 import cn.cslg.pas.domain.business.Feature;
+import cn.cslg.pas.domain.business.ProjectTask;
 import cn.cslg.pas.domain.business.ReportProject;
 import cn.cslg.pas.exception.UnLoginException;
 import cn.cslg.pas.exception.XiaoShiException;
@@ -23,6 +24,7 @@ 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;
@@ -36,7 +38,7 @@ import java.util.stream.Collectors;
  */
 @Service
 @Slf4j
-public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper, FTOCompareRecord> {
+public class TortCompareRecordService extends ServiceImpl<FTOCompareRecordMapper, FTOCompareRecord> {
     @Autowired
     private CacheUtils cacheUtils;
 
@@ -49,6 +51,10 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
     @Autowired
     private ReportProjectService reportProjectService;
 
+    @Autowired
+    @Lazy
+    private ProjectTaskService projectTaskService;
+
     /**
      * 新增侵权对比结果
      *
@@ -127,19 +133,24 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
         }
     }
 
-    public TortCompareRecordVO getTortCompareRecord(GetAvoidDesignDTO getAvoidDesignDTO){
+    /**
+     * 查询侵权分析对比结果VO
+     * @param getFeatureSplitDTO
+     * @return
+     */
+    public TortCompareRecordVO getTortCompareRecord(GetFeatureSplitDTO getFeatureSplitDTO){
         //判断参数不能为空
-        Integer projectId = getAvoidDesignDTO.getProjectId();
+        Integer projectId = getFeatureSplitDTO.getProjectId();
         if (projectId == null) {
             throw new XiaoShiException("projectId为空");
         }
-        if (getAvoidDesignDTO.getIfReSplit() == null) {
+        if (getFeatureSplitDTO.getIfReSplit() == null) {
             throw new XiaoShiException("ifReSplit不能为空");
         }
-        if (getAvoidDesignDTO.getSplitBy() == null) {
+        if (getFeatureSplitDTO.getSplitBy() == null) {
             throw new XiaoShiException("splitBy不能为空");
         }
-        if (getAvoidDesignDTO.getSplitType() == null) {
+        if (getFeatureSplitDTO.getSplitType() == null) {
             throw new XiaoShiException("splitType不能为空");
         }
         //返回的VO类
@@ -152,11 +163,11 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
         String patentNo = reportProject.getSignPatentNo();
         //新建查询拆分特征DTO
         SplitVO splitVO = new SplitVO();
-        BeanUtils.copyProperties(getAvoidDesignDTO, splitVO);
+        BeanUtils.copyProperties(getFeatureSplitDTO, splitVO);
         splitVO.setPatentNo(patentNo);
         List<PatentRightVo> patentRightVos = new ArrayList<>();
         //判断是否重拆
-        if (getAvoidDesignDTO.getIfReSplit() == true) {//重拆
+        if (getFeatureSplitDTO.getIfReSplit() == true) {//重拆
             //重拆需要清空原有特征表、对比结果表
             LambdaQueryWrapper<FTOCompareRecord> deleteWrapper = new LambdaQueryWrapper<>();
             deleteWrapper.eq(FTOCompareRecord::getProjectId, projectId);
@@ -188,7 +199,10 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
                 List<TortVO> tortVOS = new ArrayList<>();
                 //特征信息
                 List<Feature> features = item.getFeatures();
-                tortVOS = this.loadTortVO(projectId, features);
+                LambdaQueryWrapper<FTOCompareRecord> queryWrapper2 = new LambdaQueryWrapper<>();
+                queryWrapper2.eq(FTOCompareRecord::getProjectId, projectId);
+                List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper2);
+                tortVOS = this.loadTortVO(features, ftoCompareRecords);
                 tortRightVO.setTortVOS(tortVOS);
                 tortRightVOS.add(tortRightVO);
             });
@@ -199,14 +213,8 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
         return tortCompareRecordVO;
     }
 
-
-
-
-    public List<TortVO> loadTortVO(Integer projectId, List<Feature> features){
+    public List<TortVO> loadTortVO(List<Feature> features, List<FTOCompareRecord> ftoCompareRecords){
         List<TortVO> tortVOS = new ArrayList<>();
-        LambdaQueryWrapper<FTOCompareRecord> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(FTOCompareRecord::getProjectId, projectId);
-        List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper);
         for (Feature feature : features) {
             //新建特征与侵权分析对比结果VO
             TortVO tortVO = new TortVO();
@@ -233,4 +241,116 @@ public class FTOCompareRecordService extends ServiceImpl<FTOCompareRecordMapper,
         }
         return tortVOS;
     }
+
+
+    /**
+     * 从侵权分析中获得对比结果,并复制保存
+     */
+    public void copyTortCompareRecords(Integer projectId, Integer taskId, String createId){
+        if (projectId != null && taskId != null) {
+            LambdaQueryWrapper<FTOCompareRecord> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(FTOCompareRecord::getProjectId, projectId);
+            List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper);
+            if (!ftoCompareRecords.isEmpty()) {
+                List<FTOCompareRecord> newTorts = new ArrayList<>();
+                ftoCompareRecords.forEach(item -> {
+                    FTOCompareRecord newTort = new FTOCompareRecord();
+                    newTort.setCompareResult(item.getCompareResult());
+                    newTort.setCompareDescription(item.getCompareDescription());
+                    newTort.setProjectId(projectId);
+                    newTort.setProjectTaskId(taskId);
+                    newTort.setFeatureId(item.getFeatureId());
+                    newTort.setTargetDescription(item.getTargetDescription());
+                    newTort.setIfOriginal(true);
+                    newTort.setIfFinal(false);
+                    newTort.setCreateId(createId);
+                    newTorts.add(newTort);
+                });
+                this.saveBatch(newTorts);
+            }
+        } else {
+            throw new XiaoShiException("projectId不能为空");
+        }
+    }
+
+    /**
+     * 查询侵权分析协同任务对比结果
+     * @param taskId
+     * @return
+     */
+    public TortCompareRecordVO getTortTaskResult(Integer taskId){
+        //新建返回VO
+        TortCompareRecordVO tortCompareRecordVO = new TortCompareRecordVO();
+        //根据任务id查询报告id
+        LambdaQueryWrapper<ProjectTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProjectTask::getId, taskId);
+        ProjectTask projectTask = projectTaskService.getOne(queryWrapper, false);
+        if (projectTask != null) {
+            Integer projectId = projectTask.getProjectId();
+            tortCompareRecordVO.setProjectId(projectId);
+            //根据报告id查询专利号
+            LambdaQueryWrapper<ReportProject> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.eq(ReportProject::getProjectId, projectId);
+            ReportProject reportProject = reportProjectService.getOne(queryWrapper1, false);
+            if (reportProject != null) {
+                String patentNo = reportProject.getSignPatentNo();
+                //根据专利号查询权要
+                try {
+                    List<PatentRightVo> patentRightVos = new ArrayList<>();
+                    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 = this.loadTortRightVOS(taskId, projectId, patentRightVos);
+                    tortCompareRecordVO.setTortRightVOS(tortRightVOS);
+                } catch (Exception e) {
+                    throw new XiaoShiException("未查询到拆分下的权要");
+                }
+            } else {
+                throw new XiaoShiException("未查询到报告");
+            }
+        } else {
+            throw new XiaoShiException("未查询到协同任务");
+        }
+        return tortCompareRecordVO;
+    }
+
+    /**
+     * 根据projectId和权要集合装载返回侵权分析对比结果页面VO
+     * @param projectId
+     * @param taskId
+     * @param patentRightVos
+     * @return
+     */
+    public List<TortRightVO> loadTortRightVOS(Integer taskId, Integer projectId, List<PatentRightVo> patentRightVos){
+        if (patentRightVos != null && !patentRightVos.isEmpty()) {
+            //新建权要层信息
+            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> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(FTOCompareRecord::getProjectId, projectId).eq(FTOCompareRecord::getProjectTaskId, taskId);
+                List<FTOCompareRecord> ftoCompareRecords = this.list(queryWrapper);
+                tortVOS = this.loadTortVO(features, ftoCompareRecords);
+                tortRightVO.setTortVOS(tortVOS);
+                tortRightVOS.add(tortRightVO);
+            });
+            return tortRightVOS;
+        } else {
+            throw new XiaoShiException("传入权要为空");
+        }
+    }
+
+
+
+    //保存侵权分析协同任务结果
+    //[{ 特征id,fto对比记录}],任务id
 }

+ 62 - 38
src/main/resources/jsons/patent.json

@@ -38,7 +38,7 @@
   {
     "name": "授权号",
     "type": "String",
-    "value": "grantNo",
+    "value": "GN",
     "field": "GN",
     "esField": "grant_no.keyword",
     "esClass": "wildcardQueryBuilder",
@@ -49,8 +49,8 @@
   },
   {
     "name": "公开日",
-    "type": "Date",
-    "value": "publicDate",
+    "type": "String",
+    "value": "PD",
     "field": "PD",
     "esField": "public_date",
     "esClass": "dateQueryBuilder",
@@ -62,7 +62,7 @@
   {
     "name": "申请日",
     "type": "String",
-    "value": "appDate",
+    "value": "AD",
     "field": "AD",
     "esField": "app_date",
     "esClass": "dateQueryBuilder",
@@ -74,7 +74,7 @@
   {
     "name": "授权日",
     "type": "String",
-    "value": "grantDate",
+    "value": "GD",
     "field": "GD",
     "esField": "grant_date",
     "esClass": "dateQueryBuilder",
@@ -109,20 +109,44 @@
   },
   {
     "name": "摘要",
-    "type": "Object",
-    "value": "abstractStr",
+    "type": "String",
+    "value": "TX",
+    "field": "abstractStr",
+    "esField": "abstract_str",
+    "esClass": "matchQueryBuilder",
+    "ifSearch": "false",
+    "ifGroup": "false",
+    "ifShow": "false",
+    "ifAsCondition": "true"
+  },
+  {
+    "name": "摘要内容",
+    "type": "String",
+    "value": "AB",
     "field": "AB",
     "esField": "abstract_str.text_content",
     "esClass": "matchQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "true",
+    "ifShow": "false",
     "ifAsCondition": "true"
   },
   {
     "name": "标题",
-    "type": "Object",
-    "value": "title",
+    "type": "String",
+    "value": "TX",
+    "field": "TX",
+    "esField": "title",
+    "esClass": "matchQueryBuilder",
+    "ifSearch": "false",
+    "ifGroup": "false",
+    "ifShow": "false",
+    "ifAsCondition": "true"
+  },
+  {
+    "name": "标题内容",
+    "type": "String",
+    "value": "TI",
     "field": "TI",
     "esField": "title.text_content",
     "esClass": "matchQueryBuilder",
@@ -145,8 +169,8 @@
   },
   {
     "name": "申请人",
-    "type": "Array",
-    "value": "applicant",
+    "type": "String",
+    "value": "PA",
     "field": "PA",
     "esField": "applicant.name",
     "esClass": "nestedQueryBuilder",
@@ -157,8 +181,8 @@
   },
   {
     "name": "发明人",
-    "type": "Array",
-    "value": "inventor",
+    "type": "String",
+    "value": "IN",
     "field": "IN",
     "esField": "inventor.name",
     "esClass": "nestedQueryBuilder",
@@ -169,8 +193,8 @@
   },
   {
     "name": "权利人",
-    "type": "Array",
-    "value": "rightHolder",
+    "type": "String",
+    "value": "PE",
     "field": "PE",
     "esField": "right_holder.name",
     "esClass": "nestedQueryBuilder",
@@ -188,7 +212,7 @@
     "esClass": "matchQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -200,13 +224,13 @@
     "esClass": "matchQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
     "name": "代理机构",
     "type": "String",
-    "value": "agency",
+    "value": "AGN",
     "field": "AGN",
     "esField": "agency",
     "esClass": "matchQueryBuilder",
@@ -217,7 +241,7 @@
   },
   {
     "name": "代理人名称",
-    "type": "Array",
+    "type": "String",
     "value": "agent",
     "field": "agent",
     "esField": "agent",
@@ -260,7 +284,7 @@
     "esClass": "matchQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -272,7 +296,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -284,7 +308,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -296,7 +320,7 @@
     "esClass": "prefixQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -308,7 +332,7 @@
     "esClass": "prefixQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -320,7 +344,7 @@
     "esClass": "prefixQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -332,7 +356,7 @@
     "esClass": "matchQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -344,7 +368,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -356,7 +380,7 @@
     "esClass": "prefixQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -368,7 +392,7 @@
     "esClass": "prefixQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -380,7 +404,7 @@
     "esClass": "prefixQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -404,7 +428,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -416,7 +440,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -428,7 +452,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -440,7 +464,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -452,7 +476,7 @@
     "esClass": "keyWordQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -464,7 +488,7 @@
     "esClass": "matchQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {
@@ -476,7 +500,7 @@
     "esClass": "matchQueryBuilder",
     "ifSearch": "false",
     "ifGroup": "false",
-    "ifShow": "false",
+    "ifShow": "true",
     "ifAsCondition": "true"
   },
   {