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