perf: 监控流程性能提升

This commit is contained in:
2024-08-20 13:57:52 +08:00
parent 6f368a730e
commit 989e16538a
4 changed files with 67 additions and 46 deletions
@@ -125,9 +125,8 @@ public class WorkCenterController {
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<ProcessAll> queryWrapper = getProcessAllQueryWrapper(processAll, true);
queryWrapper.like(StrUtil.isNotBlank(processAll.getCreateUserName()),"CONCAT(u.realname, '(', u.username, ')')", processAll.getCreateUserName());
Page<ProcessAll> page = new Page<>(pageNo, pageSize);
IPage<ProcessAll> sentList = processAllService.getAllList(page, queryWrapper, req);
IPage<ProcessAll> sentList = processAllService.getAllList(page, queryWrapper, req, processAll);
return Result.OK(sentList);
}
@@ -20,7 +20,7 @@ public interface ProcessAllMapper extends BaseMapper<ProcessAll> {
IPage<ProcessAll> getSentList(Page<ProcessAll> page, @Param(Constants.WRAPPER) QueryWrapper<ProcessAll> queryWrapper, @Param("column") String column, @Param("order") String order);
IPage<ProcessAll> getAllList(Page<ProcessAll> page, @Param(Constants.WRAPPER) QueryWrapper<ProcessAll> queryWrapper, @Param("column") String column, @Param("order") String order);
IPage<ProcessAll> getAllList(Page<ProcessAll> page, @Param(Constants.WRAPPER) QueryWrapper<ProcessAll> queryWrapper, @Param("column") String column, @Param("order") String order, @Param("pa") ProcessAll processAll);
int physicalDeleteByProjectId(@Param("tableName") String tableName, @Param("projectId") String projectId);
@@ -98,22 +98,24 @@
<select id="getAllList" resultType="com.jero.modules.activiti.entity.ProcessAll">
select pa.id,
pa.prc_name,
pa.process_definition_id,
pa.process_instance_id,
pa.prc_mes,
pa.prc_num,
pa.create_user_id,
pa.prc_type,
pa.prc_status,
pa.end_time,
pa.over_time,
pa.project_id,
pa.received_task_time,
pa.completed_task_time
pa.prc_name,
pa.process_definition_id,
pa.process_instance_id,
pa.prc_mes,
pa.prc_num,
pa.create_user_id,
pa.prc_type,
pa.prc_status,
pa.end_time,
pa.over_time,
pa.project_id,
pa.received_task_time,
pa.completed_task_time
from process_all pa
<if test="pa.createUserName != null and pa.createUserName != ''">
left join sys_user u on u.id = pa.create_user_id
${ew.customSqlSegment}
</if>
${ew.customSqlSegment}
<include refid="order"/>
</select>
</mapper>
@@ -161,48 +161,68 @@ public class ProcessAllService extends ServiceImpl<ProcessAllMapper, ProcessAll>
return sentList;
}
public IPage<ProcessAll> getAllList(Page<ProcessAll> page, QueryWrapper<ProcessAll> queryWrapper, HttpServletRequest req) {
public IPage<ProcessAll> getAllList(Page<ProcessAll> page, QueryWrapper<ProcessAll> queryWrapper, HttpServletRequest req, ProcessAll processAll) {
queryWrapper.like(StrUtil.isNotBlank(processAll.getCreateUserName()),"CONCAT(u.realname, '(', u.username, ')')", processAll.getCreateUserName());
String column = req.getParameter("column");
String order = req.getParameter("order");
IPage<ProcessAll> allList = processAllMapper.getAllList(page, queryWrapper, column, order);
IPage<ProcessAll> allList = processAllMapper.getAllList(page, queryWrapper, column, order, processAll);
List<ProcessAll> records = allList.getRecords();
if (records.isEmpty()){
if (records.isEmpty()) {
return allList;
}
List<String> incompleteCollect = records.stream().filter(item -> ProcessStatusEnum.INCOMPLETE.getValue().equals(item.getPrcStatus())).map(ProcessAll::getProcessInstanceId).collect(Collectors.toList());
List<ProcessApprovalRecord> incompleteRecordList = new ArrayList<>();
if (!incompleteCollect.isEmpty()) {
QueryWrapper<ProcessApprovalRecord> wrapper = new QueryWrapper<>();
wrapper.select("process_instance_id","group_concat(distinct user_id) as user_id");
wrapper.lambda().in(ProcessApprovalRecord::getProcessInstanceId,incompleteCollect)
.eq(ProcessApprovalRecord::getFinishFlag,FinishFlagEnum.INCOMPLETE.getValue())
.groupBy(ProcessApprovalRecord::getProcessInstanceId);
incompleteRecordList = approvalRecordService.list(wrapper);
}
Map<String, String> incompleteUserMap = CollStreamUtil.toMap(incompleteRecordList, ProcessApprovalRecord::getProcessInstanceId, ProcessApprovalRecord::getUserId);
List<String> withdrawnCollect = records.stream().filter(item -> ProcessStatusEnum.WITHDRAWN.getValue().equals(item.getPrcStatus())).map(ProcessAll::getProcessInstanceId).collect(Collectors.toList());
List<ProcessApprovalRecord> withdrawnRecordList = new ArrayList<>();
if (!withdrawnCollect.isEmpty()){
QueryWrapper<ProcessApprovalRecord> wrapper1 = new QueryWrapper<>();
wrapper1.select("process_instance_id","group_concat(distinct user_id) as user_id");
wrapper1.lambda().in(ProcessApprovalRecord::getProcessInstanceId,withdrawnCollect)
.eq(ProcessApprovalRecord::getFinishFlag,FinishFlagEnum.WITHDRAWN.getValue())
.groupBy(ProcessApprovalRecord::getProcessInstanceId);
withdrawnRecordList = approvalRecordService.list(wrapper1);
}
Map<String, String> withdrawnUserMap = CollStreamUtil.toMap(withdrawnRecordList, ProcessApprovalRecord::getProcessInstanceId, ProcessApprovalRecord::getUserId);
// 分别收集 INCOMPLETE 和 WITHDRAWN 状态的实例ID
Map<Integer, List<String>> statusCollect = records.parallelStream()
.filter(item -> item.getPrcStatus() != null)
.collect(Collectors.groupingBy(ProcessAll::getPrcStatus,
Collectors.mapping(ProcessAll::getProcessInstanceId, Collectors.toList())));
for (ProcessAll record : records) {
// 获取不完整的审批记录
List<ProcessApprovalRecord> incompleteRecordList = fetchApprovalRecords(
statusCollect.getOrDefault(ProcessStatusEnum.INCOMPLETE.getValue(), Collections.emptyList()),
FinishFlagEnum.INCOMPLETE.getValue());
// 获取撤回的审批记录
List<ProcessApprovalRecord> withdrawnRecordList = fetchApprovalRecords(
statusCollect.getOrDefault(ProcessStatusEnum.WITHDRAWN.getValue(), Collections.emptyList()),
FinishFlagEnum.WITHDRAWN.getValue());
// 将不完整和撤回的审批记录映射到ProcessInstanceId -> UserId
Map<String, String> incompleteUserMap = toUserMap(incompleteRecordList);
Map<String, String> withdrawnUserMap = toUserMap(withdrawnRecordList);
// 更新记录的 HandleUserId
records.parallelStream().forEach(record -> {
if (ProcessStatusEnum.INCOMPLETE.getValue().equals(record.getPrcStatus())) {
record.setHandleUserId(incompleteUserMap.get(record.getProcessInstanceId()));
}
if (ProcessStatusEnum.WITHDRAWN.getValue().equals(record.getPrcStatus())) {
} else if (ProcessStatusEnum.WITHDRAWN.getValue().equals(record.getPrcStatus())) {
record.setHandleUserId(withdrawnUserMap.get(record.getProcessInstanceId()));
}
}
});
return allList;
}
private List<ProcessApprovalRecord> fetchApprovalRecords(List<String> processInstanceIds, Integer finishFlag) {
if (processInstanceIds.isEmpty()) {
return Collections.emptyList();
}
QueryWrapper<ProcessApprovalRecord> wrapper = new QueryWrapper<>();
wrapper.select("process_instance_id", "group_concat(distinct user_id) as user_id");
wrapper.lambda().in(ProcessApprovalRecord::getProcessInstanceId, processInstanceIds)
.eq(ProcessApprovalRecord::getFinishFlag, finishFlag)
.groupBy(ProcessApprovalRecord::getProcessInstanceId);
return approvalRecordService.list(wrapper);
}
private Map<String, String> toUserMap(List<ProcessApprovalRecord> recordList) {
return recordList.parallelStream()
.collect(Collectors.toMap(ProcessApprovalRecord::getProcessInstanceId, ProcessApprovalRecord::getUserId));
}
@Transactional(rollbackFor = Exception.class)
public void forcedWithdrawal(String processInstanceId) {
//获得流程总表