|
|
@ -302,6 +302,131 @@ public class FlowTaskService extends MybatisBaseService<FlowTaskMapper, FlowTask |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public ResultBean<FlowRecordVo> businessFlowRecord(String procInsId) { |
|
|
|
long startTimes = System.currentTimeMillis(); // 记录开始时间
|
|
|
|
ResultBean<FlowRecordVo> rb = ResultBean.fireFail(); |
|
|
|
FlowRecordVo flowRecordVo = new FlowRecordVo(); |
|
|
|
if (StringUtils.isNotBlank(procInsId)) { |
|
|
|
// 批量获取所有历史任务实例
|
|
|
|
List<HistoricActivityInstance> list = historyService |
|
|
|
.createHistoricActivityInstanceQuery() |
|
|
|
.processInstanceId(procInsId) |
|
|
|
.list(); |
|
|
|
// 批量获取所有历史任务实例的变量
|
|
|
|
List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery() |
|
|
|
.processInstanceId(procInsId) |
|
|
|
.includeProcessVariables() |
|
|
|
.list(); |
|
|
|
Map<String, HistoricTaskInstance> taskInstanceMap = historicTasks.stream() |
|
|
|
.collect(Collectors.toMap(HistoricTaskInstance::getId, task -> task)); |
|
|
|
|
|
|
|
// 获取流程实例信息
|
|
|
|
Map<String, String> processInstance = processService.getProcessInstanceById(procInsId); |
|
|
|
|
|
|
|
// 预收集所有审批人的 ID,避免多个网络请求
|
|
|
|
Set<String> assigneeIds = list.stream() |
|
|
|
.map(HistoricActivityInstance::getAssignee) |
|
|
|
.filter(StringUtils::isNotBlank) |
|
|
|
.collect(Collectors.toSet()); |
|
|
|
|
|
|
|
// 将 Set<String> 转换为以逗号分隔的字符串
|
|
|
|
String assigneeIdsStr = String.join(",", assigneeIds); |
|
|
|
|
|
|
|
// 远程调用批量查询用户信息
|
|
|
|
Map<String, SysUserVo> userMap = sysUserFeign.fetchBySids(assigneeIdsStr).getData().stream() |
|
|
|
.collect(Collectors.toMap(SysUserVo::getSid, user -> user)); |
|
|
|
|
|
|
|
// 直接查询所有流程实例评论
|
|
|
|
List<Comment> commentList = taskService.getProcessInstanceComments(procInsId); |
|
|
|
commentList.sort(Comparator.comparing(Comment::getTime)); |
|
|
|
|
|
|
|
// 预初始化 hisFlowList,确保它始终为非 null
|
|
|
|
List<FlowTask> hisFlowList = new ArrayList<>(); |
|
|
|
// 使用一个线程安全的集合来存储结果
|
|
|
|
List<FlowTask> finalHisFlowList = Collections.synchronizedList(hisFlowList); |
|
|
|
|
|
|
|
// 使用 parallelStream 前先进行 null 检查和过滤
|
|
|
|
hisFlowList = list.parallelStream() |
|
|
|
.filter(histIns -> histIns != null && histIns.getTaskId() != null) // 过滤掉 histIns 或 histIns.getTaskId() 为 null 的元素
|
|
|
|
.map(histIns -> { |
|
|
|
FlowTask flowTask = new FlowTask(); |
|
|
|
flowTask.setTaskId(histIns.getTaskId()); |
|
|
|
flowTask.setTaskName(histIns.getActivityName()); |
|
|
|
flowTask.setTaskDefKey(histIns.getActivityId()); |
|
|
|
flowTask.setProcDefId(histIns.getProcessDefinitionId()); |
|
|
|
|
|
|
|
// 获取任务变量
|
|
|
|
HistoricTaskInstance historicTaskInstance = taskInstanceMap.get(histIns.getTaskId()); |
|
|
|
flowTask.setProcVars(historicTaskInstance != null ? historicTaskInstance.getProcessVariables() : Collections.emptyMap()); |
|
|
|
|
|
|
|
// 设置开始和结束时间
|
|
|
|
flowTask.setCreateTime(histIns.getStartTime()); |
|
|
|
flowTask.setFinishTime(histIns.getEndTime()); |
|
|
|
|
|
|
|
// 判断流程是否结束
|
|
|
|
flowTask.setProcessEndTime(processInstance.get("END_TIME_") == null ? "" : "end"); |
|
|
|
|
|
|
|
// 处理审批人员
|
|
|
|
if (StringUtils.isNotBlank(histIns.getAssignee()) && userMap.containsKey(histIns.getAssignee())) { |
|
|
|
SysUserVo user = userMap.get(histIns.getAssignee()); |
|
|
|
if (user != null) { |
|
|
|
TaskUserInfo taskUserInfo = new TaskUserInfo(); |
|
|
|
taskUserInfo.setAssigneeName(user.getName()); |
|
|
|
taskUserInfo.setAssigneeSid(user.getSid()); |
|
|
|
taskUserInfo.setAssigneeHeadImage(fileUploadComponent.getUrlPrefix() + user.getHeadImage()); |
|
|
|
flowTask.setTaskUserInfos(Collections.singletonList(taskUserInfo)); |
|
|
|
} |
|
|
|
} |
|
|
|
// 处理意见评论内容
|
|
|
|
if (commentList != null && !commentList.isEmpty()) { |
|
|
|
commentList.stream() |
|
|
|
.filter(comment -> histIns.getTaskId().equals(comment.getTaskId())) |
|
|
|
.forEach(comment -> { |
|
|
|
String type = comment.getType(); |
|
|
|
FlowCommentDto build = flowableService.selectComment(type, histIns.getTaskId(), histIns.getProcessInstanceId(), comment.getId()); |
|
|
|
if ("4".equals(type)) { // 加签审批意见
|
|
|
|
FlowTask flowTask1 = new FlowTask(); |
|
|
|
String userSid = comment.getUserId(); |
|
|
|
SysUserVo user = userMap.get(userSid); |
|
|
|
|
|
|
|
TaskUserInfo taskUserInfo = new TaskUserInfo(); |
|
|
|
taskUserInfo.setAssigneeName(user != null ? user.getName() : ""); |
|
|
|
taskUserInfo.setAssigneeSid(userSid); |
|
|
|
taskUserInfo.setAssigneeHeadImage(user != null ? fileUploadComponent.getUrlPrefix() + user.getHeadImage() : ""); |
|
|
|
|
|
|
|
flowTask1.setTaskName("加签审批意见"); |
|
|
|
flowTask1.setFinishTime(comment.getTime()); |
|
|
|
flowTask1.setCreateTime(comment.getTime()); |
|
|
|
flowTask1.setTaskUserInfos(Collections.singletonList(taskUserInfo)); |
|
|
|
flowTask1.setComment(build); |
|
|
|
flowTask1.setProcDefId(flowTask.getProcDefId()); |
|
|
|
flowTask1.setProcVars(flowTask.getProcVars()); |
|
|
|
flowTask1.setTaskDefKey(histIns.getActivityId()); |
|
|
|
finalHisFlowList.add(flowTask1); |
|
|
|
} else { |
|
|
|
flowTask.setComment(build); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
return flowTask; |
|
|
|
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
|
|
flowRecordVo.setFlowList(hisFlowList); |
|
|
|
} |
|
|
|
log.info("flowRecordVo:{}", JSONObject.toJSONString(flowRecordVo)); |
|
|
|
long endTime = System.currentTimeMillis(); |
|
|
|
log.info("流程记录接口耗时 {} ms", endTime - startTimes); |
|
|
|
return rb.success().setData(flowRecordVo); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 流程历史流转记录 |
|
|
|
* |
|
|
|
* @param procInsId 流程实例Id |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public ResultBean<FlowRecordVo> businessFlowRecordOld(String procInsId) { |
|
|
|
ResultBean<FlowRecordVo> rb = ResultBean.fireFail(); |
|
|
|
FlowRecordVo flowRecordVo = new FlowRecordVo(); |
|
|
|
if (StringUtils.isNotBlank(procInsId)) { |
|
|
@ -418,6 +543,7 @@ public class FlowTaskService extends MybatisBaseService<FlowTaskMapper, FlowTask |
|
|
|
return rb.success().setData(flowRecordVo); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 获取流程执行过程 |
|
|
|
* |
|
|
|