소스 검색

Merge branch 'release' of luocaiyang/Wispro-CodeWarehouse-BackEnd into master

沈永艺 3 년 전
부모
커밋
aae510c233
63개의 변경된 파일2036개의 추가작업 그리고 180개의 파일을 삭제
  1. 10 0
      PAS/pom.xml
  2. 4 0
      PAS/src/main/java/cn/cslg/pas/Application.java
  3. 1 1
      PAS/src/main/java/cn/cslg/pas/common/model/params/PatentAffairParams.java
  4. 6 4
      PAS/src/main/java/cn/cslg/pas/common/model/params/PatentApplicantAddressParams.java
  5. 3 1
      PAS/src/main/java/cn/cslg/pas/common/model/params/PatentInventorAddressParams.java
  6. 3 1
      PAS/src/main/java/cn/cslg/pas/common/model/params/PatentInventorParams.java
  7. 30 0
      PAS/src/main/java/cn/cslg/pas/common/model/vo/KeyValueVO.java
  8. 1 0
      PAS/src/main/java/cn/cslg/pas/common/model/vo/ProjectImportPatentVO.java
  9. 106 0
      PAS/src/main/java/cn/cslg/pas/common/model/vo/UploadParamsVO.java
  10. 66 0
      PAS/src/main/java/cn/cslg/pas/common/model/vo/UploadSettingVO.java
  11. 29 1
      PAS/src/main/java/cn/cslg/pas/common/utils/DateUtils.java
  12. 15 9
      PAS/src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java
  13. 46 3
      PAS/src/main/java/cn/cslg/pas/common/utils/FileUtils.java
  14. 210 0
      PAS/src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java
  15. 46 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/DataProcessHandler.java
  16. 5 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/IProcessData.java
  17. 21 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/IncoPatInventorAddressHandler.java
  18. 58 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/IncoPatPatentAffairHandler.java
  19. 16 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/IncoPatUCMainHandler.java
  20. 15 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/IntegerHandler.java
  21. 39 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatSnapPatentAffairHandler.java
  22. 24 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatentTypeHandler.java
  23. 22 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatenticsAgencyAndAgentHandler.java
  24. 59 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatenticsPatentAffairHandler.java
  25. 17 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatenticsStringHandler.java
  26. 18 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/SplitBySerialNumberAndRemoveLineFeedHandler.java
  27. 27 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/SplitOriginalAndTranslationHandler.java
  28. 21 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/StringHandler.java
  29. 21 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/StringSpecialHandler.java
  30. 17 0
      PAS/src/main/java/cn/cslg/pas/common/utils/handler/TimeHandler.java
  31. 10 2
      PAS/src/main/java/cn/cslg/pas/controller/CommonController.java
  32. 18 10
      PAS/src/main/java/cn/cslg/pas/controller/ProjectImportController.java
  33. 6 0
      PAS/src/main/java/cn/cslg/pas/domain/Area.java
  34. 3 0
      PAS/src/main/java/cn/cslg/pas/domain/Client.java
  35. 6 1
      PAS/src/main/java/cn/cslg/pas/domain/Department.java
  36. 62 0
      PAS/src/main/java/cn/cslg/pas/domain/ImportErrorLog.java
  37. 7 0
      PAS/src/main/java/cn/cslg/pas/domain/Patent.java
  38. 16 1
      PAS/src/main/java/cn/cslg/pas/domain/PatentAffair.java
  39. 3 0
      PAS/src/main/java/cn/cslg/pas/domain/PatentApplicantLink.java
  40. 6 0
      PAS/src/main/java/cn/cslg/pas/domain/PatentClassNumberLink.java
  41. 3 0
      PAS/src/main/java/cn/cslg/pas/domain/PatentImage.java
  42. 2 2
      PAS/src/main/java/cn/cslg/pas/domain/PatentInstructionText.java
  43. 6 1
      PAS/src/main/java/cn/cslg/pas/domain/PatentInventor.java
  44. 6 0
      PAS/src/main/java/cn/cslg/pas/domain/ProjectField.java
  45. 55 0
      PAS/src/main/java/cn/cslg/pas/domain/SystemDictAssociate.java
  46. 13 0
      PAS/src/main/java/cn/cslg/pas/mapper/ImportErrorLogMapper.java
  47. 7 0
      PAS/src/main/java/cn/cslg/pas/mapper/SystemDictAssociateMapper.java
  48. 22 0
      PAS/src/main/java/cn/cslg/pas/service/ImportErrorLogService.java
  49. 31 14
      PAS/src/main/java/cn/cslg/pas/service/PatentAffairService.java
  50. 86 45
      PAS/src/main/java/cn/cslg/pas/service/PatentApplicantService.java
  51. 4 4
      PAS/src/main/java/cn/cslg/pas/service/PatentFieldService.java
  52. 4 4
      PAS/src/main/java/cn/cslg/pas/service/PatentImageService.java
  53. 33 10
      PAS/src/main/java/cn/cslg/pas/service/PatentInventorService.java
  54. 4 0
      PAS/src/main/java/cn/cslg/pas/service/PatentRightService.java
  55. 58 10
      PAS/src/main/java/cn/cslg/pas/service/PatentService.java
  56. 9 0
      PAS/src/main/java/cn/cslg/pas/service/PatentSimpleFamilyService.java
  57. 17 6
      PAS/src/main/java/cn/cslg/pas/service/ProjectFieldService.java
  58. 91 46
      PAS/src/main/java/cn/cslg/pas/service/ProjectService.java
  59. 62 0
      PAS/src/main/java/cn/cslg/pas/service/SystemDictAssociateService.java
  60. 2 0
      PAS/src/main/java/cn/cslg/pas/service/SystemDictService.java
  61. 424 0
      PAS/src/main/java/cn/cslg/pas/service/UploadPatentBatchService.java
  62. 3 3
      PAS/src/main/resources/application-dev.yml
  63. 1 1
      PAS/src/main/resources/application.yml

+ 10 - 0
PAS/pom.xml

@@ -26,6 +26,7 @@
         <poi.version>4.1.2</poi.version>
         <poi-tl.version>1.10.3</poi-tl.version>
         <druid.version>1.1.10</druid.version>
+        <fastjson.version>2.0.0</fastjson.version>
         <sa-token.version>1.29.0</sa-token.version>
         <springdoc.version>1.6.6</springdoc.version>
     </properties>
@@ -61,6 +62,11 @@
             <version>${druid.version}</version>
         </dependency>
         <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-compress</artifactId>
             <version>1.21</version>
@@ -125,6 +131,10 @@
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

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

@@ -4,6 +4,9 @@ import cn.hutool.cron.CronUtil;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 @SpringBootApplication
 public class Application {
 
@@ -11,6 +14,7 @@ public class Application {
         SpringApplication.run(Application.class, args);
         CronUtil.setMatchSecond(true);
         CronUtil.start();
+        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "后台程序已启动,请运行前台");
     }
 
 }

+ 1 - 1
PAS/src/main/java/cn/cslg/pas/common/model/params/PatentAffairParams.java

@@ -7,7 +7,7 @@ import java.util.List;
 @Data
 public class PatentAffairParams {
     private Integer dateTime;
-    private List<String> statusList;
+    private String statusList;
     private Integer simpleStatus;
     private String content;
     private Integer patentId;

+ 6 - 4
PAS/src/main/java/cn/cslg/pas/common/model/params/PatentApplicantAddressParams.java

@@ -2,12 +2,14 @@ package cn.cslg.pas.common.model.params;
 
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class PatentApplicantAddressParams {
-    private String currentCountry;
-    private String originalCountry;
-    private String currentAddress;
+    private List<String> currentCountry;
+    private List<String> originalCountry;
+    private List<String> currentAddress;
     private String firstCurrentAddress;
-    private String originalAddress;
+    private List<String> originalAddress;
     private Integer patentId;
 }

+ 3 - 1
PAS/src/main/java/cn/cslg/pas/common/model/params/PatentInventorAddressParams.java

@@ -2,9 +2,11 @@ package cn.cslg.pas.common.model.params;
 
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class PatentInventorAddressParams {
-    private String address;
+    private List<String> address;
     private String firstAddress;
     private Integer patentId;
 }

+ 3 - 1
PAS/src/main/java/cn/cslg/pas/common/model/params/PatentInventorParams.java

@@ -6,7 +6,9 @@ import java.util.List;
 
 @Data
 public class PatentInventorParams {
-    private List<String> nameList;
     private Integer patentId;
+    private List<String> addressList;
+    private List<String> nameList;
     private String firstName;
+    private String firstAddress;
 }

+ 30 - 0
PAS/src/main/java/cn/cslg/pas/common/model/vo/KeyValueVO.java

@@ -0,0 +1,30 @@
+package cn.cslg.pas.common.model.vo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @date 2022-7-21
+ * @description 存储键值对类型数据的实体类
+ */
+@Data
+public class KeyValueVO {
+
+    private List<InpadocData> inpadocData;
+
+    @Data
+    @Accessors(chain = true)
+    public static class InpadocData{
+        /**
+         * 名称
+         */
+        private String name;
+
+        /**
+         * 值
+         */
+        private String content;
+    }
+}

+ 1 - 0
PAS/src/main/java/cn/cslg/pas/common/model/vo/ProjectImportPatentVO.java

@@ -9,6 +9,7 @@ public class ProjectImportPatentVO {
     private Integer projectId;
     private List<Field> fieldList;
     private List<Integer> folderIds;
+    private String sourceId;
 
     @Data
     public static class Field {

+ 106 - 0
PAS/src/main/java/cn/cslg/pas/common/model/vo/UploadParamsVO.java

@@ -0,0 +1,106 @@
+package cn.cslg.pas.common.model.vo;
+
+import cn.cslg.pas.domain.*;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author 沈永艺
+ * @date 2022/7/1
+ * @description 用于批量导入数据的工具类
+ */
+@Data
+public class UploadParamsVO {
+    /**
+     * 专利
+     */
+    private Patent patent;
+    private String patentSimpleStatus;
+
+    /**
+     * 权利要求
+     */
+    private PatentRight patentRight;
+    private String selfContent;
+
+    /**
+     * 说明书(文本)
+     */
+    private PatentInstructionText patentInstructionText;
+
+    /**
+     * 代理人
+     */
+    private List<PatentAgent> patentAgentList;
+
+    /**
+     * 质押质权人
+     */
+    private List<PatentPledge> patentPledgeList;
+
+    /**
+     * 许可人
+     */
+    private List<PatentLicensor> patentLicensorList;
+
+    /**
+     * 简单同族
+     */
+    private List<String> simpleFamily;
+    private List<String> patSnapFamily;
+    private List<String> inpadocFamily;
+
+    /**
+     * 发明人
+     */
+    private List<PatentInventor> patentInventorList;
+    private String firstName;
+    private String firstAddress;
+
+    /**
+     * 申请人
+     */
+    private List<PatentApplicant> patentApplicantList;
+    //权利人
+    private List<String> patentApplicantCurrentName;
+    private List<String> patentApplicantStandardCurrentName;
+    //申请人
+    private List<String> patentApplicantOriginalName;
+    private List<String> patentApplicantStandardOriginalName;
+    //权利人地址
+    private List<String> patentApplicantCurrentAddress;
+    private List<String> patentApplicantCurrentCountry;
+    private String patentApplicantCurrentFirstAddress;
+    //申请人地址
+    private List<String> patentApplicantOriginalAddress;
+    private List<String> patentApplicantOriginalCountry;
+
+    /**
+     * 标签
+     */
+    private List<PatentLabel> patentLabelList;
+
+    /**
+     * 分类号关联
+     */
+    private String mainUpc;
+    private String mainIpc;
+    private List<String> cpcList;
+    private List<String> locList;
+    private List<String> upcList;
+    private List<String> ipcList;
+
+    /**
+     * 事务信息
+     */
+    private PatentAffair patentAffair;
+    private String simpleStatus;
+
+    /**
+     * 自定义字段
+     */
+    private String key;
+    private List<String> fieldList;
+
+}

+ 66 - 0
PAS/src/main/java/cn/cslg/pas/common/model/vo/UploadSettingVO.java

@@ -0,0 +1,66 @@
+package cn.cslg.pas.common.model.vo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @author 沈永艺
+ * @date 2022/7/1
+ * @description 用于存储从配置文件(Json类型)中解析出来的配置参数
+ */
+
+@Data
+@Accessors(chain = true)
+public class UploadSettingVO {
+    /**
+     * 数据来源 ID
+     */
+    private String sourceId;
+
+    /**
+     * 数据来源名称
+     */
+    private String sourceName;
+
+    /**
+     * 数据来源中文名称
+     */
+    private String name;
+
+    /**
+     * 可配置属性 包含与数据来源文件(Excel文件)中的字段相对应的属性字段 是一个数组
+     */
+    private List<Column> column;
+
+    @Data
+    @Accessors(chain = true)
+    public static class Column {
+        /**
+         * 上传Excel栏位名称
+         */
+        private String setName;
+
+        /**
+         * 在代码中创建的数据库类里面的字段
+         */
+        private String column;
+
+        /**
+         * 分隔符
+         */
+        private String splitSymbol;
+
+        /**
+         * 处理方法
+         */
+        private String handler;
+
+        /**
+         * 处理方法(特殊或后期加入方法) 存放Jar包路径
+         */
+        private String jarOrClassPath;
+    }
+
+}

+ 29 - 1
PAS/src/main/java/cn/cslg/pas/common/utils/DateUtils.java

@@ -115,7 +115,13 @@ public class DateUtils {
     }
 
     public static Integer getDateTime(String date) {
-        return (int) (strToDateTime(date, YYYY_MM_DD).getTime() / 1000);
+        int dateTime = 0;
+        if (date.contains("/")) {
+            dateTime = Math.toIntExact(strToDateTime(date, parsePatterns[4]).getTime() / 1000);
+        } else if (date.contains("-")) {
+            dateTime = Math.toIntExact(strToDateTime(date, YYYY_MM_DD).getTime() / 1000);
+        }
+        return dateTime;
     }
 
     /**
@@ -141,6 +147,28 @@ public class DateUtils {
         }
     }
 
+    public static Date strToDate(String dateString) {
+        try {
+            SimpleDateFormat sf1;
+            if (dateString.contains("-")) {
+                sf1 = new SimpleDateFormat("yyyy-MM-dd");
+            } else if (dateString.contains("//")) {
+                sf1 = new SimpleDateFormat("yyyy/MM/dd");
+            } else if (dateString.contains(":")) {
+                sf1 = new SimpleDateFormat("yyyy:MM:dd");
+            } else if (dateString.contains(".")) {
+                sf1 = new SimpleDateFormat("yyyy.MM.dd");
+            } else {
+                sf1 = new SimpleDateFormat("yyyyMMdd");
+            }
+
+            Date date = sf1.parse(dateString);
+            return date;
+        } catch (Exception e) {
+            throw new RuntimeException("时间转化格式错误" + "[dateString=" + dateString + "]" + "[FORMAT_STRING=" + FORMAT_STRING + "]");
+        }
+    }
+
     /**
      * 获取今天开始的时间
      *

+ 15 - 9
PAS/src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java

@@ -10,6 +10,7 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.*;
 import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
 
+import java.awt.*;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -70,14 +71,16 @@ public class ExcelUtils {
      */
     public static Map<String, PictureData> getPictures1(HSSFSheet sheet) throws IOException {
         Map<String, PictureData> map = new HashMap<String, PictureData>();
-        List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
-        for (HSSFShape shape : list) {
-            if (shape instanceof HSSFPicture) {
-                HSSFPicture picture = (HSSFPicture) shape;
-                HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();
-                PictureData pdata = picture.getPictureData();
-                String key = String.valueOf(cAnchor.getRow1());
-                map.put(key, pdata);
+        if (sheet.getDrawingPatriarch() != null) {
+            List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
+            for (HSSFShape shape : list) {
+                if (shape instanceof HSSFPicture) {
+                    HSSFPicture picture = (HSSFPicture) shape;
+                    HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();
+                    PictureData pdata = picture.getPictureData();
+                    String key = String.valueOf(cAnchor.getRow1());
+                    map.put(key, pdata);
+                }
             }
         }
         return map;
@@ -99,7 +102,10 @@ public class ExcelUtils {
                 List<XSSFShape> shapes = drawing.getShapes();
                 for (XSSFShape shape : shapes) {
                     XSSFPicture picture = (XSSFPicture) shape;
-                    XSSFClientAnchor anchor = picture.getPreferredSize();
+                    Dimension d = picture.getImageDimension();
+                    //解决图片空指针报错问题 lig  2021-06-03
+                    XSSFClientAnchor anchor = (XSSFClientAnchor) shape.getAnchor();
+                    //XSSFClientAnchor anchor = picture.getPreferredSize();
                     CTMarker marker = anchor.getFrom();
                     String key = String.valueOf(marker.getRow());
                     map.put(key, picture.getPictureData());

+ 46 - 3
PAS/src/main/java/cn/cslg/pas/common/utils/FileUtils.java

@@ -7,9 +7,8 @@ import org.springframework.boot.system.ApplicationHome;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.Resource;
-import java.io.File;
-import java.util.List;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
 
 @Service
 public class FileUtils {
@@ -19,24 +18,38 @@ public class FileUtils {
     public static final String BACKUP_FILE = "backup";
 
     public static String getStaticPath(String fileName) {
+        //ApplicationHome类 返回target目录层级
         ApplicationHome ah = new ApplicationHome(FileUtils.class);
+        //获取 applicationHome 内的路径 ...\target\classes 到这一层级下
         File file = ah.getSource();
+        //获取 file的parentFile 即最后一级之前的所有层级路径(包括盘符) 这里能获得到的最终层级为  ...\target 后续用FILE_SEPARATOR(系统路径分割通配符 即 "\") 以及fileName拼接生成存放文件的目录层级 即为根目录 root
         String rootPath = file.getParentFile().toString() + FILE_SEPARATOR + fileName;
+        //根据上方生成的根目录路径 生成对应文件夹 没有就新建
         File root = new File(rootPath);
         if (!root.exists()) {
             root.mkdir();
         }
+        //返回的最终形式为 盘符:\项目层级\target\file
         return rootPath;
     }
 
     public UploadFileDTO uploadFile(MultipartFile file) {
         UploadFileDTO fileDTO = new UploadFileDTO();
+        //以下操作为 先取得传入文件的完整文件名 (文件名 + 后缀) 然后用FileUtil分别取出 文件名 和 不带 "." 的后缀 然后将这些内容装配进 实体中
+        //file.getOriginFilename 获取源文件
+        //FileUtil.getPrefix 返回主文件名
         fileDTO.setName(FileUtil.getPrefix(file.getOriginalFilename()));
+        //FileUtil.extName 获取文件的扩展名(后缀名),扩展名不带 "."
         fileDTO.setExtName(FileUtil.extName(file.getOriginalFilename()));
+        //获取目录名 用时间作为目录名称
         String directoryName = this.getDirectoryName();
+        //用IdUtil生成的UUID 与实体中的 extName(后缀名) 拼接后作为文件名 simpleUUID与randomUUID的区别是 simpleUUID 没有 "-"
         String fileName = IdUtil.simpleUUID() + "." + fileDTO.getExtName();
+        //将完整文件名进行装配
         fileDTO.setFileName(fileName);
+        //生成存储文件的路径
         String savePath = this.getSavePath(directoryName);
+        //根据生成存储文件的路径 生成对应文件夹 没有就新建
         File directory = new File(savePath);
         if (!directory.exists()) {
             directory.mkdir();
@@ -102,5 +115,35 @@ public class FileUtils {
         return getStaticPath(COMMON_FILE) + url;
     }
 
+    public String analysisJsonFile() {
+        ApplicationHome ah = new ApplicationHome(BackupUtils.class);
+        File file = ah.getSource();
+        String settingFilePath = file.getParentFile().toString() + FileUtils.FILE_SEPARATOR + "uploadSetting.json";
+        BufferedReader reader = null;
+        StringBuilder last = new StringBuilder();
+        InputStreamReader inputStreamReader;
+        try (FileInputStream fileInputStream = new FileInputStream(settingFilePath)) {
+            inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
+
+            reader = new BufferedReader(inputStreamReader);
+            String tempString;
+            while ((tempString = reader.readLine()) != null) {
+                last.append(tempString);
+            }
+            reader.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return last.toString();
+    }
+
 }
 

+ 210 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java

@@ -0,0 +1,210 @@
+package cn.cslg.pas.common.utils;
+
+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.handler.DataProcessHandler;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @date 2022/7/7
+ * @description 批量上传专利数据的数据处理工具类
+ */
+
+@Component
+public class UploadPatentBatchUtil {
+    /**
+     * @param projectImportPatentVO 前台传入参数
+     * @param getSettingJson        配置文件解析出的Json串
+     * @return uploadParamsVO 返回一个由processData方法填充完数据的Pojo类
+     * @date 2022/7/7
+     * @name 解析配置文件
+     * @description 通过与前段传入参数中的数据源ID进行比对从而得到对应数据源的配置项目
+     */
+    public static List<UploadSettingVO.Column> parsingConfigurationFiles(ProjectImportPatentVO projectImportPatentVO, String getSettingJson) {
+        //将 Json 转换为 对象数组
+        List<UploadSettingVO> test = JsonUtils.jsonToList(getSettingJson, UploadSettingVO.class);
+        //创建一个存放单一数据源的对象 这个对象存放的是 我们需要使用哪一个数据源的配置数据 所以只存一个 正常在Json文件里面会有多个数据源 也就是多条数据
+        List<UploadSettingVO.Column> jsonData = new ArrayList<>();
+        //开始将前端传入的数据源参数与 Json 中解析出来的 sourceId(数据来源ID) 进行比对 并将比对中的那一条数据放入上方定义的 jsonData 中 用于后续使用
+        for (int i = 0; i < Objects.requireNonNull(test).size(); i++) {
+            //提取一个常量
+            UploadSettingVO constant = Objects.requireNonNull(test).get(i);
+            //判断 如果说 Json 解析出来的 List<T> 中的 sourceId 和传入参数的 sourceId 匹配成功 则开始装配数据
+            if (constant.getSourceId().equals(projectImportPatentVO.getSourceId())) {
+                //填充数据
+                jsonData = constant.getColumn();
+            }
+        }
+        //返回填充好的数据
+        return jsonData;
+    }
+
+    /**
+     * @param row      任务参数
+     * @param jsonData 处理好后转换为Pojo类的配置文件数据
+     * @return uploadParamsVO 返回一个填充完数据的Pojo类
+     * @date 2022/7/7
+     * @name 处理数据
+     * @description 通过配置项目中的栏位名称和通过解析Excel得到的栏位名称进行比对 并对所属栏位的数据进行分割或其他处理 最后将处理完的数据填充进类中 用于向数据库存入数据
+     */
+    public static UploadParamsVO processData(Map<Object, Object> row, List<UploadSettingVO.Column> jsonData) {
+        UploadParamsVO uploadParamsVO = new UploadParamsVO();
+
+        try {
+            for (Object object : row.keySet()) {
+                String key = object.toString();
+                Object value = row.get(key);
+                if (StringUtils.isNotNull(value) && !value.equals("") && !value.equals("-") && !value.equals("\\")) {
+                    //将配置项与Excel栏位进行比对
+                    List<UploadSettingVO.Column> temVOColumn = getColumn(jsonData, key);
+                    for (UploadSettingVO.Column column : temVOColumn) {
+                        //创建处理对象
+                        Object processData = DataProcessHandler.getData(column.getHandler(), column.getJarOrClassPath());
+                        //调用处理对象中的对应处理方法对Excel中的数据进行处理
+                        Object getProcessData = null;
+                        if (processData != null) {
+                            Method method = processData.getClass().getMethod("processData", Object.class, Object.class);
+                            getProcessData = method.invoke(processData, value.toString(), column.getSplitSymbol());
+                        }
+                        //将格式化后的数据装配到VO类
+                        assemblyObject(uploadParamsVO, column.getColumn(), getProcessData);
+                        if (key.contains(":")) {
+                            uploadParamsVO.setKey(key);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        //数据装配完毕 准备返回Service层 进行数据库操作
+        return uploadParamsVO;
+    }
+
+    private static List<UploadSettingVO.Column> getColumn(List<UploadSettingVO.Column> jsonData, String key) {
+        List<UploadSettingVO.Column> columnList = new ArrayList<>();
+
+        for (UploadSettingVO.Column jsonDatum : jsonData) {
+            if (jsonDatum.getSetName().equals(key)) {
+                columnList.add(jsonDatum);
+            }
+        }
+        if (key.contains(":")) {
+            UploadSettingVO.Column field = new UploadSettingVO.Column();
+            field.setColumn("fieldList");
+            field.setSplitSymbol("\\\n");
+            field.setHandler("cn.cslg.pas.common.utils.handler.StringSpecialHandler");
+            columnList.add(field);
+        }
+        return columnList;
+    }
+
+    /**
+     * @param obj          装配对象(UploadParamsVO)
+     * @param propertyPath 以.隔开的属性路径(配置文件中的 Column)
+     * @param value        值(row 每一行的值 在上层方法中叫 value)
+     * @name 装配对象
+     * @description 通过反射将处理后的数据赋值到装配对象的给定路径的属性值
+     */
+
+    private static void assemblyObject(Object obj, String propertyPath, Object value) {
+        //将属性的路径通过 "." 进行拆分 数据样式大致为 patentRightList.content 或者 patentInstructionText.manual
+        //"."前面的是UploadParamsVO的属性名称 可能是List或者Object
+        //"."后面的是List中的Object的属性 或者Object的属性
+        String[] splitProperty = propertyPath.split("\\.");
+        //初始化一个基类 用于存储数据
+        Object temObj = obj;
+        try {
+            //进行属性路径的循环 这里一般都是两次
+            for (int i = 0; i < splitProperty.length; i++) {
+                //如果需要为对应参数赋值 第一次循环不会进入这一分支
+                if (i == splitProperty.length - 1) {
+                    //如果是列表
+                    if (temObj instanceof List) {
+                        //取创建空数据中的第一条
+                        Object firstItem = ((List<?>) temObj).get(0);
+                        //获取该条数据的类型
+                        String listObjectType = firstItem.getClass().getTypeName();
+                        //如果列表中的数据少于给的值的列表中的数据量
+                        //添加数据以与给定的值对齐
+                        if (((List<?>) temObj).size() < ((List<?>) Objects.requireNonNull(value)).size()) {
+                            for (int iIndex = ((List<?>) temObj).size(); iIndex < ((List<?>) value).size(); iIndex++) {
+                                Object cObj = Class.forName(listObjectType).newInstance();// trueType.newInstance();
+                                ((List<Object>) temObj).add(cObj);
+                            }
+                        }
+
+                        //给列表中的对象相对应的属性赋值
+                        for (int iIndex = 0; iIndex < ((List<?>) value).size(); iIndex++) {
+
+                            Object inListObj = ((List<?>) temObj).get(iIndex);
+                            Field f = inListObj.getClass().getDeclaredField(splitProperty[i]);
+                            f.setAccessible(true);
+                            if (!((List<?>) value).isEmpty()) {
+                                f.set(inListObj, ((List<?>) value).get(iIndex));
+                            }
+                        }
+
+                    } else {
+                        Field f = temObj.getClass().getDeclaredField(splitProperty[i]);
+                        f.setAccessible(true);
+                        if (value != null) {
+                            f.set(temObj, value);
+                        }
+                    }
+                } else {
+
+                    //
+                    Field f = temObj.getClass().getDeclaredField(splitProperty[i]);
+                    //允许设置私有(private)属性
+                    f.setAccessible(true);
+                    //获取
+                    Object propertyValue = f.get(obj);
+
+                    if (propertyValue == null) {
+                        if (f.getType().getName().contains("List")) {
+                            propertyValue = createList(f);
+                        } else {
+                            propertyValue = f.getType().newInstance();
+                        }
+                        f.set(temObj, propertyValue);
+                    }
+
+                    temObj = propertyValue;
+                }
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private static List<Object> createList(Field f) {
+        //如果是列表,创建一个List<Object>并添加一个对应类型的对象
+        List<Object> lst = new ArrayList<>();
+
+        //取List属性中包含的对象类型
+        Type trueType = f.getGenericType();
+        Type listArgumentObj = ((ParameterizedType) trueType).getActualTypeArguments()[0];
+        Object cObj = null;
+        try {
+            cObj = Class.forName(listArgumentObj.getTypeName()).newInstance();
+        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        lst.add(cObj);
+        return lst;
+    }
+
+}

+ 46 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/DataProcessHandler.java

@@ -0,0 +1,46 @@
+package cn.cslg.pas.common.utils.handler;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+public class DataProcessHandler {
+    public interface IProcessData {
+        Object processData(Object data, Object code);
+    }
+
+    public DataProcessHandler() {
+    }
+
+    public static Object getData(String typeName, String jarOrClassPath) {
+
+        if (jarOrClassPath != null) {
+            try {
+                //用路径创建Url
+                URL url = new URL("file:" + jarOrClassPath);
+                //通过Url加载外部的jar包
+                URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});
+                Class<?> clazz = urlClassLoader.loadClass(typeName);
+                return clazz.newInstance();
+            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | MalformedURLException e) {
+                e.printStackTrace();
+            }
+        } else {
+            try {
+                return Class.forName(typeName).newInstance();
+            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    public static void main(String[] args) {
+        System.out.println("启动成功");
+    }
+
+}
+
+
+
+

+ 5 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/IProcessData.java

@@ -0,0 +1,5 @@
+package cn.cslg.pas.common.utils.handler;
+
+public interface IProcessData {
+    Object processData(Object data, Object code);
+}

+ 21 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/IncoPatInventorAddressHandler.java

@@ -0,0 +1,21 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.List;
+
+public class IncoPatInventorAddressHandler implements IProcessData {
+    public IncoPatInventorAddressHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object code) {
+        List<String> splitStr = StringUtils.changeStringToString(data.toString().replaceAll(" ", ""), ";");
+        if (code.toString().equals("1")) {
+            return splitStr;
+        } else if (code.toString().equals("2")) {
+            return splitStr.get(0);
+        }
+        return null;
+    }
+}

+ 58 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/IncoPatPatentAffairHandler.java

@@ -0,0 +1,58 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class IncoPatPatentAffairHandler implements IProcessData {
+    public IncoPatPatentAffairHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object code) {
+        String processedData = data.toString().replaceAll("\r\n", "");
+        List<String> contentList = StringUtils.changeStringToString(processedData, "([\\u4e00-\\u9fa5]+):");
+        contentList.remove(0);
+
+        List<String> tableList = new ArrayList<>();
+        Pattern p = Pattern.compile("([\\u4e00-\\u9fa5]+):");
+        Matcher m = p.matcher(data.toString());
+        while (m.find()) {
+            tableList.add(m.group(1));
+        }
+
+        StringBuilder all = new StringBuilder();
+        StringBuilder one = new StringBuilder();
+        for (int i = 0; i < tableList.size(); i++) {
+            if (tableList.get(i).contains("法律状态公告日")) {
+                if (!one.toString().equals("")) {
+                    if (!all.toString().equals("")) {
+                        all.append(",{").append(one).append("]").append("}");
+                    } else {
+                        all = new StringBuilder("{" + one + "]}");
+                    }
+                }
+                one = new StringBuilder();
+            }
+
+            if (one.toString().equals("")) {
+                one = new StringBuilder("\"inpadocData\"" + ":[" + "{" + "\"name\"" + ":" + "\"" + tableList.get(i) + "\"" + ",\"" + "content\"" + ":" + "\"" + contentList.get(i).replaceAll(";", "") + "\"" + "}");
+            } else {
+                one.append(",").append("{" + "\"name\"" + ":").append("\"").append(tableList.get(i)).append("\"" + "," + "\"" + "content\"" + ":" + "\"").append(contentList.get(i).replaceAll(";", "")).append("\"" + "}");
+            }
+
+        }
+        if (!one.toString().equals("")) {
+            if (!all.toString().equals("")) {
+                all.append(",{").append(one).append("]").append("}");
+            } else {
+                all = new StringBuilder("{" + one + "]}");
+            }
+        }
+        all = new StringBuilder("[" + all + "]");
+        return all.toString();
+    }
+}

+ 16 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/IncoPatUCMainHandler.java

@@ -0,0 +1,16 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.List;
+
+public class IncoPatUCMainHandler implements IProcessData {
+    public IncoPatUCMainHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        List<String> splitList = StringUtils.changeStringToString(data.toString(), splitSymbol.toString());
+        return splitList.get(0);
+    }
+}

+ 15 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/IntegerHandler.java

@@ -0,0 +1,15 @@
+package cn.cslg.pas.common.utils.handler;
+
+/**
+ * @name 数字处理类
+ * @description 1.传入的字符型数字数据转换为int型
+ */
+public class IntegerHandler implements IProcessData {
+    public IntegerHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        return Integer.parseInt(data.toString());
+    }
+}

+ 39 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatSnapPatentAffairHandler.java

@@ -0,0 +1,39 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.List;
+
+public class PatSnapPatentAffairHandler implements IProcessData {
+    public PatSnapPatentAffairHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object code) {
+        List<String> splitStr = StringUtils.changeStringToString(data.toString(), "\\|");
+
+        StringBuilder all = new StringBuilder();
+        StringBuilder one = new StringBuilder();
+        for (int i = 0; i < splitStr.size(); i += 3) {
+            if (one.toString().equals("")) {
+                one = new StringBuilder("\"inpadocData\"" + ":[" + "{" + "\"name\"" + ":" + "\"发生日期\"" + "," + "\"content\"" + ":" + "\"" + splitStr.get(i).trim() + "\"" + "}");
+            } else {
+                one.append("," + "{" + "\"name\"" + ":" + "\"发生日期\"" + "," + "\"content\"" + ":" + "\"").append(splitStr.get(i).trim()).append("\"").append("}");
+            }
+            one.append(",{").append("\"name\":\"国家\"").append(",").append("\"content\":").append("\"").append(splitStr.get(i + 2).trim()).append("\"").append("}");
+            one.append("," + "{" + "\"name\"" + ":" + "\"内容\"" + "," + "\"content\"" + ":" + "\"").append(splitStr.get(i + 1).trim()).append("\"").append("}]");
+
+            if (!one.toString().equals("")) {
+                if (!all.toString().equals("")) {
+                    all.append(",{").append(one).append("}");
+                } else {
+                    all = new StringBuilder("{" + one + "}");
+                }
+            }
+            one = new StringBuilder();
+        }
+
+        all = new StringBuilder("[" + all + "]");
+        return all.toString();
+    }
+}

+ 24 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatentTypeHandler.java

@@ -0,0 +1,24 @@
+package cn.cslg.pas.common.utils.handler;
+
+/**
+ * @name 专利类型处理类
+ * @description 1.将传入的专利类型转换成不同的ID 2.目前这个没有用字典项的原因是因为不同数据源的叫法不一致 无法统一进行分类
+ */
+public class PatentTypeHandler implements IProcessData {
+    public PatentTypeHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object ob) {
+        if (data.toString().contains("实用新型")) {
+            return 1;
+        } else if (data.toString().contains("发明申请") || data.toString().contains("发明公布")) {
+            return 2;
+        } else if (data.toString().contains("外观设计")) {
+            return 3;
+        } else if (data.toString().contains("授权")) {
+            return 4;
+        }
+        return null;
+    }
+}

+ 22 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatenticsAgencyAndAgentHandler.java

@@ -0,0 +1,22 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.List;
+
+public class PatenticsAgencyAndAgentHandler implements IProcessData {
+    public PatenticsAgencyAndAgentHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object code) {
+        List<String> splitStr = StringUtils.changeStringToString(data.toString().replaceAll(" ", ""), ";");
+        if (code.toString().equals("1")) {
+            return splitStr.get(0);
+        } else if (code.toString().equals("2")) {
+            splitStr.remove(0);
+            return splitStr;
+        }
+        return null;
+    }
+}

+ 59 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/PatenticsPatentAffairHandler.java

@@ -0,0 +1,59 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class PatenticsPatentAffairHandler implements IProcessData {
+    public PatenticsPatentAffairHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object code) {
+        List<String> splitStr = StringUtils.changeStringToString(data.toString(), "\n");
+        splitStr.removeIf(item -> item.equals(""));
+
+        List<String> processList = splitStr.stream().map(item -> item.replaceAll(" ", "\\|")).collect(Collectors.toList());
+
+        StringBuilder all = new StringBuilder();
+        StringBuilder one = new StringBuilder();
+        List<String> messageList;
+        Pattern p = Pattern.compile("[0-9]*");
+
+        for (int j = 0; j < processList.size(); j++) {
+            if (j < processList.size() - 1) {
+                Matcher m = p.matcher(processList.get(j + 1).substring(0, 2));
+                if (!m.matches()) {
+                    processList.set(j, processList.get(j) + " " + processList.get(j + 1));
+                    processList.remove(j + 1);
+                }
+            }
+            messageList = StringUtils.changeStringToString(processList.get(j), "\\|");
+
+            for (int i = 0; i < messageList.size(); i += 3) {
+                if (one.toString().equals("")) {
+                    one = new StringBuilder("\"inpadocData\"" + ":[" + "{" + "\"name\"" + ":" + "\"发生日期\"" + "," + "\"content\"" + ":" + "\"" + messageList.get(i).trim() + "\"" + "}");
+                } else {
+                    one.append("," + "{" + "\"name\"" + ":" + "\"发生日期\"" + "," + "\"content\"" + ":" + "\"").append(messageList.get(i).trim()).append("\"").append("}");
+                }
+                one.append(",{").append("\"name\":\"法律状态\"").append(",").append("\"content\":").append("\"").append(messageList.get(i + 1).trim()).append("\"").append("}");
+                one.append("," + "{" + "\"name\"" + ":" + "\"描述信息\"" + "," + "\"content\"" + ":" + "\"").append(messageList.get(i + 2).trim()).append("\"").append("}]");
+
+                if (!one.toString().equals("")) {
+                    if (!all.toString().equals("")) {
+                        all.append(",{").append(one).append("}");
+                    } else {
+                        all = new StringBuilder("{" + one + "}");
+                    }
+                }
+                one = new StringBuilder();
+            }
+
+        }
+        all = new StringBuilder("[" + all + "]");
+        return all.toString();
+    }
+}

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

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+public class PatenticsStringHandler implements IProcessData {
+    public PatenticsStringHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        if (!"".equals(splitSymbol)) {
+            return StringUtils.changeStringToString(data.toString().replaceAll(" ", "").replaceAll("\n", ""), splitSymbol.toString());
+        } else {
+            return data.toString().replaceAll(" ", "");
+        }
+    }
+}

+ 18 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/SplitBySerialNumberAndRemoveLineFeedHandler.java

@@ -0,0 +1,18 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+public class SplitBySerialNumberAndRemoveLineFeedHandler implements IProcessData {
+    public SplitBySerialNumberAndRemoveLineFeedHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        return Arrays.stream(data.toString().replaceAll("\n", "").split(splitSymbol.toString()))
+                .filter(StringUtils::isNotEmpty)
+                .collect(Collectors.toList());
+    }
+}

+ 27 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/SplitOriginalAndTranslationHandler.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+import java.util.List;
+
+/**
+ * @name
+ * @description
+ */
+public class SplitOriginalAndTranslationHandler implements IProcessData {
+    public SplitOriginalAndTranslationHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        List<String> splitList = StringUtils.changeStringToString(splitSymbol.toString(), ",");
+        if (splitList.get(0).equals("1")) {
+            return StringUtils.changeStringToString(data.toString(), splitList.get(1)).get(0);
+        } else if (splitList.get(0).equals("2")) {
+            if (StringUtils.changeStringToString(data.toString(), splitList.get(1)).size() == 2) {
+                return StringUtils.changeStringToString(data.toString(), splitList.get(1)).get(1);
+            }
+        }
+        return null;
+    }
+}

+ 21 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/StringHandler.java

@@ -0,0 +1,21 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+/**
+ * @name 一般字符串处理类
+ * @description 1.带有分隔符按照分隔符拆分(去除所有空格) 2.不带分隔符直接返回原数据
+ */
+public class StringHandler implements IProcessData {
+    public StringHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        if (!"".equals(splitSymbol)) {
+            return StringUtils.changeStringToString(data.toString().trim(), splitSymbol.toString());
+        } else {
+            return data.toString();
+        }
+    }
+}

+ 21 - 0
PAS/src/main/java/cn/cslg/pas/common/utils/handler/StringSpecialHandler.java

@@ -0,0 +1,21 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.StringUtils;
+
+/**
+ * @name 特殊字符串处理类
+ * @description 1.带有分隔符按照分隔符拆分(去除 '>' 符号) 2.不带分隔符直接返回原数据 3.目前只有两个字段会使用 (1)标签(2)自定义字段
+ */
+public class StringSpecialHandler implements IProcessData {
+    public StringSpecialHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        if (!"".equals(splitSymbol)) {
+            return StringUtils.changeStringToString(data.toString().replaceAll(">", ""), splitSymbol.toString());
+        } else {
+            return data.toString();
+        }
+    }
+}

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

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.utils.handler;
+
+import cn.cslg.pas.common.utils.DateUtils;
+
+/**
+ * @name 时间处理类
+ * @description 1.将时间类型数据转换为int型 2.现支持格式为 yyyy-MM-dd yyyy/MM/dd 可后需添加
+ */
+public class TimeHandler implements IProcessData {
+    public TimeHandler() {
+    }
+
+    @Override
+    public Object processData(Object data, Object splitSymbol) {
+        return DateUtils.getDateTime(data.toString());
+    }
+}

+ 10 - 2
PAS/src/main/java/cn/cslg/pas/controller/CommonController.java

@@ -3,7 +3,9 @@ package cn.cslg.pas.controller;
 import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.domain.SystemDict;
+import cn.cslg.pas.domain.SystemDictAssociate;
 import cn.cslg.pas.service.AreaService;
+import cn.cslg.pas.service.SystemDictAssociateService;
 import cn.cslg.pas.service.SystemDictService;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
@@ -18,13 +20,11 @@ import cn.hutool.poi.excel.ExcelWriter;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.io.FilenameUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.util.FileCopyUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -46,6 +46,7 @@ public class CommonController {
     private final CacheUtils cacheUtils;
     private final AreaService areaService;
     private final SystemDictService systemDictService;
+    private final SystemDictAssociateService systemDictAssociateService;
     private final FileUtils fileUtils;
 
     @GetMapping("area")
@@ -66,6 +67,13 @@ public class CommonController {
         return Response.success(map);
     }
 
+    @GetMapping("getDictTreeByParentDictValue")
+    @Operation(summary = "获取字典项之间的级联关系")
+    public String getDictTreeByParentDictValue(@RequestParam(value = "value") List<String> value, String type, Integer flag) {
+        List<SystemDictAssociate> systemDictAssociates = systemDictAssociateService.getDictTreeByParentDictValue(value, type, flag);
+        return Response.success(systemDictAssociates);
+    }
+
     @GetMapping("static")
     @Operation(summary = "获取静态文件")
     public String getStaticFile(String path, String type, HttpServletResponse response, HttpServletRequest request) {

+ 18 - 10
PAS/src/main/java/cn/cslg/pas/controller/ProjectImportController.java

@@ -2,23 +2,25 @@ package cn.cslg.pas.controller;
 
 import cn.cslg.pas.common.core.annotation.Permission;
 import cn.cslg.pas.common.core.base.Constants;
-import cn.cslg.pas.common.core.exception.PermissionException;
-import cn.cslg.pas.common.model.vo.*;
+import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
+import cn.cslg.pas.common.model.vo.ProjectImportVO;
+import cn.cslg.pas.common.model.vo.TaskParams;
 import cn.cslg.pas.common.utils.*;
-import cn.cslg.pas.domain.Project;
-import cn.cslg.pas.domain.ProjectExport;
-import cn.cslg.pas.domain.User;
-import cn.cslg.pas.service.*;
+import cn.cslg.pas.service.ProjectImportService;
+import cn.cslg.pas.service.ProjectImportStatusService;
+import cn.cslg.pas.service.ProjectService;
+import cn.cslg.pas.service.UploadPatentBatchService;
 import cn.dev33.satoken.stp.StpUtil;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.List;
-
 /**
  * <p>
  * 专题库导入 前端控制器
@@ -38,6 +40,9 @@ public class ProjectImportController {
     private final ProjectImportService projectImportService;
     private final ProjectImportStatusService projectImportStatusService;
 
+    private final UploadPatentBatchService uploadPatentBatchService;
+
+
     @Permission(roles = {2})
     @PostMapping("patent")
     @Operation(summary = "为专题库导入专利")
@@ -47,7 +52,10 @@ public class ProjectImportController {
             return Response.error("参数错误");
         }
         TaskParams taskParams = projectService.getImportPatentTaskParams(file, params.getProjectId());
-        projectService.importPatent(taskParams, params);
+        //projectService.importPatent(taskParams, params);
+
+        uploadPatentBatchService.uploadPatentBatch(taskParams, params);
+
         return Response.success(true);
     }
 

+ 6 - 0
PAS/src/main/java/cn/cslg/pas/domain/Area.java

@@ -58,8 +58,14 @@ public class Area implements Serializable {
      */
     private Integer level;
 
+    /**
+     * 创建时间
+     */
     private Date createdAt;
 
+    /**
+     * 修改时间
+     */
     private Date updatedAt;
 
 }

+ 3 - 0
PAS/src/main/java/cn/cslg/pas/domain/Client.java

@@ -38,6 +38,9 @@ public class Client extends BaseEntity<Client> {
      */
     private String remark;
 
+    /**
+     * 创建时间
+     */
     @TableField("ctime")
     private Integer createTime;
 

+ 6 - 1
PAS/src/main/java/cn/cslg/pas/domain/Department.java

@@ -17,7 +17,9 @@ import lombok.Data;
 @TableName("os_branch")
 public class Department extends BaseEntity<Department> {
 
-
+    /**
+     * 部门名称
+     */
     private String name;
 
     /**
@@ -26,6 +28,9 @@ public class Department extends BaseEntity<Department> {
     @TableField("pid")
     private Integer parentId;
 
+    /**
+     * 状态
+     */
     private Integer status;
 
     /**

+ 62 - 0
PAS/src/main/java/cn/cslg/pas/domain/ImportErrorLog.java

@@ -0,0 +1,62 @@
+package cn.cslg.pas.domain;
+
+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;
+
+/**
+ * 批量上传失败日志表
+ *
+ * @author 沈永艺
+ * @since 2022-7-23
+ */
+@Data
+@TableName("OS_IMPORT_ERROR_LOG")
+@Accessors(chain = true)
+public class ImportErrorLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 专利号
+     */
+    @TableField(value = "PATENT_NO")
+    private String patentNo;
+
+    /**
+     * 错误信息
+     */
+    @TableField(value = "MISTAKE_MESSAGE")
+    private String mistakeMessage;
+
+    /**
+     * 操作人ID
+     */
+    @TableField(value = "CREATE_USER_ID")
+    private Integer createUserId;
+
+    /**
+     * 记录时间
+     */
+    @TableField(value = "CREATE_TIME")
+    private String createTime;
+
+    /**
+     * 专题库ID
+     */
+    @TableField(value = "PROJECT_ID")
+    private Integer projectId;
+
+    /**
+     * 专利ID
+     */
+    @TableField(value = "PATENT_ID")
+    private Integer patentId;
+}

+ 7 - 0
PAS/src/main/java/cn/cslg/pas/domain/Patent.java

@@ -192,6 +192,9 @@ public class Patent extends BaseEntity<Patent> {
     @TableField("inpadocfamilynum")
     private Integer inpadocFamilyNum;
 
+    /**
+     * PatSnap同族数量
+     */
     @TableField("patsnapfamilynum")
     private Integer patSnapFamilyNum;
 
@@ -288,6 +291,9 @@ public class Patent extends BaseEntity<Patent> {
      */
     private Integer inpadocFamily;
 
+    /**
+     * PatSnap同族ID
+     */
     @TableField("patsnap_family")
     private Integer patSnapFamily;
 
@@ -297,6 +303,7 @@ public class Patent extends BaseEntity<Patent> {
     @TableField("epcountry")
     private String epStatus;
 
+
     @TableField(exist = false)
     private Integer read;
 }

+ 16 - 1
PAS/src/main/java/cn/cslg/pas/domain/PatentAffair.java

@@ -1,10 +1,15 @@
 package cn.cslg.pas.domain;
 
 import cn.cslg.pas.common.model.BaseEntity;
+import cn.cslg.pas.common.model.vo.KeyValueVO;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import javax.swing.text.html.ObjectView;
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  * 专利信息事务信息表
@@ -26,7 +31,7 @@ public class PatentAffair extends BaseEntity<PatentAffair> {
     /**
      * 法律状态
      */
-    private Integer status;
+    private String status;
 
     /**
      * 简单法律状态
@@ -58,4 +63,14 @@ public class PatentAffair extends BaseEntity<PatentAffair> {
 
     @TableField(exist = false)
     private String createSimpleStatus;
+
+    @TableField(exist = false)
+    private List<KeyValueVO> inpadoc;
+
+    @Data
+    public static class INPADOC {
+        private String year;
+        private String content;
+        private String country;
+    }
 }

+ 3 - 0
PAS/src/main/java/cn/cslg/pas/domain/PatentApplicantLink.java

@@ -34,6 +34,9 @@ public class PatentApplicantLink extends BaseEntity<PatentApplicantLink> {
     @TableField("pid")
     private Integer patentId;
 
+    /**
+     * 申请人顺序(0为第一申请人)
+     */
     @TableField("`order`")
     public Integer order;
 }

+ 6 - 0
PAS/src/main/java/cn/cslg/pas/domain/PatentClassNumberLink.java

@@ -28,7 +28,13 @@ public class PatentClassNumberLink extends BaseEntity<PatentClassNumberLink> {
      */
     private Integer main;
 
+    /**
+     * 分类号类型
+     */
     private Integer type;
 
+    /**
+     * 分类号
+     */
     private String code;
 }

+ 3 - 0
PAS/src/main/java/cn/cslg/pas/domain/PatentImage.java

@@ -34,5 +34,8 @@ public class PatentImage extends BaseEntity<PatentImage> {
     @TableField("pid")
     private Integer patentId;
 
+    /**
+     * 文件名称
+     */
     private String fileName;
 }

+ 2 - 2
PAS/src/main/java/cn/cslg/pas/domain/PatentInstructionText.java

@@ -22,12 +22,12 @@ public class PatentInstructionText extends BaseEntity<PatentInstructionText> {
     private Integer patentId;
 
     /**
-     * 
+     * 说明书
      */
     private String manual;
 
     /**
-     * 
+     * 说明书(译)
      */
     private String manualOut;
 

+ 6 - 1
PAS/src/main/java/cn/cslg/pas/domain/PatentInventor.java

@@ -30,12 +30,17 @@ public class PatentInventor extends BaseEntity<PatentInventor> {
     private String address;
 
     /**
+     * 国家
+     */
+    private String country;
+
+    /**
      * 备注
      */
     private String remark;
 
     /**
-     * 类型【个人、企业、研究机构、院校】 
+     * 类型【个人、企业、研究机构、院校】
      */
     private Integer type;
 

+ 6 - 0
PAS/src/main/java/cn/cslg/pas/domain/ProjectField.java

@@ -87,4 +87,10 @@ public class ProjectField extends BaseEntity<ProjectField> {
 
     @TableField(exist = false)
     private String projectName;
+
+    @Data
+    public static class dataType {
+        private String name;
+        private Object id;
+    }
 }

+ 55 - 0
PAS/src/main/java/cn/cslg/pas/domain/SystemDictAssociate.java

@@ -0,0 +1,55 @@
+package cn.cslg.pas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "os_system_dict_associate")
+public class SystemDictAssociate {
+    /**
+     * 主键ID
+     */
+    @TableField(value = "id")
+    private Integer id;
+
+    /**
+     * 字典项父项Value值
+     */
+    private String dictParentValue;
+
+    /**
+     * 字典项父项Label值
+     */
+    private String dictParentLabel;
+
+    /**
+     * 字典项父项Type值
+     */
+    private String dictParentType;
+
+    /**
+     * 字典项子项VALUE值
+     */
+    private String dictChildValue;
+
+    /**
+     * 字典项子项LABEL值
+     */
+    private String dictChildLabel;
+
+    /**
+     * 字典项子项TYPE值
+     */
+    private String dictChildType;
+
+    /**
+     * 字典项子项状态(1必选流程 0可选流程)
+     */
+    private String dictChildStatus;
+
+    /**
+     * 字典项关联关系说明(用|分割)
+     */
+    private String description;
+}

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

@@ -0,0 +1,13 @@
+package cn.cslg.pas.mapper;
+
+import cn.cslg.pas.domain.ImportErrorLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 批量上传失败日志 Mapper 接口
+ *
+ * @author 沈永艺
+ * @since 2022-7-23
+ */
+public interface ImportErrorLogMapper extends BaseMapper<ImportErrorLog> {
+}

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

@@ -0,0 +1,7 @@
+package cn.cslg.pas.mapper;
+
+import cn.cslg.pas.domain.SystemDictAssociate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface SystemDictAssociateMapper extends BaseMapper<SystemDictAssociate> {
+}

+ 22 - 0
PAS/src/main/java/cn/cslg/pas/service/ImportErrorLogService.java

@@ -0,0 +1,22 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.domain.Area;
+import cn.cslg.pas.domain.ImportErrorLog;
+import cn.cslg.pas.mapper.ImportErrorLogMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+/**
+ * 批量上传失败日志 服务实现类
+ *
+ * @author 沈永艺
+ * @since 2022-7-23
+ */
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class ImportErrorLogService extends ServiceImpl<ImportErrorLogMapper, ImportErrorLog> {
+
+}

+ 31 - 14
PAS/src/main/java/cn/cslg/pas/service/PatentAffairService.java

@@ -1,6 +1,9 @@
 package cn.cslg.pas.service;
 
 import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.model.vo.KeyValueVO;
+import cn.cslg.pas.common.utils.JsonUtils;
+import cn.cslg.pas.common.utils.StringUtils;
 import cn.cslg.pas.domain.Patent;
 import cn.cslg.pas.domain.PatentAffair;
 import cn.cslg.pas.domain.SystemDict;
@@ -8,6 +11,9 @@ import cn.cslg.pas.common.utils.DateUtils;
 import cn.cslg.pas.mapper.PatentAffairMapper;
 import cn.cslg.pas.common.model.params.PatentAffairParams;
 import cn.cslg.pas.common.utils.PatentUtils;
+import cn.hutool.json.JSONObject;
+import com.alibaba.druid.support.json.JSONUtils;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -15,9 +21,9 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -42,10 +48,23 @@ public class PatentAffairService extends ServiceImpl<PatentAffairMapper, PatentA
         List<PatentAffair> dataList = this.list(queryWrapper);
         List<SystemDict> systemDictList = systemDictService.getSystemDictListByType(Arrays.asList(Constants.PATENT_STATUS, Constants.PATENT_SIMPLE_STATUS));
         dataList.forEach(item -> {
+            List<KeyValueVO> lst = JsonUtils.jsonToList(item.getContent(), KeyValueVO.class);
+            KeyValueVO flag;
+            for (int i = 0; i < Objects.requireNonNull(lst).size() - 1; i++) {
+                for (int j = 0; j < lst.size() - i - 1; j++) {
+                    if (DateUtils.strToDate(lst.get(j).getInpadocData().get(0).getContent()).compareTo(DateUtils.strToDate(lst.get(j + 1).getInpadocData().get(0).getContent())) < 0) {
+                        flag = lst.get(j);
+                        lst.set(j, lst.get(j + 1));
+                        lst.set(j + 1, flag);
+                    }
+                }
+            }
+            item.setInpadoc(lst);
             item.setCreateTime(DateUtils.formatDate(item.getDateTime(), DateUtils.YYYY_MM_DD));
             item.setCreateSimpleStatus(systemDictList.stream().filter(systemDict -> systemDict.getType().equals(Constants.PATENT_SIMPLE_STATUS) && systemDict.getValue().equals(String.valueOf(item.getSimpleStatus()))).findFirst().orElse(new SystemDict()).getLabel());
             item.setCreateStatus(systemDictList.stream().filter(systemDict -> systemDict.getType().equals(Constants.PATENT_STATUS) && systemDict.getValue().equals(String.valueOf(item.getStatus()))).findFirst().orElse(new SystemDict()).getLabel());
         });
+
         return dataList;
     }
 
@@ -70,22 +89,20 @@ public class PatentAffairService extends ServiceImpl<PatentAffairMapper, PatentA
     }
 
     public void updatePatientAffair(PatentAffairParams params) {
-        if (params.getStatusList() != null && params.getStatusList().size() != 0) {
+        if (params.getStatusList() != null) {
             this.deleteByPatentId(params.getPatentId());
-            List<PatentAffair> dataList = params.getStatusList().stream().map(item -> {
-                PatentAffair patentAffair = new PatentAffair();
-                patentAffair.setPatentId(params.getPatentId());
-                patentAffair.setStatus(PatentUtils.getIntKeyByOrganType(item));
-                patentAffair.setContent(params.getContent());
-                patentAffair.setDateTime(params.getDateTime());
-                patentAffair.setSimpleStatus(params.getSimpleStatus());
-                return patentAffair;
-            }).collect(Collectors.toList());
-            this.saveOrUpdateBatch(dataList);
+            PatentAffair patentAffair = new PatentAffair();
+            patentAffair.setPatentId(params.getPatentId());
+            patentAffair.setStatus(params.getStatusList());
+            patentAffair.setContent(params.getContent());
+            patentAffair.setDateTime(params.getDateTime());
+            patentAffair.setSimpleStatus(params.getSimpleStatus());
+            this.saveOrUpdate(patentAffair);
         }
     }
 
     public void deleteByPatentId(Integer patentId) {
         this.remove(Wrappers.<PatentAffair>lambdaQuery().eq(PatentAffair::getPatentId, patentId));
     }
+
 }

+ 86 - 45
PAS/src/main/java/cn/cslg/pas/service/PatentApplicantService.java

@@ -1,15 +1,17 @@
 package cn.cslg.pas.service;
 
-import cn.cslg.pas.common.model.BaseEntity;
+import cn.cslg.pas.common.model.dto.AreaAddressDTO;
 import cn.cslg.pas.common.model.params.PatentApplicantAddressParams;
-import cn.cslg.pas.domain.*;
+import cn.cslg.pas.common.model.vo.PatentApplicantVO;
 import cn.cslg.pas.common.utils.DateUtils;
+import cn.cslg.pas.common.utils.PatentUtils;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.common.utils.StringUtils;
-import cn.cslg.pas.common.model.vo.PatentApplicantVO;
+import cn.cslg.pas.domain.PatentApplicant;
+import cn.cslg.pas.domain.PatentApplicantLink;
+import cn.cslg.pas.domain.PatentApplicantMergeLink;
+import cn.cslg.pas.domain.SystemDict;
 import cn.cslg.pas.mapper.PatentApplicantMapper;
-import cn.cslg.pas.common.model.dto.AreaAddressDTO;
-import cn.cslg.pas.common.utils.PatentUtils;
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -229,64 +231,103 @@ public class PatentApplicantService extends ServiceImpl<PatentApplicantMapper, P
         }
     }
 
+    /**
+     * @param name      权利人 通过分割符 | 分割后的List
+     * @param shortName 【标】权利人 通过分割符 | 分割后的List
+     */
     public List<Integer> updatePatentApplicant(List<String> name, List<String> shortName) {
+        //生成 一个存放ID的List
         List<Integer> ids = new ArrayList<>();
-        for (int i = 0; i < name.size(); i++) {
-            String s = i < shortName.size() ? shortName.get(i) : null;
-            LambdaQueryWrapper<PatentApplicant> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(PatentApplicant::getName, name.get(i));
-            queryWrapper.eq(PatentApplicant::getMerge, 0);
-            PatentApplicant temp = this.getOne(queryWrapper);
-            if (temp == null) {
-                temp = this.add(name.get(i), s);
-            } else if (s != null && !s.equals(temp.getShortName())) {
-                temp.setShortName(s);
-                temp.updateById();
+        if (name != null) {
+            for (int i = 0; i < name.size(); i++) {
+                String s = i < shortName.size() ? shortName.get(i) : null;
+                LambdaQueryWrapper<PatentApplicant> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(PatentApplicant::getName, name.get(i));
+                queryWrapper.eq(PatentApplicant::getMerge, 0);
+                PatentApplicant temp = this.getOne(queryWrapper);
+                if (temp == null) {
+                    temp = this.add(name.get(i), s);
+                } else if (s != null && !s.equals(temp.getShortName())) {
+                    temp.setShortName(s);
+                    temp.updateById();
+                }
+                ids.add(temp.getId());
+            }
+        } else {
+            for (String s : shortName) {
+                LambdaQueryWrapper<PatentApplicant> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(PatentApplicant::getName, "");
+                queryWrapper.eq(PatentApplicant::getShortName, s);
+                queryWrapper.eq(PatentApplicant::getMerge, 0);
+                PatentApplicant temp = this.getOne(queryWrapper);
+                if (temp == null) {
+                    temp = this.add("", s);
+                } else if (s != null && !s.equals(temp.getShortName())) {
+                    temp.setShortName(s);
+                    temp.updateById();
+                }
+                ids.add(temp.getId());
             }
-            ids.add(temp.getId());
         }
+
         return ids;
     }
 
     public void updatePatentApplicantAddress(PatentApplicantAddressParams params) {
+        //用专利ID获取数据 申请人ID 申请人类型 申请人顺序
         List<PatentApplicantLink> patentApplicantLinkList = patentApplicantLinkService.getPatentApplicantAttributesByPatentId(params.getPatentId());
+        //获取属于权利人的ID List 并且是第一位
         List<Integer> currentIds = patentApplicantLinkList.stream().filter(item -> item.getType().equals(1) && !item.getOrder().equals(0)).map(PatentApplicantLink::getApplicantId).collect(Collectors.toList());
         Integer firstCurrentId = patentApplicantLinkList.stream().filter(item -> item.getType().equals(1) && item.getOrder().equals(0)).map(PatentApplicantLink::getApplicantId).findFirst().orElse(null);
         List<Integer> originalIds = patentApplicantLinkList.stream().filter(item -> item.getType().equals(2) && item.getOrder().equals(0)).map(PatentApplicantLink::getApplicantId).collect(Collectors.toList());
+
         List<PatentApplicant> currentList = this.getPatentApplicantByIds(currentIds);
         PatentApplicant first = this.getById(firstCurrentId);
         List<PatentApplicant> originalList = this.getPatentApplicantByIds(originalIds);
-        if (StringUtils.isNotEmpty(params.getCurrentAddress())) {
-            currentList.forEach(item -> {
-                AreaAddressDTO dto = areaService.getAreaAddressDTO(params.getCurrentAddress());
-                item.setAddressStr(params.getCurrentAddress());
-                item.setProvinceId(dto.getProvinceId());
-                item.setCityId(dto.getCityId());
-                item.setAreaId(dto.getAreaId());
-                item.updateById();
-            });
+
+        if (params.getCurrentAddress() != null) {
+            for (int i = 0; i < params.getCurrentAddress().size(); i++) {
+                int finalI = i;
+                currentList.forEach(item -> {
+                    AreaAddressDTO dto = areaService.getAreaAddressDTO(params.getCurrentAddress().get(finalI));
+                    item.setAddressStr(params.getCurrentAddress().get(finalI));
+                    item.setProvinceId(dto.getProvinceId());
+                    item.setCityId(dto.getCityId());
+                    item.setAreaId(dto.getAreaId());
+                    item.updateById();
+                });
+            }
         }
-        if (StringUtils.isNotEmpty(params.getCurrentCountry())) {
-            currentList.forEach(item -> {
-                item.setCountry(params.getCurrentCountry());
-                item.updateById();
-            });
+        if (params.getCurrentCountry() != null) {
+            for (int i = 0; i < params.getCurrentCountry().size(); i++) {
+                int finalI = i;
+                currentList.forEach(item -> {
+                    item.setCountry(params.getCurrentCountry().get(finalI));
+                    item.updateById();
+                });
+            }
         }
-        if (StringUtils.isNotEmpty(params.getOriginalAddress())) {
-            originalList.forEach(item -> {
-                AreaAddressDTO dto = areaService.getAreaAddressDTO(params.getOriginalAddress());
-                item.setAddressStr(params.getOriginalAddress());
-                item.setProvinceId(dto.getProvinceId());
-                item.setCityId(dto.getCityId());
-                item.setAreaId(dto.getAreaId());
-                item.updateById();
-            });
+        if (params.getOriginalAddress() != null) {
+            for (int i = 0; i < params.getOriginalAddress().size(); i++) {
+                int finalI = i;
+                originalList.forEach(item -> {
+                    AreaAddressDTO dto = areaService.getAreaAddressDTO(params.getOriginalAddress().get(finalI));
+                    item.setAddressStr(params.getOriginalAddress().get(finalI));
+                    item.setProvinceId(dto.getProvinceId());
+                    item.setCityId(dto.getCityId());
+                    item.setAreaId(dto.getAreaId());
+                    item.updateById();
+                });
+            }
         }
-        if (StringUtils.isNotEmpty(params.getOriginalCountry())) {
-            originalList.forEach(item -> {
-                item.setCountry(params.getOriginalCountry());
-                item.updateById();
-            });
+        if (params.getOriginalCountry() != null) {
+            for (int i = 0; i < params.getOriginalCountry().size(); i++) {
+                int finalI = i;
+                originalList.forEach(item -> {
+                    item.setCountry(params.getOriginalCountry().get(finalI));
+                    item.updateById();
+                });
+            }
         }
         if (StringUtils.isNotEmpty(params.getFirstCurrentAddress()) && first != null) {
             AreaAddressDTO dto = areaService.getAreaAddressDTO(params.getFirstCurrentAddress());

+ 4 - 4
PAS/src/main/java/cn/cslg/pas/service/PatentFieldService.java

@@ -116,7 +116,7 @@ public class PatentFieldService {
             add(new PatentField("37-0", "专利类型", Constants.SYSTEM_FIELD_QUERY, 16));
             add(new PatentField("29-17", "申请人国家", Constants.SYSTEM_FIELD_QUERY, 17));
             add(new PatentField("29-18", "申请人地区", Constants.SYSTEM_FIELD_QUERY, 18));
-            add(new PatentField("36-0", "简单法律状态", Constants.SYSTEM_FIELD_QUERY, 19));
+            add(new PatentField("36-0", "专利状态", Constants.SYSTEM_FIELD_QUERY, 19));
             add(new PatentField("40-0", "法律事件", Constants.SYSTEM_FIELD_QUERY, 20));
             add(new PatentField("26-12", "公开年", Constants.SYSTEM_FIELD_QUERY, 21));
             add(new PatentField("54-0", "标签", Constants.SYSTEM_FIELD_QUERY, 22));
@@ -137,7 +137,7 @@ public class PatentFieldService {
             add(new PatentField("bureau", "受理局", Constants.SYSTEM_FIELD_EXPORT, 13));
             add(new PatentField("simplefamily", "简单同族", Constants.SYSTEM_FIELD_EXPORT, 14));
             add(new PatentField("inpadocfamily", "Inpadoc同族", Constants.SYSTEM_FIELD_EXPORT, 15));
-            add(new PatentField("patsnapfamily", "PatSnap同族", Constants.SYSTEM_FIELD_EXPORT, 15));
+            add(new PatentField("patsnapfamily", "扩展同族", Constants.SYSTEM_FIELD_EXPORT, 15));
             add(new PatentField("intclassno", "IPC主分类号", Constants.SYSTEM_FIELD_EXPORT, 16));
             add(new PatentField("ipc", "IPC分类号", Constants.SYSTEM_FIELD_EXPORT, 16));
             add(new PatentField("intclasscpcno", "CPC分类号", Constants.SYSTEM_FIELD_EXPORT, 17));
@@ -181,7 +181,7 @@ public class PatentFieldService {
             add(new PatentField("manual", "说明书", Constants.SYSTEM_FIELD_EXPORT, 49));
             add(new PatentField("simplefamilynum", "简单同族数量", Constants.SYSTEM_FIELD_EXPORT, 50));
             add(new PatentField("inpadocfamilynum", "Inpadoc同族数量", Constants.SYSTEM_FIELD_EXPORT, 51));
-            add(new PatentField("patsnapfamilynum", "PatSnap同族数量", Constants.SYSTEM_FIELD_EXPORT, 51));
+            add(new PatentField("patsnapfamilynum", "扩展同族数量", Constants.SYSTEM_FIELD_EXPORT, 51));
             add(new PatentField("quoteno", "引用专利数量", Constants.SYSTEM_FIELD_EXPORT, 52));
             add(new PatentField("quotedno", "被引用数量", Constants.SYSTEM_FIELD_EXPORT, 53));
             add(new PatentField("quotedno3", "三年内被引用数量", Constants.SYSTEM_FIELD_EXPORT, 54));
@@ -206,7 +206,7 @@ public class PatentFieldService {
             add(new PatentField("label", "标签", Constants.SYSTEM_FIELD_PATENT_LIST, 9));
             add(new PatentField("simpleFamily", "简单同族", Constants.SYSTEM_FIELD_PATENT_LIST, 10));
             add(new PatentField("inpadocFamily", "Inpadoc同族", Constants.SYSTEM_FIELD_PATENT_LIST, 11));
-            add(new PatentField("patSnapFamily", "PatSnap同族", Constants.SYSTEM_FIELD_PATENT_LIST, 11));
+            add(new PatentField("patSnapFamily", "扩展同族", Constants.SYSTEM_FIELD_PATENT_LIST, 11));
             add(new PatentField("ipcList", "IPC分类号", Constants.SYSTEM_FIELD_PATENT_LIST, 12));
             add(new PatentField("cpcList", "CPC分类号", Constants.SYSTEM_FIELD_PATENT_LIST, 13));
             add(new PatentField("upcList", "UPC分类号", Constants.SYSTEM_FIELD_PATENT_LIST, 14));

+ 4 - 4
PAS/src/main/java/cn/cslg/pas/service/PatentImageService.java

@@ -1,7 +1,6 @@
 package cn.cslg.pas.service;
 
 import cn.cslg.pas.common.core.base.Constants;
-import cn.cslg.pas.common.model.BaseEntity;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.common.model.dto.UploadFileDTO;
 import cn.cslg.pas.domain.Patent;
@@ -19,13 +18,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -66,13 +62,17 @@ public class PatentImageService extends ServiceImpl<PatentImageMapper, PatentIma
     }
 
     public String updatePatentImage(Integer patentId, PictureData pictureData) throws IOException {
+        //先删除该专利号下的对应摘要图片 以免上传重复
         this.deleteByPatentIdAndStatus(patentId, 1);
+        //将文件生成到文件夹下 并将 文件名 和 文件路径 返回出来
         Map<String, String> result = ExcelUtils.savePicture(pictureData);
+        //装配数据
         PatentImage patentImage = new PatentImage();
         patentImage.setStatus(1);
         patentImage.setPatentId(patentId);
         patentImage.setUrl(result.get("path"));
         patentImage.setFileName(result.get("name"));
+        //插入对应数据
         patentImage.insert();
         return patentImage.getUrl();
     }

+ 33 - 10
PAS/src/main/java/cn/cslg/pas/service/PatentInventorService.java

@@ -22,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -189,16 +190,27 @@ public class PatentInventorService extends ServiceImpl<PatentInventorMapper, Pat
 
     public void updatePatentInventor(PatentInventorParams params) {
         if (params.getNameList() != null && params.getNameList().size() != 0) {
-            List<PatentInventor> dataList = params.getNameList().stream().map(name -> {
-                PatentInventor patentInventor = this.getPatentInventorByName(name);
+            List<PatentInventor> dataList = new ArrayList<>();
+            for (int i = 0; i < params.getNameList().size(); i++) {
+                PatentInventor patentInventor = this.getPatentInventorByName(params.getNameList().get(i));
                 if (patentInventor == null) {
                     patentInventor = new PatentInventor();
                 }
-                patentInventor.setName(name);
+                patentInventor.setName(params.getNameList().get(i));
                 patentInventor.setMerge(false);
-                patentInventor.setType(PatentUtils.getIntKeyByOrganType(name));
-                return patentInventor;
-            }).collect(Collectors.toList());
+                if (params.getAddressList().size() > i) {
+                    patentInventor.setAddress(params.getAddressList().get(i));
+                    if (params.getAddressList().get(i).substring(params.getAddressList().get(i).lastIndexOf(",") + 1).replaceAll(" ", "").length() == 2) {
+                        patentInventor.setCountry(params.getAddressList().get(i).substring(params.getAddressList().get(i).lastIndexOf(",") + 1).replaceAll(" ", ""));
+                    }
+                } else {
+                    if (patentInventor.getAddress() == null || patentInventor.getAddress().equals("")) {
+                        patentInventor.setAddress("");
+                        patentInventor.setCountry("");
+                    }
+                }
+                dataList.add(patentInventor);
+            }
             this.saveOrUpdateBatch(dataList);
             PatentInventor first = dataList.stream().filter(item -> item.getName().equals(params.getFirstName())).findFirst().orElse(null);
             patentInventorLinkService.updatePatentInventLink(dataList.stream().map(PatentInventor::getId).collect(Collectors.toList()), params.getPatentId(), first == null ? 0 : first.getId());
@@ -207,16 +219,27 @@ public class PatentInventorService extends ServiceImpl<PatentInventorMapper, Pat
 
     public void updatePatentInventorAddress(PatentInventorAddressParams params) {
         List<PatentInventor> patentInventorList = this.getPatentInventorByPatentId(params.getPatentId());
-        if (StringUtils.isNotEmpty(params.getAddress())) {
-            patentInventorList.forEach(item -> item.setAddress(params.getAddress()));
-            this.saveOrUpdateBatch(patentInventorList);
+
+        for (int i = 0; i < params.getAddress().size(); i++) {
+            if (StringUtils.isNotEmpty(params.getAddress().get(i))) {
+                patentInventorList.get(i).setAddress(params.getAddress().get(i));
+                if (params.getAddress().get(i).substring(params.getAddress().get(i).lastIndexOf(",") + 1).length() == 2) {
+                    patentInventorList.get(i).setCountry(params.getAddress().get(i).substring(params.getAddress().get(i).lastIndexOf(",") + 1).replaceAll(" ", ""));
+                } else {
+                    patentInventorList.get(i).setCountry("");
+                }
+
+            }
         }
+        this.saveOrUpdateBatch(patentInventorList);
         if (StringUtils.isNotEmpty(params.getFirstAddress())) {
             PatentInventor patentInventor = patentInventorList.stream().filter(PatentInventor::getFirst).findFirst().orElse(null);
             if (patentInventor != null) {
-                patentInventor.setAddress(params.getFirstAddress());
+                patentInventor.setAddress(params.getFirstAddress().replaceAll(" ", ""));
+                patentInventor.setCountry(params.getFirstAddress().substring(params.getFirstAddress().lastIndexOf(",") + 1).replaceAll(" ", ""));
                 patentInventor.updateById();
             }
         }
     }
+
 }

+ 4 - 0
PAS/src/main/java/cn/cslg/pas/service/PatentRightService.java

@@ -61,10 +61,14 @@ public class PatentRightService extends ServiceImpl<PatentRightMapper, PatentRig
 
     public void updatePatentRight(PatentRightParams params) {
         List<PatentRight> patentRightList = new ArrayList<>();
+        //获取国家 公开号前两位
         String country = PatentUtils.getPatentCountry(params.getPatentNo());
         String code;
+        //权利要求
         String content = params.getContent();
+        //权利要求(译)
         String contentOut = params.getContentOut();
+        //独立权利要求
         String selfContent = params.getSelfContent();
         if (StringUtils.isNotEmpty(content)) {
             this.deleteByPatentId(params.getPatentId());

+ 58 - 10
PAS/src/main/java/cn/cslg/pas/service/PatentService.java

@@ -157,13 +157,27 @@ public class PatentService extends ServiceImpl<PatentMapper, Patent> {
         Integer maxv = source.getMax().getValue();
         queryWrapper.lambda().in(Patent::getId, ids);
         switch (field) {
-            case 32: column = "quoteno"; break;
-            case 33: column = "quotedno"; break;
-            case 34: column = "inpadocfamilynum"; break;
-            case 35: column = "simplefamilynum"; break;
-            case 55: column = "patsnapfamilynum"; break;
-            case 38: column = "num2"; break;
-            case 39: column = "num3"; break;
+            case 32:
+                column = "quoteno";
+                break;
+            case 33:
+                column = "quotedno";
+                break;
+            case 34:
+                column = "inpadocfamilynum";
+                break;
+            case 35:
+                column = "simplefamilynum";
+                break;
+            case 55:
+                column = "patsnapfamilynum";
+                break;
+            case 38:
+                column = "num2";
+                break;
+            case 39:
+                column = "num3";
+                break;
             default:
                 List<Integer> patentIds = baseMapper.getCustomFieldCount(ids, field, options.get(mino), options.get(maxo), minv, maxv);
                 return StringUtils.join(patentIds.stream().distinct().collect(Collectors.toList()), ",");
@@ -190,9 +204,15 @@ public class PatentService extends ServiceImpl<PatentMapper, Patent> {
         }
         queryWrapper.in(Patent::getId, ids);
         switch (field) {
-            case 25: queryWrapper.between(Patent::getApplicationDate, startDate, endDate); break;
-            case 26: queryWrapper.between(Patent::getPublicDate, startDate, endDate); break;
-            case 27: queryWrapper.between(Patent::getPublicAccreditDate, startDate, endDate); break;
+            case 25:
+                queryWrapper.between(Patent::getApplicationDate, startDate, endDate);
+                break;
+            case 26:
+                queryWrapper.between(Patent::getPublicDate, startDate, endDate);
+                break;
+            case 27:
+                queryWrapper.between(Patent::getPublicAccreditDate, startDate, endDate);
+                break;
             default:
                 List<Integer> patentIds = baseMapper.getCustomFieldTime(ids, field, startDate, endDate);
                 return StringUtils.join(patentIds.stream().distinct().collect(Collectors.toList()), ",");
@@ -448,6 +468,30 @@ public class PatentService extends ServiceImpl<PatentMapper, Patent> {
         BeanUtils.copyProperties(patent, patentDTO);
         List<SystemDict> systemDictList = systemDictService.getSystemDictListByType(Arrays.asList(Constants.PATENT_TYPE, Constants.PATENT_SIMPLE_STATUS, Constants.COUNTRIES));
         List<PatentClassNumberLink> patentClassNumberLinkList = patentClassNumberLinkService.getPatentClassNumberLinkByPatentIds(Collections.singletonList(id));
+
+
+        if (patent.getPriorityNo() != null) {
+            patentDTO.setPriorityNo(patent.getPriorityNo());
+        } else {
+            patentDTO.setPriorityNo("");
+        }
+
+        if (patent.getPriorityCountry() != null) {
+            if (patent.getPriorityCountry().contains("\\|")) {
+                List<String> countryList = StringUtils.changeStringToString(patent.getPriorityCountry().replaceAll(" ", ""), "\\|");
+                patentDTO.setPriorityCountry(countryList);
+            } else if (patent.getPriorityCountry().contains(",")) {
+                List<String> countryList = StringUtils.changeStringToString(patent.getPriorityCountry().replaceAll(" ", ""), ",");
+                patentDTO.setPriorityCountry(countryList);
+            } else if (patent.getPriorityCountry().contains(";")) {
+                List<String> countryList = StringUtils.changeStringToString(patent.getPriorityCountry().replaceAll(" ", ""), ";");
+                patentDTO.setPriorityCountry(countryList);
+            }
+        } else {
+            patentDTO.setPriorityCountry(Collections.singletonList(""));
+        }
+
+
         patentDTO.setApplicationDate(DateUtils.formatDate(patent.getApplicationDate(), DateUtils.YYYY_MM_DD));
         patentDTO.setPriorityDate(DateUtils.formatDate(patent.getPriorityDate(), DateUtils.YYYY_MM_DD));
         patentDTO.setPublicDate(DateUtils.formatDate(patent.getPublicDate(), DateUtils.YYYY_MM_DD));
@@ -460,6 +504,10 @@ public class PatentService extends ServiceImpl<PatentMapper, Patent> {
         patentDTO.setInventor(patentInventorService.getPatentInventorByPatentId(patent.getId()));
         if (StringUtils.isNotEmpty(patent.getAgencyId())) {
             patentDTO.setAgency(patentAgencyService.getPatentAgencyById(Integer.parseInt(patent.getAgencyId())));
+        } else {
+            PatentAgency patentAgency = new PatentAgency();
+            patentAgency.setName("");
+            patentDTO.setAgency(patentAgency);
         }
         patentDTO.setAgent(patentAgentService.getPatentAgentByPatentId(patent.getId()));
         patentDTO.setAffair(patentAffairService.getPatentAffairByPatentId(patent.getId()));

+ 9 - 0
PAS/src/main/java/cn/cslg/pas/service/PatentSimpleFamilyService.java

@@ -84,11 +84,16 @@ public class PatentSimpleFamilyService extends ServiceImpl<PatentSimpleFamilyMap
     }
 
     public void updateData(List<String> familyNo, String patentNo, Integer patentId, Integer type) {
+        //两个表 1.同族表 2.同组关联专利表
+        //用专利号 获取同族关联专利表的信息
         List<PatentSimpleFamilyLink> patentSimpleFamilyLinkList = patentSimpleFamilyLinkService.getPatentSimpleFamilyLinkByPatentNo(patentNo);
         PatentSimpleFamily family;
+
         if (patentSimpleFamilyLinkList == null || patentSimpleFamilyLinkList.size() == 0) {
+            //如果 同组关联专利表 内没有数据 就新建一条 同族表 的数据
             family = this.add(type);
         } else {
+            //如果 同组关联专利表 内有数据 那么用查询出来的List中的 同族表 的ID来获取 同族表 内的其他对应信息
             PatentSimpleFamily patentSimpleFamily = this.getPatentSimpleFamilyByIdsAndType(patentSimpleFamilyLinkList.stream().map(PatentSimpleFamilyLink::getFamilyId).collect(Collectors.toList()), type);
             if (patentSimpleFamily == null) {
                 family = this.add(type);
@@ -107,6 +112,8 @@ public class PatentSimpleFamilyService extends ServiceImpl<PatentSimpleFamilyMap
                 temp.setFamilyId(family.getId());
                 temp.updateById();
             }
+
+
             Patent patent1 = patentService.getPublicDateAndPatentNoByPatentNo(patent);
             Patent patent2 = patentService.getPublicDateAndPatentNoByPatentNo(family.getPatentNo());
             if (patent1 != null) {
@@ -139,6 +146,8 @@ public class PatentSimpleFamilyService extends ServiceImpl<PatentSimpleFamilyMap
                 family.setPatentNo(patent2.getPatentNo());
                 patent2.updateById();
             }
+
+
             if (StringUtils.isEmpty(family.getPatentNo())) {
                 family.setPatentNo(patent);
             } else {

+ 17 - 6
PAS/src/main/java/cn/cslg/pas/service/ProjectFieldService.java

@@ -1,18 +1,15 @@
 package cn.cslg.pas.service;
 
-import cn.cslg.pas.common.core.base.EStatus;
-import cn.cslg.pas.common.model.BaseEntity;
 import cn.cslg.pas.common.model.dto.PatentDTO;
+import cn.cslg.pas.common.model.vo.ProjectFieldVO;
+import cn.cslg.pas.common.model.vo.UploadSettingVO;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.domain.*;
 import cn.cslg.pas.mapper.ProjectFieldMapper;
-import cn.cslg.pas.common.model.vo.ProjectFieldVO;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.lang.tree.Tree;
-import cn.hutool.core.lang.tree.TreeUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
@@ -42,6 +39,7 @@ public class ProjectFieldService extends ServiceImpl<ProjectFieldMapper, Project
     private final ProjectFieldTextService projectFieldTextService;
     private final ProjectFieldPatentLinkService projectFieldPatentLinkService;
     private final PatentService patentService;
+    private final FileUtils fileUtils;
 
     public List<PatentDTO.Field> getPatentFieldByPatentIdAndProjectId(Integer projectId, Integer patentId) {
         List<PatentDTO.Field> dataList = new ArrayList<>();
@@ -185,6 +183,19 @@ public class ProjectFieldService extends ServiceImpl<ProjectFieldMapper, Project
         result.put("index", indexs);
         result.put("classify", classifys);
         result.put("folder", projectFolderService.getProjectFolderTreeNode(projectId, folderList));
+
+        //数据源名称
+        String getSettingJson = fileUtils.analysisJsonFile();
+        List<UploadSettingVO> settingJsonList = JsonUtils.jsonToList(getSettingJson, UploadSettingVO.class);
+        List<ProjectField.dataType> dataTypesLst = new ArrayList<>();
+        Objects.requireNonNull(settingJsonList).forEach(item -> {
+            ProjectField.dataType dataType = new ProjectField.dataType();
+            dataType.setId(item.getSourceId());
+            dataType.setName(item.getName());
+            dataTypesLst.add(dataType);
+        });
+        result.put("dataType", dataTypesLst);
+
         return result;
     }
 
@@ -478,7 +489,7 @@ public class ProjectFieldService extends ServiceImpl<ProjectFieldMapper, Project
         projectFieldList.add(this.buildProjectFieldEntity(33, "被引用专利数量", 94, 3));
         projectFieldList.add(this.buildProjectFieldEntity(34, "inpadoc同族数量", 94, 3));
         projectFieldList.add(this.buildProjectFieldEntity(35, "简单同族数量", 94, 3));
-        projectFieldList.add(this.buildProjectFieldEntity(55, "PatSnap同族数量", 94, 3));
+        projectFieldList.add(this.buildProjectFieldEntity(55, "扩展同族数量", 94, 3));
         projectFieldList.add(this.buildProjectFieldEntity(36, "法律状态", 95, 1));
         projectFieldList.add(this.buildProjectFieldEntity(37, "专利类型", 95, 1));
         projectFieldList.add(this.buildProjectFieldEntity(38, "权利要求数量", 95, 3));

+ 91 - 46
PAS/src/main/java/cn/cslg/pas/service/ProjectService.java

@@ -22,7 +22,6 @@ import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ZipUtil;
 import cn.hutool.extra.spring.SpringUtil;
-import cn.hutool.poi.excel.BigExcelWriter;
 import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
@@ -472,28 +471,48 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
             if (projectImportPatentVO != null) {
                 List<SystemDict> systemDictList = systemDictService.getSystemDictListByType(Arrays.asList(Constants.PATENT_TYPE, Constants.PATENT_SIMPLE_STATUS));
                 Map<String, PictureData> pictureDataMap = ExcelUtils.getDataFromExcel(params.getPath());
+
+
                 for (int i = 0; i < params.getRowList().size(); i++) {
                     Map<Object, Object> row = params.getRowList().get(i);
                     Object patentNo = row.get("公开(公告)号");
                     if (StringUtils.isNotNull(patentNo)) {
+                        PatentCustomFieldParams patentCustomFieldParams = new PatentCustomFieldParams();
+                        //用专利号查找专利的相关信息 并装配到 Patent 中
                         Patent patent = patentService.getByPatentNo(patentNo.toString());
+                        //法律状态/事件|INPADOC法律状态|法律状态更新时间|简单法律状态
                         PatentAffairParams patentAffairParams = new PatentAffairParams();
+                        //当前申请(专利权)人
                         List<String> patentApplicantCurrentName = new ArrayList<>();
+                        //原始申请(专利权)人
                         List<String> patentApplicantOriginalName = new ArrayList<>();
+                        //[标]当前申请(专利权)人
                         List<String> patentApplicantStandardCurrentName = new ArrayList<>();
+                        //[标]原始申请(专利权)人
                         List<String> patentApplicantStandardOriginalName = new ArrayList<>();
+                        //发明人|第一发明人
                         PatentInventorParams patentInventorParams = new PatentInventorParams();
+                        //简单同族|PatSnap同族|INPADOC同族
                         PatentSimpleFamilyParams patentSimpleFamilyParams = new PatentSimpleFamilyParams();
+                        //IPC分类号|UPC分类号|LOC分类号|CPC分类号|IPC主分类号|UPC主分类号
                         PatentClassNumberParams patentClassNumberParams = new PatentClassNumberParams();
-                        PatentCustomFieldParams patentCustomFieldParams = new PatentCustomFieldParams();
+                        //许可人|被许可人|许可类型
                         PatentLicensorParams patentLicensorParams = new PatentLicensorParams();
+                        //质押人|质权人
                         PatentPledgeParams patentPledgeParams = new PatentPledgeParams();
+                        //代理人
                         PatentAgentParams patentAgentParams = new PatentAgentParams();
+                        //当前申请(专利权)人地址|当前申请(专利权)人国家|当前第一申请(专利权)人地址|原始申请(专利权)人地址|原始申请(专利权)人国家
                         PatentApplicantAddressParams patentApplicantAddressParams = new PatentApplicantAddressParams();
+                        //发明人地址|第一发明人地址
                         PatentInventorAddressParams patentInventorAddressParams = new PatentInventorAddressParams();
+                        //说明书|说明书(译)
                         PatentInstructionTextParams patentInstructionTextParams = new PatentInstructionTextParams();
+                        //权利要求|独立权利要求|权利要求(译)
                         PatentRightParams patentRightParams = new PatentRightParams();
+                        //标签
                         PatentLabelParams patentLabelParams = new PatentLabelParams();
+
                         if (patent == null) {
                             patent = new Patent();
                             patent.setPatentNo(patentNo.toString());
@@ -523,7 +542,9 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
                             if (key.equals("摘要附图")) {
                                 PictureData pictureData = pictureDataMap.get(String.valueOf(i + 1));
                                 if (pictureData != null) {
+                                    //1.先把Excel里的图片存到文件夹里 路径大致是 ../target/file/时间/文件.png 2.生成完文件并存完后 将文件的路径和名称存到表里 OS_PATENT_IMAGE 然后最终得到摘要图片的存储路径
                                     String abstractPath = patentImageService.updatePatentImage(patent.getId(), pictureData);
+                                    //将路径进行装配
                                     patent.setAbstractPath(abstractPath);
                                 }
                             }
@@ -555,16 +576,16 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
                                         patentApplicantCurrentName.addAll(PatentUtils.formatValue(value.toString()));
                                         break;
                                     case "当前申请(专利权)人地址":
-                                        patentApplicantAddressParams.setCurrentAddress(value.toString());
+                                        //patentApplicantAddressParams.setCurrentAddress(value.toString());
                                         break;
                                     case "当前申请(专利权)人国家":
-                                        patentApplicantAddressParams.setCurrentCountry(value.toString());
+                                        //patentApplicantAddressParams.setCurrentCountry(value.toString());
                                         break;
                                     case "[标]当前申请(专利权)人":
                                         patentApplicantStandardCurrentName.addAll(PatentUtils.formatValue(value.toString()));
                                         break;
                                     case "法律状态/事件":
-                                        patentAffairParams.setStatusList(PatentUtils.formatValue(value.toString()));
+                                        //patentAffairParams.setStatusList(PatentUtils.formatValue(value.toString()));
                                         break;
                                     case "INPADOC法律状态":
                                         patentAffairParams.setContent(value.toString());
@@ -620,7 +641,7 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
                                         patentApplicantAddressParams.setFirstCurrentAddress(value.toString());
                                         break;
                                     case "发明人地址":
-                                        patentInventorAddressParams.setAddress(value.toString());
+                                        patentInventorAddressParams.setAddress(PatentUtils.formatValue(value.toString()));
                                         break;
                                     case "第一发明人地址":
                                         patentInventorAddressParams.setFirstAddress(value.toString());
@@ -629,10 +650,10 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
                                         patentApplicantOriginalName.addAll(PatentUtils.formatValue(value.toString()));
                                         break;
                                     case "原始申请(专利权)人地址":
-                                        patentApplicantAddressParams.setOriginalAddress(value.toString());
+                                        //patentApplicantAddressParams.setOriginalAddress(value.toString());
                                         break;
                                     case "原始申请(专利权)人国家":
-                                        patentApplicantAddressParams.setOriginalCountry(value.toString());
+                                        //patentApplicantAddressParams.setOriginalCountry(value.toString());
                                         break;
                                     case "[标]原始申请(专利权)人":
                                         patentApplicantStandardOriginalName.addAll(PatentUtils.formatValue(value.toString()));
@@ -656,6 +677,11 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
                                         patentRightParams.setContentOut(value.toString());
                                         break;
                                     case "权利要求数量":
+//                                        if ("该数据不支持导出".equals(value.toString())) {
+//                                            patent.setSelfRightContentNum(0);
+//                                        } else {
+//
+//                                        }
                                         patent.setSelfRightContentNum(Integer.parseInt(value.toString()));
                                         break;
                                     case "IPC分类号":
@@ -780,51 +806,69 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
                                 }
                             }
                         }
+
                         patent.updateById();
-                        patentRightService.updatePatentRight(patentRightParams);
-                        patentInstructionTextService.updatePatentInstructionText(patentInstructionTextParams);
-                        patentAgentService.updatePatentAgent(patentAgentParams);
-                        patentPledgeService.updatePatentPledge(patentPledgeParams);
-                        patentLicensorService.updatePatentLicensor(patentLicensorParams);
-                        patentAffairService.updatePatientAffair(patentAffairParams);
+                        //专利权利要求表
+                        //patentRightService.updatePatentRight(patentRightParams);
+                        //专利说明书(文本)
+                        //patentInstructionTextService.updatePatentInstructionText(patentInstructionTextParams);
+                        //代理人 (代理人关联专利)
+                        //patentAgentService.updatePatentAgent(patentAgentParams);
+                        //专利信息质押质权人
+                        //patentPledgeService.updatePatentPledge(patentPledgeParams);
+                        //专利信息许可人
+                        //patentLicensorService.updatePatentLicensor(patentLicensorParams);
+                        //专利信息事务信息
+                        //patentAffairService.updatePatientAffair(patentAffairParams);
+                        //权利人
                         patentApplicantLinkService.updatePatentApplicantLink(patentApplicantCurrentName, patentApplicantStandardCurrentName, 1, patent.getId());
+                        //申请人
                         patentApplicantLinkService.updatePatentApplicantLink(patentApplicantOriginalName, patentApplicantStandardOriginalName, 2, patent.getId());
+                        //申请人地址
                         patentApplicantService.updatePatentApplicantAddress(patentApplicantAddressParams);
+                        //发明人
                         patentInventorService.updatePatentInventor(patentInventorParams);
+                        //发明人地址
                         patentInventorService.updatePatentInventorAddress(patentInventorAddressParams);
-                        patentSimpleFamilyService.updatePatentSimpleFamily(patentSimpleFamilyParams);
-                        patentClassNumberLinkService.updatePatentClassNumberLink(patentClassNumberParams);
-                        projectPatentLinkService.updateProjectPatent(projectImportPatentVO.getProjectId(), patent.getId());
-                        projectFieldPatentLinkService.updateProjectFieldPatentLink(projectImportPatentVO, patent.getId());
-                        projectFolderPatentLinkService.updateProjectFolderLink(projectImportPatentVO, patent.getId());
-                        // TODO 性能问题
-                        patentService.updatePatentCustomField(patentCustomFieldParams);
-                        patentLabelService.updatePatentLabel(patentLabelParams);
-                        WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
-                                .setTaskId(params.getTaskId())
-                                .setProjectId(projectImportPatentVO.getProjectId())
-                                .setComplete(false)
-                                .setIndex(i)
-                                .setTaskType(Constants.TASK_IMPORT_PATENT)
-                                .setPercentage(total == 0 ? 0 : Math.round((total.equals(i) ? (i * 1D) : (i + 1D)) / total * 100D))
-                                .setFileName("")
-                                .setOldName(params.getOldName())
-                                .setUrl("")
-                                .setTotal(total), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), params.getUserId());
+                        //专利信息简单同族关联
+                        //patentSimpleFamilyService.updatePatentSimpleFamily(patentSimpleFamilyParams);
+                        //专利分类号关联
+                        //patentClassNumberLinkService.updatePatentClassNumberLink(patentClassNumberParams);
+                        //专题库关联专利信息
+                        //projectPatentLinkService.updateProjectPatent(projectImportPatentVO.getProjectId(), patent.getId());
+                        //标引内容关联专利信息
+                        //projectFieldPatentLinkService.updateProjectFieldPatentLink(projectImportPatentVO, patent.getId());
+                        //文件夹管理
+                        //projectFolderPatentLinkService.updateProjectFolderLink(projectImportPatentVO, patent.getId());
+                        //自定义字段
+                        //patentService.updatePatentCustomField(patentCustomFieldParams);
+                        //标签
+                        //patentLabelService.updatePatentLabel(patentLabelParams);
+//                        WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+//                                .setTaskId(params.getTaskId())
+//                                .setProjectId(projectImportPatentVO.getProjectId())
+//                                .setComplete(false)
+//                                .setIndex(i)
+//                                .setTaskType(Constants.TASK_IMPORT_PATENT)
+//                                .setPercentage(total == 0 ? 0 : Math.round((total.equals(i) ? (i * 1D) : (i + 1D)) / total * 100D))
+//                                .setFileName("")
+//                                .setOldName(params.getOldName())
+//                                .setUrl("")
+//                                .setTotal(total), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), params.getUserId());
                     }
                 }
-                SpringUtil.getBean(ProjectService.class).setImportPatentTaskStatus(2, params.getTaskId());
-                WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
-                        .setTaskId(params.getTaskId())
-                        .setProjectId(projectImportPatentVO.getProjectId())
-                        .setComplete(true)
-                        .setIndex(total)
-                        .setTaskType(Constants.TASK_IMPORT_PATENT)
-                        .setPercentage(100L)
-                        .setFileName("")
-                        .setOldName(params.getOldName())
-                        .setUrl("")
-                        .setTotal(total), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), params.getUserId());
+//                SpringUtil.getBean(ProjectService.class).setImportPatentTaskStatus(2, params.getTaskId());
+//                WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+//                        .setTaskId(params.getTaskId())
+//                        .setProjectId(projectImportPatentVO.getProjectId())
+//                        .setComplete(true)
+//                        .setIndex(total)
+//                        .setTaskType(Constants.TASK_IMPORT_PATENT)
+//                        .setPercentage(100L)
+//                        .setFileName("")
+//                        .setOldName(params.getOldName())
+//                        .setUrl("")
+//                        .setTotal(total), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), params.getUserId());
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -1085,6 +1129,7 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
         return sb.toString();
     }
 
+    //主页面 导出列表功能
     public void exportProject(HttpServletResponse response) {
         try {
             ProjectVO params = new ProjectVO();
@@ -1108,7 +1153,7 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
             OutputStream out = response.getOutputStream();
             writer.write(rows, true);
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
-            response.setHeader("Content-Disposition","attachment;filename=" + IdUtil.simpleUUID() + ".xlsx");
+            response.setHeader("Content-Disposition", "attachment;filename=" + IdUtil.simpleUUID() + ".xlsx");
             writer.flush(out, true);
             writer.close();
             IoUtil.close(out);

+ 62 - 0
PAS/src/main/java/cn/cslg/pas/service/SystemDictAssociateService.java

@@ -0,0 +1,62 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.domain.SystemDictAssociate;
+import cn.cslg.pas.mapper.SystemDictAssociateMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author 沈永艺
+ * @date 2022.6.22
+ * @description 获取字典项 (应用场景 与 调查类型) 的业务逻辑处理层
+ */
+
+@Service
+public class SystemDictAssociateService extends ServiceImpl<SystemDictAssociateMapper, SystemDictAssociate> {
+    /**
+     * @param value 父项(应用场景) 参数 Value 值
+     * @param type  字典项(应用场景) Key 值
+     * @param flag  查询标记 1为in操作查询 0为 notIn操作查询
+     * @return 返回一个 SystemDictAssociate 类型的 List
+     * @author 沈永艺
+     * @date 2022.6.21
+     * @description 通过传入Value值参数 以及Type(Key) 值 对 应用场景和调查类型之间的关联关系做业务查询
+     */
+    public List<SystemDictAssociate> getDictTreeByParentDictValue(List<String> value, String type, Integer flag) {
+        LambdaQueryWrapper<SystemDictAssociate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(SystemDictAssociate::getDictChildLabel, SystemDictAssociate::getDictChildType, SystemDictAssociate::getDictChildValue);
+        List<SystemDictAssociate> systemDictAssociateList;
+
+        if (flag == 1) {
+            if (value == null || value.isEmpty()) {
+                return new ArrayList<>();
+            }
+            queryWrapper.in(SystemDictAssociate::getDictParentValue, value).eq(SystemDictAssociate::getDictParentType, type);
+        } else if (flag == 0) {
+            LambdaQueryWrapper<SystemDictAssociate> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.select(SystemDictAssociate::getDictChildLabel, SystemDictAssociate::getDictChildType, SystemDictAssociate::getDictChildValue);
+            queryWrapper1.in(SystemDictAssociate::getDictParentValue, value).eq(SystemDictAssociate::getDictParentType, type);
+            List<SystemDictAssociate> systemDictAssociateList1 = this.list(queryWrapper1).stream().distinct().collect(Collectors.toList());
+
+            queryWrapper.notIn(SystemDictAssociate::getDictParentValue, value).eq(SystemDictAssociate::getDictParentType, type);
+            List<SystemDictAssociate> systemDictAssociateList2 = this.list(queryWrapper).stream().distinct().collect(Collectors.toList());
+
+            for (int i = 0; i < systemDictAssociateList1.size(); i++) {
+                for (int j = 0; j < systemDictAssociateList2.size(); j++) {
+                    int finalI = i;
+                    systemDictAssociateList2.removeIf(a -> a.getDictChildLabel().equals(systemDictAssociateList1.get(finalI).getDictChildLabel()));
+                }
+            }
+
+            return systemDictAssociateList2;
+        }
+        systemDictAssociateList = this.list(queryWrapper).stream().distinct().collect(Collectors.toList());
+        return systemDictAssociateList;
+    }
+
+}

+ 2 - 0
PAS/src/main/java/cn/cslg/pas/service/SystemDictService.java

@@ -1,6 +1,7 @@
 package cn.cslg.pas.service;
 
 import cn.cslg.pas.domain.SystemDict;
+import cn.cslg.pas.domain.SystemDictAssociate;
 import cn.cslg.pas.mapper.SystemDictMapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -42,4 +43,5 @@ public class SystemDictService extends ServiceImpl<SystemDictMapper, SystemDict>
         }
         return "";
     }
+
 }

+ 424 - 0
PAS/src/main/java/cn/cslg/pas/service/UploadPatentBatchService.java

@@ -0,0 +1,424 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.model.dto.TaskWebSocketDTO;
+import cn.cslg.pas.common.model.params.*;
+import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
+import cn.cslg.pas.common.model.vo.TaskParams;
+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.mapper.ImportErrorLogMapper;
+import cn.hutool.extra.spring.SpringUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.poi.ss.usermodel.PictureData;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class UploadPatentBatchService {
+    private final FileUtils fileUtils;
+    private final SystemDictService systemDictService;
+    private final PatentImageService patentImageService;
+    private final PatentService patentService;
+    private final PatentAgencyService patentAgencyService;
+    private final PatentInstructionTextService patentInstructionTextService;
+    private final PatentRightService patentRightService;
+    private final PatentAgentService patentAgentService;
+    private final PatentPledgeService patentPledgeService;
+    private final PatentLicensorService patentLicensorService;
+    private final PatentSimpleFamilyService patentSimpleFamilyService;
+    private final PatentInventorService patentInventorService;
+    private final ProjectPatentLinkService projectPatentLinkService;
+    private final ProjectFieldPatentLinkService projectFieldPatentLinkService;
+    private final ProjectFolderPatentLinkService projectFolderPatentLinkService;
+    private final PatentApplicantLinkService patentApplicantLinkService;
+    private final PatentApplicantService patentApplicantService;
+    private final PatentLabelService patentLabelService;
+    private final PatentClassNumberLinkService patentClassNumberLinkService;
+    private final PatentAffairService patentAffairService;
+    private final ImportErrorLogMapper importErrorLogMapper;
+    private static int FLAG = 0;
+
+    @Async("singleThreadAsyncTaskExecutor")
+    public void uploadPatentBatch(TaskParams params, ProjectImportPatentVO projectImportPatentVO) {
+        Integer total = params.getRowList().size();
+        try {
+            //先解析Json文件 获得配置文件的Json串
+            String getSettingJson = fileUtils.analysisJsonFile();
+            //查找需求数据源的对应配置
+            List<UploadSettingVO.Column> jsonData = UploadPatentBatchUtil.parsingConfigurationFiles(projectImportPatentVO, getSettingJson);
+
+            Map<String, PictureData> pictureDataMap = ExcelUtils.getDataFromExcel(params.getPath());
+
+            //将数据进行装配并进行数据库操作
+            for (int i = 0; i < params.getRowList().size(); i++) {
+                //获取每一行的数据
+                Map<Object, Object> row = params.getRowList().get(i);
+                //基础数据装配
+                UploadParamsVO uploadParamsVO = UploadPatentBatchUtil.processData(row, jsonData);
+
+                //查询数据是否存在 如果存在 返回该条数据 如果不存在 新增一条数据
+                getOneOrInsertOne(uploadParamsVO);
+
+                //专利信息需要特殊处理部分
+                //专利信息(摘要附图)数据装配
+                PictureData pictureData = pictureDataMap.get(String.valueOf(i + 1));
+                if (uploadParamsVO.getPatent() != null) {
+                    if (uploadParamsVO.getPatent().getId() != null && pictureData != null) {
+                        uploadParamsVO.getPatent().setAbstractPath(patentImageService.updatePatentImage(uploadParamsVO.getPatent().getId(), pictureData));
+                    }
+                }
+                //专利信息(代理机构)数据装配
+                if (uploadParamsVO.getPatent() != null) {
+                    if (uploadParamsVO.getPatent().getAgencyId() != null) {
+                        uploadParamsVO.getPatent().setAgencyId(patentAgencyService.getAgencyStringIdByName(uploadParamsVO.getPatent().getAgencyId()));
+                    }
+
+                }
+                //将装配对象中的数据保存到数据库
+                dataToDB(params, uploadParamsVO, projectImportPatentVO);
+
+                //通过WebSocket 在每一次循环结束后 向前端发送完成进度
+                WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+                        .setTaskId(params.getTaskId())
+                        .setProjectId(projectImportPatentVO.getProjectId())
+                        .setComplete(false)
+                        .setIndex(i)
+                        .setTaskType(Constants.TASK_IMPORT_PATENT)
+                        .setPercentage(total == 0 ? 0 : Math.round((total.equals(i) ? (i * 1D) : (i + 1D)) / total * 100D))
+                        .setFileName("")
+                        .setOldName(params.getOldName())
+                        .setUrl("")
+                        .setTotal(total), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), params.getUserId());
+            }
+
+            SpringUtil.getBean(ProjectService.class).setImportPatentTaskStatus(2, params.getTaskId());
+            WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
+                    .setTaskId(params.getTaskId())
+                    .setProjectId(projectImportPatentVO.getProjectId())
+                    .setComplete(true)
+                    .setIndex(total)
+                    .setTaskType(Constants.TASK_IMPORT_PATENT)
+                    .setPercentage(100L)
+                    .setFileName("")
+                    .setOldName(params.getOldName())
+                    .setUrl("")
+                    .setTotal(total), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), params.getUserId());
+        } catch (Exception e) {
+            e.printStackTrace();
+            SpringUtil.getBean(ProjectService.class).setImportPatentTaskStatus(3, params.getTaskId());
+            if (FLAG > 0) {
+                int successCount = total - FLAG;
+                WebSocketServer.sendInfo(Response.error("部分数据上传成功" + "\n" + "成功条数:" + successCount + "失败条数:" + FLAG), params.getUserId());
+            }
+            FLAG = 0;
+        }
+    }
+
+    /**
+     * @param uploadParamsVO 全局类
+     * @date 2022-7-11
+     * @name 数据库交互
+     * @description 将装配完毕的VO类向数据库中不同的表进行添加或修改操作
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void dataToDB(TaskParams params, UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
+        try {
+            //专利信息 OS_PATENT
+            if (uploadParamsVO.getPatent() != null) {
+                List<SystemDict> systemDictList = systemDictService.getSystemDictListByType(Collections.singletonList(Constants.PATENT_SIMPLE_STATUS));
+                Integer simpleStatus = Integer.parseInt(systemDictList.stream()
+                        .filter(systemDict -> systemDict.getType().equals(Constants.PATENT_SIMPLE_STATUS) && systemDict.getLabel().equals(uploadParamsVO.getPatentSimpleStatus()))
+                        .findFirst()
+                        .orElse(new SystemDict()).getValue());
+                uploadParamsVO.getPatent().setSimpleStatus(simpleStatus);
+                uploadParamsVO.getPatent().updateById();
+            }
+            //权利要求 OS_PATENT_RIGHT
+            patentRightBusiness(uploadParamsVO);
+            //说明书(文本) OS_PATENT_INSTRUCTION_TEXT
+            if (uploadParamsVO.getPatentInstructionText() != null) {
+                patentInstructionTextBusiness(uploadParamsVO);
+            }
+            //代理人 OS_PATENT_AGENT
+            if (uploadParamsVO.getPatentAgentList() != null) {
+                patentAgentBusiness(uploadParamsVO);
+            }
+            //质押质权人 OS_PATENT_PLEDGE
+            if (uploadParamsVO.getPatentPledgeList() != null) {
+                patentPledgeBusiness(uploadParamsVO);
+            }
+            //许可人 OS_PATENT_LICENSOR
+            if (uploadParamsVO.getPatentLicensorList() != null) {
+                patentLicensorBusiness(uploadParamsVO);
+            }
+            //简单同族 OS_PATENT_SIMPLEFAMILY
+            patentSimplyFamilyBusiness(uploadParamsVO);
+            //发明人 OS_PATENT_INVENTOR
+            patentInventorBusiness(uploadParamsVO);
+            //申请人(原始)/权利人(当前) OS_PATENT_APPLICATION || OS_APPLICATION_ATTR
+            if (uploadParamsVO.getPatentApplicantStandardCurrentName() != null && uploadParamsVO.getPatentApplicantOriginalName() != null && uploadParamsVO.getPatentApplicantStandardOriginalName() != null) {
+                patentApplicationBusiness(uploadParamsVO);
+            }
+            //申请人地址 OS_PATENT_APPLICATION
+            patentApplicationAddressBusiness(uploadParamsVO);
+            //专题库关联专利信息 OS_THEMATIC_PID
+            if (uploadParamsVO.getPatent() != null) {
+                patentThematicPidBusiness(uploadParamsVO, projectImportPatentVO);
+            }
+            //标引内容关联专利信息 OS_PATENT_FIELD_PATENT_LINK
+            if (uploadParamsVO.getPatent() != null) {
+                patentProjectFieldPatentLinkBusiness(uploadParamsVO, projectImportPatentVO);
+            }
+            //文件夹管理 OS_PORTFOLIO_LINK
+            if (uploadParamsVO.getPatent() != null) {
+                patentProjectFolderPatentLinkBusiness(uploadParamsVO, projectImportPatentVO);
+            }
+            //标签 OS_PATENT_LABEL
+            if (uploadParamsVO.getPatentLabelList() != null) {
+                patentLabelBusiness(uploadParamsVO, projectImportPatentVO);
+            }
+            //分类号关联 OS_PATENT_TYPENO
+            patentTypeNoBusiness(uploadParamsVO);
+            //事务信息 OS_PATENT_AFFAIR
+            patentAffairBusiness(uploadParamsVO);
+            //自定义字段
+            if (uploadParamsVO.getKey() != null && uploadParamsVO.getFieldList() != null) {
+                patentFieldBusiness(params, uploadParamsVO, projectImportPatentVO);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            if (uploadParamsVO.getPatent() != null) {
+                ImportErrorLog importErrorLog = new ImportErrorLog();
+                importErrorLog.setPatentId(uploadParamsVO.getPatent().getId())
+                        .setPatentNo(uploadParamsVO.getPatent().getPatentNo())
+                        .setCreateTime(new SimpleDateFormat("yyyy-MM-dd 24HI:mm:ss").format(new Date()))
+                        .setCreateUserId(Integer.parseInt(params.getUserId()))
+                        .setMistakeMessage(e.getMessage())
+                        .setProjectId(params.getProjectId());
+                importErrorLogMapper.insert(importErrorLog);
+                FLAG += 1;
+            }
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+    }
+
+    /**
+     * @param uploadParamsVO 全局类
+     * @date 2022-7-11
+     * @name 工具方法
+     * @description 查询数据是否存在 如果存在 返回该条数据 如果不存在 新增一条数据
+     */
+    private void getOneOrInsertOne(UploadParamsVO uploadParamsVO) {
+        if (uploadParamsVO.getPatent() != null) {
+            //用专利号查询该条数据是否存在
+            Patent patent = patentService.getByPatentNo(uploadParamsVO.getPatent().getPatentNo());
+            //如果不存在就新增一条
+            if (patent == null) {
+                uploadParamsVO.getPatent().insert();
+            } else {
+                uploadParamsVO.getPatent().setId(patent.getId());
+            }
+        }
+    }
+
+    private void patentRightBusiness(UploadParamsVO uploadParamsVO) {
+        PatentRightParams patentRightParams = new PatentRightParams();
+        patentRightParams.setPatentId(uploadParamsVO.getPatent().getId());
+        patentRightParams.setPatentNo(uploadParamsVO.getPatent().getPatentNo());
+        if (uploadParamsVO.getPatentRight() != null) {
+            patentRightParams.setContent(uploadParamsVO.getPatentRight().getContent());
+            patentRightParams.setContentOut(uploadParamsVO.getPatentRight().getContentOut());
+        }
+        if (uploadParamsVO.getSelfContent() != null) {
+            patentRightParams.setSelfContent(uploadParamsVO.getSelfContent());
+        }
+        patentRightService.updatePatentRight(patentRightParams);
+    }
+
+    private void patentInstructionTextBusiness(UploadParamsVO uploadParamsVO) {
+        PatentInstructionTextParams patentInstructionTextParams = new PatentInstructionTextParams();
+        patentInstructionTextParams.setPatentId(uploadParamsVO.getPatent().getId());
+        patentInstructionTextParams.setManual(uploadParamsVO.getPatentInstructionText().getManual());
+        patentInstructionTextParams.setManualOut(uploadParamsVO.getPatentInstructionText().getManualOut());
+
+        patentInstructionTextService.updatePatentInstructionText(patentInstructionTextParams);
+    }
+
+    private void patentAgentBusiness(UploadParamsVO uploadParamsVO) {
+        PatentAgentParams patentAgentParams = new PatentAgentParams();
+        patentAgentParams.setPatentId(uploadParamsVO.getPatent().getId());
+
+        List<String> agentList = uploadParamsVO.getPatentAgentList().stream().map(PatentAgent::getName).collect(Collectors.toList());
+        patentAgentParams.setAgent(agentList);
+
+
+        patentAgentService.updatePatentAgent(patentAgentParams);
+    }
+
+    private void patentPledgeBusiness(UploadParamsVO uploadParamsVO) {
+        PatentPledgeParams patentPledgeParams = new PatentPledgeParams();
+        patentPledgeParams.setPatentId(uploadParamsVO.getPatent().getId());
+        List<String> pledgeeList = uploadParamsVO.getPatentPledgeList().stream().map(PatentPledge::getPledgee).collect(Collectors.toList());
+        List<String> pledgorList = uploadParamsVO.getPatentPledgeList().stream().map(PatentPledge::getPledgor).collect(Collectors.toList());
+        patentPledgeParams.setPledgee(pledgeeList);
+        patentPledgeParams.setPledgor(pledgorList);
+
+        patentPledgeService.updatePatentPledge(patentPledgeParams);
+    }
+
+    private void patentLicensorBusiness(UploadParamsVO uploadParamsVO) {
+        PatentLicensorParams patentLicensorParams = new PatentLicensorParams();
+        patentLicensorParams.setPatentId(uploadParamsVO.getPatent().getId());
+        List<String> licensorList = uploadParamsVO.getPatentLicensorList().stream().map(PatentLicensor::getLicensor).collect(Collectors.toList());
+        List<String> licenseeList = uploadParamsVO.getPatentLicensorList().stream().map(PatentLicensor::getLicensee).collect(Collectors.toList());
+        List<String> typeList = uploadParamsVO.getPatentLicensorList().stream().map(PatentLicensor::getType).collect(Collectors.toList());
+        patentLicensorParams.setLicensor(licensorList);
+        patentLicensorParams.setLicensee(licenseeList);
+        patentLicensorParams.setType(typeList);
+
+        patentLicensorService.updatePatentLicensor(patentLicensorParams);
+    }
+
+    private void patentSimplyFamilyBusiness(UploadParamsVO uploadParamsVO) {
+        PatentSimpleFamilyParams patentSimpleFamilyParams = new PatentSimpleFamilyParams();
+        if (uploadParamsVO.getSimpleFamily() != null) {
+            patentSimpleFamilyParams.setSimpleFamily(uploadParamsVO.getSimpleFamily());
+        }
+        if (uploadParamsVO.getPatSnapFamily() != null) {
+            patentSimpleFamilyParams.setPatSnapFamily(uploadParamsVO.getPatSnapFamily());
+        }
+        if (uploadParamsVO.getInpadocFamily() != null) {
+            patentSimpleFamilyParams.setInpadocFamily(uploadParamsVO.getInpadocFamily());
+        }
+        patentSimpleFamilyParams.setPatentId(uploadParamsVO.getPatent().getId());
+        patentSimpleFamilyParams.setPatentNo(uploadParamsVO.getPatent().getPatentNo());
+
+        patentSimpleFamilyService.updatePatentSimpleFamily(patentSimpleFamilyParams);
+    }
+
+    private void patentInventorBusiness(UploadParamsVO uploadParamsVO) {
+        PatentInventorParams patentInventorParams = new PatentInventorParams();
+        if (uploadParamsVO.getPatentInventorList() != null) {
+            List<String> addressList = uploadParamsVO.getPatentInventorList().stream().map(PatentInventor::getAddress).filter(Objects::nonNull).collect(Collectors.toList());
+            patentInventorParams.setAddressList(addressList);
+            List<String> nameList = uploadParamsVO.getPatentInventorList().stream().map(PatentInventor::getName).collect(Collectors.toList());
+            patentInventorParams.setNameList(nameList);
+        }
+        if (uploadParamsVO.getFirstName() != null) {
+            patentInventorParams.setFirstName(uploadParamsVO.getFirstName());
+        }
+        if (uploadParamsVO.getFirstAddress() != null) {
+            patentInventorParams.setFirstAddress(uploadParamsVO.getFirstAddress());
+        }
+        patentInventorParams.setPatentId(uploadParamsVO.getPatent().getId());
+
+        patentInventorService.updatePatentInventor(patentInventorParams);
+    }
+
+    private void patentApplicationBusiness(UploadParamsVO uploadParamsVO) {
+        //权利人
+        patentApplicantLinkService.updatePatentApplicantLink(uploadParamsVO.getPatentApplicantCurrentName(), uploadParamsVO.getPatentApplicantStandardCurrentName(), 1, uploadParamsVO.getPatent().getId());
+        //申请人
+        patentApplicantLinkService.updatePatentApplicantLink(uploadParamsVO.getPatentApplicantOriginalName(), uploadParamsVO.getPatentApplicantStandardOriginalName(), 2, uploadParamsVO.getPatent().getId());
+    }
+
+    private void patentApplicationAddressBusiness(UploadParamsVO uploadParamsVO) {
+        PatentApplicantAddressParams patentApplicantAddressParams = new PatentApplicantAddressParams();
+        patentApplicantAddressParams.setPatentId(uploadParamsVO.getPatent().getId());
+        patentApplicantAddressParams.setCurrentAddress(uploadParamsVO.getPatentApplicantCurrentAddress());
+        patentApplicantAddressParams.setOriginalAddress(uploadParamsVO.getPatentApplicantOriginalAddress());
+        patentApplicantAddressParams.setCurrentCountry(uploadParamsVO.getPatentApplicantCurrentCountry());
+        patentApplicantAddressParams.setOriginalCountry(uploadParamsVO.getPatentApplicantOriginalCountry());
+        patentApplicantAddressParams.setFirstCurrentAddress(uploadParamsVO.getFirstAddress());
+        patentApplicantService.updatePatentApplicantAddress(patentApplicantAddressParams);
+    }
+
+    private void patentThematicPidBusiness(UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
+        projectPatentLinkService.updateProjectPatent(projectImportPatentVO.getProjectId(), uploadParamsVO.getPatent().getId());
+    }
+
+    private void patentProjectFieldPatentLinkBusiness(UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
+        projectFieldPatentLinkService.updateProjectFieldPatentLink(projectImportPatentVO, uploadParamsVO.getPatent().getId());
+    }
+
+    private void patentProjectFolderPatentLinkBusiness(UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
+        projectFolderPatentLinkService.updateProjectFolderLink(projectImportPatentVO, uploadParamsVO.getPatent().getId());
+    }
+
+    private void patentLabelBusiness(UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
+        PatentLabelParams patentLabelParams = new PatentLabelParams();
+        patentLabelParams.setPatentId(uploadParamsVO.getPatent().getId());
+        patentLabelParams.setProjectId(projectImportPatentVO.getProjectId());
+        List<String> labelList = uploadParamsVO.getPatentLabelList().stream().map(PatentLabel::getName).collect(Collectors.toList());
+        patentLabelParams.setLabel(labelList);
+
+        patentLabelService.updatePatentLabel(patentLabelParams);
+    }
+
+    private void patentTypeNoBusiness(UploadParamsVO uploadParamsVO) {
+        PatentClassNumberParams patentClassNumberParams = new PatentClassNumberParams();
+        if (uploadParamsVO.getMainIpc() != null) {
+            patentClassNumberParams.setMainIpc(uploadParamsVO.getMainIpc());
+        }
+        if (uploadParamsVO.getMainUpc() != null) {
+            patentClassNumberParams.setMainUpc(uploadParamsVO.getMainUpc());
+        }
+        if (uploadParamsVO.getCpcList() != null) {
+            patentClassNumberParams.setCpcList(uploadParamsVO.getCpcList());
+        }
+        if (uploadParamsVO.getLocList() != null) {
+            patentClassNumberParams.setLocList(uploadParamsVO.getLocList());
+        }
+        if (uploadParamsVO.getUpcList() != null) {
+            patentClassNumberParams.setUpcList(uploadParamsVO.getUpcList());
+        }
+        if (uploadParamsVO.getIpcList() != null) {
+            patentClassNumberParams.setIpcList(uploadParamsVO.getIpcList());
+        }
+        patentClassNumberParams.setPatentId(uploadParamsVO.getPatent().getId());
+
+        patentClassNumberLinkService.updatePatentClassNumberLink(patentClassNumberParams);
+    }
+
+    private void patentAffairBusiness(UploadParamsVO uploadParamsVO) {
+        PatentAffairParams patentAffairParams = new PatentAffairParams();
+        if (uploadParamsVO.getPatentAffair() != null) {
+            patentAffairParams.setContent(uploadParamsVO.getPatentAffair().getContent());
+            patentAffairParams.setStatusList(uploadParamsVO.getPatentAffair().getStatus());
+            patentAffairParams.setDateTime(uploadParamsVO.getPatentAffair().getDateTime());
+        }
+        if (uploadParamsVO.getSimpleStatus() != null) {
+            List<SystemDict> systemDictList = systemDictService.getSystemDictListByType(Collections.singletonList(Constants.PATENT_SIMPLE_STATUS));
+            Integer simpleStatus = Integer.parseInt(systemDictList.stream()
+                    .filter(systemDict -> systemDict.getType().equals(Constants.PATENT_SIMPLE_STATUS) && systemDict.getLabel().equals(uploadParamsVO.getSimpleStatus()))
+                    .findFirst()
+                    .orElse(new SystemDict()).getValue());
+            patentAffairParams.setSimpleStatus(simpleStatus);
+        }
+        patentAffairParams.setPatentId(uploadParamsVO.getPatent().getId());
+
+        patentAffairService.updatePatientAffair(patentAffairParams);
+    }
+
+    private void patentFieldBusiness(TaskParams params, UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
+        PatentCustomFieldParams patentCustomFieldParams = new PatentCustomFieldParams();
+        patentCustomFieldParams.setPatentId(uploadParamsVO.getPatent().getId());
+        patentCustomFieldParams.setProjectId(projectImportPatentVO.getProjectId());
+        patentCustomFieldParams.setUserId(Integer.parseInt(params.getUserId()));
+        patentCustomFieldParams.put(uploadParamsVO.getKey(), uploadParamsVO.getFieldList());
+
+        patentService.updatePatentCustomField(patentCustomFieldParams);
+    }
+
+}

+ 3 - 3
PAS/src/main/resources/application-dev.yml

@@ -1,13 +1,13 @@
 spring:
   redis:
-    host: 192.168.80.128
+    host: 192.168.0.57
     port: 6379
     database: 2
     timeout: 1000
   datasource:
-    url: jdbc:mysql://192.168.80.128:3306/pas?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
+    url: jdbc:mysql://192.168.0.57:3306/pas?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
     username: root
-    password: 123456789
+    password: 123456
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
     druid:

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

@@ -20,7 +20,7 @@ spring:
       max-file-size: 1000MB
       max-request-size: 1000MB
   profiles:
-    active: dev
+    active: test
   jackson:
     default-property-inclusion: non_null
     serialization: