diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/Edge.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/Edge.java new file mode 100644 index 0000000..7af97a2 --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/Edge.java @@ -0,0 +1,20 @@ +package com.electromagnetic.industry.software.manage.pojo.models; + +import lombok.Data; +import lombok.Getter; + +@Data +@Getter +public class Edge { + String source; // 起点 + String target; // 终点 + String relationId; //关系id + String relationship; //关系描述 + + public Edge(String source, String target, String relationId, String relationship) { + this.source = source; + this.target = target; + this.relationId = relationId; + this.relationship = relationship; + } +} diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FIleRelationVO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FIleRelationVO.java deleted file mode 100644 index 78eea09..0000000 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FIleRelationVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.electromagnetic.industry.software.manage.pojo.resp; - -import lombok.Data; - -@Data -public class FIleRelationVO { - - /** - * 关系主键id - */ - private String relationId; - - /** - * 关系描述 - */ - private String relationship; - - /** - * 关联文件 - */ - private FileSimpleInfoVO relatedFile; - -} diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileRelationViewVO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileRelationViewVO.java index 5c446bb..410b868 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileRelationViewVO.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileRelationViewVO.java @@ -1,5 +1,6 @@ package com.electromagnetic.industry.software.manage.pojo.resp; +import com.electromagnetic.industry.software.manage.pojo.models.Edge; import lombok.Data; import java.util.List; @@ -8,12 +9,12 @@ import java.util.List; public class FileRelationViewVO { /** - * 主文件 + * 关联文件 */ - private FileSimpleInfoVO file; + List nodes; /** - * 关联文件关系列表 + * 边 */ - List relationList; + List edges; } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileSimpleInfoVO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileSimpleInfoVO.java index f805731..b6694ca 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileSimpleInfoVO.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/FileSimpleInfoVO.java @@ -5,6 +5,11 @@ import lombok.Data; @Data public class FileSimpleInfoVO { + /** + * 主键id + */ + private String id; + /** * 文件名称 */ diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java index c6ceed8..6fd07ed 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java @@ -9,17 +9,17 @@ import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper; import com.electromagnetic.industry.software.manage.mapper.EdFileRelationMapper; import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo; import com.electromagnetic.industry.software.manage.pojo.models.EdFileRelation; -import com.electromagnetic.industry.software.manage.pojo.resp.FIleRelationVO; +import com.electromagnetic.industry.software.manage.pojo.models.Edge; import com.electromagnetic.industry.software.manage.pojo.resp.FileRelationViewVO; import com.electromagnetic.industry.software.manage.pojo.resp.FileSimpleInfoVO; import com.electromagnetic.industry.software.manage.service.EdFileRelationService; import org.springframework.beans.BeanUtils; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @Service public class EdFileRelationServiceImpl extends ServiceImpl implements EdFileRelationService { @@ -65,38 +65,71 @@ public class EdFileRelationServiceImpl extends ServiceImpl visitedEdges = new ArrayList<>(); + Set visitedIds = new HashSet<>(); + Set uniqueRelationIds = new HashSet<>(); + + Queue queue = new LinkedList<>(); + + // 初始化 BFS + queue.add(startId); + visitedIds.add(startId); + + while (!queue.isEmpty()) { + String currentId = queue.poll(); + List neighbors = getEdges(currentId); + + for (Edge edge : neighbors) { + + // 添加边信息 + if (!uniqueRelationIds.contains(edge.getRelationId())) { + visitedEdges.add(edge); + uniqueRelationIds.add(edge.getRelationId()); + } + // 如果目标节点未访问,记录边并继续搜索 + if (!visitedIds.contains(edge.getTarget())) { + visitedIds.add(edge.getTarget()); // 标记目标节点为已访问 + queue.add(edge.getTarget()); + } + } + } + fileRelationViewVO.setEdges(visitedEdges); + List nodes = new ArrayList<>(); + for (String id : visitedIds) { + FileSimpleInfoVO fileSimpleInfoVO = new FileSimpleInfoVO(); + EdFileInfo fileInfo = edFileInfoMapper.selectById(id); + BeanUtils.copyProperties(fileInfo, fileSimpleInfoVO); + nodes.add(fileSimpleInfoVO); + } + fileRelationViewVO.setNodes(nodes); + return fileRelationViewVO; + } + + private List getEdges(String id) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(EdFileRelation::getId1, id) .or() - .eq(EdFileRelation::getId2,id); + .eq(EdFileRelation::getId2, id); List list = this.list(queryWrapper); - List relationList = new ArrayList<>(); + List edges = new ArrayList<>(); for (EdFileRelation edFileRelation : list) { - FIleRelationVO fIleRelationVO = new FIleRelationVO(); - fIleRelationVO.setRelationId(edFileRelation.getId()); - fIleRelationVO.setRelationship(edFileRelation.getRelationship()); - String queryId = ""; if (edFileRelation.getId1().equals(id)) { - queryId = edFileRelation.getId2(); + edges.add(new Edge(edFileRelation.getId1(), edFileRelation.getId2(),edFileRelation.getId(),edFileRelation.getRelationship())); } else { - queryId = edFileRelation.getId1(); + edges.add(new Edge(edFileRelation.getId2(), edFileRelation.getId1(),edFileRelation.getId(),edFileRelation.getRelationship())); } - EdFileInfo info = edFileInfoMapper.selectById(queryId); - FileSimpleInfoVO fileSimpleInfoVO = new FileSimpleInfoVO(); - BeanUtils.copyProperties(info, fileSimpleInfoVO); - fIleRelationVO.setRelatedFile(fileSimpleInfoVO); - relationList.add(fIleRelationVO); } - - FileRelationViewVO fileRelationViewVO = new FileRelationViewVO(); - fileRelationViewVO.setRelationList(relationList); - - EdFileInfo info = edFileInfoMapper.selectById(id); - FileSimpleInfoVO fileSimpleInfoVO = new FileSimpleInfoVO(); - BeanUtils.copyProperties(info, fileSimpleInfoVO); - fileRelationViewVO.setFile(fileSimpleInfoVO); - - return fileRelationViewVO; + return edges; } } + + + + + +