首先给大家看一下我的流程图:

流程文件leaveBill.bpmn

<?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="LeaveBill" name="LeaveBillProcess" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="提交申请" activiti:assignee="${inputUser}" activiti:formKey="workflowAction_audit.action"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<userTask id="usertask2" name="经纪人审批" activiti:formKey="workflowAction_audit.action">
<extensionElements>
<activiti:taskListener event="create" class="cn.itcast.ssh.utils.MangerTaskHandlerCandidateUsers"></activiti:taskListener>
</extensionElements>
</userTask>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<userTask id="usertask3" name="老总审批" activiti:assignee="王中军" activiti:formKey="workflowAction_audit.action"></userTask>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_LeaveBill">
<bpmndi:BPMNPlane bpmnElement="LeaveBill" id="BPMNPlane_LeaveBill">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="290.0" y="60.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="255.0" y="140.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="255.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="255.0" y="310.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="290.0" y="400.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="307.0" y="95.0"></omgdi:waypoint>
<omgdi:waypoint x="307.0" y="140.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="307.0" y="195.0"></omgdi:waypoint>
<omgdi:waypoint x="307.0" y="230.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="307.0" y="285.0"></omgdi:waypoint>
<omgdi:waypoint x="307.0" y="310.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="307.0" y="365.0"></omgdi:waypoint>
<omgdi:waypoint x="307.0" y="400.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

---------好了进入正题,我这个例子主要是两个地方表现了两种动态指定任务人的例子;

  一个就是提交申请,usertask1节点的动态设置办理人

  ---<userTask id="usertask1" name="提交申请" activiti:assignee="${inputUser}" activiti:formKey="workflowAction_audit.action"></userTask>

  -------- activiti:assignee="${inputUser}" 设置任务人,表达式使用类似于el表达式的写法,使用activiti:assignee节点,指定办理人。这里需要动态传入参数来指定

    -----------我程序中,在提交申请启动运行请假实例时的代码片段

        

        /**更新请假状态,启动流程实例,让启动的流程实例关联业务*/
        @Override
        public void saveStartProcess(WorkflowBean workflowBean) {
          //1:获取请假单ID,使用请假单ID,查询请假单的对象LeaveBill
          Long id = workflowBean.getId();
          LeaveBill leaveBill = leaveBillDao.findLeaveBillById(id);
          //2:更新请假单的请假状态从0变成1(初始录入-->审核中)
            leaveBill.setState(1);
          //3:使用当前对象获取到流程定义的key(对象的名称就是流程定义的key)
          String key = leaveBill.getClass().getSimpleName();
          /**
          * 4:从Session中获取当前任务的办理人,使用流程变量设置下一个任务的办理人
          * inputUser是流程变量的名称,
          * 获取的办理人是流程变量的值
          */
          Map<String, Object> variables = new HashMap<String,Object>();
         variables.put("inputUser", SessionContext.get().getName());//表示惟一用户,通过流程变量inputUser,指定当前登录让人为节点办理人
        /**
         * 5: (1)使用流程变量设置字符串(格式:LeaveBill.id的形式),通过设置,让启动的流程(流程实例)关联业务
          (2)使用正在执行对象表中的一个字段BUSINESS_KEY(Activiti提供的一个字段),让启动的流程(流程实例)关联业务
        */
        //格式:LeaveBill.id的形式(使用流程变量)
        String objId = key+"."+id;
        variables.put("objId", objId);
          //6:使用流程定义的key,启动流程实例,同时设置流程变量,同时向正在执行的执行对象表中的字段BUSINESS_KEY添加业务

          //数据, 同时让流程关联业务
        runtimeService.startProcessInstanceByKey(key,objId,variables);

      }

二、动态指定多人处理节点任务 使用了自己实现监听的方式。我想让在经纪人审核这个节点上,不止指定一个人来处理,这个节点的处理人有可能会变。

  ---bpmn文件节点明细

   <userTask id="usertask2" name="经纪人审批" activiti:formKey="workflowAction_audit.action">
    <extensionElements>
      <activiti:taskListener event="create" class="cn.itcast.ssh.utils.MangerTaskHandlerCandidateUsers"></activiti:taskListener>
    </extensionElements>
   </userTask>

  -----下面是我的实现类

  

  1. package cn.itcast.ssh.utils;
  2. import java.util.Arrays;
  3. import org.activiti.engine.delegate.DelegateTask;
  4. import org.activiti.engine.delegate.TaskListener;
  5. import cn.itcast.ssh.domain.Employee;
  6. public class MangerTaskHandlerCandidateUsers implements TaskListener {
  7. /**
  8. *
  9. */
  10. private static final long serialVersionUID = 1L;
  11. @Override
  12. public void notify(DelegateTask delegateTask) {
  13. System.out.println("进入MangerTaskHandlerCandidateUsers=========");
  14. /**从新查询当前用户,再获取当前用户对应的领导*/
  15. Employee employee = SessionContext.get();
  16. //当前用户
  17. String name = employee.getName();
  18. System.out.println("当前登录人========"+name);
  19. String[] empLoyees = {"冯小刚经纪人","范冰冰经纪人","冯小刚"};
  20. delegateTask.addCandidateUsers(Arrays.asList(empLoyees));//完成多处理人的指定
  21. System.out.println("节点任务人========冯小刚经纪人,范冰冰经纪人,冯小刚");
  22. }

}

------------以上就是动态设置多用户任务人的例子,这里我是手写的demo,实际项目中我们可以在notify(DelegateTask delegateTask)中,通过查询固定数据表或者缓存来,实现灵活的任务人设置。这是我的个人拙见啊。

再啰嗦一下,如果是设置用户组的话,这里应该是delegateTask.addCandidateGroup("某组");

设置流程变量值:delegateTask.setVariable("inputName", "小明");//inputName流程变量名

转载于:https://www.cnblogs.com/bootdo/p/10687791.html

activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式相关推荐

  1. XML转Json 设置指定节点为数组

    原XML <response><itemList><item><number>5</number></item></ite ...

  2. 动态设置根节点字体大小

    <script> function setRem(){ var ui_w=" "; //获取屏幕的宽度 var clieniwdth =document.documen ...

  3. uel表达式 字符串截取_(4)activiti工作流引擎之uel表达式

    有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购单,如何跟一个流程实例互相关联起来? 这里就需要使用到activiti启动流程实例时设置一个流程实例的busines ...

  4. Activiti 工作流入门到大神-任亮-专题视频课程

    Activiti 工作流入门到大神-16384人已学习 课程介绍         什么是流程.工作流作用.Activiti背景简介.Activiti流程设计器安装.Activity环境搭建.通过Hel ...

  5. activiti动态办理人_Activiti动态设置办理人扩展

    Activiti动态设置办理人扩展 作者:邓家海 扩展是要求对Activiti基础有一定的功底的 我们一直在努力,不是为了改变世界,只是不让世界去改变我们. 关键词:Assignee.Candidat ...

  6. activitiy学习 (动态加签,动态流程图,指定节点跳转,指定多人节点跳转)

    activitiy学习 动态加签,动态流程图,指定节点跳转,指定多人节点跳转 POM.XML 部署流程 启动流程 查询待执行任务 查询任务历史 完成任务 多人会签节点的退回指定节点 退回到指定多人会签 ...

  7. Java工作流引擎节点接收人设置“其他方式总结”系列讲解

    关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统CCBPM节点访问规则接收人规则 适配数据库: o ...

  8. activiti完成任务,设置下一节点处理人

    最近在学习activiti,记录一下怎么在完成当前节点任务时,动态设置下一节点的处理人 //获取引擎val processEngine = ProcessEngines.getDefaultProce ...

  9. activiti 工作流会签 / 多人审批时若一人通过即可

    equenceFlow  流程定义文件leave-formkey.bpmn20.xml: [html]  <?xml version="1.0" encoding=" ...

最新文章

  1. 路由器默认密码(转自ITAA)
  2. 伪造服务钓鱼工具Ghost Phisher
  3. 使用CSS3悬停效果打造不同的页面版式
  4. iPhone中的heic格式怎么查看,heic文件怎么打开
  5. [bzoj2882]工艺_后缀数组
  6. axios中POST请求变成OPTIONS处理
  7. python引入模块时import与from ... import的区别
  8. 资料分享 | R语言资料分享来袭
  9. vue3vite工程里面引入assets目录下的图片文件(一种方法)
  10. MyBatis insert操作插入,返回主键from官方
  11. CentOS查看硬件情况
  12. DMA与cache一致性的问题
  13. SQL Server2012安装教程
  14. java实现快递单信息识别
  15. 南京大学计算机实验教程,南京大学 计算机系统基础 课程实验 2018(PA2)
  16. python如何筛选数据_Python如何用filter函数筛选数据
  17. 计算机网络基础 课程设计体会,计算机网络课程设计心得体会.pdf
  18. 笔记|matplotlib 技巧|使用 gricspec 实现的不同大小子图
  19. PR curve, AP, mAP, AUC, f1-score ??
  20. python 三维地球代码_Python地图可视化三大秘密武器

热门文章

  1. 《电子基础与维修工具核心教程》——2.4 电阻的串并联
  2. 查看Linux系统架构类型的5条常用命令
  3. Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查
  4. 汽车之家购买价格PC真正的原因阿拉丁
  5. 代码编辑器Sublime Text 3 免费使用方法与简体中文汉化包下载
  6. 【图】IPAVS多媒体网络×××
  7. JVM调优:GC 参数
  8. mysql修改密码后无法启动_mysql服务无法启动与强制修改密码指南-Go语言中文社区...
  9. html 占用空间 滚动轴_滚动轴承润滑及密封,轧机轴承技术(104)
  10. K8s普通用户配置权限解决User “system:anonymous“ cannot list nodes at the cluster scope