diff --git a/pms/src/main/java/org/nl/pms/Portal/controller/PortalDashboardController.java b/pms/src/main/java/org/nl/pms/Portal/controller/PortalDashboardController.java index a9df271..8d551e5 100644 --- a/pms/src/main/java/org/nl/pms/Portal/controller/PortalDashboardController.java +++ b/pms/src/main/java/org/nl/pms/Portal/controller/PortalDashboardController.java @@ -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 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}") diff --git a/pms/src/main/java/org/nl/pms/Portal/service/PortalDashboardService.java b/pms/src/main/java/org/nl/pms/Portal/service/PortalDashboardService.java index 88f3e86..7b31237 100644 --- a/pms/src/main/java/org/nl/pms/Portal/service/PortalDashboardService.java +++ b/pms/src/main/java/org/nl/pms/Portal/service/PortalDashboardService.java @@ -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); } diff --git a/pms/src/main/java/org/nl/pms/Portal/service/impl/PortalDashboardServiceImpl.java b/pms/src/main/java/org/nl/pms/Portal/service/impl/PortalDashboardServiceImpl.java index 97dfe5e..99a5a5a 100644 --- a/pms/src/main/java/org/nl/pms/Portal/service/impl/PortalDashboardServiceImpl.java +++ b/pms/src/main/java/org/nl/pms/Portal/service/impl/PortalDashboardServiceImpl.java @@ -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 currentUserIdentifiers = currentUserIdentifiers(username, personName); long current = Math.max(projectPage, 1); long size = Math.min(Math.max(projectSize, 1), 12); List allProjects = projectMapper.selectList(new LambdaQueryWrapper() .orderByDesc(Project::getCreatedAt)); List 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 memberTasks = projectPlanDetailMapper.selectList(new LambdaQueryWrapper() .orderByAsc(ProjectPlanDetail::getDevStartDate)) .stream() - .filter(task -> containsMember(task.getTaskMembers(), username)) + .filter(task -> containsMember(task.getTaskMembers(), currentUserIdentifiers)) + .toList(); + List 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 tasks) { + private PortalDashboardVO.Overview buildOverview(long activeParticipatedProjectCount, long participatedProjectCount, + long responsibleProjectCount, List 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 tasks) { LocalDate monday = LocalDate.now().with(DayOfWeek.MONDAY); + var projectNames = projectMapper.selectList(new LambdaQueryWrapper()) + .stream() + .collect(java.util.stream.Collectors.toMap(Project::getId, Project::getProjectName, (left, right) -> left)); List dates = new ArrayList<>(); List taskCounts = new ArrayList<>(); + List> taskDetails = new ArrayList<>(); for (int offset = 0; offset < 7; offset++) { LocalDate date = monday.plusDays(offset); + List 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 currentUserIdentifiers(String username, String personName) { + List identifiers = new ArrayList<>(); + addIdentifier(identifiers, username); + addIdentifier(identifiers, personName); + return identifiers; + } + + private void addIdentifier(List 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 userIdentifiers) { + return userIdentifiers.stream().anyMatch(identifier -> identifier.equals(value)); + } + + private boolean containsMember(String members, List 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)); } } diff --git a/pms/src/main/java/org/nl/pms/Portal/vo/PortalDashboardVO.java b/pms/src/main/java/org/nl/pms/Portal/vo/PortalDashboardVO.java index 1a7fd7c..ee06128 100644 --- a/pms/src/main/java/org/nl/pms/Portal/vo/PortalDashboardVO.java +++ b/pms/src/main/java/org/nl/pms/Portal/vo/PortalDashboardVO.java @@ -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 dates; private List taskCounts; + private List> taskDetails; + } + + @Data + public static class WeeklyPlanItem { + private String projectName; + private String planName; } } diff --git a/pms_vue/src/views/Portal/index.vue b/pms_vue/src/views/Portal/index.vue index 1aa5c9e..3b0c234 100644 --- a/pms_vue/src/views/Portal/index.vue +++ b/pms_vue/src/views/Portal/index.vue @@ -4,18 +4,18 @@
项目工作台
-
个人概览当前工作数据
我参与的项目{{ overview.participatedProjectCount }}个项目
我的计划任务{{ overview.taskCount }}项任务
+
个人概览当前工作数据
正在参与的项目{{ overview.activeParticipatedProjectCount }}个项目
我的计划任务{{ overview.taskCount }}项任务
消息通知最多展示 5 条
项目卡片向左滑动加载更多项目
{{ project.projectName ? project.projectName.slice(0, 1) : '项' }}

{{ project.projectName }}

{{ project.projectCode || '未设置项目编号' }}

{{ statusText(project.status) }}
暂无项目数据
正在加载更多项目
-

{{ selectedProjectPlan.projectName }}

项目负责人:{{ selectedProjectPlan.projectLeader || '-' }}项目开发进度:-项目开发成员:{{ membersText(selectedProjectPlan.developMembers) }}
查看开发计划
我的项目数据请点击上方项目卡片查看个人项目计划
参与项目数{{ overview.participatedProjectCount }}
累计工时{{ overview.accumulatedHours }}小时
项目异常率{{ percent(overview.exceptionRate) }}
贡献度{{ percent(overview.contributionRate) }}
代码量{{ overview.codeLines }}

项目占比

工时占比

本周我的计划

按开发计划日期统计

+

{{ selectedProjectPlan.projectName }}

项目负责人:{{ selectedProjectPlan.projectLeader || '-' }}项目开发进度:-项目开发成员:{{ membersText(selectedProjectPlan.developMembers) }}
查看开发计划
我的项目数据请点击上方项目卡片查看个人项目计划
我参与的项目{{ overview.participatedProjectCount }}
我负责的项目{{ overview.responsibleProjectCount }}
累计工时{{ overview.accumulatedHours }}小时
项目异常率{{ percent(overview.exceptionRate) }}
贡献度{{ percent(overview.contributionRate) }}
代码量{{ overview.codeLines }}

项目占比

工时占比

本周我的计划

按开发计划日期统计