diff --git a/backend/src/main/java/com/designhub/service/AnalyticsService.java b/backend/src/main/java/com/designhub/service/AnalyticsService.java index 9a8ebac..7cd55b3 100644 --- a/backend/src/main/java/com/designhub/service/AnalyticsService.java +++ b/backend/src/main/java/com/designhub/service/AnalyticsService.java @@ -2452,13 +2452,24 @@ public class AnalyticsService { /** * 获取一级需求部门排名 + * 显示所有一级需求部门(包括没有发起过任务的部门) */ public List getPrimaryDeptRanking(LocalDateTime startTime, LocalDateTime endTime) { log.info("获取一级需求部门排名: startTime={}, endTime={}", startTime, endTime); List result = new java.util.ArrayList<>(); - // 查询所有一级需求部门的任务 + // 1. 获取所有一级需求部门 + List allPrimaryDepts = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getDeptType, "primary_demand") + .eq(Department::getStatus, 1) + .eq(Department::getDeleted, 0) + ); + + log.info("找到 {} 个一级需求部门", allPrimaryDepts.size()); + + // 2. 查询时间范围内的一级需求任务 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Task::getIsPrimaryTask, 1) .ge(Task::getCreateTime, startTime) @@ -2467,52 +2478,47 @@ public class AnalyticsService { List allTasks = taskMapper.selectList(queryWrapper); - // 按一级部门分组 + // 3. 按一级部门分组 java.util.Map> tasksByDept = allTasks.stream() .filter(t -> t.getPrimaryPublisherDeptId() != null) .collect(java.util.stream.Collectors.groupingBy(Task::getPrimaryPublisherDeptId)); - for (java.util.Map.Entry> entry : tasksByDept.entrySet()) { - Long deptId = entry.getKey(); - List deptTasks = entry.getValue(); + // 4. 为每个一级需求部门创建统计数据 + for (Department dept : allPrimaryDepts) { + Long deptId = dept.getId(); + List deptTasks = tasksByDept.getOrDefault(deptId, new java.util.ArrayList<>()); PrimaryDeptRankingVO vo = new PrimaryDeptRankingVO(); vo.setDeptId(deptId); + vo.setDeptName(dept.getDeptName()); - // 获取部门名称和上级部门名称 - Department dept = departmentMapper.selectById(deptId); - vo.setDeptName(dept != null ? dept.getDeptName() : "未知部门"); + // 获取一级部门和二级部门名称(向上查找部门层级) + List hierarchy = new java.util.ArrayList<>(); + Department current = dept; + while (current != null && current.getParentId() != null && current.getParentId() > 0) { + Department parent = departmentMapper.selectById(current.getParentId()); + if (parent != null) { + hierarchy.add(0, parent); // 插入到列表开头 + } + current = parent; + } - // 获取一级部门和二级部门名称 - if (dept != null) { - // 向上查找部门层级 - List hierarchy = new java.util.ArrayList<>(); - Department current = dept; - while (current != null && current.getParentId() != null && current.getParentId() > 0) { - Department parent = departmentMapper.selectById(current.getParentId()); - if (parent != null) { - hierarchy.add(0, parent); // 插入到列表开头 - } - current = parent; - } - - // hierarchy 现在从根部门到当前部门的父部门 - // 一级部门是 hierarchy[0],二级部门是 hierarchy[1](如果存在) - if (hierarchy.size() >= 1) { - vo.setFirstLevelDeptName(hierarchy.get(0).getDeptName()); - } - if (hierarchy.size() >= 2) { - vo.setSecondLevelDeptName(hierarchy.get(1).getDeptName()); - } + // hierarchy 现在从根部门到当前部门的父部门 + // 一级部门是 hierarchy[0],二级部门是 hierarchy[1](如果存在) + if (hierarchy.size() >= 1) { + vo.setFirstLevelDeptName(hierarchy.get(0).getDeptName()); + } + if (hierarchy.size() >= 2) { + vo.setSecondLevelDeptName(hierarchy.get(1).getDeptName()); } vo.setTaskCount(deptTasks.size()); // 计算审核通过率 - long approvedCount = deptTasks.stream() - .filter(t -> !"rejected_by_demand".equals(t.getApprovalStatus()) && !"draft".equals(t.getStatus())) - .count(); if (deptTasks.size() > 0) { + long approvedCount = deptTasks.stream() + .filter(t -> !"rejected_by_demand".equals(t.getApprovalStatus()) && !"draft".equals(t.getStatus())) + .count(); vo.setApprovalRate(BigDecimal.valueOf(approvedCount * 100.0 / deptTasks.size()) .setScale(2, RoundingMode.HALF_UP)); } else { @@ -2550,6 +2556,7 @@ public class AnalyticsService { result.get(i).setRank(i + 1); } + log.info("一级需求部门排名统计完成,共 {} 个部门", result.size()); return result; }