代码首页

This commit is contained in:
zhangzq
2026-07-20 21:00:19 +08:00
parent 32d8176332
commit 6ce2842c88
5 changed files with 89 additions and 16 deletions

View File

@@ -7,6 +7,7 @@ import org.nl.pms.Portal.service.PortalDashboardService;
import org.nl.pms.Portal.vo.PortalDashboardVO; import org.nl.pms.Portal.vo.PortalDashboardVO;
import org.nl.pms.common.exception.BadRequestException; import org.nl.pms.common.exception.BadRequestException;
import org.nl.pms.common.utils.SecurityUtils; import org.nl.pms.common.utils.SecurityUtils;
import org.nl.pms.common.utils.dto.CurrentUser;
import org.nl.pms.project.vo.ApiResponse; import org.nl.pms.project.vo.ApiResponse;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -22,8 +23,9 @@ public class PortalDashboardController {
public ApiResponse<PortalDashboardVO> dashboard( public ApiResponse<PortalDashboardVO> dashboard(
@RequestParam(defaultValue = "1") long projectPage, @RequestParam(defaultValue = "1") long projectPage,
@RequestParam(defaultValue = "6") long projectSize) { @RequestParam(defaultValue = "6") long projectSize) {
CurrentUser currentUser = SecurityUtils.getCurrentUser();
return ApiResponse.success(portalDashboardService.getDashboard( return ApiResponse.success(portalDashboardService.getDashboard(
SecurityUtils.getCurrentUsername(), projectPage, projectSize)); currentUser.getUsername(), currentUser.getPresonName(), projectPage, projectSize));
} }
@GetMapping("/project-plan/{projectId}") @GetMapping("/project-plan/{projectId}")

View File

@@ -4,7 +4,7 @@ import org.nl.pms.Portal.vo.PortalDashboardVO;
public interface PortalDashboardService { public interface PortalDashboardService {
PortalDashboardVO getDashboard(String username, long projectPage, long projectSize); PortalDashboardVO getDashboard(String username, String personName, long projectPage, long projectSize);
PortalDashboardVO.ProjectPlan getProjectPlan(String username, Long projectId); PortalDashboardVO.ProjectPlan getProjectPlan(String username, Long projectId);
} }

View File

@@ -33,22 +33,34 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
private final ProjectProgressReportMapper projectProgressReportMapper; private final ProjectProgressReportMapper projectProgressReportMapper;
@Override @Override
public PortalDashboardVO getDashboard(String username, long projectPage, long projectSize) { public PortalDashboardVO getDashboard(String username, String personName, long projectPage, long projectSize) {
List<String> currentUserIdentifiers = currentUserIdentifiers(username, personName);
long current = Math.max(projectPage, 1); long current = Math.max(projectPage, 1);
long size = Math.min(Math.max(projectSize, 1), 12); long size = Math.min(Math.max(projectSize, 1), 12);
List<Project> allProjects = projectMapper.selectList(new LambdaQueryWrapper<Project>() List<Project> allProjects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.orderByDesc(Project::getCreatedAt)); .orderByDesc(Project::getCreatedAt));
List<Project> memberProjects = allProjects.stream() List<Project> memberProjects = allProjects.stream()
.filter(project -> containsMember(project.getDevelopMembers(), username)) .filter(project -> containsMember(project.getDevelopMembers(), currentUserIdentifiers))
.toList(); .toList();
long activeParticipatedProjectCount = allProjects.stream()
.filter(project -> isActiveProjectStatus(project.getStatus()))
.filter(project -> containsUser(project.getDevelopLeader(), currentUserIdentifiers)
|| containsMember(project.getDevelopMembers(), currentUserIdentifiers))
.count();
long responsibleProjectCount = allProjects.stream()
.filter(project -> containsUser(project.getDevelopLeader(), currentUserIdentifiers))
.count();
List<ProjectPlanDetail> memberTasks = projectPlanDetailMapper.selectList(new LambdaQueryWrapper<ProjectPlanDetail>() List<ProjectPlanDetail> memberTasks = projectPlanDetailMapper.selectList(new LambdaQueryWrapper<ProjectPlanDetail>()
.orderByAsc(ProjectPlanDetail::getDevStartDate)) .orderByAsc(ProjectPlanDetail::getDevStartDate))
.stream() .stream()
.filter(task -> containsMember(task.getTaskMembers(), username)) .filter(task -> containsMember(task.getTaskMembers(), currentUserIdentifiers))
.toList();
List<ProjectPlanDetail> activeMemberTasks = memberTasks.stream()
.filter(task -> isActiveTaskStatus(task.getStatus()))
.toList(); .toList();
PortalDashboardVO result = new PortalDashboardVO(); PortalDashboardVO result = new PortalDashboardVO();
result.setOverview(buildOverview(memberProjects.size(), memberTasks)); result.setOverview(buildOverview(activeParticipatedProjectCount, memberProjects.size(), responsibleProjectCount, activeMemberTasks));
result.setProjects(toProjects(new Page<>(current, size))); result.setProjects(toProjects(new Page<>(current, size)));
result.setProjectRatio(buildRatio("我参与的项目", memberProjects.size(), "其他项目", Math.max(allProjects.size() - memberProjects.size(), 0))); result.setProjectRatio(buildRatio("我参与的项目", memberProjects.size(), "其他项目", Math.max(allProjects.size() - memberProjects.size(), 0)));
result.setWorkHourRatio(buildRatio("我的工时", calculateHours(memberTasks), "其他工时", 0)); result.setWorkHourRatio(buildRatio("我的工时", calculateHours(memberTasks), "其他工时", 0));
@@ -112,9 +124,12 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
return plan; return plan;
} }
private PortalDashboardVO.Overview buildOverview(long projectCount, List<ProjectPlanDetail> tasks) { private PortalDashboardVO.Overview buildOverview(long activeParticipatedProjectCount, long participatedProjectCount,
long responsibleProjectCount, List<ProjectPlanDetail> tasks) {
PortalDashboardVO.Overview overview = new PortalDashboardVO.Overview(); PortalDashboardVO.Overview overview = new PortalDashboardVO.Overview();
overview.setParticipatedProjectCount(projectCount); overview.setActiveParticipatedProjectCount(activeParticipatedProjectCount);
overview.setParticipatedProjectCount(participatedProjectCount);
overview.setResponsibleProjectCount(responsibleProjectCount);
overview.setTaskCount(tasks.size()); overview.setTaskCount(tasks.size());
overview.setAccumulatedHours(calculateHours(tasks)); overview.setAccumulatedHours(calculateHours(tasks));
overview.setExceptionRate(0D); overview.setExceptionRate(0D);
@@ -150,16 +165,31 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
private PortalDashboardVO.WeeklyPlan buildWeeklyPlan(List<ProjectPlanDetail> tasks) { private PortalDashboardVO.WeeklyPlan buildWeeklyPlan(List<ProjectPlanDetail> tasks) {
LocalDate monday = LocalDate.now().with(DayOfWeek.MONDAY); LocalDate monday = LocalDate.now().with(DayOfWeek.MONDAY);
var projectNames = projectMapper.selectList(new LambdaQueryWrapper<Project>())
.stream()
.collect(java.util.stream.Collectors.toMap(Project::getId, Project::getProjectName, (left, right) -> left));
List<String> dates = new ArrayList<>(); List<String> dates = new ArrayList<>();
List<Integer> taskCounts = new ArrayList<>(); List<Integer> taskCounts = new ArrayList<>();
List<List<PortalDashboardVO.WeeklyPlanItem>> taskDetails = new ArrayList<>();
for (int offset = 0; offset < 7; offset++) { for (int offset = 0; offset < 7; offset++) {
LocalDate date = monday.plusDays(offset); LocalDate date = monday.plusDays(offset);
List<PortalDashboardVO.WeeklyPlanItem> dayTasks = tasks.stream()
.filter(task -> isPlannedFor(task, date))
.map(task -> {
PortalDashboardVO.WeeklyPlanItem item = new PortalDashboardVO.WeeklyPlanItem();
item.setProjectName(projectNames.getOrDefault(task.getProjectId(), "未命名项目"));
item.setPlanName(task.getDetailName());
return item;
})
.toList();
dates.add(date.toString()); dates.add(date.toString());
taskCounts.add((int) tasks.stream().filter(task -> isPlannedFor(task, date)).count()); taskCounts.add(dayTasks.size());
taskDetails.add(dayTasks);
} }
PortalDashboardVO.WeeklyPlan weeklyPlan = new PortalDashboardVO.WeeklyPlan(); PortalDashboardVO.WeeklyPlan weeklyPlan = new PortalDashboardVO.WeeklyPlan();
weeklyPlan.setDates(dates); weeklyPlan.setDates(dates);
weeklyPlan.setTaskCounts(taskCounts); weeklyPlan.setTaskCounts(taskCounts);
weeklyPlan.setTaskDetails(taskDetails);
return weeklyPlan; return weeklyPlan;
} }
@@ -238,11 +268,43 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
}; };
} }
private boolean containsMember(String members, String username) { private boolean isActiveProjectStatus(Integer status) {
if (!StringUtils.hasText(members) || !StringUtils.hasText(username)) { return status != null && status >= 0 && status <= 2;
}
private boolean isActiveTaskStatus(Integer status) {
return status != null && (status == 1 || status == 2 || status == 4);
}
private List<String> currentUserIdentifiers(String username, String personName) {
List<String> identifiers = new ArrayList<>();
addIdentifier(identifiers, username);
addIdentifier(identifiers, personName);
return identifiers;
}
private void addIdentifier(List<String> identifiers, String value) {
if (!StringUtils.hasText(value)) {
return;
}
String identifier = value.trim();
if (!identifiers.contains(identifier)) {
identifiers.add(identifier);
}
}
private boolean containsUser(String value, List<String> userIdentifiers) {
return userIdentifiers.stream().anyMatch(identifier -> identifier.equals(value));
}
private boolean containsMember(String members, List<String> userIdentifiers) {
if (!StringUtils.hasText(members) || userIdentifiers.isEmpty()) {
return false; return false;
} }
return members.contains("\"" + username + "\"") || members.equals(username) return parseMembers(members).stream().anyMatch(userIdentifiers::contains);
|| Arrays.stream(members.split(",")).map(String::trim).anyMatch(username::equals); }
private boolean containsMember(String members, String username) {
return containsMember(members, currentUserIdentifiers(username, null));
} }
} }

View File

@@ -83,7 +83,9 @@ public class PortalDashboardVO {
@Data @Data
public static class Overview { public static class Overview {
private long activeParticipatedProjectCount;
private long participatedProjectCount; private long participatedProjectCount;
private long responsibleProjectCount;
private long taskCount; private long taskCount;
private long accumulatedHours; private long accumulatedHours;
private double exceptionRate; private double exceptionRate;
@@ -103,5 +105,12 @@ public class PortalDashboardVO {
public static class WeeklyPlan { public static class WeeklyPlan {
private List<String> dates; private List<String> dates;
private List<Integer> taskCounts; private List<Integer> taskCounts;
private List<List<WeeklyPlanItem>> taskDetails;
}
@Data
public static class WeeklyPlanItem {
private String projectName;
private String planName;
} }
} }

File diff suppressed because one or more lines are too long