From 30e865334ab0ddada1e101109c3ec6ea1b9c0c15 Mon Sep 17 00:00:00 2001 From: chenhao <852066789@qq.com> Date: Fri, 18 Oct 2024 17:09:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/project/ProjectController.java | 12 +++- .../project/service/IProjectService.java | 2 + .../service/impl/ProjectServiceImpl.java | 55 ++++++++++++++----- .../projectteam/domain/ProjectTeam.java | 2 + .../logger/service/IWorkLoggerService.java | 2 +- .../service/impl/WorkLoggerServiceImpl.java | 21 +++++-- .../ProjectTeam/ProjectTeamMapper.xml | 7 +++ 7 files changed, 80 insertions(+), 21 deletions(-) diff --git a/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java index 872eaa9..554dd52 100644 --- a/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java +++ b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java @@ -12,7 +12,6 @@ import tech.unissense.pms.common.core.domain.AjaxResult; import tech.unissense.pms.common.core.page.TableDataInfo; import tech.unissense.pms.common.enums.BusinessType; import tech.unissense.pms.common.utils.uuid.IdUtils; -import tech.unissense.pms.common.utils.uuid.UUID; import tech.unissense.pms.business.project.domain.Project; import tech.unissense.pms.business.project.service.IProjectService; @@ -59,6 +58,16 @@ public class ProjectController extends BaseController * 新增数据 */ // @PreAuthorize("@ss.hasPermi('system:dept:list')") + @PostMapping("/updateCheck") + public AjaxResult updateCheck(@RequestBody Project project) + { + + return AjaxResult.success(service.updateCheck(project)); + } + /** + * 新增数据 + */ + // @PreAuthorize("@ss.hasPermi('system:dept:list')") @PutMapping("/update") @Log(title = "项目管理", businessType = BusinessType.UPDATE) public AjaxResult updateDate(@RequestBody Project project) @@ -114,6 +123,7 @@ public class ProjectController extends BaseController @GetMapping("/{projectId}") public AjaxResult getTeamInfo(@PathVariable Integer projectId) { + return success(service.getTeamInfo(projectId)); } /** diff --git a/pms-business/src/main/java/tech/unissense/pms/business/project/service/IProjectService.java b/pms-business/src/main/java/tech/unissense/pms/business/project/service/IProjectService.java index ac788e1..248c350 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/project/service/IProjectService.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/project/service/IProjectService.java @@ -66,4 +66,6 @@ public interface IProjectService { ProjectWorkInfoVo workInfo(ProjectQueryDto project); + + Boolean updateCheck(Project project); } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java index 759b579..cb21f91 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java @@ -12,6 +12,7 @@ import tech.unissense.pms.business.project.vo.ProjectExecutionVo; import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo; import tech.unissense.pms.business.projectteam.domain.ProjectTeam; import tech.unissense.pms.business.projectteam.service.IProjectTeamService; + import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo; import tech.unissense.pms.business.work.logger.domain.WorkLogger; import tech.unissense.pms.business.work.logger.service.IWorkLoggerService; @@ -55,6 +56,8 @@ public class ProjectServiceImpl implements IProjectService { private static final ConcurrentHashMap DAILY_SEQUENCE_MAP = new ConcurrentHashMap<>(); @Autowired private RedisCache redisCache; + + /** * 通过ID查询单条数据 * @@ -214,9 +217,9 @@ public class ProjectServiceImpl implements IProjectService { ProjectTeam projectTeam = new ProjectTeam(); projectTeam.setProjectId(projectId); List projectTeamList = teamService.list(projectTeam); - + Project project = projectMapper.queryById(projectId); // 获取每个成员的工时统计并转换为Map - Map workHourVo = workLoggerService.personStatics(projectId).stream() + Map workHourVo = workLoggerService.personStatics(project).stream() .collect(Collectors.toMap(StaticsHourVo::getName, StaticsHourVo::getWorkTime, (v1, v2) -> v1)); // 返回每个成员的工时信息 @@ -242,12 +245,19 @@ public class ProjectServiceImpl implements IProjectService { projectQueryDto.setQueryUserId(Long.valueOf(workLogger.getUserId())); } List projects = this.permissisonList(projectQueryDto); - workLogger.setProjectIdList(projects.stream() + List projectIdList = projects.stream() .map(Project::getProjectId) - .collect(Collectors.toList())); + .collect(Collectors.toList()); + ProjectTeam projectTeam = new ProjectTeam(); + projectTeam.setProjectIdList(projectIdList); + Set teamSet = teamService.list(projectTeam).stream() + .map(item -> item.getProjectId() + "_" + item.getUserId()) + .collect(Collectors.toSet()); - List workLoggers = workLoggerService.list(workLogger); - Map workTimeMap = workLoggers.stream() + workLogger.setProjectIdList(projectIdList); + + Map workTimeMap = workLoggerService.list(workLogger).stream() + .filter(item -> teamSet.contains(item.getProjectId() + "_" + item.getUserId())) .collect(Collectors.toMap( item -> item.getProjectId() + "_" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()), item -> new BigDecimal(item.getWorkTime()), @@ -259,7 +269,13 @@ public class ProjectServiceImpl implements IProjectService { return projects.stream().map(project -> { List tempList = Stream.iterate(startDate, date -> date.plusDays(1)) .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1) - .map(localDate -> workTimeMap.getOrDefault(project.getProjectId() + "_" + localDate, BigDecimal.ZERO)) + .map(localDate -> { + if (localDate.isAfter(project.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || + localDate.isBefore(project.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate())) { + return BigDecimal.ZERO; + } + return workTimeMap.getOrDefault(project.getProjectId() + "_" + localDate, BigDecimal.ZERO); + }) .collect(Collectors.toList()); ProjectExecutionVo vo = new ProjectExecutionVo(); @@ -276,12 +292,14 @@ public class ProjectServiceImpl implements IProjectService { WorkLogger workLogger = new WorkLogger(); workLogger.setProjectId(projectQueryDto.getProjectId()); - workLogger.setStartDate(projectQueryDto.getStartDate()); - workLogger.setEndDate(projectQueryDto.getEndDate()); + workLogger.setStartDate(project.getStartDate()); + workLogger.setEndDate(project.getEndDate()); List workLoggerList = workLoggerService.listUser(workLogger); - + ProjectTeam projectTeam = new ProjectTeam(); + projectTeam.setProjectId(projectQueryDto.getProjectId()); + Set projectTeamSet = teamService.list(projectTeam).stream().map(ProjectTeam::getUserId).collect(Collectors.toSet()); // 使用流按日期分组,并对每个日期的工人按用户ID去重,保留最后一次记录 - Map> workersByDateMap = workLoggerList.stream() + Map> workersByDateMap = workLoggerList.stream().filter(item->projectTeamSet.contains(item.getUserId())) .collect(Collectors.groupingBy( logger -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, logger.getLoggerDate()), Collectors.collectingAndThen( @@ -294,8 +312,8 @@ public class ProjectServiceImpl implements IProjectService { ) )); - LocalDate startDate = workLogger.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); - LocalDate endDate = workLogger.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate startDate = projectQueryDto.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate endDate = projectQueryDto.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); // 生成从开始日期到结束日期的工人列表 List> detailList = Stream.iterate(startDate, date -> date.plusDays(1)) @@ -308,4 +326,15 @@ public class ProjectServiceImpl implements IProjectService { vo.setDetailList(detailList); return vo; } + + @Override + public Boolean updateCheck(Project project) { + WorkLogger workLogger = new WorkLogger(); + workLogger.setProjectId(project.getProjectId()); + List list = workLoggerService.list(workLogger); + if (list.stream().anyMatch(item -> item.getLoggerDate().before(project.getStartDate()) || item.getLoggerDate().after(project.getEndDate()))) { + return false; + } + return true; + } } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/projectteam/domain/ProjectTeam.java b/pms-business/src/main/java/tech/unissense/pms/business/projectteam/domain/ProjectTeam.java index 4ab0ed8..c73efdb 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/projectteam/domain/ProjectTeam.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/projectteam/domain/ProjectTeam.java @@ -4,6 +4,7 @@ import lombok.Data; import tech.unissense.pms.common.core.domain.BaseEntity; import java.util.Date; +import java.util.List; /** * (ProjectTeam)实体类 @@ -18,6 +19,7 @@ public class ProjectTeam extends BaseEntity { * 项目id */ private Integer projectId; + private List projectIdList; /** * 组成员id */ diff --git a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/IWorkLoggerService.java b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/IWorkLoggerService.java index 8603b8f..8d46149 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/IWorkLoggerService.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/IWorkLoggerService.java @@ -61,7 +61,7 @@ public interface IWorkLoggerService { List calendar(WorkLogger workLogger); List projectStatics(List projects, String workHour); - List personStatics(Integer projectId); + List personStatics(Project project); List listUser(WorkLogger workLogger); diff --git a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java index e19e51b..7e1132e 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java @@ -126,17 +126,24 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { List projectIds = projects.stream() .map(Project::getProjectId) .collect(Collectors.toList()); - + // 创建一个Map用于快速查找项目的开始和结束日期 + Map projectMap = projects.stream() + .collect(Collectors.toMap(Project::getProjectId, project -> project)); // 创建WorkHour对象并设置查询条件 WorkLogger workLogger = new WorkLogger(); workLogger.setProjectIdList(projectIds); workLogger.setCreateBy(userId); - // 查询与项目ID和用户ID相关的工时记录 List list = workLoggerMapper.list(workLogger); // 按项目ID汇总工时 - Map workHourMap = list.stream() + Map workHourMap = list.stream().filter(item -> { + Project project = projectMap.get(item.getProjectId()); + if (project == null) { + return false; + } + return !item.getLoggerDate().before(project.getStartDate()) && !item.getLoggerDate().after(project.getEndDate()); + }) .collect(Collectors.toMap( WorkLogger::getProjectId, item->new BigDecimal(item.getWorkTime()), @@ -148,11 +155,13 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { } @Override - public List personStatics(Integer projectId) { + public List personStatics(Project project) { // 创建WorkHour对象并设置查询条件 - WorkLogger workLogger = new WorkLogger(); - workLogger.setProjectId(projectId); + WorkLogger workLogger = new WorkLogger(); + workLogger.setProjectId(project.getProjectId()); + workLogger.setStartDate(project.getStartDate()); + workLogger.setEndDate(project.getEndDate()); // 查询与项目ID相关的工时记录 List workLoggers = workLoggerMapper.list(workLogger); diff --git a/pms-business/src/main/resources/mapper/business/ProjectTeam/ProjectTeamMapper.xml b/pms-business/src/main/resources/mapper/business/ProjectTeam/ProjectTeamMapper.xml index 5ff4614..c018d12 100644 --- a/pms-business/src/main/resources/mapper/business/ProjectTeam/ProjectTeamMapper.xml +++ b/pms-business/src/main/resources/mapper/business/ProjectTeam/ProjectTeamMapper.xml @@ -49,6 +49,13 @@ and project_id = #{projectId} + + and project_id in + + #{item} + + + and team_id = #{teamId}