Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

lwhhszx vor 1 Jahr
Ursprung
Commit
0e15f814d9
29 geänderte Dateien mit 1786 neuen und 18 gelöschten Zeilen
  1. 54 0
      src/main/java/cn/cslg/pas/common/dto/business/AsInvalidReasonHistoryDTO.java
  2. 58 0
      src/main/java/cn/cslg/pas/common/dto/business/InvalidRecordDTO.java
  3. 28 0
      src/main/java/cn/cslg/pas/common/dto/es/EsValueCurveDTO.java
  4. 28 0
      src/main/java/cn/cslg/pas/common/dto/es/SelectValueCurveDTO.java
  5. 71 0
      src/main/java/cn/cslg/pas/common/vo/business/AsInvalidReasonHistoryVO.java
  6. 71 0
      src/main/java/cn/cslg/pas/common/vo/business/InvalidRecordVO.java
  7. 34 0
      src/main/java/cn/cslg/pas/common/vo/es/EsValueCurveVO.java
  8. 53 0
      src/main/java/cn/cslg/pas/controller/AsInvalidReasonHistoryController.java
  9. 53 0
      src/main/java/cn/cslg/pas/controller/InvalidRecordController.java
  10. 16 4
      src/main/java/cn/cslg/pas/controller/PatentController.java
  11. 68 0
      src/main/java/cn/cslg/pas/domain/business/AsInvalidReasonHistory.java
  12. 65 0
      src/main/java/cn/cslg/pas/domain/business/InvalidRecord.java
  13. 13 0
      src/main/java/cn/cslg/pas/mapper/AsInvalidReasonHistoryMapper.java
  14. 13 0
      src/main/java/cn/cslg/pas/mapper/InvalidRecordMapper.java
  15. 9 0
      src/main/java/cn/cslg/pas/mapper/PermissionRecordMapper.java
  16. 7 0
      src/main/java/cn/cslg/pas/mapper/ProductMarketDataMapper.java
  17. 298 0
      src/main/java/cn/cslg/pas/service/business/AsInvalidReasonHistoryService.java
  18. 3 1
      src/main/java/cn/cslg/pas/service/business/HightlightTemplateService.java
  19. 309 0
      src/main/java/cn/cslg/pas/service/business/InvalidRecordService.java
  20. 2 1
      src/main/java/cn/cslg/pas/service/business/LitigationHistoryService.java
  21. 1 0
      src/main/java/cn/cslg/pas/service/business/OtherReferencesService.java
  22. 2 3
      src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java
  23. 3 1
      src/main/java/cn/cslg/pas/service/business/ReviewHistoryService.java
  24. 0 1
      src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java
  25. 429 0
      src/main/java/cn/cslg/pas/service/business/es/EsValueCurveService.java
  26. 19 5
      src/main/resources/jsons/patentDigProjectFiles.json
  27. 2 2
      src/main/resources/jsons/projectTask.json
  28. 28 0
      src/main/resources/mapper/PermissionRecordMapper.xml
  29. 49 0
      src/main/resources/mapper/ProductMarketDataMapper.xml

+ 54 - 0
src/main/java/cn/cslg/pas/common/dto/business/AsInvalidReasonHistoryDTO.java

@@ -0,0 +1,54 @@
+package cn.cslg.pas.common.dto.business;
+
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 作为无效证据使用历史dto
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Data
+public class AsInvalidReasonHistoryDTO {
+    private Integer id;
+    /**
+     * 无效案号
+     */
+    private String invalidCaseNum;
+
+    /**
+     * 被无效的专利
+     */
+    private String invalidedPatent;
+
+    /**
+     * 被无效的时间
+     */
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
+    private Date invalidTime;
+
+    /**
+     * 无效理由
+     */
+    private String invalidReason;
+
+    /**
+     * 是否被审查员认可
+     */
+    private Boolean ifApproved;
+
+    /**
+     * 专利号
+     */
+    private String patentNo;
+
+    private List<String> fileGuids;
+}

+ 58 - 0
src/main/java/cn/cslg/pas/common/dto/business/InvalidRecordDTO.java

@@ -0,0 +1,58 @@
+package cn.cslg.pas.common.dto.business;
+
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Data
+public class InvalidRecordDTO {
+    private Integer id;
+    /**
+     * 专利号
+     */
+    private String patentNo;
+
+    /**
+     * 无效案号
+     */
+    private String invalidCaseNum;
+
+    /**
+     * 无效时间
+     */
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
+    private Date invalidTime;
+
+    /**
+     * 判决时间
+     */
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
+    private Date judgementTime;
+
+    /**
+     * 结果
+     */
+    private String result;
+
+    /**
+     * 无效申请人
+     */
+    private String invalidApplicant;
+
+    private List<String> fileGuids;
+}

+ 28 - 0
src/main/java/cn/cslg/pas/common/dto/es/EsValueCurveDTO.java

@@ -0,0 +1,28 @@
+package cn.cslg.pas.common.dto.es;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class EsValueCurveDTO {
+
+    //0月  1季  2年
+    private Integer timeType;
+
+    //营销时间
+    private String time;
+
+    //营销地区
+    private String saleArea;
+
+    //销售额(万元)
+    private Double saleMoney;
+
+    //自定义许可费
+    private Double customLicense;
+
+    //许可费用(万元)
+    private Double licenseFee;
+
+}

+ 28 - 0
src/main/java/cn/cslg/pas/common/dto/es/SelectValueCurveDTO.java

@@ -0,0 +1,28 @@
+package cn.cslg.pas.common.dto.es;
+
+import lombok.Data;
+
+@Data
+public class SelectValueCurveDTO {
+
+    //0月  1季  2年
+    private Integer timeType;
+
+    //营销时间
+    private String saleTime;
+
+    //营销地区
+    private String saleArea;
+
+    //销售额(万元)
+    private Double saleMoney;
+
+    //自定义许可费
+    private Double customLicense;
+
+    //许可费用(万元)
+    private Double licenseFee;
+
+    //许可时间
+    private String licenseTime;
+}

+ 71 - 0
src/main/java/cn/cslg/pas/common/vo/business/AsInvalidReasonHistoryVO.java

@@ -0,0 +1,71 @@
+package cn.cslg.pas.common.vo.business;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 作为无效证据使用历史VO
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Data
+public class AsInvalidReasonHistoryVO {
+    private Integer id;
+    /**
+     * 无效案号
+     */
+    private String invalidCaseNum;
+
+    /**
+     * 被无效的专利
+     */
+    private String invalidedPatent;
+
+    /**
+     * 被无效的时间
+     */
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
+    private Date invalidTime;
+
+    /**
+     * 无效理由
+     */
+    private String invalidReason;
+
+    /**
+     * 是否被审查员认可
+     */
+    private Boolean ifApproved;
+
+    /**
+     * 创建人
+     */
+    private String createId;
+
+    private String createName;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 专利号
+     */
+    private String patentNo;
+
+    private List<String> fileGuids;
+
+    private List<SystemFile> systemFileList;
+
+    private Boolean ifAdd;
+}

+ 71 - 0
src/main/java/cn/cslg/pas/common/vo/business/InvalidRecordVO.java

@@ -0,0 +1,71 @@
+package cn.cslg.pas.common.vo.business;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Data
+public class InvalidRecordVO {
+    private Integer id;
+    /**
+     * 专利号
+     */
+    private String patentNo;
+
+    /**
+     * 无效案号
+     */
+    private String invalidCaseNum;
+
+    /**
+     * 无效时间
+     */
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
+    private Date invalidTime;
+
+    /**
+     * 判决时间
+     */
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
+    private Date judgementTime;
+
+    /**
+     * 结果
+     */
+    private String result;
+
+    /**
+     * 无效申请人id
+     */
+    private String invalidApplicantId;
+
+    /**
+     * 无效申请人
+     */
+    private String invalidApplicant;
+
+    private String createId;
+
+    private String createName;
+
+    private Date createTime;
+
+    private List<String> fileGuids;
+
+    private List<SystemFile> systemFileList;
+
+    private Boolean ifAdd;
+}

+ 34 - 0
src/main/java/cn/cslg/pas/common/vo/es/EsValueCurveVO.java

@@ -0,0 +1,34 @@
+package cn.cslg.pas.common.vo.es;
+
+import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
+import cn.cslg.pas.common.model.request.OrderDTO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EsValueCurveVO {
+
+    private Integer projectId;
+
+    private Integer taskId;
+
+    private List<String> isAdd;
+
+    private List<String> isDelete;
+
+    private Integer startNumber;
+
+    private Integer endNumber;
+
+    private String searchQuery;
+
+    private List<OrderDTO> orderDTOList;
+
+    private List<EsCustomFieldValueDTO> customFields;
+
+    //0月  1季  2年
+    private Integer timeType;
+    //地区
+    private String area;
+}

+ 53 - 0
src/main/java/cn/cslg/pas/controller/AsInvalidReasonHistoryController.java

@@ -0,0 +1,53 @@
+package cn.cslg.pas.controller;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.business.AsInvalidReasonHistoryDTO;
+import cn.cslg.pas.common.dto.business.OtherPatentInfoDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.service.business.AsInvalidReasonHistoryService;
+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.List;
+
+/**
+ * 作为无效证据使用历史
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Slf4j
+@RequestMapping(Constants.API_XiaoSHI + "/asInvalidReasonHistory")
+@RestController
+public class AsInvalidReasonHistoryController {
+    @Autowired
+    private AsInvalidReasonHistoryService asInvalidReasonHistoryService;
+
+    @Operation(summary = "添加or更新作为无效证据使用历史")
+    @PostMapping("/saveOrUpdate")
+    public Response saveOrUpdate(@RequestBody AsInvalidReasonHistoryDTO asInvalidReasonHistoryDTO){
+        Integer id = asInvalidReasonHistoryService.saveOrUpdate(asInvalidReasonHistoryDTO);
+        Records records = new Records();
+        records.setData(id);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "查询作为无效证据使用历史")
+    @PostMapping("/query")
+    public Response queryAsInvalidReasonHistory(@RequestBody OtherPatentInfoDTO otherPatentInfoDTO) throws Exception {
+        String patentNo = otherPatentInfoDTO.getPatentNo();
+        Records records = asInvalidReasonHistoryService.getAsInvalidReasonHistory(patentNo);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "删除作为无效证据使用历史")
+    @PostMapping("/delete")
+    public Response delete(@RequestBody List<Integer> ids) throws Exception {
+        List<Integer> deleteIds = asInvalidReasonHistoryService.deleteAsInvalidReasonHistory(ids);
+        Records records = new Records();
+        records.setData(deleteIds);
+        return Response.success(records);
+    }
+}

+ 53 - 0
src/main/java/cn/cslg/pas/controller/InvalidRecordController.java

@@ -0,0 +1,53 @@
+package cn.cslg.pas.controller;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.business.InvalidRecordDTO;
+import cn.cslg.pas.common.dto.business.OtherPatentInfoDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.service.business.InvalidRecordService;
+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.List;
+
+/**
+ * 被无效历史
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Slf4j
+@RequestMapping(Constants.API_XiaoSHI + "/invalidRecord")
+@RestController
+public class InvalidRecordController {
+    @Autowired
+    private InvalidRecordService invalidRecordService;
+
+    @Operation(summary = "添加or更新被无效历史")
+    @PostMapping("/saveOrUpdate")
+    public Response saveOrUpdate(@RequestBody InvalidRecordDTO invalidRecordDTO){
+        Integer id = invalidRecordService.saveOrUpdate(invalidRecordDTO);
+        Records records = new Records();
+        records.setData(id);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "查询被无效历史")
+    @PostMapping("/query")
+    public Response queryAsInvalidReasonHistory(@RequestBody OtherPatentInfoDTO otherPatentInfoDTO) throws Exception {
+        String patentNo = otherPatentInfoDTO.getPatentNo();
+        Records records = invalidRecordService.getInvalidRecord(patentNo);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "删除被无效历史")
+    @PostMapping("/delete")
+    public Response delete(@RequestBody List<Integer> ids) throws Exception {
+        List<Integer> deleteIds = invalidRecordService.deleteInvalidRecord(ids);
+        Records records = new Records();
+        records.setData(deleteIds);
+        return Response.success(records);
+    }
+}

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

@@ -7,6 +7,7 @@ import cn.cslg.pas.common.dto.PatentExport.TaskParams;
 import cn.cslg.pas.common.dto.business.EsCountDTO;
 import cn.cslg.pas.common.dto.business.SelectClaimDTO;
 import cn.cslg.pas.common.dto.es.EsDateRangeDTO;
+import cn.cslg.pas.common.dto.es.EsValueCurveDTO;
 import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.StringRequest;
@@ -21,6 +22,7 @@ import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.common.vo.es.EsCustomFieldBatchVO;
 import cn.cslg.pas.common.vo.es.EsDateRangeVO;
 import cn.cslg.pas.common.vo.es.EsProductPatentVO;
+import cn.cslg.pas.common.vo.es.EsValueCurveVO;
 import cn.cslg.pas.domain.business.ImportTask;
 import cn.cslg.pas.domain.business.Product;
 import cn.cslg.pas.exception.XiaoShiException;
@@ -31,10 +33,7 @@ import cn.cslg.pas.service.business.ImportTaskService;
 import cn.cslg.pas.service.business.PDFExportFirstPageService;
 import cn.cslg.pas.service.business.PatentExportService;
 import cn.cslg.pas.service.business.MergePersonService;
-import cn.cslg.pas.service.business.es.EsCountService;
-import cn.cslg.pas.service.business.es.EsPatentService;
-import cn.cslg.pas.service.business.es.EsProductPatentService;
-import cn.cslg.pas.service.business.es.EsService;
+import cn.cslg.pas.service.business.es.*;
 import cn.cslg.pas.service.common.FileManagerService;
 import cn.cslg.pas.service.common.PatentStarApiService;
 import cn.hutool.core.util.IdUtil;
@@ -77,6 +76,9 @@ public class PatentController {
     private EsProductPatentService esProductPatentService;
 
     @Autowired
+    private EsValueCurveService esValueCurveService;
+
+    @Autowired
     private PatentStarApiService patentStarApiService;
 
     @Autowired
@@ -322,4 +324,14 @@ public class PatentController {
         List<Integer> ids = esProductPatentService.delProductPatent(vo);
         return Response.success(ids);
     }
+
+    //---------------------------价值曲线---------------------
+    @PostMapping("/selectValueCurve")
+    @Operation(summary = "查询价值曲线")
+    public Response selectValueCurve(@RequestBody EsValueCurveVO vo) throws Exception {
+        List<EsValueCurveDTO> list = esValueCurveService.selectValueCurve(vo);
+        Records records = new Records();
+        records.setData(list);
+        return Response.success(records);
+    }
 }

+ 68 - 0
src/main/java/cn/cslg/pas/domain/business/AsInvalidReasonHistory.java

@@ -0,0 +1,68 @@
+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 2024/1/19
+ */
+@Data
+@TableName("as_invalid_reason_history")
+public class AsInvalidReasonHistory extends BaseEntity<AsInvalidReasonHistory> {
+    /**
+     * 无效案号
+     */
+    @TableField(value = "invalid_case_num")
+    private String invalidCaseNum;
+
+    /**
+     * 被无效的专利
+     */
+    @TableField(value = "invalided_patent")
+    private String invalidedPatent;
+
+    /**
+     * 被无效的时间
+     */
+    @TableField(value = "invalid_time")
+    private Date invalidTime;
+
+    /**
+     * 无效理由
+     */
+    @TableField(value = "invalid_reason")
+    private String invalidReason;
+
+    /**
+     * 是否被审查员认可
+     */
+    @TableField(value = "if_approved")
+    private Boolean ifApproved;
+
+    /**
+     * 创建人
+     */
+    @TableField(value = "create_id")
+    private String createId;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private Date createTime;
+
+    /**
+     * 专利号
+     */
+    @TableField(value = "patent_no")
+    private String patentNo;
+
+    @TableField(value = "tenant_id")
+    private Integer tenantId;
+}

+ 65 - 0
src/main/java/cn/cslg/pas/domain/business/InvalidRecord.java

@@ -0,0 +1,65 @@
+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 2024/1/19
+ */
+@Data
+@TableName("invalid_record")
+public class InvalidRecord extends BaseEntity<InvalidRecord> {
+    /**
+     * 专利号
+     */
+    @TableField(value = "patent_no")
+    private String patentNo;
+
+    /**
+     * 无效案号
+     */
+    @TableField(value = "invalid_case_num")
+    private String invalidCaseNum;
+
+    /**
+     * 无效时间
+     */
+    @TableField(value = "invalid_time")
+    private Date invalidTime;
+
+    /**
+     * 判决时间
+     */
+    @TableField(value = "judgement_time")
+    private Date judgementTime;
+
+    /**
+     * 结果
+     */
+    @TableField(value = "result")
+    private String result;
+
+    /**
+     * 无效申请人
+     */
+    @TableField(value = "invalid_applicant")
+    private String invalidApplicant;
+
+    /**
+     * 创建人
+     */
+    @TableField(value = "create_id")
+    private String createId;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private Date createTime;
+}

+ 13 - 0
src/main/java/cn/cslg/pas/mapper/AsInvalidReasonHistoryMapper.java

@@ -0,0 +1,13 @@
+package cn.cslg.pas.mapper;
+
+import cn.cslg.pas.domain.business.AsInvalidReasonHistory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Repository
+public interface AsInvalidReasonHistoryMapper extends BaseMapper<AsInvalidReasonHistory> {
+}

+ 13 - 0
src/main/java/cn/cslg/pas/mapper/InvalidRecordMapper.java

@@ -0,0 +1,13 @@
+package cn.cslg.pas.mapper;
+
+import cn.cslg.pas.domain.business.InvalidRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Repository
+public interface InvalidRecordMapper extends BaseMapper<InvalidRecord> {
+}

+ 9 - 0
src/main/java/cn/cslg/pas/mapper/PermissionRecordMapper.java

@@ -1,13 +1,22 @@
 package cn.cslg.pas.mapper;
 
+import cn.cslg.pas.common.dto.es.SelectValueCurveDTO;
 import cn.cslg.pas.domain.business.PermissionRecord;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @Author xiexiang
  * @Date 2024/1/16
  */
 @Repository
 public interface PermissionRecordMapper extends BaseMapper<PermissionRecord> {
+
+    public List<SelectValueCurveDTO> selectLicenseeMonthList(String patentNo);
+
+    public List<SelectValueCurveDTO> selectLicenseeYearList(String patentNo);
+
+    public List<SelectValueCurveDTO> selectLicenseeQuarterList(String patentNo);
 }

+ 7 - 0
src/main/java/cn/cslg/pas/mapper/ProductMarketDataMapper.java

@@ -1,5 +1,6 @@
 package cn.cslg.pas.mapper;
 
+import cn.cslg.pas.common.dto.es.SelectValueCurveDTO;
 import cn.cslg.pas.common.vo.GroupMarketDataVO;
 import cn.cslg.pas.common.vo.business.ProductMarketDataVO;
 import cn.cslg.pas.domain.business.ProductMarketData;
@@ -19,4 +20,10 @@ public interface ProductMarketDataMapper extends BaseMapper<ProductMarketData> {
     public Long getProductMarketDataCount(String sql);
     public List<GroupMarketDataVO> getGroups(List<String> sqls, String tableName, String groupField, String selectField);
     public List<GroupMarketDataVO> getPartGroups(List<String> sqls, String tableName, String groupField, String selectField);
+
+    public List<SelectValueCurveDTO> selectSaleMonthList(List<Integer> productIds);
+
+    public List<SelectValueCurveDTO> selectSaleYearList(List<Integer> productIds);
+
+    public List<SelectValueCurveDTO> selectSaleQuarterList(List<Integer> productIds);
 }

+ 298 - 0
src/main/java/cn/cslg/pas/service/business/AsInvalidReasonHistoryService.java

@@ -0,0 +1,298 @@
+package cn.cslg.pas.service.business;
+
+import cn.cslg.pas.common.dto.business.AsInvalidReasonHistoryDTO;
+import cn.cslg.pas.common.model.cronModel.Personnel;
+import cn.cslg.pas.common.model.cronModel.PersonnelVO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.common.utils.StringUtils;
+import cn.cslg.pas.common.vo.business.AsInvalidReasonHistoryVO;
+import cn.cslg.pas.domain.business.*;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.mapper.AsInvalidReasonHistoryMapper;
+import cn.cslg.pas.service.business.invalidReport.AssoReasonLiteratureService;
+import cn.cslg.pas.service.common.FileManagerService;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 作为无效证据使用历史
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Slf4j
+@Service
+public class AsInvalidReasonHistoryService extends ServiceImpl<AsInvalidReasonHistoryMapper, AsInvalidReasonHistory> {
+    @Autowired
+    private LoginUtils loginUtils;
+
+    @Autowired
+    private CacheUtils cacheUtils;
+
+    @Autowired
+    private PermissionService permissionService;
+
+    @Autowired
+    private AssoOtherPatentInfoFileService assoOtherPatentInfoFileService;
+
+    @Autowired
+    private OtherReferencesService otherReferencesService;
+
+    @Autowired
+    private FileManagerService fileManagerService;
+
+    @Autowired
+    private CompareLiteratureService compareLiteratureService;
+
+    @Autowired
+    private ReportProjectService reportProjectService;
+
+    @Autowired
+    private ProjectService projectService;
+
+    @Autowired
+    private InvalidRecordService invalidRecordService;
+
+    @Autowired
+    private AssoReasonLiteratureService assoReasonLiteratureService;
+
+    /**
+     * 新增or更新
+     * @param asInvalidReasonHistoryDTO
+     * @return
+     */
+    public Integer saveOrUpdate(AsInvalidReasonHistoryDTO asInvalidReasonHistoryDTO){
+        if (asInvalidReasonHistoryDTO == null) {
+            throw new XiaoShiException("入参为空");
+        }
+        Integer id = asInvalidReasonHistoryDTO.getId();
+        List<String> fileGuids = asInvalidReasonHistoryDTO.getFileGuids();
+        AsInvalidReasonHistory asInvalidReasonHistory = new AsInvalidReasonHistory();
+        Integer type = 5;
+        if (id != null) {
+            //update
+            asInvalidReasonHistory = this.getById(id);
+            BeanUtils.copyProperties(asInvalidReasonHistoryDTO, asInvalidReasonHistory);
+            asInvalidReasonHistory.updateById();
+            //先删除 后添加
+            LambdaQueryWrapper<AssoOtherPatentInfoFile> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(AssoOtherPatentInfoFile::getOtherPatentInfoId, id)
+                    .eq(AssoOtherPatentInfoFile::getType, type);
+            assoOtherPatentInfoFileService.remove(queryWrapper);
+            if (fileGuids != null && !fileGuids.isEmpty()) {
+                List<Integer> fileIds = otherReferencesService.addFile(asInvalidReasonHistory.getId(), fileGuids, type);
+            }
+        } else {
+            BeanUtils.copyProperties(asInvalidReasonHistoryDTO, asInvalidReasonHistory);
+            PersonnelVO personnelVO = new PersonnelVO();
+            try {
+                personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+            } catch (Exception e) {
+                throw new XiaoShiException("未查询到当前登陆人");
+            }
+            asInvalidReasonHistory.setCreateId(personnelVO.getId());
+            asInvalidReasonHistory.setTenantId(personnelVO.getTenantId());
+            asInvalidReasonHistory.insert();
+            if (fileGuids != null && !fileGuids.isEmpty()) {
+                //先删除 后添加
+                List<Integer> fileIds = otherReferencesService.addFile(asInvalidReasonHistory.getId(), fileGuids, type);
+            }
+        }
+        return asInvalidReasonHistory.getId();
+    }
+
+    /**
+     * 查询
+     * @param patentNo
+     * @return
+     * @throws IOException
+     */
+    public Records getAsInvalidReasonHistory(String patentNo) throws IOException {
+        List<AsInvalidReasonHistoryVO> asInvalidReasonHistoryVOS = new ArrayList<>();
+        if (patentNo == null || StringUtils.isEmpty(patentNo)) {
+            throw new XiaoShiException("入参为空");
+        }
+
+        LambdaQueryWrapper<AsInvalidReasonHistory> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AsInvalidReasonHistory::getPatentNo, patentNo)
+                .orderByDesc(AsInvalidReasonHistory::getInvalidTime);
+        List<AsInvalidReasonHistory> asInvalidReasonHistories = this.list(queryWrapper);
+
+        if (!asInvalidReasonHistories.isEmpty()) {
+            asInvalidReasonHistories.forEach(item -> {
+                AsInvalidReasonHistoryVO asInvalidReasonHistoryVO = new AsInvalidReasonHistoryVO();
+                BeanUtils.copyProperties(item, asInvalidReasonHistoryVO);
+                asInvalidReasonHistoryVO.setIfAdd(true);
+                LambdaQueryWrapper<AssoOtherPatentInfoFile> queryWrapper1 = new LambdaQueryWrapper<>();
+                queryWrapper1.eq(AssoOtherPatentInfoFile::getOtherPatentInfoId, asInvalidReasonHistoryVO.getId())
+                        .eq(AssoOtherPatentInfoFile::getType, 5);
+                List<AssoOtherPatentInfoFile> assoOtherPatentInfoFiles = assoOtherPatentInfoFileService.list(queryWrapper1);
+                if (!assoOtherPatentInfoFiles.isEmpty()) {
+                    List<String> fileGuids = assoOtherPatentInfoFiles.stream().map(AssoOtherPatentInfoFile::getFileGuid).collect(Collectors.toList());
+                    asInvalidReasonHistoryVO.setFileGuids(fileGuids);
+                }
+                asInvalidReasonHistoryVOS.add(asInvalidReasonHistoryVO);
+            });
+        }
+        List<AsInvalidReasonHistoryVO> finalVOS = this.findInInvalidReport(patentNo, asInvalidReasonHistoryVOS);
+        this.loadAsInvalidReasonHistoryVOS(finalVOS);
+        Records records = new Records();
+        records.setData(finalVOS);
+        return records;
+    }
+
+    /**
+     * 装载
+     * @param asInvalidReasonHistoryVOS
+     * @throws IOException
+     */
+    public void loadAsInvalidReasonHistoryVOS(List<AsInvalidReasonHistoryVO> asInvalidReasonHistoryVOS) throws IOException {
+        List<String> createIds = new ArrayList<>();
+        asInvalidReasonHistoryVOS.forEach(item -> {
+            if (item.getCreateId() != null) {
+                createIds.add(item.getCreateId());
+            }
+        });
+        List<Personnel> personnels = new ArrayList<>();
+        //查询发起人名称
+        if (createIds.size() != 0) {
+            String res = permissionService.getPersonnelByIdsFromPCS(createIds);
+            JSONObject jsonObject = JSONObject.parseObject(res);
+            personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
+        }
+        //装载信息
+        for (AsInvalidReasonHistoryVO asInvalidReasonHistoryVO : asInvalidReasonHistoryVOS) {
+            //装载人员信息
+            Personnel personnel = personnels.stream().filter(item -> item.getId().equals(asInvalidReasonHistoryVO.getCreateId())).findFirst().orElse(null);
+            if (personnel != null) {
+                asInvalidReasonHistoryVO.setCreateName(personnel.getPersonnelName());
+            }
+            LambdaQueryWrapper<AssoOtherPatentInfoFile> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(AssoOtherPatentInfoFile::getOtherPatentInfoId, asInvalidReasonHistoryVO.getId())
+                    .eq(AssoOtherPatentInfoFile::getType, 5);
+            List<AssoOtherPatentInfoFile> assoOtherPatentInfoFiles = assoOtherPatentInfoFileService.list(queryWrapper);
+            if (!assoOtherPatentInfoFiles.isEmpty()) {
+                List<String> fileGuids = assoOtherPatentInfoFiles.stream().map(AssoOtherPatentInfoFile::getFileGuid).collect(Collectors.toList());
+                asInvalidReasonHistoryVO.setFileGuids(fileGuids);
+                List<SystemFile> systemFiles = new ArrayList<>();
+                if (fileGuids.size() != 0) {
+                    String res = fileManagerService.getSystemFileFromFMS(fileGuids);
+                    systemFiles = JSONObject.parseArray(res, SystemFile.class);
+                }
+                if (!systemFiles.isEmpty()) {
+                    asInvalidReasonHistoryVO.setSystemFileList(systemFiles);
+                }
+            }
+        }
+    }
+
+    /**
+     * 删除
+     * @param ids
+     * @return
+     */
+    public List<Integer> deleteAsInvalidReasonHistory(List<Integer> ids) {
+        if (!ids.isEmpty()) {
+            //先删除附件
+            LambdaQueryWrapper<AssoOtherPatentInfoFile> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(AssoOtherPatentInfoFile::getOtherPatentInfoId, ids)
+                    .eq(AssoOtherPatentInfoFile::getType, 5);
+            assoOtherPatentInfoFileService.remove(queryWrapper);
+            this.removeBatchByIds(ids);
+        }
+        return ids;
+    }
+
+    /**
+     * 查询全部的
+     * @param patentNo
+     * @param asInvalidReasonHistoryVOS
+     * @return
+     */
+    public List<AsInvalidReasonHistoryVO> findInInvalidReport(String patentNo, List<AsInvalidReasonHistoryVO> asInvalidReasonHistoryVOS){
+        List<AsInvalidReasonHistoryVO> finalVOS = new ArrayList<>();
+        finalVOS.addAll(asInvalidReasonHistoryVOS);
+        //查询出所有的projectId
+        LambdaQueryWrapper<CompareLiterature> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CompareLiterature::getLiteratureNo, patentNo);
+        List<CompareLiterature> compareLiteratures = compareLiteratureService.list(queryWrapper);
+        //对比文献号存在
+        if (!compareLiteratures.isEmpty()) {
+            //取出所有报告并留下是无效的
+            List<Integer> projectIds = compareLiteratures
+                    .stream()
+                    .map(CompareLiterature::getProjectId)
+                    .collect(Collectors.toList());
+            LambdaQueryWrapper<ReportProject> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.in(ReportProject::getProjectId, projectIds);
+            List<ReportProject> results = reportProjectService.list(queryWrapper1);
+            if (!results.isEmpty()) {
+                results.forEach(
+                        item -> {
+                            Project project = projectService.getById(item.getProjectId());
+                            if (project.getType().equals(2)) {
+                                if (item.getReportType().equals(7)) {
+                                    AsInvalidReasonHistoryVO asVO = new AsInvalidReasonHistoryVO();
+                                    asVO.setPatentNo(patentNo);
+                                    asVO.setInvalidedPatent(item.getSignPatentNo());
+                                    asVO.setInvalidCaseNum(item.getCaseNumber());
+                                    Integer affairType = 1;
+                                    Date invalidTime = invalidRecordService.loadInvalidTime(affairType, item);
+                                    asVO.setInvalidTime(invalidTime);
+                                    asVO.setCreateId(project.getCreateId());
+                                    asVO.setCreateTime(project.getCreateTime());
+                                    List<String> fileGuids = invalidRecordService.loadFileGuids(item.getProjectId());
+                                    asVO.setFileGuids(fileGuids);
+                                    asVO.setIfAdd(false);
+                                    finalVOS.add(asVO);
+                                } else if (item.getReportType().equals(1) || item.getReportType().equals(2)) {
+                                    //判断是否有对比结果
+                                    LambdaQueryWrapper<CompareLiterature> queryWrapper2 = new LambdaQueryWrapper<>();
+                                    queryWrapper2.eq(CompareLiterature::getLiteratureNo, patentNo)
+                                            .eq(CompareLiterature::getProjectId, item.getProjectId());
+                                    CompareLiterature compareLiterature = compareLiteratureService.getOne(queryWrapper2, false);
+                                    if (compareLiterature != null) {
+                                        Integer compareLiteratureId = compareLiterature.getId();
+                                        LambdaQueryWrapper<AssoReasonLiterature> queryWrapper3 = new LambdaQueryWrapper<>();
+                                        queryWrapper3.eq(AssoReasonLiterature::getLiteratureId, compareLiteratureId);
+                                        List<AssoReasonLiterature> assoReasonLiteratures = assoReasonLiteratureService.list(queryWrapper3);
+                                        if (!assoReasonLiteratures.isEmpty()) {
+                                            AsInvalidReasonHistoryVO asVO = new AsInvalidReasonHistoryVO();
+                                            asVO.setPatentNo(patentNo);
+                                            asVO.setInvalidedPatent(item.getSignPatentNo());
+                                            asVO.setInvalidCaseNum(item.getCaseNumber());
+                                            Integer affairType = 1;
+                                            Date invalidTime = invalidRecordService.loadInvalidTime(affairType, item);
+                                            asVO.setInvalidTime(invalidTime);
+                                            asVO.setCreateId(project.getCreateId());
+                                            asVO.setCreateTime(project.getCreateTime());
+                                            List<String> fileGuids = invalidRecordService.loadFileGuids(item.getProjectId());
+                                            asVO.setFileGuids(fileGuids);
+                                            asVO.setIfAdd(false);
+                                            finalVOS.add(asVO);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                );
+            }
+        }
+        return finalVOS;
+    }
+
+}

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

@@ -10,6 +10,7 @@ import cn.cslg.pas.common.utils.StringUtils;
 import cn.cslg.pas.common.vo.HightlightTemplateVO;
 import cn.cslg.pas.common.vo.business.ProjectTaskVO;
 import cn.cslg.pas.domain.business.HightlightTemplate;
+import cn.cslg.pas.domain.business.LitigationHistory;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.HightlightTemplateMapper;
 import cn.cslg.pas.service.permissions.PermissionService;
@@ -102,7 +103,8 @@ public class HightlightTemplateService extends ServiceImpl<HightlightTemplateMap
         List<HightlightTemplateVO> hightlightTemplateVOS = new ArrayList<>();
         LambdaQueryWrapper<HightlightTemplate> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(HightlightTemplate::getProjectId, projectId)
-                .eq(HightlightTemplate::getCreateId, personnelVO.getId());
+                .eq(HightlightTemplate::getCreateId, personnelVO.getId())
+                .orderByDesc(HightlightTemplate::getCreateTime);
         List<HightlightTemplate> hightlightTemplates = this.list(queryWrapper);
 
         if (!hightlightTemplates.isEmpty()) {

+ 309 - 0
src/main/java/cn/cslg/pas/service/business/InvalidRecordService.java

@@ -0,0 +1,309 @@
+package cn.cslg.pas.service.business;
+
+import cn.cslg.pas.common.dto.business.InvalidRecordDTO;
+import cn.cslg.pas.common.model.cronModel.Personnel;
+import cn.cslg.pas.common.model.cronModel.PersonnelVO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.common.utils.StringUtils;
+import cn.cslg.pas.common.vo.business.InvalidRecordVO;
+import cn.cslg.pas.domain.business.*;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.mapper.InvalidRecordMapper;
+import cn.cslg.pas.service.common.FileManagerService;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 被无效历史
+ * @Author xiexiang
+ * @Date 2024/1/19
+ */
+@Slf4j
+@Service
+public class InvalidRecordService extends ServiceImpl<InvalidRecordMapper, InvalidRecord> {
+    @Autowired
+    private LoginUtils loginUtils;
+
+    @Autowired
+    private CacheUtils cacheUtils;
+
+    @Autowired
+    private PermissionService permissionService;
+
+    @Autowired
+    private AssoOtherPatentInfoFileService assoOtherPatentInfoFileService;
+
+    @Autowired
+    private OtherReferencesService otherReferencesService;
+
+    @Autowired
+    private FileManagerService fileManagerService;
+
+    @Autowired
+    private CompareLiteratureService compareLiteratureService;
+
+    @Autowired
+    private ReportProjectService reportProjectService;
+
+    @Autowired
+    private ProjectService projectService;
+
+    @Autowired
+    private ReportAffairService reportAffairService;
+
+    @Autowired
+    private AssoProjectFileService assoProjectFileService;
+
+    /**
+     * 新增or更新
+     * @param invalidRecordDTO
+     * @return
+     */
+    public Integer saveOrUpdate(InvalidRecordDTO invalidRecordDTO){
+        if (invalidRecordDTO == null) {
+            throw new XiaoShiException("入参为空");
+        }
+        Integer id = invalidRecordDTO.getId();
+        List<String> fileGuids = invalidRecordDTO.getFileGuids();
+        InvalidRecord invalidRecord = new InvalidRecord();
+        Integer type = 6;
+        if (id != null) {
+            //update
+            invalidRecord = this.getById(id);
+            BeanUtils.copyProperties(invalidRecordDTO, invalidRecord);
+            invalidRecord.updateById();
+            //先删除 后添加
+            LambdaQueryWrapper<AssoOtherPatentInfoFile> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(AssoOtherPatentInfoFile::getOtherPatentInfoId, id)
+                    .eq(AssoOtherPatentInfoFile::getType, type);
+            assoOtherPatentInfoFileService.remove(queryWrapper);
+            if (fileGuids != null && !fileGuids.isEmpty()) {
+                List<Integer> fileIds = otherReferencesService.addFile(invalidRecord.getId(), fileGuids, type);
+            }
+        } else {
+            BeanUtils.copyProperties(invalidRecordDTO, invalidRecord);
+            PersonnelVO personnelVO = new PersonnelVO();
+            try {
+                personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+            } catch (Exception e) {
+                throw new XiaoShiException("未查询到当前登陆人");
+            }
+            invalidRecord.setCreateId(personnelVO.getId());
+            invalidRecord.insert();
+            if (fileGuids != null && !fileGuids.isEmpty()) {
+                //先删除 后添加
+                List<Integer> fileIds = otherReferencesService.addFile(invalidRecord.getId(), fileGuids, type);
+            }
+        }
+        return invalidRecord.getId();
+    }
+
+    /**
+     * 查询
+     * @param patentNo
+     * @return
+     * @throws IOException
+     */
+    public Records getInvalidRecord(String patentNo) throws IOException {
+        List<InvalidRecordVO> invalidRecordVOS = new ArrayList<>();
+        if (patentNo == null || StringUtils.isEmpty(patentNo)) {
+            throw new XiaoShiException("入参为空");
+        }
+
+        LambdaQueryWrapper<InvalidRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(InvalidRecord::getPatentNo, patentNo);
+        List<InvalidRecord> invalidRecords = this.list(queryWrapper);
+
+        if (!invalidRecords.isEmpty()) {
+            invalidRecords.forEach(item -> {
+                InvalidRecordVO invalidRecordVO = new InvalidRecordVO();
+                BeanUtils.copyProperties(item, invalidRecordVO);
+                invalidRecordVO.setIfAdd(true);
+                invalidRecordVOS.add(invalidRecordVO);
+            });
+        }
+        List<InvalidRecordVO> finalVOS = this.findInvalidRecord(patentNo, invalidRecordVOS);
+        this.loadInvalidRecordVOS(finalVOS);
+        Records records = new Records();
+        records.setData(finalVOS);
+        return records;
+    }
+
+    /**
+     * 装载
+     * @param invalidRecordVOS
+     * @throws IOException
+     */
+    public void loadInvalidRecordVOS(List<InvalidRecordVO> invalidRecordVOS) throws IOException {
+        List<String> createIds = new ArrayList<>();
+        invalidRecordVOS.forEach(item -> {
+            if (item.getCreateId() != null) {
+                createIds.add(item.getCreateId());
+            }
+        });
+        List<Personnel> personnels = new ArrayList<>();
+        //查询发起人名称
+        if (createIds.size() != 0) {
+            String res = permissionService.getPersonnelByIdsFromPCS(createIds);
+            JSONObject jsonObject = JSONObject.parseObject(res);
+            personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
+        }
+        //装载信息
+        for (InvalidRecordVO invalidRecordVO : invalidRecordVOS) {
+            //装载人员信息
+            Personnel personnel = personnels.stream().filter(item -> item.getId().equals(invalidRecordVO.getCreateId())).findFirst().orElse(null);
+            if (personnel != null) {
+                invalidRecordVO.setCreateName(personnel.getPersonnelName());
+            }
+            LambdaQueryWrapper<AssoOtherPatentInfoFile> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(AssoOtherPatentInfoFile::getOtherPatentInfoId, invalidRecordVO.getId())
+                    .eq(AssoOtherPatentInfoFile::getType, 6);
+            List<AssoOtherPatentInfoFile> assoOtherPatentInfoFiles = assoOtherPatentInfoFileService.list(queryWrapper);
+            if (!assoOtherPatentInfoFiles.isEmpty()) {
+                List<String> fileGuids = assoOtherPatentInfoFiles.stream().map(AssoOtherPatentInfoFile::getFileGuid).collect(Collectors.toList());
+                invalidRecordVO.setFileGuids(fileGuids);
+                List<SystemFile> systemFiles = new ArrayList<>();
+                if (fileGuids.size() != 0) {
+                    String res = fileManagerService.getSystemFileFromFMS(fileGuids);
+                    systemFiles = JSONObject.parseArray(res, SystemFile.class);
+                }
+                if (!systemFiles.isEmpty()) {
+                    invalidRecordVO.setSystemFileList(systemFiles);
+                }
+            }
+        }
+    }
+
+    /**
+     * 删除
+     * @param ids
+     * @return
+     */
+    public List<Integer> deleteInvalidRecord(List<Integer> ids) {
+        if (!ids.isEmpty()) {
+            //先删除附件
+            LambdaQueryWrapper<AssoOtherPatentInfoFile> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(AssoOtherPatentInfoFile::getOtherPatentInfoId, ids)
+                    .eq(AssoOtherPatentInfoFile::getType, 5);
+            assoOtherPatentInfoFileService.remove(queryWrapper);
+            this.removeBatchByIds(ids);
+        }
+        return ids;
+    }
+
+    public List<InvalidRecordVO> findInvalidRecord(String patentNo, List<InvalidRecordVO> invalidRecordVOS){
+        List<InvalidRecordVO> finalVOS = new ArrayList<>();
+        finalVOS.addAll(invalidRecordVOS);
+        LambdaQueryWrapper<ReportProject> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ReportProject::getSignPatentNo, patentNo);
+        List<ReportProject> reportProjects = reportProjectService.list(queryWrapper);
+        if (!reportProjects.isEmpty()) {
+            reportProjects.forEach(item -> {
+                Project project = projectService.getById(item.getProjectId());
+                Integer type = item.getReportType();
+                //报告类型为稳定性分析和第三方意见  查询无效请求书
+                if (type.equals(1) || type.equals(2)) {
+                    InvalidRecordVO invalidRecordVO = new InvalidRecordVO();
+                    invalidRecordVO.setInvalidCaseNum(item.getCaseNumber());
+                    invalidRecordVO.setPatentNo(patentNo);
+                    Integer affairType = 1;
+                    Date time = this.loadInvalidTime(affairType, item);
+                    invalidRecordVO.setInvalidTime(time);
+                    invalidRecordVO.setCreateId(project.getCreateId());
+                    invalidRecordVO.setCreateTime(project.getCreateTime());
+                    List<String> fileGuids = this.loadFileGuids(item.getProjectId());
+                    invalidRecordVO.setFileGuids(fileGuids);
+                    invalidRecordVO.setIfAdd(false);
+                    finalVOS.add(invalidRecordVO);
+                } else if (type.equals(7)) {
+                    //报告类型为官方无效  查询行政判决诉讼书
+                    InvalidRecordVO invalidRecordVO = new InvalidRecordVO();
+                    invalidRecordVO.setInvalidCaseNum(item.getCaseNumber());
+                    invalidRecordVO.setPatentNo(patentNo);
+                    Integer affairType = 1;
+                    Date invalidTime = this.loadInvalidTime(affairType, item);
+                    invalidRecordVO.setInvalidTime(invalidTime);
+                    Integer judgeType = 5;
+                    Date judgeTime = this.loadInvalidTime(judgeType, item);
+                    invalidRecordVO.setJudgementTime(judgeTime);
+                    invalidRecordVO.setCreateId(project.getCreateId());
+                    invalidRecordVO.setCreateTime(project.getCreateTime());
+                    List<String> fileGuids = this.loadFileGuids(item.getProjectId());
+                    invalidRecordVO.setFileGuids(fileGuids);
+                    invalidRecordVO.setIfAdd(false);
+                    finalVOS.add(invalidRecordVO);
+                }
+            });
+        }
+        return finalVOS;
+    }
+
+    public Date loadInvalidTime(Integer type, ReportProject reportProject){
+        LambdaQueryWrapper<ReportAffair> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ReportAffair::getAffairType, type)
+                .eq(ReportAffair::getProjectId, reportProject.getProjectId())
+                .orderByDesc(ReportAffair::getCreateTime)
+                .last("LIMIT 1");
+        ReportAffair reportAffair = reportAffairService.getOne(queryWrapper, false);
+        if (reportAffair != null) {
+            return reportAffair.getOccurredTime();
+        } else {
+            return null;
+        }
+    }
+
+    public List<String> loadFileGuids(Integer projectId){
+        List<String> fileGuids = new ArrayList<>();
+        LambdaQueryWrapper<AssoProjectFile> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AssoProjectFile::getProjectId, projectId);
+        List<AssoProjectFile> assoProjectFiles = assoProjectFileService.list(queryWrapper);
+        if (!assoProjectFiles.isEmpty()) {
+            fileGuids = assoProjectFiles.stream().map(AssoProjectFile::getFileGuid).collect(Collectors.toList());
+        }
+        return fileGuids;
+    }
+
+//    /**
+//     * 先查判决书 后查决定书
+//     * @param reportProject
+//     * @return
+//     */
+//    public String getResult(ReportProject reportProject){
+//        LambdaQueryWrapper<ReportAffair> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(ReportAffair::getAffairType, 5)
+//                .eq(ReportAffair::getProjectId, reportProject.getProjectId())
+//                .orderByDesc(ReportAffair::getCreateTime)
+//                .last("LIMIT 1");
+//        ReportAffair reportAffair = reportAffairService.getOne(queryWrapper, false);
+//        if (reportAffair != null) {
+//            return reportAffair.getDescription();
+//        } else {
+//            LambdaQueryWrapper<ReportAffair> queryWrapper1 = new LambdaQueryWrapper<>();
+//            queryWrapper1.eq(ReportAffair::getAffairType, 3)
+//                    .eq(ReportAffair::getProjectId, reportProject.getProjectId())
+//                    .orderByDesc(ReportAffair::getCreateTime)
+//                    .last("LIMIT 1");
+//            ReportAffair reportAffair1 = reportAffairService.getOne(queryWrapper1, false);
+//            if (reportAffair1 != null) {
+//                LambdaQueryWrapper<InvalidDecisionFile> queryWrapper2 = new LambdaQueryWrapper<>();
+//                queryWrapper2.eq(InvalidDecisionFile::)
+//            }
+//        }
+//    }
+}

+ 2 - 1
src/main/java/cn/cslg/pas/service/business/LitigationHistoryService.java

@@ -118,7 +118,8 @@ public class LitigationHistoryService extends ServiceImpl<LitigationHistoryMappe
         Page<LitigationHistory> page = new Page<>(current, size);
 
         LambdaQueryWrapper<LitigationHistory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(LitigationHistory::getPatentNo, patentNo);
+        queryWrapper.eq(LitigationHistory::getPatentNo, patentNo)
+                    .orderByDesc(LitigationHistory::getCreateTime);
         IPage<LitigationHistory> litigationHistoryPage = this.page(page, queryWrapper);
         List<LitigationHistory> litigationHistories = litigationHistoryPage.getRecords();
         long total = litigationHistoryPage.getTotal();

+ 1 - 0
src/main/java/cn/cslg/pas/service/business/OtherReferencesService.java

@@ -117,6 +117,7 @@ public class OtherReferencesService extends ServiceImpl<OtherReferencesMapper, O
                 assoOtherPatentInfoFiles.add(assoOtherPatentInfoFile);
             });
             assoOtherPatentInfoFileService.saveBatch(assoOtherPatentInfoFiles);
+            ids = assoOtherPatentInfoFiles.stream().map(AssoOtherPatentInfoFile::getId).collect(Collectors.toList());
         }
         return ids;
     }

+ 2 - 3
src/main/java/cn/cslg/pas/service/business/PermissionRecordService.java

@@ -9,9 +9,7 @@ import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.utils.CacheUtils;
 import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.utils.StringUtils;
-import cn.cslg.pas.common.vo.business.LitigationHistoryVO;
 import cn.cslg.pas.common.vo.business.PermissionRecordVO;
-import cn.cslg.pas.domain.business.LitigationHistory;
 import cn.cslg.pas.domain.business.PermissionRecord;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.PermissionRecordMapper;
@@ -94,7 +92,8 @@ public class PermissionRecordService extends ServiceImpl<PermissionRecordMapper,
         Page<PermissionRecord> page = new Page<>(current, size);
 
         LambdaQueryWrapper<PermissionRecord> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(PermissionRecord::getPatentNo, patentNo);
+        queryWrapper.eq(PermissionRecord::getPatentNo, patentNo)
+                .orderByDesc(PermissionRecord::getCreateTime);
         IPage<PermissionRecord> permissionRecordPage = this.page(page, queryWrapper);
         List<PermissionRecord> permissionRecords = permissionRecordPage.getRecords();
         long total = permissionRecordPage.getTotal();

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

@@ -11,6 +11,7 @@ import cn.cslg.pas.common.utils.LoginUtils;
 import cn.cslg.pas.common.utils.StringUtils;
 import cn.cslg.pas.common.vo.business.ReviewHistoryVO;
 import cn.cslg.pas.domain.business.AssoOtherPatentInfoFile;
+import cn.cslg.pas.domain.business.HightlightTemplate;
 import cn.cslg.pas.domain.business.ReviewHistory;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.ReviewHistoryMapper;
@@ -119,7 +120,8 @@ public class ReviewHistoryService extends ServiceImpl<ReviewHistoryMapper, Revie
         Page<ReviewHistory> page = new Page<>(current, size);
 
         LambdaQueryWrapper<ReviewHistory> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ReviewHistory::getPatentNo, patentNo);
+        queryWrapper.eq(ReviewHistory::getPatentNo, patentNo)
+                .orderByDesc(ReviewHistory::getCreateTime);
         IPage<ReviewHistory> reviewHistoryPage = this.page(page, queryWrapper);
         List<ReviewHistory> reviewHistories = reviewHistoryPage.getRecords();
         long total = reviewHistoryPage.getTotal();

+ 0 - 1
src/main/java/cn/cslg/pas/service/business/es/EsCustomFieldService.java

@@ -292,7 +292,6 @@ public class EsCustomFieldService {
                     String field = this.addCustomField(fieldDTO);
                     ids.add(field);
                 }
-
             }
         } else if (startNum >= 1 && endNum > 0) {
             List<String> patentNos = this.getPatentNos(vo);

+ 429 - 0
src/main/java/cn/cslg/pas/service/business/es/EsValueCurveService.java

@@ -0,0 +1,429 @@
+package cn.cslg.pas.service.business.es;
+
+import cn.cslg.pas.common.core.base.IfConstant;
+import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
+import cn.cslg.pas.common.dto.es.EsValueCurveDTO;
+import cn.cslg.pas.common.dto.es.SelectValueCurveDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.request.OrderDTO;
+import cn.cslg.pas.common.utils.parseQueryToTree.expressManager;
+import cn.cslg.pas.common.utils.parseQueryToTree.operateNode;
+import cn.cslg.pas.common.utils.parseQueryToTree.treeNode;
+import cn.cslg.pas.common.vo.EsConfigVO;
+import cn.cslg.pas.common.vo.es.EsCustomFieldBatchVO;
+import cn.cslg.pas.common.vo.es.EsValueCurveVO;
+import cn.cslg.pas.domain.business.PermissionRecord;
+import cn.cslg.pas.domain.business.ProductMarketData;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.mapper.PermissionRecordMapper;
+import cn.cslg.pas.mapper.ProductMarketDataMapper;
+import cn.cslg.pas.service.business.CommonService;
+import cn.cslg.pas.service.query.FormatQueryService;
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch._types.SortOrder;
+import co.elastic.clients.elasticsearch._types.query_dsl.Query;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
+import co.elastic.clients.elasticsearch.core.SearchRequest;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import co.elastic.clients.elasticsearch.core.search.Hit;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class EsValueCurveService {
+
+    private final ElasticsearchClient client;
+
+    @Autowired
+    private EsService esService;
+
+    @Autowired
+    private FormatQueryService formatQueryService;
+
+    @Autowired
+    private ProductMarketDataMapper productMarketDataMapper;
+
+    @Autowired
+    private PermissionRecordMapper permissionRecordMapper;
+
+    /**
+     * 查询价值曲线
+     * @param vo
+     * @return
+     * @throws Exception
+     */
+    public List<EsValueCurveDTO> selectValueCurve(EsValueCurveVO vo) throws Exception {
+        List<String> isAdd = vo.getIsAdd();
+        List<String> isDel = vo.getIsDelete();
+        Integer startNum = vo.getStartNumber();
+        Integer endNum = vo.getEndNumber();
+        Integer timeType = vo.getTimeType();
+        Map<String, List<Integer>> map = new HashMap<>();
+        if (!CollectionUtils.isEmpty(isAdd) && startNum <= 1 && endNum < 1) {
+            isAdd.removeAll(isDel);
+            map = this.getProductIdByPatentNo(isAdd);
+        } else if (startNum >= 1 && endNum > 0) {
+            List<String> patentNos = this.getPatentNos(vo);
+            map = this.getProductIdByPatentNo(patentNos);
+        }
+        return this.getValueCurveList(map, timeType);
+    }
+
+    /**
+     * 提取返回数据
+     * @param map
+     * @param timeType
+     * @return
+     */
+    public List<EsValueCurveDTO> getValueCurveList(Map<String, List<Integer>> map, Integer timeType) {
+        List<EsValueCurveDTO> curveDTOS = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(map)) {
+            for (String patentNo : map.keySet()) {
+                List<SelectValueCurveDTO> listLicensee = new ArrayList<>();
+                List<SelectValueCurveDTO> listSale = new ArrayList<>();
+                //获取许可记录
+                List<SelectValueCurveDTO> licenseeList = this.selectLicensee(patentNo, timeType);
+                if (!CollectionUtils.isEmpty(licenseeList)) {
+                    Map<String, List<SelectValueCurveDTO>> licenseeMap = licenseeList.stream().collect(Collectors.groupingBy(SelectValueCurveDTO::getLicenseTime));
+                    for (String key : licenseeMap.keySet()) {
+                        List<SelectValueCurveDTO> licenseeDTOS = licenseeMap.get(key);
+                        BigDecimal sum = new BigDecimal(0);
+                        for (SelectValueCurveDTO licenseeDTO : licenseeDTOS) {
+                            BigDecimal licenseeFee = new BigDecimal(String.valueOf(licenseeDTO.getLicenseFee()));
+                            sum = sum.add(licenseeFee);
+                        }
+                        SelectValueCurveDTO curveDTO = new SelectValueCurveDTO();
+                        if (sum.compareTo(new BigDecimal(0)) > 0) {
+                            curveDTO.setLicenseFee(sum.doubleValue());
+                        }
+                        curveDTO.setLicenseTime(key);
+                        curveDTO.setTimeType(licenseeDTOS.get(0).getTimeType());
+                        listLicensee.add(curveDTO);
+                    }
+                }
+                //获取营销数据
+                List<Integer> productIds = map.get(patentNo);
+                if (!CollectionUtils.isEmpty(productIds)) {
+                    List<SelectValueCurveDTO> saleList = this.selectSale(productIds, timeType);
+                    if (!CollectionUtils.isEmpty(saleList)) {
+                        Map<String, List<SelectValueCurveDTO>> saleMap = saleList.stream().collect(Collectors.groupingBy(SelectValueCurveDTO::getSaleTime));
+                        for (String key : saleMap.keySet()) {
+                            List<SelectValueCurveDTO> saleLDTOS = saleMap.get(key);
+                            //销售额
+                            BigDecimal count = new BigDecimal(0);
+                            //自定义许可费
+                            BigDecimal sum = new BigDecimal(0);
+                            for (SelectValueCurveDTO saleLDTO : saleLDTOS) {
+                                BigDecimal customLicensee = new BigDecimal(String.valueOf(saleLDTO.getCustomLicense()));
+                                sum = sum.add(customLicensee);
+                                BigDecimal saleMoney = new BigDecimal(String.valueOf(saleLDTO.getSaleMoney()));
+                                count = count.add(saleMoney);
+                            }
+                            SelectValueCurveDTO curveDTO = new SelectValueCurveDTO();
+                            if (sum.compareTo(new BigDecimal(0)) > 0) {
+                                curveDTO.setLicenseFee(sum.doubleValue());
+                            }
+                            if (count.compareTo(new BigDecimal(0)) > 0) {
+                                curveDTO.setCustomLicense(count.doubleValue());
+                            }
+                            curveDTO.setSaleTime(key);
+                            curveDTO.setSaleArea(saleLDTOS.get(0).getSaleArea());
+                            curveDTO.setTimeType(saleLDTOS.get(0).getTimeType());
+                            listSale.add(curveDTO);
+                        }
+                    }
+                }
+                List<EsValueCurveDTO> data = this.mergeData(listLicensee, listSale);
+                curveDTOS.addAll(data);
+            }
+        }
+        return curveDTOS;
+    }
+
+    /**
+     * 提取合并数据
+     * @param listLicensee
+     * @param listSale
+     * @return
+     */
+    public List<EsValueCurveDTO> mergeData(List<SelectValueCurveDTO> listLicensee,List<SelectValueCurveDTO> listSale) {
+        List<EsValueCurveDTO> list = new ArrayList<>();
+
+        if (!CollectionUtils.isEmpty(listLicensee) && !CollectionUtils.isEmpty(listSale)) {
+            for (SelectValueCurveDTO licensee : listLicensee) {
+                String licenseTime = licensee.getLicenseTime();
+                for (SelectValueCurveDTO sale : listSale) {
+                    String saleTime = sale.getSaleTime();
+                    if (licenseTime.equals(saleTime)) {
+                        EsValueCurveDTO dto = new EsValueCurveDTO();
+                        dto.setSaleArea(sale.getSaleArea());
+                        dto.setSaleMoney(sale.getSaleMoney());
+                        dto.setCustomLicense(sale.getCustomLicense());
+                        dto.setTime(saleTime);
+                        dto.setLicenseFee(licensee.getLicenseFee());
+                        dto.setTimeType(sale.getTimeType());
+                        list.add(dto);
+                    }
+                }
+            }
+        } else if (!CollectionUtils.isEmpty(listLicensee) && CollectionUtils.isEmpty(listSale)) {
+            for (SelectValueCurveDTO licensee : listLicensee) {
+                EsValueCurveDTO dto = new EsValueCurveDTO();
+                dto.setTime(licensee.getLicenseTime());
+                dto.setLicenseFee(licensee.getLicenseFee());
+                dto.setTimeType(licensee.getTimeType());
+                list.add(dto);
+            }
+        } else if (!CollectionUtils.isEmpty(listSale) && CollectionUtils.isEmpty(listLicensee)) {
+            for (SelectValueCurveDTO sale : listSale) {
+                EsValueCurveDTO dto = new EsValueCurveDTO();
+                dto.setSaleArea(sale.getSaleArea());
+                dto.setSaleMoney(sale.getSaleMoney());
+                dto.setCustomLicense(sale.getCustomLicense());
+                dto.setTime(sale.getSaleTime());
+                dto.setTimeType(sale.getTimeType());
+                list.add(dto);
+            }
+        }
+
+        if (!CollectionUtils.isEmpty(list)) {
+            for (EsValueCurveDTO dto : list) {
+                listLicensee.removeIf(licensee -> licensee.getLicenseTime().equals(dto.getTime()));
+            }
+
+            for (EsValueCurveDTO dto : list) {
+                listSale.removeIf(sale -> sale.getSaleTime().equals(dto.getTime()));
+            }
+
+            if (!CollectionUtils.isEmpty(listLicensee)) {
+                for (SelectValueCurveDTO licensee : listLicensee) {
+                    EsValueCurveDTO dto = new EsValueCurveDTO();
+                    dto.setTime(licensee.getLicenseTime());
+                    dto.setLicenseFee(licensee.getLicenseFee());
+                    dto.setTimeType(licensee.getTimeType());
+                    list.add(dto);
+                }
+            }
+
+            if (!CollectionUtils.isEmpty(listSale)) {
+                for (SelectValueCurveDTO sale : listSale) {
+                    EsValueCurveDTO dto = new EsValueCurveDTO();
+                    dto.setSaleArea(sale.getSaleArea());
+                    dto.setSaleMoney(sale.getSaleMoney());
+                    dto.setCustomLicense(sale.getCustomLicense());
+                    dto.setTime(sale.getSaleTime());
+                    dto.setTimeType(sale.getTimeType());
+                    list.add(dto);
+                }
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 查询营销数据
+     * @param productIds
+     * @param timeType
+     * @return
+     */
+    public List<SelectValueCurveDTO> selectSale(List<Integer> productIds, Integer timeType) {
+        List<SelectValueCurveDTO> curveDTOS = new ArrayList<>();
+        if (timeType == 0) {
+            curveDTOS = productMarketDataMapper.selectSaleMonthList(productIds);
+            if (!CollectionUtils.isEmpty(curveDTOS)) {
+                curveDTOS.forEach(i -> i.setTimeType(timeType));
+            }
+        } else if (timeType == 0) {
+            curveDTOS = productMarketDataMapper.selectSaleYearList(productIds);
+            if (!CollectionUtils.isEmpty(curveDTOS)) {
+                curveDTOS.forEach(i -> i.setTimeType(timeType));
+            }
+        } else {
+            curveDTOS = productMarketDataMapper.selectSaleQuarterList(productIds);
+            if (!CollectionUtils.isEmpty(curveDTOS)) {
+                curveDTOS.forEach(i -> i.setTimeType(timeType));
+            }
+        }
+        return curveDTOS;
+    }
+
+    /**
+     * 查询许可记录
+     * @param patentNo
+     * @param timeType
+     * @return
+     */
+    public List<SelectValueCurveDTO> selectLicensee(String patentNo, Integer timeType) {
+        List<SelectValueCurveDTO> curveDTOS = new ArrayList<>();
+        if (timeType == 0) {
+            curveDTOS = permissionRecordMapper.selectLicenseeMonthList(patentNo);
+            if (!CollectionUtils.isEmpty(curveDTOS)) {
+                curveDTOS.forEach(i -> i.setTimeType(timeType));
+            }
+        } else if (timeType == 2) {
+            curveDTOS = permissionRecordMapper.selectLicenseeYearList(patentNo);
+            if (!CollectionUtils.isEmpty(curveDTOS)) {
+                curveDTOS.forEach(i -> i.setTimeType(timeType));
+            }
+        } else {
+            curveDTOS = permissionRecordMapper.selectLicenseeQuarterList(patentNo);
+            if (!CollectionUtils.isEmpty(curveDTOS)) {
+                curveDTOS.forEach(i -> i.setTimeType(timeType));
+            }
+        }
+        return curveDTOS;
+    }
+
+    /**
+     * 获取专利号列表
+     *
+     * @param vo
+     * @return
+     * @throws Exception
+     */
+    public List<String> getPatentNos(EsValueCurveVO vo) throws Exception {
+        Integer taskId = vo.getTaskId();
+        Integer projectId = vo.getProjectId();
+        Integer startNum = vo.getStartNumber();
+        Integer endNum = vo.getEndNumber();
+        List<String> isAdd = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(vo.getIsAdd())) {
+            isAdd = vo.getIsAdd();
+        }
+        List<String> isDel = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(vo.getIsDelete())) {
+            isDel = vo.getIsDelete();
+        }
+        String searchCondition = "";
+        if (StringUtils.isNotEmpty(vo.getSearchQuery())) {
+            searchCondition = vo.getSearchQuery();
+        }
+        List<EsCustomFieldValueDTO> customFields = vo.getCustomFields();
+        if (!CollectionUtils.isEmpty(customFields)) {
+            searchCondition = esService.parseCustomField(customFields);
+        }
+        if (taskId != null) {
+            if (searchCondition != null && !"".equals(searchCondition.trim())) {
+                searchCondition = "taskId = " + taskId + " AND " + searchCondition;
+            } else {
+                searchCondition = "taskId = " + taskId;
+            }
+        } else {
+            if (projectId != null) {
+                if (searchCondition != null && !"".equals(searchCondition.trim())) {
+                    searchCondition = "projectId = " + projectId + " AND " + searchCondition;
+                } else {
+                    searchCondition = "projectId = " + projectId;
+                }
+            }
+        }
+        SearchRequest.Builder builder = new SearchRequest.Builder();
+        //设置查询索引
+        builder.index("patent");
+        //1. 解析检索条件
+        treeNode tree = expressManager.getInstance().Parse(searchCondition, false);
+        //格式化检索式
+        //3. 从es中检索数据
+        Query q = formatQueryService.EsQueryToQuery((operateNode) tree, "patent");
+        builder.query(q);
+
+        List<OrderDTO> dtoList = vo.getOrderDTOList();
+        if (!CollectionUtils.isEmpty(dtoList)) {
+            String json = CommonService.readJsonFile("patent.json");
+            List<EsConfigVO> esConfigVOS = JSON.parseArray(json, EsConfigVO.class);
+            for (OrderDTO orderDTO : dtoList) {
+                EsConfigVO configVO = esConfigVOS.stream().filter(item -> item.getField().equals(orderDTO.getOrderBy())).findFirst().orElse(null);
+                if (configVO != null) {
+                    if (orderDTO.getOrderType().equals(IfConstant.NO)) {
+                        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                                .field(fieldSortBuilder -> fieldSortBuilder
+                                        .field(configVO.getEsField()).order(SortOrder.Asc)));
+                    } else {
+                        builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                                .field(fieldSortBuilder -> fieldSortBuilder
+                                        .field(configVO.getEsField()).order(SortOrder.Desc)));
+                    }
+                }
+            }
+        } else {
+            builder.sort(sortOptionsBuilder -> sortOptionsBuilder
+                    .field(fieldSortBuilder -> fieldSortBuilder
+                            .field("patent_no.keyword").order(SortOrder.Desc)));
+        }
+
+        int number = endNum - startNum;
+        if (startNum > 0 && endNum > startNum) {
+            builder.from(startNum - 1).size(number);
+        }
+
+        SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+        List<Hit<Patent>> hits = response.hits().hits();
+        List<String> patentNos = new ArrayList<>();
+        for (Hit<Patent> hit : hits) {
+            Patent patent = hit.source();
+            patentNos.add(patent.getPatentNo());
+        }
+        patentNos.addAll(isAdd);
+        patentNos.removeAll(isDel);
+        return patentNos.stream().distinct().collect(Collectors.toList());
+    }
+
+    /**
+     * 根据专利号获取productId
+     * @param list
+     * @return
+     * @throws IOException
+     */
+    public Map<String, List<Integer>> getProductIdByPatentNo(List<String> list) throws IOException {
+        Map<String, List<Integer>> map = new HashMap<>();
+        if (!CollectionUtils.isEmpty(list)) {
+            for (String patentNo : list) {
+                List<Integer> productIds = new ArrayList<>();
+                SearchRequest.Builder builder = new SearchRequest.Builder();
+                //设置查询索引
+                builder.index("patent");
+                //申请号
+                Query q1 = QueryBuilders.term(t -> t.field("app_no.keyword").value(patentNo));
+                //公开号
+                Query q2 = QueryBuilders.term(t -> t.field("public_no.keyword").value(patentNo));
+                //授权号
+                Query q3 = QueryBuilders.term(t -> t.field("grant_no.keyword").value(patentNo));
+                Query bool = QueryBuilders.bool(i -> i.should(q1, q2, q3));
+                Query q = QueryBuilders.exists(i -> i.field("product_id"));
+                Query query = QueryBuilders.hasParent(parent -> parent.parentType("patent").query(bool));
+                Query bool1 = QueryBuilders.bool(i -> i.must(q,query));
+                builder.query(bool1);
+
+                SearchResponse<Patent> response = client.search(builder.build(), Patent.class);
+                List<Hit<Patent>> hits = response.hits().hits();
+                for (Hit<Patent> hit : hits) {
+                    Patent patent = hit.source();
+                    if (patent.getProductId() != null) {
+                        productIds.add(patent.getProductId());
+                    }
+                }
+                List<Integer> collect = productIds.stream().distinct().collect(Collectors.toList());
+                map.put(patentNo, collect);
+            }
+        }
+        return map;
+    }
+
+}

+ 19 - 5
src/main/resources/jsons/patentDigProjectFiles.json

@@ -43,7 +43,7 @@
     "ifAsCondition": "true"
   },
   {
-    "name": "所属流程",
+    "name": "流程节点",
     "type": "String",
     "value": "processName",
     "field": "processName",
@@ -58,7 +58,7 @@
     "ifAsCondition": "false"
   },
   {
-    "name": "所属流程",
+    "name": "流程节点",
     "type": "Array",
     "value": "processId",
     "field": "processId",
@@ -88,12 +88,12 @@
     "ifAsCondition": "true"
   },
   {
-    "name": "是否最终",
+    "name": "最终文件",
     "type": "Boolean",
     "value": "ifFinal",
     "field": "ifFinal",
     "sqlField": "if_final",
-    "sqlClass": "getComSql",
+    "sqlClass": "GetComBoolSql",
     "orderClass": "getComOrder",
     "groupClass": "getComGroup",
     "ifSearch": "false",
@@ -101,7 +101,21 @@
     "ifShow": "true",
     "defaultHidden": "true",
     "ifAsCondition": "true"
-  },
+  },{
+  "name": "最终文件",
+  "type": "Array",
+  "value": "ifFinal",
+  "field": "ifFinal",
+  "sqlField": "if_final",
+  "sqlClass": "getComSql",
+  "orderClass": "getComOrder",
+  "groupClass": "getComGroup",
+  "ifSearch": "true",
+  "ifGroup": "false",
+  "ifShow": "false",
+  "defaultHidden": "false",
+  "ifAsCondition": "true"
+},
   {
     "name": "发生时间",
     "type": "DateTime",

+ 2 - 2
src/main/resources/jsons/projectTask.json

@@ -58,7 +58,7 @@
     "ifAsCondition": "false"
   },
   {
-    "name": "所属流程",
+    "name": "流程节点",
     "type": "String",
     "value": "processName",
     "field": "processName",
@@ -73,7 +73,7 @@
     "ifAsCondition": "false"
   },
   {
-    "name": "所属流程",
+    "name": "流程节点",
     "type": "Array",
     "value": "processId",
     "field": "processId",

+ 28 - 0
src/main/resources/mapper/PermissionRecordMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.cslg.pas.mapper.PermissionRecordMapper">
+
+    <select id="selectLicenseeMonthList" resultType="cn.cslg.pas.common.dto.es.SelectValueCurveDTO">
+        select sum(license_fee) as licenseFee,
+               DATE_FORMAT(license_time, '%Y-%m') as licenseTime
+        from permission_record
+        where patent_no = #{patentNo}
+        group by DATE_FORMAT(license_time, '%Y-%m');
+    </select>
+
+    <select id="selectLicenseeYearList" resultType="cn.cslg.pas.common.dto.es.SelectValueCurveDTO">
+        select sum(license_fee) as licenseFee,
+               CONCAT(DATE_FORMAT(license_time, '%Y'),'年') as licenseTime
+        from permission_record
+        where patent_no = #{patentNo}
+        group by DATE_FORMAT(license_time, '%Y');
+    </select>
+
+    <select id="selectLicenseeQuarterList" resultType="cn.cslg.pas.common.dto.es.SelectValueCurveDTO">
+        select sum(license_fee) as licenseFee,
+               CONCAT(YEAR(license_time),'年第',quarter(license_time),'季度') as licenseTime
+        from permission_record
+        where patent_no = #{patentNo}
+        group by licenseTime;
+    </select>
+</mapper>

+ 49 - 0
src/main/resources/mapper/ProductMarketDataMapper.xml

@@ -46,4 +46,53 @@
         </if>
         group by ${groupField}
     </select>
+
+    <select id="selectSaleMonthList" resultType="cn.cslg.pas.common.dto.es.SelectValueCurveDTO">
+        select sale_area as saleArea,
+               sum(sale_money) as saleMoney,
+               DATE_FORMAT(sale_time, '%Y-%m') as saleTime,
+               sum(sale_money*custom_license_rate) as customLicense
+        from pas_prod2.product_market_data
+        <where>
+            <if test="productIds != null and productIds.size > 0">
+                <foreach collection="productIds" item="productId" index="index" open="(" separator="," close=")">
+                    #{productId}
+                </foreach>
+            </if>
+        </where>
+        group by DATE_FORMAT(sale_time, '%Y-%m');
+    </select>
+
+    <select id="selectSaleYearList" resultType="cn.cslg.pas.common.dto.es.SelectValueCurveDTO">
+        select sale_area as saleArea,
+               sum(sale_money) as saleMoney,
+               CONCAT(DATE_FORMAT(sale_time, '%Y'),'年') as saleTime,
+               sum(sale_money*custom_license_rate) as customLicense
+               from pas_prod2.product_market_data
+        <where>
+            <if test="productIds != null and productIds.size > 0">
+                <foreach collection="productIds" item="productId" index="index" open="(" separator="," close=")">
+                    #{productId}
+                </foreach>
+            </if>
+        </where>
+        group by DATE_FORMAT(sale_time, '%Y');
+    </select>
+
+    <select id="selectSaleQuarterList" resultType="cn.cslg.pas.common.dto.es.SelectValueCurveDTO">
+        select sale_area as saleArea,
+               sum(sale_money) as saleMoney,
+               CONCAT(YEAR(sale_time),'年第',quarter(sale_time),'季度') as saleTime,
+               sum(sale_money*custom_license_rate) as customLicense
+               from pas_prod2.product_market_data
+        <where>
+            <if test="productIds != null and productIds.size > 0">
+                <foreach collection="productIds" item="productId" index="index" open="(" separator="," close=")">
+                    #{productId}
+                </foreach>
+            </if>
+        </where>
+        group by saleTime;
+    </select>
+
 </mapper>