一、我的申请 (包括已经完成审批的和正在审批的)
思路:
1.现根据USER_ID查询历史流程实例
2.遍历所有实例,获取实例的任务节点列表,并且以时间排序
3.判断当前节点是否通过,若存在DeleteReason,表示被驳回
注意:一个流程实例包含多个任务节点,是一对多。遍历一个流程实例,只能查到已通过的节点和正在审批的节点,因为后续节点不一定知道是谁审批。
二、我的处理
思路:
1.通过taskService,传入assignee查询到我的待办任务
2.根据任务查询对应的历史流程实例列表
3.遍历流程实例,获取各个任务信息
三、我的待办
思路:
1.通过taskService,传入assignee查询到我的待办任务
2.根据任务查询对应的历史流程实例列表
3.遍历流程实例,获取各个任务信息
拿到流程实例后就是遍历实例获取各个任务阶段的信息,因此可以把此操作封装一下,提高代码复用性
先封装了两个实体类
@Data
public class ProcIns {
//发起人
private String starter;
//申请原因
private String reason;
//开启流程的时间
private LocalDateTime procCreateTime;
//流程实例结束时间
private LocalDateTime procEndTime;
//实例id
private String proInsId;
//申请原因
private String procStatus;
private List<TaskInfo> tasks;
}
@Data
public class TaskInfo {
//审核人
private String userName;
//任务状态
private String taskStatus;
//审核意见
private String message;
//审批时间
private LocalDateTime taskTime;
//taskId
private String taskId;
}
/**
* 案例:我的申请(包含已完成审批的和正在审批的)
* 思路:
* 1.现根据USER_ID查询流程实例
* 2.遍历所有实例,获取实例的任务节点列表,并且以时间排序
* 3.判断当前节点是否通过,若存在DeleteReason,表示被驳回,若当前节点不存在删除原因,则查询审批意见
*/
@GetMapping("/mySubmit")
Result mySubmit(String userId,Integer page,Integer pageSize) {
//查询发起人1的任务
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery()
.startedBy(userId)
.orderByProcessInstanceStartTime().asc()
.listPage((page-1)*pageSize,pageSize);
ArrayList<ProcIns> procIns = handleProcInsList(list);
return Result.success(procIns);
}
/**
* 我的待办
* 1.通过taskService,传入assignee查询到我的待办任务
* 2.根据任务查询对应的历史流程实例列表
* 3.遍历流程实例,获取各个任务信息
*/
@GetMapping("/myTodo")
Result myTodo(String userId,Integer page,Integer pageSize) {
List<Task> tasks = taskService.createTaskQuery().taskAssignee(userId).orderByTaskCreateTime().asc()
.listPage((page - 1) * pageSize, pageSize);
List<HistoricProcessInstance> processInstances = new ArrayList<>();
tasks.forEach(task -> {
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
processInstances.add(historicProcessInstance);
});
ArrayList<ProcIns> procIns = handleProcInsList(processInstances);
return Result.success(procIns);
}
/**
* 我的处理
* 1.通过taskService,传入assignee查询到我的待办任务
* 2.根据任务查询对应的历史流程实例列表
* 3.遍历流程实例,获取各个任务信息
*/
@GetMapping("/myHandle")
Result myHandle(String userId,Integer page,Integer pageSize) {
List<HistoricTaskInstance> hisTaskInsList = historyService.createHistoricTaskInstanceQuery()
.finished()
.taskAssignee(userId)
.orderByTaskCreateTime().asc()
.listPage((page - 1) * pageSize, pageSize);
List<HistoricProcessInstance> processInstances = new ArrayList<>();
hisTaskInsList.forEach(task -> {
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
processInstances.add(historicProcessInstance);
});
ArrayList<ProcIns> procIns = handleProcInsList(processInstances);
return Result.success(procIns);
}
//遍历流程实例,获取任务信息
public ArrayList<ProcIns> handleProcInsList(List<HistoricProcessInstance> list){
ArrayList<ProcIns> procList = new ArrayList<>();
list.forEach(procIns -> {
ProcIns proc = new ProcIns();
proc.setStarter(proc.getStarter());
proc.setProInsId(procIns.getId());
//查询申请原因 全局变量reason
HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(procIns.getId()).variableName("reason").singleResult();
if(variableInstance!=null){
proc.setReason(variableInstance.getValue().toString());
}
proc.setProcCreateTime(LocalDateTime.ofInstant(procIns.getStartTime().toInstant(),ZoneId.systemDefault()));
if(procIns.getEndTime()!=null){
//整个流程已经结束
proc.setProcEndTime(LocalDateTime.ofInstant(procIns.getEndTime().toInstant(),ZoneId.systemDefault()));
proc.setProcStatus("流程已结束");
}else {
//流程还没结束
proc.setProcStatus("处理中...");
}
//根据流程实例ID查询实例的具体信息(先获得节点列表),注意先后排序
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().processInstanceId(procIns.getId()).orderByTaskCreateTime().asc().list();
ArrayList<TaskInfo> taskList = new ArrayList<>();
tasks.forEach(hisTask -> {
TaskInfo taskInfo = new TaskInfo();
taskInfo.setUserName("审核人:" + hisTask.getAssignee());
taskInfo.setTaskId("任务ID:" + hisTask.getId());
//判断当前节点是否已经审批
if (hisTask.getEndTime() == null) {
//说明未审批
taskInfo.setTaskStatus("任务状态:未审批");
//后续节点是查不到的(hisTask中只包含 已经处理的节点 和 正在处理的节点,不含没处理的节点)
} else {
//当前节点已审批
taskInfo.setTaskStatus("任务状态:已审批");
taskInfo.setTaskId("任务ID:" + hisTask.getId());
taskInfo.setUserName("审批人:" + hisTask.getAssignee());
//Date-->LocalDateTime
taskInfo.setTaskTime(LocalDateTime.ofInstant(hisTask.getEndTime().toInstant(), ZoneId.systemDefault()));
//如果当前节点拒绝原因为空,则查询审批意见
if (StrUtil.isEmpty(hisTask.getDeleteReason())) {
List<Comment> taskComments = taskService.getTaskComments(hisTask.getId());
taskComments.forEach(comment -> {
//taskInfo.setStatus("任务状态:通过");
taskInfo.setMessage("审核信息:" + comment.getFullMessage());
});
} else {
//驳回节点
taskInfo.setTaskStatus("任务状态:驳回");
taskInfo.setUserName("驳回节点:" + hisTask.getAssignee());
taskInfo.setMessage("驳回原因:" + hisTask.getDeleteReason());
}
}
taskList.add(taskInfo);
});
proc.setTasks(taskList);
procList.add(proc);
});
procList.forEach(procIns -> {
System.out.println(procIns);
System.out.println(" ");
});
return procList;
}