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.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.system.domain.AssPlanPerson;
import com.gkhy.assess.system.domain.AssProject;
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.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());
}
PageUtil.startPage();
List projects=baseMapper.projectList(project);
//获取签字确认人数
return CommonPage.restPage(projects);
}
@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为空");
}
if(!checkNameUnique(project)){
throw new ApiException("项目名已存在");
}
project.setAgencyId(user.getAgencyId());
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=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());
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);
ProjectStaticVO projectStaticVO=new ProjectStaticVO()
.setProjectTotal(projectTotal)
.setRiskTotal(riskTotal)
.setInvestigationTotal(investigationTotal)
.setReviewTotal(reviewTotal)
.setReportTotal(reportTotal)
.setArchiveTotal(archiveTotal);
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("没有权限操作其他机构数据");
}
}
}
}