Browse Source

优化流程记录接口

master
dimengzhe 2 months ago
parent
commit
a7eae503f2
  1. 128
      anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flowtask/FlowTaskService.java
  2. 107
      anrui-portal/anrui-portal-biz/src/main/java/com/yxt/anrui/portal/biz/flow/FlowableRest.java

128
anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flowtask/FlowTaskService.java

@ -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);
}
/**
* 获取流程执行过程
*
@ -1011,7 +1137,7 @@ public class FlowTaskService extends MybatisBaseService<FlowTaskMapper, FlowTask
}
ll.add(mapss);
}
paraMap.put("category","OA");
paraMap.put("category", "OA");
paraMap.put("userSid", userSid);
paraMap.put("list", ll);
paraMap.put("page", (pageNum - 1) * pageSize);

107
anrui-portal/anrui-portal-biz/src/main/java/com/yxt/anrui/portal/biz/flow/FlowableRest.java

@ -56,6 +56,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
@ -165,10 +166,114 @@ public class FlowableRest implements FlowableFeign {
@Override
public ResultBean<List<PCHistTaskListAndCommentList>> flowRecordAndComment(String procInsId, String deployId) {
// 并行调用外部服务
CompletableFuture<ResultBean<com.yxt.anrui.flowable.api.flowtask.FlowRecordVo>> flowRecordFuture =
CompletableFuture.supplyAsync(() -> flowableService.flowRecord(procInsId, deployId));
CompletableFuture<ResultBean<List<ProcessCommentVo>>> commentListFuture =
CompletableFuture.supplyAsync(() -> getCommentList(procInsId, deployId));
// 并行执行 flowTaskFeign.yuyanTest 查询
CompletableFuture<ResultBean<List<Map<String, Object>>>> flowTaskFuture =
CompletableFuture.supplyAsync(() -> {
ResultBean<List<Map<String, Object>>> listResultBean = ResultBean.fireFail();
// 获取流转记录和查询条件
ResultBean<com.yxt.anrui.flowable.api.flowtask.FlowRecordVo> flowRecordVoResultBean = flowRecordFuture.join();
List<com.yxt.anrui.flowable.api.flowtask.FlowTask> flowList1 = flowRecordVoResultBean.getData().getFlowList();
if (!flowList1.isEmpty()) {
com.yxt.anrui.flowable.api.flowtask.FlowTask appFlowableRecordVo = flowList1.get(flowList1.size() - 1);
if (!"Event_end".equals(appFlowableRecordVo.getTaskDefKey())) {
String proDefId = appFlowableRecordVo.getProcDefId();
Map<String, Object> map = (Map<String, Object>) appFlowableRecordVo.getProcVars();
FlowableQuery flowableQuery = new FlowableQuery();
flowableQuery.setModelId(proDefId);
flowableQuery.setTaskDefKey(appFlowableRecordVo.getTaskDefKey());
flowableQuery.setMap(map);
return flowTaskFeign.yuyanTest(flowableQuery);
}
}
return listResultBean.success().setData(new ArrayList<>());
});
// 等待外部服务调用完成
ResultBean<com.yxt.anrui.flowable.api.flowtask.FlowRecordVo> flowRecordVoResultBean = flowRecordFuture.join();
ResultBean<List<ProcessCommentVo>> commentList = commentListFuture.join();
ResultBean<List<Map<String, Object>>> flowTaskResultBean = flowTaskFuture.join();
List<PCHistTaskListAndCommentList> flowList = new ArrayList<>();
List<com.yxt.anrui.flowable.api.flowtask.FlowTask> flowList1 = flowRecordVoResultBean.getData().getFlowList();
// 处理流转记录
flowList1.forEach(f -> {
PCHistTaskListAndCommentList a = new PCHistTaskListAndCommentList();
a.setTime(f.getFinishTime() == null ? new Date() : f.getFinishTime());
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(f);
stringObjectMap.put("finishTime", DateUtil.format(f.getFinishTime(), "yyyy-MM-dd HH:mm:ss"));
stringObjectMap.put("createTime", DateUtil.format(f.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
a.setFlowableRecordVo(stringObjectMap);
a.setState("0");
List<com.yxt.anrui.flowable.api.flowtask.TaskUserInfo> taskUserInfos = f.getTaskUserInfos();
if (taskUserInfos != null) {
taskUserInfos.removeAll(Collections.singleton(null));
if (!taskUserInfos.isEmpty()) {
if (taskUserInfos.size() == 1) {
com.yxt.anrui.flowable.api.flowtask.TaskUserInfo appUserVo = taskUserInfos.get(0);
if ("admin".equals(appUserVo.getAssigneeName())) {
return; // 如果是admin,跳过该条记录
}
}
}
}
flowList.add(a);
});
// 处理评论记录
commentList.getData().forEach(f -> {
PCHistTaskListAndCommentList a = new PCHistTaskListAndCommentList();
a.setTime(f.getCreateTime());
f.setTitle(f.getTaskUserInfo().getAssigneeName() + "添加了评论");
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(f);
a.setProcessCommentVo(stringObjectMap);
a.setState("1");
flowList.add(a);
});
// 处理额外的流转记录
flowTaskResultBean.getData().forEach(f -> {
PCHistTaskListAndCommentList a = new PCHistTaskListAndCommentList();
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(f);
stringObjectMap.put("taskName", f.get("nodeName").toString());
stringObjectMap.put("finishTime", null);
stringObjectMap.put("createTime", "");
stringObjectMap.put("taskUserInfos", new ArrayList<>());
a.setFlowableRecordVo(stringObjectMap);
a.setState("3");
flowList.add(a);
});
// 合并排序:先按时间排序
flowList.sort(Comparator.nullsLast(Comparator.comparing(PCHistTaskListAndCommentList::getTime, Comparator.nullsLast(Comparator.naturalOrder()))));
// 返回结果
ResultBean<List<PCHistTaskListAndCommentList>> resultBean = new ResultBean<List<PCHistTaskListAndCommentList>>().success();
resultBean.setData(flowList);
return resultBean;
}
public ResultBean<List<PCHistTaskListAndCommentList>> flowRecordAndCommentOld(String procInsId, String deployId) {
ResultBean<com.yxt.anrui.flowable.api.flowtask.FlowRecordVo> flowRecordVoResultBean = flowableService.flowRecord(procInsId, deployId);
com.yxt.anrui.flowable.api.flowtask.FlowRecordVo flowRecordVo = flowRecordVoResultBean.getData();
List<PCHistTaskListAndCommentList> flowList = new ArrayList<>();
//流转记录
//流转记录
List<com.yxt.anrui.flowable.api.flowtask.FlowTask> flowList1 = flowRecordVo.getFlowList();
flowList1.forEach(f->{
PCHistTaskListAndCommentList a=new PCHistTaskListAndCommentList();

Loading…
Cancel
Save