fix 81700 优化流程监控查询速度

This commit is contained in:
lijiarao
2024-02-04 18:40:33 +08:00
parent 629b6fdf3b
commit 8e470eeb46
4 changed files with 97 additions and 45 deletions
@@ -162,7 +162,6 @@ public class ProcessAll {
/**
* 接收任务时间
*/
@TableField(exist = false)
@ApiModelProperty(value="接收任务时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@@ -171,7 +170,6 @@ public class ProcessAll {
/**
* 接收任务时间
*/
@TableField(exist = false)
@ApiModelProperty(value="完成任务时间")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@@ -115,6 +115,7 @@ public class MyGlobalEventListener implements ActivitiEventListener {
//任务创建时,清除pass
delegateTask.removeVariable("pass");
//流程审批信息
ProcessAllService processAllService = SpringContextUtil.getBean(ProcessAllService.class);
ProcessApprovalRecordService recordService = SpringContextUtil.getBean(ProcessApprovalRecordService.class);
ProcessNodeService processNodeService = SpringContextUtil.getBean(ProcessNodeService.class);
log.info("id = " + delegateTask.getId());
@@ -151,6 +152,12 @@ public class MyGlobalEventListener implements ActivitiEventListener {
approvalRecord.setCreateTime(createTime);
approvalRecord.setNodeId(taskDefinitionKey);
recordService.save(approvalRecord);
//更新最新接受任务时间
ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId);
LambdaUpdateWrapper<ProcessAll> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAll::getId,processAll.getId());
updateWrapper.set(ProcessAll::getReceivedTaskTime,createTime);
processAllService.update(updateWrapper);
// 对接统一平台生成待办任务
PushWorkflowIntegrationAPI pushWorkflowIntegrationAPI = SpringContextUtil.getBean(PushWorkflowIntegrationAPI.class);
@@ -188,6 +195,7 @@ public class MyGlobalEventListener implements ActivitiEventListener {
log.info("execution.getActivityId() = " + execution.getActivityId());
log.info("taskEntity.getVariables() = " + delegateTask.getVariables());
//流程审批信息转办
ProcessAllService processAllService = SpringContextUtil.getBean(ProcessAllService.class);
ProcessApprovalRecordService recordService = SpringContextUtil.getBean(ProcessApprovalRecordService.class);
String taskId = delegateTask.getId();
String assignee = delegateTask.getAssignee();
@@ -237,6 +245,13 @@ public class MyGlobalEventListener implements ActivitiEventListener {
}
recordService.updateById(approvalRecord);
//更新最新完成任务时间
ProcessAll processAll = processAllService.getByProcessInstanceId(delegateTask.getProcessInstanceId());
LambdaUpdateWrapper<ProcessAll> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAll::getId,processAll.getId());
updateWrapper.set(ProcessAll::getCompletedTaskTime,date);
processAllService.update(updateWrapper);
// 对接统一平台生成完成任务
PushWorkflowIntegrationAPI pushWorkflowIntegrationAPI = SpringContextUtil.getBean(PushWorkflowIntegrationAPI.class);
List<HiworkTodoAdd> list = new ArrayList<>();
@@ -19,39 +19,44 @@
</select>
<select id="getCompletedList" resultType="com.jero.modules.activiti.entity.ProcessAll">
select pa.*,
max(par.create_time) as receivedTaskTime,
max(par.end_time) as completedTaskTime
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 as receivedTaskTime,
pa.completed_task_time
from process_all pa
left join process_approval_record par on pa.process_instance_id = par.process_instance_id
${ew.customSqlSegment}
left join process_approval_record par on pa.process_instance_id = par.process_instance_id
${ew.customSqlSegment}
<include refid="order"/>
</select>
<!-- <select id="getCompletedList" resultType="com.jero.modules.activiti.entity.ProcessAll">-->
<!-- select p.*,-->
<!-- group_concat(par.user_id) as handleUserId-->
<!-- from (-->
<!-- select pa.*,-->
<!-- max(par.create_time) as receivedTaskTime,-->
<!-- max(par.end_time) as completedTaskTime-->
<!-- from process_all pa-->
<!-- left join process_approval_record par on pa.process_instance_id = par.process_instance_id-->
<!-- ${ew.customSqlSegment}-->
<!-- ) p-->
<!-- LEFT JOIN (-->
<!-- SELECT user_id,process_instance_id from process_approval_record WHERE finish_flag = 1-->
<!-- ) par ON p.process_instance_id = par.process_instance_id-->
<!-- group by p.process_instance_id-->
<!-- <include refid="order"/>-->
<!-- </select>-->
<select id="getSentList" resultType="com.jero.modules.activiti.entity.ProcessAll">
select p.*, group_concat(par.user_id) as handleUserId
from (
select pa.*, max(par.create_time) as receivedTaskTime, max(par.end_time) as completedTaskTime, par.node_id
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 as receivedTaskTime,
pa.completed_task_time
from process_all pa
left join process_approval_record par on pa.process_instance_id = par.process_instance_id
${ew.customSqlSegment}
) p
LEFT JOIN (
@@ -62,23 +67,22 @@
</select>
<select id="getAllList" resultType="com.jero.modules.activiti.entity.ProcessAll">
select p.*, case
when p.prc_status = 1 then group_concat(par.user_id)
when p.prc_status = 3 then group_concat(par2.user_id)
end as handleUserId
from (
select pa.*, max(par.create_time) as receivedTaskTime, max(par.end_time) as completedTaskTime, par.node_id
from process_all pa
left join process_approval_record par on pa.process_instance_id = par.process_instance_id
${ew.customSqlSegment}
) p
LEFT JOIN (
SELECT user_id,process_instance_id from process_approval_record WHERE finish_flag = 1
) par ON p.process_instance_id = par.process_instance_id
LEFT JOIN (
SELECT user_id,process_instance_id from process_approval_record WHERE finish_flag = 4
) par2 ON p.process_instance_id = par2.process_instance_id
group by p.process_instance_id
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 as receivedTaskTime,
pa.completed_task_time
from process_all pa
${ew.customSqlSegment}
<include refid="order"/>
</select>
</mapper>
@@ -127,7 +127,42 @@ public class ProcessAllService extends ServiceImpl<ProcessAllMapper, ProcessAll>
public IPage<ProcessAll> getAllList(Page<ProcessAll> page, QueryWrapper<ProcessAll> queryWrapper, HttpServletRequest req) {
String column = req.getParameter("column");
String order = req.getParameter("order");
return processAllMapper.getAllList(page,queryWrapper,column,order);
IPage<ProcessAll> allList = processAllMapper.getAllList(page, queryWrapper, column, order);
List<ProcessAll> records = allList.getRecords();
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(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(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);
for (ProcessAll record : records) {
if (ProcessStatusEnum.INCOMPLETE.getValue().equals(record.getPrcStatus())) {
record.setHandleUserId(incompleteUserMap.get(record.getProcessInstanceId()));
}
if (ProcessStatusEnum.WITHDRAWN.getValue().equals(record.getPrcStatus())) {
record.setHandleUserId(withdrawnUserMap.get(record.getProcessInstanceId()));
}
}
return allList;
}
@Transactional(rollbackFor = Exception.class)
public void forcedWithdrawal(String processInstanceId) {