5.Activiti7工作流启动和查询流程、流程任务处理

首先需要部署流程 这里记录一个个人遇到的问题

修改 BPMN 文件的命名空间为 Activiti 7 推荐的标准命名空间

这个问题在 Activiti 7 中可能无法正确解析 activiti:assignee 等扩展属性,导致 assignee 没有被写入数据库。

xml 复制代码
你的 BPMN 文件中:
xmlns:activiti="http://www.activiti.org/test"
修改为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/testm1783389563673" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1783389563673" name="" targetNamespace="http://www.activiti.org/testm1783389563673" typeLanguage="http://www.w3.org/2001/XMLSchema">
<!-- ... existing code ... -->

启动流程

针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于java类与java对象的关系,类定义好后需要 new创建一个对象使用,当然可以 new多个对象。对于请出差申请流程,张三发起一个出差申请单需要启动一个流程实例,出差申请单发起一个出差单也需要启动一个流程实例。

csharp 复制代码
 /**
     *  启动流程实例
     */
    @Test
    public void testStartProcess() {
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        3、根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("myEvection");
//        输出内容
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动Id:" + processInstance.getActivityId());
    }

操作数据表

act_hi_actinst 流程实例执行历史

act_hi_identitylink 流程的参与用户历史信息

act_hi_procinst 流程实例历史信息

act_hi_taskinst 流程任务历史信息

act_ru_execution 流程执行信息

act_ru_identitylink 流程的参与用户信息

act_ru_task 任务信息(开头说的命名空间问题,可能导致运行无异常但是启动流程时无法在该表插入ASSIGNEE_ 字段导致无法根据负责人查询)

任务查询

查询当前个人待执行的任务 复制代码
 /**
     * 查询当前个人待执行的任务
     */
    @Test
    public void testFindPersonalTaskList() {
//        任务负责人
        String assignee = "zhangsan";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        创建TaskService
        TaskService taskService = processEngine.getTaskService();
//        根据流程key 和 任务负责人 查询任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee(assignee)//只查询该任务负责人的任务
                .list();

        for (Task task : list) {

            System.out.println("流程实例id:" + task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());

        }
    }
输出结果 复制代码
流程实例id:25001
任务id:25005
任务负责人:zhangsan
任务名称:创建出差申请
执行的SQL 复制代码
select distinct RES.* from ACT_RU_TASK RES inner join ACT_RE_PROCDEF D on RES.PROC_DEF_ID_ = 
D.ID_ WHERE RES.ASSIGNEE_ = ? and D.KEY_ = ? order by RES.ID_ asc LIMIT ? OFFSET ?

zhangsan(String), myEvection(String), 2147483647(Integer), 0(Integer)

流程任务处理 (完成任务节点).

任务负责人查询待办任务,选择任务进行处理,完成任务。

完成任务 复制代码
  /**
     * 完成任务
     */
    @Test
    public void completTask(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskService
        TaskService taskService = processEngine.getTaskService();

//        根据流程key 和 任务的负责人 查询任务
//        返回一个任务对象
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee("zhangsan")  //要查询的负责人
                .singleResult();

//        完成任务,参数:任务id
        taskService.complete(task.getId());
//  taskService.complete("25005");  或者直接使用上面查询的结果完成

    }

我们执行之前的数据库 act_ru_task 内容 创建申请taskid=25005 当前办理人zhangsan

执行完成任务completTask()之后

创建进入了 ACT_HI_TASKINST 表

act_hi_taskinst 复制代码
insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_, CATEGORY_, TENANT_ID_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) 

27502(String), myEvection:4:22504(String), 25001(String), 25002(String), 经理审批(String), null, null, null, jerry(String), 2026-07-08 14:29:08.877(Timestamp), null, null, null, null, _4(String), null, 50(Integer), null, null, (String)

ACT_RU_TASK 表 taskid= 27502 经理审批 ASSIGNEE_=jerry

ACT_RU_TASK 复制代码
-- 正在运行任务表增加了 经理审批 
insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, TASK_DEF_KEY_, DUE_DATE_, CATEGORY_, SUSPENSION_STATE_, TENANT_ID_, FORM_KEY_, CLAIM_TIME_) values (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) 


27502(String), 经理审批(String), null, null, 50(Integer), 2026-07-08 14:29:08.864(Timestamp), null, jerry(String), null, 25002(String), 25001(String), myEvection:4:22504(String), _4(String), null, null, 1(Integer), (String), null, null

-- 正在运行任务表删除了 创建流程  
delete from ACT_RU_TASK where ID_ = ? and REV_ = ? 
25005(String), 1(Integer)
ACT_HI_ACTINST 复制代码
update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ? where ID_ = ? 
25002(String), zhangsan(String), 2026-07-08 14:29:08.852(Timestamp), 5596994(Long), null, 25004(String)

执行完成 数据表有改动的顺序 插入和更新

依次完成 jerry经理 jack总经理 rose财务审批 注意:singleResult()仅为测试使用,测试时每个角色只有一条对用处理的任务,正式使用还是从list()返回的值选取一条进行操作

scss 复制代码
    /**
     * 完成任务
     */
    @Test
    public void completTask(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskService
        TaskService taskService = processEngine.getTaskService();

//        根据流程key 和 任务的负责人 查询任务
//        返回一个任务对象
//        Task task = taskService.createTaskQuery()
//                .processDefinitionKey("myEvection") //流程Key
//                .taskAssignee("zhangsan")  //要查询的负责人
//                .singleResult();

//        Task task = taskService.createTaskQuery()
//                .processDefinitionKey("myEvection") //流程Key
//                .taskAssignee("jerry")  //要查询的负责人
//                .singleResult();

//        Task task = taskService.createTaskQuery()
//                .processDefinitionKey("myEvection") //流程Key
//                .taskAssignee("jack")  //要查询的负责人
//                .singleResult();
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee("rose")  //要查询的负责人
                .singleResult();





//        完成任务,参数:任务id
        taskService.complete(task.getId());

    }

jerry经理

jack

rose 完成后工作流已经结束

activiti.act_hi_actinst表内已经有结束标识了EndEvent

相关推荐
꒰ঌ 安卓开发໒꒱1 小时前
.NET CAP入门到入土
后端·c#·.net
sukioe2 小时前
【无标题】
后端·docker·centos
geovindu2 小时前
java:Abstract Factory Pattern
java·开发语言·后端·设计模式·抽象工厂模式·创建型模式
geovindu3 小时前
java: Factory Method Pattern
java·开发语言·后端·设计模式·工厂方法模式·创建型模式
voicelen3 小时前
一通电话背后有多少角色?我拆了 Voicelen 的调度台给你看
后端
用户8017220416393 小时前
BarQode:C# 条码二维码生成库
后端
考虑考虑3 小时前
kafka4安装
后端·kafka·自动化运维
orient3 小时前
慢查询优化 10 招:从 EXPLAIN 到索引重建
后端