前言
- activity提供有用户与用户组关联的权限,但是如果使用它,需要我们同步业务系统与工作流系统的数据,这样就使得系统变得复杂,维护成本增大。
- 不用activity提供的用户权限,通过设置参数,把审核人、用户、组等组合过滤条件,对用户权限进行控制。
一、待办任务查询
1、根据办理人、候选人、候选组条件过滤
2、根据流程定义key、流程实例id等过滤
3、根据参数过滤
具体详细讲解,在代码备注中:
// 1、根据办理人、候选人、候选组条件过滤
TaskQuery taskQuery = taskService.createTaskQuery()
.taskCandidateOrAssigned(input.getCandidateUser())
.taskCandidateGroupIn(input.getCandidateGroups())//支持多个角色
.includeProcessVariables().active()
.orderByTaskCreateTime();
// 2、根据流程定义key、id等过滤
taskQuery.processInstanceId("procInsId");
// 3、根据参数过滤
taskQuery.processVariableValueEquals(参数名, "参数值");
// 附加排序条件
taskQuery = input.getIsOrderByDesc() ? taskQuery.desc() : taskQuery.asc();
二、办理人、候选人、候选组
说明:
通过对待办任务组合查询,activity提供的过滤条件为:
1、优先判断办理人(审核人)assignee是否存在值,存在则按assignee过滤待办任务
2、再判断候选用户:candidateUsers、候选用户组:candidateGroups
备注:所谓的候选,就是还未确认该任务是谁,进入候选的都有可能领到任务,所以有个签领过程;候选人或候选者,签领后就确认审核人,在代码里,其实就是给assignee赋值。
java代码如下:
// 如果你明确只有审核人,可以直接添加审核人即可:.taskAssignee(“审核人”)
taskQuery = taskService.createTaskQuery()
.taskCandidateOrAssigned(input.getCandidateUser())
.taskCandidateGroupIn(input.getCandidateGroups())//支持多个角色
.includeProcessVariables().active();
条件过滤的部分SQL如下:
(RES.ASSIGNEE_ = 'linShi'
or (RES.ASSIGNEE_ is null and I.TYPE_ = 'candidate'
and (I.USER_ID_ = 'user1' or I.GROUP_ID_ IN ( 'groupId1' ) )
1.办理人:assignee
办理人只能指定一个人,赋值有两种方式:
代码如下(示例):
// 1、通过待办任务节点服务赋值(不需要签领)
taskService.setAssignee(taskId, assignee);
// 2、通过签领进行赋值(存在候选人或候选组时,审核节点时需要签领)
taskService.claim(taskId, assignee);
对应的数据库中会在表ACT_RU_TASK会产生数据,Assignee_字段就是设置的办理人
2.候选人:candidateUsers
使用activiti:candiateUsers=”用户 1,用户 2,用户 3”的这种方式来实现设置一组候选人。
一般情况下,我们不是写死用户,而是通过参数来赋值:创建节点时,设置参数${“candidateUsers”},然后通过参数candidateUsers进行赋值。
代码如下(示例):
// userId1必须是候选人中的一个,即所有候选人都能看到即将办理的任务
Task task = taskService.createTaskQuery().taskCandidateUser(userId1).singleResult();
//某个候选人签收
taskService.claim(task.getId(), userId1);
//userId1签领后,其他候选人看不到该任务
task2 = taskService.createTaskQuery().taskCandidateUser(userId2).singleResult();
assertNull(“找不到任务”+task2);
备注:某个候选人签收后,其他候选人就看不到该任务
3.候选组:candidateGroups
可以使用activiti:candidateGroups=”用户组1,用户组2,用户组3”的这种方式来实现设置一组候选人。
候选组,这个就是这只办理角色或者办理岗位,适合使用在办理人比较多的情况下,而且涉及到几个部门的情形。
代码如下(示例):
// groups1必须是候选组中的一个
Task task = taskService.createTaskQuery().taskCandidateGroups(groups1).singleResult();
//某个候选人签收
taskService.claim(task.getId(), userId1);
备注:某个候选组签收后,只有签领得人才能看到该任务
如果你对工作流感兴趣,想了解更多,请点击
Java工作流管理系统(activity6.0)