add 添加流程实例运行中,已结束分页查询

This commit is contained in:
songgaoshuai 2023-06-09 12:32:06 +08:00
parent fa3e9f82bd
commit 11643253a0
5 changed files with 222 additions and 4 deletions

View File

@ -3,7 +3,10 @@ package org.dromara.workflow.controller;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.workflow.domain.bo.ProcessInstanceBo;
import org.dromara.workflow.domain.vo.ProcessInstanceVo;
import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.service.IActProcessInstanceService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -21,6 +24,26 @@ public class ActProcessInstanceController extends BaseController {
private final IActProcessInstanceService iActProcessInstanceService; private final IActProcessInstanceService iActProcessInstanceService;
/**
* 分页查询正在运行的流程实例
*
* @param processInstanceBo 参数
*/
@GetMapping("/getProcessInstanceRunningByPage")
public TableDataInfo<ProcessInstanceVo> getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo) {
return iActProcessInstanceService.getProcessInstanceRunningByPage(processInstanceBo);
}
/**
* 分页查询已结束的流程实例
*
* @param processInstanceBo 参数
*/
@GetMapping("/getProcessInstanceFinishByPage")
public TableDataInfo<ProcessInstanceVo> getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo) {
return iActProcessInstanceService.getProcessInstanceFinishByPage(processInstanceBo);
}
/** /**
* 通过流程实例id获取历史流程图 * 通过流程实例id获取历史流程图
* *
@ -28,8 +51,7 @@ public class ActProcessInstanceController extends BaseController {
* @param response 响应 * @param response 响应
*/ */
@GetMapping("/getHistoryProcessImage/{processInstanceId}") @GetMapping("/getHistoryProcessImage/{processInstanceId}")
public void getHistoryProcessImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId, public void getHistoryProcessImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId, HttpServletResponse response) {
HttpServletResponse response) {
iActProcessInstanceService.getHistoryProcessImage(processInstanceId, response); iActProcessInstanceService.getHistoryProcessImage(processInstanceId, response);
} }
} }

View File

@ -0,0 +1,36 @@
package org.dromara.workflow.domain.bo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.workflow.common.PageEntity;
import java.io.Serial;
import java.io.Serializable;
/**
* 流程实例请求对象
*
* @author may
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ProcessInstanceBo extends PageEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 流程名称
*/
private String name;
/**
* 任务发起人
*/
private String startUserId;
/**
* 业务id
*/
private String businessKey;
}

View File

@ -0,0 +1,79 @@
package org.dromara.workflow.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 流程实例视图
*
* @author may
*/
@Data
public class ProcessInstanceVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 流程实例id
*/
private String id;
/**
* 流程定义id
*/
private String processDefinitionId;
/**
* 流程定义名称
*/
private String processDefinitionName;
/**
* 流程定义key
*/
private String processDefinitionKey;
/**
* 流程定义版本
*/
private String processDefinitionVersion;
/**
* 部署id
*/
private String deploymentId;
/**
* 业务id
*/
private String businessKey;
/**
* 是否挂起
*/
private boolean isSuspended;
/**
* 租户id
*/
private String tenantId;
/**
* 启动时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 启动人id
*/
private String startUserId;
}

View File

@ -1,6 +1,9 @@
package org.dromara.workflow.service; package org.dromara.workflow.service;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.workflow.domain.bo.ProcessInstanceBo;
import org.dromara.workflow.domain.vo.ProcessInstanceVo;
/** /**
* 流程实例 服务层 * 流程实例 服务层
@ -15,4 +18,20 @@ public interface IActProcessInstanceService {
* @param response 响应 * @param response 响应
*/ */
void getHistoryProcessImage(String processInstanceId, HttpServletResponse response); void getHistoryProcessImage(String processInstanceId, HttpServletResponse response);
/**
* 分页查询正在运行的流程实例
*
* @param processInstanceBo 参数
* @return 结果
*/
TableDataInfo<ProcessInstanceVo> getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo);
/**
* 分页查询已结束的流程实例
*
* @param processInstanceBo 参数
* @return 结果
*/
TableDataInfo<ProcessInstanceVo> getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo);
} }

View File

@ -1,10 +1,16 @@
package org.dromara.workflow.service.impl; package org.dromara.workflow.service.impl;
import cn.hutool.core.bean.BeanUtil;
import jakarta.servlet.ServletOutputStream; import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.bo.ProcessInstanceBo;
import org.dromara.workflow.domain.vo.ProcessInstanceVo;
import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator;
import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.service.IActProcessInstanceService;
import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.BpmnModel;
@ -13,7 +19,9 @@ import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceQuery;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -23,7 +31,6 @@ import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* 流程实例 服务层实现 * 流程实例 服务层实现
@ -48,6 +55,61 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
@Value("${flowable.annotation-font-name}") @Value("${flowable.annotation-font-name}")
private String annotationFontName; private String annotationFontName;
/**
* 分页查询正在运行的流程实例
*
* @param processInstanceBo 参数
*/
@Override
public TableDataInfo<ProcessInstanceVo> getProcessInstanceRunningByPage(ProcessInstanceBo processInstanceBo) {
List<ProcessInstanceVo> list = new ArrayList<>();
ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery();
query.processInstanceTenantId(TenantHelper.getTenantId());
if (StringUtils.isNotBlank(processInstanceBo.getName())) {
query.processInstanceNameLikeIgnoreCase("%" + processInstanceBo.getName() + "%");
}
if (StringUtils.isNotBlank(processInstanceBo.getStartUserId())) {
query.startedBy(processInstanceBo.getStartUserId());
}
if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) {
query.processInstanceBusinessKey(processInstanceBo.getBusinessKey());
}
List<ProcessInstance> processInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize());
for (ProcessInstance processInstance : processInstances) {
list.add(BeanUtil.toBean(processInstance, ProcessInstanceVo.class));
}
long count = query.count();
return new TableDataInfo<>(list, count);
}
/**
* 分页查询已结束的流程实例
*
* @param processInstanceBo 参数
*/
@Override
public TableDataInfo<ProcessInstanceVo> getProcessInstanceFinishByPage(ProcessInstanceBo processInstanceBo) {
List<ProcessInstanceVo> list = new ArrayList<>();
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery().finished()
.orderByProcessInstanceEndTime().desc();
query.processInstanceTenantId(TenantHelper.getTenantId());
if (StringUtils.isNotEmpty(processInstanceBo.getName())) {
query.processInstanceNameLike(processInstanceBo.getName());
}
if (StringUtils.isNotEmpty(processInstanceBo.getStartUserId())) {
query.startedBy(processInstanceBo.getStartUserId());
}
if (StringUtils.isNotBlank(processInstanceBo.getBusinessKey())) {
query.processInstanceBusinessKey(processInstanceBo.getBusinessKey());
}
List<HistoricProcessInstance> historicProcessInstances = query.listPage(processInstanceBo.getPageNum(), processInstanceBo.getPageSize());
for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {
list.add(BeanUtil.toBean(historicProcessInstance, ProcessInstanceVo.class));
}
long count = query.count();
return new TableDataInfo<>(list, count);
}
/** /**
* 通过流程实例id获取历史流程图 * 通过流程实例id获取历史流程图
* *
@ -98,7 +160,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
} }
List<String> highLightedNodeList = new ArrayList<>(); List<String> highLightedNodeList = new ArrayList<>();
//运行中的节点 //运行中的节点
List<String> redNodeCollect = highLightedNodes.stream().filter(e -> e.contains(Color.RED.toString())).collect(Collectors.toList()); List<String> redNodeCollect = highLightedNodes.stream().filter(e -> e.contains(Color.RED.toString())).toList();
//排除与运行中相同的节点 //排除与运行中相同的节点
for (String nodeId : highLightedNodes) { for (String nodeId : highLightedNodes) {
if (!nodeId.contains(Color.RED.toString()) && !redNodeCollect.contains(Color.RED + nodeId)) { if (!nodeId.contains(Color.RED.toString()) && !redNodeCollect.contains(Color.RED + nodeId)) {