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 b9d8de1..2f970d3 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 @@ -2,6 +2,7 @@ package tech.unissense.pms.web.controller.business.project; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import tech.unissense.pms.business.project.dto.ProjectQueryDto; import tech.unissense.pms.business.projectteam.domain.ProjectTeam; import tech.unissense.pms.business.projectteam.service.IProjectTeamService; import tech.unissense.pms.business.work.logger.domain.WorkLogger; @@ -111,4 +112,13 @@ public class ProjectController extends BaseController { return success(service.executionInfo(workLogger)); } + /** + * 项目人员表 + */ + // @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @PostMapping("/workInfo") + public AjaxResult workInfo(@RequestBody ProjectQueryDto dto) + { + return success(service.workInfo(dto)); + } } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/project/dto/ProjectQueryDto.java b/pms-business/src/main/java/tech/unissense/pms/business/project/dto/ProjectQueryDto.java new file mode 100644 index 0000000..1d12345 --- /dev/null +++ b/pms-business/src/main/java/tech/unissense/pms/business/project/dto/ProjectQueryDto.java @@ -0,0 +1,25 @@ +package tech.unissense.pms.business.project.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * @author : ch + * @version : 1.0 + * @ClassName : ProjectQueryDto + * @Description : TODO(用一句话描述该类做什么) + * @DATE : Created in 14:51 2024/10/10 + *
       Copyright: Copyright(c)2024     
+ *
       Company :   	紫光汇智信息技术有限公司		           
+ * Modification History: + * Date Author Version Discription + * -------------------------------------------------------------------------- + * 2024/10/10 ch 1.0 Why & What is modified: <修改原因描述> * + */ +@Data +public class ProjectQueryDto { + private Integer projectId; + private Date startDate; + private Date endDate; +} 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 b43f52f..ac788e1 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 @@ -1,13 +1,13 @@ package tech.unissense.pms.business.project.service; import tech.unissense.pms.business.project.domain.Project; +import tech.unissense.pms.business.project.dto.ProjectQueryDto; import tech.unissense.pms.business.project.vo.ProjectExecutionVo; +import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo; import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo; import tech.unissense.pms.business.work.logger.domain.WorkLogger; -import java.math.BigDecimal; import java.util.List; -import java.util.Map; /** * (Project)表服务接口 @@ -65,4 +65,5 @@ public interface IProjectService { List executionInfo(WorkLogger workLogger); + ProjectWorkInfoVo workInfo(ProjectQueryDto 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 40e7fd5..d92f3e5 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 @@ -4,9 +4,11 @@ import cn.hutool.core.collection.CollUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import tech.unissense.pms.business.project.domain.Project; +import tech.unissense.pms.business.project.dto.ProjectQueryDto; import tech.unissense.pms.business.project.mapper.ProjectMapper; import tech.unissense.pms.business.project.service.IProjectService; 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; @@ -23,12 +25,12 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; - -import java.time.temporal.ChronoUnit; import java.util.stream.Stream; /** @@ -160,7 +162,12 @@ public class ProjectServiceImpl implements IProjectService { @Override public List executionInfo(WorkLogger workLogger) { - List projects = this.permissisonList(new Project()); + + Project projectQueryDto = new Project(); + if (workLogger.getUserId() != null) { + projectQueryDto.setQueryUserId(Long.valueOf(workLogger.getUserId())); + } + List projects = this.permissisonList(projectQueryDto); workLogger.setProjectIdList(projects.stream() .map(Project::getProjectId) .collect(Collectors.toList())); @@ -188,4 +195,43 @@ public class ProjectServiceImpl implements IProjectService { return vo; }).collect(Collectors.toList()); } + + @Override + public ProjectWorkInfoVo workInfo(ProjectQueryDto projectQueryDto) { + Project project = projectMapper.queryById(projectQueryDto.getProjectId()); + + WorkLogger workLogger = new WorkLogger(); + workLogger.setProjectId(projectQueryDto.getProjectId()); + workLogger.setStartDate(projectQueryDto.getStartDate()); + workLogger.setEndDate(projectQueryDto.getEndDate()); + List workLoggerList = workLoggerService.listUser(workLogger); + + // 使用流按日期分组,并对每个日期的工人按用户ID去重,保留最后一次记录 + Map> workersByDateMap = workLoggerList.stream() + .collect(Collectors.groupingBy( + logger -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, logger.getLoggerDate()), + Collectors.collectingAndThen( + Collectors.toMap( + WorkLogger::getUserId, + logger -> logger, + (existing, replacement) -> existing.getCreateTime().after(replacement.getCreateTime()) ? existing : replacement + ), + map -> new ArrayList<>(map.values()) + ) + )); + + LocalDate startDate = workLogger.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate endDate = workLogger.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + + // 生成从开始日期到结束日期的工人列表 + List> detailList = Stream.iterate(startDate, date -> date.plusDays(1)) + .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1) + .map(localDate -> workersByDateMap.getOrDefault(localDate.toString(), Collections.emptyList())) + .collect(Collectors.toList()); + + ProjectWorkInfoVo vo = new ProjectWorkInfoVo(); + BeanUtils.copyBeanProp(vo, project); + vo.setDetailList(detailList); + return vo; + } } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/project/vo/ProjectWorkInfoVo.java b/pms-business/src/main/java/tech/unissense/pms/business/project/vo/ProjectWorkInfoVo.java new file mode 100644 index 0000000..154d115 --- /dev/null +++ b/pms-business/src/main/java/tech/unissense/pms/business/project/vo/ProjectWorkInfoVo.java @@ -0,0 +1,31 @@ +package tech.unissense.pms.business.project.vo; + +import lombok.Data; +import tech.unissense.pms.business.work.logger.domain.WorkLogger; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * @author : ch + * @version : 1.0 + * @ClassName : ProjectExecutionVo + * @Description : TODO(用一句话描述该类做什么) + * @DATE : Created in 11:20 2024/10/10 + *
       Copyright: Copyright(c)2024     
+ *
       Company :   	紫光汇智信息技术有限公司		           
+ * Modification History: + * Date Author Version Discription + * -------------------------------------------------------------------------- + * 2024/10/10 ch 1.0 Why & What is modified: <修改原因描述> * + */ +@Data +public class ProjectWorkInfoVo { + private Integer projectId; + private String projectName; + private Integer budgetDate; + private Date startDate; + private Date endDate; + private List> detailList; +} diff --git a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java index b44bd16..ca9f511 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java @@ -33,6 +33,7 @@ public class WorkLogger extends BaseEntity { * 用户id */ private Integer userId; + private String userName; /** * 工作时长 */ diff --git a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/mapper/WorkLoggerMapper.java b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/mapper/WorkLoggerMapper.java index 32a97c9..0e68b37 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/mapper/WorkLoggerMapper.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/mapper/WorkLoggerMapper.java @@ -80,5 +80,7 @@ public interface WorkLoggerMapper { int deleteById(Integer id); List calendar(WorkLogger workLogger); + + List listUser(WorkLogger workLogger); } 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 ba6c4a7..d36de9e 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 @@ -62,4 +62,6 @@ public interface IWorkLoggerService { List projectStatics(List projects, String workHour); List personStatics(Integer projectId); + + 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 4efe639..e8e0be1 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 @@ -15,6 +15,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneId; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -167,6 +168,11 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { return generateStaticsHourVoList(personWorkHourMap); } + @Override + public List listUser(WorkLogger workLogger) { + return workLoggerMapper.listUser(workLogger); + } + // 泛型方法,用于生成统计工时的列表,适用于项目统计 private List generateStaticsHourVoList(List items, Map workDayMap, Function idExtractor, Function nameExtractor) { diff --git a/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml b/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml index c0fbd6f..8f503f4 100644 --- a/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml +++ b/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml @@ -7,6 +7,7 @@ + @@ -49,61 +50,61 @@ @@ -193,6 +194,66 @@ and report_date between #{startDate} and #{endDate} and user_id=#{userId} + update pms_work_logger