xiexiang пре 1 година
родитељ
комит
d267d98b75

+ 16 - 0
src/main/java/cn/cslg/pas/common/dto/PatentExport/PatentExportParams.java

@@ -0,0 +1,16 @@
+package cn.cslg.pas.common.dto.PatentExport;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 导出专利
+ * @Author xiexiang
+ * @Date 2024/1/3
+ */
+@Data
+public class PatentExportParams {
+    private List<PatentExportVO> selected;
+    private Integer projectId;
+}

+ 35 - 0
src/main/java/cn/cslg/pas/common/dto/PatentExport/PatentExportVO.java

@@ -0,0 +1,35 @@
+package cn.cslg.pas.common.dto.PatentExport;
+
+import lombok.Data;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/3
+ */
+@Data
+public class PatentExportVO {
+    /**
+     * 字段名
+     */
+    private String key;
+
+    /**
+     * 字段中文
+     */
+    private String name;
+
+    /**
+     *
+     */
+    private Integer order;
+
+    /**
+     * 是否选择
+     */
+    private Boolean selected;
+
+    /**
+     * 类型
+     */
+    private String type;
+}

+ 55 - 0
src/main/java/cn/cslg/pas/common/dto/PatentExport/TaskParams.java

@@ -0,0 +1,55 @@
+package cn.cslg.pas.common.dto.PatentExport;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/3
+ */
+@Data
+public class TaskParams {
+    /**
+     * 任务类型(1.上传,2导出)
+     */
+    private Integer taskType;
+    /**
+     * 任务id
+     */
+    private Integer taskId;
+    /**
+     * 创建人id
+     */
+    private String createId;
+    /**
+     * 文件路径
+     */
+    private String path;
+    private String token;
+    private String ids;
+    /**
+     * 专题库id
+     */
+    private Integer projectId;
+    private String selected;
+    /**
+     * Excel中的全部专利的数据(key:表头(如"公开号")  value:表头对应的专利内容(如"CN204445352U"))
+     */
+    private List<Map<Object, Object>> rowList;
+    /**
+     * 文件原始名称
+     */
+    private String oldName;
+    /**
+     * 专利总数量
+     */
+    private Integer total;
+    private Integer index;
+    private Integer productId;
+
+    public TaskParams() {
+
+    }
+}

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

@@ -15,7 +15,7 @@ import java.util.Date;
 @Data
 public class ReportAffairDTO {
     /**
-     * 事务类型(0为口审记录,1为无效请求书,2为陈述意见书,3为无效决定书,4为行政诉讼书,5为行政诉讼判决书)
+     * 事务类型(0为口审记录,1为无效请求书,2为陈述意见书,3为无效决定书,4为行政诉讼书,5为行政诉讼判决书,6权要修改历史,7补充证据及理由
      */
     private Integer affairType;
 

+ 26 - 0
src/main/java/cn/cslg/pas/common/dto/invalidDTO/AddClaimHistoryDTO.java

@@ -0,0 +1,26 @@
+package cn.cslg.pas.common.dto.invalidDTO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 行政诉讼判决书
+ * @Author xiexiang
+ * @Date 2023/12/29
+ */
+@Data
+public class AddClaimHistoryDTO {
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date claimHistoryTime;
+
+    private Integer projectId;
+
+    private List<String> fileGuids;
+
+    private String description;
+}

+ 26 - 0
src/main/java/cn/cslg/pas/common/dto/invalidDTO/AddSupplyEvidenceDTO.java

@@ -0,0 +1,26 @@
+package cn.cslg.pas.common.dto.invalidDTO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 行政诉讼判决书
+ * @Author xiexiang
+ * @Date 2023/12/29
+ */
+@Data
+public class AddSupplyEvidenceDTO {
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date supplyEvidenceTime;
+
+    private Integer projectId;
+
+    private List<String> fileGuids;
+
+    private String description;
+}

+ 27 - 0
src/main/java/cn/cslg/pas/common/dto/invalidDTO/UpdateClaimHistoryDTO.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.common.dto.invalidDTO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 行政诉讼判决书
+ * @Author xiexiang
+ * @Date 2023/12/29
+ */
+@Data
+public class UpdateClaimHistoryDTO {
+    private Integer claimHistoryId;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date claimHistoryTime;
+
+    private Integer projectId;
+
+    private List<String> fileGuids;
+
+    private String description;
+}

+ 27 - 0
src/main/java/cn/cslg/pas/common/dto/invalidDTO/UpdateSupplyEvidenceDTO.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.common.dto.invalidDTO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 行政诉讼判决书
+ * @Author xiexiang
+ * @Date 2023/12/29
+ */
+@Data
+public class UpdateSupplyEvidenceDTO {
+    private Integer supplyEvidenceId;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date supplyEvidenceTime;
+
+    private Integer projectId;
+
+    private List<String> fileGuids;
+
+    private String description;
+}

+ 27 - 0
src/main/java/cn/cslg/pas/common/vo/invalidVO/ClaimHistoryVO.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.common.vo.invalidVO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 行政诉讼判决书
+ * @Author xiexiang
+ * @Date 2023/12/29
+ */
+@Data
+public class ClaimHistoryVO {
+    private Integer claimHistoryId;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date claimHistoryTime;
+
+    private Integer projectId;
+
+    private List<String> fileGuids;
+
+    private String description;
+}

+ 10 - 0
src/main/java/cn/cslg/pas/common/vo/invalidVO/ReportAffairVO.java

@@ -84,4 +84,14 @@ public class ReportAffairVO {
      * 行政诉讼判决书返回VO
      */
     private JudgementVO judgementVO;
+
+    /**
+     * 权利要求修改历史返回VO
+     */
+    private ClaimHistoryVO claimHistoryVO;
+
+    /**
+     * 补充证据及理由返回VO
+     */
+    private SupplyEvidenceVO supplyEvidenceVO;
 }

+ 27 - 0
src/main/java/cn/cslg/pas/common/vo/invalidVO/SupplyEvidenceVO.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.common.vo.invalidVO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 行政诉讼判决书
+ * @Author xiexiang
+ * @Date 2023/12/29
+ */
+@Data
+public class SupplyEvidenceVO {
+    private Integer supplyEvidenceId;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    private Date supplyEvidenceTime;
+
+    private Integer projectId;
+
+    private List<String> fileGuids;
+
+    private String description;
+}

+ 80 - 3
src/main/java/cn/cslg/pas/controller/PatentController.java

@@ -3,13 +3,15 @@ package cn.cslg.pas.controller;
 import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.dto.PatentDTO;
 import cn.cslg.pas.common.dto.PatentDetailDTO;
+import cn.cslg.pas.common.dto.PatentExport.PatentExportParams;
+import cn.cslg.pas.common.dto.PatentExport.TaskParams;
 import cn.cslg.pas.common.dto.PatentKinDTO;
 import cn.cslg.pas.common.dto.business.EsCountDTO;
 import cn.cslg.pas.common.dto.es.EsCustomFieldValueDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.QueryRequest;
 import cn.cslg.pas.common.model.request.StringRequest;
-import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.common.vo.PatentPageMessageVO;
 import cn.cslg.pas.common.vo.PatentWithIdVO;
 import cn.cslg.pas.common.vo.StarPatentVO;
@@ -19,14 +21,26 @@ import cn.cslg.pas.common.vo.business.PatentKinVO;
 import cn.cslg.pas.common.vo.business.PatentNoVO;
 import cn.cslg.pas.factorys.businessFactory.Business;
 import cn.cslg.pas.factorys.businessFactory.BusinessFactory;
+import cn.cslg.pas.service.business.PDFExportFirstPageService;
+import cn.cslg.pas.service.business.PatentExportService;
 import cn.cslg.pas.service.business.es.EsCountService;
 import cn.cslg.pas.service.business.es.EsPatentService;
 import cn.cslg.pas.service.business.es.EsService;
 import cn.cslg.pas.service.common.PatentStarApiService;
+import cn.hutool.core.util.IdUtil;
 import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
 import java.util.List;
 
 @RequestMapping(Constants.API_XiaoSHI + "/patent")
@@ -41,11 +55,18 @@ public class PatentController {
 
     @Autowired
     private EsPatentService patentService;
-@Autowired
-private EsService esService;
+    @Autowired
+    private EsService esService;
     @Autowired
     private PatentStarApiService patentStarApiService;
 
+    @Autowired
+    private CacheUtils cacheUtils;
+    @Autowired
+    private PatentExportService patentExportService;
+    @Autowired
+    private PDFExportFirstPageService pdfExportFirstPageService;
+
     @Operation(summary = "查询专利")
     @PostMapping("/queryPatent")
     public Response queryPatent(@RequestBody StringRequest stringRequest) throws Exception {
@@ -101,6 +122,62 @@ private EsService esService;
             return Response.success(null);
         }
         return Response.success(starPatentVO);
+    }
 
+    @PostMapping("/export")
+    @Operation(summary = "导出专利")
+    public ResponseEntity<InputStreamResource> export(@RequestBody PatentExportParams params) throws IOException {
+        Integer taskId = 1;
+        TaskParams taskParams = new TaskParams();
+        taskParams.setTaskId(taskId);
+        taskParams.setTaskType(2);
+        taskParams.setProjectId(params.getProjectId());
+        taskParams.setSelected(JsonUtils.objectToJson(params.getSelected()));
+        taskParams.setCreateId("328");
+        byte[] fileData = patentExportService.exportPatent(taskParams);
+        //保存生成excel的地址
+        String fileName = "导出专利报表.xlsx";
+//        String fileName = IdUtil.simpleUUID() + ".xls";
+//        String directoryName = fileUtils.createDirectory();
+//        String savePath = fileUtils.getSavePath(directoryName);
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+        return ResponseEntity.ok().contentLength(fileData.length)
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
+                .contentType(MediaType.parseMediaType("application/octet-stream"))
+                .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
     }
+
+
+//    @GetMapping("/pdf")
+//    @Operation(summary = "导出专利")
+//    public ResponseEntity<InputStreamResource> pdf(Integer projectId) throws IOException {
+//        byte[] fileData = pdfExportFirstPageService.mergeAndExportPDFFirstPage(projectId);
+//        //保存生成excel的地址
+//        String fileName = "PDF.pdf";
+////        String fileName = IdUtil.simpleUUID() + ".xls";
+////        String directoryName = fileUtils.createDirectory();
+////        String savePath = fileUtils.getSavePath(directoryName);
+//        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+//        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+//        return ResponseEntity.ok().contentLength(fileData.length)
+//                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
+//                .contentType(MediaType.parseMediaType("application/octet-stream"))
+//                .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
+//    }
+
+    @GetMapping("/exportPDFFirstPage")
+    @Operation(summary = "导出专利")
+    public ResponseEntity<InputStreamResource> exportPDFFirstPage(Integer projectId) throws IOException {
+        byte[] fileData = pdfExportFirstPageService.mergeAndExportPDFFirstPage(projectId);
+        //保存生成excel的地址
+        String fileName = IdUtil.simpleUUID() + ".pdf";
+        //文件原始名中的中文字符可能会乱码,对文件名进行URL编码
+        String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+        return ResponseEntity.ok().contentLength(fileData.length)
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFileName + "\"")
+                .contentType(MediaType.parseMediaType("application/octet-stream"))
+                .body(new InputStreamResource(new ByteArrayInputStream(fileData)));
+    }
+
 }

+ 36 - 0
src/main/java/cn/cslg/pas/controller/ReportAffairController.java

@@ -164,4 +164,40 @@ public class ReportAffairController {
         records.setData(id);
         return Response.success(records);
     }
+
+    @Operation(summary = "上传权要修改记录")
+    @PostMapping("/addPatentClaimHistory")
+    public Response addPatentClaimHistory(@RequestBody AddClaimHistoryDTO addClaimHistoryDTO) throws Exception {
+        Integer id = reportAffairService.addClaimHistory(addClaimHistoryDTO);
+        Records records = new Records();
+        records.setData(id);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "修改权要修改记录")
+    @PostMapping("/updatePatentClaimHistory")
+    public Response updatePatentClaimHistory(@RequestBody UpdateClaimHistoryDTO updateClaimHistoryDTO) throws Exception {
+        Integer id = reportAffairService.updateClaimHistory(updateClaimHistoryDTO);
+        Records records = new Records();
+        records.setData(id);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "上传补充证据")
+    @PostMapping("/addSupplyEvidence")
+    public Response addSupplyEvidence(@RequestBody AddSupplyEvidenceDTO addSupplyEvidenceDTO) throws Exception {
+        Integer id = reportAffairService.addSupplyEvidence(addSupplyEvidenceDTO);
+        Records records = new Records();
+        records.setData(id);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "修改补充证据")
+    @PostMapping("/updateSupplyEvidence")
+    public Response updateSupplyEvidence(@RequestBody UpdateSupplyEvidenceDTO updateSupplyEvidenceDTO) throws Exception {
+        Integer id = reportAffairService.updateSupplyEvidence(updateSupplyEvidenceDTO);
+        Records records = new Records();
+        records.setData(id);
+        return Response.success(records);
+    }
 }

+ 132 - 0
src/main/java/cn/cslg/pas/service/business/PDFExportFirstPageService.java

@@ -0,0 +1,132 @@
+package cn.cslg.pas.service.business;
+
+import cn.cslg.pas.common.dto.PatentColumnDTO;
+import cn.cslg.pas.common.dto.PatentDTO;
+import cn.cslg.pas.common.model.request.QueryRequest;
+import cn.cslg.pas.common.utils.FormatUtil;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.business.es.EsService;
+import cn.cslg.pas.service.common.FileManagerService;
+import com.spire.pdf.PdfPageSize;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.pdfbox.multipdf.PDFMergerUtility;
+import org.apache.pdfbox.io.MemoryUsageSetting;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.rendering.PDFRenderer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/4
+ */
+@Slf4j
+@Service
+public class PDFExportFirstPageService {
+    @Autowired
+    private FileManagerService fileManagerService;
+    @Autowired
+    private EsService esService;
+
+    /**
+     * 1
+     * @param projectId
+     * @return
+     * @throws IOException
+     */
+    public byte[] mergeAndExportPDFFirstPage(Integer projectId) throws IOException {
+        //根据projectId查询专利信息
+        QueryRequest queryRequest = new QueryRequest();
+        queryRequest.setProjectId(projectId);
+        PatentDTO patentDTO;
+        try {
+            patentDTO = esService.esSearch(queryRequest);
+        } catch (Exception e) {
+            throw new XiaoShiException("错误");
+        }
+        List<PatentColumnDTO> patents = patentDTO.getPatents();
+        byte[][] pdfDocuments = this.getPDFByteByAppNo(patents);
+        byte[] pdfData = this.mergeFirstPage(pdfDocuments);
+        return pdfData;
+    }
+
+    /**
+     * 3
+     * @param pdfDatas
+     * @return
+     * @throws IOException
+     */
+    public byte[] mergeFirstPage(byte[][] pdfDatas) throws IOException{
+        //创建一个输出流
+        try {
+            // 创建一个PDFMergerUtility实例
+            PDFMergerUtility merger = new PDFMergerUtility();
+            PDDocument resultDocument = new PDDocument();
+            //逐个处理每个pdf文件
+            for (byte[] pdfData : pdfDatas) {
+                // 加载每个输入的PDF文档
+                PDDocument document = PDDocument.load(pdfData);
+                // 获取第一页
+                PDPage firstPage = document.getPage(0);
+                // 创建一个新的文档用于保存第一页
+                PDDocument firstPageDocument = new PDDocument();
+                firstPageDocument.addPage(firstPage);
+                // 将第一页添加到合并器中
+                merger.appendDocument(resultDocument, firstPageDocument);
+                // 关闭当前处理的文档
+                document.close();
+                firstPageDocument.close();
+            }
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            resultDocument.save(out);
+            resultDocument.close();
+            return out.toByteArray();
+        } catch (FileNotFoundException e) {
+            throw new FileNotFoundException();
+        }
+    }
+
+    /**
+     * 2
+     * 根据查询到的专利信息获取它公告或公开专利的pdf文档数据流
+     * @param patents
+     * @return
+     */
+    public byte[][] getPDFByteByAppNo(List<PatentColumnDTO> patents){
+        List<byte[]> pdfDatas = new ArrayList<>();
+        //遍历传入专利集合
+        for (PatentColumnDTO item : patents) {
+            //判断申请号是否为空
+            if (item.getAppNo() != null) {
+                String appNo = item.getAppNo();
+                Integer type = 1;
+                //获取公告专利pdf文档guid
+                String pdfGuid = FormatUtil.getPDFFormat(appNo, type);
+
+                byte[] pdfData = new byte[0];
+                try {
+                    pdfData = fileManagerService.downloadSystemFileFromFMS(pdfGuid);
+                    if (pdfData == null) {
+                        //获取公开专利pdf文档guid
+                        Integer type2 = 0;
+                        String pdfGuid2 = FormatUtil.getPDFFormat(appNo, type2);
+                        pdfData = fileManagerService.downloadSystemFileFromFMS(pdfGuid2);
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    continue;//继续处理下一件专利
+                }
+                pdfDatas.add(pdfData);
+            }
+        }
+        byte[][] pdfDataArray = new byte[pdfDatas.size()][];
+        return pdfDatas.toArray(pdfDataArray);
+    }
+}

+ 168 - 0
src/main/java/cn/cslg/pas/service/business/PatentExportService.java

@@ -0,0 +1,168 @@
+package cn.cslg.pas.service.business;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.PatentColumnDTO;
+import cn.cslg.pas.common.dto.PatentDTO;
+import cn.cslg.pas.common.dto.PatentExport.PatentExportVO;
+import cn.cslg.pas.common.dto.PatentExport.TaskParams;
+import cn.cslg.pas.common.model.request.QueryRequest;
+import cn.cslg.pas.common.utils.*;
+import cn.cslg.pas.common.vo.TaskWebSocketDTO;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.business.es.EsService;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.input.XmlStreamReaderException;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author xiexiang
+ * @Date 2024/1/3
+ */
+@Slf4j
+@Service
+public class PatentExportService {
+
+    @Autowired
+    private FileUtils fileUtils;
+
+    @Autowired
+    private EsService esService;
+
+    /**
+     * 导出专利
+     * @param taskParams
+     * @return
+     * @throws IOException
+     */
+    public byte[] exportPatent(TaskParams taskParams) throws IOException {
+        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+            //selected字符串转PatentExportVO集合
+            List<PatentExportVO> selected = Optional.ofNullable(JsonUtils.jsonToList(taskParams.getSelected(), PatentExportVO.class))
+                    .orElse(new ArrayList<>());
+            //导出文件名
+            if (selected.isEmpty()) {
+                throw new IllegalArgumentException("没有选择要导出的数据");
+            }
+
+            //key的集合(标头:例如patentNo)
+            List<String> columns = selected.stream().filter(PatentExportVO::getSelected).map(PatentExportVO::getKey).distinct().collect(Collectors.toList());
+            //name的集合
+            List<String> headers = selected.stream().filter(PatentExportVO::getSelected).map(PatentExportVO::getName).distinct().collect(Collectors.toList());
+            if (columns.size() != headers.size()) {
+                throw new XiaoShiException("数量不匹配");
+            }
+            //新建工作簿
+            HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+            //新疆sheet页
+            HSSFSheet sheet = hssfWorkbook.createSheet();
+            sheet.setDefaultColumnWidth(30);
+            //新建标头行
+            HSSFRow headerRow = sheet.createRow(0);
+            headerRow.setHeight((short) 500);
+            //新建标头行格式
+            HSSFCellStyle headerCellStyle = hssfWorkbook.createCellStyle();
+            //新建普通行格式
+            HSSFCellStyle commonCellStyle = hssfWorkbook.createCellStyle();
+            //遍历设置标头
+            for (int i = 0; i < headers.size(); i++) {
+                HSSFCell cell = headerRow.createCell(i);
+                ExcelUtils.setExcelCellStyle(headerCellStyle);
+                headerCellStyle.setAlignment(HorizontalAlignment.CENTER);
+                headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+                headerCellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.SKY_BLUE.getIndex());
+                headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+                headerCellStyle.setWrapText(true);
+                cell.setCellStyle(headerCellStyle);
+                cell.setCellValue(headers.get(i));
+            }
+            //根据projectId查询专利信息
+            QueryRequest queryRequest = new QueryRequest();
+            queryRequest.setProjectId(taskParams.getProjectId());
+            PatentDTO patentDTO;
+            try {
+                patentDTO = esService.esSearch(queryRequest);
+            } catch (Exception e) {
+                throw new XiaoShiException("错误");
+            }
+
+            List<PatentColumnDTO> patents = patentDTO.getPatents();
+            for (int i = 0; i < patents.size(); i++) {
+                Map<String, Object> map = new LinkedHashMap<>();
+                PatentColumnDTO patent = patents.get(i);
+                if (patent == null) {
+                    continue;
+                }
+//                String country = StrUtil.sub(patent.getPatentNo(), 0, 2);
+
+
+                //
+                for (int j = 0; j < columns.size(); j++) {
+                    String column = columns.get(j);
+
+                    PatentExportVO patentExportVO = selected.stream().filter(item -> item.getKey().equals(column)).findFirst().orElse(new PatentExportVO());
+                    Object value = null;
+                    switch (column) {
+                        case "patentno":
+                            value = patent.getPatentNo();
+                            break;
+                        case "abstract":
+                            value = patent.getAbstractStr();
+                            break;
+                        case "abstract_path":
+                            break;
+                        case "publicno":
+                            value = patent.getPublicNo();
+                            break;
+                        case "publicdate":
+                            value = patent.getPublicDate();
+                            break;
+                        case "pstatus":
+                            value = patent.getSimpleStatus();
+                            break;
+                        default:
+                            value = null;
+                    }
+                    map.put(patentExportVO.getName(), value);
+                }
+                //新建一普通行
+                HSSFRow row = sheet.createRow(i + 1);
+                row.setHeight((short) 800);
+                for (String key : map.keySet()) {
+                    int index = headers.indexOf(key);
+                    if (index != -1) {
+                        HSSFCell cell = row.createCell(index);
+                        ExcelUtils.setExcelCellStyle(commonCellStyle);
+                        commonCellStyle.setVerticalAlignment(VerticalAlignment.TOP);
+                        commonCellStyle.setWrapText(true);
+                        cell.setCellStyle(commonCellStyle);
+                        if (StringUtils.isNotNull(map.get(key))) {
+                            cell.setCellValue(String.valueOf(map.get(key)));
+                        }
+                    }
+                }
+            }
+            hssfWorkbook.write(out);
+            return out.toByteArray();
+        } catch (FileNotFoundException e) {
+            throw new FileNotFoundException();
+        }
+    }
+
+}

+ 188 - 10
src/main/java/cn/cslg/pas/service/business/ReportAffairService.java

@@ -1,10 +1,7 @@
 package cn.cslg.pas.service.business;
 
 import cn.cslg.pas.common.dto.business.ReportAffairDTO;
-import cn.cslg.pas.common.dto.invalidDTO.AddAdminProceedDTO;
-import cn.cslg.pas.common.dto.invalidDTO.AddStateOpinionDTO;
-import cn.cslg.pas.common.dto.invalidDTO.QueryReportAffairDTO;
-import cn.cslg.pas.common.dto.invalidDTO.UpdateStateOpinionDTO;
+import cn.cslg.pas.common.dto.invalidDTO.*;
 import cn.cslg.pas.common.model.cronModel.Personnel;
 import cn.cslg.pas.common.model.cronModel.PersonnelVO;
 import cn.cslg.pas.common.model.cronModel.SystemFile;
@@ -145,18 +142,22 @@ public class ReportAffairService extends ServiceImpl<ReportAffairMapper, ReportA
             BeanUtils.copyProperties(item, reportAffairVO);
             //根据事务类型选择不同的装载方式
             Integer type = reportAffairVO.getAffairType();
-            if (type == 0) {//0 口审记录
+            if (type.equals(0)) {//0 口审记录
                 this.loadOralTrail(reportAffairVO);
-            } else if (type == 1) {//1 无效请求书
+            } else if (type.equals(1)) {//1 无效请求书
                 this.loadInvalidRequestFile(reportAffairVO);
-            } else if (type == 2) {//2 陈述意见书
+            } else if (type.equals(2)) {//2 陈述意见书
                 this.loadStateOpinion(reportAffairVO);
-            } else if (type == 3) {//3 无效决定书
+            } else if (type.equals(3)) {//3 无效决定书
                 this.loadInvalidDecisionFile(reportAffairVO);
-            } else if (type == 4) {//4 行政诉讼书
+            } else if (type.equals(4)) {//4 行政诉讼书
                 this.loadAdminProceed(reportAffairVO);
-            } else if (type == 5) {//5 行政诉讼判决书
+            } else if (type.equals(5)) {//5 行政诉讼判决书
                 this.loadJudgment(reportAffairVO);
+            } else if (type.equals(6)) {//6 权要修改记录
+                this.loadClaimHistory(reportAffairVO);
+            } else if (type.equals(7)) {//7 补充证据及理由
+                this.loadSupplyEvidence(reportAffairVO);
             }
             reportAffairVOS.add(reportAffairVO);
         });
@@ -371,4 +372,181 @@ public class ReportAffairService extends ServiceImpl<ReportAffairMapper, ReportA
         JudgementVO judgementVO = adminProceedService.getJudgment(reportAffairId);
         reportAffairVO.setJudgementVO(judgementVO);
     }
+
+    /**
+     * 上传权要修改记录
+     * @param addClaimHistoryDTO
+     * @return
+     */
+    public Integer addClaimHistory(AddClaimHistoryDTO addClaimHistoryDTO){
+        if (addClaimHistoryDTO == null) {
+            throw new XiaoShiException("入参为空");
+        }
+        Integer projectId = addClaimHistoryDTO.getProjectId();
+        if (projectId == null) {
+            throw new XiaoShiException("报告id为空");
+        }
+        //1. 首先上传报告事务,拿到报告事务id
+        ReportAffairDTO reportAffairDTO = new ReportAffairDTO();
+        reportAffairDTO.setProjectId(projectId);
+        //权要修改历史 6
+        reportAffairDTO.setAffairType(6);
+        //发生时间是无效请求日
+        reportAffairDTO.setOccurredTime(addClaimHistoryDTO.getClaimHistoryTime());
+        //备注
+        reportAffairDTO.setDescription(addClaimHistoryDTO.getDescription());
+        Integer reportAffairId = this.addReportAffair(reportAffairDTO);
+
+        if (reportAffairId == null) {
+            throw new XiaoShiException("上传报告事务失败");
+        }
+        //3. 添加报告事务与文件关联
+        List<String> fileGuids = addClaimHistoryDTO.getFileGuids();
+        if (fileGuids != null && !fileGuids.isEmpty()) {
+            List<AssoReportAffairFile> assoReportAffairFiles = new ArrayList<>();
+            fileGuids.forEach(item -> {
+                AssoReportAffairFile assoReportAffairFile = new AssoReportAffairFile();
+                assoReportAffairFile.setReportAffairId(reportAffairId);
+                assoReportAffairFile.setFileGuid(item);
+                assoReportAffairFiles.add(assoReportAffairFile);
+            });
+            assoReportAffairFileService.saveBatch(assoReportAffairFiles);
+        }
+        return reportAffairId;
+    }
+
+    /**
+     * 更新权要修改历史
+     * @param updateClaimHistoryDTO
+     * @return
+     */
+    public Integer updateClaimHistory(UpdateClaimHistoryDTO updateClaimHistoryDTO){
+        if (updateClaimHistoryDTO == null) {
+            throw new XiaoShiException("入参为空");
+        }
+        Integer projectId = updateClaimHistoryDTO.getProjectId();
+        Integer reportAffairId = updateClaimHistoryDTO.getClaimHistoryId();
+        if (reportAffairId == null) {
+            throw new XiaoShiException("reportAffairId为空");
+        }
+        if (projectId == null) {
+            throw new XiaoShiException("报告id为空");
+        }
+        //2. 拿到报告事务id,获取报告事务
+        ReportAffair reportAffair = this.getById(reportAffairId);
+        reportAffair.setProjectId(projectId);
+        //发生时间是无效请求日
+        reportAffair.setOccurredTime(updateClaimHistoryDTO.getClaimHistoryTime());
+        //备注
+        reportAffair.setDescription(updateClaimHistoryDTO.getDescription());
+        reportAffair.updateById();
+        //3. 更新报告事务与文件关联
+        List<String> fileGuids = updateClaimHistoryDTO.getFileGuids();
+        assoReportAffairFileService.updateAffairFile(reportAffairId, fileGuids);
+        return reportAffairId;
+    }
+
+    /**
+     * 上传补充证据及理由
+     * @param addSupplyEvidenceDTO
+     * @return
+     */
+    public Integer addSupplyEvidence(AddSupplyEvidenceDTO addSupplyEvidenceDTO){
+        if (addSupplyEvidenceDTO == null) {
+            throw new XiaoShiException("入参为空");
+        }
+        Integer projectId = addSupplyEvidenceDTO.getProjectId();
+        if (projectId == null) {
+            throw new XiaoShiException("报告id为空");
+        }
+        //1. 首先上传报告事务,拿到报告事务id
+        ReportAffairDTO reportAffairDTO = new ReportAffairDTO();
+        reportAffairDTO.setProjectId(projectId);
+        //补充证据及理由 6
+        reportAffairDTO.setAffairType(7);
+        //发生时间是无效请求日
+        reportAffairDTO.setOccurredTime(addSupplyEvidenceDTO.getSupplyEvidenceTime());
+        //备注
+        reportAffairDTO.setDescription(addSupplyEvidenceDTO.getDescription());
+        Integer reportAffairId = this.addReportAffair(reportAffairDTO);
+
+        if (reportAffairId == null) {
+            throw new XiaoShiException("上传报告事务失败");
+        }
+        //3. 添加报告事务与文件关联
+        List<String> fileGuids = addSupplyEvidenceDTO.getFileGuids();
+        if (fileGuids != null && !fileGuids.isEmpty()) {
+            List<AssoReportAffairFile> assoReportAffairFiles = new ArrayList<>();
+            fileGuids.forEach(item -> {
+                AssoReportAffairFile assoReportAffairFile = new AssoReportAffairFile();
+                assoReportAffairFile.setReportAffairId(reportAffairId);
+                assoReportAffairFile.setFileGuid(item);
+                assoReportAffairFiles.add(assoReportAffairFile);
+            });
+            assoReportAffairFileService.saveBatch(assoReportAffairFiles);
+        }
+        return reportAffairId;
+    }
+
+    /**
+     * 更新补充证据及理由
+     * @param updateSupplyEvidenceDTO
+     * @return
+     */
+    public Integer updateSupplyEvidence(UpdateSupplyEvidenceDTO updateSupplyEvidenceDTO){
+        if (updateSupplyEvidenceDTO == null) {
+            throw new XiaoShiException("入参为空");
+        }
+        Integer projectId = updateSupplyEvidenceDTO.getProjectId();
+        Integer reportAffairId = updateSupplyEvidenceDTO.getSupplyEvidenceId();
+        if (reportAffairId == null) {
+            throw new XiaoShiException("reportAffairId为空");
+        }
+        if (projectId == null) {
+            throw new XiaoShiException("报告id为空");
+        }
+        //2. 拿到报告事务id,获取报告事务
+        ReportAffair reportAffair = this.getById(reportAffairId);
+        reportAffair.setProjectId(projectId);
+        //发生时间是无效请求日
+        reportAffair.setOccurredTime(updateSupplyEvidenceDTO.getSupplyEvidenceTime());
+        //备注
+        reportAffair.setDescription(updateSupplyEvidenceDTO.getDescription());
+        reportAffair.updateById();
+        //3. 更新报告事务与文件关联
+        List<String> fileGuids = updateSupplyEvidenceDTO.getFileGuids();
+        assoReportAffairFileService.updateAffairFile(reportAffairId, fileGuids);
+        return reportAffairId;
+    }
+
+    /**
+     * 装载权利要求修改记录
+     * @param reportAffairVO
+     */
+    public void loadClaimHistory(ReportAffairVO reportAffairVO) {
+        Integer reportAffairId = reportAffairVO.getId();
+        ClaimHistoryVO claimHistoryVO = new ClaimHistoryVO();
+        ReportAffair reportAffair = this.getById(reportAffairId);
+        claimHistoryVO.setClaimHistoryId(reportAffairId);
+        claimHistoryVO.setDescription(reportAffair.getDescription());
+        claimHistoryVO.setClaimHistoryTime(reportAffair.getOccurredTime());
+        claimHistoryVO.setProjectId(reportAffair.getProjectId());
+        reportAffairVO.setClaimHistoryVO(claimHistoryVO);
+    }
+
+    /**
+     * 装载补充证据及理由
+     * @param reportAffairVO
+     */
+    public void loadSupplyEvidence(ReportAffairVO reportAffairVO) {
+        Integer reportAffairId = reportAffairVO.getId();
+        SupplyEvidenceVO supplyEvidenceVO = new SupplyEvidenceVO();
+        ReportAffair reportAffair = this.getById(reportAffairId);
+        supplyEvidenceVO.setSupplyEvidenceId(reportAffairId);
+        supplyEvidenceVO.setDescription(reportAffair.getDescription());
+        supplyEvidenceVO.setSupplyEvidenceTime(reportAffair.getOccurredTime());
+        supplyEvidenceVO.setProjectId(reportAffair.getProjectId());
+        reportAffairVO.setSupplyEvidenceVO(supplyEvidenceVO);
+    }
+
 }

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

@@ -234,7 +234,7 @@ public class EsService {
         }
 
         //分页
-        if (current > 0 && size > 0) {
+        if (current!=null&&size!=null&&current > 0 && size > 0) {
             builder.from((current.intValue() - 1) * size.intValue()).size(size.intValue());
         }