写在前面

实际场景中,在发起流程或者是提交自己的任务时,一般都会给出一组用户列表,供选择下一步骤的办理人,这个时候就需要进行任务的动态分配,本文我们来分析如何实现这个功能。

1:占位符方式

在activiti中支持${xxx}占位符的方式来设置办理人,只需要在设计流程时将办理人按照占位符的方式来指定,在运行期,通过 变量
来动态设置。

1.1:流程图

  • 效果

其中指定用户任务节点是设置的指定用户admin,变量任务节点设置的是占位符方式的任务执行人${user}

  • xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"><process id="assignUser111" name="个人任务分配111" isExecutable="true"><startEvent id="startevent1" name="Start"></startEvent><endEvent id="endevent1" name="End"></endEvent><userTask id="usertask1" name="指定用户" activiti:assignee="admin"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete></extensionElements></userTask><userTask id="usertask2" name="变量" activiti:assignee="${user}"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete></extensionElements></userTask><sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow><sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow><sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_assignUser"><bpmndi:BPMNPlane bpmnElement="assignUser" id="BPMNPlane_assignUser"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="41.0" width="35.0" x="236.0" y="20.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="236.0" y="390.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><omgdc:Bounds height="55.0" width="105.0" x="201.0" y="130.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"><omgdc:Bounds height="55.0" width="105.0" x="201.0" y="250.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="253.0" y="61.0"></omgdi:waypoint><omgdi:waypoint x="253.0" y="130.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="253.0" y="185.0"></omgdi:waypoint><omgdi:waypoint x="253.0" y="250.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"><omgdi:waypoint x="253.0" y="305.0"></omgdi:waypoint><omgdi:waypoint x="253.0" y="390.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

1.2:测试

  • 部署
/*** 部署流程定义*/
@Test
public void deploy() {/*Deployment deployment = repositoryService.createDeployment() // 创建部署.addClasspathResource("com/jh/activiti/assignUser.bpmn20.xml") // 加载流程资源文件.name("AssignUserProcessTest_3流程") // 流程名称.deploy(); // 部署System.out.println("流程部署ID:" + deployment.getId());System.out.println("流程部署Name:" + deployment.getName());*/Deployment deployment = repositoryService.createDeployment() // 创建部署.addClasspathResource("com/jh/activiti/assignUser1.bpmn20.xml") // 加载流程资源文件.name("csdn测试动态指定任务办理人111") // 流程名称.deploy(); // 部署System.out.println("流程部署ID:" + deployment.getId());System.out.println("流程部署Name:" + deployment.getName());
}

  • 启动流程实例
/*** 启动流程实例*/
@Test
public void start() {ProcessInstance pi = runtimeService.startProcessInstanceByKey("assignUser111"); // 流程定义表的KEY字段值System.out.println("流程实例ID:" + pi.getId());System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
}

  • 完成任务并指定变量任务节点办理人
/*** 完成任务2*/
// 完成任务并制定下一个节点的办理人
@Test
public void completeTask2() {Map<String, Object> variables = new HashMap<String, Object>();variables.put("user", "李二");// 完成任务,并指定下一个节点的处理人是李二(上一个办理人动态选择下一个节点办理人的场景)taskService.complete("772507", variables);
}

2:setAssignee动态设置

通过TaskService的setAssignee方法来动态设置办理人。

2.1:流程图

  • 效果

其中动态设置办理人任务节点是设置的指定用户this is not assignee,需要替换为真实用户。

  • xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"><process id="csdnTaskServiceSetAssignee" name="csdnTaskServiceSetAssignee" isExecutable="true"><startEvent id="startevent1" name="Start"></startEvent><userTask id="usertask1" name="动态设置办理人" activiti:assignee="this is not assignee"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete></extensionElements></userTask><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow3" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow><sequenceFlow id="flow4" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_csdnTaskServiceSetAssignee"><bpmndi:BPMNPlane bpmnElement="csdnTaskServiceSetAssignee" id="BPMNPlane_csdnTaskServiceSetAssignee"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="35.0" width="35.0" x="130.0" y="250.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><omgdc:Bounds height="55.0" width="105.0" x="360.0" y="240.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="660.0" y="250.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"><omgdi:waypoint x="165.0" y="267.0"></omgdi:waypoint><omgdi:waypoint x="360.0" y="267.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"><omgdi:waypoint x="465.0" y="267.0"></omgdi:waypoint><omgdi:waypoint x="660.0" y="267.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

2.2:测试

  • 部署
/*** 部署流程定义*/
@Test
public void deploy() {/*Deployment deployment = repositoryService.createDeployment() // 创建部署.addClasspathResource("com/jh/activiti/assignUser.bpmn20.xml") // 加载流程资源文件.name("AssignUserProcessTest_3流程") // 流程名称.deploy(); // 部署System.out.println("流程部署ID:" + deployment.getId());System.out.println("流程部署Name:" + deployment.getName());*//*Deployment deployment = repositoryService.createDeployment() // 创建部署.addClasspathResource("com/jh/activiti/assignUser1.bpmn20.xml") // 加载流程资源文件.name("csdn测试动态指定任务办理人111") // 流程名称.deploy(); // 部署System.out.println("流程部署ID:" + deployment.getId());System.out.println("流程部署Name:" + deployment.getName());*/Deployment deployment = repositoryService.createDeployment() // 创建部署.addClasspathResource("com/jh/activiti/TaskService_setAssign.bpmn20.xml") // 加载流程资源文件.name("csdn通过TaskService的setAssignee方法设置办理人") // 流程名称.deploy(); // 部署System.out.println("流程部署ID:" + deployment.getId());System.out.println("流程部署Name:" + deployment.getName());
}

  • 启动流程实例
/*** 启动流程实例*/
@Test
public void start() {ProcessInstance pi = runtimeService.startProcessInstanceByKey("csdnTaskServiceSetAssignee"); // 流程定义表的KEY字段值System.out.println("流程实例ID:" + pi.getId());System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
}

  • 获取任务并设置办理人
 /*** 查看任务 csdnTaskServiceSetAssignee*/
@Test
public void queryTaskAndSetAssing() {/*List<Task> taskList = taskService.createTaskQuery() // 创建任务查询.taskAssignee("zhangsan") // 指定某个人.list();for (Task task : taskList) {System.out.println("任务ID:" + task.getId());System.out.println("任务名称:" + task.getName());System.out.println("任务创建时间:" + task.getCreateTime());System.out.println("任务委派人:" + task.getAssignee());System.out.println("流程实例ID:" + task.getProcessInstanceId());}*/// 根据实例id获取任务Task task = taskService.createTaskQuery().processInstanceId("790002").singleResult();taskService.setAssignee(task.getId(), "蒙娜丽莎");
}

执行后:

参考文章

【弄nèng - Activiti6】Activiti6入门篇(四)—— 任务分配

activiti学习之任务分配相关推荐

  1. Activiti 学习笔记记录(2016-8-31)

    上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件 转载于:https://ww ...

  2. 工作流引擎Activiti 学习(表 分类)

    因为工作的需要 需要学习Activiti 学习资料: https://www.activiti.org/userguide/ Database table names explained The da ...

  3. activiti 学习由浅入深

    activiti 学习由浅入深01:http://www.loveweir.com/archives/35 博客持续更新中,敬请关注. 转载于:https://www.cnblogs.com/weir ...

  4. activiti学习(二十一)——流程虚拟机源码分析(三)——从进入到离开userTask

    前言 承接上文<activiti学习(二十)--流程虚拟机源码分析(二)--从开始节点离开到下个节点前>,假设execution接下来进入的节点是userTask,本文分析一下进入user ...

  5. Activiti学习(4)简单的请假流程

    在前一篇文章的基础上,编写一个稍微复杂的请假流程,进一步熟悉Activiti的基本知识,并期望能够触类旁通,解决上一篇博文中没有解决的问题.实现过程中,参考了以下文章,在此向作者表示感谢. 1.act ...

  6. Activiti学习(二)数据表结构

    Activiti工作流引擎数据库表结构 数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. l        ...

  7. Activiti学习(一)之工作流的介绍和使用

    什么是工作流 1. 工作流介绍 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则自动进行传递文档.信息或任务的过程, ...

  8. 史上最全的工作流引擎 Activiti 学习教程(值得收藏)

    点击关注公众号,实用技术文章及时了解 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则 ...

  9. Activiti学习(一)

    经过一番调研后,发现一只闲鹿的若依+activiti比较适合项目,于是决定花点时间学习一下 1.跟着这个网址走一遍,http://doc.xianlutech.com/,这个手册的快速开始部分,将代码 ...

最新文章

  1. 在.net中使用GDI+来提高gif图片的保存画质
  2. Mysql5.6主从复制-基于binlog
  3. ctrl选中多个_PS快捷键/Ctrl/Alt/Shift
  4. 使用eclipse生成javadoc的方法
  5. IE6 浮动层背景不显示
  6. 64位win7中使用vs2013为python3.4安装pycrypto-2.6.1插件报Unable to find vcvarsall.bat异常解决方式...
  7. SVN 签出源码 Struts Spring Hibernate
  8. sqlite java blob_【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例
  9. 产品经理的职责(转)
  10. 惠而浦扫地机器人充不进电_【今日关注】惠而浦扫地机器人怎么样?体验2个月之肺腑之言? | 智能扫地机器人评测...
  11. c/c++开发技巧_常用do_while
  12. 计算机第四次评估报告,建议置顶,天天那么多问计算机的。看看第四轮评估的结果。...
  13. MPC(模型预测控制)控制小车沿轨迹移动——C++实现
  14. Wechat + unbuntu
  15. DateTrack功能介绍-如何删除终止日期?
  16. C/C++字符串函数strtok()详解
  17. Andoird conflicts with another tag that has the same ID
  18. javaWeb项目设置error页面
  19. 环保用电监管云平台可行性研究及解决方案-安科瑞 周莉娜
  20. 基于激光雷达slam的无人车室内导航比较分析

热门文章

  1. AI智能化测试——各大厂质量保障实践分享汇总(上)
  2. Vxe Table/Grid 单元格分组合并
  3. ecplise使用及配置
  4. 【cocos2d-x 仙凡奇缘-网游研发(1) 登录注册】
  5. 对接支付宝支付,沙箱环境提示:支付存在钓鱼风险!防钓鱼网站的方法
  6. 还在用书签栏?太low了,Python能为网站添加快捷方式!
  7. 大小写换算(大小写转换是哪个键)
  8. JavaScript 进阶面向对象ES6
  9. * 企业战略经营领域分析
  10. 蒙哥马利模乘算法python实现