在这篇,小白想聊聊有关流程中使用比较频繁的用户任务,既然是用户任务,那么必不可少的需要指定任务的办理人或者候选人,然后当流程运行到该用户任务节点时,才能让指定的人审批处理;
一般用户任务的办理人,可以设置具体的办理人或者候选人 ,其设置方式有以下三种:
- 直接在流程模型中写死办理人或候选人的Id,项目中不推荐;
- 采用流程变量赋值;
- 通过委托类(TaskListener监听类)动态设置;
下面让我们从项目的角度一同介绍2和3方法的结合使用吧!
流程变量赋值
在指定流程的发起者时,可以在流程模型的开始事件节点中指定initiator=”applyUserId”,这样当申请人启动流程时,通过设置代码identityService.setAuthenticatedUserId(“用户Id”); 可以将申请人的Id保存到applyUserId流程变量中,当在流程的其他用户任务节点需要指定由申请人办理时,则可以直接用UEL表达式assignee=”#{applyUserID}”动态绑定,例如“重新提交”用户任务,需要流程的发起者办理;
identityService.setAuthenticatedUserId("用户Id");
//启动流程
ProcessInstance pi=runtimeService.startProcessInstanceById(processDefinitionId, bs.getId(), variables);
委托类动态设置
往往在执行用户任务时,我们很难知道该任务节点应该由哪个管理者去办理,所幸,一般公司都会自备一张人员信息表,其中包含了人员的管理职位Title,我们可以通过人员信息表以及用户任务名称中的“职位”关键字,在任务创建的时候委托动态绑定办理人或者候选人(当某个管理职位有多个员工时);
注:这里的taskListener不是流程变量,而是由Spring容器管理的一个Bean;
package com.hlmc.webapp.listener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.task.IdentityLink;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.hlmc.webapp.entity.BusinessStatus;
import com.hlmc.webapp.service.admin.business.BusinessStatusService;
import com.hlmc.webapp.service.admin.business.CommonWorkflowService;
import com.hlmc.webapp.service.admin.member.MemberService;
import com.hlmc.webapp.service.admin.system.UserService;
@Component("taskListener")
public class TaskListenerImp implements TaskListener {
@Autowired
private BusinessStatusService businessStatusService;
@Autowired
private CommonWorkflowService commonWorkflowService;
@Autowired
private UserService userService;
@Override
public void notify(DelegateTask delegateTask) {
//1、设置任务的分配人或候选人
List<Map> assignees=this.configAssignee(delegateTask);
//2、修改业务当前状态
BusinessStatus bs=updateBusinessStatus(delegateTask);
}
/**
**配置办理人或者候选人
**/
private List<Map> configAssignee(DelegateTask delegateTask) {
List<Map> result=new ArrayList<>();
if(delegateTask.getAssignee()==null) {
//根据用户任务名称中的职位关键字来决定应该赋予的办理人或者候选人;
result=getAssignees(delegateTask);
if(result!=null&& result.size()>0) {
if(result.size()==1) {
String assignee=(String)result.get(0).get("EMPLOYEE_NO");
delegateTask.setAssignee(assignee);
}else {
List<String> assignees=new ArrayList<>();
for(int i=0;i<result.size();i++) {
assignees.add((String)result.get(i).get("EMPLOYEE_NO"));
}
delegateTask.addCandidateUsers(assignees);
}
}
}else {
Map assignee=userService.findByUID(delegateTask.getAssignee());
result.add(assignee);
}
return result;
}
}
以上是小白在项目开发中动态绑定办理人的方法,其他方法有待考验;
(更多有关activiti的项目开发内容请等下次更新,欢迎点评,共同进步哦!)