Activiti6.0整合SpringBoot2.0学习(二)

一、动态设置任务节点处理人(单人)

上一章节讲到使用 ${user} 即可实现任务节点受理人的动态设置,需要注意的是这个受理人需要在前一个节点设置好,不然运行的时候会报错。例如,我们在启动流程的时候就设置下一个任务节点的受理人,如下图所示:


流程图

任务节点配置
@RequestMapping("singleAssignee")  
public void setSingleAssignee() {  
    //根据bpmn文件部署流程  
    repositoryService.createDeployment().addClasspathResource("singleAssignee.bpmn").deploy();
    // 设置User Task1受理人变量
    Map<String, Object> variables = new HashMap<>();
    variables.put("user1", "007");
    //采用key来启动流程定义并设置流程变量,返回流程实例  
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("singleAssignee", variables);  
    String processId = pi.getId();  
    System.out.println("流程创建成功,当前流程实例ID:"+processId);
    // 注意 这里需要拿007来查询,key-value需要拿value来获取任务
    List<Task> list = taskService.createTaskQuery().taskAssignee("007").list();
    if(list!=null && list.size()>0){ 
        for(org.activiti.engine.task.Task task:list){  
             System.out.println("任务ID:"+task.getId());  
             System.out.println("任务的办理人:"+task.getAssignee());  
             System.out.println("任务名称:"+task.getName());  
             System.out.println("任务的创建时间:"+task.getCreateTime());  
             System.out.println("流程实例ID:"+task.getProcessInstanceId());        
             System.out.println("##################################");
            }
        }
    // 设置User Task2的受理人变量
    Map<String, Object> variables1 = new HashMap<>();
    variables1.put("user2", "Kevin");
    // 因为007只有一个代办的任务,直接完成任务,并赋值下一个节点的受理人user2为Kevin办理
    taskService.complete(list.get(0).getId(), variables1);
    System.out.println("User Task1被完成了,此时流程已流转到User Task2");
}

运行程序,浏览器访问: http://localhost:8080/activiti/singleAssignee
结果如下所示:

运行结果

二、动态设置任务节点处理人(多人)

当你的业务需要用到多个人同时处理一个任务,并且需要判断他们是否全部或者部分人处理了任务,才能跳到下一个任务节点时,就需用到此技术。

2.1 画流程图

多个处理人流程图

Main config信息

多实例属性配置

2.2 后台代码

@RequestMapping("multiAssignee")  
    public void setMultiAssignee() {    
        //根据bpmn文件部署流程  
        repositoryService.createDeployment().addClasspathResource("MultiAssignee.bpmn").deploy();
        // 设置多个处理人变量 这里设置了三个人
        Map<String, Object> variables = new HashMap<>();
        List<String> userList = new ArrayList<>();
        userList.add("user1");
        userList.add("user2");
        userList.add("user3");
        variables.put("userList", userList);
        //采用key来启动流程定义并设置流程变量,返回流程实例  
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("multiAssigneeProcess", variables);  
        String processId = pi.getId();  
        System.out.println("流程创建成功,当前流程实例ID:"+processId);
        // 查看user1的任务
        List<Task> list = taskService.createTaskQuery().taskAssignee("user1").list();
        if(list!=null && list.size()>0){ 
            for(org.activiti.engine.task.Task task:list){  
                System.out.println("任务ID:"+task.getId());  
                System.out.println("任务的办理人:"+task.getAssignee());  
                System.out.println("任务名称:"+task.getName());  
                System.out.println("任务的创建时间:"+task.getCreateTime());  
                System.out.println("流程实例ID:"+task.getProcessInstanceId());  
                System.out.println("#######################################");
            }
        }
        // 查看user2的任务
        List<Task> list2 = taskService.createTaskQuery().taskAssignee("user2").list();
        if(list2!=null && list2.size()>0){ 
            for(org.activiti.engine.task.Task task:list2){  
                System.out.println("任务ID:"+task.getId());  
                System.out.println("任务的办理人:"+task.getAssignee());  
                System.out.println("任务名称:"+task.getName());  
                System.out.println("任务的创建时间:"+task.getCreateTime());  
                System.out.println("流程实例ID:"+task.getProcessInstanceId());  
                System.out.println("#######################################");
            }
        }
        // 查看user3的任务
        List<Task> list3 = taskService.createTaskQuery().taskAssignee("user3").list();
        if(list3!=null && list3.size()>0){ 
            for(org.activiti.engine.task.Task task:list3){  
                System.out.println("任务ID:"+task.getId());  
                System.out.println("任务的办理人:"+task.getAssignee());  
                System.out.println("任务名称:"+task.getName());  
                System.out.println("任务的创建时间:"+task.getCreateTime());  
                System.out.println("流程实例ID:"+task.getProcessInstanceId());  
                System.out.println("#######################################");
            }
        }
}

运行程序,浏览器访问: http://localhost:8080/activiti/multiAssignee
结果如下所示:

执行结果

数据库的ACT_RU_TASK表的数据:
ACT_RU_TASK表数据

三、学习小结

1、实际开发的时候通常会将流程实例id(PROC_INST_ID)字段的值设置到业务表中,虽然存在冗余,但是方便业务和流程关联查找。
2、任务处理人动态设置的时候使用${user},里面的user在后台设置值的时候必须为String,否则会报错!!!
3、多人处理的时候需要设置当前节点的Multi instance的属性,一定要设置完成条件,具体配置可以参考上文图“多实例属性配置”;在设置变量时需设置的key为Collection中${userList}的userList,value为List集合!

Map<String, Object> variables = new HashMap<>();
List<String> userList = new ArrayList<>();
userList.add("user1");
userList.add("user2");
userList.add("user3");
variables.put("userList", userList);

github地址:github源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容