工作流增加历史版本展示并切换

This commit is contained in:
nidayehaishinidaye 2025-05-27 21:53:41 +08:00
parent 6ce6485da9
commit f129e82efc
5 changed files with 196 additions and 4 deletions

View File

@ -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<WorkflowHistory> {
}

View File

@ -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;
/**
* * 工作流履历表
* </p>
*
* @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;
}

View File

@ -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.service.WorkflowService;
import com.aizuda.snailjob.server.web.util.ExportUtils; import com.aizuda.snailjob.server.web.util.ExportUtils;
import com.aizuda.snailjob.server.web.util.ImportUtils; import com.aizuda.snailjob.server.web.util.ImportUtils;
import com.aizuda.snailjob.template.datasource.persistence.po.WorkflowHistory;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -48,6 +49,29 @@ public class WorkflowController {
return workflowService.listPage(queryVO); return workflowService.listPage(queryVO);
} }
/***
* 获取当前id历史版本
* @param id
* @return
*/
@GetMapping("/history/{id}")
@LoginRequired(role = RoleEnum.USER)
public List<WorkflowHistory> 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 @PutMapping
@LoginRequired(role = RoleEnum.USER) @LoginRequired(role = RoleEnum.USER)
public Boolean updateWorkflow(@RequestBody @Validated WorkflowRequestVO workflowRequestVO) { public Boolean updateWorkflow(@RequestBody @Validated WorkflowRequestVO workflowRequestVO) {

View File

@ -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.web.model.request.*;
import com.aizuda.snailjob.server.common.vo.WorkflowDetailResponseVO; import com.aizuda.snailjob.server.common.vo.WorkflowDetailResponseVO;
import com.aizuda.snailjob.server.common.vo.WorkflowResponseVO; import com.aizuda.snailjob.server.common.vo.WorkflowResponseVO;
import com.aizuda.snailjob.template.datasource.persistence.po.WorkflowHistory;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
@ -42,4 +43,8 @@ public interface WorkflowService {
); );
Boolean deleteByIds(Set<Long> ids); Boolean deleteByIds(Set<Long> ids);
List<WorkflowHistory> getWorkflowHistory(Long id);
WorkflowDetailResponseVO getWorkflowHistoryDetail(Long id, String version);
} }

View File

@ -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.common.handler.WorkflowHandler;
import com.aizuda.snailjob.server.web.util.UserSessionUtils; import com.aizuda.snailjob.server.web.util.UserSessionUtils;
import com.aizuda.snailjob.template.datasource.access.AccessTemplate; 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.*;
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.po.*; import com.aizuda.snailjob.template.datasource.persistence.po.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
@ -58,6 +55,7 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -78,6 +76,7 @@ import java.util.stream.Collectors;
public class WorkflowServiceImpl implements WorkflowService { public class WorkflowServiceImpl implements WorkflowService {
private final WorkflowMapper workflowMapper; private final WorkflowMapper workflowMapper;
private final WorkflowHistoryMapper workflowHistoryMapper;
private final WorkflowNodeMapper workflowNodeMapper; private final WorkflowNodeMapper workflowNodeMapper;
private final SystemProperties systemProperties; private final SystemProperties systemProperties;
private final WorkflowHandler workflowHandler; private final WorkflowHandler workflowHandler;
@ -147,6 +146,14 @@ public class WorkflowServiceImpl implements WorkflowService {
workflow.setVersion(null); workflow.setVersion(null);
workflow.setFlowInfo(JsonUtil.toJsonString(GraphUtils.serializeGraphToJson(graph))); workflow.setFlowInfo(JsonUtil.toJsonString(GraphUtils.serializeGraphToJson(graph)));
Assert.isTrue(1 == workflowMapper.updateById(workflow), () -> new SnailJobServerException("Failed to save workflow 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; return true;
} }
@ -235,6 +242,14 @@ public class WorkflowServiceImpl implements WorkflowService {
.eq(Workflow::getVersion, version)) > 0, .eq(Workflow::getVersion, version)) > 0,
() -> new SnailJobServerException("Update failed")); () -> 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; return Boolean.TRUE;
} }
@ -377,6 +392,27 @@ public class WorkflowServiceImpl implements WorkflowService {
return Boolean.TRUE; return Boolean.TRUE;
} }
@Override
public List<WorkflowHistory> getWorkflowHistory(Long id) {
return workflowHistoryMapper.selectList(new LambdaQueryWrapper<WorkflowHistory>().eq(WorkflowHistory::getId, id));
}
@Override
public WorkflowDetailResponseVO getWorkflowHistoryDetail(Long id, String version) {
WorkflowHistory workflowHistory = workflowHistoryMapper.selectOne(
new LambdaQueryWrapper<WorkflowHistory>()
.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<WorkflowRequestVO> workflowRequestVOList, final String namespaceId) { private void batchSaveWorkflowTask(final List<WorkflowRequestVO> workflowRequestVOList, final String namespaceId) {
Set<String> groupNameSet = StreamUtils.toSet(workflowRequestVOList, WorkflowRequestVO::getGroupName); Set<String> groupNameSet = StreamUtils.toSet(workflowRequestVOList, WorkflowRequestVO::getGroupName);