package com.cloudroam.service.impl;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.cloudroam.bo.ProjectInfoBO;
import com.cloudroam.bo.projectModule.ProjectModuleBO;
import com.cloudroam.bo.projectModule.ProjectModuleTreeBO;
import com.cloudroam.common.LocalUser;
import com.cloudroam.common.enumeration.DeletedEnum;
import com.cloudroam.common.mybatis.LinPage;
import com.cloudroam.dto.projectInfo.QueryProjectInfoDTO;
import com.cloudroam.dto.projectModule.CreateProjectModuleDTO;
import com.cloudroam.dto.projectModule.ProjectModulePageDTO;
import com.cloudroam.mapper.ProjectModuleMapperCustom;
import com.cloudroam.model.*;
import com.cloudroam.mapper.ProjectModuleMapper;
import com.cloudroam.service.ProjectInfoService;
import com.cloudroam.service.ProjectModuleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author generator@TaoJie
* @since 2024-08-16
*/
@Service
public class ProjectModuleServiceImpl extends ServiceImpl implements ProjectModuleService {
@Autowired
private ProjectInfoService projectInfoService;
@Autowired
private ProjectModuleMapperCustom projectModuleMapperCustom;
@Override
public ProjectModuleDO createProjectModule(CreateProjectModuleDTO validator) {
UserDO user = LocalUser.getLocalUser();
ProjectModuleDO projectModuleDO=new ProjectModuleDO();
BeanUtils.copyProperties(validator,projectModuleDO);
// 根据parentId来查找是否有当前模块,如果有则设置,没有则查询项目表
if(StringUtils.isNotBlank(validator.getParentId())){
final ProjectModuleDO existsModuleDO = this.getById(validator.getParentId());
if(null!=existsModuleDO){
projectModuleDO.setParentId(existsModuleDO.getId());
projectModuleDO.setProjectId(existsModuleDO.getProjectId());
}else{
ProjectInfoDO projectInfoDO=projectInfoService.getById(validator.getParentId());
if(null!=projectInfoDO){
projectModuleDO.setParentId(projectInfoDO.getId());
projectModuleDO.setProjectId(projectInfoDO.getId());
}
}
}
projectModuleDO.setId(IdUtil.simpleUUID());
projectModuleDO.setCreateTime(new Date());
projectModuleDO.setCreateUserId(String.valueOf(user.getId()));
projectModuleDO.setCreateUserName(user.getNickname());
projectModuleDO.setUpdateTime(new Date());
projectModuleDO.setUpdateUserId(String.valueOf(user.getId()));
projectModuleDO.setUpdateUserName(user.getNickname());
projectModuleDO.setIsDeleted(DeletedEnum.DELETED_NO.getCode());
projectModuleDO.setDeleteUserId(String.valueOf(user.getId()));
projectModuleDO.setDeleteUserName(user.getNickname());
this.baseMapper.insert(projectModuleDO);
return this.baseMapper.selectById(projectModuleDO.getId());
}
@Override
public boolean updateProjectModule(CreateProjectModuleDTO validator) {
UserDO user = LocalUser.getLocalUser();
ProjectModuleDO projectModuleDO=new ProjectModuleDO();
BeanUtils.copyProperties(validator,projectModuleDO);
final ProjectModuleDO existProjectModuleDO = baseMapper.selectById(validator.getId());
String prevProjectId= existProjectModuleDO.getProjectId();
if(StringUtils.isNotBlank(validator.getParentId())){
final ProjectModuleDO existsModuleDO = this.getById(validator.getParentId());
if(null!=existsModuleDO){
projectModuleDO.setParentId(existsModuleDO.getId());
projectModuleDO.setProjectId(existsModuleDO.getProjectId());
}else{
ProjectInfoDO projectInfoDO=projectInfoService.getById(validator.getParentId());
if(null!=projectInfoDO){
projectModuleDO.setParentId(projectInfoDO.getId());
projectModuleDO.setProjectId(projectInfoDO.getId());
}
}
}
projectModuleDO.setUpdateTime(new Date());
projectModuleDO.setUpdateUserId(String.valueOf(user.getId()));
projectModuleDO.setUpdateUserName(user.getNickname());
// 获取当前所有节点下的子节点,更行项目id和parentId
// 获取所有projectId的模块
final List projectModuleDOSByProjectId = getProjectModuleDOSByProjectId(prevProjectId);
// 获取当前moduleId下的所有子节点
final List allSubModules = getAllSubModules(existProjectModuleDO.getId(), projectModuleDOSByProjectId);
final List needUpdateSubList = allSubModules.stream().map(module -> {
ProjectModuleDO subProjectModuleDO = new ProjectModuleBO();
subProjectModuleDO.setId(module.getId());
subProjectModuleDO.setProjectId(projectModuleDO.getProjectId());
return subProjectModuleDO;
}).collect(Collectors.toList());
updateBatchById(needUpdateSubList);
return baseMapper.updateById(projectModuleDO)>0;
}
public List getAllSubModules(String moduleId, List projectModules) {
List subModules = new ArrayList<>();
findSubModules(moduleId, projectModules, subModules);
return subModules;
}
private void findSubModules(String parentId, List projectModules, List subModules) {
for (ProjectModuleDO module : projectModules) {
if (StringUtils.isNotBlank(module.getParentId())
&&module.getParentId().equals(parentId)) {
subModules.add(module);
// 递归查找子节点
findSubModules(module.getId(), projectModules, subModules);
}
}
}
@Override
public void deleteProjectModuleById(String id) {
UserDO user = LocalUser.getLocalUser();
ProjectModuleDO projectModuleDO=new ProjectModuleDO();
projectModuleDO.setId(id);
projectModuleDO.setIsDeleted(DeletedEnum.DELETED_YES.getCode());
projectModuleDO.setDeleteTime(new Date());
projectModuleDO.setDeleteUserId(String.valueOf(user.getId()));
projectModuleDO.setDeleteUserName(user.getNickname());
baseMapper.updateById(projectModuleDO);
}
@Override
public List listTree(ProjectModulePageDTO dto) {
QueryProjectInfoDTO queryProjectInfoDTO=new QueryProjectInfoDTO();
if(StringUtils.isNotBlank(dto.getProjectId())) queryProjectInfoDTO.setProjectId(dto.getProjectId());
// 查询所有的项目
final List projectInfoList = projectInfoService.getProjectInfoList(queryProjectInfoDTO);
final List projectModuleTreeBOS = getProjectProjectModuleTreeBOS(projectInfoList);
return projectModuleTreeBOS;
}
private List getProjectProjectModuleTreeBOS(List projectInfoList) {
final List projectModuleTreeBOS = projectInfoList.stream().map(projectInfoDO -> {
ProjectModuleTreeBO projectModuleTreeBO = new ProjectModuleTreeBO();
projectModuleTreeBO.setProjectFlag(1);
projectModuleTreeBO.setName(projectInfoDO.getProjectName());
projectModuleTreeBO.setId(projectInfoDO.getId());
final List projectModuleDOList = getProjectModuleDOSByProjectId(projectInfoDO.getId());
projectModuleTreeBO.setChildren(buildModuleTree(projectModuleDOList));
return projectModuleTreeBO;
}).collect(Collectors.toList());
return projectModuleTreeBOS;
}
private List getProjectModuleDOSByProjectId(String projectId) {
// 获取该项目下的所有模块树
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ProjectModuleDO::getIsDeleted, DeletedEnum.DELETED_NO.getCode())
.eq(ProjectModuleDO::getProjectId, projectId);
List projectModuleDOList = this.list(queryWrapper);
return projectModuleDOList;
}
@Override
public IPage getProjectModulePage(QueryProjectInfoDTO dto) {
final IPage projectInfoPage = projectInfoService.getProjectInfoPage(dto);
final List records = projectInfoPage.getRecords();
final List projectList = records.stream().map(ProjectInfoBO -> {
ProjectInfoDO projectInfoDO = new ProjectInfoDO();
BeanUtils.copyProperties(ProjectInfoBO, projectInfoDO);
return projectInfoDO;
}).collect(Collectors.toList());
final List projectProjectModuleTreeBOS = getProjectProjectModuleTreeBOS(projectList);
IPage iPage=new LinPage<>(dto.getPage(),dto.getCount());
iPage.setTotal(projectInfoPage.getTotal());
iPage.setCurrent(projectInfoPage.getCurrent());
return iPage.setRecords(projectProjectModuleTreeBOS);
}
@Override
public ProjectModuleTreeBO getProjectModuleTreeBOById(String id) {
final ProjectModuleDO projectModuleDO = this.getById(id);
return convertToTreeBO(projectModuleDO);
}
@Override
public List list(ProjectModulePageDTO dto) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProjectModuleDO::getIsDeleted, DeletedEnum.DELETED_NO.getCode())
.eq(StringUtils.isNotBlank(dto.getProjectId()), ProjectModuleDO::getProjectId, dto.getProjectId())
.like(StringUtils.isNotBlank(dto.getModuleName()), ProjectModuleDO::getModuleName, dto.getModuleName());
return list(queryWrapper);
}
@Override
public List getChildrenModuleIds(String moduleId) {
// 根据模块id查找当前项目下的所有子模块
List list=projectModuleMapperCustom.selectProjectModuleListByModuleId(moduleId);
// 获取当前模块的子模块
if(CollectionUtils.isNotEmpty(list)){
// 查找当前父节点是moduleId下的所有子模块
List subModules = getAllSubModules(moduleId, list);
return subModules;
}
return null;
}
public List buildModuleTree(List moduleList) {
// 将所有模块数据转换为 Map 以便于快速查找
Map moduleMap = moduleList.stream()
.collect(Collectors.toMap(ProjectModuleDO::getId, this::convertToTreeBO));
// 构建树形结构
List rootModules = new ArrayList<>();
for (ProjectModuleDO module : moduleList) {
ProjectModuleTreeBO treeBO = moduleMap.get(module.getId());
if (module.getParentId().equals(module.getProjectId())) {
rootModules.add(treeBO);
} else {
ProjectModuleTreeBO parentBO = moduleMap.get(module.getParentId());
if (parentBO != null) {
parentBO.getChildren().add(treeBO);
}
}
}
return rootModules;
}
private ProjectModuleTreeBO convertToTreeBO(ProjectModuleDO module) {
ProjectModuleTreeBO treeBO = new ProjectModuleTreeBO();
treeBO.setId(module.getId());
treeBO.setName(module.getModuleName());
treeBO.setParentId(module.getParentId());
treeBO.setChildren(new ArrayList<>());
treeBO.setProjectFlag(0); // 你可以根据实际需求设置 projectFlag 的值
return treeBO;
}
}