package com.cloudroam.service.impl;
import cn.hutool.core.date.DateUtil;
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.extension.plugins.pagination.Page;
import com.cloudroam.bo.meeting.MeetingDateUserDaily;
import com.cloudroam.bo.meeting.MeetingUserDaily;
import com.cloudroam.bo.ProjectDailyBO;
import com.cloudroam.bo.ProjectStatisticsBO;
import com.cloudroam.bo.businessDaily.BusinessDailyBO;
import com.cloudroam.common.LocalUser;
import com.cloudroam.common.enumeration.*;
import com.cloudroam.dto.businessDaily.BusinessDailyPageDTO;
import com.cloudroam.dto.meeting.MeetingPageDTO;
import com.cloudroam.dto.projectDaily.*;
import com.cloudroam.dto.projectDailyMain.QueryProjectDailyMainDTO;
import com.cloudroam.dto.projectTask.QueryProjectTaskHoursDTO;
import com.cloudroam.dto.projectTask.QueryTaskDailyDTO;
import com.cloudroam.mapper.ProjectDailyMapperCustom;
import com.cloudroam.model.*;
import com.cloudroam.mapper.ProjectDailyMapper;
import com.cloudroam.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloudroam.util.DateUtils;
import com.cloudroam.util.JsonUtil;
import com.cloudroam.vo.projectDaily.ProjectDailyBoardVO;
import com.cloudroam.vo.projectDaily.ProjectDailyHourVO;
import com.cloudroam.vo.projectDaily.ProjectDailyStatisticsVO;
import io.github.talelin.autoconfigure.exception.ForbiddenException;
import io.github.talelin.autoconfigure.exception.NotFoundException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author generator@TaoJie
* @since 2023-08-09
*/
@Service
public class ProjectDailyServiceImpl extends ServiceImpl implements ProjectDailyService {
@Autowired
private ProjectDailyMapper projectDailyMapper;
@Autowired
private ProjectDailyMapperCustom projectDailyMapperCustom;
@Autowired
private UserService userService;
@Autowired
private ProjectDailyMainService projectDailyMainService;
@Autowired
private ProjectDailyService projectDailyService;
@Autowired
private AdminService adminService;
@Autowired
private BusinessDailyService businessDailyService;
@Autowired
private LinFileReService linFileReService;
@Autowired
private Validator validator; // 注入 Spring 的 Validator
@Autowired
private ProjectInfoService projectInfoService;
@Autowired
private ProjectModuleService projectModuleService;
@Autowired
private ProjectTaskDeveloperService projectTaskDeveloperService;
@Autowired
private ProjectTaskService projectTaskService;
@Override
@Transactional
public boolean createProjectDaily(CreateOrUpdateProjectDailyDTO validator) {
ProjectDailyDO projectDailyDO=new ProjectDailyDO();
UserDO user = LocalUser.getLocalUser();
BeanUtils.copyProperties(validator,projectDailyDO);
projectDailyDO.setId(IdUtil.simpleUUID());
projectDailyDO.create(String.valueOf(user.getId()),user.getNickname());
return projectDailyMapper.insert(projectDailyDO)>0;
}
@Override
public IPage getProjectDailyPage(QueryProjectDailyDTO dto) {
// -1 代表所有人
if(dto.getCreateUserId().equals("-1")){
dto.setCreateUserId(null);
}
Page page=new Page(dto.getPage(),dto.getCount());
// return projectDailyMapperCustom.selectProjectDailyPage(page,dto.getKeyword()
// ,dto.getDailyDate(),dto.getDailyType(),dto.getDailyStatus(),dto.getProjectId()
// ,dto.getCreateUserId(),dto.getIsCommit(),dto.getIsConfirm());
if(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(dto.getModuleId())){
// 查看模块下的所有子模块
List moduleIds=projectModuleService.getChildrenModuleIds(dto.getModuleId());
if(com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(moduleIds)&&moduleIds.size()>0){
List moduleIdList=moduleIds.stream().map(ProjectModuleDO::getId).collect(Collectors.toList());
moduleIdList.add(dto.getModuleId());
// 查找所有模块下的id
dto.setModuleIds(moduleIdList);
}else{
List moduleIdList=new ArrayList<>();
moduleIdList.add(dto.getModuleId());
dto.setModuleIds(moduleIdList);
}
}
return projectDailyMapperCustom.selectProjectDailyTaskPage(page,dto);
}
@Override
@Transactional
public boolean removeByIdLogic(String id, Date dailyDate) {
UserDO user = LocalUser.getLocalUser();
ProjectDailyDO projectDailyDO=new ProjectDailyDO();
projectDailyDO.setId(id);
projectDailyDO.setIsDeleted(DeletedEnum.DELETED_YES.getCode());
projectDailyDO.setDeleteTime(LocalDateTime.now());
projectDailyDO.setDeleteUserId(String.valueOf(user.getId()));
projectDailyDO.setDeleteUserName(user.getNickname());
// 将当天所有的日志列表都设置为未确认
this.unCommitProjectDaily(dailyDate,String.valueOf(user.getId()));
// 将projectDailyMain 的日志设置为未提交
projectDailyMainService.unCommitProjectDailyMain(dailyDate,String.valueOf(user.getId()));
return projectDailyMapper.updateById(projectDailyDO)>0;
}
@Override
public List getAllUsers(QueryProjectDailyDTO dto) {
// 过滤掉管理员账户
return userService.getAllUsers(dto);
}
@Override
public ProjectDailyBoardVO getProjectDailyBoardList(QueryProjectDailyBoardDTO dto) {
// 1.根据当前登录人所在的分组,根据分组来查看看板
UserDO userDO=LocalUser.getLocalUser();
List groupDOList=userService.getUserGroups(userDO.getId());
// 2.获取所有分组下的人
Set userDOSet=new HashSet<>();
List groupUserList=new ArrayList<>();
boolean managerFlag=false;
for (GroupDO groupDO: groupDOList) {
List groupsUserList = adminService.getGroupsUserList(groupDO.getId());
userDOSet.addAll(groupsUserList);
if(!managerFlag && groupDO.getName().equals(GroupLevel2Enum.MANAGER.getName())){
managerFlag=true;
}
}
List userList =new ArrayList<>();
Integer rootUserId = userService.getRootUserId();
if(Objects.equals(rootUserId,userDO.getId())||managerFlag){
//root系统管理员或者项目经理可以查看所有用户的信息
// 获取所有人员列表
groupUserList=this.getAllUsers(new QueryProjectDailyDTO());
}else{
// 根据分组获取人员列表
userList = new ArrayList<>(userDOSet);
groupUserList=userList;
}
String startDate=dto.getStartDate();
String endDate = dto.getEndDate();
// 根据条件过滤,过滤掉不在不展示的人员,并且过滤掉离职日期不在查询的开始时间和结束时间之内
groupUserList = getDutyShowBoardUserDOs(groupUserList,startDate,endDate);
//获取开始时间和结束时间的时间范围
List dateRangeDays = DateUtils.getDateRangeDays(startDate, endDate);
List