代码首页

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

View File

@@ -4,7 +4,7 @@ import org.nl.pms.Portal.vo.PortalDashboardVO;
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);
}

View File

@@ -33,22 +33,34 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
private final ProjectProgressReportMapper projectProgressReportMapper;
@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 size = Math.min(Math.max(projectSize, 1), 12);
List<Project> allProjects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
.orderByDesc(Project::getCreatedAt));
List<Project> memberProjects = allProjects.stream()
.filter(project -> containsMember(project.getDevelopMembers(), username))
.filter(project -> containsMember(project.getDevelopMembers(), currentUserIdentifiers))
.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>()
.orderByAsc(ProjectPlanDetail::getDevStartDate))
.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();
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.setProjectRatio(buildRatio("我参与的项目", memberProjects.size(), "其他项目", Math.max(allProjects.size() - memberProjects.size(), 0)));
result.setWorkHourRatio(buildRatio("我的工时", calculateHours(memberTasks), "其他工时", 0));
@@ -112,9 +124,12 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
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();
overview.setParticipatedProjectCount(projectCount);
overview.setActiveParticipatedProjectCount(activeParticipatedProjectCount);
overview.setParticipatedProjectCount(participatedProjectCount);
overview.setResponsibleProjectCount(responsibleProjectCount);
overview.setTaskCount(tasks.size());
overview.setAccumulatedHours(calculateHours(tasks));
overview.setExceptionRate(0D);
@@ -150,16 +165,31 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
private PortalDashboardVO.WeeklyPlan buildWeeklyPlan(List<ProjectPlanDetail> tasks) {
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<Integer> taskCounts = new ArrayList<>();
List<List<PortalDashboardVO.WeeklyPlanItem>> taskDetails = new ArrayList<>();
for (int offset = 0; offset < 7; 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());
taskCounts.add((int) tasks.stream().filter(task -> isPlannedFor(task, date)).count());
taskCounts.add(dayTasks.size());
taskDetails.add(dayTasks);
}
PortalDashboardVO.WeeklyPlan weeklyPlan = new PortalDashboardVO.WeeklyPlan();
weeklyPlan.setDates(dates);
weeklyPlan.setTaskCounts(taskCounts);
weeklyPlan.setTaskDetails(taskDetails);
return weeklyPlan;
}
@@ -238,11 +268,43 @@ public class PortalDashboardServiceImpl implements PortalDashboardService {
};
}
private boolean containsMember(String members, String username) {
if (!StringUtils.hasText(members) || !StringUtils.hasText(username)) {
private boolean isActiveProjectStatus(Integer status) {
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 members.contains("\"" + username + "\"") || members.equals(username)
|| Arrays.stream(members.split(",")).map(String::trim).anyMatch(username::equals);
return parseMembers(members).stream().anyMatch(userIdentifiers::contains);
}
private boolean containsMember(String members, String username) {
return containsMember(members, currentUserIdentifiers(username, null));
}
}

View File

@@ -83,7 +83,9 @@ public class PortalDashboardVO {
@Data
public static class Overview {
private long activeParticipatedProjectCount;
private long participatedProjectCount;
private long responsibleProjectCount;
private long taskCount;
private long accumulatedHours;
private double exceptionRate;
@@ -103,5 +105,12 @@ public class PortalDashboardVO {
public static class WeeklyPlan {
private List<String> dates;
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