Flowable-9.节点系列
...大约 3 分钟BPMFlowable
Flowable框架学习笔记-09-节点系列
节点说明
接收任务节点
流程定义
节点测试
启动实例:
ACT_RU_EXECUTION:新增两条记录(流程实例、执行实例)
ACT_RU_TASK:无数据
@RequestMapping("/startFlow")
public AjaxResult startFlow() {
// 启动任务实例,并存储临时变量
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("receiveTask");
return AjaxResultUtil.success("流程启动成功:"
+ processInstance.getProcessInstanceId());
}
根据活动id查询执行实例:启动activityId为第一条receiveTask分支id
<startEvent id="startEvent1" name="开始" flowable:formFieldValidation="true"></startEvent>
<receiveTask id="sid-745D35A2-68E5-4890-A7A5-714AE19BAE8D" name="获取当日销售额"></receiveTask>
.......
### 其他节点定义 ###
SELECT DISTINCT
RES.*,
P .KEY_ AS ProcessDefinitionKey,
P .ID_ AS ProcessDefinitionId
FROM
ACT_RU_EXECUTION RES
INNER JOIN ACT_RE_PROCDEF P ON RES.PROC_DEF_ID_ = P .ID_
ORDER BY
RES.ID_ ASC
/**
* 根据活动id(activityId)获取相应的执行实例
*/
@RequestMapping("/getExecution")
public void getExecution(String activityId) {
Execution execution = runtimeService.createExecutionQuery()
.activityId(activityId).singleResult();
System.out.println(execution);
}
接收任务实例不会出现在ACT_RU_TASK表中,观察执行实例表数据变化情况
完成接收任务:触发需要的参数是执行实例的ID而不是流程实例的ID
/** 触发执行实例继续往下运转 **/
@RequestMapping("/trigger")
public void trigger(String executionId) {
runtimeService.trigger(executionId);
}
如果传入‘流程实例ID’则报错,参考信息如下
如果传入'执行实例ID',流程正常触发,观察相应实例状态变更,可以观察相应执行实例的ACT_ID_
此时再次通过第1个receiveTask的id查找相应的流程实例发现数据不存在,是因为该执行实例已完成触发进入到下一个流程;通过第2个receiveTask的id查找则存在数据。以此类推,再次触发则整个流程结束,流程实例和执行实例也被清理掉,从历史记录相关表中能查看相应的记录
用户任务
个人任务:确切指定了办理者的任务,这个任务将成为指定者的私有任务(个人任务)
组任务:无法指定具体的某一人来办理的任务,可以将任务分配给几个人或者一到多个小组,这个范围内的用户可以选择性办理这类任务(组任务)
【1】TaskService任务服务类
【2】个人任务
普通方式实现
任务定义
直接指定assignee属性对应为指定节点处理人
部署流程、启动任务
@RequestMapping("/startFlow")
public AjaxResult startFlow() {
ProcessInstance processInstance =
runtimeService.startProcessInstanceByKey("singleTask");
return AjaxResultUtil.success("流程启动成功:"
+ processInstance.getProcessInstanceId());
}
查询个人任务:查询指定userId对应的待办任务
@RequestMapping("/getTask")
public void getTask(String userId,String defKey) {
List<Task> list = taskService.createTaskQuery()
.taskAssignee(userId)
.processDefinitionKey(defKey)
.list();
for(Task t : list){
System.out.println(t.getId()+" "+t.getName()+" "+t.getTaskDefinitionKey());
}
}
完成任务:
@RequestMapping("/completeTask")
public void completeTask(String taskId) {
taskService.complete(taskId);
}
使用流程变量分配处理人
流程定义
${userId}、#
在任务节点中指定处理人,选择为固定值
,随后指定分配对象(动态变量)
对比普通方式的流程定义
流程变量方式指定处理人的流程定义
部署流程、启动流程
@RequestMapping("/startFlow")
public AjaxResult startFlow() {
// 启动任务实例,并存储临时变量
Map<String,Object> map = new HashMap<>();
map.put("userId","common_user");
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("singleTask",map);
return AjaxResultUtil.success("流程启动成功:" + processInstance.getProcessInstanceId());
}
使用类分配处理人
流程定义
清理指定分配处理人,创建TaskListener(任务监听器)
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="User Task">
<extensionElements>
<activiti:taskListener event="create"
class="com.activiti.study.personalTask.TaskListenerImpl">
</activiti:taskListener>
</extensionElements>
package com.activiti.study.personalTask;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TaskListenerImpl implements TaskListener {
private static final long serialVersionUID = 1331752911978130983L;
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("David");
}
}
部署流程、启动流程
@Test
public void testStartProcessDefination(){
String processDefinationKey = "personalTask3";
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinationKey);
System.out.println("Key--->>>" + pi.getBusinessKey());
System.out.println("ActivityId--->>>" + pi.getActivityId());
System.out.println("DefinitionId--->>>" + pi.getProcessDefinitionId());
System.out.println("ProcessInstanceId--->>>" + pi.getProcessInstanceId());
}
【3】组任务
Powered by Waline v3.1.3