chendayu há 2 anos atrás
pai
commit
16cbcc14c1
42 ficheiros alterados com 660 adições e 471 exclusões
  1. 8 15
      pom.xml
  2. 28 0
      src/main/java/com/example/demo/config/MybatisPlusConfig.java
  3. 2 3
      src/main/java/com/example/demo/config/QuartzConfig.java
  4. 7 7
      src/main/java/com/example/demo/config/WebMvcConfig.java
  5. 13 0
      src/main/java/com/example/demo/config/WebSocketConfig.java
  6. 1 7
      src/main/java/com/example/demo/controller/AssoTaskPersonelController.java
  7. 41 17
      src/main/java/com/example/demo/controller/QuartzController.java
  8. 0 5
      src/main/java/com/example/demo/controller/WebConfigController.java
  9. 0 54
      src/main/java/com/example/demo/domain/JsonPage.java
  10. 0 34
      src/main/java/com/example/demo/domain/PageDTO2.java
  11. 46 0
      src/main/java/com/example/demo/domain/dto/QrtzTaskAddNewDTO.java
  12. 50 0
      src/main/java/com/example/demo/domain/dto/QrtzTaskUpdateDTO.java
  13. 24 0
      src/main/java/com/example/demo/domain/dto/QueryPageDTO.java
  14. 26 0
      src/main/java/com/example/demo/domain/dto/QueryTaskDetailsDTO.java
  15. 1 1
      src/main/java/com/example/demo/domain/UploadFileDTO.java
  16. 1 1
      src/main/java/com/example/demo/domain/BaseEntity.java
  17. 2 1
      src/main/java/com/example/demo/domain/PatentCell.java
  18. 32 60
      src/main/java/com/example/demo/domain/QrtzTask.java
  19. 67 0
      src/main/java/com/example/demo/domain/entity/QrtzTaskDetail.java
  20. 1 1
      src/main/java/com/example/demo/domain/Sources.java
  21. 1 1
      src/main/java/com/example/demo/domain/WebConfig.java
  22. 1 1
      src/main/java/com/example/demo/domain/WebConfigCell.java
  23. 15 0
      src/main/java/com/example/demo/mapper/QrtzTaskDetailMapper.java
  24. 2 14
      src/main/java/com/example/demo/mapper/QrtzTaskMapper.java
  25. 1 2
      src/main/java/com/example/demo/mapper/WebConfigCellMapper.java
  26. 1 1
      src/main/java/com/example/demo/mapper/WebConfigMapper.java
  27. 0 64
      src/main/java/com/example/demo/model/dto/QuartzTaskDTO.java
  28. 1 1
      src/main/java/com/example/demo/model/dto/TaskWebSocketDTO.java
  29. 18 0
      src/main/java/com/example/demo/model/dto/WebQueryDTO.java
  30. 11 6
      src/main/java/com/example/demo/service/JobService.java
  31. 1 2
      src/main/java/com/example/demo/service/OutInterfaceService.java
  32. 43 0
      src/main/java/com/example/demo/service/QrTaskDetailService.java
  33. 67 46
      src/main/java/com/example/demo/service/QrTaskService.java
  34. 7 11
      src/main/java/com/example/demo/service/TaskAddJob.java
  35. 98 43
      src/main/java/com/example/demo/service/UploadFromWebService.java
  36. 1 3
      src/main/java/com/example/demo/service/WebConfigCellService.java
  37. 1 1
      src/main/java/com/example/demo/service/WebConfigService.java
  38. 20 14
      src/main/java/com/example/demo/service/WebUploadJob.java
  39. 1 3
      src/main/java/com/example/demo/util/FileUtils.java
  40. 17 0
      src/main/java/com/example/demo/util/MathUtils.java
  41. 3 1
      src/main/java/com/example/demo/util/WebSocketServer.java
  42. 0 51
      src/main/resources/mapper/QrtzTaskMapper.xml

+ 8 - 15
pom.xml

@@ -76,19 +76,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
-
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-quartz</artifactId>
         </dependency>
         <dependency>
@@ -145,14 +138,14 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
-<!--            <plugin>-->
-<!--                <groupId>org.apache.maven.plugins</groupId>-->
-<!--                <artifactId>maven-compiler-plugin</artifactId>-->
-<!--                <configuration>-->
-<!--                    <source>16</source>-->
-<!--                    <target>16</target>-->
-<!--                </configuration>-->
-<!--            </plugin>-->
+            <!--            <plugin>-->
+            <!--                <groupId>org.apache.maven.plugins</groupId>-->
+            <!--                <artifactId>maven-compiler-plugin</artifactId>-->
+            <!--                <configuration>-->
+            <!--                    <source>16</source>-->
+            <!--                    <target>16</target>-->
+            <!--                </configuration>-->
+            <!--            </plugin>-->
         </plugins>
     </build>
 

+ 28 - 0
src/main/java/com/example/demo/config/MybatisPlusConfig.java

@@ -0,0 +1,28 @@
+package com.example.demo.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+
+/**
+ * mybatis-plus分页拦截器
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+
+}

+ 2 - 3
src/main/java/com/example/demo/config/QuartzConfig.java

@@ -15,9 +15,7 @@ public class QuartzConfig {
         //指定任务描述具体的实现类
         return JobBuilder.newJob(WebUploadJob.class)
                 // 指定任务的名称
-                .withIdentity("dongAoJob")
-                // 任务描述
-                .withDescription("任务描述:用于输出冬奥欢迎语")
+                .withIdentity("webUploadJob", "Default")
                 // 每次任务执行后进行存储
                 .storeDurably()
                 .build();
@@ -31,6 +29,7 @@ public class QuartzConfig {
                 .forJob(jobDetail())
                 // 每隔 5 秒执行一次 job
                 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
+                .withIdentity("webUploadTrigger", "Default")
                 .build();
     }
 }

+ 7 - 7
src/main/java/com/example/demo/config/WebMvcConfig.java

@@ -6,13 +6,13 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 @Configuration
-    public class WebMvcConfig implements WebMvcConfigurer {
-        @Override
-        public void addResourceHandlers(ResourceHandlerRegistry registry) {
-            // /images/**是静态映射, file:/root/images/是文件在服务器的路径
-            registry.addResourceHandler("/**")
-                    .addResourceLocations("file:D:/QMS/target/file/");
-        }
+public class WebMvcConfig implements WebMvcConfigurer {
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // /images/**是静态映射, file:/root/images/是文件在服务器的路径
+        registry.addResourceHandler("/**")
+                .addResourceLocations("file:D:/QMS/target/file/");
     }
+}
 
 

+ 13 - 0
src/main/java/com/example/demo/config/WebSocketConfig.java

@@ -0,0 +1,13 @@
+package com.example.demo.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+public class WebSocketConfig {
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}

+ 1 - 7
src/main/java/com/example/demo/controller/AssoTaskPersonelController.java

@@ -1,16 +1,12 @@
 package com.example.demo.controller;
 
 import com.example.demo.base.Constants;
-import com.example.demo.domain.PatentCell;
+import com.example.demo.domain.entity.PatentCell;
 import com.example.demo.model.dto.WebQueryDTO;
 import com.example.demo.service.UploadFromWebService;
-import com.example.demo.util.FileUtils;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.web.bind.annotation.*;
 
@@ -18,9 +14,7 @@ import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Set;
 
 @Tag(name = "任务人员操作")
 @RestController

+ 41 - 17
src/main/java/com/example/demo/controller/QuartzController.java

@@ -1,9 +1,13 @@
 package com.example.demo.controller;
 
 import com.example.demo.base.Constants;
-import com.example.demo.domain.QrtzTask;
-import com.example.demo.model.dto.QuartzTaskDTO;
+import com.example.demo.domain.dto.QrtzTaskAddNewDTO;
+import com.example.demo.domain.dto.QrtzTaskUpdateDTO;
+import com.example.demo.domain.dto.QueryPageDTO;
+import com.example.demo.domain.dto.QueryTaskDetailsDTO;
+import com.example.demo.domain.entity.QrtzTask;
 import com.example.demo.service.JobService;
+import com.example.demo.service.QrTaskDetailService;
 import com.example.demo.service.QrTaskService;
 import com.example.demo.util.Response;
 import io.swagger.v3.oas.annotations.Operation;
@@ -23,40 +27,49 @@ import java.util.List;
 public class QuartzController {
     private final JobService jobService;
     private final QrTaskService qrTaskService;
+    private final QrTaskDetailService qrTaskDetailService;
 
-    @Operation(summary = "添加任务")
+    @Operation(summary = "添加任务条件")
     @PostMapping("/addTask")
-    public String addTask(@RequestBody QuartzTaskDTO quartzTaskDTO) throws SchedulerException {
+    public String addTask(@RequestBody QrtzTaskAddNewDTO qrtzTaskAddNewDTO) throws SchedulerException {
         //添加任务
-        QrtzTask qrtzTask = qrTaskService.addQuartzTask(quartzTaskDTO);
-        //任务添加完成后,判断是定时任务则再由定时任务定时添加该任务
-        if (quartzTaskDTO.getTaskType().equals(1)) {
+        QrtzTask qrtzTask = qrTaskService.addQuartzTask(qrtzTaskAddNewDTO);
+        //任务添加完,判断是定时任务则任务调度添加该定时任务
+        if (qrtzTask.getTaskType() == 1) {
             jobService.addJob(qrtzTask);
         }
         return Response.success("添加任务完成");
     }
 
-    @Operation(summary = "删除任务")
+    @Operation(summary = "删除任务条件")
     @PostMapping("/deleteTasks")
     public String deleteTasks(@RequestBody List<Integer> taskIds) throws SchedulerException {
         return Response.success(qrTaskService.deleteQuartzTask(taskIds));
     }
 
-    @Operation(summary = "查询任务")
+    @Operation(summary = "查询任务条件列表")
     @PostMapping("/getTasks")
-    public Response getTasks(@RequestBody QuartzTaskDTO quartzTaskDTO) {
-        return Response.success2(qrTaskService.getTasks(quartzTaskDTO));
+    public String getTasks(@RequestBody QueryPageDTO queryPageDTO) {
+        return Response.success(qrTaskService.getTasks(queryPageDTO));
     }
 
-    @Operation(summary = "更新任务")
-    @PostMapping("/update")
-    public void update(@RequestBody QuartzTaskDTO quartzTaskDTO) throws InterruptedException, SchedulerException {
-        QrtzTask qrtzTask = qrTaskService.updateQuartzTask(quartzTaskDTO);
-        jobService.updateJob(qrtzTask);
+    @Operation(summary = "查询任务执行情况列表")
+    @PostMapping("/getTaskDetails")
+    public String getTaskDetails(@RequestBody QueryTaskDetailsDTO queryTaskDetailsDTO) {
+        return Response.success(qrTaskService.getTaskDetails(queryTaskDetailsDTO));
+    }
 
+    @Operation(summary = "更新任务条件")
+    @PostMapping("/update")
+    public String update(@RequestBody QrtzTaskUpdateDTO qrtzTaskUpdateDTO) throws InterruptedException, SchedulerException {
+        QrtzTask qrtzTask = qrTaskService.updateQuartzTask(qrtzTaskUpdateDTO);
+        if (qrtzTask.getTaskType() == 1) {
+            jobService.updateJob(qrtzTask);
+        }
+        return Response.success();
     }
 
-    @Operation(summary = "暂停任务")
+    @Operation(summary = "暂停任务条件")
     @GetMapping("/pauseJob")
     public void pauseJob(Integer taskId) throws SchedulerException {
         jobService.pauseJob(taskId);
@@ -70,4 +83,15 @@ public class QuartzController {
 
     }
 
+    @Operation(summary = "更改任务详情状态")
+    @GetMapping("/setDetailState")
+    public String setDetailState(Integer taskId, Integer state) throws SchedulerException {
+        Integer flag = qrTaskDetailService.setDetailState(taskId, state);
+        if (flag.equals(0)) {
+            return Response.error("更改状态失败");
+        }
+        return Response.success("更改状态成功");
+
+    }
+
 }

+ 0 - 5
src/main/java/com/example/demo/controller/WebConfigController.java

@@ -1,17 +1,12 @@
 package com.example.demo.controller;
 
 import com.example.demo.base.Constants;
-import com.example.demo.domain.QrtzTask;
-import com.example.demo.model.dto.QuartzTaskDTO;
-import com.example.demo.service.JobService;
-import com.example.demo.service.QrTaskService;
 import com.example.demo.service.WebConfigCellService;
 import com.example.demo.service.WebConfigService;
 import com.example.demo.util.Response;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
-import org.quartz.SchedulerException;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.web.bind.annotation.*;
 

+ 0 - 54
src/main/java/com/example/demo/domain/JsonPage.java

@@ -1,54 +0,0 @@
-package com.example.demo.domain;
-
-import com.github.pagehelper.PageInfo;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 把封装着分页查询结果和分页信息的PageInfo类转换为本类并返回给前端(本类应和Page\PageInfo一样,既包含分页查询结果又包含分页信息)
- *
- * @Author chenyu
- * @Date 2023/2/16
- */
-@Data
-public class JsonPage implements Serializable {
-    /**
-     * 总页数
-     */
-    private Integer totalCurrents;
-    /**
-     * 总条数
-     */
-    private Long totalSizes;
-    /**
-     * 当前页 (页码)
-     */
-    private Integer current;
-    /**
-     * 每页条数
-     */
-    private Integer size;
-    /**
-     * 分页查询结果
-     */
-    private List<Object> list;
-
-    // 下面要编写一个能够将PageInfo类型对象转换为JsonPage类型对象的方法
-    // 如果需要将其他类型对象转换为JsonPage(例如SpringData的Page类型),另外编写方法即可
-    public static JsonPage restPage(PageInfo pageInfo) {
-        // 所谓转换的意思就是将pageInfo对象中的信息,赋值给JsonPage类型
-        JsonPage result = new JsonPage();
-        // 因为PageInfo和JsonPage同名属性较少,所以手动赋值
-        result.setTotalSizes(pageInfo.getTotal());
-        result.setTotalCurrents(pageInfo.getPages());
-        result.setCurrent(pageInfo.getPageNum());
-        result.setSize(pageInfo.getPageSize());
-        // 别忘了最后的分页数据
-        result.setList(pageInfo.getList());
-        // 最后返回JsonPage类型对象result
-        return result;
-    }
-
-}

+ 0 - 34
src/main/java/com/example/demo/domain/PageDTO2.java

@@ -1,34 +0,0 @@
-package com.example.demo.domain;
-
-import lombok.Data;
-import lombok.experimental.Accessors;
-
-import java.io.Serializable;
-
-/**
- * 分页查询前端传输DTO类
- *
- * @Author chenyu
- * @Date 2023/2/16
- */
-@Accessors(chain = true)
-@Data
-public class PageDTO2 implements Serializable {
-    /**
-     * 当前页数
-     */
-    private Integer current;
-    /**
-     * 每页条数
-     */
-    private Integer size;
-    /**
-     * 排序名称
-     */
-    private String orderBy;
-    /**
-     * 排序类型
-     */
-    private String orderType;
-
-}

+ 46 - 0
src/main/java/com/example/demo/domain/dto/QrtzTaskAddNewDTO.java

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

+ 50 - 0
src/main/java/com/example/demo/domain/dto/QrtzTaskUpdateDTO.java

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

+ 24 - 0
src/main/java/com/example/demo/domain/dto/QueryPageDTO.java

@@ -0,0 +1,24 @@
+package com.example.demo.domain.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 分页查询DTO
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@Accessors(chain = true)
+@Data
+public class QueryPageDTO {
+    /**
+     * 当前页
+     */
+    private Integer current;
+    /**
+     * 每页条数
+     */
+    private Integer size;
+
+}

+ 26 - 0
src/main/java/com/example/demo/domain/dto/QueryTaskDetailsDTO.java

@@ -0,0 +1,26 @@
+package com.example.demo.domain.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 分页查询任务执行情况DTO
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@Accessors(chain = true)
+@Data
+public class QueryTaskDetailsDTO extends QueryPageDTO {
+    /**
+     * 所属条件id
+     */
+    private Integer taskId;
+    /**
+     * 任务状态
+     */
+    private List<Integer> taskDetailStates;
+
+}

+ 1 - 1
src/main/java/com/example/demo/domain/UploadFileDTO.java

@@ -1,4 +1,4 @@
-package com.example.demo.domain;
+package com.example.demo.domain.dto;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/com/example/demo/domain/BaseEntity.java

@@ -1,4 +1,4 @@
-package com.example.demo.domain;
+package com.example.demo.domain.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;

+ 2 - 1
src/main/java/com/example/demo/domain/PatentCell.java

@@ -1,6 +1,7 @@
-package com.example.demo.domain;
+package com.example.demo.domain.entity;
 
 
+import com.example.demo.domain.dto.UploadFileDTO;
 import lombok.Data;
 import lombok.experimental.Accessors;
 

+ 32 - 60
src/main/java/com/example/demo/domain/QrtzTask.java

@@ -1,4 +1,4 @@
-package com.example.demo.domain;
+package com.example.demo.domain.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -12,97 +12,55 @@ import org.springframework.format.annotation.DateTimeFormat;
 import java.util.Date;
 
 /**
- * 定时任务表
+ * 任务执行情况的实体类
  *
- * @TableName qrtz_task
+ * @Author chenyu
+ * @Date 2023/3/27
  */
 @TableName(value = "qrtz_task")
 @Accessors(chain = true)
 @Data
-public class QrtzTask extends BaseEntity<QrtzTask> {
-    /**
-     * ID
-     */
-    @TableId(type = IdType.AUTO)
-    private Integer id;
+public class QrtzTask extends BaseEntity<QrtzTask>{
     /**
      * 专题库id
      */
+    @TableField(value = "project_id")
     private Integer projectId;
     /**
-     * 查询条件/检索信息
-     */
-    @TableField(value = "conditions")
-    private String conditions;
-    /**
      * 任务名称
      */
     @TableField(value = "task_name")
     private String taskName;
     /**
-     * 任务状态(0队列中 1进行中 2成功 3失败)
-     */
-    @TableField(value = "task_state")
-    private Integer taskState;
-    /**
-     * 总条数
-     */
-    @TableField(value = "all_num")
-    private Integer allNum;
-    /**
-     * 成功条数
-     */
-    @TableField(value = "success_num")
-    private Integer successNum;
-    /**
-     * 失败条数
-     */
-    @TableField(value = "default_num")
-    private Integer defaultNum;
-    /**
-     * cron表达式
-     */
-    @TableField(value = "crons")
-    private String crons;
-    /**
      * 任务类型(0普通任务 1定时任务)
      */
     @TableField(value = "task_type")
     private Integer taskType;
     /**
-     * 创建时间
+     * 状态(0等待中 1进行中 2成功 3失败 4等待下一次执行 5取消 6暂停)
      */
-    @TableField(value = "create_time")
-    private Date createTime;
+    @TableField(value = "task_state")
+    private Integer taskState;
     /**
-     * 任务顺序
+     * 检索信息
      */
-    @TableField(value = "task_order")
-    private Integer taskOrder;
+    @TableField(value = "conditions")
+    private String conditions;
     /**
-     * 配置id
+     * cron表达式
      */
-    @TableField(value = "config_id")
-    private Integer configId;
+    @TableField(value = "crons")
+    private String crons;
     /**
      * 下载字段
      */
     @TableField(value = "config_cells")
     private String configCells;
     /**
-     * 开始时间
+     * 网站id
      */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(value = "start_time")
-    private Date startTime;
-    /**
-     * 结束时间
-     */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(value = "end_time")
-    private Date endTime;
+    @TableField(value = "config_id")
+    private Integer configId;
     /**
      * 创建人id
      */
@@ -113,5 +71,19 @@ public class QrtzTask extends BaseEntity<QrtzTask> {
      */
     @TableField(value = "create_person_name")
     private String createPersonName;
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "create_time")
+    private Date createTime;
+    /**
+     * 最后修改时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "modified_time")
+    private Date modifiedTime;
 
 }

+ 67 - 0
src/main/java/com/example/demo/domain/entity/QrtzTaskDetail.java

@@ -0,0 +1,67 @@
+package com.example.demo.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 任务执行情况表的实体类
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@TableName(value = "qrtz_task_detail")
+@Accessors(chain = true)
+@Data
+public class QrtzTaskDetail extends BaseEntity<QrtzTaskDetail>{
+    /**
+     * 所属任务条件id
+     */
+    @TableField(value = "task_id")
+    private Integer taskId;
+    /**
+     * 任务状态(0等待中 1进行中 2成功 3失败 4等待下一次执行 5取消 6暂停)
+     */
+    @TableField(value = "task_detail_state")
+    private Integer taskDetailState;
+    /**
+     * 总条数
+     */
+    @TableField(value = "all_num")
+    private Integer allNum;
+    /**
+     * 成功条数
+     */
+    @TableField(value = "success_num")
+    private Integer successNum;
+    /**
+     * 失败条数
+     */
+    @TableField(value = "default_num")
+    private Integer defaultNum;
+    /**
+     * 任务顺序
+     */
+    @TableField(value = "task_order")
+    private Integer taskOrder;
+    /**
+     * 开始时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "start_time")
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(value = "end_time")
+    private Date endTime;
+
+}

+ 1 - 1
src/main/java/com/example/demo/domain/Sources.java

@@ -1,4 +1,4 @@
-package com.example.demo.domain;
+package com.example.demo.domain.entity;
 
 
 import lombok.Data;

+ 1 - 1
src/main/java/com/example/demo/domain/WebConfig.java

@@ -1,4 +1,4 @@
-package com.example.demo.domain;
+package com.example.demo.domain.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;

+ 1 - 1
src/main/java/com/example/demo/domain/WebConfigCell.java

@@ -1,4 +1,4 @@
-package com.example.demo.domain;
+package com.example.demo.domain.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;

+ 15 - 0
src/main/java/com/example/demo/mapper/QrtzTaskDetailMapper.java

@@ -0,0 +1,15 @@
+package com.example.demo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.example.demo.domain.entity.QrtzTaskDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 任务执行情况表的Mapper层接口
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@Mapper
+public interface QrtzTaskDetailMapper extends BaseMapper<QrtzTaskDetail> {
+}

+ 2 - 14
src/main/java/com/example/demo/mapper/QrtzTaskMapper.java

@@ -1,28 +1,16 @@
 package com.example.demo.mapper;
 
-import com.example.demo.domain.QrtzTask;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.example.demo.model.dto.QuartzTaskDTO;
+import com.example.demo.domain.entity.QrtzTask;
 import org.apache.ibatis.annotations.Mapper;
 
-import java.util.List;
-
 /**
  * @author admin
  * @description 针对表【qrtz_task(定时任务表)】的数据库操作Mapper
  * @createDate 2023-03-15 13:40:32
- * @Entity com.example.demo.domain.QrtzTask
+ * @Entity com.example.demo.domain.entity.QrtzTask
  */
 @Mapper
 public interface QrtzTaskMapper extends BaseMapper<QrtzTask> {
-    /**
-     * 根据专题库id和任务类型查询数据
-     *
-     * @param quartzTaskDTO 数据对象
-     * @return 返回查询到的数据
-     */
-    List<QrtzTask> selectBy(QuartzTaskDTO quartzTaskDTO);
-
-
 }
 

+ 1 - 2
src/main/java/com/example/demo/mapper/WebConfigCellMapper.java

@@ -2,8 +2,7 @@ package com.example.demo.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.example.demo.domain.WebConfig;
-import com.example.demo.domain.WebConfigCell;
+import com.example.demo.domain.entity.WebConfigCell;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

+ 1 - 1
src/main/java/com/example/demo/mapper/WebConfigMapper.java

@@ -2,7 +2,7 @@ package com.example.demo.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.example.demo.domain.WebConfig;
+import com.example.demo.domain.entity.WebConfig;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

+ 0 - 64
src/main/java/com/example/demo/model/dto/QuartzTaskDTO.java

@@ -1,64 +0,0 @@
-package com.example.demo.model.dto;
-
-import com.example.demo.domain.PageDTO2;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-import lombok.experimental.Accessors;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.util.Date;
-import java.util.List;
-
-@Accessors(chain = true)
-@Data
-public class QuartzTaskDTO extends PageDTO2 {
-    /**
-     * 专题库id
-     */
-    private Integer projectId;
-    /**
-     * 任务名称
-     */
-    private String taskName;
-    /**
-     * cron定时周期表达式
-     */
-    private String cron;
-    /**
-     * 检索信息
-     */
-    private String conditions;
-    /**
-     * 网站id
-     */
-    private Integer webConfigId;
-    /**
-     * 任务id
-     */
-    private Integer taskId;
-    /**
-     * 任务类型(0普通任务 1定时任务)
-     */
-    private Integer taskType;
-    /**
-     * 任务状态(0队列中 1进行中 2成功 3失败)
-     */
-    private Integer taskState;
-    /**
-     * 下载字段
-     */
-    private List<String> conCells;
-    /**
-     * 开始时间
-     */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date startTime;
-    /**
-     * 结束时间
-     */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date endTime;
-
-}

+ 1 - 1
src/main/java/com/example/demo/model/dto/TaskWebSocketDTO.java

@@ -14,6 +14,6 @@ public class TaskWebSocketDTO {
     private String url;
     private String fileName;
     private Integer taskType;
-    private Long percentage;
+    private Double percentage;
     private String oldName;
 }

+ 18 - 0
src/main/java/com/example/demo/model/dto/WebQueryDTO.java

@@ -6,10 +6,28 @@ import java.util.List;
 
 @Data
 public class WebQueryDTO {
+    /**
+     * 专题库id
+     */
     private Integer projectId;
+    /**
+     * 检索信息
+     */
     private String conditions;
+    /**
+     * 网站id
+     */
     private Integer webConfigId;
+    /**
+     * 任务id
+     */
     private Integer taskId;
+    /**
+     * 报告id
+     */
     private Integer reportId;
+    /**
+     * 下载字段
+     */
     private List<String> conCells;
 }

+ 11 - 6
src/main/java/com/example/demo/service/JobService.java

@@ -1,17 +1,15 @@
 package com.example.demo.service;
 
-import com.example.demo.domain.QrtzTask;
-import com.example.demo.model.dto.QuartzTaskDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.demo.domain.entity.QrtzTask;
+import com.example.demo.domain.entity.QrtzTaskDetail;
 import com.example.demo.model.vo.QuartzVO;
-import io.swagger.v3.oas.models.security.SecurityScheme;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.RequestBody;
 
 @Service
 @Slf4j
@@ -21,6 +19,7 @@ public class JobService {
     private final Scheduler scheduler;
 
     private final QrTaskService qrTaskService;
+    private final QrTaskDetailService qrTaskDetailService;
 
     /**
      * 删除job
@@ -35,6 +34,11 @@ public class JobService {
         JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName());
         scheduler.deleteJob(jobKey);
         qrTaskService.removeById(taskId);
+        //同时删除该任务条件的所有任务执行情况记录
+        LambdaQueryWrapper<QrtzTaskDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(QrtzTaskDetail::getTaskId, taskId);
+        qrTaskDetailService.remove(queryWrapper);
+
     }
 
     /**
@@ -44,7 +48,8 @@ public class JobService {
      */
     public void pauseJob(Integer taskId) throws SchedulerException {
         QuartzVO quartzVO = this.generateQuartzVO(taskId);
-        qrTaskService.updateState(taskId, 0);
+        //更新任务条件状态
+        qrTaskService.updateState(taskId, 6);
         JobKey jobKey = JobKey.jobKey(quartzVO.getJobName(), quartzVO.getJobGroupName());
         scheduler.pauseJob(jobKey);
     }

+ 1 - 2
src/main/java/com/example/demo/service/OutInterfaceService.java

@@ -1,7 +1,7 @@
 package com.example.demo.service;
 
 
-import com.example.demo.domain.PatentCell;
+import com.example.demo.domain.entity.PatentCell;
 import com.google.gson.Gson;
 
 import lombok.RequiredArgsConstructor;
@@ -15,7 +15,6 @@ import org.springframework.stereotype.Service;
 import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 /**
  * @author 沈永艺

+ 43 - 0
src/main/java/com/example/demo/service/QrTaskDetailService.java

@@ -0,0 +1,43 @@
+package com.example.demo.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.example.demo.domain.entity.QrtzTaskDetail;
+import com.example.demo.mapper.QrtzTaskDetailMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 任务执行情况业务层
+ *
+ * @Author chenyu
+ * @Date 2023/3/27
+ */
+@Slf4j
+@Service
+public class QrTaskDetailService extends ServiceImpl<QrtzTaskDetailMapper, QrtzTaskDetail> {
+    /**
+     * 更改任务详情状态
+     *
+     * @param taskId 任务详情id
+     * @param state  要更改的状态
+     * @return 返回更改后的状态
+     */
+    public Integer setDetailState(Integer taskId, Integer state) {
+        Integer flag = 0;
+        List<Integer> states = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));
+        if (states.contains(state) && taskId != null) {
+            QrtzTaskDetail qrtzTaskDetail = this.getById(taskId);
+            if (qrtzTaskDetail != null) {
+                qrtzTaskDetail.setTaskDetailState(state);
+                qrtzTaskDetail.updateById();
+                flag = state;
+            }
+        }
+        return flag;
+    }
+
+}

+ 67 - 46
src/main/java/com/example/demo/service/QrTaskService.java

@@ -1,22 +1,25 @@
 package com.example.demo.service;
 
-import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.example.demo.domain.JsonPage;
-import com.example.demo.domain.QrtzTask;
-import com.example.demo.model.dto.QuartzTaskDTO;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
+import com.example.demo.domain.dto.QrtzTaskAddNewDTO;
+import com.example.demo.domain.dto.QrtzTaskUpdateDTO;
+import com.example.demo.domain.dto.QueryPageDTO;
+import com.example.demo.domain.dto.QueryTaskDetailsDTO;
+import com.example.demo.domain.entity.QrtzTask;
+import com.example.demo.domain.entity.QrtzTaskDetail;
+import com.example.demo.mapper.QrtzTaskMapper;
+import com.example.demo.util.Response;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.SchedulerException;
+import org.springframework.beans.BeanUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
-import com.example.demo.mapper.QrtzTaskMapper;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -29,37 +32,55 @@ import java.util.List;
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class QrTaskService extends ServiceImpl<QrtzTaskMapper, QrtzTask> {
     private final JobService jobService;
-    private final QrtzTaskMapper qrtzTaskMapper;
+    private final QrTaskDetailService qrTaskDetailService;
 
     /**
-     * 添加定时任务
+     * 新增任务
      *
-     * @param quartzTaskDTO
+     * @param qrtzTaskAddNewDTO 新增条件任务DTO对象
      */
-    public QrtzTask addQuartzTask(QuartzTaskDTO quartzTaskDTO) {
-        List<String> cells = quartzTaskDTO.getConCells();
+    public QrtzTask addQuartzTask(QrtzTaskAddNewDTO qrtzTaskAddNewDTO) {
+        log.info("开始处理【新增任务条件】的业务,参数为:{}", qrtzTaskAddNewDTO);
+
+        //DTO数据赋值给任务条件实体类
         QrtzTask qrtzTask = new QrtzTask();
+        BeanUtils.copyProperties(qrtzTaskAddNewDTO, qrtzTask);
+
+        List<String> cells = qrtzTaskAddNewDTO.getConfigCells();
         if (cells == null) {
             qrtzTask.setConfigCells("");
         } else {
             qrtzTask.setConfigCells(String.join(",", cells));
         }
-        qrtzTask
-                .setConditions(quartzTaskDTO.getConditions())
-                .setProjectId(quartzTaskDTO.getProjectId())
-                .setTaskState(0)
-                .setCrons(quartzTaskDTO.getCron())
-                .setTaskType(quartzTaskDTO.getTaskType())
-                .setConfigId(quartzTaskDTO.getWebConfigId())
-                .setStartTime(new Date());
+        qrtzTask.setTaskState(0);
+
+        log.info("数据入任务条件表");
         qrtzTask.insert();
+
+        //任务执行情况表实体类
+        QrtzTaskDetail qrtzTaskDetail = new QrtzTaskDetail()
+                .setTaskId(qrtzTask.getId())
+                .setTaskDetailState(0);
+        log.info("数据入任务执行情况表");
+        qrtzTaskDetail.insert();
+
         return qrtzTask;
     }
 
-    public QrtzTask updateQuartzTask(QuartzTaskDTO quartzTaskDTO) {
-        QrtzTask qrtzTask = this.getById(quartzTaskDTO.getTaskId());
-        qrtzTask.setConditions(quartzTaskDTO.getConditions());
-        qrtzTask.setCrons(quartzTaskDTO.getCron());
+    public QrtzTask updateQuartzTask(QrtzTaskUpdateDTO qrtzTaskUpdateDTO) {
+        log.info("开始处理【更新任务条件】的业务,参数为:{}", qrtzTaskUpdateDTO);
+
+        //DTO数据赋值给实体类
+        QrtzTask qrtzTask = new QrtzTask();
+        BeanUtils.copyProperties(qrtzTaskUpdateDTO, qrtzTask);
+        List<String> cells = qrtzTaskUpdateDTO.getConfigCells();
+        if (cells == null) {
+            qrtzTask.setConfigCells("");
+        } else {
+            qrtzTask.setConfigCells(String.join(",", cells));
+        }
+        //更新任务条件数据
+        log.info("更新任务条件数据");
         qrtzTask.updateById();
         return qrtzTask;
     }
@@ -93,30 +114,30 @@ public class QrTaskService extends ServiceImpl<QrtzTaskMapper, QrtzTask> {
         return reIds;
     }
 
+    public Page<QrtzTask> getTasks(QueryPageDTO queryPageDTO) {
+        log.info("开始处理【查询任务条件列表】的业务,参数为:{}", queryPageDTO);
 
-    public JsonPage getTasks(QuartzTaskDTO quartzTaskDTO) {
-//        仁杰 ↓
-//        LambdaQueryWrapper<QrtzTask> queryWrapper = new LambdaQueryWrapper<>();
-//        //若任务类型有值则根据任务类型查任务列表
-//        if (quartzTaskDTO.getTaskType() != null) {
-//            queryWrapper.eq(QrtzTask::getTaskType, quartzTaskDTO.getTaskType());
-//        }
-//        //若任务名称有值则根据任务名称查任务列表
-//        if (quartzTaskDTO.getTaskName() != null) {
-//            queryWrapper.like(QrtzTask::getTaskName, quartzTaskDTO.getTaskName());
-//        }
-//        return this.list(queryWrapper);
-
-        log.info("开始处理【查询任务列表】的业务,参数为:{}", quartzTaskDTO);
-
-        Integer current = quartzTaskDTO.getCurrent();
-        Integer size = quartzTaskDTO.getSize();
-        if (current != null && size != null) {
-            PageHelper.startPage(current, size);
+        QueryWrapper<QrtzTask> queryWrapper = new QueryWrapper<>();
+        Page<QrtzTask> page = this.page(new Page<>(queryPageDTO.getCurrent(), queryPageDTO.getSize()), queryWrapper);
+        return page;
+    }
+
+    public Page<QrtzTaskDetail> getTaskDetails(QueryTaskDetailsDTO queryTaskDetailsDTO) {
+        log.info("开始处理【查询任务执行情况列表】的业务,参数为:{}", queryTaskDetailsDTO);
+
+        LambdaQueryWrapper<QrtzTaskDetail> queryWrapper = new LambdaQueryWrapper<>();
+
+        //根据所属任务条件id查询列表
+        if (queryTaskDetailsDTO.getTaskId() != null) {
+            queryWrapper.eq(QrtzTaskDetail::getTaskId, queryTaskDetailsDTO.getTaskId());
+        }
+        //根据任务状态查询列表
+        if (queryTaskDetailsDTO.getTaskDetailStates() != null && queryTaskDetailsDTO.getTaskDetailStates().size() != 0) {
+            queryWrapper.in(QrtzTaskDetail::getTaskDetailState, queryTaskDetailsDTO.getTaskDetailStates());
         }
-        List<QrtzTask> qrtzTasks = qrtzTaskMapper.selectBy(quartzTaskDTO);
-        return JsonPage.restPage(new PageInfo<>(qrtzTasks));
 
+        Page<QrtzTaskDetail> page = qrTaskDetailService.page(new Page<>(queryTaskDetailsDTO.getCurrent(), queryTaskDetailsDTO.getSize()), queryWrapper);
+        return page;
     }
 
 }

+ 7 - 11
src/main/java/com/example/demo/service/TaskAddJob.java

@@ -1,6 +1,7 @@
 package com.example.demo.service;
 
-import com.example.demo.domain.QrtzTask;
+import com.example.demo.domain.entity.QrtzTask;
+import com.example.demo.domain.entity.QrtzTaskDetail;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.quartz.DisallowConcurrentExecution;
@@ -22,15 +23,10 @@ public class TaskAddJob extends QuartzJobBean {
         JobDataMap jobDataMap = context.getTrigger().getJobDataMap();
         QrtzTask qrtzTask = (QrtzTask) jobDataMap.get("qrtzTask");
 
-        QrtzTask task = new QrtzTask();
-        task
-                .setTaskType(0)
-                .setConditions(qrtzTask.getConditions())
-                .setProjectId(qrtzTask.getProjectId())
-                .setConfigId(qrtzTask.getConfigId())
-                .setConfigCells(qrtzTask.getConfigCells())
-                .setTaskState(0);
-        task.insert();
-        logger.info("添加任务" + "信息是" + task);
+        QrtzTaskDetail qrtzTaskDetail = new QrtzTaskDetail()
+                .setTaskId(qrtzTask.getId())
+                .setTaskDetailState(0);
+        qrtzTaskDetail.insert();
+        logger.info("添加任务" + "信息是" + qrtzTaskDetail);
     }
 }

+ 98 - 43
src/main/java/com/example/demo/service/UploadFromWebService.java

@@ -1,35 +1,31 @@
 package com.example.demo.service;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.example.demo.base.Constants;
-import com.example.demo.domain.*;
-import com.example.demo.mapper.QrtzTaskMapper;
-import com.example.demo.model.dto.QuartzTaskDTO;
+import com.example.demo.domain.dto.UploadFileDTO;
+import com.example.demo.domain.entity.PatentCell;
+import com.example.demo.domain.entity.QrtzTask;
+import com.example.demo.domain.entity.QrtzTaskDetail;
+import com.example.demo.domain.entity.WebConfig;
 import com.example.demo.model.dto.TaskWebSocketDTO;
 import com.example.demo.model.dto.WebQueryDTO;
-import com.example.demo.util.FileUtils;
-import com.example.demo.util.Response;
-import com.example.demo.util.ResponseEnum;
-import com.example.demo.util.WebSocketServer;
-import io.swagger.v3.oas.models.security.SecurityScheme;
+import com.example.demo.util.*;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.htmlunit.HtmlUnitWebElement;
 import org.openqa.selenium.interactions.Actions;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
@@ -47,16 +43,25 @@ public class UploadFromWebService {
     private final OutInterfaceService outInterfaceService;
     private final WebConfigService webConfigService;
     private final QrTaskService qrTaskService;
+    private final QrTaskDetailService qrTaskDetailService;
 
     // 查询并上传(专利之星)
     public List<PatentCell> getPatentStar(WebQueryDTO webQueryDTO) throws Exception {
         List<PatentCell> patentCells = new ArrayList<>();
-
+        //当前任务执行情况
+        QrtzTaskDetail qrtzTaskDetail = qrTaskDetailService.getById(webQueryDTO.getTaskId());
+        Integer successNum1 = qrtzTaskDetail.getSuccessNum();
+        Integer startPage = successNum1 / 5;
+        Integer startNum = successNum1 % 5;
+        //当前任务条件
+        QrtzTask qrtzTask = qrTaskService.getById(qrtzTaskDetail.getTaskId());
+        //专利成功条数
+        int successNum = 0;
         try {
             List<String> cells = webQueryDTO.getConCells();
             String conditions = webQueryDTO.getConditions();
             Integer id = webQueryDTO.getWebConfigId();
-            conditions = this.formatConditions(conditions);
+            //conditions = this.formatConditions(conditions);
             //根据id 获得网站配置
             WebConfig webConfig = webConfigService.getConfigById(id);
             //1.获得驱动
@@ -83,9 +88,6 @@ public class UploadFromWebService {
             TimeUnit.MILLISECONDS.sleep(5000);//毫秒
             //获得表格搜索按钮并点击
             wait1.until(ExpectedConditions.presenceOfElementLocated(By.id("tablepage")));
-            WebElement countEle = driver.findElement(By.className("allcountlab"));
-            String countText = countEle.getText();
-            Integer count = Integer.parseInt(countText);
             WebElement tablePage = driver.findElement(By.id("tablepage"));
             WebElement tablePagea = tablePage.findElement(By.tagName("a"));
             tablePagea.click();
@@ -100,6 +102,13 @@ public class UploadFromWebService {
             List<WebElement> tcdNumbers = driver.findElements(By.className("tcdNumber"));
             String pagesText = tcdNumbers.get(tcdNumbers.size() - 1).getText();
             int page = Integer.parseInt(pagesText);
+            //获得总数
+            WebElement countEle = driver.findElement(By.className("allcountlab"));
+            String countText = countEle.getText();
+            Integer count = Integer.parseInt(countText);
+            //总数赋值给当前任务执行情况的总量属性
+            qrtzTaskDetail.setAllNum(count);
+            qrtzTaskDetail.updateById();
             String Handle = driver.getWindowHandle();
             //创建一个map集合存放浏览器句柄
             HashMap<String, String> handleMap = new HashMap<>();
@@ -111,14 +120,14 @@ public class UploadFromWebService {
             WebElement pagBtn = driver.findElement(By.className("page_btn"));
             pagBtn.click();
             TimeUnit.MILLISECONDS.sleep(10000);//毫秒
-            for (int p = 4; p < page; p++) {
+            for (int p = startPage; p < page; p++) {
                 //等待数据加载
                 wait1.until(ExpectedConditions.presenceOfElementLocated(By.className("patent")));
                 TimeUnit.MILLISECONDS.sleep(1000);//毫秒
                 //获得列表
                 List<WebElement> patentContents = driver.findElements(By.className("patent"));
                 // 页面元素标签
-                for (int i = 4; i < patentContents.size(); i++) {
+                for (int i = 1; i < patentContents.size(); i++) {
                     PatentCell patentCell = new PatentCell();
                     patentCell.setProjectId(webQueryDTO.getProjectId());
                     patentCell.setReportId(webQueryDTO.getReportId());
@@ -139,7 +148,21 @@ public class UploadFromWebService {
                     wait1.until(ExpectedConditions.presenceOfElementLocated(By.className("item-content")));
                     WebElement itemContent = driver.findElement(By.className("item-content"));
                     List<WebElement> divItems = itemContent.findElements(By.tagName("div"));
-                    for (int t = 0; t < divItems.size(); t++) {
+                    for (int t = startNum; t < divItems.size(); t++) {
+                        //查看任务状态
+                        QrtzTaskDetail qrtzTaskDetail1 = qrTaskDetailService.getById(webQueryDTO.getTaskId());
+                        if (qrtzTaskDetail1.getTaskDetailState().equals(7)) {
+                            qrtzTaskDetail1.setTaskDetailState(5);
+                            qrtzTaskDetail1.setSuccessNum(successNum);
+                            qrtzTaskDetail1.updateById();
+                            return null;
+                        } else if (qrtzTaskDetail1.getTaskDetailState().equals(8)) {
+                            qrtzTaskDetail1.setTaskDetailState(6);
+                            qrtzTaskDetail1.setSuccessNum(successNum);
+                            qrtzTaskDetail1.updateById();
+                            return null;
+
+                        }
                         WebElement temEle = divItems.get(t);
                         String text = temEle.getText();
                         String value = "";
@@ -206,7 +229,7 @@ public class UploadFromWebService {
                     //获得摘要
                     WebElement abstrElement = driver.findElement(By.className("item-summary"));
                     List<WebElement> spans = abstrElement.findElements(By.tagName("span"));
-                    if (cells.contains(1)) {
+                    if (cells.contains("1")) {
                         String abstrText = spans.get(0).getText();
                         patentCell.setAbstrText(abstrText);
                     }
@@ -218,7 +241,7 @@ public class UploadFromWebService {
                     String url = imag.getAttribute("src");
                     url = fileUtils.uploadToLocal(url, ".jpg").getPath();
                     patentCell.setPicUrl(url);
-                    if (cells.contains(2)) {
+                    if (cells.contains("2")) {
                         //获得主权要
                         String mainRight = spans.get(1).getText();
                         patentCell.setMainRignt(mainRight);
@@ -234,7 +257,7 @@ public class UploadFromWebService {
                         });
                         patentCell.setRights(rights);
                     }
-                    if (cells.contains(3)) {
+                    if (cells.contains("3")) {
                         //获得说明书
                         WebElement DSElement = driver.findElement(By.id("itemDS"));
                         DSElement.click();
@@ -258,7 +281,7 @@ public class UploadFromWebService {
                         patentCell.setPatentInstructionText(stringBuilder.toString());
                     }
                     //获得pdf文档
-                    if (cells.contains(4)) {
+                    if (cells.contains("4")) {
                         WebElement PDFElement = driver.findElement(By.id("itemPdf"));
                         PDFElement.click();
                         TimeUnit.MILLISECONDS.sleep(10000);//毫秒
@@ -287,7 +310,7 @@ public class UploadFromWebService {
                         }
                     }
 
-                    if (cells.contains(5)) {
+                    if (cells.contains("5")) {
                         //获得法律状态
                         WebElement flztElement = driver.findElement(By.id("flztbtn"));
                         flztElement.click();
@@ -307,36 +330,52 @@ public class UploadFromWebService {
                             affairs.add(affair);
                         });
                         patentCell.setPatentAffairs(affairs);
+                    }
+                    successNum++;
+                    if (patentCell.getPublicNo() != null) {
+                        patentCell.setPatentNo(patentCell.getPublicNo());
 
-                        if (patentCell.getPublicNo() != null) {
-                            patentCell.setPatentNo(patentCell.getPublicNo());
-
-                        } else {
-                            patentCell.setPatentNo(patentCell.getPublicAccreditNo());
-                            patentCell.setPublicNo(patentCell.getPublicAccreditNo());
-                        }
+                    } else {
+                        patentCell.setPatentNo(patentCell.getPublicAccreditNo());
+                        patentCell.setPublicNo(patentCell.getPublicAccreditNo());
                     }
                     if (patentCell.getPatentNo() != null) {
                         String res = outInterfaceService.importPatents(patentCell);
                         JSONObject jsonObject = JSONObject.parseObject(res);
                         if (jsonObject.get("code").toString().equals("500")) {
+                            //任务执行情况状态设为失败,任务条件状态设为已完成(若是任务条件是定时任务则设为等待下一次执行)
+                            qrtzTaskDetail.setTaskDetailState(3);
+                            qrtzTaskDetail.setSuccessNum(successNum);
+                            qrtzTaskDetail.setDefaultNum(count - successNum);
+                            qrtzTaskDetail.setEndTime(new Date());
+                            qrtzTaskDetail.updateById();
+                            if (qrtzTask.getTaskType() == 1) {
+                                qrtzTask.setTaskState(4);
+                            } else {
+                                qrtzTask.setTaskState(3);
+                            }
+                            qrtzTask.updateById();
                             return null;
                         }
                     }
 
+                    //计算进度值
+                    double percentage = count == 0 ? 0 : (count.equals(successNum) ? (successNum * 1D) : (successNum + 1D) / count * 100D);
+                    percentage = MathUtils.saveTwoDecimal(percentage);
                     WebSocketServer.sendInfo(Response.websocket(new TaskWebSocketDTO()
                             .setTaskId(webQueryDTO.getTaskId())
                             .setProjectId(webQueryDTO.getProjectId())
                             .setComplete(false)
-                            .setIndex(i)
+                            .setIndex(successNum)
                             .setTaskType(Constants.TASK_IMPORT_PATENT)
-                            .setPercentage(count == 0 ? 0 : Math.round((count.equals(i) ? (i * 1D) : (i + 1D)) / count * 100D))
+                            .setPercentage(percentage)
                             .setFileName("")
                             .setUrl("")
-                            .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "");
+                            .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "null");
                     patentCells.add(patentCell);
                     driver.close();
                     driver.switchTo().window(handleMap.get("mainPage"));
+
                 }
                 wait1.until(ExpectedConditions.presenceOfElementLocated(By.className("tcdPageCode")));
 
@@ -353,19 +392,35 @@ public class UploadFromWebService {
                     .setComplete(true)
                     .setIndex(count)
                     .setTaskType(Constants.TASK_IMPORT_PATENT)
-                    .setPercentage(100L)
+                    .setPercentage(100D)
                     .setFileName("")
                     .setUrl("")
                     .setTotal(count), ResponseEnum.PATENT_IMPORT_TASK_SUCCESS), "");
-            QrtzTask qrtzTask = qrTaskService.getById(webQueryDTO.getTaskId());
-            qrtzTask.setTaskState(2);
-            qrtzTask.setEndTime(new Date());
+            //任务执行情况状态设为成功,任务条件状态设为已完成(若是任务条件是定时任务则设为等待下一次执行)
+            qrtzTaskDetail.setTaskDetailState(2);
+            qrtzTaskDetail.setSuccessNum(successNum);
+            qrtzTaskDetail.setDefaultNum(qrtzTaskDetail.getAllNum() - successNum);
+            qrtzTaskDetail.setEndTime(new Date());
+            qrtzTaskDetail.updateById();
+            if (qrtzTask.getTaskType() == 1) {
+                qrtzTask.setTaskState(4);
+            } else {
+                qrtzTask.setTaskState(2);
+            }
             qrtzTask.updateById();
             driver.quit();
         } catch (Exception e) {
-            QrtzTask qrtzTask = qrTaskService.getById(webQueryDTO.getTaskId());
-            qrtzTask.setTaskState(3);
-            qrtzTask.setEndTime(new Date());
+            //任务执行情况状态设为失败,任务条件状态设为已完成(若是任务条件是定时任务则设为等待下一次执行)
+            qrtzTaskDetail.setTaskDetailState(3);
+            qrtzTaskDetail.setSuccessNum(successNum);
+            qrtzTaskDetail.setDefaultNum(qrtzTaskDetail.getAllNum() - successNum);
+            qrtzTaskDetail.setEndTime(new Date());
+            qrtzTaskDetail.updateById();
+            if (qrtzTask.getTaskType() == 1) {
+                qrtzTask.setTaskState(4);
+            } else {
+                qrtzTask.setTaskState(3);
+            }
             qrtzTask.updateById();
         }
         return patentCells;

+ 1 - 3
src/main/java/com/example/demo/service/WebConfigCellService.java

@@ -2,10 +2,8 @@ package com.example.demo.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.example.demo.domain.WebConfig;
-import com.example.demo.domain.WebConfigCell;
+import com.example.demo.domain.entity.WebConfigCell;
 import com.example.demo.mapper.WebConfigCellMapper;
-import com.example.demo.mapper.WebConfigMapper;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;

+ 1 - 1
src/main/java/com/example/demo/service/WebConfigService.java

@@ -2,7 +2,7 @@ package com.example.demo.service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
-import com.example.demo.domain.WebConfig;
+import com.example.demo.domain.entity.WebConfig;
 import com.example.demo.mapper.WebConfigMapper;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;

+ 20 - 14
src/main/java/com/example/demo/service/WebUploadJob.java

@@ -1,7 +1,8 @@
 package com.example.demo.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.example.demo.domain.QrtzTask;
+import com.example.demo.domain.entity.QrtzTask;
+import com.example.demo.domain.entity.QrtzTaskDetail;
 import com.example.demo.model.dto.WebQueryDTO;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -13,6 +14,7 @@ import org.springframework.scheduling.quartz.QuartzJobBean;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -26,26 +28,30 @@ public class WebUploadJob extends QuartzJobBean {
     @Autowired
     private QrTaskService qrTaskService;
     @Autowired
+    private QrTaskDetailService qrTaskDetailService;
+    @Autowired
     private UploadFromWebService uploadFromWebService;
 
     @Override
     public void executeInternal(JobExecutionContext context) throws JobExecutionException {
         //查找是否有任务正在进行
-        LambdaQueryWrapper<QrtzTask> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(QrtzTask::getTaskState, 1)
-                .eq(QrtzTask::getTaskType, 0);
-        List<QrtzTask> qrtzTaskList = qrTaskService.list(queryWrapper);
+        LambdaQueryWrapper<QrtzTaskDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(QrtzTaskDetail::getTaskDetailState, Arrays.asList(1, 7, 8));
+        List<QrtzTaskDetail> qrtzTaskDetailList = qrTaskDetailService.list(queryWrapper);
         //当无任务在进行时
-        if (qrtzTaskList.size() == 0) {
-            LambdaQueryWrapper<QrtzTask> getDoingWrapper = new LambdaQueryWrapper<>();
-            getDoingWrapper.eq(QrtzTask::getTaskState, 0)
-                    .eq(QrtzTask::getTaskType, 0)
-                    .orderByAsc(QrtzTask::getCreateTime).last("limit 1");
-            QrtzTask qrtzTask = qrTaskService.getOne(getDoingWrapper);
-            if (qrtzTask != null) {
+        if (qrtzTaskDetailList.size() == 0) {
+            LambdaQueryWrapper<QrtzTaskDetail> getDoingWrapper = new LambdaQueryWrapper<>();
+            getDoingWrapper.eq(QrtzTaskDetail::getTaskDetailState, 0)
+                    .orderByAsc(QrtzTaskDetail::getTaskOrder).last("limit 1");
+            QrtzTaskDetail qrtzTaskDetail = qrTaskDetailService.getOne(getDoingWrapper);
+            if (qrtzTaskDetail != null) {
+                qrtzTaskDetail.setTaskDetailState(1);
+                qrtzTaskDetail.setStartTime(new Date());
+                qrtzTaskDetail.updateById();
+                logger.info("上传任务" + "信息是" + qrtzTaskDetail);
+                QrtzTask qrtzTask = qrTaskService.getById(qrtzTaskDetail.getTaskId());
                 qrtzTask.setTaskState(1);
                 qrtzTask.updateById();
-                logger.info("上传任务" + "信息是" + qrtzTask);
                 String[] cells = qrtzTask.getConfigCells().split(",");
                 List<String> conCells = new ArrayList<>(Arrays.asList(cells));
                 WebQueryDTO webQueryDTO = new WebQueryDTO();
@@ -53,7 +59,7 @@ public class WebUploadJob extends QuartzJobBean {
                 webQueryDTO.setWebConfigId(qrtzTask.getConfigId());
                 webQueryDTO.setConditions(qrtzTask.getConditions());
                 webQueryDTO.setProjectId(qrtzTask.getProjectId());
-                webQueryDTO.setTaskId(qrtzTask.getId());
+                webQueryDTO.setTaskId(qrtzTaskDetail.getId());
                 try {
                     uploadFromWebService.getPatentStar(webQueryDTO);
                 } catch (Exception e) {

+ 1 - 3
src/main/java/com/example/demo/util/FileUtils.java

@@ -2,8 +2,7 @@ package com.example.demo.util;
 
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.IdUtil;
-import com.alibaba.fastjson.JSON;
-import com.example.demo.domain.UploadFileDTO;
+import com.example.demo.domain.dto.UploadFileDTO;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,7 +13,6 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 import java.io.*;
 import java.net.URL;
-import java.nio.charset.StandardCharsets;
 
 @Service
 public class FileUtils {

+ 17 - 0
src/main/java/com/example/demo/util/MathUtils.java

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

+ 3 - 1
src/main/java/com/example/demo/util/WebSocketServer.java

@@ -12,7 +12,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
 
 @Slf4j
 @Component
-@ServerEndpoint("aadad" + "/ws/{sid}")
+@ServerEndpoint(Constants.QUARTZ_API + "/ws/{sid}")
 public class WebSocketServer {
 
     //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
@@ -91,6 +91,8 @@ public class WebSocketServer {
                     item.sendMessage(message);
                 } else if (item.sid.equals(sid)) {
                     item.sendMessage(message);
+                } else {
+                    item.sendMessage(message);
                 }
             } catch (IOException e) {
                 continue;

+ 0 - 51
src/main/resources/mapper/QrtzTaskMapper.xml

@@ -2,57 +2,6 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="com.example.demo.mapper.QrtzTaskMapper">
-    <!--根据专题库id和任务类型查询数据-->
-    <!--List<QrtzTask> selectBy(QuartzTaskDTO quartzTaskDTO);-->
-    <select id="selectBy" resultMap="selectByMap">
-        select id,
-        project_id,
-        conditions,
-        task_name,
-        task_state,
-        all_num,
-        success_num,
-        default_num,
-        crons,
-        task_type,
-        task_order,
-        create_time,
-        config_id,
-        config_cells,
-        start_time,
-        end_time
-        from pas.qrtz_task
-        <where>
-            <if test="projectId != null and projectId != ''">
-                and project_id = #{projectId}
-            </if>
-            <if test="taskType != null and taskType != ''">
-                and task_type = #{taskType}
-            </if>
-            <if test="taskName != null and taskName != ''">
-                and task_name = #{taskName}
-            </if>
-        </where>
-        order by id
-    </select>
 
-    <resultMap id="selectByMap" type="com.example.demo.domain.QrtzTask">
-        <id column="id" property="id"/>
-        <result column="project_id" property="projectId"/>
-        <result column="conditions" property="conditions"/>
-        <result column="task_name" property="taskName"/>
-        <result column="task_state" property="taskState"/>
-        <result column="all_num" property="allNum"/>
-        <result column="success_num" property="successNum"/>
-        <result column="default_num" property="defaultNum"/>
-        <result column="crons" property="crons"/>
-        <result column="task_type" property="taskType"/>
-        <result column="task_order" property="taskOrder"/>
-        <result column="create_time" property="createTime"/>
-        <result column="config_id" property="configId"/>
-        <result column="config_cells" property="configCells"/>
-        <result column="start_time" property="startTime"/>
-        <result column="end_time" property="endTime"/>
-    </resultMap>
 
 </mapper>