package org.jeecg.modules.dnc.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.dnc.entity.*; import org.jeecg.modules.dnc.mapper.ProductMixMapper; import org.jeecg.modules.dnc.service.*; import org.jeecg.modules.dnc.utils.TreeBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; @Service public class ProductMixServiceImpl extends ServiceImpl implements IProductMixService { @Autowired private IPermissionStreamNewService permissionStreamNewService; @Autowired @Lazy private IDeviceTypeService deviceTypeService; @Autowired @Lazy private IDeviceManagementService deviceManagementService; @Autowired @Lazy private IDocInfoService docInfoService; @Autowired @Lazy private IDocRelativeService docRelativeService; /** * 默认结构树查询 * @return */ @Override public List getTree() { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); List rawData = new ArrayList<>(); if (loginUser.getUsername().equals("admin")) { //不需要权限过滤 rawData=permissionStreamNewService.loadProductMixAll(loginUser.getId()); }else{ //需要权限过滤 String productIds = loginUser.getProductionIds(); if (productIds != null && !productIds.isEmpty()) { List productIdList = Arrays.asList(productIds.split(",")); rawData = permissionStreamNewService.loadProductMix(loginUser.getId(),productIdList); } } TreeBuilder builder = new TreeBuilder(); TreeBuilder.CleanResult cleanResult = builder.preprocessData(rawData); List sorted = builder.topologicalSort( cleanResult.getValidNodes(), cleanResult.getNodeMap() ); List result =builder.assembleTree(sorted, cleanResult.getNodeMap()); result.sort(Comparator.comparing(ProductMix::getCreateTime, Comparator.nullsLast(Date::compareTo))); return result; } @Override public List getParentList(String id) { List parentList = new ArrayList<>(); // 1. 根据ID查询当前节点 ProductMix current = this.getById(id); if (current == null) { return parentList; // 节点不存在时返回空列表 } // 2. 从当前节点开始向上查找父节点 Long parentId = current.getParentId(); while ( parentId != 0L) { ProductMix parent = this.getById(parentId.toString()); if (parent == null) { break; } parentList.add(parent); parentId = parent.getParentId(); } return parentList; } @Override public List getChildrenList(String id) { List childrenList = new ArrayList<>(); ProductMix current = this.getById(id); if (current == null) { return childrenList; } // 使用队列进行BFS Queue queue = new LinkedList<>(); queue.add(current); // 加入当前节点作为起点 // 记录已访问节点的ID,避免循环引用 Set visited = new HashSet<>(); visited.add(id); // 起始节点已访问 while (!queue.isEmpty()) { ProductMix node = queue.poll(); // 跳过起始节点(即传入的节点),不加入结果列表 if (!node.getId().toString().equals(id)) { childrenList.add(node); } // 查询当前节点的直接子节点 List directChildren = this.lambdaQuery().eq(ProductMix::getParentId, node.getId()).list(); if (directChildren != null && !directChildren.isEmpty()) { for (ProductMix child : directChildren) { String childId = child.getId().toString(); // 如果该子节点还未访问过 if (!visited.contains(childId)) { visited.add(childId); queue.add(child); } // 否则忽略,避免循环引用导致的死循环 } } } return childrenList; } /** * 查询产品结构树(包括设备类与nc文件) * @return */ @Override public List getProductMixTree() { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); List rawData = new ArrayList<>(); if (loginUser.getUsername().equals("admin")) { //不需要权限过滤 rawData = permissionStreamNewService.loadProductMixAll(loginUser.getId()); } else { //需要权限过滤 String productIds = loginUser.getProductionIds(); if (productIds != null && !productIds.isEmpty()) { List productIdList = Arrays.asList(productIds.split(",")); rawData = permissionStreamNewService.loadProductMix(loginUser.getId(), productIdList); } } List ids = rawData.stream() .filter(p -> p.getType() != null) .filter(productMix -> productMix.getType() == 5 || productMix.getType() == 6) .map(ProductMix::getId) .collect(Collectors.toList()); if (ids.isEmpty()) { return rawData; } //过滤设备类关联信息 List deviceTypeList = deviceTypeService.list(new QueryWrapper() .in("attribution_id", ids)); List productMixList = new ArrayList<>(); deviceTypeList.forEach(item->{ ProductMix productMix = new ProductMix(); productMix.setId(Long.parseLong(item.getId())); productMix.setParentId(Long.parseLong(item.getAttributionId())); DeviceManagement deviceManagement=deviceManagementService.getById(item.getDeviceManagementId()); productMix.setTreeCode(deviceManagement.getDeviceManagementCode()); productMix.setTreeName(deviceManagement.getDeviceManagementName()); productMix.setType(7); productMixList.add(productMix); }); rawData.addAll(productMixList); //过滤文档关联信息 List deviceTypeIds = deviceTypeList.stream().map(DeviceType::getId).collect(Collectors.toList()); List relativeList = docRelativeService.list(new QueryWrapper() .in("attribution_id", deviceTypeIds)); List docList = new ArrayList<>(); relativeList.forEach(item->{ ProductMix productMix = new ProductMix(); productMix.setId(Long.parseLong(item.getId())); productMix.setParentId(Long.parseLong(item.getAttributionId())); DocInfo docInfo = docInfoService.getById(item.getDocId()); productMix.setTreeCode(docInfo.getDocSuffix()); productMix.setTreeName(docInfo.getDocName()); productMix.setType(99); docList.add(productMix); }); rawData.addAll(docList); TreeBuilder builder = new TreeBuilder(); TreeBuilder.CleanResult cleanResult = builder.preprocessData(rawData); List sorted = builder.topologicalSort( cleanResult.getValidNodes(), cleanResult.getNodeMap() ); List result =builder.assembleTree(sorted, cleanResult.getNodeMap()); result.sort(Comparator.comparing(ProductMix::getCreateTime, Comparator.nullsLast(Date::compareTo))); return result; } }