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