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 @@ + + +