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

相关推荐
特立独行的猫A16 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
码事漫谈19 小时前
我花了一周时间,看AI公司怎么"管"AI,结果越看越后背发凉
后端
爱学习的程序媛1 天前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
GISer_Jing1 天前
Agent核心内容
后端·ai·langchain
budingxiaomoli1 天前
Spring统一功能处理
java·后端·spring
某鹏1 天前
网关选型:Go、Java、Graal 谁都不能完胜
后端
用户0247836530971 天前
从屎山到防线:14 行状态迁移表,给任务系统装上防瞎跳闸门
后端
CQU_JIAKE1 天前
11.13[体系结构】指标,五级流水线,八级流水线,虚实地址思考
后端
panbook1 天前
从0到1实现一个分布式时序数据库(三):主从复制、故障检测与切换
后端
上线再说1 天前
图片从 8.2MB 压到 296KB:我把小程序图片链路的账单拆了一遍
后端