From 27fffc4d89fb505cd2694767f7e7cf2ef4bab6a0 Mon Sep 17 00:00:00 2001
From: byteblogs168 <598092184@qq.com>
Date: Sun, 15 Oct 2023 23:18:21 +0800
Subject: [PATCH] =?UTF-8?q?feat:2.4.0=201.=20=E5=AE=8C=E6=88=90=E4=BB=BB?=
=?UTF-8?q?=E5=8A=A1=E7=9A=84=E6=96=B0=E5=A2=9E=E6=9B=B4=E6=96=B0=E5=88=A0?=
=?UTF-8?q?=E9=99=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
doc/sql/easy_retry_mysql.sql | 11 +-
.../dataobject/JobBatchResponseDO.java | 12 +
.../mapper/JobTaskBatchMapper.java | 4 +
.../mysql/mapper/JobTaskBatchMapper.xml | 5 +-
.../generator/task/ShardingTaskGenerator.java | 2 -
.../server/web/controller/JobController.java | 26 +-
.../web/model/request/JobRequestVO.java | 10 +-
.../request/JobUpdateJobStatusRequestVO.java | 21 +
.../model/response/JobBatchResponseVO.java | 15 +
.../retry/server/web/service/JobService.java | 4 +
.../convert/JobBatchResponseVOConverter.java | 10 +-
.../web/service/impl/JobBatchServiceImpl.java | 14 +-
.../web/service/impl/JobLogServiceImpl.java | 8 +
.../web/service/impl/JobServiceImpl.java | 25 +
frontend/src/api/jobApi.js | 17 +
frontend/src/config/router.config.js | 7 +
frontend/src/views/job/JobBatchInfo.vue | 29 +-
frontend/src/views/job/JobInfo.vue | 68 +--
frontend/src/views/job/JobList.vue | 206 +++-----
frontend/src/views/job/JobLogMessageList.vue | 13 +
frontend/src/views/job/from/JobFrom.vue | 476 ++++++++++++++++++
21 files changed, 793 insertions(+), 190 deletions(-)
create mode 100644 easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/dataobject/JobBatchResponseDO.java
create mode 100644 easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobUpdateJobStatusRequestVO.java
create mode 100644 frontend/src/views/job/from/JobFrom.vue
diff --git a/doc/sql/easy_retry_mysql.sql b/doc/sql/easy_retry_mysql.sql
index 5c5858a1..f76dc49c 100644
--- a/doc/sql/easy_retry_mysql.sql
+++ b/doc/sql/easy_retry_mysql.sql
@@ -221,13 +221,13 @@ CREATE TABLE `job` (
`job_name` varchar(64) NOT NULL COMMENT '名称',
`args_str` text NOT NULL COMMENT '执行方法参数',
`args_type` tinyint(4) NOT NULL DEFAULT '' COMMENT '参数类型 ',
- `ext_attrs` text NOT NULL COMMENT '扩展字段',
+ `ext_attrs` text COMMENT '扩展字段',
`next_trigger_at` datetime NOT NULL COMMENT '下次触发时间',
`job_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '重试状态 0、关闭、1、开启',
`task_type` varchar(255) DEFAULT NULL COMMENT '任务类型 1、集群 2、广播 3、切片',
`route_key` tinyint(4) NOT NULL DEFAULT '4' COMMENT '路由策略',
`executor_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '执行器类型',
- `executor_name` varchar(255) DEFAULT NULL COMMENT '执行器名称',
+ `executor_info` varchar(255) DEFAULT NULL COMMENT '执行器名称',
`trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间',
`trigger_interval` varchar(255) NOT NULL COMMENT '间隔时长',
`block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行',
@@ -250,7 +250,6 @@ CREATE TABLE `job_log_message` (
`job_id` bigint(20) NOT NULL COMMENT '任务信息id',
`task_batch_id` bigint(20) NOT NULL COMMENT '任务批次id',
`task_id` bigint(20) NOT NULL COMMENT '调度任务id',
- `client_address` varchar(255) DEFAULT NULL COMMENT '客户端地址',
`message` text NOT NULL COMMENT '调度信息',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段',
@@ -263,9 +262,9 @@ CREATE TABLE `job_task` (
`job_id` bigint(20) NOT NULL COMMENT '任务信息id',
`task_batch_id` bigint(20) NOT NULL COMMENT '调度任务id',
`parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父执行器id',
- `execute_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行的状态 0、失败 1、成功',
+ `task_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行的状态 0、失败 1、成功',
`retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '重试次数',
- `client_id` varchar(255) DEFAULT NULL COMMENT '客户端地址',
+ `client_info` varchar(255) DEFAULT NULL COMMENT '客户端地址 clientId#ip:port',
`result_message` text NOT NULL COMMENT '执行结果',
`args_str` text NOT NULL COMMENT '执行方法参数',
`args_type` varchar(16) NOT NULL DEFAULT '' COMMENT '参数类型 text/json',
@@ -279,7 +278,7 @@ CREATE TABLE `job_task_batch` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`group_name` varchar(64) NOT NULL COMMENT '组名称',
`job_id` bigint(20) NOT NULL COMMENT '任务id',
- `task_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '任务状态 0、失败 1、成功',
+ `task_batch_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '任务批次状态 0、失败 1、成功',
`operation_reason` tinyint(4) NOT NULL DEFAULT '0' COMMENT '操作原因',
`execution_at` datetime DEFAULT NULL COMMENT '任务执行时间',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
diff --git a/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/dataobject/JobBatchResponseDO.java b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/dataobject/JobBatchResponseDO.java
new file mode 100644
index 00000000..68eec676
--- /dev/null
+++ b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/dataobject/JobBatchResponseDO.java
@@ -0,0 +1,12 @@
+package com.aizuda.easy.retry.template.datasource.persistence.dataobject;
+
+import lombok.Data;
+
+/**
+ * @author www.byteblogs.com
+ * @date 2023-10-15 23:03:01
+ * @since 2.4.0
+ */
+@Data
+public class JobBatchResponseDO {
+}
diff --git a/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/JobTaskBatchMapper.java b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/JobTaskBatchMapper.java
index de16e8af..c5d98939 100644
--- a/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/JobTaskBatchMapper.java
+++ b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/JobTaskBatchMapper.java
@@ -1,10 +1,13 @@
package com.aizuda.easy.retry.template.datasource.persistence.mapper;
+import com.aizuda.easy.retry.template.datasource.persistence.dataobject.JobBatchResponseDO;
import com.aizuda.easy.retry.template.datasource.persistence.po.JobTaskBatch;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
/**
*
* 调度任务 Mapper 接口
@@ -16,4 +19,5 @@ import org.apache.ibatis.annotations.Param;
@Mapper
public interface JobTaskBatchMapper extends BaseMapper {
+ List selectJobBatchList();
}
diff --git a/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobTaskBatchMapper.xml b/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobTaskBatchMapper.xml
index 9a12dc50..94033ea9 100644
--- a/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobTaskBatchMapper.xml
+++ b/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/JobTaskBatchMapper.xml
@@ -12,5 +12,8 @@
-
+
diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/generator/task/ShardingTaskGenerator.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/generator/task/ShardingTaskGenerator.java
index 23d7b4b0..9c87a346 100644
--- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/generator/task/ShardingTaskGenerator.java
+++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/generator/task/ShardingTaskGenerator.java
@@ -34,8 +34,6 @@ import java.util.*;
@Slf4j
public class ShardingTaskGenerator extends AbstractJobTaskGenerator {
- @Autowired
- private JobMapper jobMapper;
@Autowired
protected ClientNodeAllocateHandler clientNodeAllocateHandler;
@Autowired
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java
index 141bdb7a..84255e7b 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/JobController.java
@@ -4,16 +4,12 @@ import com.aizuda.easy.retry.server.web.annotation.LoginRequired;
import com.aizuda.easy.retry.server.web.model.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.JobQueryVO;
import com.aizuda.easy.retry.server.web.model.request.JobRequestVO;
+import com.aizuda.easy.retry.server.web.model.request.JobUpdateJobStatusRequestVO;
import com.aizuda.easy.retry.server.web.model.response.JobResponseVO;
import com.aizuda.easy.retry.server.web.service.JobService;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -43,14 +39,26 @@ public class JobController {
@PostMapping
@LoginRequired
- public Boolean saveJob(@RequestBody JobRequestVO jobRequestVO) {
+ public Boolean saveJob(@RequestBody @Validated JobRequestVO jobRequestVO) {
return jobService.saveJob(jobRequestVO);
}
@PutMapping
@LoginRequired
- public Boolean updateJob(@RequestBody JobRequestVO jobRequestVO) {
+ public Boolean updateJob(@RequestBody @Validated JobRequestVO jobRequestVO) {
return jobService.updateJob(jobRequestVO);
}
+ @PutMapping("/status")
+ @LoginRequired
+ public Boolean updateJobStatus(@RequestBody @Validated JobUpdateJobStatusRequestVO jobRequestVO) {
+ return jobService.updateJobStatus(jobRequestVO);
+ }
+
+ @DeleteMapping("{id}")
+ @LoginRequired
+ public Boolean deleteJobById(@PathVariable("id") Long id) {
+ return jobService.deleteJobById(id);
+ }
+
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobRequestVO.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobRequestVO.java
index 7114a463..048d27e6 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobRequestVO.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobRequestVO.java
@@ -29,6 +29,12 @@ public class JobRequestVO {
@NotBlank(message = "jobName 不能为空")
private String jobName;
+ /**
+ * 重试状态 0、关闭、1、开启
+ */
+ @NotNull(message = "jobStatus 不能为空")
+ private Integer jobStatus;
+
/**
* 执行方法参数
*/
@@ -37,14 +43,14 @@ public class JobRequestVO {
/**
* 参数类型 text/json
*/
- @NotNull(message = "argsType 不能为空")
+// @NotNull(message = "argsType 不能为空")
private Integer argsType;
/**
* 执行器路由策略
*/
@NotNull(message = "routeKey 不能为空")
- private String routeKey;
+ private Integer routeKey;
/**
* 执行器类型 1、Java
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobUpdateJobStatusRequestVO.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobUpdateJobStatusRequestVO.java
new file mode 100644
index 00000000..776516ae
--- /dev/null
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobUpdateJobStatusRequestVO.java
@@ -0,0 +1,21 @@
+package com.aizuda.easy.retry.server.web.model.request;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author www.byteblogs.com
+ * @date 2023-10-15 16:06:20
+ * @since 2.4.0
+ */
+@Data
+public class JobUpdateJobStatusRequestVO {
+
+ @NotNull(message = "id 不能为空")
+ private Long id;
+
+ @NotNull(message = "jobStatus 不能为空")
+ private Integer jobStatus;
+
+}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/JobBatchResponseVO.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/JobBatchResponseVO.java
index c57e7132..6ac7dd08 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/JobBatchResponseVO.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/response/JobBatchResponseVO.java
@@ -19,6 +19,11 @@ public class JobBatchResponseVO {
*/
private String groupName;
+ /**
+ * 名称
+ */
+ private String jobName;
+
/**
* 任务信息id
*/
@@ -43,4 +48,14 @@ public class JobBatchResponseVO {
* 操作原因
*/
private Integer operationReason;
+
+ /**
+ * 执行器类型 1、Java
+ */
+ private Integer executorType;
+
+ /**
+ * 执行器名称
+ */
+ private String executorName;
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java
index 0fd0021f..c528bd23 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/JobService.java
@@ -3,6 +3,7 @@ package com.aizuda.easy.retry.server.web.service;
import com.aizuda.easy.retry.server.web.model.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.JobQueryVO;
import com.aizuda.easy.retry.server.web.model.request.JobRequestVO;
+import com.aizuda.easy.retry.server.web.model.request.JobUpdateJobStatusRequestVO;
import com.aizuda.easy.retry.server.web.model.response.JobResponseVO;
import java.util.List;
@@ -21,4 +22,7 @@ public interface JobService {
boolean updateJob(JobRequestVO jobRequestVO);
+ Boolean updateJobStatus(JobUpdateJobStatusRequestVO jobRequestVO);
+
+ Boolean deleteJobById(Long id);
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/JobBatchResponseVOConverter.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/JobBatchResponseVOConverter.java
index 78a7ea83..a18797fa 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/JobBatchResponseVOConverter.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/convert/JobBatchResponseVOConverter.java
@@ -1,8 +1,11 @@
package com.aizuda.easy.retry.server.web.service.convert;
import com.aizuda.easy.retry.server.web.model.response.JobBatchResponseVO;
+import com.aizuda.easy.retry.template.datasource.persistence.po.Job;
import com.aizuda.easy.retry.template.datasource.persistence.po.JobTaskBatch;
import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
@@ -19,5 +22,10 @@ public interface JobBatchResponseVOConverter {
List toJobBatchResponseVOs(List jobBatches);
- JobBatchResponseVO toJobBatchResponseVO(JobTaskBatch jobBatch);
+ @Mappings({
+ @Mapping(source = "jobBatch.groupName", target = "groupName"),
+ @Mapping(source = "jobBatch.id", target = "id"),
+ @Mapping(source = "jobBatch.createDt", target = "createDt")
+ })
+ JobBatchResponseVO toJobBatchResponseVO(JobTaskBatch jobBatch, Job job);
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java
index 59a7fc08..acdd645b 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobBatchServiceImpl.java
@@ -1,11 +1,14 @@
package com.aizuda.easy.retry.server.web.service.impl;
+import com.aizuda.easy.retry.common.core.enums.StatusEnum;
import com.aizuda.easy.retry.server.web.model.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.JobBatchQueryVO;
import com.aizuda.easy.retry.server.web.model.response.JobBatchResponseVO;
import com.aizuda.easy.retry.server.web.service.JobBatchService;
import com.aizuda.easy.retry.server.web.service.convert.JobBatchResponseVOConverter;
+import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper;
import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobTaskBatchMapper;
+import com.aizuda.easy.retry.template.datasource.persistence.po.Job;
import com.aizuda.easy.retry.template.datasource.persistence.po.JobTaskBatch;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
@@ -25,6 +28,8 @@ public class JobBatchServiceImpl implements JobBatchService {
@Autowired
private JobTaskBatchMapper jobTaskBatchMapper;
+ @Autowired
+ private JobMapper jobMapper;
@Override
public PageResult> getJobBatchPage(final JobBatchQueryVO queryVO) {
@@ -32,6 +37,8 @@ public class JobBatchServiceImpl implements JobBatchService {
PageDTO pageDTO = new PageDTO<>(queryVO.getPage(), queryVO.getSize());
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(JobTaskBatch::getDeleted, StatusEnum.NO.getStatus());
+
if (Objects.nonNull(queryVO.getJobId())) {
queryWrapper.eq(JobTaskBatch::getJobId, queryVO.getJobId());
}
@@ -47,6 +54,11 @@ public class JobBatchServiceImpl implements JobBatchService {
@Override
public JobBatchResponseVO getJobBatchDetail(final Long id) {
JobTaskBatch jobTaskBatch = jobTaskBatchMapper.selectById(id);
- return JobBatchResponseVOConverter.INSTANCE.toJobBatchResponseVO(jobTaskBatch);
+ if (Objects.isNull(jobTaskBatch)) {
+ return null;
+ }
+
+ Job job = jobMapper.selectById(jobTaskBatch.getJobId());
+ return JobBatchResponseVOConverter.INSTANCE.toJobBatchResponseVO(jobTaskBatch, job);
}
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobLogServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobLogServiceImpl.java
index e2d1e03d..4e3540d7 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobLogServiceImpl.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobLogServiceImpl.java
@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
+import java.util.Objects;
/**
* @author: www.byteblogs.com
@@ -31,6 +32,13 @@ public class JobLogServiceImpl implements JobLogService {
PageDTO pageDTO = new PageDTO<>(queryVO.getPage(), queryVO.getSize());
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ if (Objects.nonNull(queryVO.getJobId())) {
+ queryWrapper.eq(JobLogMessage::getJobId, queryVO.getJobId());
+ }
+
+ if (Objects.nonNull(queryVO.getTaskBatchId())) {
+ queryWrapper.eq(JobLogMessage::getTaskBatchId, queryVO.getTaskBatchId());
+ }
PageDTO selectPage = jobLogMessageMapper.selectPage(pageDTO, queryWrapper);
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java
index 0d18fac2..a0f9f830 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/JobServiceImpl.java
@@ -2,10 +2,13 @@ package com.aizuda.easy.retry.server.web.service.impl;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
+import com.aizuda.easy.retry.common.core.enums.StatusEnum;
import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException;
+import com.aizuda.easy.retry.server.retry.task.support.strategy.WaitStrategies;
import com.aizuda.easy.retry.server.web.model.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.JobQueryVO;
import com.aizuda.easy.retry.server.web.model.request.JobRequestVO;
+import com.aizuda.easy.retry.server.web.model.request.JobUpdateJobStatusRequestVO;
import com.aizuda.easy.retry.server.web.model.response.JobResponseVO;
import com.aizuda.easy.retry.server.web.service.JobService;
import com.aizuda.easy.retry.server.web.service.convert.JobConverter;
@@ -19,6 +22,7 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.TimeUnit;
/**
* @author www.byteblogs.com
@@ -37,6 +41,7 @@ public class JobServiceImpl implements JobService {
PageDTO pageDTO = new PageDTO<>(queryVO.getPage(), queryVO.getSize());
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(Job::getDeleted, StatusEnum.NO.getStatus());
if (StrUtil.isNotBlank(queryVO.getGroupName())) {
queryWrapper.eq(Job::getGroupName, queryVO.getGroupName());
}
@@ -66,6 +71,7 @@ public class JobServiceImpl implements JobService {
@Override
public boolean saveJob(JobRequestVO jobRequestVO) {
Job job = JobConverter.INSTANCE.toJob(jobRequestVO);
+ job.setNextTriggerAt(WaitStrategies.randomWait(1, TimeUnit.SECONDS, 60, TimeUnit.SECONDS).computeRetryTime(null));
return 1 == jobMapper.insert(job);
}
@@ -76,4 +82,23 @@ public class JobServiceImpl implements JobService {
Job job = JobConverter.INSTANCE.toJob(jobRequestVO);
return 1 == jobMapper.updateById(job);
}
+
+ @Override
+ public Boolean updateJobStatus(JobUpdateJobStatusRequestVO jobRequestVO) {
+ Assert.notNull(jobRequestVO.getId(), () -> new EasyRetryServerException("id 不能为空"));
+ Assert.isTrue(1 == jobMapper.selectCount(new LambdaQueryWrapper().eq(Job::getId, jobRequestVO.getId())));
+
+ Job job = new Job();
+ job.setId(jobRequestVO.getId());
+ job.setJobStatus(jobRequestVO.getJobStatus());
+ return 1 == jobMapper.updateById(job);
+ }
+
+ @Override
+ public Boolean deleteJobById(Long id) {
+ Job job = new Job();
+ job.setId(id);
+ job.setDeleted(StatusEnum.YES.getStatus());
+ return 1 == jobMapper.updateById(job);
+ }
}
diff --git a/frontend/src/api/jobApi.js b/frontend/src/api/jobApi.js
index cde1315c..82c5a17c 100644
--- a/frontend/src/api/jobApi.js
+++ b/frontend/src/api/jobApi.js
@@ -5,6 +5,8 @@ const jobApi = {
jobDetail: '/job/',
saveJob: '/job/',
updateJob: '/job/',
+ updateJobStatus: '/job/status',
+ delJob: '/job/',
// 任务批次
jobBatchList: '/job/batch/list',
@@ -19,6 +21,21 @@ const jobApi = {
export default jobApi
+export function delJob (id) {
+ return request({
+ url: jobApi.delJob + id,
+ method: 'delete'
+ })
+}
+
+export function updateJobStatus (data) {
+ return request({
+ url: jobApi.updateJobStatus,
+ method: 'put',
+ data
+ })
+}
+
export function jobLogList (parameter) {
return request({
url: jobApi.jobLogList,
diff --git a/frontend/src/config/router.config.js b/frontend/src/config/router.config.js
index 48791071..48213134 100644
--- a/frontend/src/config/router.config.js
+++ b/frontend/src/config/router.config.js
@@ -141,6 +141,13 @@ export const asyncRouterMap = [
component: () => import('@/views/job/JobInfo'),
meta: { title: '定时任务详情', icon: 'profile', permission: ['retryLog'] }
},
+ {
+ path: '/job/config',
+ name: 'JobFrom',
+ hidden: true,
+ component: () => import('@/views/job/from/JobFrom'),
+ meta: { title: '任务配置', icon: 'profile', permission: ['retryLog'] }
+ },
{
path: '/job/batch/list',
name: 'JobBatchList',
diff --git a/frontend/src/views/job/JobBatchInfo.vue b/frontend/src/views/job/JobBatchInfo.vue
index 8aa0e44d..907466d2 100644
--- a/frontend/src/views/job/JobBatchInfo.vue
+++ b/frontend/src/views/job/JobBatchInfo.vue
@@ -4,24 +4,37 @@
-
+
{{ jobBatchInfo.groupName }}
{{ jobBatchInfo.jobName }}
-
+
{{ taskStatus[jobBatchInfo.taskStatus].name }}
-
- {{ jobBatchInfo.updateDt }}
+
+
+ {{ executorType[jobBatchInfo.executorType].name }}
+
-
+
+
+ {{ operationReason[jobBatchInfo.operationReason].name }}
+
+
+
+ {{ jobBatchInfo.executionAt }}
+
+
{{ jobBatchInfo.executorName }}
+
+ {{ jobBatchInfo.createDt }}
+
@@ -47,7 +60,11 @@ export default {
return {
jobBatchInfo: null,
taskStatus: enums.taskStatus,
- operationReason: enums.operationReason
+ operationReason: enums.operationReason,
+ taskType: enums.taskType,
+ triggerType: enums.triggerType,
+ blockStrategy: enums.blockStrategy,
+ executorType: enums.executorType
}
},
created () {
diff --git a/frontend/src/views/job/JobInfo.vue b/frontend/src/views/job/JobInfo.vue
index a6262201..b40e8c6e 100644
--- a/frontend/src/views/job/JobInfo.vue
+++ b/frontend/src/views/job/JobInfo.vue
@@ -11,47 +11,29 @@
{{ jobInfo.jobName }}
-
-
- {{ triggerType[jobInfo.triggerType].name }}
+
+
+ {{ jobStatusEnum[jobInfo.jobStatus].name }}
-
- {{ jobInfo.triggerInterval }}
-
-
- {{ jobInfo.maxRetryTimes }}次
-
-
- {{ jobInfo.retryInterval }}(秒)
-
-
- {{ jobInfo.parallelNum }}
-
-
+
{{ routeKey[jobInfo.routeKey].name }}
-
-
- {{ executorType[jobInfo.executorType].name }}
-
-
-
-
- {{ taskType[jobInfo.taskType].name }}
-
-
{{ blockStrategy[jobInfo.blockStrategy].name }}
-
-
- {{ jobStatusEnum[jobInfo.jobStatus].name }}
-
+
+ {{ jobInfo.parallelNum }}
+
+
+ {{ jobInfo.maxRetryTimes }}次
+
+
+ {{ jobInfo.retryInterval }}(秒)
{{ jobInfo.executorTimeout }}(秒)
@@ -59,16 +41,34 @@
{{ jobInfo.nextTriggerAt }}
-
+
{{ jobInfo.updateDt }}
-
+
+
+ {{ triggerType[jobInfo.triggerType].name }}
+
+
+
+ {{ jobInfo.triggerInterval }}
+
+
+
+ {{ executorType[jobInfo.executorType].name }}
+
+
+
{{ jobInfo.executorName }}
-
+
+
+ {{ taskType[jobInfo.taskType].name }}
+
+
+
{{ jobInfo.argsStr }}
-
+
{{ jobInfo.extAttrs }}
diff --git a/frontend/src/views/job/JobList.vue b/frontend/src/views/job/JobList.vue
index a5e933ce..9c6265ac 100644
--- a/frontend/src/views/job/JobList.vue
+++ b/frontend/src/views/job/JobList.vue
@@ -14,40 +14,40 @@
-
-
-
-
- {{ item.sceneName }}
-
-
-
+
+
+
+
+
+
+
+
+
-
+
{{ index.name }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
批量-->
- 删除
- 更新
+
- 批量操作
+
@@ -83,8 +82,6 @@
:rowKey="(record) => record.id"
:columns="columns"
:data="loadData"
- :alert="options.alert"
- :rowSelection="options.rowSelection"
>
{{ record.id }}
@@ -119,40 +116,33 @@
详情
+ 编辑
+
- 暂停
+ 关闭
-
+
- 恢复
+ 开启
-
+
- 完成
-
-
-
- 执行
+ 删除
@@ -166,7 +156,7 @@
import ATextarea from 'ant-design-vue/es/input/TextArea'
import AInput from 'ant-design-vue/es/input/Input'
import { STable } from '@/components'
-import { getJobList } from '@/api/jobApi'
+import { delJob, getJobList, updateJobStatus } from '@/api/jobApi'
import { getAllGroupNameList } from '@/api/manage'
import enums from '@/utils/enum'
@@ -293,11 +283,11 @@ export default {
})
},
methods: {
- handleNew () {
- this.$refs.saveRetryTask.isShow(true, null)
+ handleEdit (record) {
+ this.$router.push({ path: '/job/config', query: { id: record.id } })
},
- handleBatchNew () {
- this.$refs.batchSaveRetryTask.isShow(true, null)
+ handleNew () {
+ this.$router.push({ path: '/job/config' })
},
handleChange (value) {
},
@@ -308,61 +298,38 @@ export default {
this.$router.push({ path: '/job/info', query: { id: record.id, groupName: record.groupName } })
},
handleOk (record) {},
- handleSuspend (record) {
- // updateRetryTaskStatus({ id: record.id, groupName: record.groupName, retryStatus: 3 }).then((res) => {
- // const { status } = res
- // if (status === 0) {
- // this.$message.error('暂停失败')
- // } else {
- // this.$refs.table.refresh(true)
- // this.$message.success('暂停成功')
- // }
- // })
+ handleClose (record) {
+ updateJobStatus({ id: record.id, jobStatus: 0 }).then((res) => {
+ const { status } = res
+ if (status === 0) {
+ this.$message.error('关闭失败')
+ } else {
+ this.$refs.table.refresh(true)
+ this.$message.success('关闭成功')
+ }
+ })
},
- handleRecovery (record) {
- // updateRetryTaskStatus({ id: record.id, groupName: record.groupName, retryStatus: 0 }).then((res) => {
- // const { status } = res
- // if (status === 0) {
- // this.$message.error('恢复失败')
- // } else {
- // this.$refs.table.refresh(true)
- // this.$message.success('恢复成功')
- // }
- // })
+ handleOpen (record) {
+ updateJobStatus({ id: record.id, jobStatus: 1 }).then((res) => {
+ const { status } = res
+ if (status === 0) {
+ this.$message.error('开启失败')
+ } else {
+ this.$refs.table.refresh(true)
+ this.$message.success('开启成功')
+ }
+ })
},
- handleFinish (record) {
- // updateRetryTaskStatus({ id: record.id, groupName: record.groupName, retryStatus: 1 }).then((res) => {
- // const { status } = res
- // if (status === 0) {
- // this.$message.error('执行失败')
- // } else {
- // this.$refs.table.refresh(true)
- // this.$message.success('执行成功')
- // }
- // })
- },
- handleTrigger (record) {
- // if (record.taskType === 1) {
- // manualTriggerRetryTask({ groupName: record.groupName, uniqueIds: [ record.uniqueId ] }).then(res => {
- // const { status } = res
- // if (status === 0) {
- // this.$message.error('执行失败')
- // } else {
- // this.$refs.table.refresh(true)
- // this.$message.success('执行成功')
- // }
- // })
- // } else {
- // manualTriggerCallbackTask({ groupName: record.groupName, uniqueIds: [ record.uniqueId ] }).then(res => {
- // const { status } = res
- // if (status === 0) {
- // this.$message.error('执行失败')
- // } else {
- // this.$refs.table.refresh(true)
- // this.$message.success('执行完成')
- // }
- // })
- // }
+ handleDel (record) {
+ delJob(record.id).then((res) => {
+ const { status } = res
+ if (status === 0) {
+ this.$message.error('删除失败')
+ } else {
+ this.$refs.table.refresh(true)
+ this.$message.success('删除成功')
+ }
+ })
},
refreshTable (v) {
this.$refs.table.refresh(true)
@@ -371,23 +338,6 @@ export default {
this.selectedRowKeys = selectedRowKeys
this.selectedRows = selectedRows
},
- handlerDel () {
- // var that = this
- // this.$confirm({
- // title: '您要删除这些数据吗?',
- // content: h => 删除后数据不可恢复,请确认!
,
- // onOk () {
- // batchDelete({ groupName: that.selectedRows[0].groupName, ids: that.selectedRowKeys }).then(res => {
- // that.$refs.table.refresh(true)
- // that.$message.success(`成功删除${res.data}条数据`)
- // that.selectedRowKeys = []
- // })
- // },
- // onCancel () {
- // },
- // class: 'test'
- // })
- },
onClick ({ key }) {
if (key === '2') {
this.$refs.batchUpdateRetryTaskInfo.isShow(true, this.selectedRows, this.selectedRowKeys)
diff --git a/frontend/src/views/job/JobLogMessageList.vue b/frontend/src/views/job/JobLogMessageList.vue
index b534b28b..2559c0b3 100644
--- a/frontend/src/views/job/JobLogMessageList.vue
+++ b/frontend/src/views/job/JobLogMessageList.vue
@@ -66,6 +66,19 @@ export default {
total: 0
}
},
+ created () {
+ const taskBatchId = this.$route.query.taskBatchId
+ const jobId = this.$route.query.jobId
+ if (taskBatchId && jobId) {
+ this.queryParam = {
+ taskBatchId: taskBatchId,
+ jobId: jobId
+ }
+ this.$refs.table.refresh(true)
+ } else {
+ this.$router.push({ path: '/404' })
+ }
+ },
methods: {
refreshTable (v) {
this.queryParam = v
diff --git a/frontend/src/views/job/from/JobFrom.vue b/frontend/src/views/job/from/JobFrom.vue
new file mode 100644
index 00000000..f4e6bd1d
--- /dev/null
+++ b/frontend/src/views/job/from/JobFrom.vue
@@ -0,0 +1,476 @@
+
+
+
$router.go(-1)" style="margin: -24px -1px 0">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+ 重置
+
+
+
+
+
+
+
+
+ remove(k)"
+ />
+
+
+
+ 添加分片
+
+
+
+
+
+
+
+
+
+