package com.cloudroam.service.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cloudroam.common.LocalUser;
import com.cloudroam.common.enumeration.FileReTypeEnum;
import com.cloudroam.common.enumeration.ProjectTaskAssignStatusEnum;
import com.cloudroam.common.enumeration.ProjectTaskStatusEnum;
import com.cloudroam.dto.projectDaily.QueryProjectDailyDTO;
import com.cloudroam.dto.projectTask.*;
import com.cloudroam.mapper.ProjectTaskMapperCustom;
import com.cloudroam.model.*;
import com.cloudroam.mapper.ProjectTaskMapper;
import com.cloudroam.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloudroam.vo.projectTask.ProjectTaskVO;
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 javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author generator@TaoJie
* @since 2024-12-30
*/
@Service
public class ProjectTaskServiceImpl extends ServiceImpl implements ProjectTaskService {
@Autowired
private ProjectInfoService projectInfoService;
@Autowired
private ProjectModuleService projectModuleService;
@Autowired
private ProjectTaskUserReService projectTaskUserReService;
@Autowired
private ProjectTaskMapperCustom projectTaskMapperCustom;
@Autowired
private ProjectTaskEvaluatorService projectTaskEvaluatorService;
@Autowired
private ProjectTaskDeveloperService projectTaskDeveloperService;
@Autowired
private UserService userService;
@Autowired
private Validator validator; // 注入 Spring 的 Validator
@Autowired
private ProjectDailyService projectDailyService;
@Autowired
private LinFileReService fileReService;
@Transactional
@Override
public boolean createProjectTask(CreateProjectTaskDTO validator) {
UserDO user = LocalUser.getLocalUser();
ProjectInfoDO projectInfoDO = projectInfoService.getById(validator.getProjectId());
if(Objects.isNull(projectInfoDO)){
throw new NotFoundException("项目不存在");
}
ProjectModuleDO projectModuleDO = projectModuleService.getById(validator.getModuleId());
if(Objects.isNull(projectModuleDO)){
throw new NotFoundException("项目模块不存在");
}
ProjectTaskDO projectTaskDO=new ProjectTaskDO();
BeanUtils.copyProperties(validator,projectTaskDO);
projectTaskDO.setProjectName(projectInfoDO.getProjectName());
projectTaskDO.setModuleName(projectModuleDO.getModuleName());
projectTaskDO.setId(IdUtil.simpleUUID());
// 设置任务状态为 未开始
projectTaskDO.setStatus(ProjectTaskStatusEnum.FN.getCode());
// 设置排配状态为 待排配
projectTaskDO.setAssignStatus(ProjectTaskAssignStatusEnum.AN.getCode());
projectTaskDO.create(String.valueOf(user.getId()),user.getNickname());
// 遍历评估表
List evaluatorDOList = validator.getEvaluatorUsers().stream().map(userId -> {
ProjectTaskEvaluatorDO projectTaskEvaluatorDO = new ProjectTaskEvaluatorDO();
projectTaskEvaluatorDO.setId(IdUtil.simpleUUID());
projectTaskEvaluatorDO.setTaskId(projectTaskDO.getId());
projectTaskEvaluatorDO.setEvaluatorId(userId);
UserDO evaluatorUser = userService.getUserById(userId);
projectTaskEvaluatorDO.setEvaluatorName(evaluatorUser.getNickname());
projectTaskEvaluatorDO.create(String.valueOf(user.getId()), user.getNickname());
return projectTaskEvaluatorDO;
}).collect(Collectors.toList());
projectTaskEvaluatorService.saveBatch(evaluatorDOList);
// 保存任务附件信息
fileReService.saveFileAnyReByReIdType(projectTaskDO.getId(),validator.getUploadFileList(),FileReTypeEnum.PROJECT_TASK);
return this.baseMapper.insert(projectTaskDO)>0;
}
@Transactional
@Override
public boolean deleteProjectTask(String id) {
UserDO user = LocalUser.getLocalUser();
if(StrUtil.isBlank(id)){
throw new NotFoundException("传入的Id不能为空");
}
ProjectTaskDO existProjectTask = getById(id);
if(existProjectTask == null){
throw new NotFoundException("项目任务不存在");
}
ProjectTaskDO projectTaskDO=new ProjectTaskDO();
projectTaskDO.setId(id);
projectTaskDO.delete(String.valueOf(user.getId()), user.getNickname());
return removeById(id);
}
@Transactional
@Override
public boolean updateProjectTask(CreateProjectTaskDTO validator) {
UserDO user = LocalUser.getLocalUser();
if(StrUtil.isBlank(validator.getId())){
throw new NotFoundException("传入的Id不能为空");
}
ProjectInfoDO projectInfoDO = projectInfoService.getById(validator.getProjectId());
if(Objects.isNull(projectInfoDO)){
throw new NotFoundException("项目不存在");
}
ProjectModuleDO projectModuleDO = projectModuleService.getById(validator.getModuleId());
if(Objects.isNull(projectModuleDO)){
throw new NotFoundException("项目模块不存在");
}
ProjectTaskDO existProjectTask = getById(validator.getId());
if(existProjectTask == null){
throw new NotFoundException("项目任务不存在");
}
BeanUtils.copyProperties(validator,existProjectTask);
existProjectTask.update(String.valueOf(user.getId()), user.getNickname());
existProjectTask.setProjectName(projectInfoDO.getProjectName());
existProjectTask.setModuleName(projectModuleDO.getModuleName());
// 先删除评估表
projectTaskEvaluatorService.deleteByTaskId(existProjectTask.getId());
// 遍历评估表
List evaluatorDOList = validator.getEvaluatorUsers().stream().map(userId -> {
ProjectTaskEvaluatorDO projectTaskEvaluatorDO = new ProjectTaskEvaluatorDO();
projectTaskEvaluatorDO.setId(IdUtil.simpleUUID());
projectTaskEvaluatorDO.setTaskId(existProjectTask.getId());
projectTaskEvaluatorDO.setEvaluatorId(userId);
UserDO evaluatorUser = userService.getUserById(userId);
projectTaskEvaluatorDO.setEvaluatorName(evaluatorUser.getNickname());
projectTaskEvaluatorDO.create(String.valueOf(user.getId()), user.getNickname());
return projectTaskEvaluatorDO;
}).collect(Collectors.toList());
projectTaskEvaluatorService.saveBatch(evaluatorDOList);
// 保存任务附件信息
fileReService.saveFileAnyReByReIdType(existProjectTask.getId(),validator.getUploadFileList(),FileReTypeEnum.PROJECT_TASK);
return baseMapper.updateById(existProjectTask)>0;
}
@Override
public ProjectTaskVO getProjectTaskById(String id) {
if(StrUtil.isBlank(id)){
throw new NotFoundException("传入的Id不能为空");
}
ProjectTaskDO projectTaskDO = getById(id);
// 追加关联人员信息
ProjectTaskVO projectTaskVO=new ProjectTaskVO();
BeanUtils.copyProperties(projectTaskDO,projectTaskVO);
// 项目信息
ProjectInfoDO projectInfoDO = projectInfoService.getById(projectTaskDO.getProjectId());
if(!Objects.isNull(projectInfoDO)){
projectTaskVO.setProjectNameSrc(projectInfoDO.getProjectName());
}
// 模块信息
ProjectModuleDO projectModuleDO = projectModuleService.getById(projectTaskDO.getModuleId());
if(!Objects.isNull(projectModuleDO)){
projectTaskVO.setModuleNameSrc(projectModuleDO.getModuleName());
}
// 获取评估人员
List projectTaskEvaluatorDOList = projectTaskEvaluatorService.getProjectTaskEvaluatorByTaskId(projectTaskVO.getId());
projectTaskVO.setEvaluatorUsers(projectTaskEvaluatorDOList);
// 获取已排配的日志信息
QueryProjectDailyDTO dailyDTO=new QueryProjectDailyDTO();
dailyDTO.setTaskId(id);
List projectDailyList = projectDailyService.getProjectDailyList(dailyDTO);
projectTaskVO.setProjectDailyList(projectDailyList);
// 获取上传的附件信息
List fileList=fileReService.getFileByReIdType(projectTaskVO.getId(),FileReTypeEnum.PROJECT_TASK);
projectTaskVO.setFileList(fileList);
return projectTaskVO;
}
@Override
public IPage getProjectTaskPage(QueryProjectTaskDTO dto) {
Page page=new Page(dto.getPage(),dto.getCount());
if(StringUtils.isNotBlank(dto.getModuleId())){
// 查看模块下的所有子模块
List moduleIds=projectModuleService.getChildrenModuleIds(dto.getModuleId());
if(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);
}
}
IPage projectTaskVOIPage = projectTaskMapperCustom.selectProjectTaskPage(page, dto);
// 遍历查看所有用户
projectTaskVOIPage.getRecords().stream().forEach(projectTaskVO -> {
// 查找评估人员
List projectTaskEvaluatorDOList = projectTaskEvaluatorService.getProjectTaskEvaluatorByTaskId(projectTaskVO.getId());
projectTaskVO.setEvaluatorUsers(projectTaskEvaluatorDOList);
// 查找开发人员
List projectTaskDeveloperDOList = projectTaskDeveloperService.getProjectTaskDeveloperByTaskId(projectTaskVO.getId());
projectTaskVO.setDeveloperUsers(projectTaskDeveloperDOList);
// 获取上传的附件信息
List fileList=fileReService.getFileByReIdType(projectTaskVO.getId(),FileReTypeEnum.PROJECT_TASK);
projectTaskVO.setFileList(fileList);
});
return projectTaskVOIPage;
}
@Override
@Transactional
public void createProjectTaskBatch(CreateProjectTaskBatchDTO validator) {
validator.getProjectTaskList().stream().forEach(this::validateTask);
validator.getProjectTaskList().stream().forEach(projectTask -> {
createProjectTask(projectTask);
});
}
@Override
public IPage getProjectTaskMineTodoPage(QueryProjectTaskDTO dto) {
UserDO curUser = LocalUser.getLocalUser();
dto.setCurDeveloperUserId(String.valueOf(curUser.getId()));
Page page=new Page(dto.getPage(),dto.getCount());
if(StringUtils.isNotBlank(dto.getModuleId())){
// 查看模块下的所有子模块
List moduleIds=projectModuleService.getChildrenModuleIds(dto.getModuleId());
if(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);
}
}
IPage projectTaskVOIPage = projectTaskMapperCustom.getProjectTaskMineTodoPage(page, dto);
// 遍历查看所有用户
projectTaskVOIPage.getRecords().stream().forEach(projectTaskVO -> {
// 查找评估人员
List projectTaskEvaluatorDOList = projectTaskEvaluatorService.getProjectTaskEvaluatorByTaskId(projectTaskVO.getId());
projectTaskVO.setEvaluatorUsers(projectTaskEvaluatorDOList);
// 查找开发人员
List projectTaskDeveloperDOList = projectTaskDeveloperService.getProjectTaskDeveloperByTaskId(projectTaskVO.getId());
projectTaskVO.setDeveloperUsers(projectTaskDeveloperDOList);
});
return projectTaskVOIPage;
}
@Override
@Transactional
public boolean getStartTaskById(String taskId) {
UserDO curUser = LocalUser.getLocalUser();
ProjectTaskDO projectTaskDO = getById(taskId);
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
// 需要将当前开发人员设置为进行中
ProjectTaskDeveloperDO projectTaskDeveloperDO = projectTaskDeveloperService.getProjectTaskDeveloperByTaskIdDeveloperId(taskId,String.valueOf(curUser.getId()));
if(null!=projectTaskDeveloperDO){
projectTaskDeveloperDO.setDeveloperTaskStatus(ProjectTaskStatusEnum.P.getCode());
// 获取当前开发人员开始时间和累计工时
QueryTaskDailyDTO projectDailyTaskInfo = projectDailyService.getProjectDailyTaskInfo(taskId, String.valueOf(curUser.getId()));
projectTaskDeveloperDO.setDeveloperStartTime(projectDailyTaskInfo.getMinStartTime());
projectTaskDeveloperDO.setDeveloperEndTime(projectDailyTaskInfo.getMaxEndTime());
projectTaskDeveloperDO.setDeveloperHour(projectDailyTaskInfo.getActualHours());
projectTaskDeveloperService.updateById(projectTaskDeveloperDO);
}
// 将任务状态设置称进行中
projectTaskDO.setStatus(ProjectTaskStatusEnum.P.getCode());
return baseMapper.updateById(projectTaskDO)>0;
}
@Override
@Transactional
public boolean getFinishTaskById(String taskId) {
UserDO curUser = LocalUser.getLocalUser();
boolean res=false;
ProjectTaskDO projectTaskDO = getById(taskId);
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
// TODO 需要查看当天的任务日志是否有未完成的
int projectDailyUnCommited =projectDailyService.getProjectTaskDailyUnCommited(taskId,String.valueOf(curUser.getId()));
if(projectDailyUnCommited>0){
throw new ForbiddenException(20000);
}
// 需要将当前开发人员设置为已完成
// 需要将当前开发人员设置为进行中
ProjectTaskDeveloperDO projectTaskDeveloperDO = projectTaskDeveloperService.getProjectTaskDeveloperByTaskIdDeveloperId(taskId,String.valueOf(curUser.getId()));
if(null!=projectTaskDeveloperDO){
projectTaskDeveloperDO.setDeveloperTaskStatus(ProjectTaskStatusEnum.T.getCode());
res=projectTaskDeveloperService.updateById(projectTaskDeveloperDO);
}
// 获取当前开发人员开始时间和累计工时
QueryTaskDailyDTO projectDailyTaskInfo = projectDailyService.getProjectDailyTaskInfo(taskId, null);
projectTaskDO.setActualBeginDate(projectDailyTaskInfo.getMinStartTime());
projectTaskDO.setActualEndDate(projectDailyTaskInfo.getMaxEndTime());
projectTaskDO.setActualHour(projectDailyTaskInfo.getActualHours());
// 这里要查看所有所有developer的状态都是待测试的
List projectTaskDeveloperByTaskId = projectTaskDeveloperService.getProjectTaskDeveloperByTaskId(taskId);
// 假设 ProjectTaskDeveloperDO 有一个 getStatus() 方法返回状态
long count = projectTaskDeveloperByTaskId.stream()
.filter(developer -> developer.getDeveloperTaskStatus().equals(ProjectTaskStatusEnum.T.getCode())) // 过滤状态为 'T' 的记录
.count();
if(count==projectTaskDeveloperByTaskId.size()){
// 点击完成,任务进入待测试
projectTaskDO.setStatus(ProjectTaskStatusEnum.T.getCode());
}
// 获取所有已提交的任务的实际工时,与任务的计划工时相除得到百分比
QueryProjectTaskHoursDTO processPercent=projectDailyService.getCommitedActualHoursStatisticByTaskId(taskId);
if(null!=processPercent && null!=processPercent.getActualHours() && null!=projectTaskDO.getPlanHour()){
BigDecimal process = processPercent.getActualHours()
.divide(projectTaskDO.getPlanHour(), 10, RoundingMode.HALF_UP) // 指定小数位数和舍入模式
.multiply(BigDecimal.valueOf(100));
projectTaskDO.setProcess(process);
}
return baseMapper.updateById(projectTaskDO)>0;
}
@Transactional
@Override
public boolean getTestPass(String taskId) {
UserDO curUser = LocalUser.getLocalUser();
ProjectTaskDO projectTaskDO = getById(taskId);
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
projectTaskDO.setTestUserId(String.valueOf(curUser.getId()));
projectTaskDO.setTestUserName(curUser.getNickname());
projectTaskDO.setTestTime(LocalDateTime.now());
projectTaskDO.setTestStatus(ProjectTaskStatusEnum.TY.getCode());
projectTaskDO.setStatus(ProjectTaskStatusEnum.TY.getCode());
return baseMapper.updateById(projectTaskDO)>0;
}
@Transactional
@Override
public boolean getTestUnpass(String taskId) {
UserDO curUser = LocalUser.getLocalUser();
ProjectTaskDO projectTaskDO = getById(taskId);
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
projectTaskDO.setTestUserId(String.valueOf(curUser.getId()));
projectTaskDO.setTestUserName(curUser.getNickname());
projectTaskDO.setTestTime(LocalDateTime.now());
projectTaskDO.setTestStatus(ProjectTaskStatusEnum.TN.getCode());
projectTaskDO.setStatus(ProjectTaskStatusEnum.TN.getCode());
return baseMapper.updateById(projectTaskDO)>0;
}
@Transactional
@Override
public boolean getConfirm(String taskId) {
UserDO curUser = LocalUser.getLocalUser();
ProjectTaskDO projectTaskDO = getById(taskId);
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
projectTaskDO.setConfirmUserId(String.valueOf(curUser.getId()));
projectTaskDO.setConfirmUserName(curUser.getNickname());
projectTaskDO.setConfirmTime(LocalDateTime.now());
projectTaskDO.setStatus(ProjectTaskStatusEnum.FY.getCode());
return baseMapper.updateById(projectTaskDO)>0;
}
@Transactional
@Override
public boolean editProcess(CreateProjectTaskProcessDTO validator) {
UserDO curUser = LocalUser.getLocalUser();
ProjectTaskDO projectTaskDO = getById(validator.getId());
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
BeanUtils.copyProperties(validator,projectTaskDO);
return baseMapper.updateById(projectTaskDO)>0;
}
@Override
@Transactional
public boolean deleteProjectTaskDaily(String dailyId) {
UserDO curUser = LocalUser.getLocalUser();
// 删除日志信息
ProjectDailyDO projectDailyDO = projectDailyService.getById(dailyId);
if(Objects.isNull(projectDailyDO)){
throw new NotFoundException("任务排配日志信息不存在!");
}
projectDailyDO.delete(String.valueOf(curUser.getId()),curUser.getNickname());
projectDailyService.removeById(dailyId);
// 查看当前开发当前任务的日志记录,如果没有则更新当前开发的任务状态设置为未开始
if(StringUtils.isNotBlank(projectDailyDO.getTaskId())){
String createUserId = projectDailyDO.getCreateUserId();
String taskId = projectDailyDO.getTaskId();
QueryTaskDailyDTO projectDailyTaskInfo = projectDailyService.getProjectDailyTaskInfo(taskId, createUserId);
if(Objects.isNull(projectDailyTaskInfo)){
// 如果当前人员下没有当前任务日志,那么则删除当前任务的开发信息
projectTaskDeveloperService.deleteProjectTaskDeveloperByTaskIdDeveloperId(taskId, createUserId);
}
}
// 如果当前任务下一条日志记录都没有,那么更新当前任务为未开始
return updateProjectTask2Unstart(projectDailyDO.getTaskId());
}
@Transactional
@Override
public boolean updateProjectTaskDaily(CreateProjectTaskDailyDTO validator) {
if(StringUtils.isNotBlank(validator.getId())){
ProjectDailyDO projectDailyDO = projectDailyService.getById(validator.getId());
if(Objects.isNull(projectDailyDO)){
throw new NotFoundException("任务排配日志信息不存在!");
}
// 查看排配日期是否小于今天,如果小于今天则抛出,只是比年月日
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date()); // 设置为当前时间
calendar.set(Calendar.HOUR_OF_DAY, 0); // 设置时为 00
calendar.set(Calendar.MINUTE, 0); // 设置分为 00
calendar.set(Calendar.SECOND, 0); // 设置秒为 00
calendar.set(Calendar.MILLISECOND, 0); // 设置毫秒为 00
Date todayAtMidnight = calendar.getTime(); // 获取清除时间部分后的日期
if(validator.getDailyDate().before(todayAtMidnight)){
throw new ForbiddenException(20003);
}
projectDailyDO.setDailyContent(validator.getDailyContent());
projectDailyDO.setEstimatedHours(validator.getEstimatedHours());
projectDailyDO.setRemark(validator.getRemark());
projectDailyService.updateById(projectDailyDO);
// 查看当前排配的总工时是否大于整个任务的计划工时
projectDailyService.checkProjectDailyTaskPlanHours(projectDailyDO.getTaskId());
return true;
}
return false;
}
@Transactional
@Override
public boolean updateProjectTaskPlan(CreateProjectTaskPlanDTO validator) {
if(StringUtils.isNotBlank(validator.getId())){
ProjectTaskDO projectTaskDO = getById(validator.getId());
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
QueryProjectDailyDTO queryProjectDailyDTO = new QueryProjectDailyDTO();
queryProjectDailyDTO.setTaskId(validator.getId());
List projectDailyList = projectDailyService.getProjectDailyList(queryProjectDailyDTO);
// 计划工时不能小于已经分配的工时
if(CollectionUtils.isNotEmpty(projectDailyList)){
BigDecimal totalPlanHour = projectDailyList.stream()
.map(ProjectDailyDO::getEstimatedHours) // 获取 BigDecimal 类型的 plan_hour
.reduce(BigDecimal.ZERO, BigDecimal::add); // 求和
// 检查排配时间是否大于计划时间
if(validator.getPlanHour().compareTo(totalPlanHour)<0){
throw new ForbiddenException(20004);
}
}
// 判断结束时间是否大于开始时间
if (validator.getPlanEndDate().isBefore(validator.getPlanBeginDate())) { // 使用 isBefore()
throw new ForbiddenException(20005); // 结束时间小于开始时间
}
projectTaskDO.setPlanHour(validator.getPlanHour());
projectTaskDO.setPlanBeginDate(validator.getPlanBeginDate());
projectTaskDO.setPlanEndDate(validator.getPlanEndDate());
// 重新设置process
// 获取所有已提交的任务的实际工时,与任务的计划工时相除得到百分比
QueryProjectTaskHoursDTO processPercent=projectDailyService.getCommitedActualHoursStatisticByTaskId(validator.getId());
if(null!=processPercent && null!=processPercent.getActualHours() && null!=projectTaskDO.getPlanHour()){
BigDecimal process = processPercent.getActualHours()
.divide(projectTaskDO.getPlanHour(), 10, RoundingMode.HALF_UP) // 指定小数位数和舍入模式
.multiply(BigDecimal.valueOf(100));
projectTaskDO.setProcess(process);
}
return baseMapper.updateById(projectTaskDO)>0;
}
return false;
}
private boolean updateProjectTask2Unstart(String taskId) {
// 如果任务下没有开发人员,那么更新当前任务的状态为未开始
List projectTaskDeveloperByTaskId = projectTaskDeveloperService.getProjectTaskDeveloperByTaskId(taskId);
if(CollectionUtils.isEmpty(projectTaskDeveloperByTaskId)){
ProjectTaskDO projectTaskDO = getById(taskId);
if(Objects.isNull(projectTaskDO)){
throw new NotFoundException("任务信息不存在!");
}
projectTaskDO.setStatus(ProjectTaskStatusEnum.FN.getCode());
projectTaskDO.setAssignStatus(ProjectTaskAssignStatusEnum.AN.getCode());
return baseMapper.updateById(projectTaskDO)>0;
}
return true;
}
public void validateTask(CreateProjectTaskDTO task) {
// 手动调用验证
Set> violations = validator.validate(task);
// 如果有验证错误
if (!violations.isEmpty()) {
StringBuilder errorMessage = new StringBuilder("批量任务保存失败: ");
for (ConstraintViolation violation : violations) {
errorMessage.append(violation.getMessage()).append(", ");
}
throw new ConstraintViolationException(errorMessage.toString(),violations);
}
}
}