diff --git a/api/src/main/java/dev/jianmu/api/eventhandler/AsyncTaskInstanceEventHandler.java b/api/src/main/java/dev/jianmu/api/eventhandler/AsyncTaskInstanceEventHandler.java index 0c7648df47c3c01c89ea97d3c9cb0212cc6692c3..3f2c8e0e355b0586eca2caf13d1f4571867d2a71 100644 --- a/api/src/main/java/dev/jianmu/api/eventhandler/AsyncTaskInstanceEventHandler.java +++ b/api/src/main/java/dev/jianmu/api/eventhandler/AsyncTaskInstanceEventHandler.java @@ -163,7 +163,8 @@ public class AsyncTaskInstanceEventHandler { log.info("-----------------------------------------------------"); } - @EventListener + @Async + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void handleTaskSuspendedEvent(TaskSuspendedEvent event) { MDC.put("triggerId", event.getTriggerId()); log.info("Get TaskSuspendedEvent here -------------------------"); @@ -172,7 +173,8 @@ public class AsyncTaskInstanceEventHandler { log.info("-----------------------------------------------------"); } - @EventListener + @Async + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void handleTaskFailedEvent(TaskFailedEvent event) { MDC.put("triggerId", event.getTriggerId()); log.info("Get TaskFailedEvent here -------------------------"); diff --git a/api/src/main/java/dev/jianmu/api/eventhandler/ProjectEventHandler.java b/api/src/main/java/dev/jianmu/api/eventhandler/ProjectEventHandler.java index 4e08379008cbf506829c73f1490253ca9e4fe7b3..a659e65cd83dd2acaac0e8b5fb8cfb61f77620ea 100644 --- a/api/src/main/java/dev/jianmu/api/eventhandler/ProjectEventHandler.java +++ b/api/src/main/java/dev/jianmu/api/eventhandler/ProjectEventHandler.java @@ -1,7 +1,14 @@ package dev.jianmu.api.eventhandler; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + import dev.jianmu.application.command.WorkflowStartCmd; import dev.jianmu.application.service.GitRepoApplication; +import dev.jianmu.application.service.ProjectApplication; import dev.jianmu.application.service.ProjectGroupApplication; import dev.jianmu.application.service.TriggerApplication; import dev.jianmu.application.service.internal.WorkflowInstanceInternalApplication; @@ -9,13 +16,10 @@ import dev.jianmu.application.util.AssociationUtil; import dev.jianmu.infrastructure.lock.DistributedLock; import dev.jianmu.project.event.CreatedEvent; import dev.jianmu.project.event.DeletedEvent; +import dev.jianmu.project.event.TrashEvent; import dev.jianmu.project.event.MovedEvent; import dev.jianmu.project.event.TriggerEvent; import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; -import org.springframework.transaction.event.TransactionPhase; -import org.springframework.transaction.event.TransactionalEventListener; /** * @author Ethan Liu @@ -27,6 +31,7 @@ import org.springframework.transaction.event.TransactionalEventListener; @Slf4j public class ProjectEventHandler { private final WorkflowInstanceInternalApplication workflowInstanceInternalApplication; + private final ProjectApplication projectApplication; private final TriggerApplication triggerApplication; private final ProjectGroupApplication projectGroupApplication; private final GitRepoApplication gitRepoApplication; @@ -34,12 +39,14 @@ public class ProjectEventHandler { public ProjectEventHandler( WorkflowInstanceInternalApplication workflowInstanceInternalApplication, + ProjectApplication projectApplication, TriggerApplication triggerApplication, ProjectGroupApplication projectGroupApplication, GitRepoApplication gitRepoApplication, DistributedLock distributedLock ) { this.workflowInstanceInternalApplication = workflowInstanceInternalApplication; + this.projectApplication = projectApplication; this.triggerApplication = triggerApplication; this.projectGroupApplication = projectGroupApplication; this.gitRepoApplication = gitRepoApplication; @@ -50,12 +57,12 @@ public class ProjectEventHandler { public void handleTriggerEvent(TriggerEvent triggerEvent) { // 使用project id与WorkflowVersion作为triggerId,用于参数引用查询,参见WorkerApplication#getEnvironmentMap var cmd = WorkflowStartCmd.builder() - .triggerId(triggerEvent.getTriggerId()) - .triggerType(triggerEvent.getTriggerType()) - .workflowRef(triggerEvent.getWorkflowRef()) - .workflowVersion(triggerEvent.getWorkflowVersion()) - .occurredTime(triggerEvent.getOccurredTime()) - .build(); + .triggerId(triggerEvent.getTriggerId()) + .triggerType(triggerEvent.getTriggerType()) + .workflowRef(triggerEvent.getWorkflowRef()) + .workflowVersion(triggerEvent.getWorkflowVersion()) + .occurredTime(triggerEvent.getOccurredTime()) + .build(); var lock = this.distributedLock.getLock(triggerEvent.getProjectId()); lock.lock(); try { @@ -92,4 +99,11 @@ public class ProjectEventHandler { // 移动项目到项目组事件 this.projectGroupApplication.moveProject(movedEvent.getProjectId(), movedEvent.getProjectGroupId()); } + + @Async + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void handlerFileDelete(TrashEvent event) { + // 清理项目数据 + this.projectApplication.trashProject(event.getProjectId()); + } } diff --git a/api/src/main/resources/db/migration/V3.0.14__Add_Jianmu_Trash_Table_And_Add_Indexs.sql b/api/src/main/resources/db/migration/V3.0.14__Add_Jianmu_Trash_Table_And_Add_Indexs.sql new file mode 100644 index 0000000000000000000000000000000000000000..d57e4315f2a96ca19b92e1d70ae9171098fea9f3 --- /dev/null +++ b/api/src/main/resources/db/migration/V3.0.14__Add_Jianmu_Trash_Table_And_Add_Indexs.sql @@ -0,0 +1,39 @@ +ALTER TABLE `jm_parameter` + add `default` bit(1) NOT NULL DEFAULT 1 COMMENT '是否为默认值'; + +ALTER TABLE `jm_trigger_event_parameter` + ADD INDEX `idx_trigger_event_id` (`trigger_event_id`); +ALTER TABLE `jm_web_request` + ADD INDEX `idx_project_id` (`project_id`); +ALTER TABLE `jm_task_instance` + ADD INDEX `idx_workflow_ref` (`workflow_ref`); +ALTER TABLE `jm_async_task_instance` + ADD INDEX `idx_workflow_ref` (`workflow_ref`); +ALTER TABLE `jm_trigger_event` + ADD INDEX `idx_project_id` (`project_id`); +ALTER TABLE `jm_workflow` + ADD INDEX `idx_ref` (`ref`); + +CREATE TABLE `jm_trash_project` +( + `id` varchar(45) NOT NULL COMMENT 'ID', + `dsl_source` varchar(45) DEFAULT NULL COMMENT 'DSL来源', + `dsl_type` varchar(45) DEFAULT NULL COMMENT 'DSL 类型', + `trigger_type` varchar(45) DEFAULT NULL COMMENT '触发类型', + `git_repo_id` varchar(150) NOT NULL COMMENT 'Git仓库ID', + `workflow_name` varchar(45) NOT NULL COMMENT '流程定义显示名称', + `workflow_ref` varchar(45) NOT NULL COMMENT '流程定义Ref', + `workflow_version` varchar(45) NOT NULL COMMENT '流程定义版本', + `steps` int NOT NULL COMMENT '步骤数量', + `dsl_text` longtext NOT NULL COMMENT 'DSL内容文本', + `created_time` datetime DEFAULT NULL COMMENT '创建时间', + `last_modified_by` varchar(45) DEFAULT NULL COMMENT '最后修改人', + `last_modified_time` datetime NOT NULL COMMENT '最后修改时间', + `workflow_description` varchar(255) DEFAULT NULL COMMENT '描述', + `enabled` tinyint(1) DEFAULT NULL COMMENT '项目是否可触发', + `mutable` tinyint(1) DEFAULT NULL COMMENT '项目状态是否可变', + `concurrent` int NOT NULL COMMENT '并发执行数', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci COMMENT ='废弃项目表'; \ No newline at end of file diff --git a/application/src/main/java/dev/jianmu/application/service/HubApplication.java b/application/src/main/java/dev/jianmu/application/service/HubApplication.java index c22fc3ea91bf475d9c68552659194d00ae099661..a0409261982ac55d6290701b00295a44943f8727 100644 --- a/application/src/main/java/dev/jianmu/application/service/HubApplication.java +++ b/application/src/main/java/dev/jianmu/application/service/HubApplication.java @@ -82,7 +82,7 @@ public class HubApplication { List parameters = new ArrayList<>(); var inputParameters = nodeDsl.getInputParameters().stream().map(parameter -> { - var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue()); + var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue(), true); parameters.add(p); return NodeParameter.Builder.aNodeParameter() .name(parameter.getName()) @@ -96,7 +96,7 @@ public class HubApplication { }).collect(Collectors.toList()); var outputParameters = nodeDsl.getOutputParameters().stream().map(parameter -> { - var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue()); + var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue(), true); parameters.add(p); return NodeParameter.Builder.aNodeParameter() .name(parameter.getName()) @@ -226,7 +226,7 @@ public class HubApplication { .orElseThrow(() -> new DataNotFoundException("未找到节点定义版本: " + ownerRef + "/" + ref + ":" + version)); List parameters = new ArrayList<>(); var inputParameters = dto.getInputParameters().stream().map(parameter -> { - var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue()); + var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue(), true); parameters.add(p); return NodeParameter.Builder.aNodeParameter() .name(parameter.getName()) @@ -240,7 +240,7 @@ public class HubApplication { }).collect(Collectors.toList()); var outputParameters = dto.getOutputParameters().stream().map(parameter -> { - var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue()); + var p = Parameter.Type.getTypeByName(parameter.getType()).newParameter(parameter.getValue(), true); parameters.add(p); return NodeParameter.Builder.aNodeParameter() .name(parameter.getName()) diff --git a/application/src/main/java/dev/jianmu/application/service/ProjectApplication.java b/application/src/main/java/dev/jianmu/application/service/ProjectApplication.java index 0e3136a253cd71018aca5a4e39de9958a9e24faa..34d0221135b0df16cfa76d9551d1b81ef2cf4786 100644 --- a/application/src/main/java/dev/jianmu/application/service/ProjectApplication.java +++ b/application/src/main/java/dev/jianmu/application/service/ProjectApplication.java @@ -27,26 +27,35 @@ import dev.jianmu.project.aggregate.ProjectLinkGroup; import dev.jianmu.infrastructure.storage.StorageService; import dev.jianmu.project.event.CreatedEvent; import dev.jianmu.project.event.DeletedEvent; +import dev.jianmu.project.event.TrashEvent; import dev.jianmu.project.event.MovedEvent; import dev.jianmu.project.event.TriggerEvent; import dev.jianmu.project.query.ProjectVo; import dev.jianmu.project.repository.ProjectGroupRepository; import dev.jianmu.project.repository.ProjectLastExecutionRepository; import dev.jianmu.project.repository.ProjectLinkGroupRepository; +import dev.jianmu.project.repository.TrashProjectRepository; +import dev.jianmu.task.aggregate.TaskInstance; import dev.jianmu.task.aggregate.Volume; import dev.jianmu.task.event.VolumeCreatedEvent; import dev.jianmu.task.event.VolumeDeletedEvent; import dev.jianmu.task.repository.InstanceParameterRepository; import dev.jianmu.task.repository.TaskInstanceRepository; import dev.jianmu.trigger.aggregate.Trigger; +import dev.jianmu.trigger.aggregate.WebRequest; import dev.jianmu.trigger.aggregate.Webhook; import dev.jianmu.trigger.repository.CustomWebhookDefinitionVersionRepository; +import dev.jianmu.trigger.event.TriggerEventParameter; import dev.jianmu.trigger.repository.TriggerEventRepository; +import dev.jianmu.trigger.repository.TriggerRepository; import dev.jianmu.trigger.service.WebhookOnlyService; import dev.jianmu.trigger.repository.WebRequestRepository; import dev.jianmu.workflow.aggregate.definition.Workflow; +import dev.jianmu.workflow.aggregate.parameter.Parameter; import dev.jianmu.workflow.aggregate.process.ProcessStatus; +import dev.jianmu.workflow.aggregate.process.WorkflowInstance; import dev.jianmu.workflow.repository.AsyncTaskInstanceRepository; +import dev.jianmu.workflow.repository.ParameterRepository; import dev.jianmu.workflow.repository.WorkflowInstanceRepository; import dev.jianmu.workflow.repository.WorkflowRepository; import org.quartz.CronExpression; @@ -61,6 +70,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; import static dev.jianmu.application.service.ProjectGroupApplication.DEFAULT_PROJECT_GROUP_NAME; @@ -98,6 +108,9 @@ public class ProjectApplication { private final InstanceParameterRepository instanceParameterRepository; private final StorageService storageService; private final WebRequestRepository webRequestRepository; + private final TriggerRepository triggerRepository; + private final ParameterRepository parameterRepository; + private final TrashProjectRepository trashProjectRepository; public ProjectApplication( ProjectRepositoryImpl projectRepository, @@ -121,8 +134,11 @@ public class ProjectApplication { AssociationUtil associationUtil, InstanceParameterRepository instanceParameterRepository, StorageService storageService, - WebRequestRepository webRequestRepository - ) { + WebRequestRepository webRequestRepository, + TriggerRepository triggerRepository, + ParameterRepository parameterRepository, + TrashProjectRepository trashProjectRepository + ) { this.projectRepository = projectRepository; this.workflowRepository = workflowRepository; this.workflowInstanceRepository = workflowInstanceRepository; @@ -145,6 +161,9 @@ public class ProjectApplication { this.instanceParameterRepository = instanceParameterRepository; this.storageService = storageService; this.webRequestRepository = webRequestRepository; + this.triggerRepository = triggerRepository; + this.parameterRepository = parameterRepository; + this.trashProjectRepository = trashProjectRepository; } public void switchEnabled(String accountId, String projectId, boolean enabled) { @@ -486,17 +505,10 @@ public class ProjectApplication { if (running > 0) { throw new RuntimeException("仍有流程执行中,不能删除"); } - var projectLinkGroup = this.projectLinkGroupRepository.findByProjectId(id) - .orElseThrow(() -> new DataNotFoundException("未找到项目分组, 项目id: " + id)); - this.projectLinkGroupRepository.deleteById(projectLinkGroup.getId()); - this.projectGroupRepository.subProjectCountById(projectLinkGroup.getProjectGroupId(), 1); this.deleteGitFile(project, userId); this.projectRepository.deleteByWorkflowRef(project.getWorkflowRef()); - this.projectLastExecutionRepository.deleteByRef(project.getWorkflowRef()); - this.workflowRepository.deleteByRef(project.getWorkflowRef()); - this.workflowInstanceRepository.deleteByWorkflowRef(project.getWorkflowRef()); - this.asyncTaskInstanceRepository.deleteByWorkflowRef(project.getWorkflowRef()); - this.taskInstanceRepository.deleteByWorkflowRef(project.getWorkflowRef()); + this.trashProjectRepository.add(project); + this.publisher.publishEvent(DeletedEvent.Builder.aDeletedEvent() .projectId(project.getId()) .userId(userId) @@ -507,6 +519,7 @@ public class ProjectApplication { .workflowRef(project.getWorkflowRef()) .deletedType(VolumeDeletedEvent.VolumeDeletedType.REF) .build()); + this.publisher.publishEvent(new TrashEvent(project.getId())); } @Transactional @@ -664,4 +677,42 @@ public class ProjectApplication { return this.workflowRepository.findByRefAndVersion(ref, project.getWorkflowVersion()) .orElseThrow(() -> new DataNotFoundException("未找到该Workflow")); } + + @Transactional + public void trashProject(String projectId) { + var project = this.trashProjectRepository.findById(projectId) + .orElseThrow(() -> new DataNotFoundException("未找到待删除项目:" + projectId)); + var projectLinkGroup = this.projectLinkGroupRepository.findByProjectId(projectId) + .orElseThrow(() -> new DataNotFoundException("未找到项目分组, 项目id: " + projectId)); + var triggerIds = this.workflowInstanceRepository.findByRef(project.getWorkflowRef()).stream() + .map(WorkflowInstance::getTriggerId) + .collect(Collectors.toList()); + triggerIds.forEach(this.storageService::deleteWorkflowLog); + this.webRequestRepository.findByProjectId(project.getId()).stream() + .map(WebRequest::getId) + .forEach(this.storageService::deleteWebhook); + this.taskInstanceRepository.findIdAndRefByWorkflowRef(project.getWorkflowRef()).stream() + .filter(taskInstance -> !taskInstance.getAsyncTaskRef().equalsIgnoreCase("start")) + .filter(taskInstance -> !taskInstance.getAsyncTaskRef().equalsIgnoreCase("end")) + .map(TaskInstance::getId) + .forEach(this.storageService::deleteTaskLog); + + this.projectLinkGroupRepository.deleteById(projectLinkGroup.getId()); + this.projectGroupRepository.subProjectCountById(projectLinkGroup.getProjectGroupId(), 1); + this.projectLastExecutionRepository.deleteByRef(project.getWorkflowRef()); + this.workflowRepository.deleteByRef(project.getWorkflowRef()); + this.workflowInstanceRepository.deleteByWorkflowRef(project.getWorkflowRef()); + this.asyncTaskInstanceRepository.deleteByWorkflowRef(project.getWorkflowRef()); + this.taskInstanceRepository.deleteByWorkflowRef(project.getWorkflowRef()); + this.gitRepoRepository.deleteById(project.getGitRepoId()); + this.triggerEventRepository.deleteByProjectId(project.getId()); + + var eventParameterIds = this.triggerEventRepository.findParameterIdByTriggerIdIn(triggerIds); + this.triggerEventRepository.deleteParameterByTriggerIdIn(triggerIds); + this.parameterRepository.deleteByIdIn(eventParameterIds); + + var instanceParameterIds = this.instanceParameterRepository.findParameterIdByTriggerIdIn(triggerIds); + this.instanceParameterRepository.deleteByTriggerIdIn(triggerIds); + this.parameterRepository.deleteByIdIn(instanceParameterIds); + } } diff --git a/application/src/main/java/dev/jianmu/application/service/internal/WorkflowInstanceInternalApplication.java b/application/src/main/java/dev/jianmu/application/service/internal/WorkflowInstanceInternalApplication.java index 1d8d6adf6c98f035f2dbbf57e1d8fd4b8c749f6f..b4a3ec847bcb40229a037d4bf3d9228690874abe 100644 --- a/application/src/main/java/dev/jianmu/application/service/internal/WorkflowInstanceInternalApplication.java +++ b/application/src/main/java/dev/jianmu/application/service/internal/WorkflowInstanceInternalApplication.java @@ -216,7 +216,6 @@ public class WorkflowInstanceInternalApplication { } // 停止流程 - @Async @Transactional public void suspend(String instanceId) { var workflowInstance = this.workflowInstanceRepository.findById(instanceId) @@ -268,7 +267,6 @@ public class WorkflowInstanceInternalApplication { } // 终止流程 - @Async @Transactional public void terminate(String instanceId) { var workflowInstance = this.workflowInstanceRepository.findById(instanceId) @@ -279,7 +277,7 @@ public class WorkflowInstanceInternalApplication { MDC.put("triggerId", workflowInstance.getTriggerId()); workflowInstance.terminate(); this.workflowInstanceRepository.save(workflowInstance); - if (projectLastExecution.getStatus() == ProcessStatus.TERMINATED.name()) { + if (projectLastExecution.getStatus().equals(ProcessStatus.TERMINATED.name())) { log.warn("流程实例已终止,无需终止"); return; } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/parameter/ParameterMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/parameter/ParameterMapper.java index 086b81e99020ecc404ae22cccc8128f61acac623..ff95fbcad34fc65c85faab3afd7ff43c41e13422 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/parameter/ParameterMapper.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/parameter/ParameterMapper.java @@ -15,9 +15,9 @@ import java.util.Set; */ public interface ParameterMapper { @Insert("") void addAll(@Param("parameters") List parameters); @@ -50,4 +50,10 @@ public interface ParameterMapper { }) }) List findByIds(@Param("ids") Set ids); + + @Delete("") + void deleteByIdIn(@Param("ids") List ids); } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/project/TrashProjectMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/project/TrashProjectMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..621e642780e0c82d1fc453a08efe88ce78895f37 --- /dev/null +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/project/TrashProjectMapper.java @@ -0,0 +1,41 @@ +package dev.jianmu.infrastructure.mapper.project; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Select; + +import java.util.Optional; + +import dev.jianmu.project.aggregate.Project; + +/** + * @class TrashProjectMapper + * @description TrashProjectMapper + * @author Daihw + * @create 2023/5/22 10:34 上午 + */ +public interface TrashProjectMapper { + @Insert("insert into jm_trash_project(id, dsl_source, dsl_type, enabled, mutable, trigger_type, git_repo_id, workflow_name, workflow_description, workflow_ref, workflow_version, steps, dsl_text, created_time, last_modified_by, last_modified_time, concurrent) " + + "values(#{id}, #{dslSource}, #{dslType}, #{enabled}, #{mutable}, #{triggerType}, #{gitRepoId}, #{workflowName}, #{workflowDescription}, #{workflowRef}, #{workflowVersion}, #{steps}, #{dslText}, #{createdTime}, #{lastModifiedBy}, #{lastModifiedTime}, #{concurrent})") + void add(Project project); + + @Delete("delete from jm_trash_project where workflow_ref = #{workflowRef}") + void deleteByWorkflowRef(String workflowRef); + + @Select("select * from jm_trash_project where id = #{id}") + @Result(column = "workflow_name", property = "workflowName") + @Result(column = "workflow_description", property = "workflowDescription") + @Result(column = "dsl_source", property = "dslSource") + @Result(column = "dsl_type", property = "dslType") + @Result(column = "event_bridge_id", property = "eventBridgeId") + @Result(column = "trigger_type", property = "triggerType") + @Result(column = "git_repo_id", property = "gitRepoId") + @Result(column = "workflow_ref", property = "workflowRef") + @Result(column = "workflow_version", property = "workflowVersion") + @Result(column = "dsl_text", property = "dslText") + @Result(column = "created_time", property = "createdTime") + @Result(column = "last_modified_by", property = "lastModifiedBy") + @Result(column = "last_modified_time", property = "lastModifiedTime") + Optional findById(String id); +} diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/InstanceParameterMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/InstanceParameterMapper.java index b5e8368d284bcd63a199e285b7af39700324d7c8..7c3d50740a2249b3bd4c8a253fa6a05909f08180 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/InstanceParameterMapper.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/InstanceParameterMapper.java @@ -21,12 +21,17 @@ public interface InstanceParameterMapper { " ") void addAll(@Param("instanceParameters") Set instanceParameters); - // @Delete("delete t1, t2 from jm_task_instance_parameter t1 " + - // "left join jm_parameter t2 on t1.parameter_id = (t2.id collate utf8mb4_0900_ai_ci) " + - // "where t1.trigger_id = #{triggerId}") - @Delete("delete from jm_task_instance_parameter where trigger_id = #{triggerId}") + @Delete("delete t1, t2 from jm_task_instance_parameter t1 " + + "left join jm_parameter t2 on (t1.parameter_id = (t2.id collate utf8mb4_0900_ai_ci) and t2.default = 0)" + + "where t1.trigger_id = #{triggerId}") void deleteByTriggerId(String triggerId); + @Delete("") + void deleteByTriggerIdIn(@Param("triggerIds") List triggerIds); + @Select("select * from jm_task_instance_parameter where instance_id = #{instanceId}") @Result(column = "instance_id", property = "instanceId") @Result(column = "serial_no", property = "serialNo") @@ -66,4 +71,10 @@ public interface InstanceParameterMapper { @Result(column = "parameter_id", property = "parameterId") @Result(column = "workflow_type", property = "workflowType") List findLastOutputParamByTriggerId(String triggerId); + + @Select("") + List findParameterIdByTriggerIdIn(@Param("triggerIds") List triggerIds); } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/TaskInstanceMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/TaskInstanceMapper.java index 1eeb22e499b2213ac7f8c9879cce67aa5b8f144c..7607be40cbac4c713bf3505322bec1d0c1d9a758 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/TaskInstanceMapper.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/task/TaskInstanceMapper.java @@ -181,4 +181,8 @@ public interface TaskInstanceMapper { @Result(column = "start_time", property = "startTime") @Result(column = "end_time", property = "endTime") List findByTriggerIdAndStatus(@Param("triggerId") String triggerId, @Param("status") InstanceStatus status); + + @Select("select id, async_task_ref from jm_task_instance where workflow_ref = #{workflowRef}") + @Result(column = "async_task_ref", property = "asyncTaskRef") + List findIdAndRefByWorkflowRef(String workflowRef); } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventMapper.java index 77822ed7bce821488bd211091cfb71969649d7e8..10a92db1e45f502bfc5b7dd9798b385b5aaf520f 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventMapper.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventMapper.java @@ -34,4 +34,9 @@ public interface TriggerEventMapper { "left join jm_web_request t2 on t1.web_request_id = (t2.id collate utf8mb4_0900_ai_ci) " + "where t1.id = #{triggerId}") void deleteEventAdnWebRequestByTriggerId(String triggerId); + + @Delete("delete t1, t2 from jm_trigger_event t1 " + + "left join jm_web_request t2 on t1.web_request_id = (t2.id collate utf8mb4_0900_ai_ci) " + + "where t1.project_id = #{projectId}") + void deleteByProjectId(String projectId); } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventParameterMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventParameterMapper.java index 8e1821a43f502bae2b127547ffbc54a31c05f727..4ca50902aa5a12db2e2e1c1d56c10dca4243437e 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventParameterMapper.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/TriggerEventParameterMapper.java @@ -24,4 +24,16 @@ public interface TriggerEventParameterMapper { "left join jm_parameter t2 on t1.parameter_id = (t2.id collate utf8mb4_0900_ai_ci) " + "where t1.trigger_event_id = #{triggerId}") void deleteByTriggerId(String triggerId); + + @Delete("") + void deleteParameterByTriggerIdIn(@Param("triggerIds") List triggerIds); + + @Select("") + List findParameterIdByTriggerIdIn(@Param("triggerIds") List triggerIds); } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/WebRequestMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/WebRequestMapper.java index 0968cf8a2761d92efd7f38e1b147bd61282db667..68cabf979e958a48ff18bb4c998b8f3049e61c74 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/WebRequestMapper.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/trigger/WebRequestMapper.java @@ -57,4 +57,15 @@ public interface WebRequestMapper { @Result(column = "error_msg", property = "errorMsg") @Result(column = "request_time", property = "requestTime") Optional findByTriggerId(String triggerId); + + @Select("select * from jm_web_request where project_id = #{projectId}") + @Result(column = "project_id", property = "projectId") + @Result(column = "workflow_ref", property = "workflowRef") + @Result(column = "workflow_version", property = "workflowVersion") + @Result(column = "trigger_id", property = "triggerId") + @Result(column = "user_agent", property = "userAgent") + @Result(column = "status_code", property = "statusCode") + @Result(column = "error_msg", property = "errorMsg") + @Result(column = "request_time", property = "requestTime") + List findByProjectId(String projectId); } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/workflow/WorkflowInstanceMapper.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/workflow/WorkflowInstanceMapper.java index 08b8c3185f18aeaece7ea795f6aa460147c358f9..cdef90fbf1251798fb762ac16dfb29d11a4e0e04 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/workflow/WorkflowInstanceMapper.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mapper/workflow/WorkflowInstanceMapper.java @@ -105,6 +105,19 @@ public interface WorkflowInstanceMapper { @Delete("delete from jm_workflow_instance where id=#{id}") void deleteById(String id); + @Select("select * from jm_workflow_instance where workflow_ref = #{workflowRef}") + @Result(column = "serial_no", property = "serialNo") + @Result(column = "workflow_ref", property = "workflowRef") + @Result(column = "workflow_version", property = "workflowVersion") + @Result(column = "trigger_id", property = "triggerId") + @Result(column = "trigger_type", property = "triggerType") + @Result(column = "run_mode", property = "runMode") + @Result(column = "occurred_time", property = "occurredTime") + @Result(column = "start_time", property = "startTime") + @Result(column = "suspended_time", property = "suspendedTime") + @Result(column = "end_time", property = "endTime") + List findByRef(@Param("workflowRef") String workflowRef); + @Select("SELECT * FROM jm_workflow_instance where workflow_ref=#{workflowRef} and serial_no <= ((select max(serial_no) from jm_workflow_instance where workflow_ref=#{workflowRef}) - #{offset})") @Result(column = "serial_no", property = "serialNo") @Result(column = "workflow_ref", property = "workflowRef") diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/parameter/ParameterRepositoryImpl.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/parameter/ParameterRepositoryImpl.java index 5c67a76f8f0add1dece7956950bec1e0f32f9177..c91192d41a33d01cc9ec8dcd02f46bd5a7c90ec9 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/parameter/ParameterRepositoryImpl.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/parameter/ParameterRepositoryImpl.java @@ -36,4 +36,12 @@ public class ParameterRepositoryImpl implements ParameterRepository { } return this.parameterMapper.findByIds(ids); } + + @Override + public void deleteByIdIn(List ids) { + if (ids.isEmpty()) { + return; + } + this.parameterMapper.deleteByIdIn(ids); + } } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/project/TrashProjectRepositoryImpl.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/project/TrashProjectRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..060ffac9fb32dd6d31931ea3cc67d8ab755ce272 --- /dev/null +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/project/TrashProjectRepositoryImpl.java @@ -0,0 +1,39 @@ +package dev.jianmu.infrastructure.mybatis.project; + +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +import dev.jianmu.infrastructure.mapper.project.TrashProjectMapper; +import dev.jianmu.project.aggregate.Project; +import dev.jianmu.project.repository.TrashProjectRepository; + +/** + * @class TrashProjectRepositoryImpl + * @description TrashProjectRepositoryImpl + * @author Daihw + * @create 2023/5/22 10:33 上午 + */ +@Repository +public class TrashProjectRepositoryImpl implements TrashProjectRepository { + private final TrashProjectMapper trashProjectMapper; + + public TrashProjectRepositoryImpl(TrashProjectMapper trashProjectMapper) { + this.trashProjectMapper = trashProjectMapper; + } + + @Override + public void add(Project project) { + this.trashProjectMapper.add(project); + } + + @Override + public void deleteByWorkflowRef(String workflowRef) { + this.trashProjectMapper.deleteByWorkflowRef(workflowRef); + } + + @Override + public Optional findById(String id) { + return this.trashProjectMapper.findById(id); + } +} diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/InstanceParameterRepositoryImpl.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/InstanceParameterRepositoryImpl.java index 673d95f559515c52f8c052de27c5392ffd097b7c..8cbd25ea726858c1a2ef5789a99fe5d7f5b12123 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/InstanceParameterRepositoryImpl.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/InstanceParameterRepositoryImpl.java @@ -48,4 +48,20 @@ public class InstanceParameterRepositoryImpl implements InstanceParameterReposit public void deleteByTriggerId(String triggerId) { this.instanceParameterMapper.deleteByTriggerId(triggerId); } + + @Override + public void deleteByTriggerIdIn(List triggerIds) { + if (triggerIds.isEmpty()) { + return; + } + this.instanceParameterMapper.deleteByTriggerIdIn(triggerIds); + } + + @Override + public List findParameterIdByTriggerIdIn(List triggerIds) { + if (triggerIds.isEmpty()) { + return List.of(); + } + return this.instanceParameterMapper.findParameterIdByTriggerIdIn(triggerIds); + } } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/TaskInstanceRepositoryImpl.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/TaskInstanceRepositoryImpl.java index 550ec1cb2e588e71500ad2db5e721dc77e4f55ce..e4c5fcb71bd29c2948888f68e8e5f2060f3bc6c0 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/TaskInstanceRepositoryImpl.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/task/TaskInstanceRepositoryImpl.java @@ -232,4 +232,9 @@ public class TaskInstanceRepositoryImpl implements TaskInstanceRepository { public List findByTriggerIdAndStatus(String triggerId, InstanceStatus status) { return this.taskInstanceMapper.findByTriggerIdAndStatus(triggerId, status); } + + @Override + public List findIdAndRefByWorkflowRef(String workflowRef) { + return this.taskInstanceMapper.findIdAndRefByWorkflowRef(workflowRef); + } } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/TriggerEventRepositoryImpl.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/TriggerEventRepositoryImpl.java index c372eaa002c46d15b9dec355c7fdabc3711f0351..503cc5468f8c4a320371bba9d8d07e353f713ccf 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/TriggerEventRepositoryImpl.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/TriggerEventRepositoryImpl.java @@ -1,17 +1,19 @@ package dev.jianmu.infrastructure.mybatis.trigger; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + import dev.jianmu.infrastructure.mapper.trigger.TriggerEventMapper; import dev.jianmu.infrastructure.mapper.trigger.TriggerEventParameterMapper; import dev.jianmu.trigger.event.TriggerEvent; import dev.jianmu.trigger.repository.TriggerEventRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; /** + * @author Ethan Liu * @class TriggerEventRepositoryImpl * @description TriggerEventRepositoryImpl - * @author Ethan Liu * @create 2021-11-11 08:36 */ @Repository @@ -20,8 +22,8 @@ public class TriggerEventRepositoryImpl implements TriggerEventRepository { private final TriggerEventParameterMapper triggerEventParameterMapper; public TriggerEventRepositoryImpl( - TriggerEventMapper triggerEventMapper, - TriggerEventParameterMapper triggerEventParameterMapper + TriggerEventMapper triggerEventMapper, + TriggerEventParameterMapper triggerEventParameterMapper ) { this.triggerEventMapper = triggerEventMapper; this.triggerEventParameterMapper = triggerEventParameterMapper; @@ -58,4 +60,25 @@ public class TriggerEventRepositoryImpl implements TriggerEventRepository { public void deleteParameterByTriggerId(String triggerId) { this.triggerEventParameterMapper.deleteByTriggerId(triggerId); } + + @Override + public void deleteByProjectId(String projectId) { + this.triggerEventMapper.deleteByProjectId(projectId); + } + + @Override + public void deleteParameterByTriggerIdIn(List triggerIds) { + if (triggerIds.isEmpty()) { + return; + } + this.triggerEventParameterMapper.deleteParameterByTriggerIdIn(triggerIds); + } + + @Override + public List findParameterIdByTriggerIdIn(List triggerIds) { + if (triggerIds.isEmpty()) { + return List.of(); + } + return this.triggerEventParameterMapper.findParameterIdByTriggerIdIn(triggerIds); + } } diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/WebRequestRepositoryImpl.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/WebRequestRepositoryImpl.java index 3113601d424a7011b72f9d40681547068685ed49..24cb3d375d2851254fe565d75e8b7ad6ec5c31a9 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/WebRequestRepositoryImpl.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/trigger/WebRequestRepositoryImpl.java @@ -7,6 +7,7 @@ import dev.jianmu.trigger.aggregate.WebRequest; import dev.jianmu.trigger.repository.WebRequestRepository; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; /** @@ -48,6 +49,11 @@ public class WebRequestRepositoryImpl implements WebRequestRepository { return this.webRequestMapper.findByTriggerId(triggerId); } + @Override + public List findByProjectId(String projectId) { + return this.webRequestMapper.findByProjectId(projectId); + } + public PageInfo findPage(String projectId, int pageNum, int pageSize) { return PageHelper.startPage(pageNum, pageSize) .doSelectPageInfo(() -> this.webRequestMapper.findPage(projectId)); diff --git a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/workflow/WorkflowInstanceRepositoryImpl.java b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/workflow/WorkflowInstanceRepositoryImpl.java index b424d3af68d39b5da03d239bfa72f694d08c3d10..824df27bb8ef036de3c03b18734a1b6ef55ea19e 100644 --- a/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/workflow/WorkflowInstanceRepositoryImpl.java +++ b/infrastructure/src/main/java/dev/jianmu/infrastructure/mybatis/workflow/WorkflowInstanceRepositoryImpl.java @@ -106,6 +106,11 @@ public class WorkflowInstanceRepositoryImpl implements WorkflowInstanceRepositor return this.workflowInstanceMapper.findAll(pageNum, pageSize); } + @Override + public List findByRef(String workflowRef) { + return this.workflowInstanceMapper.findByRef(workflowRef); + } + @Override public Optional findByRefAndSerialNoMax(String workflowRef) { return this.workflowInstanceMapper.findByRefAndSerialNoMax(workflowRef); diff --git a/project-core/src/main/java/dev/jianmu/project/event/TrashEvent.java b/project-core/src/main/java/dev/jianmu/project/event/TrashEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..070718b426fc67cd14acb469e1d7c499341eaa8a --- /dev/null +++ b/project-core/src/main/java/dev/jianmu/project/event/TrashEvent.java @@ -0,0 +1,19 @@ +package dev.jianmu.project.event; + +/** + * @author Daihw + * @class TrashEvent + * @description TrashEvent + * @create 2023/5/22 10:26 上午 + */ +public class TrashEvent { + private String projectId; + + public TrashEvent(String projectId) { + this.projectId = projectId; + } + + public String getProjectId() { + return projectId; + } +} diff --git a/project-core/src/main/java/dev/jianmu/project/repository/TrashProjectRepository.java b/project-core/src/main/java/dev/jianmu/project/repository/TrashProjectRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..ad4d5e5c2028f6847a30c04d00f59a4a77a3197a --- /dev/null +++ b/project-core/src/main/java/dev/jianmu/project/repository/TrashProjectRepository.java @@ -0,0 +1,19 @@ +package dev.jianmu.project.repository; + +import java.util.Optional; + +import dev.jianmu.project.aggregate.Project; + +/** + * @class TrashProjectRepository + * @description TrashProjectRepository + * @author Daihw + * @create 2023/5/22 10:32 上午 + */ +public interface TrashProjectRepository { + void add(Project project); + + void deleteByWorkflowRef(String workflowRef); + + Optional findById(String id); +} diff --git a/task-core/src/main/java/dev/jianmu/task/repository/InstanceParameterRepository.java b/task-core/src/main/java/dev/jianmu/task/repository/InstanceParameterRepository.java index 36041d45ef99ee452d735688d4832dd90a9a6631..deb003ca0aa9fc2e0c3c46a118a8f4023b6d1d20 100644 --- a/task-core/src/main/java/dev/jianmu/task/repository/InstanceParameterRepository.java +++ b/task-core/src/main/java/dev/jianmu/task/repository/InstanceParameterRepository.java @@ -3,7 +3,6 @@ package dev.jianmu.task.repository; import dev.jianmu.task.aggregate.InstanceParameter; import java.util.List; -import java.util.Optional; import java.util.Set; /** @@ -22,4 +21,8 @@ public interface InstanceParameterRepository { List findLastOutputParamByTriggerId(String triggerId); void deleteByTriggerId(String triggerId); + + void deleteByTriggerIdIn(List triggerIds); + + List findParameterIdByTriggerIdIn(List triggerIds); } diff --git a/task-core/src/main/java/dev/jianmu/task/repository/TaskInstanceRepository.java b/task-core/src/main/java/dev/jianmu/task/repository/TaskInstanceRepository.java index 78b52fcffd2e9ca55fe092050dcd963ca69475ab..3452979e6f9f73ee99292c0942bbd72ed173cd2c 100644 --- a/task-core/src/main/java/dev/jianmu/task/repository/TaskInstanceRepository.java +++ b/task-core/src/main/java/dev/jianmu/task/repository/TaskInstanceRepository.java @@ -49,4 +49,6 @@ public interface TaskInstanceRepository { Optional findByBusinessIdAndVersion(String businessId, int version); List findByTriggerIdAndStatus(String triggerId, InstanceStatus status); + + List findIdAndRefByWorkflowRef(String workflowRef); } diff --git a/trigger-core/src/main/java/dev/jianmu/trigger/repository/TriggerEventRepository.java b/trigger-core/src/main/java/dev/jianmu/trigger/repository/TriggerEventRepository.java index 959f81725991356987ff22c9f1b2897155c35b33..1b0844ac6f8597cd76fd3318e9c40503b5ed3f50 100644 --- a/trigger-core/src/main/java/dev/jianmu/trigger/repository/TriggerEventRepository.java +++ b/trigger-core/src/main/java/dev/jianmu/trigger/repository/TriggerEventRepository.java @@ -2,6 +2,7 @@ package dev.jianmu.trigger.repository; import dev.jianmu.trigger.event.TriggerEvent; +import java.util.List; import java.util.Optional; /** @@ -20,4 +21,10 @@ public interface TriggerEventRepository { void deleteEventAdnWebRequestByTriggerId(String triggerId); void deleteParameterByTriggerId(String triggerId); + + void deleteByProjectId(String projectId); + + void deleteParameterByTriggerIdIn(List triggerIds); + + List findParameterIdByTriggerIdIn(List triggerIds); } diff --git a/trigger-core/src/main/java/dev/jianmu/trigger/repository/WebRequestRepository.java b/trigger-core/src/main/java/dev/jianmu/trigger/repository/WebRequestRepository.java index 48b8ccdfa070797589ce9d3c888a7b20080ed2a3..08fd38444760edd3a2c0a80adebb4873d542bf7c 100644 --- a/trigger-core/src/main/java/dev/jianmu/trigger/repository/WebRequestRepository.java +++ b/trigger-core/src/main/java/dev/jianmu/trigger/repository/WebRequestRepository.java @@ -2,6 +2,7 @@ package dev.jianmu.trigger.repository; import dev.jianmu.trigger.aggregate.WebRequest; +import java.util.List; import java.util.Optional; /** @@ -20,4 +21,6 @@ public interface WebRequestRepository { void deleteByProjectId(String projectId); Optional findByTriggerId(String triggerId); + + List findByProjectId(String projectId); } diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/BoolParameter.java b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/BoolParameter.java index 6f2dfa652d8bfdc833d52a832fd56e7eb16913bc..1befa4ffe835d613a8231b000668d38a1499759c 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/BoolParameter.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/BoolParameter.java @@ -12,6 +12,11 @@ public class BoolParameter extends Parameter { this.type = Type.BOOL; } + public BoolParameter(Boolean value, boolean isDefault) { + super(value, isDefault); + this.type = Type.BOOL; + } + @Override public String getStringValue() { return String.valueOf(value); diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/NumberParameter.java b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/NumberParameter.java index bf31509f0d8a3441158af5056a2ecce7c7c8fb59..f694d8781bfaec786ea574b0cb31099eef46a32b 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/NumberParameter.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/NumberParameter.java @@ -14,6 +14,11 @@ public class NumberParameter extends Parameter { this.type = Type.NUMBER; } + public NumberParameter(BigDecimal value, boolean isDefault) { + super(value, isDefault); + this.type = Type.NUMBER; + } + @Override public String getStringValue() { return value.toPlainString(); diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/Parameter.java b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/Parameter.java index fe08c48bd3b68cc7430220e2450feda30e914ace..b47ead6604f51861dd8daea18b9452f14678da8e 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/Parameter.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/Parameter.java @@ -31,10 +31,31 @@ public abstract class Parameter { throw new ClassCastException("参数值与类型不匹配,无法转换"); } + @Override + public Parameter newParameter(Object value, boolean isDefault) { + if (value == null) { + return defaultParameter(isDefault); + } + if (value instanceof String) { + var s = (String) value; + var l = s.getBytes(StandardCharsets.UTF_8).length; + if (l > 65535) { + throw new ClassCastException("参数长度为" + l + "已超过最大长度(65535个字节)"); + } + return new StringParameter(s, isDefault); + } + throw new ClassCastException("参数值与类型不匹配,无法转换"); + } + @Override public Parameter defaultParameter() { return new StringParameter(""); } + + @Override + public Parameter defaultParameter(boolean isDefault) { + return new StringParameter("", isDefault); + } }, BOOL { @Override @@ -48,10 +69,26 @@ public abstract class Parameter { throw new ClassCastException("参数值与类型不匹配,无法转换"); } + @Override + public Parameter newParameter(Object value, boolean isDefault) { + if (value == null) { + return defaultParameter(isDefault); + } + if (value instanceof Boolean) { + return new BoolParameter((Boolean) value, isDefault); + } + throw new ClassCastException("参数值与类型不匹配,无法转换"); + } + @Override public Parameter defaultParameter() { return new BoolParameter(false); } + + @Override + public Parameter defaultParameter(boolean isDefault) { + return new BoolParameter(false, isDefault); + } }, SECRET { @Override @@ -65,10 +102,26 @@ public abstract class Parameter { throw new ClassCastException("参数值与类型不匹配,无法转换"); } + @Override + public Parameter newParameter(Object value, boolean isDefault) { + if (value == null) { + return defaultParameter(isDefault); + } + if (value instanceof String) { + return new SecretParameter((String) value, isDefault); + } + throw new ClassCastException("参数值与类型不匹配,无法转换"); + } + @Override public Parameter defaultParameter() { return new SecretParameter(""); } + + @Override + public Parameter defaultParameter(boolean isDefault) { + return new SecretParameter("", isDefault); + } }, NUMBER { @Override @@ -82,10 +135,26 @@ public abstract class Parameter { throw new ClassCastException("参数值与类型不匹配,无法转换"); } + @Override + public Parameter newParameter(Object value, boolean isDefault) { + if (value == null) { + return defaultParameter(isDefault); + } + if (value instanceof Number) { + return new NumberParameter(new BigDecimal(value.toString()), isDefault); + } + throw new ClassCastException("参数值与类型不匹配,无法转换"); + } + @Override public Parameter defaultParameter() { return new NumberParameter(BigDecimal.ZERO); } + + @Override + public Parameter defaultParameter(boolean isDefault) { + return new NumberParameter(BigDecimal.ZERO, isDefault); + } }; public static Optional getEnumInstance(String value) { @@ -102,8 +171,12 @@ public abstract class Parameter { public abstract Parameter newParameter(Object value); + public abstract Parameter newParameter(Object value, boolean isDefault); + public abstract Parameter defaultParameter(); + public abstract Parameter defaultParameter(boolean isDefault); + public static Type getTypeByName(String typeName) { return Arrays.stream(Type.values()) .filter(t -> t.name().equals(typeName)) @@ -119,9 +192,17 @@ public abstract class Parameter { protected Type type; // 参数值 protected final T value; + // 是否默认值 + protected final boolean isDefault; protected Parameter(T value) { this.value = value; + this.isDefault = false; + } + + protected Parameter(T value, boolean isDefault) { + this.value = value; + this.isDefault = isDefault; } public abstract String getStringValue(); @@ -137,4 +218,8 @@ public abstract class Parameter { public T getValue() { return value; } + + public boolean isDefault() { + return isDefault; + } } diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/SecretParameter.java b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/SecretParameter.java index aec1ac83abf7fa98f396c9d53806ec629af13a78..9e36b97df9c7c012afb321c6f11abbeb265ccb45 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/SecretParameter.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/SecretParameter.java @@ -12,6 +12,11 @@ public class SecretParameter extends Parameter { this.type = Type.SECRET; } + public SecretParameter(String value, boolean isDefault) { + super(value, isDefault); + this.type = Type.SECRET; + } + @Override public String getStringValue() { return value; diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/StringParameter.java b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/StringParameter.java index a24b20aa871a316bbda7b9bcc0ee8812ab00cd23..96c3343fdc81542d1290fa575dd1d78166a5a708 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/StringParameter.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/parameter/StringParameter.java @@ -12,6 +12,11 @@ public class StringParameter extends Parameter { this.type = Type.STRING; } + public StringParameter(String value, boolean isDefault) { + super(value, isDefault); + this.type = Type.STRING; + } + @Override public String getStringValue() { return value; diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/process/WorkflowInstance.java b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/process/WorkflowInstance.java index ebe9354f3ca47120852adbc457c70551ea428f87..f910a8f1a51726492ca3d0cb10587bcc4506edc8 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/process/WorkflowInstance.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/aggregate/process/WorkflowInstance.java @@ -1,5 +1,8 @@ package dev.jianmu.workflow.aggregate.process; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import dev.jianmu.event.impl.WorkflowInstanceCreatedEvent; import dev.jianmu.event.impl.WorkflowInstanceStatusUpdatedEvent; import dev.jianmu.workflow.aggregate.AggregateRoot; @@ -17,6 +20,8 @@ import java.util.UUID; * @create 2021-01-21 19:53 */ public class WorkflowInstance extends AggregateRoot { + private static final Logger logger = LoggerFactory.getLogger(WorkflowInstance.class); + // ID private String id; // 执行顺序号 @@ -119,18 +124,26 @@ public class WorkflowInstance extends AggregateRoot { // 挂起流程实例 public void suspend() { - if (!this.isRunning()) { - throw new RuntimeException("流程实例已终止或结束,无法挂起"); - } - this.status = ProcessStatus.SUSPENDED; - this.suspendedTime = LocalDateTime.now(); - var processSuspendedEvent = ProcessSuspendedEvent.Builder.aProcessSuspendedEvent() + if (this.status == ProcessStatus.TERMINATED) { + var processTerminatedEvent = ProcessTerminatedEvent.Builder.aProcessTerminatedEvent() .triggerId(triggerId) .workflowRef(this.workflowRef) .workflowVersion(this.workflowVersion) .workflowInstanceId(this.id) .build(); - this.raiseEvent(processSuspendedEvent); + this.raiseEvent(processTerminatedEvent); + logger.info("publish ProcessTerminatedEvent for task suspend: {}", processTerminatedEvent); + }else { + this.status = ProcessStatus.SUSPENDED; + this.suspendedTime = LocalDateTime.now(); + var processSuspendedEvent = ProcessSuspendedEvent.Builder.aProcessSuspendedEvent() + .triggerId(triggerId) + .workflowRef(this.workflowRef) + .workflowVersion(this.workflowVersion) + .workflowInstanceId(this.id) + .build(); + this.raiseEvent(processSuspendedEvent); + } // 发布流程实例状态变更事件 this.publishStatusUpdatedEvent(); } diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/repository/ParameterRepository.java b/workflow-core/src/main/java/dev/jianmu/workflow/repository/ParameterRepository.java index 3aaec66638e4131e58baf6873b6a021c78924c5e..90ec2ca50159d3f29cee412b8ec087a13bf85509 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/repository/ParameterRepository.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/repository/ParameterRepository.java @@ -16,4 +16,6 @@ public interface ParameterRepository { void addAll(List parameters); List findByIds(Set ids); + + void deleteByIdIn(List ids); } diff --git a/workflow-core/src/main/java/dev/jianmu/workflow/repository/WorkflowInstanceRepository.java b/workflow-core/src/main/java/dev/jianmu/workflow/repository/WorkflowInstanceRepository.java index 5578300837a4eb94bdd17be306f9e77f33971ac8..a30dab9cd176c242c9fc3d27472536734238b27c 100644 --- a/workflow-core/src/main/java/dev/jianmu/workflow/repository/WorkflowInstanceRepository.java +++ b/workflow-core/src/main/java/dev/jianmu/workflow/repository/WorkflowInstanceRepository.java @@ -28,6 +28,8 @@ public interface WorkflowInstanceRepository { List findAll(int pageNum, int pageSize); + List findByRef(String workflowRef); + Optional findByRefAndSerialNoMax(String workflowRef); List findByRefOffset(String workflowRef, long offset);