任务分配
1.固定分配
在指派用户任务
的审批人时。我们是直接指派的固定账号。但是为了保证流程设计审批的灵活性。我们需要各种不同的分配方式,所以这节我们就详细的来介绍先在Camunda中我们可以使用的相关的分配方式
固定分配就是我们前面介绍的,在绘制流程图或者直接在流程文件中通过Assignee来指定的方式.
这种方式就非常简单。不再过多赘述。
2.值表达式
值表达式 Value expression: 解析为一个值。默认情况下,所有流程变量都可以使用。(若使用Spring)所有的Spring bean也可以用在表达式里。例如:
代码语言:javascript复制${myVar}
${myBean.myProperty}
然后可以演示下这个案例,先部署该流程。
代码语言:javascript复制 /**
* 完成流程的部署操作
*/
@Test
public void deploy(){
Deployment deploy = repositoryService.createDeployment()
.name("请假流程")
.addClasspathResource("flow/1-01-任务分配.bpmn")
.deploy();
System.out.println("deploy.getId() = " deploy.getId());
}
然后在启动流程实例。启动流程实例后会进入到人事审批
这个节点,有值表达式
的存在,我们需要在启动的过程中就给其赋值。
绑定流程变量的操作
代码语言:javascript复制 /**
* 启动流程实例
*/
@Test
public void startFlow(){
String processInstanceId = "Process_0uiy3j1:1:712d273a-31f0-11ed-9e27-c03c59ad2248";
// 定义一个Map集合,存储相关的流程变量信息
Map<String,Object> map = new HashMap<>();
map.put("user1","demo");
// 通过 RuntimeService 启动一个流程实例,同时绑定了对应的流程变量信息
runtimeService.startProcessInstanceById(processInstanceId,map);
}
通过后台查看数据我们可以发现act_ru_task
中有了一条人事审批
的任务,而且对于的审批人就是demo
也就是我们给对应的流程变量的赋值
而对应的流程变量信息存储在act_ru_variable
中。
3.方法表达式
方法表达式 Method expression: 调用一个方法,可以带或不带参数。**当调用不带参数的方法时,要确保在方法名后添加空括号(以避免与值表达式混淆)。**传递的参数可以是字面值(literal value),也可以是表达式,它们会被自动解析。例如: boge3306
代码语言:javascript复制${printer.print()}
${myBean.getAssignee()}
${myBean.addNewOrder('orderName')}
${myBean.doSomething(myVar, execution)}
myBean是Spring容器中的个Bean对象,表示调用的是bean的addNewOrder方法.我们通过案例来演示下。我们先定义对应的Service
代码语言:javascript复制@Service
public class MyBean {
public String getAssignee(){
System.out.println("getAssignee 方法执行了....");
return "demo";
}
}
然后我们在对应的流程图中来定义。
然后通过部署启动操作来看看。
通过这块的演示,我们就可以基于我们的外部条件来结合我们的逻辑实现动态的来指定对应的处理人。
4.监听器配置
可以使用监听器来完成很多Camunda的流程业务。我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee。创建自定义监听器:
代码语言:javascript复制/**
* 自定义的一个 Task 监听器
* 我们需要在监听器中完成 处理人的动态指派
*/
public class MyFirstTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("MyFirstTaskListener --- > 执行了");
// 针对 是创建Task节点的事件
if(EVENTNAME_CREATE.equals(delegateTask.getEventName())){
// 指派对应的处理人
delegateTask.setAssignee("demo");
}
}
}
然后在流程图中绑定对应的监听器
然后我们部署和启动流程后,可以看到对应的触发效果
表结构中也可以看到相关的信息
说明这块的处理是完全可行的。