代码首页
This commit is contained in:
@@ -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}")
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user