diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/mapper/WorkflowHistoryMapper.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/mapper/WorkflowHistoryMapper.java new file mode 100644 index 000000000..12edfbf1a --- /dev/null +++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/mapper/WorkflowHistoryMapper.java @@ -0,0 +1,15 @@ +package com.aizuda.snailjob.template.datasource.persistence.mapper; + +import com.aizuda.snailjob.template.datasource.persistence.po.WorkflowHistory; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + + +/** + * @author zjw + * @description: TODO + * @date 2025/05/19 + */ +@Mapper +public interface WorkflowHistoryMapper extends BaseMapper { +} diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/po/WorkflowHistory.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/po/WorkflowHistory.java new file mode 100644 index 000000000..6cd82e168 --- /dev/null +++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/po/WorkflowHistory.java @@ -0,0 +1,112 @@ +package com.aizuda.snailjob.template.datasource.persistence.po; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * * 工作流履历表 + *

+ * + * @author : xiaowoniu + * @date : 2023-12-12 + * @since : 2.6.0 + */ +@Data +@TableName("sj_workflow_history") +@EqualsAndHashCode(callSuper=true) +public class WorkflowHistory extends CreateUpdateDt{ + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 工作流名称 + */ + private String workflowName; + + /** + * 命名空间id + */ + private String namespaceId; + + /** + * 组名称 + */ + private String groupName; + + /** + * 触发类型 + */ + private Integer triggerType; + + /** + * 阻塞策略 + */ + private Integer blockStrategy; + + /** + * 触发间隔 + */ + private String triggerInterval; + + /** + * 执行超时时间 + */ + private Integer executorTimeout; + + /** + * 工作流状态 0、关闭、1、开启 + */ + private Integer workflowStatus; + + /** + * 任务执行时间 + */ + private Long nextTriggerAt; + + /** + * 流程信息 + */ + private String flowInfo; + + /** + * bucket + */ + private Integer bucketIndex; + + /** + * 描述 + */ + private String description; + + /** + * 工作流上下文 + */ + private String wfContext; + + /** + * 版本号 + */ + private Integer version; + + /** + * 扩展字段 + */ + private String extAttrs; + + /** + * 逻辑删除 1、删除 + */ + private Integer deleted; + + /** + * 通知告警场景配置id列表 + */ + private String notifyIds; +} diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java index b033b8317..b3906a4a4 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java @@ -12,6 +12,7 @@ import com.aizuda.snailjob.server.common.vo.WorkflowResponseVO; import com.aizuda.snailjob.server.web.service.WorkflowService; import com.aizuda.snailjob.server.web.util.ExportUtils; import com.aizuda.snailjob.server.web.util.ImportUtils; +import com.aizuda.snailjob.template.datasource.persistence.po.WorkflowHistory; import jakarta.validation.constraints.NotEmpty; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -48,6 +49,29 @@ public class WorkflowController { return workflowService.listPage(queryVO); } + /*** + * 获取当前id历史版本 + * @param id + * @return + */ + @GetMapping("/history/{id}") + @LoginRequired(role = RoleEnum.USER) + public List historyVos(@PathVariable("id") Long id) { + return workflowService.getWorkflowHistory(id); + } + + /*** + * 获取当前id历史版本 详细 + * @param id + * @param version + * @return + */ + @GetMapping("/historyDetail/{id}") + @LoginRequired(role = RoleEnum.USER) + public WorkflowDetailResponseVO historyDetail(@PathVariable("id") Long id, @RequestParam("version") String version) { + return workflowService.getWorkflowHistoryDetail(id,version); + } + @PutMapping @LoginRequired(role = RoleEnum.USER) public Boolean updateWorkflow(@RequestBody @Validated WorkflowRequestVO workflowRequestVO) { diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java index 918efb2bf..6f72458ab 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java @@ -6,6 +6,7 @@ import com.aizuda.snailjob.server.web.model.base.PageResult; import com.aizuda.snailjob.server.web.model.request.*; import com.aizuda.snailjob.server.common.vo.WorkflowDetailResponseVO; import com.aizuda.snailjob.server.common.vo.WorkflowResponseVO; +import com.aizuda.snailjob.template.datasource.persistence.po.WorkflowHistory; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; @@ -42,4 +43,8 @@ public interface WorkflowService { ); Boolean deleteByIds(Set ids); + + List getWorkflowHistory(Long id); + + WorkflowDetailResponseVO getWorkflowHistoryDetail(Long id, String version); } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java index 026a7780c..1352e454e 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java @@ -42,10 +42,7 @@ import com.aizuda.snailjob.server.web.service.handler.GroupHandler; import com.aizuda.snailjob.server.common.handler.WorkflowHandler; import com.aizuda.snailjob.server.web.util.UserSessionUtils; import com.aizuda.snailjob.template.datasource.access.AccessTemplate; -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.mapper.WorkflowMapper; -import com.aizuda.snailjob.template.datasource.persistence.mapper.WorkflowNodeMapper; +import com.aizuda.snailjob.template.datasource.persistence.mapper.*; import com.aizuda.snailjob.template.datasource.persistence.po.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; @@ -58,6 +55,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -78,6 +76,7 @@ import java.util.stream.Collectors; public class WorkflowServiceImpl implements WorkflowService { private final WorkflowMapper workflowMapper; + private final WorkflowHistoryMapper workflowHistoryMapper; private final WorkflowNodeMapper workflowNodeMapper; private final SystemProperties systemProperties; private final WorkflowHandler workflowHandler; @@ -147,6 +146,14 @@ public class WorkflowServiceImpl implements WorkflowService { workflow.setVersion(null); workflow.setFlowInfo(JsonUtil.toJsonString(GraphUtils.serializeGraphToJson(graph))); Assert.isTrue(1 == workflowMapper.updateById(workflow), () -> new SnailJobServerException("Failed to save workflow graph")); + + //准备数据到履历表add 20250519 + WorkflowHistory history = new WorkflowHistory(); + Workflow workflow1 = workflowMapper.selectById(workflow.getId()); + BeanUtils.copyProperties(workflow1, history); + + Assert.isTrue(1 == workflowHistoryMapper.insert(history), () -> new SnailJobServerException("Failed to save workflowHistory graph")); + return true; } @@ -235,6 +242,14 @@ public class WorkflowServiceImpl implements WorkflowService { .eq(Workflow::getVersion, version)) > 0, () -> new SnailJobServerException("Update failed")); + //工作流表更新后插入履历表 + //准备数据到履历表add 20250520 + WorkflowHistory history = new WorkflowHistory(); + Workflow workflow1 = workflowMapper.selectById(workflow.getId()); + BeanUtils.copyProperties(workflow1, history); + + Assert.isTrue(1 == workflowHistoryMapper.insert(history), () -> new SnailJobServerException("Failed to save workflowHistory graph")); + return Boolean.TRUE; } @@ -377,6 +392,27 @@ public class WorkflowServiceImpl implements WorkflowService { return Boolean.TRUE; } + @Override + public List getWorkflowHistory(Long id) { + return workflowHistoryMapper.selectList(new LambdaQueryWrapper().eq(WorkflowHistory::getId, id)); + } + + @Override + public WorkflowDetailResponseVO getWorkflowHistoryDetail(Long id, String version) { + WorkflowHistory workflowHistory = workflowHistoryMapper.selectOne( + new LambdaQueryWrapper() + .eq(WorkflowHistory::getId, id) + .eq(WorkflowHistory::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId()) + .eq(WorkflowHistory::getVersion, version) + ); + if (Objects.isNull(workflowHistory)) { + return null; + } + Workflow workflow = new Workflow(); + BeanUtils.copyProperties(workflowHistory, workflow); + return doGetWorkflowDetail(workflow); + } + private void batchSaveWorkflowTask(final List workflowRequestVOList, final String namespaceId) { Set groupNameSet = StreamUtils.toSet(workflowRequestVOList, WorkflowRequestVO::getGroupName);