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 4fe593da..b506e7a2 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 @@ -25,13 +25,13 @@ and a.group_name = #{queryDO.groupName} - and task_status = #{queryDO.taskBatchStatus} + and task_batch_status = #{queryDO.taskBatchStatus} and job_name like #{queryDO.jobName} and a.deleted = 0 - order by id desc + order by a.id desc 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 f98fa856..fb82baa4 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 @@ -2,9 +2,11 @@ package com.aizuda.easy.retry.server.web.controller; 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.JobBatchQueryVO; 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.JobBatchResponseVO; 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; @@ -67,4 +69,12 @@ public class JobController { return jobService.getTimeByCron(cron); } + @GetMapping("/job-name/list") + @LoginRequired + public List getJobNameList( + @RequestParam(value = "keywords", required = false) String keywords, + @RequestParam(value = "jobId", required = false) Long jobId + ) { + return jobService.getJobNameList(keywords, jobId); + } } diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobBatchQueryVO.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobBatchQueryVO.java index 29a0218c..5b9f3234 100644 --- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobBatchQueryVO.java +++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/model/request/JobBatchQueryVO.java @@ -12,7 +12,7 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) @Data public class JobBatchQueryVO extends BaseQueryVO { - private Long jobId ; + private Long jobId; private String jobName; private Integer taskBatchStatus; private String groupName; 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 b8ce1ea9..27ecea26 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 @@ -27,4 +27,6 @@ public interface JobService { Boolean deleteJobById(Long id); List getTimeByCron(String cron); + + List getJobNameList(String keywords, Long jobId); } 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 ffa8da25..b8fc4230 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 @@ -58,7 +58,7 @@ public class JobServiceImpl implements JobService { } if (StrUtil.isNotBlank(queryVO.getJobName())) { - queryWrapper.like(Job::getJobName, "%" + queryVO.getJobName() + "%"); + queryWrapper.like(Job::getJobName, "%" + queryVO.getJobName().trim() + "%"); } if (Objects.nonNull(queryVO.getJobStatus())) { @@ -90,7 +90,7 @@ public class JobServiceImpl implements JobService { try { ZonedDateTime zdt = now.atZone(ZoneOffset.ofHours(8)); nextValidTime = new CronExpression(cron).getNextValidTimeAfter(Date.from(zdt.toInstant())); - now = LocalDateTime.ofEpochSecond( nextValidTime.getTime() / 1000,0, ZoneOffset.ofHours(8)); + now = LocalDateTime.ofEpochSecond(nextValidTime.getTime() / 1000, 0, ZoneOffset.ofHours(8)); list.add(dateTimeFormatter.format(now)); } catch (ParseException ignored) { } @@ -99,6 +99,23 @@ public class JobServiceImpl implements JobService { return list; } + @Override + public List getJobNameList(String keywords, Long jobId) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .select(Job::getId, Job::getJobName); + if (StrUtil.isNotBlank(keywords)) { + queryWrapper.like(Job::getJobName, "%" + keywords.trim() + "%"); + } + + if (Objects.nonNull(jobId)) { + queryWrapper.eq(Job::getId, jobId); + } + + PageDTO pageDTO = new PageDTO<>(1, 20); + PageDTO selectPage = jobMapper.selectPage(pageDTO, queryWrapper); + return JobResponseVOConverter.INSTANCE.toJobResponseVOs(selectPage.getRecords()); + } @Override public boolean saveJob(JobRequestVO jobRequestVO) { diff --git a/frontend/src/api/jobApi.js b/frontend/src/api/jobApi.js index a9b96d8c..820a74b5 100644 --- a/frontend/src/api/jobApi.js +++ b/frontend/src/api/jobApi.js @@ -8,6 +8,7 @@ const jobApi = { updateJobStatus: '/job/status', delJob: '/job/', timeByCron: '/job/cron', + jobNameList: '/job/job-name/list', // 任务批次 jobBatchList: '/job/batch/list', @@ -22,6 +23,14 @@ const jobApi = { export default jobApi +export function jobNameList (parameter) { + return request({ + url: jobApi.jobNameList, + method: 'get', + params: parameter + }) +} + export function timeByCron (parameter) { return request({ url: jobApi.timeByCron, diff --git a/frontend/src/views/job/JobBatchList.vue b/frontend/src/views/job/JobBatchList.vue index f8a2a356..6235aafd 100644 --- a/frontend/src/views/job/JobBatchList.vue +++ b/frontend/src/views/job/JobBatchList.vue @@ -16,13 +16,28 @@ - + + + {{ item.jobName }} + + + - + {{ item.name }} @@ -79,8 +94,9 @@ :data="loadData" :alert="options.alert" :rowSelection="options.rowSelection" + :scroll="{ x: 1800 }" > - + {{ record.id }} @@ -142,7 +158,7 @@ import ATextarea from 'ant-design-vue/es/input/TextArea' import AInput from 'ant-design-vue/es/input/Input' import { STable } from '@/components' -import { jobBatchList } from '@/api/jobApi' +import { jobBatchList, jobNameList } from '@/api/jobApi' import { getAllGroupNameList } from '@/api/manage' const enums = require('@/utils/enum') @@ -162,38 +178,46 @@ export default { // 高级搜索 展开/关闭 advanced: false, // 查询参数 - queryParam: {}, + queryParam: { + jobId: null + }, taskBatchStatus: enums.taskBatchStatus, operationReason: enums.operationReason, // 表头 columns: [ { title: 'ID', - scopedSlots: { customRender: 'serial' } + scopedSlots: { customRender: 'serial' }, + width: '5%' }, { title: '组名称', dataIndex: 'groupName', - ellipsis: true + ellipsis: true, + width: '15%' }, { title: '任务名称', dataIndex: 'jobName', - ellipsis: true + ellipsis: true, + width: '15%' + }, + { + title: '开始执行时间', + dataIndex: 'executionAt', + width: '10%' }, { title: '状态', dataIndex: 'taskBatchStatus', - scopedSlots: { customRender: 'taskBatchStatus' } - }, - { - title: '开始执行时间', - dataIndex: 'executionAt' + scopedSlots: { customRender: 'taskBatchStatus' }, + width: '5%' }, { title: '操作原因', dataIndex: 'operationReason', - scopedSlots: { customRender: 'operationReason' } + scopedSlots: { customRender: 'operationReason' }, + width: '15%' }, { title: '创建时间', @@ -211,6 +235,7 @@ export default { ], // 加载数据方法 必须为 Promise 对象 loadData: (parameter) => { + // this.queryParam['jobId'] = this.$route.query.jobId return jobBatchList(Object.assign(parameter, this.queryParam)).then((res) => { return res }) @@ -233,7 +258,7 @@ export default { }, optionAlertShow: false, groupNameList: [], - sceneList: [] + jobNameList: [] } }, created () { @@ -242,7 +267,16 @@ export default { if (this.groupNameList !== null && this.groupNameList.length > 0) { this.queryParam['groupName'] = this.groupNameList[0] this.$refs.table.refresh(true) - this.handleChange(this.groupNameList[0]) + } + }) + + const jobId = this.$route.query.jobId + jobNameList({ jobId: jobId }).then(res => { + this.jobNameList = res.data + console.log(jobId) + if (jobId) { + this.queryParam['jobId'] = this.jobNameList[0].id + this.$refs.table.refresh(true) } }) }, @@ -253,7 +287,16 @@ export default { handleBatchNew () { this.$refs.batchSaveRetryTask.isShow(true, null) }, + handleSearch (value) { + console.log(`selected ${value}`) + jobNameList({ keywords: value }).then(res => { + this.jobNameList = res.data + }) + }, handleChange (value) { + console.log(`handleChange ${value}`) + // this.queryParam['jobId'] = value + // this.$refs.table.refresh(true) }, toggleAdvanced () { this.advanced = !this.advanced diff --git a/frontend/src/views/job/JobList.vue b/frontend/src/views/job/JobList.vue index c9c265cc..ed7ae27c 100644 --- a/frontend/src/views/job/JobList.vue +++ b/frontend/src/views/job/JobList.vue @@ -78,6 +78,7 @@ :rowKey="(record) => record.id" :columns="columns" :data="loadData" + :scroll="{ x: 2000 }" > {{ record.id }} @@ -112,6 +113,8 @@