首先需要部署流程 这里记录一个个人遇到的问题
修改 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
