chendayu 2 anni fa
parent
commit
e6c030d28c
36 ha cambiato i file con 1804 aggiunte e 83 eliminazioni
  1. 10 0
      PAS/pom.xml
  2. 18 4
      PAS/src/main/java/cn/cslg/pas/common/model/PatentCell.java
  3. 30 0
      PAS/src/main/java/cn/cslg/pas/common/model/dto/GetClaimsInfoParamsDTO.java
  4. 30 0
      PAS/src/main/java/cn/cslg/pas/common/model/dto/GetDescriptionInfoParamsDTO.java
  5. 30 0
      PAS/src/main/java/cn/cslg/pas/common/model/dto/GetFuTuParamsDTO.java
  6. 30 0
      PAS/src/main/java/cn/cslg/pas/common/model/dto/GetSearchBiblioParamsDTO.java
  7. 46 0
      PAS/src/main/java/cn/cslg/pas/common/model/dto/QrtzTaskAddNewDTO.java
  8. 17 0
      PAS/src/main/java/cn/cslg/pas/common/utils/MathUtils.java
  9. 1 2
      PAS/src/main/java/cn/cslg/pas/controller/ProjectImportController.java
  10. 16 11
      PAS/src/main/java/cn/cslg/pas/controller/TaskController.java
  11. 38 0
      PAS/src/main/java/cn/cslg/pas/domain/AppNo.java
  12. 34 0
      PAS/src/main/java/cn/cslg/pas/domain/Application.java
  13. 28 0
      PAS/src/main/java/cn/cslg/pas/domain/BaseEntity.java
  14. 39 0
      PAS/src/main/java/cn/cslg/pas/domain/Image.java
  15. 27 0
      PAS/src/main/java/cn/cslg/pas/domain/ImageInfo.java
  16. 34 0
      PAS/src/main/java/cn/cslg/pas/domain/Inventor.java
  17. 81 0
      PAS/src/main/java/cn/cslg/pas/domain/PatentZhuLu.java
  18. 30 0
      PAS/src/main/java/cn/cslg/pas/domain/Priority.java
  19. 38 0
      PAS/src/main/java/cn/cslg/pas/domain/PriorityNumber.java
  20. 32 0
      PAS/src/main/java/cn/cslg/pas/domain/Priorityy.java
  21. 38 0
      PAS/src/main/java/cn/cslg/pas/domain/PubNo.java
  22. 23 0
      PAS/src/main/java/cn/cslg/pas/domain/PubReference.java
  23. 89 0
      PAS/src/main/java/cn/cslg/pas/domain/QrtzTask.java
  24. 20 0
      PAS/src/main/java/cn/cslg/pas/domain/Section.java
  25. 40 0
      PAS/src/main/java/cn/cslg/pas/domain/SerachBiblioData.java
  26. 3 1
      PAS/src/main/java/cn/cslg/pas/domain/Task.java
  27. 64 0
      PAS/src/main/java/cn/cslg/pas/domain/asso/AssoOsTaskQrtzTask.java
  28. 16 0
      PAS/src/main/java/cn/cslg/pas/mapper/asso/AssoOsTaskQrtzTaskMapper.java
  29. 10 0
      PAS/src/main/java/cn/cslg/pas/service/IAssoOsTaskQrtzTaskService.java
  30. 133 0
      PAS/src/main/java/cn/cslg/pas/service/OutInterfaceService.java
  31. 35 0
      PAS/src/main/java/cn/cslg/pas/service/TaskService.java
  32. 21 0
      PAS/src/main/java/cn/cslg/pas/service/asso/AssoOsTaskQrtzTaskService.java
  33. 609 0
      PAS/src/main/java/cn/cslg/pas/service/upLoadPatent/ExcuteTaskToPatentService.java
  34. 40 62
      PAS/src/main/java/cn/cslg/pas/service/upLoadPatent/PantentQueueService.java
  35. 50 2
      PAS/src/main/java/cn/cslg/pas/service/upLoadPatent/UploadTaskService.java
  36. 4 1
      PAS/src/main/resources/application-dev.yml

+ 10 - 0
PAS/pom.xml

@@ -181,6 +181,11 @@
             <artifactId>c3p0</artifactId>
             <version>0.9.5.2</version>
         </dependency>
+        <dependency>
+            <groupId>e-iceblue</groupId>
+            <artifactId>spire.pdf</artifactId>
+            <version>8.7.0</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -225,6 +230,11 @@
                 <enabled>false</enabled>
             </snapshots>
         </repository>
+    <repository>
+        <id>com.e-iceblue</id>
+        <name>e-iceblue</name>
+        <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
+    </repository>
     </repositories>
 
 </project>

+ 18 - 4
PAS/src/main/java/cn/cslg/pas/common/model/PatentCell.java

@@ -2,6 +2,7 @@ package cn.cslg.pas.common.model;
 
 
 import cn.cslg.pas.common.model.dto.UploadFileDTO;
+import cn.cslg.pas.domain.Priority;
 import lombok.Data;
 
 import java.util.List;
@@ -91,7 +92,7 @@ public class PatentCell {
     /*
     摘要
      */
-    private  String abstrText;
+    private String abstrText;
 
     /*
     主权要
@@ -126,7 +127,7 @@ public class PatentCell {
     /*
    代理机构
     */
-    private  String agency;
+    private String agency;
     /*
     代理人
      */
@@ -135,9 +136,22 @@ public class PatentCell {
     /*专利法律状态
 
      */
-    List<PatentAffair> patentAffairs ;
+    List<PatentAffair> patentAffairs;
+    /**
+     * 同族号
+     */
+    private String familyId;
+    /**
+     * 优先权信息(优先权号、优先权国家、优先权日)
+     */
+    private List<Priority> priorities;
+    /**
+     * 其他附图路径
+     */
+    private List<String> otherUrls;
+
     @Data
-    public static  class PatentAffair{
+    public static class PatentAffair {
         /**
          * 法律状态
          */

+ 30 - 0
PAS/src/main/java/cn/cslg/pas/common/model/dto/GetClaimsInfoParamsDTO.java

@@ -0,0 +1,30 @@
+package cn.cslg.pas.common.model.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 远程调用爬取欧专局,获取获取权要信息的接口的DTO类
+ *
+ * @Author chenyu
+ * @Date 2023/4/12
+ */
+@Accessors(chain = true)
+@Data
+public class GetClaimsInfoParamsDTO implements Serializable {
+    /**
+     * 国家前2位首字母
+     */
+    private String cc;
+    /**
+     * 专利号数字
+     */
+    private String number;
+    /**
+     * 专利种类
+     */
+    private String kind;
+
+}

+ 30 - 0
PAS/src/main/java/cn/cslg/pas/common/model/dto/GetDescriptionInfoParamsDTO.java

@@ -0,0 +1,30 @@
+package cn.cslg.pas.common.model.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 远程调用爬取欧专局,获取说明书信息的接口的DTO类
+ *
+ * @Author chenyu
+ * @Date 2023/4/12
+ */
+@Accessors(chain = true)
+@Data
+public class GetDescriptionInfoParamsDTO implements Serializable {
+    /**
+     * 国家前2位首字母
+     */
+    private String cc;
+    /**
+     * 专利号数字
+     */
+    private String number;
+    /**
+     * 专利种类
+     */
+    private String kind;
+
+}

+ 30 - 0
PAS/src/main/java/cn/cslg/pas/common/model/dto/GetFuTuParamsDTO.java

@@ -0,0 +1,30 @@
+package cn.cslg.pas.common.model.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 远程调用爬取欧专局,获取附件的接口的DTO类
+ *
+ * @Author chenyu
+ * @Date 2023/4/12
+ */
+@Accessors(chain = true)
+@Data
+public class GetFuTuParamsDTO implements Serializable {
+    /**
+     * 附件链接
+     */
+    private String link;
+    /**
+     * 附件页数
+     */
+    private Integer page;
+    /**
+     * 附件类型
+     */
+    private String type;
+
+}

+ 30 - 0
PAS/src/main/java/cn/cslg/pas/common/model/dto/GetSearchBiblioParamsDTO.java

@@ -0,0 +1,30 @@
+package cn.cslg.pas.common.model.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 远程调用爬取欧专局,获取一批专利著录接口的DTO类
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class GetSearchBiblioParamsDTO implements Serializable {
+    /**
+     * 检索信息条件
+     */
+    private String query;
+    /**
+     * 起始专利数(1代表从第1个专利开始,注意不是页数)
+     */
+    private Integer start;
+    /**
+     * 最后专利数(10代表到第10个专利为止,注意不是页数)
+     */
+    private Integer end;
+
+}

+ 46 - 0
PAS/src/main/java/cn/cslg/pas/common/model/dto/QrtzTaskAddNewDTO.java

@@ -0,0 +1,46 @@
+package cn.cslg.pas.common.model.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 新增任务条件DTO
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@Accessors(chain = true)
+@Data
+public class QrtzTaskAddNewDTO {
+    /**
+     * 专题库id
+     */
+    private Integer projectId;
+    /**
+     * 任务类型(0普通任务 1定时任务)
+     */
+    private Integer taskType;
+    /**
+     * 检索信息
+     */
+    private String conditions;
+    /**
+     * cron表达式
+     */
+    private String crons;
+    /**
+     * 下载字段
+     */
+    private List<String> configCells;
+    /**
+     * 网站配置id
+     */
+    private Integer configId;
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+}

+ 17 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/MathUtils.java

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.utils;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author chenyu
+ * @Date 2023/3/28
+ */
+public class MathUtils {
+
+    public static double saveTwoDecimal(double value) {
+        BigDecimal bd = new BigDecimal(value);
+        value = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+        return value;
+    }
+
+}

+ 1 - 2
PAS/src/main/java/cn/cslg/pas/controller/ProjectImportController.java

@@ -58,9 +58,8 @@ public class ProjectImportController {
             return Response.error("参数错误");
         }
         //TaskParams taskParams = projectService.getImportPatentTaskParams(file, params.getProjectId());
-        //projectService.importPatent(taskParams, params);
         //uploadPatentBatchService.uploadPatentBatch(taskParams, params);
-        uploadTaskService.addTask(file, json);
+        uploadTaskService.addExcelTask(file, json);
         return Response.success(true);
     }
 

+ 16 - 11
PAS/src/main/java/cn/cslg/pas/controller/TaskController.java

@@ -1,11 +1,14 @@
 package cn.cslg.pas.controller;
 
 import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.model.dto.QrtzTaskAddNewDTO;
 import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
 import cn.cslg.pas.common.model.vo.TaskVO;
 import cn.cslg.pas.common.utils.JsonUtils;
 import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.domain.QrtzTask;
 import cn.cslg.pas.domain.Task;
+import cn.cslg.pas.domain.asso.AssoOsTaskQrtzTask;
 import cn.cslg.pas.service.TaskService;
 import cn.cslg.pas.service.upLoadPatent.UploadTaskService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -61,17 +64,19 @@ public class TaskController {
     }
 
     @PostMapping("add")
-    @Operation(summary = "新增专利导入任务")
-    public String add(MultipartFile file, String json) throws IOException {
-        if (json == null || json.equals("")) {
-            return Response.error("参数错误");
-        }
-        ProjectImportPatentVO params = JsonUtils.jsonToPojo(json, ProjectImportPatentVO.class);
-        if (params == null) {
-            return Response.error("参数错误");
-        }
-        uploadTaskService.addTask(file, json);
-        return Response.success(true);
+    @Operation(summary = "新增网站导入专利任务")
+    public String add(@RequestBody QrtzTaskAddNewDTO qrtzTaskAddNewDTO) throws IOException {
+        //添加任务
+        uploadTaskService.addEpoTask(qrtzTaskAddNewDTO);
+
+//        if(qrtzTask==null){
+//            return Response.error("未配置网站登录信息");
+//        }
+//        //任务添加完,判断是定时任务则任务调度添加该定时任务
+//        if (qrtzTask.getTaskType() == 1) {
+//            jobService.addJob(qrtzTask);
+//        }
+        return Response.success("添加任务完成");
     }
 
     @PostMapping("/pause")

+ 38 - 0
PAS/src/main/java/cn/cslg/pas/domain/AppNo.java

@@ -0,0 +1,38 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 申请号
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class AppNo implements Serializable {
+    /**
+     * 申请号类型(如:docdb、epodoc、original)
+     */
+    private String type;
+    /**
+     * 申请国家(如:AU)
+     */
+    private String country;
+    /**
+     * 申请号数字(如:2021229172)
+     */
+    private String number;
+    /**
+     * 申请号类型格式(如:A)
+     */
+    private String kind;
+    /**
+     * 申请号日期(如:2021-08-25T00:00:00)
+     */
+    private String date;
+
+}

+ 34 - 0
PAS/src/main/java/cn/cslg/pas/domain/Application.java

@@ -0,0 +1,34 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 这是啥???
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class Application implements Serializable {
+    /**
+     * 这是啥
+     */
+    private Integer sequence;
+    /**
+     * 国家前两位首字母
+     */
+    private String country;
+    /**
+     * 英文翻译名称(外国专利使用英文翻译名称)
+     */
+    private String enName;
+    /**
+     * 原始名称(中国专利使用原始名称)
+     */
+    private String originalName;
+
+}

+ 28 - 0
PAS/src/main/java/cn/cslg/pas/domain/BaseEntity.java

@@ -0,0 +1,28 @@
+package cn.cslg.pas.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+
+/**
+ * Entity基类
+ *
+ */
+@Data
+@SuppressWarnings("rawtypes")
+public class BaseEntity<T extends Model> extends Model {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -4851055162892178225L;
+
+    /**
+     * 唯一ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+}

+ 39 - 0
PAS/src/main/java/cn/cslg/pas/domain/Image.java

@@ -0,0 +1,39 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 封装images信息(imageType、urlLink、formatOptions)
+ *
+ * @Author chenyu
+ * @Date 2023/4/12
+ */
+@Accessors(chain = true)
+@Data
+public class Image implements Serializable {
+    /**
+     * 图片类型("FullDocument"为说明书pdf、"FirstPageClipping"为摘要附图、"Drawing"为其他附图)
+     */
+    private String imageType;
+    /**
+     * 图片页数(此属性值作为调用获取具体图片的接口的参数)
+     */
+    private Integer numberOfPages;
+    /**
+     * 链接参数(此属性值作为调用获取具体图片的接口的参数)
+     */
+    private String urlLink;
+    /**
+     * 图片格式((此属性值作为调用获取具体图片的接口的参数)(说明书FullDocument用application/pdf、摘要附图FirstPageClipping用image/jpeg、其他附图Drawing用application/tiff)
+     */
+    private List<String> formatOptions;
+    /**
+     * 无用类,仅为了放入ImageInfo中凑数(为了JSONObject.parseObject能转化成功)
+     */
+    private List<Section> sections;
+
+}

+ 27 - 0
PAS/src/main/java/cn/cslg/pas/domain/ImageInfo.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 图片信息(接收http://192.168.1.24:5001/api/OPSQuery/GetImagesInfo接口的返回值data)
+ *
+ * @Author chenyu
+ * @Date 2023/4/12
+ */
+@Accessors(chain = true)
+@Data
+public class ImageInfo implements Serializable {
+    /**
+     * 无用类,仅为了放入ImageInfo中凑数(为了JSONObject.parseObject能转化成功)
+     */
+    private PubReference pubReference;
+    /**
+     * 代表各种附件的信息(封装着三种附件的类型、链接、附件页数)
+     */
+    private List<Image> images;
+
+}

+ 34 - 0
PAS/src/main/java/cn/cslg/pas/domain/Inventor.java

@@ -0,0 +1,34 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 发明人信息
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class Inventor implements Serializable {
+    /**
+     * 这是啥
+     */
+    private Integer sequence;
+    /**
+     * 国家前两位首字母
+     */
+    private String country;
+    /**
+     * 英文名(外国专利使用英文名)
+     */
+    private String enName;
+    /**
+     * 原名(中国专利使用原名)
+     */
+    private String originalName;
+
+}

+ 81 - 0
PAS/src/main/java/cn/cslg/pas/domain/PatentZhuLu.java

@@ -0,0 +1,81 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 专利著录信息(接收http://192.168.1.24:5001/api/OPSQuery/SearchBiblio接口的返回值data)
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class PatentZhuLu implements Serializable {
+    /**
+     * 申请国家
+     */
+    private String appCountry;
+    /**
+     * 同族号
+     */
+    private String familyId;
+    /**
+     * 多个申请号(只需取type是docdb的)
+     */
+    private List<AppNo> appNos;
+    /**
+     * 申请日
+     */
+    private String appDate;
+    /**
+     * 多个公开号(只需取type是docdb的)
+     */
+    private List<PubNo> pubNos;
+    /**
+     * 公开日
+     */
+    private String pubDate;
+    /**
+     * 多个ipc分类号
+     */
+    private List<String> ipCs;
+    /**
+     * 多个cpc分类号
+     */
+    private List<String> cpCs;
+    /**
+     * 多个申请人
+     */
+    private List<Application> applications;
+    /**
+     * 多个发明人
+     */
+    private List<Inventor> inventors;
+    /**
+     * 英文翻译标题
+     */
+    private String enTitle;
+    /**
+     * 原始标题
+     */
+    private String olTitle;
+    /**
+     * 英文翻译摘要
+     */
+    private String enAbstract;
+    /**
+     * 原始摘要
+     */
+    private String olAbstract;
+    /**
+     * 优先权
+     */
+    private List<Priorityy> priorties;
+
+
+
+}

+ 30 - 0
PAS/src/main/java/cn/cslg/pas/domain/Priority.java

@@ -0,0 +1,30 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 优先权信息(优先权号、优先权国家、优先权日)
+ *
+ * @Author chenyu
+ * @Date 2023/4/12
+ */
+@Accessors(chain = true)
+@Data
+public class Priority implements Serializable {
+    /**
+     * 优先权号
+     */
+    private String priorityNo;
+    /**
+     * 优先权国家
+     */
+    private String priorityCountry;
+    /**
+     * 优先权日
+     */
+    private String priorityDate;
+
+}

+ 38 - 0
PAS/src/main/java/cn/cslg/pas/domain/PriorityNumber.java

@@ -0,0 +1,38 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 优先权Number这是啥
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class PriorityNumber implements Serializable {
+    /**
+     * 优先权Number类型(如:epodoc、original)
+     */
+    private String type;
+    /**
+     * 优先权Number国家(如:GB)
+     */
+    private String country;
+    /**
+     * 优先权number(如:GB20200003495)
+     */
+    private String number;
+    /**
+     * 优先权Number类型格式(如:A)
+     */
+    private String kind;
+    /**
+     * 优先权Number日期(如:0001-01-01T00:00:00)
+     */
+    private String date;
+
+}

+ 32 - 0
PAS/src/main/java/cn/cslg/pas/domain/Priorityy.java

@@ -0,0 +1,32 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 优先权信息
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class Priorityy implements Serializable {
+    /**
+     * 优先权顺序
+     */
+    private Integer sequence;
+    /**
+     * 优先权Number这是啥
+     */
+    private List<PriorityNumber> numbers;
+    /**
+     * 优先权日期
+     */
+    private String date;
+
+
+}

+ 38 - 0
PAS/src/main/java/cn/cslg/pas/domain/PubNo.java

@@ -0,0 +1,38 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 公开号
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class PubNo implements Serializable {
+    /**
+     * 公开号类型(如:docdb、epodoc)
+     */
+    private String type;
+    /**
+     * 公开号国家(如:AU)
+     */
+    private String country;
+    /**
+     * 公开号数字(如:2021229172)
+     */
+    private String number;
+    /**
+     * 申请号类型格式(如:A1)
+     */
+    private String kind;
+    /**
+     * 申请号日期(如:2023-04-06T00:00:00)
+     */
+    private String date;
+
+}

+ 23 - 0
PAS/src/main/java/cn/cslg/pas/domain/PubReference.java

@@ -0,0 +1,23 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 无用类,仅为了放入ImageInfo中凑数(为了JSONObject.parseObject能转化成功)
+ *
+ * @Author chenyu
+ * @Date 2023/4/13
+ */
+@Accessors(chain = true)
+@Data
+public class PubReference implements Serializable {
+    private String type;
+    private String country;
+    private String number;
+    private String kind;
+    private String date;
+
+}

+ 89 - 0
PAS/src/main/java/cn/cslg/pas/domain/QrtzTask.java

@@ -0,0 +1,89 @@
+package cn.cslg.pas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 任务执行情况表的实体类
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@TableName(value = "qrtz_task")
+@Accessors(chain = true)
+@Data
+public class QrtzTask extends BaseEntity<QrtzTask> {
+    /**
+     * 专题库id
+     */
+    @TableField(value = "project_id")
+    private Integer projectId;
+    /**
+     * 任务名称
+     */
+    @TableField(value = "task_name")
+    private String taskName;
+    /**
+     * 任务类型(0普通任务 1定时任务)
+     */
+    @TableField(value = "task_type")
+    private Integer taskType;
+    /**
+     * 状态(0等待中 1进行中 2成功 3失败 4等待下一次执行 5取消 6暂停)
+     */
+    @TableField(value = "task_state")
+    private Integer taskState;
+    /**
+     * 检索信息
+     */
+    @TableField(value = "conditions")
+    private String conditions;
+    /**
+     * cron表达式
+     */
+    @TableField(value = "crons")
+    private String crons;
+    /**
+     * 下载字段
+     */
+    @TableField(value = "config_cells")
+    private String configCells;
+    /**
+     * 网站id
+     */
+    @TableField(value = "config_id")
+    private Integer configId;
+    /**
+     * 创建人id
+     */
+    @TableField(value = "create_person_id")
+    private Integer createPersonId;
+    /**
+     * 创建人名称
+     */
+    @TableField(value = "create_person_name")
+    private String createName;
+    @TableField(value = "tenant_id")
+    private Integer tenantId;
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "create_time")
+    private Date createTime;
+    /**
+     * 最后修改时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "modified_time")
+    private Date modifiedTime;
+
+}

+ 20 - 0
PAS/src/main/java/cn/cslg/pas/domain/Section.java

@@ -0,0 +1,20 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 无用类,仅为了放入ImageInfo中凑数(为了JSONObject.parseObject能转化成功)
+ *
+ * @Author chenyu
+ * @Date 2023/4/13
+ */
+@Accessors(chain = true)
+@Data
+public class Section implements Serializable {
+    private String name;
+    private Integer startPage;
+
+}

+ 40 - 0
PAS/src/main/java/cn/cslg/pas/domain/SerachBiblioData.java

@@ -0,0 +1,40 @@
+package cn.cslg.pas.domain;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用来封装远程调用爬取欧专局获取一批专利著录接口返回的数据("data")
+ *
+ * @Author chenyu
+ * @Date 2023/4/11
+ */
+@Accessors(chain = true)
+@Data
+public class SerachBiblioData implements Serializable {
+    /**
+     * 专利总数量(欧专局的接口最多返回专利数量为10000)
+     */
+    private Integer totals;
+    /**
+     * 检索时输入的起始专利(1代表第1件,注意不是页数)
+     */
+    private Integer start;
+    /**
+     * 检索时输入的最后专利(50代表第50件,注意不是页数)
+     */
+    private Integer end;
+    /**
+     * 检索时输入的检索条件信息检索式即conditions
+     */
+    private String cql;
+    /**
+     * 检索到的所有专利的著录信息
+     */
+    private List<PatentZhuLu> patents;
+
+
+}

+ 3 - 1
PAS/src/main/java/cn/cslg/pas/domain/Task.java

@@ -4,6 +4,7 @@ import cn.cslg.pas.common.model.BaseEntity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * <p>
@@ -13,12 +14,13 @@ import lombok.Data;
  * @author 王岩
  * @since 2022-02-27
  */
+@Accessors(chain = true)
 @Data
 @TableName("os_task")
 public class Task extends BaseEntity<Task> {
 
     /**
-     * 任务类型 1.上传,2导出
+     * 任务类型 1上传 2导出 3网站导入
      */
     @TableField("type")
     private Integer type;

+ 64 - 0
PAS/src/main/java/cn/cslg/pas/domain/asso/AssoOsTaskQrtzTask.java

@@ -0,0 +1,64 @@
+package cn.cslg.pas.domain.asso;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 任务和网站任务关联表
+ *
+ * @Author chenyu
+ * @Date 2023/6/12
+ */
+@TableName(value = "asso_osTask_qrtzTask")
+@Accessors(chain = true)
+@Data
+public class AssoOsTaskQrtzTask implements Serializable {
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 任务id
+     */
+    @TableField(value = "task_id")
+    private Integer taskId;
+    /**
+     * 任务类型(0普通任务 1定时任务)
+     */
+    @TableField(value = "task_type")
+    private Integer taskType;
+    /**
+     * 检索信息
+     */
+    @TableField(value = "conditions")
+    private String conditions;
+    /**
+     * cron表达式
+     */
+    @TableField(value = "crons")
+    private String crons;
+    /**
+     * 下载字段
+     */
+    @TableField(value = "config_cells")
+    private String configCells;
+    /**
+     * 网站id
+     */
+    @TableField(value = "config_id")
+    private Integer configId;
+    /**
+     * 任务名称
+     */
+    @TableField(value = "task_name")
+    private String taskName;
+
+}

+ 16 - 0
PAS/src/main/java/cn/cslg/pas/mapper/asso/AssoOsTaskQrtzTaskMapper.java

@@ -0,0 +1,16 @@
+package cn.cslg.pas.mapper.asso;
+
+import cn.cslg.pas.domain.asso.AssoOsTaskQrtzTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 任务和网站任务关联表的Mapper层接口
+ *
+ * @Author chenyu
+ * @Date 2023/6/12
+ */
+@Repository
+public interface AssoOsTaskQrtzTaskMapper extends BaseMapper<AssoOsTaskQrtzTask> {
+
+}

+ 10 - 0
PAS/src/main/java/cn/cslg/pas/service/IAssoOsTaskQrtzTaskService.java

@@ -0,0 +1,10 @@
+package cn.cslg.pas.service;
+
+/**
+ * 任务和网站任务关联的Service层接口
+ *
+ * @Author chenyu
+ * @Date 2023/6/12
+ */
+public interface IAssoOsTaskQrtzTaskService {
+}

+ 133 - 0
PAS/src/main/java/cn/cslg/pas/service/OutInterfaceService.java

@@ -1,5 +1,11 @@
 package cn.cslg.pas.service;
 
+import cn.cslg.pas.common.model.PatentCell;
+import cn.cslg.pas.common.model.dto.GetClaimsInfoParamsDTO;
+import cn.cslg.pas.common.model.dto.GetDescriptionInfoParamsDTO;
+import cn.cslg.pas.common.model.dto.GetFuTuParamsDTO;
+import cn.cslg.pas.common.model.dto.GetSearchBiblioParamsDTO;
+import cn.cslg.pas.domain.PubNo;
 import com.google.gson.Gson;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +33,10 @@ import java.util.concurrent.TimeUnit;
 public class OutInterfaceService {
     @Value("${authorUrl}")
     private String PCSUrl;
+    @Value("${OPSUrl}")
+    private String OPSUrl;
+    @Value("${PASUrl}")
+    private String PASUrl;
 
     /**
      * 根据人员名称模糊查询人员ids
@@ -65,4 +75,127 @@ public class OutInterfaceService {
         return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
     }
 
+    /**
+     * 远程调用获取一批专利著录的接口
+     *
+     * @return
+     */
+    public String getSearchBiblio(GetSearchBiblioParamsDTO getSearchBiblioParamsDTO) throws IOException {
+        //String param = new Gson().toJson(getSearchBiblioParamsDTO);
+        //RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(OPSUrl + "/api/OPSQuery/SearchBiblio?query=" + getSearchBiblioParamsDTO.getQuery() + "&start=" + getSearchBiblioParamsDTO.getStart() + "&end=" + getSearchBiblioParamsDTO.getEnd())
+                .get()
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * 远程调用获取权要信息的接口
+     *
+     * @return
+     */
+    public String getClaimsInfo(GetClaimsInfoParamsDTO getClaimsInfoParamsDTO) throws IOException {
+        //String param = new Gson().toJson(getClaimsInfoParamsDTO);
+        //RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(OPSUrl + "/api/OPSQuery/GetClaimsInfo?cc=" + getClaimsInfoParamsDTO.getCc() + "&number=" + getClaimsInfoParamsDTO.getNumber() + "&kind=" + getClaimsInfoParamsDTO.getKind())
+                .get()
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * 远程调用获取说明书的接口
+     *
+     * @return
+     */
+    public String getDescriptionInfo(GetDescriptionInfoParamsDTO getDescriptionInfoParamsDTO) throws IOException {
+        //String param = new Gson().toJson(getDescriptionInfoParamsDTO);
+        //RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(OPSUrl + "/api/OPSQuery/GetDescriptionInfo?cc=" + getDescriptionInfoParamsDTO.getCc() + "&number=" + getDescriptionInfoParamsDTO.getNumber() + "&kind=" + getDescriptionInfoParamsDTO.getKind())
+                .get()
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * 远程调用获取Image信息的接口
+     *
+     * @return
+     */
+    public String getImagesInfo(PubNo pubNo) throws IOException {
+        String pn = pubNo.getCountry() + pubNo.getNumber() + "." + pubNo.getKind();
+        //String param = new Gson().toJson(pn);
+        //RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(OPSUrl + "/api/OPSQuery/GetImagesInfo?Pn=" + pn)
+                .get()
+                .build();
+        return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
+    }
+
+    /**
+     * 远程调用获取附件文件流的接口
+     *
+     * @return
+     */
+    public byte[] getPatentFile(GetFuTuParamsDTO getFuTuParamsDTO) throws IOException {
+        //String param = new Gson().toJson(getFuTuParamsDTO);
+        //RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        OkHttpClient okHttpClient = new OkHttpClient.Builder()
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .build();
+        Request request = new Request.Builder()
+                .url(OPSUrl + "/api/OPSQuery/GetPatentFile?link=" + getFuTuParamsDTO.getLink() + "&page=" + getFuTuParamsDTO.getPage() + "&type=" + getFuTuParamsDTO.getType())
+                .get()
+                .build();
+        byte[] buffer = okHttpClient.newCall(request).execute().body().bytes();
+        return buffer;
+    }
+
+    /**
+     * @params 传对象
+     * @title 导入专利
+     * @description 导入专利
+     * @author lrj
+     */
+    public String importPatents(PatentCell patentCell) throws IOException {
+        OkHttpClient httpClient = new OkHttpClient.Builder()
+                .pingInterval(400, TimeUnit.SECONDS) // 设置 PING 帧发送间隔
+                .connectTimeout(300, TimeUnit.SECONDS)//设置连接超时时间
+                .readTimeout(300, TimeUnit.SECONDS)//设置读取超时时间
+                .build();
+        String param = new Gson().toJson(patentCell);
+        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+        Request request = new Request.Builder()
+                .url(PASUrl + "/api/v2/system/patentCellTODb")
+                .post(requestBody)
+                .build();
+        return Objects.requireNonNull(httpClient.newCall(request).execute().body()).string();
+    }
+
 }

+ 35 - 0
PAS/src/main/java/cn/cslg/pas/service/TaskService.java

@@ -2,6 +2,7 @@ package cn.cslg.pas.service;
 
 import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.model.dto.ClientDTO;
+import cn.cslg.pas.common.model.dto.QrtzTaskAddNewDTO;
 import cn.cslg.pas.common.model.vo.ProductVO;
 import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
 import cn.cslg.pas.common.model.vo.ProjectVO;
@@ -145,6 +146,40 @@ public class TaskService extends ServiceImpl<TaskMapper, Task> implements ITaskS
         return task.getId();
     }
 
+    /**
+     * 新增网站导入专利任务
+     *
+     * @param qrtzTaskAddNewDTO 前台参数
+     * @return 返回任务id
+     */
+    public Integer addTask3(QrtzTaskAddNewDTO qrtzTaskAddNewDTO, Integer total) {
+        //创建任务表实体类,准备装载数据 ↓
+        Task task = new Task();
+
+        //任务开始时间
+        task.setStartTime(DateUtils.getDateTime());
+        //任务状态(0.队列中 1.进行中 2.成功 3.失败)
+        task.setStatus(0);
+        //专题库id
+        task.setProductId(qrtzTaskAddNewDTO.getProjectId());
+        //专利总数量
+        task.setTotal(total);
+        //任务类型 (1上传 2导出 3网站导入)
+        task.setType(3);
+        //导入导出字段数量
+        task.setFieldNum(0);
+        //创建人id
+        task.setCreateBy(loginUtils.getId());
+        //成功条数
+        task.setSuccessNum(0);
+        //失败条数
+        task.setDefaultNum(0);
+
+        //数据入任务表
+        task.insert();
+        return task.getId();
+    }
+
     public Task edit(Integer id, Integer status) {
         Task task = this.getById(id);
         task.setStatus(status);

+ 21 - 0
PAS/src/main/java/cn/cslg/pas/service/asso/AssoOsTaskQrtzTaskService.java

@@ -0,0 +1,21 @@
+package cn.cslg.pas.service.asso;
+
+import cn.cslg.pas.domain.asso.AssoOsTaskQrtzTask;
+import cn.cslg.pas.mapper.asso.AssoOsTaskQrtzTaskMapper;
+import cn.cslg.pas.service.IAssoOsTaskQrtzTaskService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 任务和网站任务关联的Service层接口实现类
+ *
+ * @Author chenyu
+ * @Date 2023/6/12
+ */
+@Slf4j
+@Service
+public class AssoOsTaskQrtzTaskService extends ServiceImpl<AssoOsTaskQrtzTaskMapper, AssoOsTaskQrtzTask> implements IAssoOsTaskQrtzTaskService {
+
+
+}

+ 609 - 0
PAS/src/main/java/cn/cslg/pas/service/upLoadPatent/ExcuteTaskToPatentService.java

@@ -0,0 +1,609 @@
+package cn.cslg.pas.service.upLoadPatent;
+
+import cn.cslg.pas.common.model.PatentCell;
+import cn.cslg.pas.common.model.dto.*;
+import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
+import cn.cslg.pas.common.model.vo.UploadParamsVO;
+import cn.cslg.pas.common.model.vo.UploadSettingVO;
+import cn.cslg.pas.common.utils.*;
+import cn.cslg.pas.domain.*;
+import cn.cslg.pas.domain.asso.AssoOsTaskQrtzTask;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.OutInterfaceService;
+import cn.cslg.pas.service.TaskService;
+import cn.cslg.pas.service.UploadPatentBatchService;
+import cn.cslg.pas.service.asso.AssoOsTaskQrtzTaskService;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.spire.pdf.FileFormat;
+import com.spire.pdf.PdfDocument;
+import com.spire.pdf.PdfDocumentBase;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 根据不同类型任务生成专利入消费者队列的业务层
+ *
+ * @Author chenyu
+ * @Date 2023/6/12
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ExcuteTaskToPatentService implements Serializable {
+    private final FileUtils fileUtils;
+    private final ExcuteUploadSettingService excuteUploadSettingService;
+    private final ExcuteDataToVOService excuteDataToVOService;
+    private final PantentQueueService pantentQueueService;
+    private final AssoOsTaskQrtzTaskService assoOsTaskQrtzTaskService;
+    private final OutInterfaceService outInterfaceService;
+    private final TaskService taskService;
+
+    //TODO 工厂类
+    public void taskToPatentQueue(Task task) throws IOException {
+        //Excel导入任务
+        if (task.getType() == 1) {
+            excelTaskToPatentQueue(task);
+            //EPO网站导入任务
+        } else if (task.getType() == 3) {
+            epoTaskToPatentQueue(task);
+        }
+
+    }
+
+    /**
+     * Excel导入专利
+     *
+     * @param task Excel导入专利任务
+     */
+    public void excelTaskToPatentQueue(Task task) throws IOException {
+        //从任务中取出文件路径、总条数、成功条数、前台参数json
+        String filePath = task.getUrl();  //相对路径
+        filePath = fileUtils.getPath(filePath);  //绝对路径
+        Integer total = task.getTotal();
+
+        int lastIndex = task.getSuccessNum();
+        String json = task.getPramJson();
+        ProjectImportPatentVO projectImportPatentVO = JsonUtils.jsonToPojo(json, ProjectImportPatentVO.class);
+        //解析数据源类,通过数据来源id(如1:智慧芽)解析数据源配置文件,获得数据源配置文件对象jsonData
+        List<UploadSettingVO.Column> jsonData = excuteUploadSettingService.ExcuteUploadSetting(projectImportPatentVO.getSourceId());
+        //解析Excel文件获得工作簿
+        Sheet sheet = ReadExcelUtils.readExcel(filePath);
+        //遍历专利总数量,在循环中保存专利
+        for (int i = lastIndex; i < total; i++) {
+            PatentData patentData = ReadExcelUtils.readExcelOneRow(filePath, sheet, i + 1);
+            //调用装载数据类,专利数据转换为VO对象
+            UploadParamsVO uploadParamsVO = excuteDataToVOService.fileToPatentVO(patentData, jsonData);
+
+            //专利入消费者队列,并唤醒消费者执行专利入库
+            //patentToQueueAwakeConsumer(uploadParamsVO, projectImportPatentVO);
+            pantentQueueService.patentToQueue(uploadParamsVO, projectImportPatentVO);
+        }
+    }
+
+    /**
+     * EPO网站导入专利
+     *
+     * @param task EPO网站导入专利
+     */
+    public void epoTaskToPatentQueue(Task task) throws IOException {
+        Integer taskId = task.getId();
+        List<AssoOsTaskQrtzTask> assoOsTaskQrtzTasks = assoOsTaskQrtzTaskService.list(new LambdaQueryWrapper<AssoOsTaskQrtzTask>().eq(AssoOsTaskQrtzTask::getTaskId, taskId));
+        AssoOsTaskQrtzTask assoOsTaskQrtzTask = assoOsTaskQrtzTasks.get(0);
+
+        Integer successNum = task.getSuccessNum();
+
+        //从任务关联网站导入任务对象中取出下载字段、检索信息
+        String cellsStr = assoOsTaskQrtzTask.getConfigCells();
+        List<String> cells = Arrays.asList(cellsStr.split(","));
+        String conditions = assoOsTaskQrtzTask.getConditions();
+
+        //定义每次检索的专利数量(每次检索50件)
+        int size = 50;
+        //2.根据检索式conditions先检索一件专利著录信息【此操作主要是为了获得专利总数量count】
+//        SerachBiblioData serachBiblioData = getSerachBiblioData(conditions, 1, 1);
+//        if (serachBiblioData == null || serachBiblioData.getTotals() == 0) {
+//            //conditions没有检索到任何相关专利(杰哥处理)
+//            ThrowException.throwXiaoShiException("检索失败,根据检索条件未检索出任何相关专利信息");
+//            return;
+//        }
+
+        //获得专利总数量
+//        Integer count = serachBiblioData.getTotals();
+        Integer count = task.getTotal();
+
+        //计算进度值
+//        double percentage = count == 0 ? 0 : (count.equals(successNum) ? (successNum * 1D) : (successNum + 1D) / count * 100D);
+//        percentage = MathUtils.saveTwoDecimal(percentage);
+        //3.根据专利总数量count遍历检索专利
+        for (int i = 1; i <= count; i += size) {
+            //查看任务状态
+//            QrtzTaskDetail qrtzTaskDetail1 = qrTaskDetailService.getById(webQueryDTO.getTaskId());
+//            if (qrtzTaskDetail1.getTaskDetailState().equals(7)) {
+//                qrtzTaskDetail1.setTaskDetailState(5);
+//                qrtzTaskDetail1.setSuccessNum(successNum);
+//                qrtzTaskDetail1.setTaskProcess(percentage);
+//                qrtzTaskDetail1.updateById();
+//                WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+//                        .setId(webQueryDTO.getTaskId())
+//                        .setProjectId(task.getProjectId())
+//                        .setComplete(false)
+//                        .setIndex(successNum)
+//                        .setTaskDetailState(5)
+//                        .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "null");
+//                return null;
+//            } else if (qrtzTaskDetail1.getTaskDetailState().equals(8)) {
+//                qrtzTaskDetail1.setTaskDetailState(6);
+//                qrtzTaskDetail1.setSuccessNum(successNum);
+//                qrtzTaskDetail1.setTaskProcess(percentage);
+//                qrtzTaskDetail1.updateById();
+//                WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+//                        .setId(webQueryDTO.getTaskId())
+//                        .setProjectId(task.getProjectId())
+//                        .setComplete(false)
+//                        .setIndex(successNum)
+//                        .setTaskDetailState(6)
+//                        .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "null");
+//                return null;
+//            }
+            //3.1根据检索式conditions、专利开始数i、专利最后数i + size - 1检索专利著录信息
+            SerachBiblioData serachBiblioData = getSerachBiblioData(conditions, i, i + size - 1);
+            //获取检索结果中的所有专利著录信息
+            if (serachBiblioData == null || serachBiblioData.getTotals() == 0) {
+                continue;
+            }
+            List<PatentZhuLu> patents = serachBiblioData.getPatents();
+            //3.2遍历专利
+            for (PatentZhuLu patent : patents) {
+                PatentCell patentCell = new PatentCell();
+                patentCell.setProjectId(task.getProjectId());
+                PubNo pubNO = new PubNo();
+                //装载专利著录
+                if (cells.contains("1")) {
+                    setPatentZhuLu(patentCell, patent, pubNO);
+                }
+                //装载权要
+                if (cells.contains("2")) {
+                    setPatentClaim(patentCell, pubNO);
+                }
+                //装载说明书文本
+                if (cells.contains("3")) {
+                    setPatentInstructionText(patentCell, pubNO);
+                }
+
+                //以下代码是在准备一会要调用拿取各种附图的接口所需的参数(FullDocument->说明书pdf、Drawing->其他附图、FirstPageClipping->摘要附图)
+                String fullDocumentLink = "", fullDocumentType = "", drawingLink = "", drawingType = "", firstPageClippingLink = "", firstPageClippingType = "";
+                Integer fullDocumentPage = 0, drawingPage = 0, firstPageClippingPage = 0;
+                //根据当前专利号调用接口获取一会调用拿取各种附图的接口的参数
+                try {
+                    ImageInfo imageInfo = getImage(pubNO);
+                    for (Image image : imageInfo.getImages()) {
+                        //如果附件类型是说明书
+                        if (image.getImageType().equals("FullDocument")) {
+                            fullDocumentLink = image.getUrlLink();
+                            fullDocumentPage = image.getNumberOfPages();
+                            for (String formatOption : image.getFormatOptions()) {
+                                if (formatOption.contains("pdf")) {
+                                    fullDocumentType = formatOption;
+                                }
+                            }
+                        }
+                        //如果附件类型是其他附件
+                        if (image.getImageType().equals("Drawing")) {
+                            drawingLink = image.getUrlLink();
+                            drawingPage = image.getNumberOfPages();
+                            for (String formatOption : image.getFormatOptions()) {
+                                if (formatOption.contains("tiff")) {
+                                    drawingType = formatOption;
+                                }
+                            }
+                        }
+                        //如果附件类型是摘要附图
+                        if (image.getImageType().equals("FirstPageClipping")) {
+                            firstPageClippingLink = image.getUrlLink();
+                            firstPageClippingPage = image.getNumberOfPages();
+                            for (String formatOption : image.getFormatOptions()) {
+                                if (formatOption.contains("jpeg")) {
+                                    firstPageClippingType = formatOption;
+                                }
+                            }
+                        }
+                    }
+
+                    //装载说明书pdf
+                    if (cells.contains("4")) {
+                        setFuJian(fullDocumentLink, fullDocumentPage, fullDocumentType, patentCell, ".pdf");
+                    }
+                    //装载摘要附图
+                    if (cells.contains("6")) {
+                        setFuJian(firstPageClippingLink, firstPageClippingPage, firstPageClippingType, patentCell, ".jpeg");
+                    }
+                    //装载其他附图
+                    if (cells.contains("7")) {
+                        setFuJian(drawingLink, drawingPage, drawingType, patentCell, ".tiff");
+                    }
+
+                    //将专利发送到分析系统(保存专利入库)
+                    if (patentCell.getPatentNo() != null) {
+                        String res = outInterfaceService.importPatents(patentCell);
+                        JSONObject jsonObject = JSONObject.parseObject(res);
+                        if (jsonObject.get("code").toString().equals("500")) {
+                            //舍弃这个专利,继续下一个专利
+                            continue;
+                        }
+                    }
+
+//                    QrtzTaskDetail qrtzTaskDetail11 = qrTaskDetailService.getById(qrtzTaskDetail.getId());
+//                    percentage = count == 0 ? 0 : (count.equals(successNum) ? (successNum * 1D) : (successNum + 1D) / count * 100D);
+//                    percentage = MathUtils.saveTwoDecimal(percentage);
+//                    WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+//                            .setId(webQueryDTO.getTaskId())
+//                            .setProjectId(task.getProjectId())
+//                            .setComplete(false)
+//                            .setIndex(successNum)
+//                            .setPercentage(percentage)
+//                            .setTaskDetailState(qrtzTaskDetail11.getTaskDetailState())
+//                            .setFileName("")
+//                            .setUrl("")
+//                            .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "null");
+                } catch (XiaoShiException e) {
+                    //虽然拿不到所有附图,但已经拿到了专利著录,能拿到啥是啥
+                    log.info(e.getMessage());
+                } catch (Exception e) {
+//                    qrtzTaskDetail.setTaskDetailState(3);
+//                    qrtzTaskDetail.setSuccessNum(successNum);
+//                    qrtzTaskDetail.setDefaultNum(qrtzTaskDetail.getAllNum() - successNum);
+//                    qrtzTaskDetail.setFailure("拉取节点失败");
+//                    qrtzTaskDetail.setEndTime(new Date());
+//                    qrtzTaskDetail.updateById();
+//                    if (qrtzTask.getTaskType() == 1) {
+//                        qrtzTask.setTaskState(4);
+//                    } else {
+//                        qrtzTask.setTaskState(3);
+//                    }
+//                    qrtzTask.updateById();
+//                    WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+//                            .setId(webQueryDTO.getTaskId())
+//                            .setProjectId(task.getProjectId())
+//                            .setComplete(true)
+//                            .setIndex(successNum)
+//                            .setPercentage(100D)
+//                            .setTaskDetailState(qrtzTaskDetail.getTaskDetailState())
+//                            .setFileName("")
+//                            .setUrl("")
+//                            .setTotal(successNum), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "");
+                }
+
+            }
+        }
+//        WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+//                .setId(webQueryDTO.getTaskId())
+//                .setProjectId(task.getProjectId())
+//                .setComplete(true)
+//                .setIndex(count)
+//                .setPercentage(100D)
+//                .setTaskDetailState(qrtzTaskDetail.getTaskDetailState())
+//                .setFileName("")
+//                .setUrl("")
+//                .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "");
+//        //任务执行情况状态设为成功,任务条件状态设为已完成(若是任务条件是定时任务则设为等待下一次执行)
+//        qrtzTaskDetail.setTaskDetailState(2);
+//        qrtzTaskDetail.setSuccessNum(successNum);
+//        qrtzTaskDetail.setDefaultNum(qrtzTaskDetail.getAllNum() - successNum);
+//        qrtzTaskDetail.setTaskProcess(100);
+//        qrtzTaskDetail.setEndTime(new Date());
+//        qrtzTaskDetail.updateById();
+//        if (qrtzTask.getTaskType() == 1) {
+//            qrtzTask.setTaskState(4);
+//        } else {
+//            qrtzTask.setTaskState(2);
+//        }
+//        qrtzTask.updateById();
+//        return patentCells;
+    }
+
+    //调用接口获取一批专利著录信息
+    public SerachBiblioData getSerachBiblioData(String conditions, Integer start, Integer size) throws IOException {
+        GetSearchBiblioParamsDTO getSearchBiblioParamsDTO = new GetSearchBiblioParamsDTO()
+                .setQuery(conditions)
+                .setStart(start)
+                .setEnd(size);
+        String res = outInterfaceService.getSearchBiblio(getSearchBiblioParamsDTO);
+        if (res == null || res.equals("")) {
+            return null;
+        }
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        if (!jsonObject.get("status").toString().equals("200")) {
+            //若发生类似400、500等异常(杰哥处理)
+            return null;
+        }
+        //返回检索结果data
+        return JSONObject.parseObject(jsonObject.get("data").toString(), SerachBiblioData.class);
+    }
+
+    /**
+     * 装载著录方法
+     *
+     * @param patentCell 实体类对象
+     * @param patent     专利对象
+     * @param pubNo      公开号对象
+     */
+    private void setPatentZhuLu(PatentCell patentCell, PatentZhuLu patent, PubNo pubNo) {
+        //装载申请号
+        for (AppNo appNo : patent.getAppNos()) {
+            if (appNo.getType().equals("docdb")) {
+                patentCell.setApplicationNo(appNo.getCountry() + appNo.getNumber() + appNo.getKind());
+            }
+        }
+        //装载申请日
+        patentCell.setApplicationDate(patent.getAppDate());
+        //装载国家/省市
+        patentCell.setCountry(patent.getAppCountry());
+        //装载公开号
+        for (PubNo n : patent.getPubNos()) {
+            if (n.getType().equals("docdb")) {
+                BeanUtils.copyProperties(n, pubNo);
+                patentCell.setPublicNo(n.getCountry() + n.getNumber() + n.getKind());
+            }
+        }
+        //装载专利号
+        patentCell.setPatentNo(patentCell.getPublicNo());
+        //装载公开日
+        patentCell.setPubilcDate(patent.getPubDate());
+        //装载授权公告号(未找到)
+        //装载授权公告日(未找到)
+        //装载主分类号
+        List<String> ipCs = patent.getIpCs();
+        List<String> cpCs = patent.getCpCs();
+        ipCs.addAll(cpCs);
+        if (ipCs != null && ipCs.size() > 0) {
+            patentCell.setMainIpc(ipCs.get(0));
+        }
+        //装载分类号
+        if (ipCs != null && ipCs.size() > 0) {
+            patentCell.setIpc(ipCs);
+        }
+        //装载申请人
+        ArrayList<String> applicationPersons = new ArrayList<>();
+        for (Application application : patent.getApplications()) {
+            if (application.getOriginalName().contains("(标:)")) {
+                application.setOriginalName(application.getOriginalName().substring(0, application.getOriginalName().indexOf("(标:)")));
+            }
+            applicationPersons.add(application.getOriginalName());
+        }
+        patentCell.setApplicationPersons(applicationPersons);
+        //装载申请人地址(未找到)
+        //装载发明人
+        ArrayList<String> inventors = new ArrayList<>();
+        for (Inventor inventor : patent.getInventors()) {
+            inventors.add(inventor.getOriginalName());
+        }
+        patentCell.setInventors(inventors);
+        //装载当前权利人(未找到)
+        //装载代理人(未找到)
+        //装载代理机构(未找到)
+        //装载范畴分类(未找到)
+        //装载当前状态(未找到)
+        //装载同族号
+        patentCell.setFamilyId(patent.getFamilyId());
+        //装载著录标题
+        String olTitle = patent.getOlTitle();
+        String enTitle = patent.getEnTitle();
+        if (olTitle == null) {
+            patentCell.setTitle(enTitle);
+        } else {
+            patentCell.setTitle(olTitle);
+        }
+        //装载摘要
+        String olAbstract = patent.getOlAbstract();
+        String enAbstract = patent.getEnAbstract();
+        if (olAbstract == null) {
+            patentCell.setAbstrText(enAbstract);
+        } else {
+            patentCell.setAbstrText(olAbstract);
+        }
+        //装载优先权号、优先权国家、优先权日
+        ArrayList<Priority> priorities = new ArrayList<>();
+        List<Priorityy> priorties = patent.getPriorties();
+        for (Priorityy priorty : priorties) {
+            for (PriorityNumber number : priorty.getNumbers()) {
+                if (number.getType().equals("epodoc")) {
+                    Priority priority = new Priority()
+                            .setPriorityNo(number.getNumber().substring(2))
+                            .setPriorityCountry(number.getNumber().substring(0, 2))
+                            .setPriorityDate(priorty.getDate());
+                    priorities.add(priority);
+                }
+            }
+        }
+        patentCell.setPriorities(priorities);
+    }
+
+    /**
+     * 装载权要方法
+     *
+     * @param patentCell 实体类对象
+     * @param pubNo      公开号对象
+     */
+    private void setPatentClaim(PatentCell patentCell, PubNo pubNo) throws IOException {
+        GetClaimsInfoParamsDTO getClaimsInfoParamsDTO = new GetClaimsInfoParamsDTO()
+                .setCc(pubNo.getCountry())
+                .setNumber(pubNo.getNumber())
+                .setKind(pubNo.getKind());
+        String res = outInterfaceService.getClaimsInfo(getClaimsInfoParamsDTO);
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        if (!jsonObject.get("status").toString().equals("200")) {
+            //若发生类似400、500等异常(杰哥处理)
+            //ThrowException.throwXiaoShiException("权要接口无法检索该国家专利");
+            log.info("权要接口无法检索该国家专利");
+            return;
+        }
+        //拿到检索结果(未格式化的含有页面等标签的权要)并格式化权要
+        //String unformatRight = JSONObject.parseObject(jsonObject.get("data").toString(), String.class);
+        ArrayList<String> unformatRights = JSONObject.parseObject(jsonObject.get("data").toString(), ArrayList.class);
+        //String[] rightArr = unformatRight.split("\n");
+        //ArrayList<String> rights = new ArrayList<>(Arrays.asList(rightArr));
+        patentCell.setRights(unformatRights);
+    }
+
+    /**
+     * 装载说明书方法
+     *
+     * @param patentCell 实体类对象
+     * @param pubNo      公开号对象
+     */
+    private void setPatentInstructionText(PatentCell patentCell, PubNo pubNo) throws IOException {
+        GetDescriptionInfoParamsDTO getDescriptionInfoParamsDTO = new GetDescriptionInfoParamsDTO()
+                .setCc(pubNo.getCountry())
+                .setNumber(pubNo.getNumber())
+                .setKind(pubNo.getKind());
+        String res = outInterfaceService.getDescriptionInfo(getDescriptionInfoParamsDTO);
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        if (!jsonObject.get("status").toString().equals("200")) {
+            //若发生类似400、500等异常(杰哥处理)
+            //ThrowException.throwXiaoShiException("说明书接口无法检索该国家专利");
+            log.info("说明书接口无法检索该国家专利");
+            return;
+        }
+        //拿到检索结果(未格式化的含有页面等标签的说明书)
+        //String unformatInstructionText = JSONObject.parseObject(jsonObject.get("data").toString(), String.class);
+        List<String> unformatInstructionText = JSONObject.parseObject(jsonObject.get("data").toString(), List.class);
+        StringBuilder builder = new StringBuilder();
+        for (String n : unformatInstructionText) {
+            builder.append(n);
+        }
+//        String regex = "<p>(.+?)</p>";
+//        Matcher matcher = Pattern.compile(regex).matcher(unformatInstructionText);
+//        if (matcher.find()) {
+//            patentCell.setPatentInstructionText(matcher.group());
+//        }
+        patentCell.setPatentInstructionText(builder + "");
+    }
+
+    /**
+     * 获取Image信息方法(从信息中获取三种附图的检索参数)
+     *
+     * @param pubNo 公开号对象
+     */
+    private ImageInfo getImage(PubNo pubNo) throws IOException {
+        String res = outInterfaceService.getImagesInfo(pubNo);
+        JSONObject jsonObject = JSONObject.parseObject(res);
+        if (!jsonObject.get("status").toString().equals("200")) {
+            //若发生类似400、500等异常(杰哥处理)
+            ThrowException.throwXiaoShiException("Image信息接口无法检索该国家专利");
+        }
+        //拿到检索结果(未格式化的含有页面等标签的说明书)
+        String unFormatData = jsonObject.get("data").toString();
+        String data = unFormatData.substring(unFormatData.indexOf("[") + 1, unFormatData.lastIndexOf("]"));
+        ImageInfo imageInfo = JSONObject.parseObject(data, ImageInfo.class);
+        return imageInfo;
+    }
+
+    /**
+     * 装载说明书附件pdf方法
+     *
+     * @param link       附件链接
+     * @param page       附件页数
+     * @param type       附件类型
+     * @param patentCell 实体类对象
+     */
+    private void setFuJian(String link, Integer page, String type, PatentCell patentCell, String FuJianSuffix) throws Exception {
+        //合并说明书pdf文档时所需的读取流数组
+        InputStream[] streams = new InputStream[page];
+        //其他附图url数组
+        ArrayList<String> otherUrls = new ArrayList<>();
+        //遍历附件页数
+        for (int i = 1; i <= page; i++) {
+            GetFuTuParamsDTO getFuTuParamsDTO = new GetFuTuParamsDTO()
+                    .setLink(link)
+                    .setPage(i)
+                    .setType(type);
+            byte[] buffer = outInterfaceService.getPatentFile(getFuTuParamsDTO);
+            InputStream inputStream = new ByteArrayInputStream(buffer);
+            streams[i - 1] = inputStream;
+            //如果不是说明书pdf
+            if (!FuJianSuffix.equals(".pdf")) {
+                File file = File.createTempFile("new_url", FuJianSuffix);
+                FileOutputStream out = new FileOutputStream(file);
+                out.write(buffer);
+                out.close();
+                streams[i - 1] = new FileInputStream(file);
+                DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(16, null);
+                FileItem item = diskFileItemFactory.createItem(file.getName(), "text/plain", true, file.getName());
+                int bytesRead = 0;
+                buffer = new byte[8192];
+                try {
+                    FileInputStream fis = new FileInputStream(file);
+                    OutputStream os = item.getOutputStream();
+                    int len = 8192;
+                    while ((bytesRead = fis.read(buffer, 0, len)) != -1) {
+                        os.write(buffer, 0, bytesRead);
+                    }
+                    os.close();
+                    fis.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                MultipartFile multipartFile = new CommonsMultipartFile(item);
+                UploadFileDTO fileDTO = fileUtils.uploadFile(multipartFile);
+                //如果是摘要附图
+                if (FuJianSuffix.equals(".jpeg")) {
+                    patentCell.setPicUrl(fileDTO.getPath());
+                }
+                //如果是其他附图
+                if (FuJianSuffix.equals(".tiff")) {
+                    otherUrls.add(fileDTO.getPath());
+                }
+            }
+        }
+
+        //如果是说明书pdf
+        if (FuJianSuffix.equals(".pdf")) {
+            //合并说明书多个pdf文件
+            PdfDocumentBase doc = PdfDocument.mergeFiles(streams);
+            //保存结果文件
+            doc.save("merge.pdf", FileFormat.PDF);
+            doc.close();
+
+            //手动将合并后的pdf文件转成MultipartFile,上传文件并获取path装载到patentCell
+            File file = new File("merge.pdf");
+            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(16, null);
+            FileItem item = diskFileItemFactory.createItem(file.getName(), "text/plain", true, file.getName());
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            try {
+                FileInputStream fis = new FileInputStream(file);
+                OutputStream os = item.getOutputStream();
+                int len = 8192;
+                while ((bytesRead = fis.read(buffer, 0, len)) != -1) {
+                    os.write(buffer, 0, bytesRead);
+                }
+                os.close();
+                fis.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            MultipartFile multipartFile = new CommonsMultipartFile(item);
+            UploadFileDTO fileDTO = fileUtils.uploadFile(multipartFile);
+            patentCell.setPdf(fileDTO);
+        } else if (FuJianSuffix.equals(".tiff")) {
+            patentCell.setOtherUrls(otherUrls);
+        }
+
+
+    }
+
+}

+ 40 - 62
PAS/src/main/java/cn/cslg/pas/service/upLoadPatent/PantentQueueService.java

@@ -2,18 +2,12 @@ package cn.cslg.pas.service.upLoadPatent;
 
 import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
 import cn.cslg.pas.common.model.vo.UploadParamsVO;
-import cn.cslg.pas.common.model.vo.UploadSettingVO;
 import cn.cslg.pas.common.utils.DateUtils;
-import cn.cslg.pas.common.utils.FileUtils;
-import cn.cslg.pas.common.utils.JsonUtils;
-import cn.cslg.pas.common.utils.ReadExcelUtils;
-import cn.cslg.pas.domain.PatentData;
 import cn.cslg.pas.domain.QueueData;
 import cn.cslg.pas.domain.Task;
 import cn.cslg.pas.service.TaskService;
 import cn.cslg.pas.service.UploadPatentBatchService;
 import lombok.RequiredArgsConstructor;
-import org.apache.poi.ss.usermodel.Sheet;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
@@ -29,11 +23,9 @@ import java.util.concurrent.locks.ReentrantLock;
 @Service
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class PantentQueueService {
-    private final ExcuteDataToVOService excuteDataToVOService;
-    private final ExcuteUploadSettingService excuteUploadSettingService;
     private final UploadPatentToDBService uploadPatentToDBService;
     private final UploadPatentBatchService uploadPatentBatchService;
-    private final FileUtils fileUtils;
+    private final ExcuteTaskToPatentService excuteTaskToPatentService;
     private final MessageService messageService;
     private final TaskService taskService;
     private final Queue<QueueData> patentImageQueue = new LinkedList<>();
@@ -76,60 +68,10 @@ public class PantentQueueService {
                 taskService.updateById(task);
                 taskQueueList.remove(0);
 
-                //从任务中取出文件路径、总条数、成功条数、前台参数json
-                String filePath = task.getUrl();  //相对路径
-                filePath = fileUtils.getPath(filePath);  //绝对路径
-                Integer total = task.getTotal();
-                patentIdMap.put(0, total);
-
-                int lastIndex = task.getSuccessNum();
-                String json = task.getPramJson();
-                ProjectImportPatentVO projectImportPatentVO = JsonUtils.jsonToPojo(json, ProjectImportPatentVO.class);
-                //解析数据源类,通过数据来源id(如1:智慧芽)解析数据源配置文件,获得数据源配置文件对象jsonData
-                List<UploadSettingVO.Column> jsonData = excuteUploadSettingService.ExcuteUploadSetting(projectImportPatentVO.getSourceId());
-                //解析Excel文件获得工作簿
-                Sheet sheet = ReadExcelUtils.readExcel(filePath);
-                //遍历专利总数量,在循环中保存专利
-                for (int i = lastIndex; i < total; i++) {
-                    PatentData patentData = ReadExcelUtils.readExcelOneRow(filePath, sheet, i + 1);
-                    //调用装载数据类,专利数据转换为VO对象
-                    UploadParamsVO uploadParamsVO = excuteDataToVOService.fileToPatentVO(patentData, jsonData);
-                    //保存专利基础数据(专利表"os_patent")
-                    uploadPatentBatchService.getOneOrInsertOne(uploadParamsVO);
-
-                    //专利分别加入5个消费者队列
-                    QueueData queueData = new QueueData()
-                            .setUploadParamsVO(uploadParamsVO)
-                            .setProjectImportPatentVO(projectImportPatentVO);
-                    patentImageQueue.add(queueData);
-                    patentZhuluQueue.add(queueData);
-                    patentRightQueue.add(queueData);
-                    patentInstructionTextQueue.add(queueData);
-                    patentAssoQueue.add(queueData);
-
-                    //通知消费者线程(5个消费者:摘要附图、著录项目、权利要求文本、说明书文本、与专利关联数据)
-                    //消费者1摘要附图
-                    patentImageLock.lock();
-                    patentImageCondition.signalAll();
-                    patentImageLock.unlock();
-                    //消费者2著录项目
-                    patentZhuluLock.lock();
-                    patentZhuluCondition.signalAll();
-                    patentZhuluLock.unlock();
-                    //消费者3权利要求文本
-                    patentRightLock.lock();
-                    patentRightCondition.signalAll();
-                    patentRightLock.unlock();
-                    //消费者4说明书文本
-                    patentInstructionTextLock.lock();
-                    patentInstructionTextCondition.signalAll();
-                    patentInstructionTextLock.unlock();
-                    //消费者5与专利关联数据
-                    patentAssoLock.lock();
-                    patentAssoCondition.signalAll();
-                    patentAssoLock.unlock();
+                patentIdMap.put(0, task.getTotal());
 
-                }
+                //TODO 调用工厂方法,将任务传入,解析任务类型匹配对应的生产专利方法
+                excuteTaskToPatentService.taskToPatentQueue(task);
 
             }
 
@@ -328,6 +270,42 @@ public class PantentQueueService {
         }
     }
 
+    public void patentToQueue(UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
+        //保存专利基础数据(专利表"os_patent")
+        uploadPatentBatchService.getOneOrInsertOne(uploadParamsVO);
+
+        //专利分别加入5个消费者队列
+        QueueData queueData = new QueueData()
+                .setUploadParamsVO(uploadParamsVO)
+                .setProjectImportPatentVO(projectImportPatentVO);
+        patentImageQueue.add(queueData);
+        patentZhuluQueue.add(queueData);
+        patentRightQueue.add(queueData);
+        patentInstructionTextQueue.add(queueData);
+        patentAssoQueue.add(queueData);
+
+        //通知消费者线程(5个消费者:摘要附图、著录项目、权利要求文本、说明书文本、与专利关联数据)
+        //消费者1摘要附图
+        patentImageLock.lock();
+        patentImageCondition.signalAll();
+        patentImageLock.unlock();
+        //消费者2著录项目
+        patentZhuluLock.lock();
+        patentZhuluCondition.signalAll();
+        patentZhuluLock.unlock();
+        //消费者3权利要求文本
+        patentRightLock.lock();
+        patentRightCondition.signalAll();
+        patentRightLock.unlock();
+        //消费者4说明书文本
+        patentInstructionTextLock.lock();
+        patentInstructionTextCondition.signalAll();
+        patentInstructionTextLock.unlock();
+        //消费者5与专利关联数据
+        patentAssoLock.lock();
+        patentAssoCondition.signalAll();
+        patentAssoLock.unlock();
+    }
 
     public void queueAddTask(List<Integer> taskQueueList) {
         this.taskQueueList.addAll(taskQueueList);

+ 50 - 2
PAS/src/main/java/cn/cslg/pas/service/upLoadPatent/UploadTaskService.java

@@ -1,12 +1,17 @@
 package cn.cslg.pas.service.upLoadPatent;
 
+import cn.cslg.pas.common.model.dto.QrtzTaskAddNewDTO;
 import cn.cslg.pas.common.model.dto.UploadFileDTO;
 import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
 import cn.cslg.pas.common.utils.FileUtils;
 import cn.cslg.pas.common.utils.ReadExcelUtils;
 import cn.cslg.pas.common.utils.ThrowException;
+import cn.cslg.pas.domain.SerachBiblioData;
+import cn.cslg.pas.domain.asso.AssoOsTaskQrtzTask;
 import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.service.IAssoOsTaskQrtzTaskService;
 import cn.cslg.pas.service.TaskService;
+import cn.cslg.pas.service.asso.AssoOsTaskQrtzTaskService;
 import cn.hutool.core.collection.IterUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import lombok.RequiredArgsConstructor;
@@ -33,11 +38,16 @@ public class UploadTaskService {
     private final FileUtils fileUtils;
     private final TaskService taskService;
     private final PantentQueueService pantentQueueService;
+    private final AssoOsTaskQrtzTaskService assoOsTaskQrtzTaskService;
+    private final ExcuteTaskToPatentService excuteTaskToPatentService;
 
     /**
      * 新增Excel导入任务
+     *
+     * @param file Excel文件
+     * @param json 前台参数(与专题库关联信息、自定义字段、文件夹等)
      */
-    public void addTask(MultipartFile file, String json) throws IOException {
+    public void addExcelTask(MultipartFile file, String json) throws IOException {
         //将包含多件专利的Excel文件上传至本地,并返回文件对象fileDTO
         UploadFileDTO fileDTO = fileUtils.uploadFile(file);
         //获得文件路径(绝对路径)
@@ -45,8 +55,46 @@ public class UploadTaskService {
         //检查文件合法性并获取专利总数量
         Integer total = ReadExcelUtils.textExcel(filePath);
         //新增任务(专利导入导出任务表)
-        //Integer taskId = taskService.add(fileDTO, projectImportPatentVO.getProjectId(), null, total, 1, 0, file.getOriginalFilename());
         Integer taskId = taskService.addTask2(fileDTO, total, json);
+        //任务存入生产者任务队列并唤醒生产者线程
+        pantentQueueService.queueAddTask(Arrays.asList(taskId));
+        pantentQueueService.awakeTasktch();
+    }
+
+    /**
+     * 新增Epo网站导入任务
+     *
+     * @param qrtzTaskAddNewDTO 前台参数(检索信息conditions、专题库id、下载字段configCells等)
+     */
+    public void addEpoTask(QrtzTaskAddNewDTO qrtzTaskAddNewDTO) throws IOException {
+        //检查任务合法性(检查当前检索式能否检索出专利)
+        //先根据检索式conditions检索一件专利著录信息
+        SerachBiblioData serachBiblioData = excuteTaskToPatentService.getSerachBiblioData(qrtzTaskAddNewDTO.getConditions(), 1, 1);
+        if (serachBiblioData == null || serachBiblioData.getTotals() == 0) {
+            ThrowException.throwXiaoShiException("检索失败,根据检索条件未检索出任何相关专利信息");
+            return;
+        }
+
+        //新增任务
+        Integer taskId = taskService.addTask3(qrtzTaskAddNewDTO, serachBiblioData.getTotals());
+        //新增任务与网站导入任务关联表数据
+        AssoOsTaskQrtzTask assoOsTaskQrtzTask = new AssoOsTaskQrtzTask();
+        assoOsTaskQrtzTask
+                .setTaskId(taskId)
+                .setTaskType(0)
+                .setConditions(qrtzTaskAddNewDTO.getConditions())
+                .setCrons(qrtzTaskAddNewDTO.getCrons())
+                .setConfigId(qrtzTaskAddNewDTO.getConfigId())
+                .setTaskName(qrtzTaskAddNewDTO.getTaskName());
+        List<String> cells = qrtzTaskAddNewDTO.getConfigCells();
+        if (cells == null) {
+            assoOsTaskQrtzTask.setConfigCells("");
+        } else {
+            assoOsTaskQrtzTask.setConfigCells(String.join(",", cells));
+        }
+        assoOsTaskQrtzTaskService.save(assoOsTaskQrtzTask);
+
+        //任务存入生产者任务队列并唤醒生产者线程
         pantentQueueService.queueAddTask(Arrays.asList(taskId));
         pantentQueueService.awakeTasktch();
     }

+ 4 - 1
PAS/src/main/resources/application-dev.yml

@@ -56,4 +56,7 @@ spring:
     jdbc:
       initialize-schema: always
 authorUrl: http://localhost:8871
-PCSUrl: http://localhost:8871
+PCSUrl: http://localhost:8871
+#OPSUrl: http://192.168.1.24:5001
+OPSUrl: http://139.224.24.90:5001
+PASUrl: http://localhost:8877