package com.cloudroam.service.impl; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.cloudroam.bo.ProjectInfoBO; import com.cloudroam.bo.ProjectUserStatisticsBO; import com.cloudroam.bo.calendar.CalCalendarBO; import com.cloudroam.bo.project.ProjectBoardBO; import com.cloudroam.bo.project.ProjectBoardBO2; import com.cloudroam.bo.project.ProjectBoardColumnsDataBO; import com.cloudroam.bo.project.ProjectMinMaxDateBO; import com.cloudroam.common.LocalUser; import com.cloudroam.dto.calendar.CalendarPageDTO; import com.cloudroam.dto.projectInfo.*; import com.cloudroam.common.enumeration.DeletedEnum; import com.cloudroam.common.enumeration.ProjectStatusEnum; import com.cloudroam.mapper.CalCalendarMapperCustom; import com.cloudroam.mapper.ProjectInfoMapperCustom; import com.cloudroam.model.ProjectInfoDO; import com.cloudroam.mapper.ProjectInfoMapper; import com.cloudroam.model.UserDO; import com.cloudroam.service.ProjectInfoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.time.LocalDateTime; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.YearMonth; /** *

* 服务实现类 *

* * @author generator@TaoJie * @since 2023-08-08 */ @Service public class ProjectInfoServiceImpl extends ServiceImpl implements ProjectInfoService { @Autowired private ProjectInfoMapperCustom projectInfoMapperCustom; @Autowired private ProjectInfoMapper projectInfoMapper; @Autowired private CalCalendarMapperCustom calCalendarMapperCustom; @Override public IPage getProjectInfoPage(QueryProjectInfoDTO dto) { Page page=new Page(dto.getPage(),dto.getCount()); // return projectInfoMapperCustom.selectProjectInfoPage(page,dto.getKeyword(),dto.getStatus(),dto.getStage(),dto.getType()); return projectInfoMapperCustom.selectProjectInfoPageByDTO(page,dto); } @Override public List getProjectInfoList(QueryProjectInfoDTO dto) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ProjectInfoDO::getIsDeleted, DeletedEnum.DELETED_NO.getCode()); wrapper.eq(StringUtils.isNotBlank(dto.getProjectId()), ProjectInfoDO::getId, dto.getProjectId()) .like(StringUtils.isNotBlank(dto.getKeyword()), ProjectInfoDO::getProjectName, dto.getKeyword()); if(StrUtil.isNotBlank(dto.getStatus())){ String[] status=dto.getStatus().split(","); wrapper.in(ProjectInfoDO::getProjectStatus,status); } return projectInfoMapper.selectList(wrapper); } @Override public boolean createProjectInfo(CreateOrUpdateProjectInfoDTO validator) { ProjectInfoDO projectInfoDO=new ProjectInfoDO(); UserDO user = LocalUser.getLocalUser(); BeanUtils.copyProperties(validator,projectInfoDO); projectInfoDO.setId(IdUtil.simpleUUID()); // 项目处于新建状态 projectInfoDO.setProjectStatus(ProjectStatusEnum.NEW.getCode()); projectInfoDO.setCreateTime(new Date()); projectInfoDO.setCreateUserId(String.valueOf(user.getId())); projectInfoDO.setCreateUserName(user.getNickname()); projectInfoDO.setUpdateTime(new Date()); projectInfoDO.setUpdateUserId(String.valueOf(user.getId())); projectInfoDO.setUpdateUserName(user.getNickname()); projectInfoDO.setIsDeleted(DeletedEnum.DELETED_NO.getCode()); return this.baseMapper.insert(projectInfoDO)>0; } @Override public boolean updateProjectInfo(CreateOrUpdateProjectInfoDTO validator) { UserDO user = LocalUser.getLocalUser(); ProjectInfoDO projectInfoDO=new ProjectInfoDO(); BeanUtils.copyProperties(validator,projectInfoDO); projectInfoDO.setUpdateTime(new Date()); projectInfoDO.setUpdateUserId(String.valueOf(user.getId())); projectInfoDO.setUpdateUserName(user.getNickname()); return this.baseMapper.updateById(projectInfoDO)>0; } @Override public boolean removeByIdLogic(String id) { UserDO user = LocalUser.getLocalUser(); ProjectInfoDO projectInfoDO=new ProjectInfoDO(); projectInfoDO.setId(id); projectInfoDO.setIsDeleted(DeletedEnum.DELETED_YES.getCode()); projectInfoDO.setDeleteTime(new Date()); projectInfoDO.setDeleteUserId(String.valueOf(user.getId())); projectInfoDO.setDeleteUserName(user.getNickname()); return this.baseMapper.updateById(projectInfoDO)>0; } @Override @Transactional public boolean updateProjectInfoSetUp(UpdateProjectSetUpDTO validator) { UserDO user = LocalUser.getLocalUser(); // 获取当前的project,并根据base_hour+daily_hour=actual_hours ProjectInfoDO dbProjectInfo = this.baseMapper.selectById(validator.getId()); ProjectInfoDO projectInfoDO=new ProjectInfoDO(); BeanUtils.copyProperties(validator,projectInfoDO); if(!Objects.isNull(projectInfoDO.getBaseHours())&&!Objects.isNull(dbProjectInfo.getDailyHours())){ projectInfoDO.setActualHours(projectInfoDO.getBaseHours().add(dbProjectInfo.getDailyHours())); }else if(!Objects.isNull(projectInfoDO.getBaseHours())&&Objects.isNull(dbProjectInfo.getDailyHours())){ projectInfoDO.setActualHours(projectInfoDO.getBaseHours()); }else if(Objects.isNull(projectInfoDO.getBaseHours())&&!Objects.isNull(dbProjectInfo.getDailyHours())){ projectInfoDO.setActualHours(dbProjectInfo.getDailyHours()); } // 项目处于已立项状态 projectInfoDO.setProjectStatus(ProjectStatusEnum.SETUP.getCode()); projectInfoDO.setUpdateTime(new Date()); projectInfoDO.setUpdateUserId(String.valueOf(user.getId())); projectInfoDO.setUpdateUserName(user.getNickname()); return this.baseMapper.updateById(projectInfoDO)>0; } @Override @Transactional public boolean updateProjectInfoStart(String id) { UserDO user = LocalUser.getLocalUser(); // 项目处于已立项状态 ProjectInfoDO projectInfoDO=new ProjectInfoDO(); projectInfoDO.setId(id); // 设置项目为启动状态 projectInfoDO.setProjectStatus(ProjectStatusEnum.START.getCode()); // 设置项目实际开始时间 projectInfoDO.setActualStartTime(LocalDateTime.now()); projectInfoDO.setUpdateTime(new Date()); projectInfoDO.setUpdateUserId(String.valueOf(user.getId())); projectInfoDO.setUpdateUserName(user.getNickname()); return this.baseMapper.updateById(projectInfoDO)>0; } @Override @Transactional public boolean updateProjectInfoComplete(String id) { UserDO user = LocalUser.getLocalUser(); ProjectInfoDO projectInfoDO=new ProjectInfoDO(); projectInfoDO.setId(id); // 设置项目为完成状态 projectInfoDO.setProjectStatus(ProjectStatusEnum.COMPLETE.getCode()); // 设置项目实际完成时间 projectInfoDO.setActualCompleteTime(LocalDateTime.now()); projectInfoDO.setUpdateTime(new Date()); projectInfoDO.setUpdateUserId(String.valueOf(user.getId())); projectInfoDO.setUpdateUserName(user.getNickname()); return this.baseMapper.updateById(projectInfoDO)>0; } @Override @Transactional public boolean updateProjectInfoTermination(String id) { UserDO user = LocalUser.getLocalUser(); ProjectInfoDO projectInfoDO=new ProjectInfoDO(); projectInfoDO.setId(id); // 设置项目为终止状态 projectInfoDO.setProjectStatus(ProjectStatusEnum.TERMINATION.getCode()); projectInfoDO.setUpdateTime(new Date()); projectInfoDO.setUpdateUserId(String.valueOf(user.getId())); projectInfoDO.setUpdateUserName(user.getNickname()); return this.baseMapper.updateById(projectInfoDO)>0; } @Override @Transactional public boolean updateProjectInfoHours(UpdateProjectHoursDTO validator) { UserDO user = LocalUser.getLocalUser(); // 获取当前的project,并根据base_hour+daily_hour=actual_hours ProjectInfoDO dbProjectInfo = this.baseMapper.selectById(validator.getId()); ProjectInfoDO projectInfoDO=new ProjectInfoDO(); BeanUtils.copyProperties(validator,projectInfoDO); if(!Objects.isNull(projectInfoDO.getBaseHours())&&!Objects.isNull(dbProjectInfo.getDailyHours())){ projectInfoDO.setActualHours(projectInfoDO.getBaseHours().add(dbProjectInfo.getDailyHours())); }else if(!Objects.isNull(projectInfoDO.getBaseHours())&&Objects.isNull(dbProjectInfo.getDailyHours())){ projectInfoDO.setActualHours(projectInfoDO.getBaseHours()); }else if(Objects.isNull(projectInfoDO.getBaseHours())&&!Objects.isNull(dbProjectInfo.getDailyHours())){ projectInfoDO.setActualHours(dbProjectInfo.getDailyHours()); } projectInfoDO.setUpdateTime(new Date()); projectInfoDO.setUpdateUserId(String.valueOf(user.getId())); projectInfoDO.setUpdateUserName(user.getNickname()); return this.baseMapper.updateById(projectInfoDO)>0; } @Override public List getProjectHourStatistics(QueryProjectInfoDTO dto) { return projectInfoMapperCustom.getProjectHourStatistics(dto); } @Override public ProjectInfoBO getDetailById(String id) { return projectInfoMapperCustom.getDetailById(id); } @Override public List getProjectBoard(QueryProjectInfoDTO dto) { // 1.获取所有项目 List srcProjectList=projectInfoMapperCustom.getBoardProjectList(dto); // 3.查询所有的在项目的开始时间和结束时间的最早时间和最晚时间的日历 final List projectIdList = srcProjectList.stream().map(projectInfoBO -> projectInfoBO.getId()).collect(Collectors.toList()); // 3.1 根据项目id查找到项目的最大和最小时间 ProjectMinMaxDateBO projectMinMaxDateBO=projectInfoMapperCustom.getProjectMinMaxDateList(projectIdList); CalendarPageDTO calendarPageDTO=new CalendarPageDTO(); calendarPageDTO.setStartDate(projectMinMaxDateBO.getMinDate()); calendarPageDTO.setEndDate(calendarPageDTO.getEndDate()); List calendarList=calCalendarMapperCustom.selectProjectCalendarList(calendarPageDTO); // 2.根据项目将一个项目转变成两个项目,根据计划时间和实际时间 List result=new ArrayList<>(); srcProjectList.stream().forEach(project->{ if(dto.getProjectBoardType().equals("project")){ ProjectBoardBO planProject=new ProjectBoardBO(); planProject.setProjectId(project.getId()); planProject.setProjectName(project.getProjectName()); planProject.setProject("计划"); planProject.setStartDate(project.getProEstimateStartTime()); planProject.setEndDate(project.getProEstimateCompleteTime()); planProject.setProjectStatus(project.getProjectStatusName()); result.add(planProject); ProjectBoardBO actualProject=new ProjectBoardBO(); actualProject.setProjectId(project.getId()); actualProject.setProjectName(project.getProjectName()); actualProject.setProject("实际"); actualProject.setStartDate(project.getProActualStartTime()); actualProject.setEndDate(project.getProActualCompleteTime()); actualProject.setProjectStatus(project.getProjectStatusName()); result.add(actualProject); }else{ ProjectBoardBO planProject=new ProjectBoardBO(); planProject.setProjectId(project.getId()); planProject.setProjectName(project.getProjectName()); planProject.setProject("计划"); planProject.setStartDate(project.getBusEstimateStartTime()); planProject.setEndDate(project.getBusEstimateCompleteTime()); planProject.setProjectStatus(project.getProjectStatusName()); result.add(planProject); ProjectBoardBO actualProject=new ProjectBoardBO(); actualProject.setProjectId(project.getId()); actualProject.setProjectName(project.getProjectName()); actualProject.setProject("实际"); actualProject.setStartDate(project.getBusActualStartTime()); actualProject.setEndDate(project.getBusActualCompleteTime()); actualProject.setProjectStatus(project.getProjectStatusName()); result.add(actualProject); } }); // 4.遍历循环所有项目,并根据每个项目的开始时间和结束时间来设置项目的日历状态,如果在时间内则projectStatus设置成1 result.forEach(projectBoardBO -> { List projectCalendarList = new ArrayList<>(); calendarList.forEach(calCalendarBO -> { // 检查 calDate 是否在 startDate 和 endDate 之间 if (null!=projectBoardBO.getStartDate() && null!=projectBoardBO.getEndDate() &&(calCalendarBO.getCalDate().isEqual(projectBoardBO.getStartDate()) || calCalendarBO.getCalDate().isAfter(projectBoardBO.getStartDate())) && (calCalendarBO.getCalDate().isEqual(projectBoardBO.getEndDate()) || calCalendarBO.getCalDate().isBefore(projectBoardBO.getEndDate()))) { // 设置状态为 1 calCalendarBO.setCalendarStatus(1); } else { // 设置状态为 0 (或其他默认值) calCalendarBO.setCalendarStatus(0); } projectCalendarList.add(calCalendarBO); }); // 将 projectCalendarList 设置到 projectBoardBO 的 calendarList 属性 projectBoardBO.setCalendarList(projectCalendarList); }); return result; } @Override public ProjectBoardColumnsDataBO getProjectBoard2(QueryProjectInfoDTO dto) { // 1.获取所有项目 List srcProjectList=projectInfoMapperCustom.getBoardProjectList(dto); // 3.查询所有的在项目的开始时间和结束时间的最早时间和最晚时间的日历 final List projectIdList = srcProjectList.stream().map(projectInfoBO -> projectInfoBO.getId()).collect(Collectors.toList()); // 3.1 根据项目id查找到项目的最大和最小时间 ProjectMinMaxDateBO projectMinMaxDateBO=projectInfoMapperCustom.getProjectMinMaxDateList(projectIdList); // 没有最大和最小时间 if(null==projectMinMaxDateBO){ projectMinMaxDateBO=projectInfoMapperCustom.getProjectMinMaxDateDefaultList(projectIdList); } CalendarPageDTO calendarPageDTO=new CalendarPageDTO(); calendarPageDTO.setStartDate(projectMinMaxDateBO.getMinDate()); calendarPageDTO.setEndDate(projectMinMaxDateBO.getMaxDate()); List calendarList=calCalendarMapperCustom.selectProjectCalendarList(calendarPageDTO); // 2.根据项目将一个项目转变成两个项目,根据计划时间和实际时间 List result=new ArrayList<>(); IntStream.range(0, srcProjectList.size()).forEach(index->{ ProjectInfoBO project=srcProjectList.get(index); if(dto.getProjectBoardType().equals("project")){ ProjectBoardBO planProject=new ProjectBoardBO(); planProject.setNo(index+1); planProject.setProjectId(project.getId()); planProject.setProjectName(project.getProjectName()); planProject.setProject("计划"); planProject.setStartDate(project.getProEstimateStartTime()); planProject.setEndDate(project.getProEstimateCompleteTime()); planProject.setProjectStatus(project.getProjectStatusName()); result.add(planProject); ProjectBoardBO actualProject=new ProjectBoardBO(); actualProject.setNo(index+1); actualProject.setProjectId(project.getId()); actualProject.setProjectName(project.getProjectName()); actualProject.setProject("实际"); actualProject.setStartDate(project.getProActualStartTime()); actualProject.setEndDate(project.getProActualCompleteTime()); actualProject.setProjectStatus(project.getProjectStatusName()); result.add(actualProject); }else{ ProjectBoardBO planProject=new ProjectBoardBO(); planProject.setNo(index+1); planProject.setProjectId(project.getId()); planProject.setProjectName(project.getProjectName()); planProject.setProject("计划"); planProject.setStartDate(project.getBusEstimateStartTime()); planProject.setEndDate(project.getBusEstimateCompleteTime()); planProject.setProjectStatus(project.getProjectStatusName()); result.add(planProject); ProjectBoardBO actualProject=new ProjectBoardBO(); actualProject.setNo(index+1); actualProject.setProjectId(project.getId()); actualProject.setProjectName(project.getProjectName()); actualProject.setProject("实际"); actualProject.setStartDate(project.getBusActualStartTime()); actualProject.setEndDate(project.getBusActualCompleteTime()); actualProject.setProjectStatus(project.getProjectStatusName()); result.add(actualProject); } }); // srcProjectList.stream().forEach(project->{ // // if(dto.getProjectBoardType().equals("project")){ // ProjectBoardBO planProject=new ProjectBoardBO(); // planProject.setProjectId(project.getId()); // planProject.setProjectName(project.getProjectName()); // planProject.setProject("计划"); // planProject.setStartDate(project.getProEstimateStartTime()); // planProject.setEndDate(project.getProEstimateCompleteTime()); // // planProject.setProjectStatus(project.getProjectStatusName()); // result.add(planProject); // // ProjectBoardBO actualProject=new ProjectBoardBO(); // actualProject.setProjectId(project.getId()); // actualProject.setProjectName(project.getProjectName()); // actualProject.setProject("实际"); // actualProject.setStartDate(project.getProActualStartTime()); // actualProject.setEndDate(project.getProActualCompleteTime()); // // actualProject.setProjectStatus(project.getProjectStatusName()); // result.add(actualProject); // }else{ // ProjectBoardBO planProject=new ProjectBoardBO(); // planProject.setProjectId(project.getId()); // planProject.setProjectName(project.getProjectName()); // planProject.setProject("计划"); // planProject.setStartDate(project.getBusEstimateStartTime()); // planProject.setEndDate(project.getBusEstimateCompleteTime()); // planProject.setProjectStatus(project.getProjectStatusName()); // result.add(planProject); // // ProjectBoardBO actualProject=new ProjectBoardBO(); // actualProject.setProjectId(project.getId()); // actualProject.setProjectName(project.getProjectName()); // actualProject.setProject("实际"); // actualProject.setStartDate(project.getBusActualStartTime()); // actualProject.setEndDate(project.getBusActualCompleteTime()); // actualProject.setProjectStatus(project.getProjectStatusName()); // result.add(actualProject); // } // // }); // 4.遍历循环所有项目,并根据每个项目的开始时间和结束时间来设置项目的日历状态,如果在时间内则projectStatus设置成1 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); final List> resultList2 = result.stream().map(projectBoardBO -> { Map tmp = new HashMap(); List projectCalendarList = new ArrayList<>(); tmp.put("no", projectBoardBO.getNo()); tmp.put("id", projectBoardBO.getProjectId()); tmp.put("project_name", projectBoardBO.getProjectName()); tmp.put("project", projectBoardBO.getProject()); tmp.put("start_date", null!=projectBoardBO.getStartDate()?projectBoardBO.getStartDate().format(dateTimeFormatter):""); tmp.put("end_date", null!=projectBoardBO.getEndDate()?projectBoardBO.getEndDate().format(dateTimeFormatter):""); if(null!=projectBoardBO.getStartDate() && null!=projectBoardBO.getEndDate()){ tmp.put("total_days", Duration.between(projectBoardBO.getStartDate(), projectBoardBO.getEndDate()).toDays()); }else{ tmp.put("total_days",0); } tmp.put("project_status", projectBoardBO.getProjectStatus()); calendarList.forEach(calCalendarBO -> { // 检查 calDate 是否在 startDate 和 endDate 之间 if (null != projectBoardBO.getStartDate() && null != projectBoardBO.getEndDate() && (calCalendarBO.getCalDate().isEqual(projectBoardBO.getStartDate()) || calCalendarBO.getCalDate().isAfter(projectBoardBO.getStartDate())) && (calCalendarBO.getCalDate().isEqual(projectBoardBO.getEndDate()) || calCalendarBO.getCalDate().isBefore(projectBoardBO.getEndDate()))) { // 设置状态为 1 calCalendarBO.setCalendarStatus(1); } else { // 设置状态为 0 (或其他默认值) calCalendarBO.setCalendarStatus(0); } projectCalendarList.add(calCalendarBO); tmp.put(calCalendarBO.getCalDate().format(dateTimeFormatter) ,calCalendarBO.getCalendarStatus()); }); // 将 projectCalendarList 设置到 projectBoardBO 的 calendarList 属性 projectBoardBO.setCalendarList(projectCalendarList); return tmp; }).collect(Collectors.toList()); List columns=new ArrayList<>(); calendarList.forEach(calCalendarBO -> { columns.add(calCalendarBO.getCalDate().format(dateTimeFormatter)); }); ProjectBoardColumnsDataBO projectBoardColumnsDataBO=new ProjectBoardColumnsDataBO(); projectBoardColumnsDataBO.setColumns(columns); projectBoardColumnsDataBO.setResultList(resultList2); return projectBoardColumnsDataBO; } @Override public boolean updateProjectProBusDate(UpdateProjectProBusDateDTO validator) { ProjectInfoDO projectInfoDO=new ProjectInfoDO(); BeanUtils.copyProperties(validator,projectInfoDO); return baseMapper.updateById(projectInfoDO)>0; } @Override public ProjectBoardColumnsDataBO getProjectBoardMonth(QueryProjectInfoDTO dto) { // 1.获取所有项目 List srcProjectList=projectInfoMapperCustom.getBoardProjectList(dto); // 3.查询所有的在项目的开始时间和结束时间的最早时间和最晚时间的日历 final List projectIdList = srcProjectList.stream().map(projectInfoBO -> projectInfoBO.getId()).collect(Collectors.toList()); // 3.1 根据项目id查找到项目的最大和最小时间 ProjectMinMaxDateBO projectMinMaxDateBO=projectInfoMapperCustom.getProjectMinMaxDateList(projectIdList); // 没有最大和最小时间 if(null==projectMinMaxDateBO){ projectMinMaxDateBO=projectInfoMapperCustom.getProjectMinMaxDateDefaultList(projectIdList); } CalendarPageDTO calendarPageDTO=new CalendarPageDTO(); calendarPageDTO.setStartDate(projectMinMaxDateBO.getMinDate()); calendarPageDTO.setEndDate(projectMinMaxDateBO.getMaxDate()); List calendarList=calCalendarMapperCustom.selectProjectCalendarList(calendarPageDTO); List calendarMonthList=calCalendarMapperCustom.selectProjectCalendarMonthList(calendarPageDTO); // 2.根据项目将一个项目转变成两个项目,根据计划时间和实际时间 List result=new ArrayList<>(); IntStream.range(0, srcProjectList.size()).forEach(index->{ ProjectInfoBO project=srcProjectList.get(index); if(dto.getProjectBoardType().equals("project")){ ProjectBoardBO planProject=new ProjectBoardBO(); planProject.setNo(index+1); planProject.setProjectId(project.getId()); planProject.setProjectName(project.getProjectName()); planProject.setProject("计划"); planProject.setStartDate(project.getProEstimateStartTime()); planProject.setEndDate(project.getProEstimateCompleteTime()); planProject.setProjectStatus(project.getProjectStatusName()); result.add(planProject); ProjectBoardBO actualProject=new ProjectBoardBO(); actualProject.setNo(index+1); actualProject.setProjectId(project.getId()); actualProject.setProjectName(project.getProjectName()); actualProject.setProject("实际"); actualProject.setStartDate(project.getProActualStartTime()); actualProject.setEndDate(project.getProActualCompleteTime()); actualProject.setProjectStatus(project.getProjectStatusName()); result.add(actualProject); }else{ ProjectBoardBO planProject=new ProjectBoardBO(); planProject.setNo(index+1); planProject.setProjectId(project.getId()); planProject.setProjectName(project.getProjectName()); planProject.setProject("计划"); planProject.setStartDate(project.getBusEstimateStartTime()); planProject.setEndDate(project.getBusEstimateCompleteTime()); planProject.setProjectStatus(project.getProjectStatusName()); result.add(planProject); ProjectBoardBO actualProject=new ProjectBoardBO(); actualProject.setNo(index+1); actualProject.setProjectId(project.getId()); actualProject.setProjectName(project.getProjectName()); actualProject.setProject("实际"); actualProject.setStartDate(project.getBusActualStartTime()); actualProject.setEndDate(project.getBusActualCompleteTime()); actualProject.setProjectStatus(project.getProjectStatusName()); result.add(actualProject); } }); // 4.遍历循环所有项目,并根据每个项目的开始时间和结束时间来设置项目的日历状态,如果在时间内则projectStatus设置成1 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); final List> resultList2 = result.stream().map(projectBoardBO -> { Map tmp = new HashMap(); List projectCalendarList = new ArrayList<>(); List projectCalendarMonthList = new ArrayList<>(); tmp.put("no", projectBoardBO.getNo()); tmp.put("id", projectBoardBO.getProjectId()); tmp.put("project_name", projectBoardBO.getProjectName()); tmp.put("project", projectBoardBO.getProject()); tmp.put("start_date", null!=projectBoardBO.getStartDate()?projectBoardBO.getStartDate().format(dateTimeFormatter):""); tmp.put("end_date", null!=projectBoardBO.getEndDate()?projectBoardBO.getEndDate().format(dateTimeFormatter):""); if(null!=projectBoardBO.getStartDate() && null!=projectBoardBO.getEndDate()){ tmp.put("total_days", Duration.between(projectBoardBO.getStartDate(), projectBoardBO.getEndDate()).toDays()); }else{ tmp.put("total_days",0); } tmp.put("project_status", projectBoardBO.getProjectStatus()); // calendarList.forEach(calCalendarBO -> { // // 检查 calDate 是否在 startDate 和 endDate 之间 // if (null != projectBoardBO.getStartDate() && null != projectBoardBO.getEndDate() // && (calCalendarBO.getCalDate().isEqual(projectBoardBO.getStartDate()) || calCalendarBO.getCalDate().isAfter(projectBoardBO.getStartDate())) // && (calCalendarBO.getCalDate().isEqual(projectBoardBO.getEndDate()) || calCalendarBO.getCalDate().isBefore(projectBoardBO.getEndDate()))) { // // 设置状态为 1 // calCalendarBO.setCalendarStatus(1); // } else { // // 设置状态为 0 (或其他默认值) // calCalendarBO.setCalendarStatus(0); // } // projectCalendarList.add(calCalendarBO); // // tmp.put(calCalendarBO.getCalDate().format(dateTimeFormatter) ,calCalendarBO.getCalendarStatus()); // // }); calendarMonthList.forEach(calCalendarMonthBO->{ // 检查 calDate 是否在 startDate 和 endDate 之间 if (null != projectBoardBO.getStartDate() && null != projectBoardBO.getEndDate()) { calCalendarMonthBO.setCalendarStatus(isYearMonthWithinRange(Integer.valueOf(calCalendarMonthBO.getCalYear()), Integer.valueOf(calCalendarMonthBO.getCalMonth()),projectBoardBO.getStartDate(),projectBoardBO.getEndDate())==true?1:0); } else { // 设置状态为 0 (或其他默认值) calCalendarMonthBO.setCalendarStatus(0); } projectCalendarMonthList.add(calCalendarMonthBO); tmp.put((getFirstDayOfMonth(Integer.valueOf(calCalendarMonthBO.getCalYear()),Integer.valueOf(calCalendarMonthBO.getCalMonth())).format(dateTimeFormatter)),calCalendarMonthBO.getCalendarStatus()); }); // 将 projectCalendarList 设置到 projectBoardBO 的 calendarList 属性 projectBoardBO.setCalendarList(projectCalendarList); return tmp; }).collect(Collectors.toList()); List columns=new ArrayList<>(); calendarList.forEach(calCalendarBO -> { columns.add(calCalendarBO.getCalDate().format(dateTimeFormatter)); }); List monthColumns=new ArrayList<>(); calendarMonthList.forEach(calCalendarBO -> { // monthColumns.add(calCalendarBO.getCalYear()+"-"+calCalendarBO.getCalMonth()); monthColumns.add(getFirstDayOfMonth(Integer.valueOf(calCalendarBO.getCalYear()),Integer.valueOf(calCalendarBO.getCalMonth())).format(dateTimeFormatter)); }); ProjectBoardColumnsDataBO projectBoardColumnsDataBO=new ProjectBoardColumnsDataBO(); projectBoardColumnsDataBO.setColumns(monthColumns); // projectBoardColumnsDataBO.setMonthColumns(monthColumns); projectBoardColumnsDataBO.setResultList(resultList2); return projectBoardColumnsDataBO; } @Override public List getProjectHourStatisticsConfirmed(QueryProjectInfoDTO dto) { dto.setIsConfirm(1); return projectInfoMapperCustom.getProjectHourStatistics(dto); } @Override public List getProjectHourStatisticsAll(QueryProjectInfoDTO dto) { return projectInfoMapperCustom.getProjectHourStatistics(dto); } @Override public List getReportList(QueryProjectInfoDTO dto) { return projectInfoMapperCustom.getReportList(dto); } public static boolean isYearMonthWithinRange(int year, int month, LocalDateTime startTime, LocalDateTime endTime) { // 创建指定年份和月份的YearMonth对象 YearMonth targetYearMonth = YearMonth.of(year, month); // 获取指定年份和月份的第1天和最后1天的LocalDate对象 LocalDate startOfMonth = targetYearMonth.atDay(1); LocalDate endOfMonth = targetYearMonth.atEndOfMonth(); // 转换为LocalDateTime对象,开始时间为00:00:00,结束时间为23:59:59 LocalDateTime startOfMonthTime = startOfMonth.atStartOfDay(); LocalDateTime endOfMonthTime = endOfMonth.atTime(23, 59, 59); // 判断targetYearMonth是否在startTime和endTime之间 return !startOfMonthTime.isAfter(endTime) && !endOfMonthTime.isBefore(startTime); } public static LocalDateTime getFirstDayOfMonth(int year, int month) { // 创建指定年份和月份的YearMonth对象 YearMonth yearMonth = YearMonth.of(year, month); // 获取该月份的第一天 LocalDate firstDay = yearMonth.atDay(1); // 将LocalDate转换为LocalDateTime,时间为00:00:00 return firstDay.atStartOfDay(); } }