zxl
2025-12-24 419fab9d84e6b2fbeb6d32b7d7253a6cd195200d
上报
3个文件已修改
102 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/WorkStationScheduleController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/query/WaitTodoQuery.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/WorkStationScheduleController.java
@@ -117,4 +117,7 @@
        return workStationScheduleService.countTodayTask();
    }
//    Result
}
business/src/main/java/com/ycl/domain/query/WaitTodoQuery.java
@@ -12,5 +12,5 @@
 **/
@Data
public class WaitTodoQuery extends AbsQuery {
    private String id; //all查询全部
    private String projectId; //all查询全部
}
business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
@@ -695,8 +695,7 @@
        boolean isAdmin = SecurityUtils.getLoginUser().getUser().isAdmin(); // 是否管理员
        List<String> userGroups = taskCommonService.getCurrentUserGroups(); // 当前用户所属组
        List<ProjectInfo> targetProjectList = new ArrayList<>();
        String queryProjectId = baseQuery.getId();
        String queryProjectId = baseQuery.getProjectId();
        if ("all".equals(queryProjectId) || StringUtils.isBlank(queryProjectId)){
            // 查询全部
@@ -710,7 +709,6 @@
                    // 项目不存在,返回空数据
                    return Result.ok().data(buildEmptyResultMap());
                }
                //
                targetProjectList.add(projectInfo);
            } catch (NumberFormatException e) {
                // 项目ID格式错误,返回空数据
@@ -748,7 +746,7 @@
        }
        // 再填充流程信息(部署ID、流程名称等)
        for (ProjectProcess projectProcess : projectProcessList) {
            CheckPointVO checkPointVO = map.get(projectProcess.getProjectId());
            CheckPointVO checkPointVO = map.get(projectProcess.getProjectId().toString()); // 修复:projectId是Long,需转字符串
            if (checkPointVO == null) {
                continue; // 无匹配项目,跳过
            }
@@ -769,7 +767,7 @@
                    checkPointVO.setProcessName(hisProcess.getProcessDefinitionName());
                }
            }
            map.put(projectProcess.getProjectId(), checkPointVO);
            map.put(projectProcess.getProjectId().toString(), checkPointVO); // 修复:projectId转字符串
        }
        Map<String, CheckPointVO> processInfoMap = map.values().stream()
                .filter(Objects::nonNull)
@@ -803,53 +801,76 @@
                    return assignee == null || userId.toString().equals(assignee);
                })
                .collect(Collectors.toList());
        // 任务去重
        Set<String> taskIdSet = new HashSet<>();
        List<Task> distinctAllTaskList = new ArrayList<>();
        for (Task task : allTaskList) {
            if (!taskIdSet.contains(task.getId())) {
                taskIdSet.add(task.getId());
                distinctAllTaskList.add(task);
                //
            }
        }
        long distinctTotal = distinctAllTaskList.size();
        System.out.println("去重后总数:" + distinctTotal);
        // ========== 修复点1:提前查询任务状态,过滤已完成任务(分页前执行) ==========
        // 查询任务状态
        final HashMap<String, ProcessLog> taskInfoMap = new HashMap<>();
        int startIndex = (pageNum - 1) * pageSize;
        List<Task> pageTaskList = new ArrayList<>();
        if (startIndex < distinctAllTaskList.size()) {
            int endIndex = Math.min(startIndex + pageSize, distinctAllTaskList.size());
            pageTaskList = distinctAllTaskList.subList(startIndex, endIndex);
        }
        List<TaskInfoVo> taskInfoVoList = new ArrayList<>();
        //查询任务状态
        List<String> taskIds = pageTaskList.stream().map(Task::getId).collect(Collectors.toList());
        HashMap<String,ProcessLog> taskInfoMap = new HashMap<>();
        if (!CollectionUtils.isEmpty(taskIds)) {
            taskInfoMap = new LambdaQueryChainWrapper<>(processLogMapper)
        List<String> allTaskIds = distinctAllTaskList.stream().map(Task::getId).collect(Collectors.toList());
        if (!CollectionUtils.isEmpty(allTaskIds)) {
            // 2. 不再重新赋值,而是先查询出结果,再放入已初始化的map中
            List<ProcessLog> processLogs = new LambdaQueryChainWrapper<>(processLogMapper)
                    .eq(ProcessLog::getDeleted, Boolean.FALSE)
                    .in(ProcessLog::getTaskId, taskIds).list()
                    .stream()
                    .in(ProcessLog::getTaskId, allTaskIds)
                    .list();
            // 3. 填充数据到taskInfoMap,引用未改变
            Map<String, ProcessLog> tempMap = processLogs.stream()
                    .filter(processLog -> processLog.getTaskId() != null && processLog.getGmtCreate() != null)
                    .collect(Collectors.toMap(
                            // Key:taskId转字符串
                            ProcessLog::getTaskId,
                            // Value:ProcessLog对象本身
                            processLog -> processLog,
                            // 冲突策略:保留gmtCreate更新的那条记录
                            (existing, replacement) -> {
                                return replacement.getGmtCreate().after(existing.getGmtCreate())
                                        ? replacement : existing;
                            },
                            (existing, replacement) -> replacement.getGmtCreate().after(existing.getGmtCreate()) ? replacement : existing,
                            HashMap::new
                    ));
            taskInfoMap.putAll(tempMap);
        }
        // 过滤已完成任务,得到有效任务列表(分页的依据)
        List<Task> validTaskList = distinctAllTaskList.stream()
                .filter(task -> {
                    ProcessLog processLog = taskInfoMap.get(task.getId());
                    // 未查询到日志 → 待完成;日志状态不是FINISHED → 有效
                    return processLog == null || !ProcessLogEventTypeEnum.FINISHED.getDesc().equals(processLog.getEventType().getDesc());
                })
                .collect(Collectors.toList());
        // 有效数据总条数
        long validTotal = validTaskList.size();
        System.out.println("有效任务总数(排除已完成):" + validTotal);
        // ========== 修复点2:分页合法性校验 ==========
        // 计算最大有效页码
        int maxPageNum = (int) (validTotal % pageSize == 0 ? validTotal / pageSize : (validTotal / pageSize) + 1);
        // 若总条数为0,直接返回空数据
        if (validTotal == 0) {
            return Result.ok().data(new HashMap<String, Object>() {{
                put("data", new ArrayList<>());
                put("total", 0L);
            }});
        }
        // 若请求页码超过最大页码,默认返回最后一页
        if (pageNum > maxPageNum) {
            pageNum = maxPageNum;
        }
        // ========== 修复点3:优化内存分页 ==========
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, validTaskList.size());
        // 转为新列表,避免subList视图的风险
        List<Task> pageTaskList = new ArrayList<>(validTaskList.subList(startIndex, endIndex));
        // 组装返回VO
        List<TaskInfoVo> taskInfoVoList = new ArrayList<>();
        for (Task task : pageTaskList) {
            TaskInfoVo taskVo = new TaskInfoVo();
            taskVo.setId(task.getId());
@@ -870,17 +891,7 @@
            taskInfoVoList.add(taskVo);
        }
        //排除 已完成的
        taskInfoVoList = taskInfoVoList.stream().filter(taskInfoVo -> {
            if (ProcessLogEventTypeEnum.FINISHED.getDesc().equals(taskInfoVo.getTaskType())){
                return false;
            }
            return true;
        }).collect(Collectors.toList());
        HashMap<String, Object> resultMap = new HashMap<>();
        resultMap.put("data", taskInfoVoList);
        resultMap.put("total", distinctTotal);
        return Result.ok().data(resultMap);
        return Result.ok().data(taskInfoVoList).total(validTotal);
    }