系列文章目录
第一章 springboot+Activiti7整合实践 (一)
第二章 springboot+Activiti7整合实践 (二) 模型定义
第三章 springboot+Activiti7整合实践 (三) 流程定义
第四章 springboot+Activiti7整合实践 (四) 分配规则
第五章 springboot+Activiti7整合实践 (五) 发布流程
第六章 springboot+Activiti7整合实践 (六) 启动流程(1)
第七章 springboot+Activiti7整合实践 (七) 自定义用户任务行为
前言
流程启动后,工作流就开始了工作,进入到开始节点连线指向的第一个节点,待办任务的功能是工作流必不可少的一环,本章节主要分享当前登录用户的待办任务查询、完成任务节点。
一、代办任务查询
String loginName = JwtUtil.getLoginName();
String userId = JwtUtil.getUserId();
if (page != null && page > 0 && size != null && size > 0) {
PageHelper.startPage(page, size);
}
SysUserInfoDto sysUserInfoDto =sysUserExtService.getUserExtByLoginName(loginName);
List<SysRole> roleList = sysUserInfoDto.getRoles();
List<Task> taskList= taskService
.createTaskQuery()
.taskCandidateOrAssigned(userId)
//.taskAssignee(userId)
//.taskCandidateGroupIn(groupList)
.orderByTaskCreateTime().desc()
.list();
这里使用到TaskService服务类对象,根据当前登录用户的id,调用taskCandidateOrAssigned(userId)方法,筛选待办任务,这里还有很多方法,如注释中的taskAssignee(userId)、.taskCandidateGroupIn(groupList) 分别对应,指定用户、指定组(一般对标部门或角色),因为我们上一张,讲分配规则的用户id都设置到了下图的candidateUsers中,所以我们这里查询任务使用的上图的taskCandidateOrAssigned(userId)。
二、完成任务
/**
* 完成任务方法
* */
public Task completeTaskByVariables(String taskId,String userId,Map<String, Object> variables){
if(variables == null){
variables = new HashMap<>();
}
Task curTask = taskService
.createTaskQuery().taskId(taskId).singleResult();
if (curTask.getAssignee() == null) {
taskService.claim(taskId,userId);
}
//清楚回退产生的流程数据
Object object = taskService.getVariable(taskId, ActivitiConstist.SP_PASS);
if(object!=null && StringUtils.isNotEmpty(object.toString())){
taskService.removeVariable(taskId,ActivitiConstist.SP_PASS);
}
Object object2 = taskService.getVariable(taskId,ActivitiConstist.HQ_PASS);
if(object2!=null && StringUtils.isNotEmpty(object2.toString())){
taskService.removeVariable(taskId,ActivitiConstist.HQ_PASS);
}
UserTask nextUserTask = getNextFlowElementUser(curTask);
if(nextUserTask !=null){
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = nextUserTask.getLoopCharacteristics();
if(multiInstanceLoopCharacteristics!=null){
//多实例
List<WorkTaskAssignRule> workTaskAssignRuleList = workTaskAssignRuleService.getTaskAssignRuleListByProcessDefinitionId(curTask.getProcessDefinitionId(),nextUserTask.getId());
WorkTaskAssignRule workTaskAssignRule = workTaskAssignRuleList.get(0);
Set<String> userIdSet = workTaskAssignRuleService.getUserSetByTaskRule(workTaskAssignRule);
variables.put("coll_userList",userIdSet);
variables.put("num",userIdSet.size());
}else{
}
}
if(variables.size()>0){
taskService.complete(curTask.getId(),variables);
}else{
taskService.complete(curTask.getId());
}
return curTask;
}
完成任务的核心方式是complete(),必填的参数是当前任务的id,可选的参数是任务流程参数,如果任务流程中使用uel表达式定义了某个变量,如${day>3},那么在流程流转到这个节点时,就要设置day的值,否则流程就无法进行。
任务完成之后,就会根据流程定义的箭头,流向下一个节点。
总结
工作流学习内容其实就是api的使用,学会这些api的使用,基本就能完成简单的工作流流程,但如果从用户角度出发,工作流流程各个节点的流程信息、项目信息、业务表单的展示这些问题,还需要再仔细梳理,也是我正在进行的内容,希望不久能所突破。