diff --git a/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/handler/delete/DeleteJobHandler.java b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/handler/delete/DeleteJobHandler.java new file mode 100644 index 000000000..9ae60653e --- /dev/null +++ b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/handler/delete/DeleteJobHandler.java @@ -0,0 +1,48 @@ +package com.aizuda.snailjob.client.job.core.handler.delete; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Pair; +import com.aizuda.snailjob.client.common.exception.SnailJobClientException; +import com.aizuda.snailjob.client.job.core.handler.AbstractRequestHandler; +import com.aizuda.snailjob.common.core.enums.StatusEnum; +import com.aizuda.snailjob.common.core.model.Result; + +import java.util.Set; + +/** + * @Author:srzou + * @Package:com.aizuda.snailjob.client.job.core.handler.delete + * @Project:snail-job + * @Date:2024/11/21 22:38 + * @Filename:DeleteJobHandler + */ +public class DeleteJobHandler extends AbstractRequestHandler { + private final Set toDeleteIds; + + public DeleteJobHandler(Set toDeleteIds) { + this.toDeleteIds = toDeleteIds; + } + + @Override + protected void afterExecute(Boolean aBoolean) { + + } + + @Override + protected void beforeExecute() { + + } + + @Override + protected Boolean doExecute() { + Result result = client.deleteJob(toDeleteIds); + Assert.isTrue(StatusEnum.YES.getStatus() == result.getStatus(), + () -> new SnailJobClientException(result.getMessage())); + return (Boolean)result.getData(); + } + + @Override + protected Pair checkRequest() { + return Pair.of(toDeleteIds != null && !toDeleteIds.isEmpty() && !toDeleteIds.contains(0L), "toDeleteId不能为null或0"); + } +} diff --git a/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/handler/delete/DeleteWorkflowHandler.java b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/handler/delete/DeleteWorkflowHandler.java new file mode 100644 index 000000000..a807be33c --- /dev/null +++ b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/handler/delete/DeleteWorkflowHandler.java @@ -0,0 +1,48 @@ +package com.aizuda.snailjob.client.job.core.handler.delete; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Pair; +import com.aizuda.snailjob.client.common.exception.SnailJobClientException; +import com.aizuda.snailjob.client.job.core.handler.AbstractRequestHandler; +import com.aizuda.snailjob.common.core.enums.StatusEnum; +import com.aizuda.snailjob.common.core.model.Result; + +import java.util.Set; + +/** + * @Author:srzou + * @Package:com.aizuda.snailjob.client.job.core.handler.delete + * @Project:snail-job + * @Date:2024/11/21 22:42 + * @Filename:DeleteWorkflowHandler + */ +public class DeleteWorkflowHandler extends AbstractRequestHandler { + private final Set toDeleteIds; + + public DeleteWorkflowHandler(Set toDeleteIds) { + this.toDeleteIds = toDeleteIds; + } + + @Override + protected void afterExecute(Boolean aBoolean) { + + } + + @Override + protected void beforeExecute() { + + } + + @Override + protected Boolean doExecute() { + Result result = client.deleteWorkflow(toDeleteIds); + Assert.isTrue(StatusEnum.YES.getStatus() == result.getStatus(), + () -> new SnailJobClientException(result.getMessage())); + return (Boolean)result.getData(); + } + + @Override + protected Pair checkRequest() { + return Pair.of(toDeleteIds != null && !toDeleteIds.isEmpty() && !toDeleteIds.contains(0L), "toDeleteId不能为null或0"); + } +} diff --git a/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/OpenApiClient.java b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/OpenApiClient.java index 5039a2202..b1922875e 100644 --- a/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/OpenApiClient.java +++ b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/OpenApiClient.java @@ -6,6 +6,8 @@ import com.aizuda.snailjob.client.job.core.dto.RequestAddOrUpdateJobDTO; import com.aizuda.snailjob.client.job.core.dto.RequestUpdateStatusDTO; import com.aizuda.snailjob.common.core.model.Result; +import java.util.Set; + public interface OpenApiClient { @Mapping(method = RequestMethod.POST, path = "/api/job/add") Result addJob(RequestAddOrUpdateJobDTO requestAddOrUpdateJobDTO); @@ -27,4 +29,10 @@ public interface OpenApiClient { @Mapping(method = RequestMethod.POST, path = "/api/job/updateWorkFlowStatus") Result updateWorkFlowStatus(RequestUpdateStatusDTO statusDTO); + + @Mapping(method = RequestMethod.POST, path = "/api/job/deleteJob") + Result deleteJob(Set toDeleteIds); + + @Mapping(method = RequestMethod.POST, path = "/api/job/deleteWorkFlow") + Result deleteWorkflow(Set toDeleteIds); } diff --git a/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/SnailJobOpenApi.java b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/SnailJobOpenApi.java index c4481f13b..b8dbf06f4 100644 --- a/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/SnailJobOpenApi.java +++ b/snail-job-client/snail-job-client-job-core/src/main/java/com/aizuda/snailjob/client/job/core/openapi/SnailJobOpenApi.java @@ -1,11 +1,15 @@ package com.aizuda.snailjob.client.job.core.openapi; import com.aizuda.snailjob.client.job.core.handler.add.*; +import com.aizuda.snailjob.client.job.core.handler.delete.DeleteJobHandler; +import com.aizuda.snailjob.client.job.core.handler.delete.DeleteWorkflowHandler; import com.aizuda.snailjob.client.job.core.handler.query.RequestQueryHandler; import com.aizuda.snailjob.client.job.core.handler.trigger.TriggerJobHandler; import com.aizuda.snailjob.client.job.core.handler.trigger.TriggerWorkflowHandler; import com.aizuda.snailjob.client.job.core.handler.update.*; +import java.util.Set; + /** * @author opensnail * @date 2024-09-21 21:35:34 @@ -159,4 +163,24 @@ public final class SnailJobOpenApi { public static UpdateWorkflowStatusHandler updateWorkFlowStatus(Long workFlowId) { return new UpdateWorkflowStatusHandler(workFlowId); } + + /** + * 删除任务 + * + * @param toDeleteIds 待删除任务IDS + * @return {@link DeleteJobHandler} + */ + public static DeleteJobHandler deleteJob(Set toDeleteIds){ + return new DeleteJobHandler(toDeleteIds); + } + + /** + * 删除工作流任务 + * + * @param toDeleteIds 待删除工作流任务IDS + * @return {@link DeleteWorkflowHandler} + */ + public static DeleteWorkflowHandler deleteWorkflow(Set toDeleteIds){ + return new DeleteWorkflowHandler(toDeleteIds); + } } diff --git a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/constant/SystemConstants.java b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/constant/SystemConstants.java index 0b54bdd81..e055c15de 100644 --- a/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/constant/SystemConstants.java +++ b/snail-job-common/snail-job-common-core/src/main/java/com/aizuda/snailjob/common/core/constant/SystemConstants.java @@ -139,6 +139,10 @@ public interface SystemConstants { String OPENAPI_UPDATE_WORKFLOW_STATUS = "/api/job/updateWorkFlowStatus"; + String OPENAPI_DELETE_JOB = "/api/job/deleteJob"; + + String OPENAPI_DELETE_WORKFLOW = "/api/job/deleteWorkFlow"; + } String LOGO = """ diff --git a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/request/OpenApiDeleteJobRequestHandler.java b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/request/OpenApiDeleteJobRequestHandler.java new file mode 100644 index 000000000..273a57dc7 --- /dev/null +++ b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/request/OpenApiDeleteJobRequestHandler.java @@ -0,0 +1,78 @@ +package com.aizuda.snailjob.server.job.task.support.request; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.net.url.UrlQuery; +import com.aizuda.snailjob.common.core.constant.SystemConstants.HTTP_PATH; +import com.aizuda.snailjob.common.core.enums.StatusEnum; +import com.aizuda.snailjob.common.core.model.SnailJobRequest; +import com.aizuda.snailjob.common.core.model.SnailJobRpcResult; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.common.core.util.StreamUtils; +import com.aizuda.snailjob.common.log.SnailJobLog; +import com.aizuda.snailjob.server.common.enums.SyetemTaskTypeEnum; +import com.aizuda.snailjob.server.common.exception.SnailJobServerException; +import com.aizuda.snailjob.server.common.handler.PostHttpRequestHandler; +import com.aizuda.snailjob.server.common.util.HttpHeaderUtil; +import com.aizuda.snailjob.template.datasource.persistence.mapper.JobMapper; +import com.aizuda.snailjob.template.datasource.persistence.mapper.JobSummaryMapper; +import com.aizuda.snailjob.template.datasource.persistence.po.Job; +import com.aizuda.snailjob.template.datasource.persistence.po.JobSummary; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpMethod; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + + +/** + * OPENAPI + * 删除定时任务 + */ +@Component +@RequiredArgsConstructor +public class OpenApiDeleteJobRequestHandler extends PostHttpRequestHandler { + private final JobMapper jobMapper; + private final JobSummaryMapper jobSummaryMapper; + + @Override + public boolean supports(String path) { + return HTTP_PATH.OPENAPI_DELETE_JOB.equals(path); + } + + @Override + public HttpMethod method() { + return HttpMethod.POST; + } + + @Override + public SnailJobRpcResult doHandler(String content, UrlQuery query, HttpHeaders headers) { + SnailJobLog.LOCAL.debug("Delete job content:[{}]", content); + SnailJobRequest request = JsonUtil.parseObject(content, SnailJobRequest.class); + Object[] args = request.getArgs(); + Set ids = JsonUtil.parseObject(JsonUtil.toJsonString(args[0]), Set.class); + String namespaceId = HttpHeaderUtil.getNamespace(headers); + + Assert.isTrue(ids.size() == jobMapper.delete( + new LambdaQueryWrapper() + .eq(Job::getNamespaceId, namespaceId) + .eq(Job::getJobStatus, StatusEnum.NO.getStatus()) + .in(Job::getId, ids) + ), () -> new SnailJobServerException("删除定时任务失败, 请检查任务状态是否关闭状态")); + + List jobSummaries = jobSummaryMapper.selectList(new LambdaQueryWrapper() + .select(JobSummary::getId) + .in(JobSummary::getBusinessId, ids) + .eq(JobSummary::getNamespaceId, namespaceId) + .eq(JobSummary::getSystemTaskType, SyetemTaskTypeEnum.JOB.getType()) + ); + if (CollUtil.isNotEmpty(jobSummaries)) { + jobSummaryMapper.deleteByIds(StreamUtils.toSet(jobSummaries, JobSummary::getId)); + } + + return new SnailJobRpcResult(true, request.getReqId()); + } +} diff --git a/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/request/OpenApiDeleteWorkflowRequestHandler.java b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/request/OpenApiDeleteWorkflowRequestHandler.java new file mode 100644 index 000000000..e20b2f0c5 --- /dev/null +++ b/snail-job-server/snail-job-server-job-task/src/main/java/com/aizuda/snailjob/server/job/task/support/request/OpenApiDeleteWorkflowRequestHandler.java @@ -0,0 +1,80 @@ +package com.aizuda.snailjob.server.job.task.support.request; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.net.url.UrlQuery; +import com.aizuda.snailjob.common.core.constant.SystemConstants.HTTP_PATH; +import com.aizuda.snailjob.common.core.enums.StatusEnum; +import com.aizuda.snailjob.common.core.model.SnailJobRequest; +import com.aizuda.snailjob.common.core.model.SnailJobRpcResult; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.common.core.util.StreamUtils; +import com.aizuda.snailjob.common.log.SnailJobLog; +import com.aizuda.snailjob.server.common.enums.SyetemTaskTypeEnum; +import com.aizuda.snailjob.server.common.exception.SnailJobServerException; +import com.aizuda.snailjob.server.common.handler.PostHttpRequestHandler; +import com.aizuda.snailjob.server.common.util.HttpHeaderUtil; +import com.aizuda.snailjob.template.datasource.persistence.mapper.JobSummaryMapper; +import com.aizuda.snailjob.template.datasource.persistence.mapper.WorkflowMapper; +import com.aizuda.snailjob.template.datasource.persistence.po.JobSummary; +import com.aizuda.snailjob.template.datasource.persistence.po.Workflow; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.HttpMethod; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + + +/** + * OPENAPI + * 删除工作流 + */ +@Component +@RequiredArgsConstructor +public class OpenApiDeleteWorkflowRequestHandler extends PostHttpRequestHandler { + private final WorkflowMapper workflowMapper; + private final JobSummaryMapper jobSummaryMapper; + + @Override + public boolean supports(String path) { + return HTTP_PATH.OPENAPI_DELETE_WORKFLOW.equals(path); + } + + @Override + public HttpMethod method() { + return HttpMethod.POST; + } + + @Override + public SnailJobRpcResult doHandler(String content, UrlQuery query, HttpHeaders headers) { + SnailJobLog.LOCAL.debug("Delete job content:[{}]", content); + SnailJobRequest request = JsonUtil.parseObject(content, SnailJobRequest.class); + Object[] args = request.getArgs(); + Set ids = JsonUtil.parseObject(JsonUtil.toJsonString(args[0]), Set.class); + String namespaceId = HttpHeaderUtil.getNamespace(headers); + + Assert.isTrue(ids.size() == workflowMapper.delete( + new LambdaQueryWrapper() + .eq(Workflow::getNamespaceId, namespaceId) + .eq(Workflow::getWorkflowStatus, StatusEnum.NO.getStatus()) + .in(Workflow::getId, ids) + ), () -> new SnailJobServerException("删除工作流任务失败, 请检查任务状态是否关闭状态")); + + List jobSummaries = jobSummaryMapper.selectList(new LambdaQueryWrapper() + .select(JobSummary::getId) + .in(JobSummary::getBusinessId, ids) + .eq(JobSummary::getNamespaceId, namespaceId) + .eq(JobSummary::getSystemTaskType, SyetemTaskTypeEnum.WORKFLOW.getType()) + ); + if (CollUtil.isNotEmpty(jobSummaries)) { + Assert.isTrue(jobSummaries.size() == + jobSummaryMapper.deleteByIds(StreamUtils.toSet(jobSummaries, JobSummary::getId)), + () -> new SnailJobServerException("汇总表删除失败") + ); + } + return new SnailJobRpcResult(true, request.getReqId()); + } +}