package com.fdkankan.site.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fdkankan.site.common.PageInfo; import com.fdkankan.site.common.ResultCode; import com.fdkankan.site.common.util.DateUtils; import com.fdkankan.site.common.util.JwtUtil; import com.fdkankan.site.common.util.VUtils; import com.fdkankan.site.entity.*; import com.fdkankan.site.entity.dto.MarkingDTO; import com.fdkankan.site.entity.dto.ProjectTeamDTO; import com.fdkankan.site.exception.BusinessException; import com.fdkankan.site.httpClient.bim.BusinessStatus; import com.fdkankan.site.mapper.IProjectMapper; import com.fdkankan.site.request.ProjectAddSceneParam; import com.fdkankan.site.request.ProjectDelSceneParam; import com.fdkankan.site.request.ProjectListParam; import com.fdkankan.site.request.SceneNumParam; import com.fdkankan.site.response.ProjectInfoVo; import com.fdkankan.site.response.ProjectVo; import com.fdkankan.site.response.SceneVo; import com.fdkankan.site.response.UserData; import com.fdkankan.site.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.site.util.EscapeUtil; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author * @since 2022-10-10 */ @Service public class ProjectServiceImpl extends ServiceImpl implements IProjectService { @Autowired IProjectNumService projectNumService; @Autowired IProjectTeamService projectTeamService; @Autowired IProjectBimService projectBimService; @Autowired ISceneService sceneService; @Autowired IProjectLogService projectLogService; @Autowired IUserService userService; @Autowired IUserRoleService userRoleService; @Autowired IRoleService roleService; @Autowired IMarkingService markingService; @Override public Object getUserData(String token) { UserData userData = new UserData(); User user = userService.findByTokenCovUserName(token); List teamList = projectTeamService.getListByUserId(user.getUserId()); Set projectIds = teamList.parallelStream().map(ProjectTeam::getProjectId).collect(Collectors.toSet()); List numList = projectNumService.getListByProjectIds(projectIds); Integer projectCount = 0; Long overCount = 0L; Long bimCount = 0L; if(projectIds.size() >0){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(Project::getProjectId,projectIds); List list = this.list(wrapper); projectCount = list.size(); for (Project project : list) { if(project.getProjectStatus() == 1){ overCount ++; } } LambdaQueryWrapper bimWr = new LambdaQueryWrapper<>(); bimWr.in(ProjectBim::getProjectId,projectIds); bimCount = projectBimService.count(bimWr); } userData.setProjectCount(Long.valueOf(projectCount)); userData.setProjectSceneCount((long) numList.size() + bimCount); userData.setProjectOverCount(overCount); return userData; } @Override public Object pageList(ProjectListParam param, String token) { User user = userService.findByTokenCovUserName(token); List projectTeamList = projectTeamService.getListByUserId(user.getUserId()); Set projectIdSet = projectTeamList.stream().map(ProjectTeam::getProjectId).collect(Collectors.toSet()); if(projectIdSet.size() <=0){ Page voPage = new Page<>(param.getPageNum(), param.getPageSize()); voPage.setTotal(0); voPage.setRecords(new ArrayList<>()); return PageInfo.PageInfo(voPage); } MPJLambdaWrapper wrapper = new MPJLambdaWrapper() .selectAll(Project.class) .select(User::getUserName) .selectAs(User::getUserName, ProjectVo::getProjectCreater)//别名 .leftJoin(ProjectTeam.class,ProjectTeam::getProjectId,Project::getProjectId) .leftJoin(User.class, User::getUserId, ProjectTeam::getUserId) .eq(ProjectTeam::getIsCreater,1) .orderByDesc(Project::getCreateTime); ; wrapper.in(Project::getProjectId,projectIdSet); if(StringUtils.isNotBlank(param.getProjectName())){ wrapper.like(Project::getProjectName,param.getProjectName()); } if(StringUtils.isNotBlank(param.getStartTime())){ wrapper.ge(Project::getCreateTime,param.getStartTime()); } if(StringUtils.isNotBlank(param.getEndTime())){ wrapper.le(Project::getCreateTime,param.getEndTime()); } if(param.getProjectStatus() !=null){ wrapper.eq(Project::getProjectStatus,param.getProjectStatus()); } if(StrUtil.isNotEmpty(param.getProjectCreater())){ wrapper.like(User::getUserName, EscapeUtil.escapeChar(param.getProjectCreater())); } // if(StringUtils.isNotBlank(param.getProjectCreater())){ // Set projectIds = projectTeamService.getProjectIdByCreater(param.getProjectCreater()); // if(projectIds.size() >0){ // wrapper.in(Project::getProjectId,projectIds); // } // } IPage page = baseMapper.selectJoinPage(new Page<>(param.getPageNum(), param.getPageSize()), ProjectVo.class, wrapper); return PageInfo.PageInfo(page); } @Override public ProjectInfoVo getProjectInfo(Integer projectId,String sceneOrder,String token) { VUtils.isTure(projectId == null).throwMessage(ResultCode.PARAM_MISS); Project project = this.getById(projectId); VUtils.isTure(project == null).throwMessage(ResultCode.PROJECT_NOT_EXIST); if(StringUtils.isNotBlank(token) && StringUtils.isBlank(sceneOrder)){ checkTokenPer(token, projectId); } ProjectInfoVo infoVo = new ProjectInfoVo(); BeanUtils.copyProperties(project,infoVo); ProjectTeamDTO projectCreater = projectTeamService.getProjectCreater(projectId); if(projectCreater!= null){ infoVo.setProjectCreater(projectCreater.getUserName()); } List sceneList = this.getSceneList(projectId); if(StringUtils.isNotBlank(sceneOrder) && sceneOrder.equals("asc")){ sceneList= sceneList.stream().sorted(Comparator.comparing(SceneVo::getCreateTime)).collect(Collectors.toList()); }else if (StringUtils.isNotBlank(sceneOrder) && sceneOrder.equals("desc")){ sceneList=sceneList.stream().sorted(Comparator.comparing(SceneVo::getCreateTime,Comparator.reverseOrder())).collect(Collectors.toList()); } infoVo.setSceneList(sceneList); ProjectBim bim = null; List projectBims = projectBimService.getByProjectId(projectId); for (ProjectBim projectBim : projectBims) { if(!projectBim.getBimStatus().equals(BusinessStatus.ERROR.getInfo())) { bim = projectBim; } } infoVo.setBimData(bim); return infoVo; } @Override public void over(Project param,String token) { VUtils.isTure(param.getProjectId() == null).throwMessage(ResultCode.PARAM_MISS); checkTokenPer(token, param.getProjectId()); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(Project::getProjectId,param.getProjectId()) .set(Project::getProjectStatus,1); this.update(wrapper); } @Override public List getSceneList(Integer projectId) { Set projectIds = new HashSet<>(Arrays.asList(projectId)); List projectNums = projectNumService.getListByProjectIds(projectIds); HashMap> typeMap = projectNumService.getTypeMap(projectNums); List list = new ArrayList<>(); if(typeMap.size() >0){ list = sceneService.getListByNumMap(typeMap); } return list; } @Override public Project addProject(Project param, String token) { VUtils.isTure(StringUtils.isBlank(param.getProjectName()) ).throwMessage(ResultCode.PARAM_MISS); Project project = new Project(); BeanUtils.copyProperties(param,project); this.save(project); projectTeamService.addProject(project.getProjectId(),token); return project; } @Override public void addScene(ProjectAddSceneParam param) { Project project = this.getById(param.getProjectId()); VUtils.isTure(project == null).throwMessage(ResultCode.PROJECT_NOT_EXIST); checkTokenPer(param.getToken(), param.getProjectId()); Set projectIds = new HashSet<>(Arrays.asList(param.getProjectId())); List projectNums = projectNumService.getListByProjectIds(projectIds); List hasNumList = projectNums.stream().map(ProjectNum::getNum).collect(Collectors.toList()); List paramNumList = new ArrayList<>(); HashMap numType = new HashMap<>(); List sceneNumParam = param.getSceneNumParam(); for (SceneNumParam numParam : sceneNumParam) { if(numParam.getNumList() == null || numParam.getNumList().size() <=0){ continue; } for (String num : numParam.getNumList()) { numType.put(num,numParam.getType()); } paramNumList.addAll(numParam.getNumList()); } List delNumList = new ArrayList<>(); for (String num : hasNumList) { if(!paramNumList.contains(num)){ delNumList.add(num); } } List addNumList = new ArrayList<>(); for (String num : paramNumList) { if(!hasNumList.contains(num)){ addNumList.add(num); } } Set numList = projectNumService.getNumList(); for (String num : addNumList) { if(numList.contains(num)){ throw new BusinessException(ResultCode.SCENE_BIND.code,num +ResultCode.SCENE_BIND.msg); } } if(delNumList.size() >0){ projectNumService.delByNumList(param.getProjectId(),delNumList); projectLogService.addLog(param.getProjectId(),"シーンの削除",param.getToken(),delNumList); } if(addNumList.size() >0){ projectNumService.addByNumList(param.getProjectId(),numType,addNumList); projectLogService.addLog(param.getProjectId(),"シーンの追加",param.getToken(),addNumList); } this.updateTime(project.getProjectId()); } @Override public void delScene(ProjectDelSceneParam param) { Project project = this.getById(param.getProjectId()); VUtils.isTure(project == null).throwMessage(ResultCode.PARAM_MISS); VUtils.isTure(param.getProjectId() == null).throwMessage(ResultCode.PARAM_MISS); checkTokenPer(param.getToken(), param.getProjectId()); VUtils.isTure(StringUtils.isBlank(param.getNum())).throwMessage(ResultCode.PARAM_MISS); projectNumService.delByNumList(param.getProjectId(),Arrays.asList(param.getNum())); projectLogService.addLog(param.getProjectId(),"シーンの削除",param.getToken(),Arrays.asList(param.getNum())); this.updateTime(project.getProjectId()); List markings = markingService.findByProjectIdAndNum(project.getProjectId(),param.getNum()); for (Marking marking : markings) { markingService.delMarking(marking.getMarkingId(),param.getToken()); } } @Override public void deleteBim(Integer bimId,String token) { ProjectBim bim = projectBimService.getById(bimId); if(bim != null){ checkTokenPer(token, bim.getProjectId()); projectLogService.addLog(bim.getProjectId(),"BIMの削除:"+bim.getBimName(),token,null); projectBimService.removeById(bimId); this.updateTime(bim.getProjectId()); } } @Override public HashMap getByIds(Set projectIds) { HashMap map = new HashMap<>(); if(projectIds.size() >0){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.in(Project::getProjectId,projectIds); List list = this.list(wrapper); list.forEach(entity -> map.put(entity.getProjectId(),entity)); } return map; } @Override public HashMap getAndDelByIds(Set projectIds) { HashMap map = new HashMap<>(); if(projectIds.size() >0){ List list = this.getBaseMapper().getAndDelByIds(projectIds); list.forEach(entity -> map.put(entity.getProjectId(),entity)); } return map; } @Override public void updateName(Project param,String token) { VUtils.isTure(param.getProjectId() == null).throwMessage(ResultCode.PARAM_MISS); checkTokenPer(token, param.getProjectId()); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(Project::getProjectId,param.getProjectId()); if(StringUtils.isNotBlank(param.getProjectName())){ wrapper.set(Project::getProjectName,param.getProjectName()); } if(StringUtils.isNotBlank(param.getProjectMsg())){ wrapper.set(Project::getProjectMsg,param.getProjectMsg()); } if(StringUtils.isNotBlank(param.getProjectImg())){ wrapper.set(Project::getProjectImg,param.getProjectImg()); } this.update(wrapper); } @Override public void updateBimName(ProjectBim projectBim,String token) { ProjectBim bim = projectBimService.getById(projectBim.getBimId()); checkTokenPer(token, bim.getProjectId()); projectBimService.updateBimName(projectBim); this.updateTime(bim.getProjectId()); projectLogService.addLog(bim.getProjectId(),"BIM名の変更:"+projectBim.getBimName(),token,null); } @Override public void updatePanos(Project param,String token) { checkTokenPer(token, param.getProjectId()); VUtils.isTure(param.getProjectId() == null).throwMessage(ResultCode.PARAM_MISS); VUtils.isTure(StringUtils.isBlank(param.getPanos())).throwMessage(ResultCode.PARAM_MISS); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(Project::getProjectId,param.getProjectId()); if(StringUtils.isNotBlank(param.getPanos())){ wrapper.set(Project::getPanos,param.getPanos()); } this.update(wrapper); this.updateTime(param.getProjectId()); projectLogService.addLog(param.getProjectId(),"BIM位置の同期",token,null); } @Override public void delProject(Integer projectId, String token) { checkTokenPer(token, projectId); Project project = this.getById(projectId); if(project == null){ throw new BusinessException(ResultCode.PROJECT_NOT_EXIST); } projectNumService.delByProjectId(projectId,token); projectBimService.delByProjectId(projectId,token); this.removeById(projectId); userRoleService.delUserRole(null,projectId); roleService.delRoleByProjectId(projectId); //projectLogService.addLog(project.getProjectId(),"删除项目:"+project.getProjectName(),token,null); } @Override public void updateTime(Integer projectId) { LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(Project::getProjectId,projectId); wrapper.set(Project::getUpdateTime, DateUtils.getData(new Date())); this.update(wrapper); } @Override public void checkTokenPer(String token,Integer projectId){ User user = userService.findByTokenCovUserName(token); List teamList = projectTeamService.getListByUserIdAndProjectId(user.getUserId(),projectId); if(CollectionUtil.isEmpty(teamList)){ throw new BusinessException(ResultCode.NOT_PERM); } } @Override public void checkProjectPer(String userName, Integer projectId) { User user = userService.findByUserName(userName); List teamList = projectTeamService.getListByUserIdAndProjectId(user.getUserId(),projectId); if(CollectionUtil.isEmpty(teamList)){ throw new BusinessException(ResultCode.NOT_PERM); } } }