多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
给一个任务分配负责人可以采用如下3种方式进行分配。 [TOC] # 1. 固定分配 ![](https://img.kancloud.cn/c1/8b/c18b1c7c3b34d5cc4a8b372f10bf1e57_1292x441.png) # 2. UEL表达式分配 UEL 表达式是 java EE6 规范的一部分, UEL(Unified Expression Language)即 统一表达式语言, activiti 支持两个 UEL 表达式: UEL-value 和 UEL-method。 **1. UEL-value** :-: ![](https://img.kancloud.cn/57/5b/575b5d43342f7728065cfcbe5c5723da_1212x408.png) 写法一 ![](https://img.kancloud.cn/95/73/957325f3731860b695b543c01ddf4737_1238x427.png) 写法二 **2. UEL-method** ![](https://img.kancloud.cn/50/a3/50a33917a2a762f8611809730d5f371f_1304x412.png) **3. UEL-value与UEL-method配合使用** ![](https://img.kancloud.cn/fd/67/fd67ee21dc6c3374f9bdf73785ac8302_1410x431.png) **4. 其他** 表达式支持解析基础类型、 bean、 list、 array 和 map,也可作为条件判断。 ``` ${order.price > 100 && order.price < 250} ``` <br/> 需要注意:由于使用了表达式分配,必须保证在任务执行过程表达式执行成功,比如:某个任务使用了表达式`${order.price > 100 && order.price < 250}`,当执行该任务时必须保证 order 在流程变量中存在,否则 activiti 异常。 <br/> 下面演示UEL-value的使用,其他的也是一样的道理,步骤如下: **1. 定义流程变量** ![](https://img.kancloud.cn/9e/20/9e20c3e02ba15956df1a59c0ed09ee7b_1157x172.png) **2. 设置流程变量** ```java /** * 测试 使用uel 设置负责人 */ public class TestAssigneeUel { /** * 流程部署 */ @Test public void testDeployment() { //1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RepositoryServcie RepositoryService repositoryService = processEngine.getRepositoryService(); //3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中 Deployment deploy = repositoryService.createDeployment() .name("出差申请流程") .addClasspathResource("bpmn-02/evection.bpmn") .addClasspathResource("bpmn-02/image/evection.png") .deploy(); //4、输出部署信息 System.out.println("流程部署id=" + deploy.getId()); System.out.println("流程部署名字=" + deploy.getName()); } //启动流程创建流程实例 @Test public void startAssigneeUel() { //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //设定assignee的值,用来替换uel表达式 Map<String, Object> assigneeMap = new HashMap<String, Object>(); assigneeMap.put("assignee0", "张三"); assigneeMap.put("assignee1", "李经理"); assigneeMap.put("assignee2", "王总经理"); assigneeMap.put("assignee3", "赵财务"); //启动流程实例 runtimeService.startProcessInstanceByKey("myEvection", assigneeMap); } } ``` ```sql #设置的流程变量如下 mysql> select * from act_ru_variable; +------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+ | ID_ | REV_ | TYPE_ | NAME_ | EXECUTION_ID_ | PROC_INST_ID_ | TASK_ID_ | BYTEARRAY_ID_ | DOUBLE_ | LONG_ | TEXT_ | TEXT2_ | +------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+ | 2502 | 1 | string | assignee3 | 2501 | 2501 | NULL | NULL | NULL | NULL | 赵财务 | NULL | | 2503 | 1 | string | assignee0 | 2501 | 2501 | NULL | NULL | NULL | NULL | 张三 | NULL | | 2504 | 1 | string | assignee2 | 2501 | 2501 | NULL | NULL | NULL | NULL | 王总经理 | NULL | | 2505 | 1 | string | assignee1 | 2501 | 2501 | NULL | NULL | NULL | NULL | 李经理 | NULL | +------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+ ``` # 3. 监听器分配 使用监听器的方式来指定负责人,那么在流程设计时就不需要指定assignee。 任务监听器是发生对应的任务相关事件时执行自定义 java 逻辑或表达式。 <br/> 使用监听器分配负责人的步骤如下: **1. 指定监听器属性** :-: ![](https://img.kancloud.cn/58/db/58dbf83d53243532bc0884038d25e274_410x161.png) ![](https://img.kancloud.cn/ef/bc/efbc4e9e391e2ab24a116ada37f87bbb_1195x135.png) ``` Event可选值: Create:任务创建后触发 Assignment:任务分配后触发 Delete:任务完成后触发 All:所有事件发生都触发 Type可选值: Class Expression Delegate Expression ``` 我就不用上面的图形化操作了,直接在XML中指定。 ```xml ... <userTask activiti:exclusive="true" id="_4" name="创建出差申请单"> <extensionElements> <!-- event=all,class就是指定的监听器 --> <activiti:taskListener class="com.itheima.demo.listener.MyTaskListener" event="all" /> </extensionElements> </userTask> <userTask activiti:exclusive="true" id="_5" name="总经理审批"> <extensionElements> <activiti:taskListener class="com.itheima.demo.listener.MyTaskListener" event="all" /> </extensionElements> </userTask> ... ``` **2. 定义监听器** ```java public class MyTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { //判断当前的任务 是 创建出差申请单 并且 是 create事件 if ("创建出差申请单".equals(delegateTask.getName()) && "create".equals(delegateTask.getEventName())) { delegateTask.setAssignee("张三"); } } } ``` **3. 测试** ```java public class TestListener { /** * 1. 先进行流程部署 */ @Test public void testDeployment() { //1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RepositoryServcie RepositoryService repositoryService = processEngine.getRepositoryService(); //3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中 Deployment deploy = repositoryService.createDeployment() .name("测试监听器") .addClasspathResource("bpmn/demo-listen.bpmn") .deploy(); //4、输出部署信息 System.out.println("流程部署id=" + deploy.getId()); System.out.println("流程部署名字=" + deploy.getName()); } /** * 2. 启动流程,创建流程实例 */ @Test public void startDemoListener() { //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //启动流程实例 runtimeService.startProcessInstanceByKey("testListener"); } } ``` ```sql # 创建出差申请单这个节点就会分配一个负责人为张三 mysql> select * from act_ru_task; +------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------... | ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | NAME_ | PARENT_TASK_ID_ | DESCRIPTION_ | TASK_D... +------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------... | 5005 | 1 | 5002 | 5001 | testListener:1:3 | 创建出差申请单 | NULL | NULL | _4 | NULL | 张三 | ... +------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------... ```