From 45d0c427eb4ec5bc2a55eeea99ef8c0f01d9fa20 Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Thu, 12 Oct 2023 23:09:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:2.4.0=201.=E6=96=B0=E5=A2=9Ejob=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E9=9D=A2=E3=80=81=E4=BB=BB=E5=8A=A1=E6=89=B9?= =?UTF-8?q?=E6=AC=A1=E5=88=97=E8=A1=A8=E9=A1=B5=202.=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E7=9A=84=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/web/model/request/JobQueryVO.java | 1 + .../model/response/JobBatchResponseVO.java | 33 ++ .../web/service/impl/JobServiceImpl.java | 5 + frontend/src/api/jobApi.js | 48 +- frontend/src/config/router.config.js | 143 +++--- frontend/src/views/job/JobBatch.vue | 441 +++++++++++++++++ frontend/src/views/job/JobInfo.vue | 102 ++++ frontend/src/views/job/JobList.vue | 119 +++-- frontend/src/views/job/JobTask.vue | 445 ++++++++++++++++++ 9 files changed, 1237 insertions(+), 100 deletions(-) create mode 100644 frontend/src/views/job/JobBatch.vue create mode 100644 frontend/src/views/job/JobInfo.vue create mode 100644 frontend/src/views/job/JobTask.vue diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobQueryVO.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobQueryVO.java index 43972446..683cb200 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobQueryVO.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobQueryVO.java @@ -14,4 +14,5 @@ import lombok.EqualsAndHashCode; public class JobQueryVO extends BaseQueryVO { private String groupName; private String jobName; + 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 a24d32d2..c57e7132 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 @@ -2,6 +2,8 @@ package com.aizuda.easy.retry.server.web.model.response; import lombok.Data; +import java.time.LocalDateTime; + /** * @author: www.byteblogs.com * @date : 2023-10-12 10:18 @@ -10,4 +12,35 @@ import lombok.Data; @Data public class JobBatchResponseVO { + private Long id; + + /** + * 组名称 + */ + private String groupName; + + /** + * 任务信息id + */ + private Long jobId; + + /** + * 任务状态 0、失败 1、成功 + */ + private Integer taskStatus; + + /** + * 创建时间 + */ + private LocalDateTime createDt; + + /** + * 任务执行时间 + */ + private LocalDateTime executionAt; + + /** + * 操作原因 + */ + private Integer operationReason; } 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 b4a22d60..0d18fac2 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 @@ -18,6 +18,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 @@ -44,6 +45,10 @@ public class JobServiceImpl implements JobService { queryWrapper.eq(Job::getJobName, queryVO.getJobName()); } + if (Objects.nonNull(queryVO.getJobStatus())) { + queryWrapper.eq(Job::getJobStatus, queryVO.getJobStatus()); + } + PageDTO selectPage = jobMapper.selectPage(pageDTO, queryWrapper); List jobResponseList = JobResponseVOConverter.INSTANCE.toJobResponseVOs(selectPage.getRecords()); diff --git a/frontend/src/api/jobApi.js b/frontend/src/api/jobApi.js index 3b77d46d..316d2172 100644 --- a/frontend/src/api/jobApi.js +++ b/frontend/src/api/jobApi.js @@ -1,11 +1,34 @@ import request from '@/utils/request' const jobApi = { + // 任务信息 + jobList: '/job/list', + jobDetail: '/job/', + saveJob: '/job/', + updateJob: '/job/', + + // 任务批次 + jobBatchList: '/job/batch/list', + jobBatchDetail: '/job/batch/' - jobList: '/job/list' } export default jobApi +export function jobBatchList (parameter) { + return request({ + url: jobApi.jobBatchList, + method: 'get', + params: parameter + }) +} + +export function jobBatchDetail (id) { + return request({ + url: jobApi.jobBatchDetail + id, + method: 'get' + }) +} + export function getJobList (parameter) { return request({ url: jobApi.jobList, @@ -13,3 +36,26 @@ export function getJobList (parameter) { params: parameter }) } + +export function getJobDetail (id) { + return request({ + url: jobApi.jobDetail + id, + method: 'get' + }) +} + +export function saveJob (data) { + return request({ + url: jobApi.saveJob, + method: 'post', + data + }) +} + +export function updateJob (data) { + return request({ + url: jobApi.updateJob, + method: 'put', + data + }) +} diff --git a/frontend/src/config/router.config.js b/frontend/src/config/router.config.js index 7bfb6cd1..a142f622 100644 --- a/frontend/src/config/router.config.js +++ b/frontend/src/config/router.config.js @@ -52,68 +52,106 @@ export const asyncRouterMap = [ meta: { title: '基础信息配置', hidden: true, hideChildrenInMenu: true, icon: 'profile', permission: ['basicConfig'] } }, { - path: '/retry-task', + path: '/retry', name: 'RetryTask', component: RouteView, - hideChildrenInMenu: true, - redirect: '/retry-task/list', - meta: { title: '任务管理', icon: 'schedule', hideChildrenInMenu: true, keepAlive: true, permission: ['retryTask'] }, + redirect: '/retry/list', + meta: { title: '重试任务管理', icon: 'schedule', hideChildrenInMenu: true, keepAlive: true, permission: ['retryTask'] }, children: [ { - path: '/retry-task/info', + path: '/retry/list', + name: 'RetryTaskList', + component: () => import('@/views/task/RetryTaskList'), + meta: { title: '重试任务', icon: 'profile', keepAlive: true, permission: ['retryTask'] } + }, + { + path: '/retry/info', name: 'RetryTaskInfo', + hidden: true, component: () => import('@/views/task/RetryTaskInfo'), meta: { title: '任务管理详情', icon: 'profile', keepAlive: true, permission: ['retryTask'] } }, { - path: '/retry-task/list', - name: 'RetryTaskList', - component: () => import('@/views/task/RetryTaskList'), - meta: { title: '任务管理列表', icon: 'profile', keepAlive: true, permission: ['retryTask'] } + path: '/retry/dead-letter/list', + name: 'RetryDeadLetterList', + component: () => import('@/views/task/RetryDeadLetterList'), + meta: { title: '死信队列', icon: 'profile', permission: ['retryDeadLetter'] } + }, + { + path: '/retry/dead-letter/info', + name: 'RetryDeadLetterInfo', + hidden: true, + component: () => import('@/views/task/RetryDeadLetterInfo'), + meta: { title: '死信队列管理详情', icon: 'profile', permission: ['retryDeadLetter'] } + }, + { + path: '/retry/log/list', + name: 'RetryLogList', + component: () => import('@/views/task/RetryLogList'), + meta: { title: '重试日志', icon: 'profile', permission: ['retryLog'] } + }, + { + path: '/retry/log/info', + name: 'RetryLogInfo', + hidden: true, + component: () => import('@/views/task/RetryLogInfo'), + meta: { title: '重试日志详情', icon: 'profile', permission: ['retryLog'] } } ] }, + // { + // path: '/retry-dead-letter', + // name: 'RetryDeadLetter', + // component: RouteView, + // hideChildrenInMenu: true, + // redirect: '/retry-dead-letter/list', + // meta: { title: '死信队列管理', icon: 'exception', permission: ['retryDeadLetter'] }, + // children: [ + // { + // path: '/retry-dead-letter/list', + // name: 'RetryDeadLetterList', + // component: () => import('@/views/task/RetryDeadLetterList'), + // meta: { title: '死信队列管理列表', icon: 'profile', permission: ['retryDeadLetter'] } + // }, + // { + // path: '/retry-dead-letter/info', + // name: 'RetryDeadLetterInfo', + // component: () => import('@/views/task/RetryDeadLetterInfo'), + // meta: { title: '死信队列管理详情', icon: 'profile', permission: ['retryDeadLetter'] } + // } + // ] + // }, { - path: '/retry-dead-letter', - name: 'RetryDeadLetter', + path: '/job', + name: 'Job', component: RouteView, - hideChildrenInMenu: true, - redirect: '/retry-dead-letter/list', - meta: { title: '死信队列管理', icon: 'exception', permission: ['retryDeadLetter'] }, + redirect: '/job/list', + meta: { title: '定时任务管理', icon: 'profile', permission: ['retryLog'] }, children: [ { - path: '/retry-dead-letter/list', - name: 'RetryDeadLetterList', - component: () => import('@/views/task/RetryDeadLetterList'), - meta: { title: '死信队列管理列表', icon: 'profile', permission: ['retryDeadLetter'] } + path: '/job/list', + name: 'JobList', + component: () => import('@/views/job/JobList'), + meta: { title: '任务信息', icon: 'profile', permission: ['retryLog'] } }, { - path: '/retry-dead-letter/info', - name: 'RetryDeadLetterInfo', - component: () => import('@/views/task/RetryDeadLetterInfo'), - meta: { title: '死信队列管理详情', icon: 'profile', permission: ['retryDeadLetter'] } - } - ] - }, - { - path: '/retry-log', - name: 'RetryLog', - component: RouteView, - hideChildrenInMenu: true, - redirect: '/retry-log/list', - meta: { title: '重试日志管理', icon: 'profile', permission: ['retryLog'] }, - children: [ - { - path: '/retry-log/list', - name: 'RetryLogList', - component: () => import('@/views/task/RetryLogList'), - meta: { title: '重试日志列表', icon: 'profile', permission: ['retryLog'] } + path: '/job/info', + name: 'JobInfo', + hidden: true, + component: () => import('@/views/job/JobInfo'), + meta: { title: '定时任务详情', icon: 'profile', permission: ['retryLog'] } }, { - path: '/retry-log/info', - name: 'RetryLogInfo', - component: () => import('@/views/task/RetryLogInfo'), - meta: { title: '重试日志详情', icon: 'profile', permission: ['retryLog'] } + path: '/job/batch/list', + name: 'JobBatch', + component: () => import('@/views/job/JobBatch'), + meta: { title: '任务批次', icon: 'profile', permission: ['retryLog'] } + }, + { + path: '/job/task/list', + name: 'JobTask', + component: () => import('@/views/job/JobTask'), + meta: { title: '任务项', icon: 'profile', permission: ['retryLog'] } } ] }, @@ -129,27 +167,6 @@ export const asyncRouterMap = [ hidden: true, component: () => import('@/views/user/UserForm'), meta: { title: '新增或更新用户', icon: 'profile', permission: ['userForm'] } - }, - { - path: '/job', - name: 'Job', - component: RouteView, - redirect: '/list', - meta: { title: '任务调度管理', icon: 'profile', permission: ['retryLog'] }, - children: [ - { - path: '/list', - name: 'JobList', - component: () => import('@/views/job/JobList'), - meta: { title: '调度任务', icon: 'profile', permission: ['retryLog'] } - }, - { - path: '/retry-log/info', - name: 'RetryLogInfo', - component: () => import('@/views/task/RetryLogInfo'), - meta: { title: '任务批次', icon: 'profile', permission: ['retryLog'] } - } - ] } ] }, diff --git a/frontend/src/views/job/JobBatch.vue b/frontend/src/views/job/JobBatch.vue new file mode 100644 index 00000000..64004ec2 --- /dev/null +++ b/frontend/src/views/job/JobBatch.vue @@ -0,0 +1,441 @@ + + + diff --git a/frontend/src/views/job/JobInfo.vue b/frontend/src/views/job/JobInfo.vue new file mode 100644 index 00000000..71c3e800 --- /dev/null +++ b/frontend/src/views/job/JobInfo.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/frontend/src/views/job/JobList.vue b/frontend/src/views/job/JobList.vue index 444de2e7..f21a3a14 100644 --- a/frontend/src/views/job/JobList.vue +++ b/frontend/src/views/job/JobList.vue @@ -24,9 +24,9 @@ - - - + + + {{ index.name }} @@ -66,8 +66,8 @@
- 单个 - 批量 + 新增 + 删除 @@ -85,7 +85,6 @@ :data="loadData" :alert="options.alert" :rowSelection="options.rowSelection" - :scroll="{ x: 2000 }" > {{ record.id }} @@ -100,6 +99,22 @@ {{ jobStatus[text].name }} + + + {{ triggerType[text].name }} + + + + + {{ blockStrategy[text].name }} + + + + {{ text }}(秒) + + + {{ text }}(秒) +