package com.gkhy.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gkhy.common.exception.ServiceException; import com.gkhy.common.utils.DateUtils; import com.gkhy.common.utils.SecurityUtils; import com.gkhy.common.utils.StringUtils; import com.gkhy.system.domain.ProjectExpert; import com.gkhy.system.domain.ProjectExpertDetail; import com.gkhy.system.domain.ProjectFile; import com.gkhy.system.domain.ProjectManagement; import com.gkhy.system.domain.vo.request.*; import com.gkhy.system.domain.vo.response.*; import com.gkhy.system.mapper.ProjectExpertDetailMapper; import com.gkhy.system.mapper.ProjectExpertMapper; import com.gkhy.system.mapper.ProjectFileMapper; import com.gkhy.system.mapper.ProjectManagementMapper; import com.gkhy.system.service.IProjectManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * 项目管理Service业务层处理 * * @author expert * @date 2024-11-14 */ @Service public class ProjectManagementServiceImpl extends ServiceImpl implements IProjectManagementService { @Autowired private ProjectManagementMapper projectManagementMapper; @Autowired private ProjectExpertMapper projectExpertMapper; @Autowired private ProjectFileMapper projectFileMapper; @Autowired private ProjectExpertDetailMapper projectExpertDetailMapper; /** * 查询项目管理 * * @param id 项目管理主键 * @return 项目管理 */ @Override public ProjectManagement selectProjectManagementById(Long id) { return projectManagementMapper.selectProjectManagementById(id); } /** * 查询项目管理列表 * * @param projectManagement 项目管理 * @return 项目管理 */ @Override public List selectProjectManagementList(ProjectManagement projectManagement) { return projectManagementMapper.selectProjectManagementList(projectManagement); } /** * 新增项目管理 * * @param projectManagement 项目管理 * @return 结果 */ @Override public Long insertProjectManagement(ProjectManageSaveReq projectManagement) { ProjectManagement projectManagementSave = new ProjectManagement(); projectManagementSave.setDelFlag(0L); BeanUtil.copyProperties(projectManagement, projectManagementSave); if (projectManagement.getId() != null){ checkDataPer(projectManagement.getId()); projectManagementSave.setUpdateBy(SecurityUtils.getUsername()); projectManagementSave.setUpdateTime(DateUtils.getNowDate()); projectManagementMapper.updateProjectManagement(projectManagementSave); }else { projectManagementSave.setStep(1L); projectManagementSave.setCreateBy(SecurityUtils.getUsername()); projectManagementSave.setCreateTime(DateUtils.getNowDate()); projectManagementMapper.insertProjectManagement(projectManagementSave); } return projectManagementSave.getId(); } /** * 修改项目管理 * * @param projectManagement 项目管理 * @return 结果 */ @Override @Transactional public void updateProjectManagement(ProjectExpertSaveBatchReqDto projectManagement) { ProjectManagement projectManagement1 = checkDataPer(projectManagement.getId()); //专家选取 ProjectManagement projectManagementSave = new ProjectManagement(); projectManagementSave.setUpdateBy(SecurityUtils.getUsername()); projectManagementSave.setUpdateTime(DateUtils.getNowDate()); projectManagementSave.setId(projectManagement.getId()); if (projectManagement1.getState() != 1 && projectManagement1.getState() != 0){ throw new ServiceException("该步骤不可操作专家数据!"); } List saveData = projectManagement.getSaveData(); if (!StringUtils.isNotEmpty(saveData)){ throw new ServiceException("专家不可为空!"); } if (hasDuplicateExpertId(saveData)){ throw new ServiceException("专家重复!"); } long count = saveData.stream() .filter(dto -> dto.getSelectionMode() == 1) .count(); if (count < 1){ throw new ServiceException("固定专家不能为空!"); } if (projectManagement1.getStep() == 1 || projectManagement1.getStep() == 2){ projectManagementSave.setStep(2L); projectManagementSave.setState(1L); }else if (projectManagement1.getStep() == 3){ projectManagementSave.setStep(3L); projectManagementSave.setState(2L); projectManagementSave.setProjectCheckTime(new Date()); List collect = saveData.stream() .filter(dto -> "1".equals(dto.getTeamLeader().toString())) .collect(Collectors.toList()); if (StringUtils.isEmpty(collect)){ throw new ServiceException("缺少组长!"); } if (collect.size() > 1){ throw new ServiceException("组长只能选一人!"); } projectManagementSave.setExpertName(collect.get(0).getExpertName()); projectManagementSave.setExpertId(collect.get(0).getExpertId()); } List saveList = saveData.stream() .filter(dto -> dto.getId() == null) .collect(Collectors.toList()); if (StringUtils.isNotEmpty(saveList)){ List projectExperts = convertToProjectExpertList(saveList, projectManagement.getId()); int i = projectExpertMapper.batchInsertProjectExpert(projectExperts); if (i < 1){ throw new ServiceException("保存专家失败!"); } } List editList = saveData.stream() .filter(dto -> dto.getId() != null) .collect(Collectors.toList()); if (StringUtils.isNotEmpty(editList)){ List projectExperts = convertToProjectExpertList(editList, projectManagement.getId()); int i = projectExpertMapper.batchUpdateProjectExpert(projectExperts); if (i < 1){ throw new ServiceException("保存专家失败!"); } } projectManagementSave.setExpertNum((long) saveData.size()); List delData = projectManagement.getDelData(); if (delData != null && delData.size() > 0) { int i = projectExpertMapper.deleteProjectExpertByIds(delData.toArray(new Long[delData.size()])); if (i < 1){ throw new ServiceException("保存专家失败!"); } } int i = projectManagementMapper.updateProjectManagement(projectManagementSave); if (i < 1){ throw new ServiceException("保存专家失败!"); } } public List convertToProjectExpertList(List reqDtos,Long projectId) { List projectExpertList = new ArrayList<>(); reqDtos.forEach(reqDto -> { ProjectExpert projectExpert = convertToProjectExpert(reqDto,projectId); projectExpertList.add(projectExpert); }); return projectExpertList; } private ProjectExpert convertToProjectExpert(ProjectExpertSaveReqDto reqDto,Long projectId) { ProjectExpert projectExpert = new ProjectExpert(); projectExpert.setProjectId(projectId); projectExpert.setExpertId(reqDto.getExpertId()); projectExpert.setSelectionMode(reqDto.getSelectionMode()); projectExpert.setTeamLeader(reqDto.getTeamLeader()); if (reqDto.getId() == null){ projectExpert.setCreateBy(SecurityUtils.getUsername()); }else { projectExpert.setUpdateBy(SecurityUtils.getUsername()); projectExpert.setId(reqDto.getId()); } return projectExpert; } public boolean hasDuplicateExpertId(List saveData) { // 使用 Stream API 收集 expertId 的频率 Map frequencyMap = saveData.stream() .collect(Collectors.groupingBy(ProjectExpertSaveReqDto::getExpertId, Collectors.counting())); // 检查是否有任何 expertId 的频率大于 1 boolean hasDuplicates = frequencyMap.values().stream().anyMatch(count -> count > 1); if (hasDuplicates) { return true; } return false; } /** * 批量删除项目管理 * * @param ids 需要删除的项目管理主键 * @return 结果 */ @Override public int deleteProjectManagementByIds(Long[] ids) { //todo 校验 for (Long id : ids) { checkDataPer(id); } return projectManagementMapper.deleteProjectManagementByIds(ids); } /** * 删除项目管理信息 * * @param id 项目管理主键 * @return 结果 */ @Override public int deleteProjectManagementById(Long id) { return projectManagementMapper.deleteProjectManagementById(id); } @Override public ProjectExpertManagementInfoRes projectExpertCheckInfo(Long id) { return projectManagementMapper.projectExpertCheckInfo(id); } @Override @Transactional public void projectCheck(ProjectCheckReq req) { ProjectManagement projectManagement = checkDataPer(req.getId()); if (req.getState() != 3L && req.getState() != 1 ){ throw new ServiceException("参数异常!"); } if (projectManagement.getStep() != 3){ throw new ServiceException("非审批步骤!"); } Long state = projectManagement.getState(); if (req.getState() == 3 && state != 2){ throw new ServiceException("未生成审批单不可审批通过操作!"); }else if (req.getState() == 1 && state != 2){ throw new ServiceException("不可操作!"); } List projectFile = req.getProjectFile(); ProjectManagement projectManagementUp = new ProjectManagement(); projectManagementUp.setId(req.getId()); projectManagementUp.setState(req.getState()); projectManagementUp.setUpdateBy(SecurityUtils.getUsername()); if (req.getState() == 3){ projectManagementUp.setStep(4L); }else if (req.getState() == 1){ projectManagementUp.setStep(2L); } int i = projectManagementMapper.updateProjectManagement(projectManagementUp); //驳回删 if (req.getState() == 1){ projectFileMapper.deleteProjectFileByIdAndType(req.getId(), "1"); } if (i > 0 && StringUtils.isNotEmpty(projectFile) && req.getState() == 3){ //删除之前的该类型 projectFileMapper.deleteProjectFileByIdAndType(req.getId(), "1"); String username = SecurityUtils.getUsername(); projectFile.forEach(file -> { file.setCreateBy(username); file.setProjectId(req.getId()); }); int i1 = projectFileMapper.insertProjectFiles(projectFile); if (i1 < 1){ throw new ServiceException("保存附件失败!"); } } } @Override public void projectArchive(ProjectArchiveReq req) { ProjectManagement projectManagement = checkDataPer(req.getId()); Long state = projectManagement.getState(); if (state != 3L){ throw new ServiceException("此状态不可归档!"); } List projectFile = req.getProjectFile(); ProjectManagement projectManagementUp = new ProjectManagement(); projectManagementUp.setId(req.getId()); projectManagementUp.setState(4L); projectManagementUp.setDesc(req.getDesc()); projectManagementUp.setProjectEndTime(req.getProjectEndTime()); projectManagementUp.setUpdateBy(SecurityUtils.getUsername()); int i = projectManagementMapper.updateProjectManagement(projectManagementUp); if (i > 0 && StringUtils.isNotEmpty(projectFile)){ String username = SecurityUtils.getUsername(); projectFile.forEach(file -> { file.setCreateBy(username); file.setProjectId(req.getId()); }); int i1 = projectFileMapper.insertProjectFiles(projectFile); if (i1 < 1){ throw new ServiceException("保存附件失败!"); } } } @Override public List getProjectExpertSate(ProjectExpertStateReq req) { return projectManagementMapper.getProjectExpertSate(req); } @Override public List projectExpertEvaluationList(Long projectId) { return projectExpertMapper.projectExpertEvaluationList(projectId); } @Override @Transactional public void projectExpertDetailSave(ProjectExpertScoreSaveReq req) { List delData = req.getDelData(); if (StringUtils.isNotEmpty(delData)){ projectExpertDetailMapper.deleteProjectExpertDetailByIds(delData.toArray(new Long[delData.size()])); } ProjectExpert projectExpert1 = projectExpertMapper.selectProjectExpertById(req.getProjectExpertId()); if (projectExpert1 == null){ throw new ServiceException("项目专家不存在!"); } ProjectManagement projectManagement1 = checkData(projectExpert1.getProjectId()); if (projectManagement1.getState() != 4){ throw new ServiceException("项目未完成!"); } //更新项目专家表 ProjectExpert projectExpert = new ProjectExpert(); projectExpert.setId(req.getProjectExpertId()); projectExpert.setScore(req.getScore()); projectExpert.setevaluationState(1L); int i = projectExpertMapper.updateProjectExpert(projectExpert); if (i < 1){ throw new ServiceException("保存失败!"); } List saveData = req.getSaveData(); if (StringUtils.isNotEmpty(saveData)){ List projectExpertDetails = dealData(saveData, req.getProjectExpertId()); List saveList = projectExpertDetails.stream() .filter(dto -> dto.getId() == null) .collect(Collectors.toList()); if (StringUtils.isNotEmpty(saveList)){ int i12 = projectExpertDetailMapper.batchInsertProjectExpertDetail(saveList); if (i12 < 1){ throw new ServiceException("保存失败!"); } } List updateList = projectExpertDetails.stream() .filter(dto -> dto.getId() != null) .collect(Collectors.toList()); if (StringUtils.isNotEmpty(updateList)){ int i1 = projectExpertDetailMapper.batchUpdateProjectExpertDetail(updateList); if (i1 < 1){ throw new ServiceException("保存失败!"); } } } //验证是否都已考评 int unEva = projectExpertMapper.getUnEva(projectExpert1.getProjectId()); if (unEva == 0){ ProjectManagement projectManagement = new ProjectManagement(); projectManagement.setId(projectExpert1.getProjectId()); projectManagement.setEvaluationState(1L); projectManagement.setUpdateBy(SecurityUtils.getUsername()); int i1 = projectManagementMapper.updateProjectManagement(projectManagement); if (i1 < 1){ throw new ServiceException("保存失败!"); } } } @Override public List projectExpertEvaList(SysProjectExpertReq req) { return projectExpertMapper.projectExpertEvaList(req); } @Override public List selectProjectExpertDetailList(Long projectExpertId) { ProjectExpertDetail projectExpertDetail = new ProjectExpertDetail(); projectExpertDetail.setProjectExpertId(projectExpertId); return projectExpertDetailMapper.selectProjectExpertDetailList(projectExpertDetail); } @Override public List selectProjectFileList(Long projectId,String module ) { ProjectFile projectFile = new ProjectFile(); projectFile.setProjectId(projectId); projectFile.setModule(module); List projectFiles = projectFileMapper.selectProjectFileList(projectFile); if (StringUtils.isNotEmpty(projectFiles)){ return projectFiles; } return Collections.emptyList(); } @Override public ProjectNumResp getProjectNum() { ProjectNumResp projectNumResp = new ProjectNumResp(); List dataNum = projectManagementMapper.getDataNum(SecurityUtils.isAdmin(SecurityUtils.getUserId()) ? null : SecurityUtils.getDeptId()); if (!StringUtils.isEmpty(dataNum)){ Map statusCounts = dataNum.stream() .collect(Collectors.groupingBy( status -> status, // 分组键 Collectors.counting() // 计数 )); projectNumResp.setTotal(dataNum.size()); projectNumResp.setApproval(statusCounts.get(3) == null ? 0 : statusCounts.get(3).intValue()); projectNumResp.setExpert(statusCounts.get(1) == null ? 0 : statusCounts.get(1).intValue()); projectNumResp.setStaging(statusCounts.get(0) == null ? 0:statusCounts.get(0).intValue()); projectNumResp.setEnd(statusCounts.get(4) == null ? 0:statusCounts.get(4).intValue()); } return projectNumResp; } private List dealData(List data,Long projectExpertId){ List dealData = new ArrayList<>(); data.forEach(dto -> { ProjectExpertDetail projectExpertDetail = new ProjectExpertDetail(); projectExpertDetail.setProjectExpertId(projectExpertId); projectExpertDetail.setContent(dto.getContent()); projectExpertDetail.setScore(dto.getScore()); projectExpertDetail.setScoreType(dto.getScoreType()); if (dto.getId() == null){ projectExpertDetail.setCreateBy(SecurityUtils.getUsername()); }else { projectExpertDetail.setId(dto.getId()); projectExpertDetail.setUpdateBy(SecurityUtils.getUsername()); } dealData.add(projectExpertDetail); }); return dealData; } public ProjectManagement checkData(Long id){ ProjectManagement projectManagement = projectManagementMapper.selectProjectManagementById(id); if (ObjectUtil.isNull(projectManagement)){ throw new ServiceException("数据不存在!"); } return projectManagement; } public ProjectManagement checkDataPer(Long id){ ProjectManagement projectManagement = checkData(id); Long deptId = projectManagement.getDeptId(); // 本部门审批? if (!SecurityUtils.isAdmin(SecurityUtils.getUserId()) && deptId.intValue() != SecurityUtils.getDeptId().intValue()){ throw new ServiceException("非本部门数据,无权操作!"); } if (projectManagement.getState() == 4){ throw new ServiceException("已结项,无权操作!"); } return projectManagement; } }