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

相关推荐
陈随易7 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
鱼樱前端8 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆9 小时前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
颜酱11 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
IT_陈寒12 小时前
SpringBoot自动配置坑了我一周,原来问题这么蠢!
前端·人工智能·后端
iOS开发上架哦13 小时前
Android代码混淆与iOS加固技术详解
后端·ios
Alan_69114 小时前
商品详情优化三板斧-拆分-多级缓存-GC调参
后端·缓存
Conan在掘金14 小时前
ArkTS 进阶之道(3):为哈禁解构声明?类型一眼可见 vs 推断链断裂
后端
晚安code14 小时前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
feng尘14 小时前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试