fix: 一级需求部门排名统计显示所有部门(包括没有发起任务的)

This commit is contained in:
Your Name 2026-01-22 13:42:06 +08:00
parent 2457f13d43
commit cb5ad8955c

View File

@ -2452,13 +2452,24 @@ public class AnalyticsService {
/**
* 获取一级需求部门排名
* 显示所有一级需求部门(包括没有发起过任务的部门)
*/
public List<PrimaryDeptRankingVO> getPrimaryDeptRanking(LocalDateTime startTime, LocalDateTime endTime) {
log.info("获取一级需求部门排名: startTime={}, endTime={}", startTime, endTime);
List<PrimaryDeptRankingVO> result = new java.util.ArrayList<>();
// 查询所有一级需求部门的任务
// 1. 获取所有一级需求部门
List<Department> allPrimaryDepts = departmentMapper.selectList(
new LambdaQueryWrapper<Department>()
.eq(Department::getDeptType, "primary_demand")
.eq(Department::getStatus, 1)
.eq(Department::getDeleted, 0)
);
log.info("找到 {} 个一级需求部门", allPrimaryDepts.size());
// 2. 查询时间范围内的一级需求任务
LambdaQueryWrapper<Task> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Task::getIsPrimaryTask, 1)
.ge(Task::getCreateTime, startTime)
@ -2467,52 +2478,47 @@ public class AnalyticsService {
List<Task> allTasks = taskMapper.selectList(queryWrapper);
// 按一级部门分组
// 3. 按一级部门分组
java.util.Map<Long, List<Task>> tasksByDept = allTasks.stream()
.filter(t -> t.getPrimaryPublisherDeptId() != null)
.collect(java.util.stream.Collectors.groupingBy(Task::getPrimaryPublisherDeptId));
for (java.util.Map.Entry<Long, List<Task>> entry : tasksByDept.entrySet()) {
Long deptId = entry.getKey();
List<Task> deptTasks = entry.getValue();
// 4. 为每个一级需求部门创建统计数据
for (Department dept : allPrimaryDepts) {
Long deptId = dept.getId();
List<Task> 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<Department> 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<Department> 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;
}