
修改 BPMN 文件的命名空间为 Activiti 7 推荐的标准命名空间这个问题在 Activiti 7 中可能无法正确解析 activiti:assignee 等扩展属性导致 assignee 没有被写入数据库。你的 BPMN 文件中 xmlns:activitihttp://www.activiti.org/test 修改为 ?xml version1.0 encodingUTF-8 standaloneyes? definitions xmlnshttp://www.omg.org/spec/BPMN/20100524/MODEL xmlns:activitihttp://activiti.org/bpmn xmlns:bpmndihttp://www.omg.org/spec/BPMN/20100524/DI xmlns:dchttp://www.omg.org/spec/DD/20100524/DC xmlns:dihttp://www.omg.org/spec/DD/20100524/DI xmlns:tnshttp://www.activiti.org/testm1783389563673 xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance expressionLanguagehttp://www.w3.org/1999/XPath idm1783389563673 name targetNamespacehttp://www.activiti.org/testm1783389563673 typeLanguagehttp://www.w3.org/2001/XMLSchema !-- ... existing code ... --启动流程针对该流程启动一个流程表示发起一个新的出差申请单这就相当于java类与java对象的关系类定义好后需要 new创建一个对象使用当然可以 new多个对象。对于请出差申请流程张三发起一个出差申请单需要启动一个流程实例出差申请单发起一个出差单也需要启动一个流程实例。/** * 启动流程实例 */ 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 和 任务负责人 查询任务 ListTask 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()); } }流程实例id25001 任务id25005 任务负责人zhangsan 任务名称创建出差申请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 内容 创建申请taskid25005 当前办理人zhangsan执行完成任务completTask()之后创建进入了 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-- 正在运行任务表增加了 经理审批 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)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()返回的值选取一条进行操作/** * 完成任务 */ 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经理jackrose 完成后工作流已经结束activiti.act_hi_actinst表内已经有结束标识了EndEvent标签