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;
|
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author generator@TaoJie
|
* @since 2023-08-08
|
*/
|
@Service
|
public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, ProjectInfoDO> implements ProjectInfoService {
|
|
@Autowired
|
private ProjectInfoMapperCustom projectInfoMapperCustom;
|
@Autowired
|
private ProjectInfoMapper projectInfoMapper;
|
|
@Autowired
|
private CalCalendarMapperCustom calCalendarMapperCustom;
|
|
@Override
|
public IPage<ProjectInfoBO> getProjectInfoPage(QueryProjectInfoDTO dto) {
|
Page<ProjectInfoBO> page=new Page<ProjectInfoBO>(dto.getPage(),dto.getCount());
|
// return projectInfoMapperCustom.selectProjectInfoPage(page,dto.getKeyword(),dto.getStatus(),dto.getStage(),dto.getType());
|
|
return projectInfoMapperCustom.selectProjectInfoPageByDTO(page,dto);
|
}
|
|
@Override
|
public List<ProjectInfoDO> getProjectInfoList(QueryProjectInfoDTO dto) {
|
|
LambdaQueryWrapper<ProjectInfoDO> 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<ProjectUserStatisticsBO> getProjectHourStatistics(QueryProjectInfoDTO dto) {
|
|
return projectInfoMapperCustom.getProjectHourStatistics(dto);
|
}
|
|
@Override
|
public ProjectInfoBO getDetailById(String id) {
|
return projectInfoMapperCustom.getDetailById(id);
|
}
|
|
@Override
|
public List<ProjectBoardBO> getProjectBoard(QueryProjectInfoDTO dto) {
|
|
// 1.获取所有项目
|
|
List<ProjectInfoBO> srcProjectList=projectInfoMapperCustom.getBoardProjectList(dto);
|
|
// 3.查询所有的在项目的开始时间和结束时间的最早时间和最晚时间的日历
|
final List<String> 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<CalCalendarBO> calendarList=calCalendarMapperCustom.selectProjectCalendarList(calendarPageDTO);
|
|
|
|
// 2.根据项目将一个项目转变成两个项目,根据计划时间和实际时间
|
List<ProjectBoardBO> 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<CalCalendarBO> 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<ProjectInfoBO> srcProjectList=projectInfoMapperCustom.getBoardProjectList(dto);
|
|
// 3.查询所有的在项目的开始时间和结束时间的最早时间和最晚时间的日历
|
final List<String> 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<CalCalendarBO> calendarList=calCalendarMapperCustom.selectProjectCalendarList(calendarPageDTO);
|
|
|
|
// 2.根据项目将一个项目转变成两个项目,根据计划时间和实际时间
|
List<ProjectBoardBO> 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<Map<String, Object>> resultList2 = result.stream().map(projectBoardBO -> {
|
Map<String, Object> tmp = new HashMap<String, Object>();
|
List<CalCalendarBO> 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<String> 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<ProjectInfoBO> srcProjectList=projectInfoMapperCustom.getBoardProjectList(dto);
|
|
// 3.查询所有的在项目的开始时间和结束时间的最早时间和最晚时间的日历
|
final List<String> 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<CalCalendarBO> calendarList=calCalendarMapperCustom.selectProjectCalendarList(calendarPageDTO);
|
List<CalCalendarBO> calendarMonthList=calCalendarMapperCustom.selectProjectCalendarMonthList(calendarPageDTO);
|
|
|
|
// 2.根据项目将一个项目转变成两个项目,根据计划时间和实际时间
|
List<ProjectBoardBO> 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<Map<String, Object>> resultList2 = result.stream().map(projectBoardBO -> {
|
Map<String, Object> tmp = new HashMap<String, Object>();
|
List<CalCalendarBO> projectCalendarList = new ArrayList<>();
|
List<CalCalendarBO> 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<String> columns=new ArrayList<>();
|
calendarList.forEach(calCalendarBO -> {
|
columns.add(calCalendarBO.getCalDate().format(dateTimeFormatter));
|
});
|
|
List<String> 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<ProjectUserStatisticsBO> getProjectHourStatisticsConfirmed(QueryProjectInfoDTO dto) {
|
dto.setIsConfirm(1);
|
return projectInfoMapperCustom.getProjectHourStatistics(dto);
|
}
|
|
@Override
|
public List<ProjectUserStatisticsBO> getProjectHourStatisticsAll(QueryProjectInfoDTO dto) {
|
return projectInfoMapperCustom.getProjectHourStatistics(dto);
|
}
|
|
@Override
|
public List<ProjectInfoBO> 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();
|
}
|
|
}
|