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

关键词:Assignee、Candidate users、Candidate groups;setAssignee、taskCandidateUser、taskCandidateGroup

主要解决问题:Activiti动态给任务节点设置办理人。

情景:

我们在做工作流开发,学习的时候一般都有这么一个过程:

第一阶段:最开始学习的时候,喜欢在设计流程的时候写死人名(即)办理人,这个阶段是入门级。而且你也会觉得这样做非常 so easy(方便、简单)。可是慢慢的,你就会发现,每次需要换人,你就要重新设计流程实例(workflow processInstance),一系列的design->Deployment->start processInstance,从此你再也不觉得so easy 了。

第二阶段:于是你开始使用了EL表达式变量,这个阶段代表你已经到了提升阶段。可以使用委托类来设置办理人了,是动态的设置哦。但是,你并没有整合自己的权限系统,用的还是Activiti官方的user表和group表,慢慢的,你发现一旦自己的权限系统角色和用户做了调整,那么自己还得去维护这几个表。

第三阶段:于是,你开始整合自己的权限系统,这个阶段基本是熟练了,可以说是已经完美了。但是这个阶段,每次发送的时候,我们还需要选择一个人去办理他,但是个人觉得,要达到完美状态是不可能的,但是我们还可以自己去做扩展使得它更加的好用,达到我们逾期的目的,(个人观点)。

第四阶段:其实很多人都会去扩展功能的,源码改造,或者模块扩展。在流程部署的时候就设置好办理人,这样,每次发送的时候,我们并不需要去选择办理人。

设置办理人色几种方案

我们先回顾一下,比较传统的动态设置任务办理人的几种方法:

第一种:在流程设置死,这个感觉无需多说,就是在设计流程的时候,在Assignee里面填写我们的办理人姓名或者相关的ID即可。

第二种:通过委托类(监听类)设置。在流程设计的时候设置监听类,并且在办理人里面设置EL表达式 ${UserId}(随便自己命名)。然后每次办理的时候选择一个办理人。然后传递一个变量过去,然后下一个环节的监听类会设置办理人。

1 Map map = delegateTask.getVariables();

2

3 delegateTask.setAssignee(map.get("UserId").toString());

设置办理人可能有三种方案,

设置办理人的三种方案是有优先级的。

设置办理人优先级:

Assignee>Candidate users>Candidate groups。

设置办理人色几种模式

第一种:指定办理人模式,即设置办理人,就是设置Assignee。Assignee 受让人; 受托人,代理人; 被指定人;办理人只能指定一个人,不能使用逗号分隔。默认执行签收操作taskService.claim(taskId, currentUserId);在ACT_HI_TASKINST和ACT_RU_TASK会产生数据,这两个表里面的Assignee_字段就是设置的办理人姓名或者对象的ID

第二种:设置候选用户,候选用户设置办理人不是很多的情况下使用,而且需要签收,也就是说我们常说的抢件模式,Candidate users  候选用户,设置候选组的前提是没有指定Assignee,(即没有执行签收操作)。设置候选组需要主动签taskService.claim(taskId, currentUserId);

第三种:这只候选组,这个就是这只办理角色或者办理岗位,适合使用在办理人比较多的情况下,而且涉及到几个部门的情形。Candidate groups  候选组

候选组与候选用户类似,只是要获取候选用户,需要根据候选组找到对应的用户。

涉及API:

1 taskService.createTaskQuery().taskAssignee(param);

根据用户来查询任务(待办任务)

1 taskService.createTaskQuery().taskCandidateUser(param);

根据候选用户查询任务(待签收任务)

1 taskService.createTaskQuery().taskCandidateGroup(param);

候选组查询任务(待签收任务)

1 TaskService().setAssignee(taskId,userId);

设置办理人

1 taskService().addCandidateGroup(taskId, groupid);

这只候选组,可以添加多个,每次一个addCandidateGroup添加一个

1 taskService().addCandidateUser(taskId,userid);

这只候选用户,可以添加多个,每次一个addCandidateUser添加一个

1 taskService.claim(taskId, currentUserId);

签收操作。

扩展实现

扩展需要添加中间表,我们使用TDD(驱动开发模式)来实现。

需呀增加一个中间表。

流程办理人表(act_comm_taskassignee)

字段

名称

是否为空

备注

ID

主键ID

M

SID

节点ID

M

assignee

办理人

O

rolegroup

候选组

O

assig

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值