package com.gkhy.assess.system.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.gkhy.assess.common.api.CommonPage; import com.gkhy.assess.common.constant.SuperAccountConstant; import com.gkhy.assess.common.enums.DeleteFlagEnum; import com.gkhy.assess.common.enums.UserIdentityEnum; import com.gkhy.assess.common.exception.ApiException; import com.gkhy.assess.common.utils.PageUtil; import com.gkhy.assess.common.utils.StringUtils; import com.gkhy.assess.system.domain.AssPlanPerson; import com.gkhy.assess.system.domain.AssProject; import com.gkhy.assess.system.domain.vo.PersonRecognitionVO; import com.gkhy.assess.system.domain.vo.ProjectStaticVO; import com.gkhy.assess.system.enums.ProgressPhaseEnum; import com.gkhy.assess.system.enums.ReportProgressEnum; import com.gkhy.assess.system.enums.SafetyCheckEnum; import com.gkhy.assess.system.mapper.AssPlanPersonMapper; import com.gkhy.assess.system.mapper.AssProjectMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gkhy.assess.system.domain.SysUser; import com.gkhy.assess.system.service.AssProjectService; import com.gkhy.assess.system.utils.ShiroUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** *

* 项目表 服务实现类 *

* * @author kzy * @since 2023-12-11 14:16:18 */ @Service public class AssProjectServiceImpl extends ServiceImpl implements AssProjectService { @Autowired private AssPlanPersonMapper planPersonMapper; @Override public CommonPage projectList(AssProject project) { SysUser user= ShiroUtils.getSysUser(); if(!user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){ //机构用户只能查看本机构的项目 if(user.getAgencyId()==null){ throw new ApiException("用户机构id为空"); } project.setAgencyId(user.getAgencyId()); }else { //监管机构只能查看本辖区的项目 if (!SuperAccountConstant.ADMINISTRATOR.equals(user.getUsername()) && !SuperAccountConstant.SUPER_ADMIN.equals(user.getUsername())){ project.setCity(user.getManageRegion()); } } PageUtil.startPage(); List projects=baseMapper.projectList(project); //获取签字确认人数 handleProjectRecognitionCount(projects); return CommonPage.restPage(projects); } public void handleProjectRecognitionCount(List projects){ ListprojectIds=projects.stream().map(item -> item.getId()).collect(Collectors.toList()); if(!projectIds.isEmpty()) { List personAndRecognitions = planPersonMapper.getPersonAndRecognitionCount(projectIds); Map map = personAndRecognitions.stream().collect(Collectors.toMap(PersonRecognitionVO::getProjectId, a -> a)); for (AssProject project : projects) { PersonRecognitionVO personRecognitionVO = map.get(project.getId()); if (personRecognitionVO != null) { project.setPersonRecognition(personRecognitionVO); } } } } @Override public AssProject getProjectById(Long projectId) { return baseMapper.getProjectById(projectId); } @Override public int addProject(AssProject project) { //todo 校验用户,只有机构账号有权限创建项目 SysUser user= ShiroUtils.getSysUser(); if(!user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())){ throw new ApiException("无权操作,只有机构用户可以创建项目"); } if(user.getAgencyId()==null){ throw new ApiException("用户机构id为空"); } project.setAgencyId(user.getAgencyId()); project.setSafetyCheck(project.getEstimateType() == 33 ? SafetyCheckEnum.CHECKED.getCode() :SafetyCheckEnum.UN_CHECK.getCode()); if(!checkNameUnique(project)){ throw new ApiException("项目名已存在"); } project.setReportProgress(ReportProgressEnum.ADD.getCode()); project.setCreateBy(ShiroUtils.getSysUser().getUsername()); int row=baseMapper.insert(project); return row; } @Override public int deleteProjectById(Long projectId) { //todo 权限校验 SysUser user= ShiroUtils.getSysUser(); checkUserAllowed(projectId); //判断项目流转状态 AssProject project=getById(projectId); if(project.getReportProgress().equals(ReportProgressEnum.CONFIRM_FINAL.getCode())){ if(!user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){ throw new ApiException("没有权限删除确认完结的项目,请联系监管用户删除"); } } project=new AssProject() .setId(projectId) .setDelFlag(DeleteFlagEnum.DELETED.getCode()); project.setUpdateBy(user.getUsername()); return baseMapper.updateById(project); } @Override public int editProject(AssProject project) { Long projectId=project.getId(); if(projectId==null){ throw new ApiException("项目id不能为空"); } checkUserAllowed(projectId); // if(!checkNameUnique(project)){ // throw new ApiException("项目名已存在"); // } project.setAgencyId(null);//机构id不能修改 project.setReportProgress(null);//项目状态不能修改 project.setUpdateBy(ShiroUtils.getSysUser().getUsername()); int row =baseMapper.updateById(project); return row; } @Override public AssProject checkProjectDataScope(Long projectId) { return null; } @Override public Integer getProjectReportProgress(Long projectId) { checkUserAllowed(projectId); return baseMapper.getReportProgress(projectId); } @Override public boolean checkNameUnique(AssProject project) { Long projectId = project.getId()==null? -1L : project.getId(); AssProject pro = baseMapper.getProjectByName(project.getName(),project.getAgencyId(),project.getSafetyCheck()); if (pro!=null && pro.getId().longValue() != projectId.longValue()) { return false; } return true; } @Override public void checkReportProgress(Long projectId, ReportProgressEnum reportProgressEnum) { Integer reportProgress= getProjectReportProgress(projectId); if(reportProgressEnum.getCode()!=reportProgress){ throw new ApiException(String.format("项目状态不是%s,不能操作", reportProgressEnum.getInfo())); } } @Override public int changeReportProgress(Long projectId, ReportProgressEnum reportProgressEnum) { AssProject project=new AssProject().setId(projectId) .setReportProgress(reportProgressEnum.getCode()) .setPhase(ProgressPhaseEnum.getPhaseByProcess(reportProgressEnum.getCode())); project.setUpdateBy(ShiroUtils.getSysUser().getUsername()); if(reportProgressEnum.getCode().equals(ReportProgressEnum.CONFIRM_FINAL.getCode())){ project.setFilingDate(LocalDateTime.now()); } return baseMapper.updateById(project); } @Override public CommonPage memberProjects(Long personId, Integer finish) { SysUser user= ShiroUtils.getSysUser(); if(!user.getIdentity().equals(UserIdentityEnum.EXPERT.getCode())){ throw new ApiException("无权限,只有专家用户才能操作"); } PageUtil.startPage(); List projects=baseMapper.getMemberProjectByUserId(personId,finish,user.getAgencyId()); if(projects.size()>0) { getProjectPlanPerson(projects); } return CommonPage.restPage(projects); } @Override public CommonPage leaderProjects(Long personId) { SysUser user= ShiroUtils.getSysUser(); if(!user.getIdentity().equals(UserIdentityEnum.EXPERT.getCode())){ throw new ApiException("无权限,只有专家用户才能操作"); } PageUtil.startPage(); List projects=baseMapper.getLeaderProjectByUserId(personId,user.getAgencyId()); return CommonPage.restPage(projects); } private void getProjectPlanPerson(List projects){ List planPersonIds=projects.stream().map(AssProject::getPlanPersonId).collect(Collectors.toList()); List planPersonList=planPersonMapper.getPlanPersonsByIds(planPersonIds); Map maps=planPersonList.stream().collect(Collectors.toMap(AssPlanPerson::getId,a -> a)); for(AssProject project:projects){ project.setPlanPerson(maps.get(project.getPlanPersonId())); } } @Override public ProjectStaticVO projectStat(AssProject project) { SysUser user=ShiroUtils.getSysUser(); if(!user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){ if(user.getAgencyId()==null){ throw new ApiException("用户机构id为空"); } project.setAgencyId(user.getAgencyId()); } Integer projectTotal=baseMapper.getProjectCount(project); project.setPhase(ProgressPhaseEnum.RISK.getCode()); Integer riskTotal=baseMapper.getProjectCount(project); project.setPhase(ProgressPhaseEnum.INVESTIGATION.getCode()); Integer investigationTotal=baseMapper.getProjectCount(project); project.setPhase(ProgressPhaseEnum.REVIEW.getCode()); Integer reviewTotal=baseMapper.getProjectCount(project); project.setPhase(ProgressPhaseEnum.REPORT.getCode()); Integer reportTotal=baseMapper.getProjectCount(project); project.setPhase(ProgressPhaseEnum.ARCHIVE.getCode()); Integer archiveTotal=baseMapper.getProjectCount(project); project.setPhase(null); project.setUnFinish(1); project.setSafetyCheck(SafetyCheckEnum.CHECKED.getCode()); Integer safetyCheckTotal=baseMapper.getProjectCount(project); project.setSafetyCheck(SafetyCheckEnum.UN_CHECK.getCode()); Integer safetyTotal=baseMapper.getProjectCount(project); ProjectStaticVO projectStaticVO=new ProjectStaticVO() .setProjectTotal(projectTotal) .setRiskTotal(riskTotal) .setInvestigationTotal(investigationTotal) .setReviewTotal(reviewTotal) .setReportTotal(reportTotal) .setArchiveTotal(archiveTotal) .setSafetyCheckTotal(safetyCheckTotal) .setSafetyTotal(safetyTotal) .setUnFinishTotal(safetyTotal+safetyCheckTotal); return projectStaticVO; } @Override public Long getProjectAgencyId(Long projectId) { AssProject project=getOne(Wrappers.lambdaQuery() .select(AssProject::getAgencyId) .eq(AssProject::getId,projectId) .eq(AssProject::getDelFlag, DeleteFlagEnum.UN_DELETE.getCode())); if(project==null){ throw new ApiException("项目不存在"); } return project.getAgencyId(); } @Override public void checkUserAllowed(Long projectId) { if(projectId==null){ throw new ApiException("项目id不能为空"); } SysUser currentUser=ShiroUtils.getSysUser(); if(!Objects.equals(currentUser.getIdentity(),UserIdentityEnum.MONITOR.getCode())){ if(!Objects.equals(currentUser.getAgencyId(), getProjectAgencyId(projectId))){ throw new ApiException("没有权限操作其他机构数据"); } } } }