Selaa lähdekoodia

导入专利框架搭建

lwhhszx 1 vuosi sitten
vanhempi
commit
21b70200a8
30 muutettua tiedostoa jossa 1288 lisäystä ja 441 poistoa
  1. 0 2
      src/main/java/cn/cslg/pas/Application.java
  2. 33 53
      src/main/java/cn/cslg/pas/common/core/CreateTaskThread.java
  3. 3 1
      src/main/java/cn/cslg/pas/common/core/base/Constants.java
  4. 17 0
      src/main/java/cn/cslg/pas/common/model/cronModel/ImportTaskConfig.java
  5. 145 0
      src/main/java/cn/cslg/pas/common/utils/BackupUtils.java
  6. 135 135
      src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java
  7. 66 0
      src/main/java/cn/cslg/pas/common/utils/FileUtils.java
  8. 211 196
      src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java
  9. 188 0
      src/main/java/cn/cslg/pas/common/utils/UploadPatentBatchUtil.java
  10. 19 0
      src/main/java/cn/cslg/pas/common/vo/ImportTaskAMVO.java
  11. 68 0
      src/main/java/cn/cslg/pas/common/vo/UploadSettingVO.java
  12. 9 1
      src/main/java/cn/cslg/pas/common/vo/business/EventVO.java
  13. 2 0
      src/main/java/cn/cslg/pas/common/vo/business/PatentDigProjectVO.java
  14. 3 0
      src/main/java/cn/cslg/pas/common/vo/business/ReportProjectVO.java
  15. 18 0
      src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java
  16. 14 0
      src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportImp.java
  17. 3 2
      src/main/java/cn/cslg/pas/service/business/EventService.java
  18. 15 0
      src/main/java/cn/cslg/pas/service/business/PatentDigProjectService.java
  19. 42 36
      src/main/java/cn/cslg/pas/service/business/ReportProjectService.java
  20. 33 0
      src/main/java/cn/cslg/pas/service/common/ExcuteUploadSettingService.java
  21. 83 0
      src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java
  22. 23 0
      src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java
  23. 60 0
      src/main/java/cn/cslg/pas/service/importPatent/SavePatentToEsThread.java
  24. 47 0
      src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java
  25. 6 0
      src/main/resources/jsons/cronJsons/importTaskConfig.json
  26. 2 2
      src/main/resources/jsons/event.json
  27. 26 2
      src/main/resources/jsons/patentDigProject.json
  28. 4 4
      src/main/resources/jsons/reportProject.json
  29. 1 1
      src/main/resources/mapper/ReportProjectMapper.xml
  30. 12 6
      src/test/java/cn/cslg/pas/service/EsServiceTests.java

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

@@ -14,8 +14,6 @@ public class Application {
 
     public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
-        CronUtil.setMatchSecond(true);
-        CronUtil.start();
         System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "后台程序已启动,请运行前台");
     }
 }

+ 33 - 53
src/main/java/cn/cslg/pas/common/core/CreateTaskThread.java

@@ -1,53 +1,33 @@
-//package cn.cslg.pas.common.core;
-//
-//import cn.cslg.pas.entity.ImportTask;
-//import cn.cslg.pas.service.ImportTaskService;
-//import cn.cslg.pas.service.importPatent.PatentQueueService;
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import lombok.RequiredArgsConstructor;
-//import org.springframework.beans.factory.InitializingBean;
-//import org.springframework.context.annotation.Lazy;
-//import org.springframework.stereotype.Component;
-//
-//import java.util.ArrayList;
-//import java.util.List;
-//import java.util.stream.Collectors;
-//
-///**
-// * 项目启动时初始化任务列表队列
-// *
-// * @author chenyu
-// * @date 2023/10/20
-// */
-//@Component
-//@RequiredArgsConstructor(onConstructor_ = {@Lazy})
-//public class CreateTaskThread implements InitializingBean {
-//    private final ImportTaskService importTaskService;
-//    private final PatentQueueService patentQueueService;
-//
-//
-//    @Override
-//    public void afterPropertiesSet() throws Exception {
-//        //查找任务状态为0(等待中)和1(进行中)的任务
-//        ArrayList<Integer> stateList = new ArrayList<>();
-//        stateList.add(0);
-//        stateList.add(1);
-//        List<ImportTask> importTasks = importTaskService.list(new LambdaQueryWrapper<ImportTask>().in(ImportTask::getState, stateList));
-//        if (importTasks.size() > 0) {
-//            //先把0(进行中)的任务存入队列
-//            List<Integer> doingTaskIds = importTasks.stream().filter(importTask -> importTask.getState() == 1).map(ImportTask::getId).collect(Collectors.toList());
-//            if (doingTaskIds.size() > 0) {
-//                patentQueueService.addImportTasksToQueue(doingTaskIds);
-//            }
-//            //再把1(等待中)的任务存入队列
-//            List<Integer> waitingTaskIds = importTasks.stream().filter(importTask -> importTask.getState() == 0).map(ImportTask::getId).collect(Collectors.toList());
-//            if (waitingTaskIds.size() > 0) {
-//                patentQueueService.addImportTasksToQueue(waitingTaskIds);
-//            }
-//        }
-//
-//        //唤醒所有线程...
-//
-//    }
-//
-//}
+package cn.cslg.pas.common.core;
+
+
+import cn.cslg.pas.service.importPatent.PatentQueueService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 项目启动时初始化任务列表队列
+ *
+ * @author chenyu
+ * @date 2023/10/20
+ */
+@Component
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
+public class CreateTaskThread implements InitializingBean {
+
+
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+
+
+    }
+
+}

+ 3 - 1
src/main/java/cn/cslg/pas/common/core/base/Constants.java

@@ -49,7 +49,9 @@ public class Constants {
     public static final Integer PATENT_CLASS_NUMBER_CPC = 2;
     public static final Integer PATENT_CLASS_NUMBER_UPC = 3;
     public static final Integer PATENT_CLASS_NUMBER_LOC = 4;
-
+    public static final Integer MAX_IMPORT_TASK_COUNT=5;
+    public static final  Integer IMPORT_PATENT_TO=1;
+    public static final String   IMPORT_TASK_CONFIG="importTaskConfig";
     /**
      * 分隔符-竖线
      */

+ 17 - 0
src/main/java/cn/cslg/pas/common/model/cronModel/ImportTaskConfig.java

@@ -0,0 +1,17 @@
+package cn.cslg.pas.common.model.cronModel;
+
+import lombok.Data;
+
+/**
+ *
+ */
+@Data
+public class ImportTaskConfig {
+    /**
+     * ID
+     */
+    private Integer taskType;
+    private String importClass;
+    private Integer importTo;
+
+}

+ 145 - 0
src/main/java/cn/cslg/pas/common/utils/BackupUtils.java

@@ -0,0 +1,145 @@
+package cn.cslg.pas.common.utils;
+
+import cn.hutool.core.io.FileUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.system.ApplicationHome;
+import org.springframework.stereotype.Component;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+@Slf4j
+public class BackupUtils {
+
+    private final static String BACKUP_CONFIG = "backup-config.yml";
+
+    private static Backup getBackupConfig() {
+        try {
+            ApplicationHome ah = new ApplicationHome(BackupUtils.class);
+            File file = ah.getSource();
+            String rootPath = file.getParentFile().toString() + FileUtils.FILE_SEPARATOR + BACKUP_CONFIG;
+            Yaml yaml = new Yaml();
+            InputStream in = FileUtil.getInputStream(rootPath);
+            Backup backup = yaml.loadAs(in, Backup.class);
+            if (in != null) {
+                in.close();
+            }
+            return backup;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+
+    public void run() {
+        Backup backup = getBackupConfig();
+        if (backup == null) {
+            log.info("数据库备份配置文件不存在");
+            return;
+        }
+        log.info("数据库备份配置文件:{}", backup);
+        if (backup.isEnable()) {
+            String path = FileUtils.getStaticPath(FileUtils.BACKUP_FILE);
+            String fileName = DateUtils.getNowTimeFormat(DateUtils.YYYYMMDDHHMMSS) + ".sql";
+            try {
+                String cmd = String.format("mysqldump --skip-opt -h%s -P%s -u%s -p%s %s > %s", backup.getHost(), backup.getPort(), backup.getUsername(), backup.getPassword(), backup.getDb(), path + FileUtils.FILE_SEPARATOR + fileName);
+                String[] command;
+                if (backup.getOs() == 0) {
+                    command = new String[]{"cmd", "/c", String.valueOf(cmd)};
+                } else {
+                    command = new String[]{"/bin/sh", "-c", String.valueOf(cmd)};
+                }
+                Runtime.getRuntime().exec(command);
+                log.info("备份数据库成功");
+            } catch (Exception e) {
+                e.printStackTrace();
+                log.error("备份数据库失败");
+            }
+        }
+    }
+
+    public static class Backup {
+        private String host;
+        private String port;
+        private String db;
+        private String username;
+        private String password;
+        private int os;
+        private boolean enable;
+
+        @Override
+        public String toString() {
+            return "Backup{" +
+                    "host='" + host + '\'' +
+                    ", port='" + port + '\'' +
+                    ", db='" + db + '\'' +
+                    ", username='" + username + '\'' +
+                    ", password='" + password + '\'' +
+                    ", os=" + os +
+                    ", enable=" + enable +
+                    '}';
+        }
+
+        public boolean isEnable() {
+            return enable;
+        }
+
+        public void setEnable(boolean enable) {
+            this.enable = enable;
+        }
+
+        public String getHost() {
+            return host;
+        }
+
+        public void setHost(String host) {
+            this.host = host;
+        }
+
+        public String getPort() {
+            return port;
+        }
+
+        public void setPort(String port) {
+            this.port = port;
+        }
+
+        public String getDb() {
+            return db;
+        }
+
+        public void setDb(String db) {
+            this.db = db;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+
+        public void setUsername(String username) {
+            this.username = username;
+        }
+
+        public String getPassword() {
+            return password;
+        }
+
+        public void setPassword(String password) {
+            this.password = password;
+        }
+
+        public int getOs() {
+            return os;
+        }
+
+        public void setOs(int os) {
+            this.os = os;
+        }
+    }
+
+}

+ 135 - 135
src/main/java/cn/cslg/pas/common/utils/ExcelUtils.java

@@ -20,101 +20,101 @@ import java.util.Map;
 
 public class ExcelUtils {
 
-//    public static Map<String, PictureData> getDataFromExcel(String filePath) throws IOException {
-//        //判断是否为excel类型文件
-//        if (!filePath.endsWith(".xls") && !filePath.endsWith(".xlsx") && !filePath.endsWith(".XLS") && !filePath.endsWith(".XLSX")) {
-//            System.out.println("文件不是excel类型");
-//        }
-//
-//        FileInputStream fis = null;
-//        Workbook wookbook = null;
-//        Sheet sheet = null;
-//        try {
-//            //获取一个绝对地址的流
-//            fis = new FileInputStream(filePath);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        try {
-//            //2003版本的excel,用.xls结尾
-//            wookbook = new HSSFWorkbook(fis);//得到工作簿
-//        } catch (Exception ex) {
-//            //ex.printStackTrace();
-//            try {
-//                //2007版本的excel,用.xlsx结尾
-//                fis = new FileInputStream(filePath);
-//                wookbook = new XSSFWorkbook(fis);//得到工作簿
-//            } catch (IOException e) {
-//                // TODO Auto-generated catch block
-//                e.printStackTrace();
-//            }
-//        }
-//        Map<String, PictureData> maplist = null;
-//        //拿到excel表格的第一个sheet工作簿
-//        sheet = wookbook.getSheetAt(0);
-//        // 判断用07还是03的方法获取图片
-//        if (filePath.endsWith(".xls") || filePath.endsWith(".XLS")) {
-//            maplist = getPictures1((HSSFSheet) sheet);
-//        } else if (filePath.endsWith(".xlsx") || filePath.endsWith(".XLSX")) {
-//            maplist = getPictures2((XSSFSheet) sheet);
-//        }
-//        wookbook.close();
-//        return maplist;
-//    }
-//
-//    /**
-//     * 获取图片和位置 (xls)
-//     *
-//     * @param sheet
-//     * @return
-//     * @throws IOException
-//     */
-//    public static Map<String, PictureData> getPictures1(HSSFSheet sheet) throws IOException {
-//        Map<String, PictureData> map = new HashMap();
-//        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;
-//    }
-//
-//    /**
-//     * 获取图片和位置 (xlsx)
-//     *
-//     * @param sheet
-//     * @return
-//     * @throws IOException
-//     */
-//    public static Map<String, PictureData> getPictures2(XSSFSheet sheet) throws IOException {
-//        Map<String, PictureData> map = new HashMap();
-//        List<POIXMLDocumentPart> list = sheet.getRelations();
-//        for (POIXMLDocumentPart part : list) {
-//            if (part instanceof XSSFDrawing) {
-//                XSSFDrawing drawing = (XSSFDrawing) part;
-//                List<XSSFShape> shapes = drawing.getShapes();
-//                for (XSSFShape shape : shapes) {
-//                    XSSFPicture picture = (XSSFPicture) shape;
-//                    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());
-//                }
-//            }
-//        }
-//        return map;
-//    }
-//
+    public static Map<String, PictureData> getDataFromExcel(String filePath) throws IOException {
+        //判断是否为excel类型文件
+        if (!filePath.endsWith(".xls") && !filePath.endsWith(".xlsx") && !filePath.endsWith(".XLS") && !filePath.endsWith(".XLSX")) {
+            System.out.println("文件不是excel类型");
+        }
+
+        FileInputStream fis = null;
+        Workbook wookbook = null;
+        Sheet sheet = null;
+        try {
+            //获取一个绝对地址的流
+            fis = new FileInputStream(filePath);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        try {
+            //2003版本的excel,用.xls结尾
+            wookbook = new HSSFWorkbook(fis);//得到工作簿
+        } catch (Exception ex) {
+            //ex.printStackTrace();
+            try {
+                //2007版本的excel,用.xlsx结尾
+                fis = new FileInputStream(filePath);
+                wookbook = new XSSFWorkbook(fis);//得到工作簿
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+        Map<String, PictureData> maplist = null;
+        //拿到excel表格的第一个sheet工作簿
+        sheet = wookbook.getSheetAt(0);
+        // 判断用07还是03的方法获取图片
+        if (filePath.endsWith(".xls") || filePath.endsWith(".XLS")) {
+            maplist = getPictures1((HSSFSheet) sheet);
+        } else if (filePath.endsWith(".xlsx") || filePath.endsWith(".XLSX")) {
+            maplist = getPictures2((XSSFSheet) sheet);
+        }
+        wookbook.close();
+        return maplist;
+    }
+
+    /**
+     * 获取图片和位置 (xls)
+     *
+     * @param sheet
+     * @return
+     * @throws IOException
+     */
+    public static Map<String, PictureData> getPictures1(HSSFSheet sheet) throws IOException {
+        Map<String, PictureData> map = new HashMap();
+        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;
+    }
+
+    /**
+     * 获取图片和位置 (xlsx)
+     *
+     * @param sheet
+     * @return
+     * @throws IOException
+     */
+    public static Map<String, PictureData> getPictures2(XSSFSheet sheet) throws IOException {
+        Map<String, PictureData> map = new HashMap();
+        List<POIXMLDocumentPart> list = sheet.getRelations();
+        for (POIXMLDocumentPart part : list) {
+            if (part instanceof XSSFDrawing) {
+                XSSFDrawing drawing = (XSSFDrawing) part;
+                List<XSSFShape> shapes = drawing.getShapes();
+                for (XSSFShape shape : shapes) {
+                    XSSFPicture picture = (XSSFPicture) shape;
+                    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());
+                }
+            }
+        }
+        return map;
+    }
+
 //    /**
 //     * @param pictureData 图片
 //     * @return 返回图片的文件路径和文件名称
@@ -139,45 +139,45 @@ public class ExcelUtils {
 //        result.put("name", picName);
 //        return result;
 //    }
-//
-//    /**
-//     * @param
-//     * @param x           单元格x轴坐标
-//     * @param y           单元格y轴坐标
-//     * @param pictureData 图片二进制数据
-//     * @param picType     图片格式
-//     */
-//    public static void writePicture(Sheet sheet, int x, int y, byte[] pictureData, int picType) {
-//        Drawing drawingPatriarch = sheet.createDrawingPatriarch();
-//        //设置图片单元格位置
-//        ClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 0, 0, x, y, x + 1, y + 1);
-//        //随单元格改变位置和大小
-//        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
-//        //添加图片
-//        int pictureIndex = sheet.getWorkbook().addPicture(pictureData, picType);
-//        drawingPatriarch.createPicture(anchor, pictureIndex);
-//    }
-//
-//    public static void setExcelCellStyle(HSSFCellStyle cellStyle) {
-//        cellStyle.setBorderBottom(BorderStyle.THIN);
-//        cellStyle.setBorderLeft(BorderStyle.THIN);
-//        cellStyle.setBorderRight(BorderStyle.THIN);
-//        cellStyle.setBorderTop(BorderStyle.THIN);
-//    }
-//
-//    public static String getValue(Cell cell) {
-//        if (cell != null) {
-//            if (cell.getCellType() == CellType.NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)) {
-//                Date date = cell.getDateCellValue();
-//                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-//                String dateString = dateFormat.format(date);
-//                return dateString;
-//            } else {
-//                return cell.toString();
-//            }
-//        }
-//        return "";
-//    }
-//
+
+    /**
+     * @param
+     * @param x           单元格x轴坐标
+     * @param y           单元格y轴坐标
+     * @param pictureData 图片二进制数据
+     * @param picType     图片格式
+     */
+    public static void writePicture(Sheet sheet, int x, int y, byte[] pictureData, int picType) {
+        Drawing drawingPatriarch = sheet.createDrawingPatriarch();
+        //设置图片单元格位置
+        ClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 0, 0, x, y, x + 1, y + 1);
+        //随单元格改变位置和大小
+        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+        //添加图片
+        int pictureIndex = sheet.getWorkbook().addPicture(pictureData, picType);
+        drawingPatriarch.createPicture(anchor, pictureIndex);
+    }
+
+    public static void setExcelCellStyle(HSSFCellStyle cellStyle) {
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+    }
+
+    public static String getValue(Cell cell) {
+        if (cell != null) {
+            if (cell.getCellType() == CellType.NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)) {
+                Date date = cell.getDateCellValue();
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                String dateString = dateFormat.format(date);
+                return dateString;
+            } else {
+                return cell.toString();
+            }
+        }
+        return "";
+    }
+
 
 }

+ 66 - 0
src/main/java/cn/cslg/pas/common/utils/FileUtils.java

@@ -0,0 +1,66 @@
+package cn.cslg.pas.common.utils;
+
+
+import org.springframework.boot.system.ApplicationHome;
+import org.springframework.stereotype.Service;
+
+
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+
+@Service
+public class FileUtils {
+
+    public static final String FILE_SEPARATOR = System.getProperty("file.separator");
+    public static final String COMMON_FILE = "file";
+    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 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();
+    }
+
+
+}

+ 211 - 196
src/main/java/cn/cslg/pas/common/utils/ReadExcelUtils.java

@@ -12,6 +12,8 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -22,201 +24,214 @@ import java.util.Map;
  */
 @Service
 public class ReadExcelUtils {
-//    /**
-//     * 检测Excel文件合法性
-//     *
-//     * @param tempFile 临时文件
-//     * @return 返回文件总行数
-//     */
-//    public static Integer textExcel(File tempFile, String sourceId) throws IOException {
-//        //判断文件是否存在
-//        if (!tempFile.exists() || tempFile.getPath().trim().equals("")) {
-//            ThrowException.throwXiaoShiException("文件上传失败,服务器忙请稍后再试!");
-//        }
-//
-//        // 检测是否为excel文件
-//        String suffix = tempFile.getPath().substring(tempFile.getPath().lastIndexOf("."));
-//        if (!suffix.equals(".xls") && !suffix.equals(".xlsx") && !suffix.equals(".XLS") && !suffix.equals(".XLSX")) {
-//            //删除临时文件tempFile
-//            new File(tempFile.getPath()).delete();
-//            ThrowException.throwXiaoShiException("文件格式错误,请上传Excel文件!");
-//        }
-//
-//        InputStream fis = new FileInputStream(tempFile);
-//        //使用poi框架解析处理Excel文件
-//        Workbook workbook = null;
-//        //区分不同版本Excel,使用各自对应的工具类
-//        if (suffix.equals(".xls") || suffix.equals(".XLS")) {
-//            workbook = new HSSFWorkbook(fis);
-//        } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
-//            workbook = new XSSFWorkbook(fis);
-//        }
-//        //读取第几个sheet
-//        Sheet sheet = workbook.getSheetAt(0);
-//        //读取总行数
-//        int rows = sheet.getPhysicalNumberOfRows();
-//        if (rows <= 1) {
-//            //删除临时文件tempFile
-//            fis.close();
-//            new File(tempFile.getPath()).delete();
-//            ThrowException.throwXiaoShiException("文件内容格式不正确,请检查总行数是否有专利内容");
-//        }
-//
-//        //获取第一行抬头
-//        Row firstRow = sheet.getRow(0);
-//        boolean flag1 = false;  //是否有 "公开(公告)号"
-//        boolean flag2 = false;  //是否有 "申请号"
-//        //遍历第一行单元格抬头,检查合法性
-//        String title = "", source = "";
-//        if (sourceId.equals("1")) {
-//            source = "智慧芽";
-//            title = "公开(公告)号";
-//        } else if (sourceId.equals("2")) {
-//            source = "合享";
-//            title = "公开(公告)号";
-//        } else {
-//            source = "Patentics";
-//            title = "公开号";
-//        }
-//        for (Cell cell : firstRow) {
-//            if (cell.getStringCellValue().equals(title)) {
-//                flag1 = true;
-//            }
-//            if (cell.getStringCellValue().equals("申请号")) {
-//                flag2 = true;
-//            }
-//        }
-//        if (!flag1 || !flag2) {
-//            //删除临时文件tempFile
-//            fis.close();
-//            new File(tempFile.getPath()).delete();
-//            ThrowException.throwXiaoShiException("文件内容格式不正确,您选择【" + source + "】来源,Excel第一行抬头必须有【" + title + "】和【申请号】");
-//        }
-//
-//        //关闭流
-//        fis.close();
-//
-//        //返回文件总行数-1(即专利总数量)
-//        return rows - 1;
-//    }
-//
-//    /**
-//     * 获取一行专利的全部数据(专利内容数据 + 摘要附图)
-//     *
-//     * @param tempFile Excel临时文件
-//     * @param row      行数
-//     * @return 返回装载专利数据(专利内容数据 + 摘要附图)的对象
-//     */
-//    public static PatentData readExcelOneRow(File tempFile, Sheet sheet, int row) throws IOException {
-//        //创建返回最终结果的对象 patentData
-//        PatentData patentData = new PatentData();
-//        //装载专利数据(除了摘要附图)的map:(key:表头如 "公开(公告)号"  value:表头对应内容如 "CN1307082B")
-//        Map<Object, Object> map = new HashMap<>();
-//        //装载摘要附图的对象
-//        PictureData pictureData = null;
-//
-//        //开始装载专利数据
-//        Row firstRow = sheet.getRow(0);
-//        Row needRow = sheet.getRow(row);
-//        //获得总列数
-//        int columns = firstRow.getLastCellNum();
-//        for (int i = 0; i < columns; i++) {
-//            map.put(firstRow.getCell(i) + "", ExcelUtils.getValue(needRow.getCell(i)) + "");
-//        }
-//
-//        //开始装载专利摘要附图(判断用07还是03的方法获取图片)
-//        String suffix = tempFile.getName().substring(tempFile.getName().lastIndexOf("."));
-//        if (suffix.equals(".xls") || suffix.equals(".XLS")) {
-//            pictureData = getPictures1((HSSFSheet) sheet, row);
-//        } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
-//            pictureData = getPictures2((XSSFSheet) sheet, row);
-//        }
-//
-//        //返回结果对象装载结果
-//        patentData.setMap(map);
-//        patentData.setPictureData(pictureData);
-//
-//        return patentData;
-//    }
-//
-//    public static Sheet readExcel(File tempFile) {
-//        Sheet sheet = null;
-//
-//        try {
-//            InputStream inputStream = new FileInputStream(tempFile);
-//            //POI可以处理Excel文件
-//            Workbook workbook = null;
-//            //当文件以.xls结尾时
-//            String suffix = tempFile.getName().substring(tempFile.getName().lastIndexOf("."));
-//            if (suffix.equals(".xls") || suffix.equals(".XLS")) {
-//                workbook = new HSSFWorkbook(inputStream);
-//            } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
-//                workbook = new XSSFWorkbook(inputStream);
-//            }
-//
-//            //读取第几个sheet
-//            sheet = workbook.getSheetAt(0);
-//
-//            //关闭流
-//            inputStream.close();
-//
-//        } catch (IOException e) {
-//            e.printStackTrace();
-//        }
-//
-//        return sheet;
-//    }
-//
-//    /**
-//     * 03版本Excel取附图
-//     *
-//     * @param sheet Excel工作簿
-//     * @return 返回附图map
-//     */
-//    public static PictureData getPictures1(HSSFSheet sheet, Integer row) throws IOException {
-//        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();
-//                    int row1 = cAnchor.getRow1();
-//                    if (row1 == row) {
-//                        return picture.getPictureData();
-//                    }
-//                }
-//            }
-//        }
-//        return null;
-//    }
-//
-//    /**
-//     * 07版本Excel取附图
-//     *
-//     * @param sheet Excel工作簿
-//     * @return 返回附图map
-//     */
-//    public static PictureData getPictures2(XSSFSheet sheet, Integer row) throws IOException {
-//        List<POIXMLDocumentPart> list = sheet.getRelations();
-//        for (POIXMLDocumentPart part : list) {
-//            if (part instanceof XSSFDrawing) {
-//                XSSFDrawing drawing = (XSSFDrawing) part;
-//                List<XSSFShape> shapes = drawing.getShapes();
-//                for (XSSFShape shape : shapes) {
-//                    //解决图片空指针报错问题 lig  2021-06-03
-//                    XSSFClientAnchor anchor = (XSSFClientAnchor) shape.getAnchor();
-//                    //XSSFClientAnchor anchor = picture.getPreferredSize();
-//                    CTMarker marker = anchor.getFrom();
-//                    int excelRow = marker.getRow();
-//                    if (excelRow == row) {
-//                        XSSFPicture picture = (XSSFPicture) shape;
-//                        return picture.getPictureData();
-//                    }
-//                }
-//            }
-//        }
-//
-//        return null;
-//    }
+    /**
+     * 检测Excel文件合法性
+     *
+     * @param tempFile 临时文件
+     * @return 返回文件总行数
+     */
+    public static Integer textExcel(File tempFile, String sourceId) throws IOException {
+        //判断文件是否存在
+        if (!tempFile.exists() || tempFile.getPath().trim().equals("")) {
+            ThrowException.throwXiaoShiException("文件上传失败,服务器忙请稍后再试!");
+        }
 
+        // 检测是否为excel文件
+        String suffix = tempFile.getPath().substring(tempFile.getPath().lastIndexOf("."));
+        if (!suffix.equals(".xls") && !suffix.equals(".xlsx") && !suffix.equals(".XLS") && !suffix.equals(".XLSX")) {
+            //删除临时文件tempFile
+            new File(tempFile.getPath()).delete();
+            ThrowException.throwXiaoShiException("文件格式错误,请上传Excel文件!");
+        }
+
+        InputStream fis = new FileInputStream(tempFile);
+        //使用poi框架解析处理Excel文件
+        Workbook workbook = null;
+        //区分不同版本Excel,使用各自对应的工具类
+        if (suffix.equals(".xls") || suffix.equals(".XLS")) {
+            workbook = new HSSFWorkbook(fis);
+        } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
+            workbook = new XSSFWorkbook(fis);
+        }
+        //读取第几个sheet
+        Sheet sheet = workbook.getSheetAt(0);
+        //读取总行数
+        int rows = sheet.getPhysicalNumberOfRows();
+        if (rows <= 1) {
+            //删除临时文件tempFile
+            fis.close();
+            new File(tempFile.getPath()).delete();
+            ThrowException.throwXiaoShiException("文件内容格式不正确,请检查总行数是否有专利内容");
+        }
+
+        //获取第一行抬头
+        Row firstRow = sheet.getRow(0);
+        boolean flag1 = false;  //是否有 "公开(公告)号"
+        boolean flag2 = false;  //是否有 "申请号"
+        //遍历第一行单元格抬头,检查合法性
+        String title = "", source = "";
+        if (sourceId.equals("1")) {
+            source = "智慧芽";
+            title = "公开(公告)号";
+        } else if (sourceId.equals("2")) {
+            source = "合享";
+            title = "公开(公告)号";
+        } else {
+            source = "Patentics";
+            title = "公开号";
+        }
+        for (Cell cell : firstRow) {
+            if (cell.getStringCellValue().equals(title)) {
+                flag1 = true;
+            }
+            if (cell.getStringCellValue().equals("申请号")) {
+                flag2 = true;
+            }
+        }
+        if (!flag1 || !flag2) {
+            //删除临时文件tempFile
+            fis.close();
+            new File(tempFile.getPath()).delete();
+            ThrowException.throwXiaoShiException("文件内容格式不正确,您选择【" + source + "】来源,Excel第一行抬头必须有【" + title + "】和【申请号】");
+        }
+
+        //关闭流
+        fis.close();
+
+        //返回文件总行数-1(即专利总数量)
+        return rows - 1;
+    }
+
+    /**
+     * 获取一行专利的全部数据(专利内容数据 + 摘要附图)
+     *
+     * @param tempFile Excel临时文件
+     * @param row      行数
+     * @return 返回装载专利数据(专利内容数据 + 摘要附图)的对象
+     */
+    public static PatentData readExcelOneRow(File tempFile, Sheet sheet, int row) throws IOException {
+        //创建返回最终结果的对象 patentData
+        PatentData patentData = new PatentData();
+        //装载专利数据(除了摘要附图)的map:(key:表头如 "公开(公告)号"  value:表头对应内容如 "CN1307082B")
+        Map<Object, Object> map = new HashMap<>();
+        //装载摘要附图的对象
+        PictureData pictureData = null;
+
+        //开始装载专利数据
+        Row firstRow = sheet.getRow(0);
+        Row needRow = sheet.getRow(row);
+        //获得总列数
+        int columns = firstRow.getLastCellNum();
+        for (int i = 0; i < columns; i++) {
+            map.put(firstRow.getCell(i) + "", ExcelUtils.getValue(needRow.getCell(i)) + "");
+        }
+
+        //开始装载专利摘要附图(判断用07还是03的方法获取图片)
+        String suffix = tempFile.getName().substring(tempFile.getName().lastIndexOf("."));
+        if (suffix.equals(".xls") || suffix.equals(".XLS")) {
+            pictureData = getPictures1((HSSFSheet) sheet, row);
+        } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
+            pictureData = getPictures2((XSSFSheet) sheet, row);
+        }
+
+        //返回结果对象装载结果
+        patentData.setMap(map);
+        patentData.setPictureData(pictureData);
+
+        return patentData;
+    }
+
+    public static Sheet readExcel(File tempFile) {
+        Sheet sheet = null;
+
+        try {
+            InputStream inputStream = new FileInputStream(tempFile);
+            //POI可以处理Excel文件
+            Workbook workbook = null;
+            //当文件以.xls结尾时
+            String suffix = tempFile.getName().substring(tempFile.getName().lastIndexOf("."));
+            if (suffix.equals(".xls") || suffix.equals(".XLS")) {
+                workbook = new HSSFWorkbook(inputStream);
+            } else if (suffix.equals(".xlsx") || suffix.equals(".XLSX")) {
+                workbook = new XSSFWorkbook(inputStream);
+            }
+
+            //读取第几个sheet
+            sheet = workbook.getSheetAt(0);
+
+            //关闭流
+            inputStream.close();
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return sheet;
+    }
+
+    /**
+     * 03版本Excel取附图
+     *
+     * @param sheet Excel工作簿
+     * @return 返回附图map
+     */
+    public static PictureData getPictures1(HSSFSheet sheet, Integer row) throws IOException {
+        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();
+                    int row1 = cAnchor.getRow1();
+                    if (row1 == row) {
+                        return picture.getPictureData();
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 07版本Excel取附图
+     *
+     * @param sheet Excel工作簿
+     * @return 返回附图map
+     */
+    public static PictureData getPictures2(XSSFSheet sheet, Integer row) throws IOException {
+        List<POIXMLDocumentPart> list = sheet.getRelations();
+        for (POIXMLDocumentPart part : list) {
+            if (part instanceof XSSFDrawing) {
+                XSSFDrawing drawing = (XSSFDrawing) part;
+                List<XSSFShape> shapes = drawing.getShapes();
+                for (XSSFShape shape : shapes) {
+                    //解决图片空指针报错问题 lig  2021-06-03
+                    XSSFClientAnchor anchor = (XSSFClientAnchor) shape.getAnchor();
+                    //XSSFClientAnchor anchor = picture.getPreferredSize();
+                    CTMarker marker = anchor.getFrom();
+                    int excelRow = marker.getRow();
+                    if (excelRow == row) {
+                        XSSFPicture picture = (XSSFPicture) shape;
+                        return picture.getPictureData();
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+    public static String getValue(Cell cell) {
+        if (cell != null) {
+            if (cell.getCellType() == CellType.NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)) {
+                Date date = cell.getDateCellValue();
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                String dateString = dateFormat.format(date);
+                return dateString;
+            }
+            else{
+                return cell.toString();
+            }
+        }
+        return "";
+    }
 }

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

@@ -0,0 +1,188 @@
+package cn.cslg.pas.common.utils;
+
+
+import cn.cslg.pas.common.utils.handler.DataProcessHandler;
+import cn.cslg.pas.common.utils.handler.StringSpecialHandler;
+import cn.cslg.pas.common.vo.UploadSettingVO;
+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 getSettingJson        配置文件解析出的Json串
+     * @return uploadParamsVO 返回一个由processData方法填充完数据的Pojo类
+     * @date 2022/7/7
+     * @name 解析配置文件
+     * @description 通过与前段传入参数中的数据源ID进行比对从而得到对应数据源的配置项目
+     */
+    public static List<UploadSettingVO.Column> parsingConfigurationFiles(String sourceId, String getSettingJson) {
+        //将uploadSetting.json数据源配置文件的json字符串转换为UploadSettingVO对象(即实体类)集合
+        List<UploadSettingVO> uploadSettingVOs = JsonUtils.jsonToList(getSettingJson, UploadSettingVO.class);
+        //创建一个存放单一数据源的对象 这个对象存放的是 我们需要使用哪一个数据源的配置数据 所以只存一个 正常在Json文件里面会有多个数据源 也就是多条数据
+        List<UploadSettingVO.Column> jsonData = new ArrayList<>();
+        //遍历uploadSettingVOs,
+        for (int i = 0; i < Objects.requireNonNull(uploadSettingVOs).size(); i++) {
+            //提取一个常量
+            UploadSettingVO constant = Objects.requireNonNull(uploadSettingVOs).get(i);
+            //判断 如果说 Json 解析出来的 List<T> 中的 sourceId 和传入参数的 sourceId 匹配成功 则开始装配数据
+            if (constant.getSourceId().equals(sourceId)) {
+                //填充数据
+                jsonData = constant.getColumn();
+            }
+        }
+        //返回填充好的数据
+        return jsonData;
+    }
+
+    /**
+     * @param getSettingJson 配置文件解析出的Json串
+     * @return uploadParamsVO 返回一个由processData方法填充完数据的Pojo类
+     * @date 2022/7/7
+     * @name 解析配置文件
+     * @description 通过与前段传入参数中的数据源ID进行比对从而得到对应数据源的配置(parsingConfigurationFiles的兄弟方法)
+     */
+    public static List<UploadSettingVO.Column> parsingConfigurationFilesBro(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("1")) {
+                //填充数据
+                jsonData = constant.getColumn();
+            }
+        }
+        //返回填充好的数据
+        return jsonData;
+    }
+
+    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);
+            }
+        }
+
+        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;
+    }
+
+}

+ 19 - 0
src/main/java/cn/cslg/pas/common/vo/ImportTaskAMVO.java

@@ -0,0 +1,19 @@
+package cn.cslg.pas.common.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 实体类表以及栏位信息
+ */
+@Data
+public class ImportTaskAMVO {
+    private Integer id;
+    private String fileGuid;
+    private Integer type;
+    private Integer allNum;
+    private Integer successNum;
+    private Integer   sourceId;
+
+}

+ 68 - 0
src/main/java/cn/cslg/pas/common/vo/UploadSettingVO.java

@@ -0,0 +1,68 @@
+package cn.cslg.pas.common.vo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * uploadSetting.json数据源配置文件实体类
+ *
+ * @author 沈永艺
+ * @date 2022/7/1
+ * @description 用于存储从配置文件(Json类型)中解析出来的配置参数
+ */
+
+@Data
+@Accessors(chain = true)
+public class UploadSettingVO {
+    /**
+     * 数据来源id(1.智慧芽 2.合享 3.Patentics)
+     */
+    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;
+    }
+
+}

+ 9 - 1
src/main/java/cn/cslg/pas/common/vo/business/EventVO.java

@@ -1,6 +1,7 @@
 package cn.cslg.pas.common.vo.business;
 
 import cn.cslg.pas.common.model.cronModel.SystemFile;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.joda.time.DateTime;
@@ -31,10 +32,17 @@ public class EventVO {
     @Schema(description = "客户名称")
     private String clientName;
     @Schema(description = "场景id")
+    private List<Integer> scenarioIds;
+    @Schema(description = "场景id")
     private Integer scenarioId;
+
     @Schema(description = "场景名称")
-    private String scenarioName;
+    private List<String> scenarioNames;
     @Schema(description = "发生时间")
+    @JsonFormat(
+            pattern = "yyyy-MM-dd",
+            timezone = "GMT+8"
+    )
     private Date eventDate;
     @Schema(description = "创建时间")
     private Date createTime;

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

@@ -69,6 +69,8 @@ public class PatentDigProjectVO {
      */
     private Integer state;
 
+    private String stateName;
+
     /**
      * 委托类型(1客户,2部门)
      */

+ 3 - 0
src/main/java/cn/cslg/pas/common/vo/business/ReportProjectVO.java

@@ -126,6 +126,9 @@ public class ReportProjectVO {
     @Schema(description = "状态")
     private  Integer status;
 
+    @Schema(description = "报告类型")
+    private String statusName;
+
     /**
      * 案件编号
      */

+ 18 - 0
src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportFactory.java

@@ -0,0 +1,18 @@
+package cn.cslg.pas.factorys.PatentImportFactory;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class PatentImportFactory {
+    @Autowired
+    private Map<String, PatentImportImp> patentImportMap;
+
+
+    public PatentImportImp getClass(String shapeType) {
+        PatentImportImp bean= patentImportMap.get(shapeType);
+        return bean;
+    }
+}

+ 14 - 0
src/main/java/cn/cslg/pas/factorys/PatentImportFactory/PatentImportImp.java

@@ -0,0 +1,14 @@
+package cn.cslg.pas.factorys.PatentImportFactory;
+
+import cn.cslg.pas.common.model.request.GroupRequest;
+import cn.cslg.pas.common.model.request.QueryRequest;
+import cn.cslg.pas.service.importPatent.TaskThread;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface PatentImportImp {
+    public void startPatentThread();
+    public void setTaskThread(TaskThread taskThread);
+}

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

@@ -368,7 +368,7 @@ public class EventService extends ServiceImpl<EventMapper, Event> implements Bus
         //装载信息
         for (EventVO eventVO : eventVOs) {
             //装载人员信息
-            Personnel personnel = personnels.stream().filter(item -> item.getId().equals(Integer.parseInt(eventVO.getCreateId()))).findFirst().orElse(null);
+            Personnel personnel = personnels.stream().filter(item -> item.getId().equals(eventVO.getCreateId())).findFirst().orElse(null);
             if (personnel != null) {
                 eventVO.setCreateName(personnel.getPersonnelName());
             }
@@ -382,7 +382,8 @@ public class EventService extends ServiceImpl<EventMapper, Event> implements Bus
             //装载场景
             SystemDict systemDict = systemDictList.stream().filter(item -> item.getValue().equals(eventVO.getScenarioId().toString())).findFirst().orElse(null);
             if (systemDict != null) {
-                eventVO.setScenarioName(systemDict.getLabel());
+                eventVO.setScenarioNames(Arrays.asList(systemDict.getLabel()));
+                eventVO.setScenarioIds(Arrays.asList(eventVO.getScenarioId()));
             }
 
             //装载文件信息

+ 15 - 0
src/main/java/cn/cslg/pas/service/business/PatentDigProjectService.java

@@ -82,6 +82,8 @@ public class PatentDigProjectService extends ServiceImpl<PatentDigProjectMapper,
     @Autowired
     private QueryGroupFactory queryGroupFactory;
 
+    @Autowired
+    private  SystemDictService systemDictService;
     @Override
     public Object queryMessage(QueryRequest queryRequest) throws Exception {
         List<String> sqls = formatQueryService.reSqls(queryRequest, "patentDigProject");
@@ -537,6 +539,7 @@ if(rdProject.getId()!=null) {
         List<Integer> clientIds = new ArrayList<>();
         List<AssoProjectPerson> assoProjectPersonList = new ArrayList<>();
         List<DepartmentVO> departmentVOS = new ArrayList<>();
+        List<SystemDict> systemDictList = new ArrayList<>();
         //获得创建人id集合
         patentDigProjectVOS.forEach(
                 item -> {
@@ -568,6 +571,12 @@ if(rdProject.getId()!=null) {
             queryWrapper.in(AssoProjectFile::getProjectId, ids);
             assoProjectFiles = assoProjectFileService.list(queryWrapper);
             guids = assoProjectFiles.stream().map(AssoProjectFile::getFileGuid).collect(Collectors.toList());
+
+            //
+            LambdaQueryWrapper<SystemDict> systemDictLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            systemDictLambdaQueryWrapper.eq(SystemDict::getType, "REPORT_STATE");
+            systemDictList = systemDictService.list(systemDictLambdaQueryWrapper);
+
         }
 
 
@@ -729,6 +738,12 @@ if(rdProject.getId()!=null) {
                 }
 
             }
+
+            //装载报告状态
+            SystemDict systemDictStatus = systemDictList.stream().filter(item -> patentDigProjectVO.getState().equals(Integer.parseInt(item.getValue()))&&item.getType().equals("REPORT_STATE")).findFirst().orElse(null);
+            if (systemDictList != null) {
+                patentDigProjectVO.setStateName(systemDictStatus.getLabel());
+            }
         }
 
 

+ 42 - 36
src/main/java/cn/cslg/pas/service/business/ReportProjectService.java

@@ -96,6 +96,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
 
     @Autowired
     private ScenarioService scenarioService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Object queryMessage(QueryRequest queryRequest) throws Exception {
@@ -211,6 +212,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         records.setTotal(reGroupDataVO.getTotal());
         return records;
     }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Object addMessage(Object object) {
@@ -236,7 +238,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         } catch (Exception e) {
             throw new UnLoginException("未登录");
         }
-        String userId =personnelVO.getId();
+        String userId = personnelVO.getId();
         /**
          * 装载project
          */
@@ -282,7 +284,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         /**
          * 装载和报告关联
          */
-        if(reportProjectDTO.getAssoReportId()!=null) {
+        if (reportProjectDTO.getAssoReportId() != null) {
             AssoProject assoProject = new AssoProject();
             assoProject.setAssoProjectId(project.getId());
             assoProject.setAssoProjectType(2);
@@ -396,7 +398,7 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         } catch (Exception e) {
             throw new UnLoginException("未登录");
         }
-        String userId =personnelVO.getId();
+        String userId = personnelVO.getId();
         /**
          * 装载project
          */
@@ -559,11 +561,11 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         List<Integer> clientIds = new ArrayList<>();
         List<Integer> ids = new ArrayList<>();
         List<Client> clients = new ArrayList<>();
-        List<Event> events =new ArrayList<>();
-        List<AssoReportCron> assoReportCrons =new ArrayList<>();
+        List<Event> events = new ArrayList<>();
+        List<AssoReportCron> assoReportCrons = new ArrayList<>();
         List<AssoProjectEvent> assoProjectEvents = new ArrayList<>();
-        List<SystemDict> systemDictList =new ArrayList<>();
-        List<SystemDict> reportTypeList =new ArrayList<>();
+        List<SystemDict> systemDictList = new ArrayList<>();
+        List<SystemDict> reportTypeList = new ArrayList<>();
         List<Scenario> scenarios = new ArrayList<>();
         List<Matter> matters = new ArrayList<>();
         reportProjectVOs.forEach(
@@ -601,8 +603,6 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
         List<AssoProjectFile> assoEventFiles = new ArrayList<>();
 
 
-
-
         //查询创建人名称
         if (createIds.size() != 0) {
             String res = permissionService.getPersonnelByIdsFromPCS(createIds);
@@ -626,17 +626,17 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
 
             //查询核心结论
             LambdaQueryWrapper<AssoReportCron> reportCronLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            reportCronLambdaQueryWrapper.in(AssoReportCron::getProjectId,ids);
-            assoReportCrons =assoReportCronService.list(reportCronLambdaQueryWrapper);
-            if(assoReportCrons!=null&&assoReportCrons.size()!=0){
+            reportCronLambdaQueryWrapper.in(AssoReportCron::getProjectId, ids);
+            assoReportCrons = assoReportCronService.list(reportCronLambdaQueryWrapper);
+            if (assoReportCrons != null && assoReportCrons.size() != 0) {
                 LambdaQueryWrapper<SystemDict> systemDictLambdaQueryWrapper = new LambdaQueryWrapper<>();
-                systemDictLambdaQueryWrapper.eq(SystemDict::getGroupType,"ASSESS");
-                systemDictList =systemDictService.list(systemDictLambdaQueryWrapper);
+                systemDictLambdaQueryWrapper.eq(SystemDict::getGroupType, "ASSESS");
+                systemDictList = systemDictService.list(systemDictLambdaQueryWrapper);
 
             }
             LambdaQueryWrapper<SystemDict> systemDictLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            systemDictLambdaQueryWrapper.eq(SystemDict::getType,"REPORT_TYPE");
-            reportTypeList=systemDictService.list(systemDictLambdaQueryWrapper);
+            systemDictLambdaQueryWrapper.eq(SystemDict::getType, "REPORT_TYPE").or().eq(SystemDict::getType, "REPORT_STATE");
+            reportTypeList = systemDictService.list(systemDictLambdaQueryWrapper);
 
         }
 
@@ -758,11 +758,11 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
                     List<Matter> matterTmps = matters.stream().filter(item -> matterIdsFilter.contains(item.getId())).collect(Collectors.toList());
                     List<Scenario> scenarioTmps = scenarios.stream().filter(item -> scenarioIdsFilter.contains(item.getId())).collect(Collectors.toList());
                     eventTmpNames = eventTmps.stream().map(Event::getName).collect(Collectors.toList());
-                    eventIds=eventTmps.stream().map(Event::getId).collect(Collectors.toList());
+                    eventIds = eventTmps.stream().map(Event::getId).collect(Collectors.toList());
                     matterTmpNames = matterTmps.stream().map(Matter::getName).collect(Collectors.toList());
-                    matterIds=matterTmps.stream().map(Matter::getId).collect(Collectors.toList());
+                    matterIds = matterTmps.stream().map(Matter::getId).collect(Collectors.toList());
                     scenarioTmpNames = scenarioTmps.stream().map(Scenario::getName).collect(Collectors.toList());
-                    scenarioIds=scenarioTmps.stream().map(Scenario::getId).collect(Collectors.toList());
+                    scenarioIds = scenarioTmps.stream().map(Scenario::getId).collect(Collectors.toList());
 
                 }
             }
@@ -774,31 +774,37 @@ public class ReportProjectService extends ServiceImpl<ReportProjectMapper, Repor
             reportProjectVO.setEventNames(eventTmpNames);
 
 
-            List<Integer> reCronIds =new ArrayList<>();
-            List<String> reCronNames =new ArrayList<>();
+            List<Integer> reCronIds = new ArrayList<>();
+            List<String> reCronNames = new ArrayList<>();
             //装载核心结论
-            if(assoReportCrons!=null&&assoReportCrons.size()!=0){
-                List<AssoReportCron> assoReportCronTmps =assoReportCrons.stream().filter(item->item.getProjectId().equals(reportProjectVO.getId())).collect(Collectors.toList());
+            if (assoReportCrons != null && assoReportCrons.size() != 0) {
+                List<AssoReportCron> assoReportCronTmps = assoReportCrons.stream().filter(item -> item.getProjectId().equals(reportProjectVO.getId())).collect(Collectors.toList());
                 if (assoReportCronTmps.size() != 0) {
                     //过滤出事件
-                  List<Integer>  cronIds = assoReportCronTmps.stream().map(AssoReportCron::getCronId).collect(Collectors.toList());
-                  List<SystemDict> systemDicts =systemDictList.stream().filter(item->cronIds.contains(Integer.parseInt(item.getValue()))).collect(Collectors.toList());
-                  systemDicts.forEach(item->{
-                      CronVO cronVO =new CronVO();
-                      reCronIds.add(Integer.parseInt(item.getValue()));
-                      reCronNames.add(item.getLabel());
-                  });
+                    List<Integer> cronIds = assoReportCronTmps.stream().map(AssoReportCron::getCronId).collect(Collectors.toList());
+                    List<SystemDict> systemDicts = systemDictList.stream().filter(item -> cronIds.contains(Integer.parseInt(item.getValue()))).collect(Collectors.toList());
+                    systemDicts.forEach(item -> {
+                        CronVO cronVO = new CronVO();
+                        reCronIds.add(Integer.parseInt(item.getValue()));
+                        reCronNames.add(item.getLabel());
+                    });
 
                 }
             }
-        reportProjectVO.setCronIds(reCronIds);
+            reportProjectVO.setCronIds(reCronIds);
             reportProjectVO.setCronNames(reCronNames);
 
-            //
-         SystemDict systemDict =   reportTypeList.stream().filter(item->reportProjectVO.getReportType().equals(Integer.parseInt(item.getValue()))).findFirst().orElse(null);
-         if(systemDict!=null){
-             reportProjectVO.setReportTypeName(systemDict.getLabel());
-         }
+            //装载报告类型
+            SystemDict systemDict = reportTypeList.stream().filter(item -> reportProjectVO.getReportType().equals(Integer.parseInt(item.getValue()))&&item.getType().equals("REPORT_TYPE")).findFirst().orElse(null);
+            if (systemDict != null) {
+                reportProjectVO.setReportTypeName(systemDict.getLabel());
+            }
+
+            //装载报告状态
+            SystemDict systemDictStatus = reportTypeList.stream().filter(item -> reportProjectVO.getReportType().equals(Integer.parseInt(item.getValue()))&&item.getType().equals("REPORT_STATE")).findFirst().orElse(null);
+            if (systemDict != null) {
+                reportProjectVO.setStatusName(systemDictStatus.getLabel());
+            }
 
         }
     }

+ 33 - 0
src/main/java/cn/cslg/pas/service/common/ExcuteUploadSettingService.java

@@ -0,0 +1,33 @@
+package cn.cslg.pas.service.common;
+
+
+import cn.cslg.pas.common.utils.FileUtils;
+import cn.cslg.pas.common.utils.UploadPatentBatchUtil;
+import cn.cslg.pas.common.vo.UploadSettingVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 解析数据源配置文件
+ *
+ * @Author chenyu
+ * @Date 2023/5/31
+ */
+@Service
+public class ExcuteUploadSettingService {
+    /**
+     * 解析数据源配置文件并返回配置文件对象
+     *
+     * @param sourceId 数据来源id
+     * @return 返回数据源配置文件对象
+     */
+    public List<UploadSettingVO.Column> ExcuteUploadSetting(String sourceId) {
+        //获得uploadSetting.json配置文件的JSON串
+        String getSettingJson = new FileUtils().analysisJsonFile();
+        //查找并装载本次导入的专利需要的数据源(如智慧芽)的对应配置(如前台传来的数据来源id是1,即“智慧芽”,那么jsonData装载的就是智慧芽的数据源配置)
+        List<UploadSettingVO.Column> jsonData = UploadPatentBatchUtil.parsingConfigurationFiles(sourceId, getSettingJson);
+        return jsonData;
+    }
+
+}

+ 83 - 0
src/main/java/cn/cslg/pas/service/importPatent/GetPatentFromExcelThread.java

@@ -0,0 +1,83 @@
+package cn.cslg.pas.service.importPatent;
+
+import cn.cslg.pas.common.model.cronModel.SystemFile;
+import cn.cslg.pas.common.utils.ReadExcelUtils;
+import cn.cslg.pas.common.vo.ImportTaskAMVO;
+import cn.cslg.pas.common.vo.UploadSettingVO;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.service.common.ExcuteUploadSettingService;
+import cn.cslg.pas.service.common.FileManagerService;
+import com.alibaba.fastjson.JSONArray;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+public class GetPatentFromExcelThread extends Thread{
+ private ImportTaskAMVO importTaskAMVO;
+ @Autowired
+ private FileManagerService fileManagerService;
+
+ @Autowired
+ private ExcuteUploadSettingService excuteUploadSettingService;
+ private SavePatentToEsThread savePatentToEsThread;
+    @Override
+    public void run() {
+        try {
+
+            String res = fileManagerService.getSystemFileFromFMS(Arrays.asList(importTaskAMVO.getFileGuid()));
+            List<SystemFile> systemFiles = JSONArray.parseArray(res, SystemFile.class);
+            SystemFile systemFile = systemFiles.get(0);
+            String suffix = systemFile.getFileName().substring(systemFile.getFileName().lastIndexOf("."));
+            //调用文件系统取出文件接口,获得文件流
+            byte[] bytes = fileManagerService.downloadSystemFileFromFMS(importTaskAMVO.getFileGuid());
+            //创建临时文件tempFile,并将文件读取到tempFile
+            File tempFile = File.createTempFile(systemFile.getFileName()+"temp", suffix);
+            Integer total = importTaskAMVO.getAllNum();
+            Integer lastIndex = importTaskAMVO.getSuccessNum();
+            Integer sourceId = importTaskAMVO.getSourceId();
+            //解析数据源类,通过数据来源id(如1:智慧芽)解析数据源配置文件,获得数据源配置文件对象jsonData
+            List<UploadSettingVO.Column> jsonData = excuteUploadSettingService.ExcuteUploadSetting(sourceId.toString());
+            //解析Excel文件获得工作簿
+            Sheet sheet = ReadExcelUtils.readExcel(tempFile);
+            //遍历专利总数量,在循环中将专利一个一个存入消费者专利队列
+//            for (int i = lastIndex; i < total; i++) {
+//                //判断若任务状态为已暂停,则结束生产
+//                if (pTaskId.equals(task.getId()) && pTaskStatus == 4) {
+//                    return;
+//                }
+//                PatentData patentData = ReadExcelUtils.readExcelOneRow(tempFile, sheet, i + 1);
+//                //调用装载数据类(根据数据源配置文件对象和专利源数据生成专利数据)
+//                UploadParamsVO uploadParamsVO = excuteDataToVOService.fileToPatentVO(patentData, jsonData);
+//                //如果是中国专利,就将申请号作为专利号
+//                if (uploadParamsVO.getPatent().getPatentNo().contains("CN")) {
+//                    uploadParamsVO.getPatent().setPatentNo(uploadParamsVO.getPatent().getApplicationNo());  //将申请号设为专利号patentNo
+//                }
+//
+//                //专利丢入消费者队列,并唤醒消费者线程
+//                pantentQueueService.patentToQueue(task, uploadParamsVO);
+//            }
+
+            //删除临时文件tempFile
+            new File(tempFile.getPath()).delete();
+            for(int i =0;i<10;i++)
+            {
+                Thread.sleep(5000);
+                Patent patent =new Patent();
+                patent.setPatentNo("CN"+i+"task"+importTaskAMVO.getId());
+                System.out.println("task"+importTaskAMVO.getId()+"getPatent"+i);
+                savePatentToEsThread.awakeTask(patent);
+            }
+savePatentToEsThread.setIfProductAll(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    public GetPatentFromExcelThread(ImportTaskAMVO importTaskAMVO,SavePatentToEsThread savePatentToEsThread){
+        this.importTaskAMVO =importTaskAMVO;
+        this.savePatentToEsThread =savePatentToEsThread;
+    }
+}

+ 23 - 0
src/main/java/cn/cslg/pas/service/importPatent/ImportFromExcelToEsService.java

@@ -0,0 +1,23 @@
+package cn.cslg.pas.service.importPatent;
+
+import cn.cslg.pas.factorys.PatentImportFactory.PatentImportImp;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+@Scope("prototype")
+@Service
+public class ImportFromExcelToEsService implements PatentImportImp {
+private TaskThread taskThread;
+    @Override
+    public void startPatentThread() {
+        SavePatentToEsThread savePatentToEsThread = new SavePatentToEsThread(taskThread);
+        GetPatentFromExcelThread getPatentFromExcelThread = new GetPatentFromExcelThread(taskThread.getImportTaskAMVO(), savePatentToEsThread);
+        savePatentToEsThread.start();
+        getPatentFromExcelThread.start();
+    }
+    @Override
+    public void setTaskThread(TaskThread taskThread) {
+        this.taskThread = taskThread;
+    }
+}

+ 60 - 0
src/main/java/cn/cslg/pas/service/importPatent/SavePatentToEsThread.java

@@ -0,0 +1,60 @@
+package cn.cslg.pas.service.importPatent;
+
+import cn.cslg.pas.common.vo.ImportTaskAMVO;
+import cn.cslg.pas.domain.es.Patent;
+import cn.cslg.pas.service.common.FileManagerService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class SavePatentToEsThread extends Thread {
+    private List<Patent> patents = new ArrayList<>();
+    private final Lock taskLock = new ReentrantLock();
+    private final Condition taskCondition = taskLock.newCondition();
+    private TaskThread taskThread;
+    private Boolean ifProductAll= false;
+    @Override
+    public void run() {
+        while (!ifProductAll||patents.size()>0) {
+            try {
+                //判断任务队列是否有任务,若没有则线程等待唤醒
+                if (patents.size() == 0) {
+                    taskLock.lock();
+                    taskCondition.await();
+                }
+         Thread.sleep(7000);
+             Patent patent=   patents.remove(0);
+                System.out.println("patent"+patent.getPatentNo()+"done");
+            } catch (Exception e) {
+            }
+        }
+      taskThread.awakeTaskThread();
+    }
+
+    public SavePatentToEsThread(TaskThread taskThread) {
+        this.taskThread=taskThread;
+
+    }
+
+
+    public void awakeTask(Patent patent) {
+        patents.add(patent);
+        if (taskLock.tryLock()) {
+            //taskLock.lock();
+            taskCondition.signalAll();
+            taskLock.unlock();
+        }
+    }
+
+    public void setIfProductAll(Boolean ifProductAll){
+
+        this.ifProductAll=ifProductAll;
+
+    }
+}

+ 47 - 0
src/main/java/cn/cslg/pas/service/importPatent/SchedulingTaskService.java

@@ -0,0 +1,47 @@
+package cn.cslg.pas.service.importPatent;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.vo.ImportTaskAMVO;
+import cn.cslg.pas.domain.business.ImportTask;
+import cn.cslg.pas.service.business.ImportTaskService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Service
+public class SchedulingTaskService {
+    @Autowired
+    private ImportTaskService importTaskService;
+
+    private ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(Constants.MAX_IMPORT_TASK_COUNT);
+
+
+    public void startTask() {
+        Integer freeCount = Constants.MAX_IMPORT_TASK_COUNT - executor.getActiveCount();
+
+        // 当正在活跃的线程数小于最大线程数时
+        if (freeCount > 0) {
+            //查找任务
+            LambdaQueryWrapper<ImportTask> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(ImportTask::getState, new ArrayList<>(Arrays.asList(0, 1)))
+                    .orderByDesc(ImportTask::getState);
+            List<ImportTask> importTaskList = importTaskService.list(queryWrapper);
+            if (importTaskList.size() > 0) {
+                //TODO 装载任务信息
+                List<ImportTaskAMVO> importTaskAMVOS =new ArrayList<>();
+                importTaskAMVOS.forEach(item -> {
+                    TaskThread taskThread = new TaskThread(item);
+                    executor.execute(taskThread);
+                });
+            }
+
+        }
+
+    }
+}

+ 6 - 0
src/main/resources/jsons/cronJsons/importTaskConfig.json

@@ -0,0 +1,6 @@
+[
+  {"taskType": 1,
+    "importClass": "importFromExcelToEsService",
+    "importTo": 1
+  }
+]

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

@@ -108,8 +108,8 @@
   },
   {"name":"应用场景",
     "type":"Array",
-    "value":"scenarioId",
-    "field": "scenarioId",
+    "value":"scenarioNames",
+    "field": "scenarioNames",
     "sqlField": "scenario_id",
     "sqlClass": "getComSql",
     "orderClass": "getScenarioNameOrder",

+ 26 - 2
src/main/resources/jsons/patentDigProject.json

@@ -133,6 +133,30 @@
     "ifShow": "true",
     "defaultHidden": "true"
   },
+  {"name":"相关事件",
+    "type":"Array",
+    "value":"eventNames",
+    "field": "eventNames",
+    "sqlField": "aspe.event_id",
+    "sqlClass": "getComSql",
+    "orderClass": "getEventOrder",
+    "groupClass":"getScenarioGroup",
+    "ifSearch":"false",
+    "ifGroup": "false",
+    "ifShow":"true"
+  },
+  {"name":"相关事件",
+    "type":"String",
+    "value":"eventNames",
+    "field": "eventNames",
+    "sqlField": "aspe.event_id",
+    "sqlClass": "getEventNameSql",
+    "orderClass": "getEventOrder",
+    "groupClass":"getScenarioGroup",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"false"
+  },
   {
     "name": "技术关键词",
     "type": "String",
@@ -164,8 +188,8 @@
   {
     "name": "状态",
     "type": "String",
-    "value": "state",
-    "field": "state",
+    "value": "stateName",
+    "field": "stateName",
     "sqlField": "dp.state",
     "sqlClass": "getComSql",
     "orderClass": "getComOrder",

+ 4 - 4
src/main/resources/jsons/reportProject.json

@@ -126,7 +126,7 @@
     "ifShow":"true"
   },
   {"name":"报告类型",
-    "type":"Integer",
+    "type":"String",
     "value":"reportTypeName",
     "field": "reportTypeName",
     "sqlField": "rp.report_type",
@@ -148,9 +148,9 @@
     "ifShow":"false"
   },
   {"name":"报告状态",
-    "type":"Integer",
-    "value":"status",
-    "field": "status",
+    "type":"String",
+    "value":"statusName",
+    "field": "statusName",
     "sqlField": "report_type",
     "sqlClass": "getComSql",
     "orderClass": "getComOrder",

+ 1 - 1
src/main/resources/mapper/ReportProjectMapper.xml

@@ -8,7 +8,7 @@
         createId,p.create_time as createTime, rp.report_type as reportType ,p.head_id as headId,p.department_id as
         departmentId,
         p.entrust_type as entrustType,p.entrust_id as entrustId,rp.product_or_tech as productOrTech,rp.cron_description
-        as cronDescription from report as rp left join project as p
+        as cronDescription ,rp.status as status from report as rp left join project as p
         on rp.project_id =p.id left join asso_report_cron arc on p.id =arc.project_id
         left join asso_project_event as aspe on p.id =aspe.project_id
         <if test="sql1!=''">

+ 12 - 6
src/test/java/cn/cslg/pas/service/EsServiceTests.java

@@ -1,18 +1,14 @@
 package cn.cslg.pas.service;
 
 import cn.cslg.pas.common.utils.RedisUtil;
-import cn.cslg.pas.controller.CommonController;
-import cn.cslg.pas.controller.EventController;
 import cn.cslg.pas.domain.es.Patent;
 import cn.cslg.pas.service.business.es.EsService;
-import cn.cslg.pas.service.permissions.PermissionService;
+
+import cn.cslg.pas.service.importPatent.SchedulingTaskService;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * @author chenyu
  * @date 2023/9/6
@@ -24,6 +20,9 @@ public class EsServiceTests {
 
     @Autowired
     private RedisUtil redisUtil;
+
+    @Autowired
+    private SchedulingTaskService importTaskAdd;
     @Test
     void addPatent() throws Exception {
         Patent patent =new Patent();
@@ -37,4 +36,11 @@ public class EsServiceTests {
         String a  = esService.getIdByPatentNo("CN202023204739.4");
     System.out.println(a);
     }
+
+
+    @Test
+    void addImportTask() throws  Exception {
+
+        Thread.sleep(1000000);
+    }
 }