flowable流程实例管理接口

本文详细介绍了基于Activiti的工作流管理接口,包括流程实例的启动、查询、挂起、激活、终止及流程图生成等功能,提供了丰富的代码示例,帮助读者深入理解工作流管理的核心操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、流程实例的管理接口常见功能:
1.启动一个流程(即创建一个流程实例)
2.本人发起的流程实例
3.本人参与的流程实例
4.挂起/激活流程实例
5.提前终止流程实例(或又叫撤销流程)
6.彻底删除流程实例
7.流程图查看
8.判断流程实例的状态(运行中/已结束)

import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.image.ProcessDiagramGenerator;
import org.flowable.task.api.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ActivitiUtils {
    private static final Logger logger = LoggerFactory.getLogger(ActivitiUtils.class);

    private ProcessEngine processEngine;
    private RuntimeService runtimeService;
    private TaskService taskService;
    private RepositoryService repositoryService;

    @Autowired
    public ActivitiUtils(ProcessEngine processEngine, RepositoryService repositoryService,RuntimeService runtimeService, TaskService taskService) {
        this.processEngine = processEngine;
        this.repositoryService = repositoryService;
        this.runtimeService = runtimeService;
        this.taskService = taskService;
    }

    /**
     * 启动流程
     *
     * @param processKey 流程定义key
     * @param params
     * @return
     */
    public ProcessInstance startFlow(String processKey, Map<String, Object> params) {
        //启动前必须开启,这样才能取得流程发起人
        String userId = params.get("AuthenticatedUserId").toString();
        //设置流程实例的发起人是当前用户
        Authentication.setAuthenticatedUserId(userId);
        // 取得业务id
        String businessKey = params.get("businessKey").toString();
        if (StringUtils.isEmpty(processKey)) {
            logger.error("错误:流程定义未找到!");
        }
        if (null == params) {
            params = new HashMap<>();
        }
        Deployment deployment = repositoryService.createDeploymentQuery().processDefinitionKey(processKey).singleResult();
        if (deployment == null) {
            logger.error("错误:启动流程实例:" + processKey);
        }
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, businessKey, params);// 同时设置业务的id到流程实例中的BUSINESS_KEY_
        logger.info("成功:启动流程实例:" + processInstance.getProcessDefinitionName() + ":" + processInstance.getId());
        Authentication.setAuthenticatedUserId(null); // 这个方法最终使用一个ThreadLocal类型的变量进行存储,也就是与当前的线程绑定,所以流程实例启动完毕之后,需要设置为null,防止多线程的时候出问题。
        return processInstance;
    }

    /**
     * 终止流程实例
     *
     * @param processInstanceId
     */
    public void deleteProcessInstanceById(String processInstanceId) {
        // ""这个参数本来可以写删除原因
        runtimeService.deleteProcessInstance(processInstanceId,"");
    }

    /**
     * 我发起的流程实例列表
     *
     * @param userId
     * @return  流程实例列表
     */
    public List<HistoricProcessInstance> getMyStartProcint(String userId) {
        List<HistoricProcessInstance> list = processEngine.getHistoryService()
                .createHistoricProcessInstanceQuery()
                .startedBy(userId)
                .orderByProcessInstanceStartTime()
                .asc()
                .list();
        return list;
    }

    /**
     * 挂起流程实例
     *
     * @param processInstanceId 当前流程实例id
     */
    public void handUpProcessInstance(String processInstanceId) {
        runtimeService.suspendProcessInstanceById(processInstanceId);
    }

    /**
     * 恢复(唤醒)被挂起的流程实例
     *
     * @param processInstanceId  流程实例id
     */
    public void activateProcessInstance(String processInstanceId) {
        runtimeService.activateProcessInstanceById(processInstanceId);
    }

    /**
     * 判断流程实例在运行中存不存在
     *
     * @param processInstanceId  流程实例
     * @return true表示存在,false表示不存在
     */
    public Boolean isExistProcIntRunning(String processInstanceId){
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
        if (processInstance == null) {
            return false;
        } else  {
            return true;
        }
    }

    /**
     * 查询历史实例中流程实例是否存在
     *
     * @param processInstanceId 流程实例
     * @return true表示存在,false表示不存在
     */
    public Boolean isExistProcHistory(String processInstanceId){
        HistoricProcessInstance historicProcessInstance = processEngine.getHistoryService()
                .createHistoricProcessInstanceQuery()
                .processInstanceId(processInstanceId)
                .singleResult();
        if (historicProcessInstance == null) {
            return false;
        } else {
            return true;
        }
    }


    /**
     * 生成流程图
     * 通过传入流程启动id去查询当前流执行节点
     * 返回流程图 到期节点 标红显示
     *
     * @param response
     * @param processId  任务ID
     * @throws Exception
     */
    public void genProcessDiagram(HttpServletResponse response, String processId) throws Exception {
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
        //流程走完的不显示图
        if (processInstance == null) {
            return;
        }
        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        //使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
        String processInstanceId = task.getProcessInstanceId();
        List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list();

        //得到正在执行的Activity的Id
        List<String> activityIds = new ArrayList<>();
        List<String> flows = new ArrayList<>();
        for (Execution exe : executions) {
            List<String> activeActivityIds = runtimeService.getActiveActivityIds(exe.getId());
            activityIds.addAll(activeActivityIds);
        }

        //获取流程图
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
        ProcessEngineConfiguration processEngineConfiguration = processEngine.getProcessEngineConfiguration();
        ProcessDiagramGenerator processDiagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
        InputStream in = processDiagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, processEngineConfiguration.getActivityFontName(), processEngineConfiguration.getLabelFontName(), processEngineConfiguration.getAnnotationFontName(), processEngineConfiguration.getClassLoader(), 1.0, false);
        OutputStream out = null;
        byte[] buf = new byte[1024];
        int legth = 0;
        try {
            out = response.getOutputStream();
            while ((legth = in.read(buf)) != -1) {
                out.write(buf, 0, legth);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }



}

### Flowable 流程图 API 接口文档与使用教程 #### 获取流程定义图形表示 为了获取特定流程定义的图形表示,可以利用 `RepositoryService` 提供的方法。此方法允许应用程序开发者以图像形式展示工作流模型。 ```java InputStream imageStream = repositoryService.getResourceAsStream(deploymentId, "diagram.png"); ``` 上述代码片段展示了如何从指定部署中提取流程图资源文件[^1]。然而,对于RESTful Web服务而言,官方建议的方式是通过 REST API 来请求流程定义的相关信息及其对应的图形表示: - **GET /repository/process-definitions/{processDefinitionId}/diagram** 此端点返回给定ID的流程定义所关联的图表PNG图片。这使得集成到前端界面变得简单易行,只需发送HTTP GET 请求并处理响应中的二进制数据即可显示流程图[^2]。 #### 创建新流程实例时附加初始参数 当需要启动一个新的流程实例时,除了基本的身份验证外,还可能希望传递一些初始化参数作为流程变量。这些变量可以在整个生命周期内被各个活动节点访问和修改。 ```json POST https://flowableserver:port/engine-rest/process-definition/key/start Content-Type: application/json Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= { "variables": { "varName": {"value":"theValue", "type":"String"} } } ``` 这段JSON负载说明了怎样设置启动消息体内的变量集合;其中每个条目由名称、实际值以及类型组成。注意这里采用了推荐的安全认证机制——Basic Auth头字段。 #### 查询正在运行的流程实例详情 一旦有了活跃着的流程实例之后,有时会想要了解其当前的状态或者是追踪它的进展轨迹。这时就轮到了 `RuntimeService` 和 `HistoryService` 发挥作用了。 ```java // Java SDK Example List<ProcessInstance> instances = runtimeService.createProcessInstanceQuery() .active() .list(); for (ProcessInstance pi : instances){ System.out.println(pi.getId()); } // 或者使用 REST API 方式 GET https://flowableserver:port/engine-rest/history/instance?startedAfter=... ``` 前者是从内存中检索所有未结束的实例列表,而后者则能基于时间戳筛选出某段时间范围内外的历史记录项。两种途径各有优劣取决于具体应用场景需求。 #### 审核过程中定位具体的任务节点 在某些情况下,特别是涉及到审批之类的场景下,往往有必要根据业务键(Business Key)去精确定位某个特定的任务节点位置以便进一步操作比如更新状态或是指派负责人等动作。 ```sql SELECT * FROM ACT_RU_TASK WHERE PROC_INST_ID_ IN ( SELECT PROC_INST_ID_ FROM ACT_HI_PROCINST WHERE BUSINESS_KEY_='your_business_key' ); ``` SQL语句直观表达了这一逻辑:先依据唯一标识符找到匹配的历史流程实例,再据此条件拉取待办事项清单。不过更常见的是借助编程接口完成相同目的,例如Java客户端库提供的查询构建器工具链[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值