diff --git a/biz/pom.xml b/biz/pom.xml index 4c0f6040dad7034d75ef59c596b4c0d9e526fbd0..cde60a0e498597e9969b28acd1e5c8d17b268750 100644 --- a/biz/pom.xml +++ b/biz/pom.xml @@ -31,6 +31,10 @@ org.mapstruct mapstruct + + org.apache.commons + commons-text + diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/adapter/GraphAdapterService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/adapter/GraphAdapterService.java index 3c151b9aeb235cfbd9ba0f3947e9ff188c0e0b8f..8998617c02e756a71d545c64b4685ca279f089d8 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/adapter/GraphAdapterService.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/adapter/GraphAdapterService.java @@ -1,20 +1,27 @@ package cn.icanci.loopstack.bic.biz.adapter; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import javax.annotation.Resource; +import org.apache.commons.text.StringSubstitutor; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import cn.hutool.json.JSONUtil; import cn.icanci.loopstack.bic.biz.exception.GraphAdapterException; import cn.icanci.loopstack.bic.biz.service.EdgeStyleService; import cn.icanci.loopstack.bic.biz.service.NodeService; import cn.icanci.loopstack.bic.biz.service.NodeStyleService; import cn.icanci.loopstack.bic.biz.service.UnitViewService; import cn.icanci.loopstack.bic.common.model.base.EdgeStyleVO; +import cn.icanci.loopstack.bic.common.model.base.NodeStyleVO; +import cn.icanci.loopstack.bic.common.model.base.NodeVO; import cn.icanci.loopstack.bic.common.model.graph.UnitEdgeVO; import cn.icanci.loopstack.bic.common.model.graph.UnitNodeVO; import cn.icanci.loopstack.bic.common.model.graph.UnitViewVO; @@ -58,15 +65,26 @@ public class GraphAdapterService implements GraphAdapter { } private Node buildNode(UnitNodeVO node) { - Node retNode = new Node(); -// retNode.setId(); -// retNode.setShape(); -// retNode.setWidth(); -// retNode.setHeight(); -// retNode.setAttrs(); + String nodeUuid = node.getNodeUuid(); + String styleUuid = node.getStyleUuid(); + NodeVO nodeVO = nodeService.queryByUuid(nodeUuid); + String nodeStyle = Optional.ofNullable(nodeStyleService.queryByUuid(styleUuid)).map(NodeStyleVO::getNodeStyle).orElse(nodeStyleService.loadDefaultStyle()); + StringSubstitutor sub = new StringSubstitutor(buildNodeMap(nodeVO)); + nodeStyle = sub.replace(nodeStyle); + Node retNode = JSONUtil.toBean(nodeStyle, Node.class); + retNode.setNodeDataMode(node.getNodeDataMode().getCode()); + retNode.setNodeDataKey(node.getNodeDataKey()); + retNode.setNodeType(node.getNodeType().getCode()); return retNode; } + private Map buildNodeMap(NodeVO node) { + HashMap nodeMap = Maps.newHashMap(); + nodeMap.put("id", node.getUuid()); + nodeMap.put("nodeName", node.getNodeName()); + return nodeMap; + } + private List adapterEdges(List edges) { List retEdges = Lists.newArrayList(); for (UnitEdgeVO edge : edges) { @@ -77,19 +95,19 @@ public class GraphAdapterService implements GraphAdapter { private Edge buildEdge(UnitEdgeVO edge) { String styleUuid = edge.getStyleUuid(); - // TODO 查询样式 String edgeStyle = Optional.ofNullable(edgeStyleService.queryByUuid(styleUuid)).map(EdgeStyleVO::getEdgeStyle).orElse(edgeStyleService.loadDefaultStyle()); - - Edge retEdge = new Edge(); -// retEdge.setSource(); -// retEdge.setTarget(); -// retEdge.setAttrs(); -// retEdge.setRouter(); -// retEdge.setConnector(); -// retEdge.setLabels(); -// retEdge.setConsumerInfo(); -// retEdge.setHistoryInfo(); + StringSubstitutor sub = new StringSubstitutor(buildEdgeMap(edge)); + edgeStyle = sub.replace(edgeStyle); + Edge retEdge = JSONUtil.toBean(edgeStyle, Edge.class); + retEdge.setDeep(edge.getDeep()); return retEdge; + } + private Map buildEdgeMap(UnitEdgeVO edge) { + HashMap edgeMap = Maps.newHashMap(); + edgeMap.put("sourceId", edge.getSourceUuid()); + edgeMap.put("targetId", edge.getTargetUuid()); + edgeMap.put("hoverName", edge.getHoverName()); + return edgeMap; } } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/.gitkeep b/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphKey.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphKey.java index 7294e4f46e557b43ad3938609e6c4ba6d26d496d..540662fa686101a891420c5717bf7c3e1fea493d 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphKey.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphKey.java @@ -1,5 +1,6 @@ package cn.icanci.loopstack.bic.biz.cache; +import lombok.AllArgsConstructor; import lombok.Data; import java.util.Objects; @@ -11,6 +12,7 @@ import java.util.Objects; * @since 1.0 Created in 2023/09/21 10:48 */ @Data +@AllArgsConstructor public class GraphKey { /** 系统uuid */ private String systemUuid; diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphRepository.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphRepository.java index c6597c7e953d20f52bca516c5dec95aa5f852b2c..63ee3d2957c42cdbad767df8acf4026a46b3a178 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphRepository.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/cache/GraphRepository.java @@ -1,28 +1,62 @@ package cn.icanci.loopstack.bic.biz.cache; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Service; +import com.google.common.collect.Maps; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.bic.biz.service.SnapshotService; +import cn.icanci.loopstack.bic.common.model.snapshot.UnitViewSnapshotVO; +import cn.icanci.loopstack.bic.graph.Graph; + /** * @author icanci * @since 1.0 Created in 2023/09/20 23:59 */ @Service public final class GraphRepository implements ApplicationContextAware { - private ApplicationContext context; + + @Resource + private SnapshotService snapshotService; + + private static final Map REPOSITORY = Maps.newConcurrentMap(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.context = applicationContext; + doGraphRepositoryReload(); } private void doGraphRepositoryReload() { - // TODO 加载所有缓存 + List unitViewSnapshotVOS = snapshotService.loadUseCaseSnapshot(); + for (UnitViewSnapshotVO unitViewSnapshotVO : unitViewSnapshotVOS) { + refresh(unitViewSnapshotVO); + } } public void refresh(String systemUuid, String useCaseUuid) { - // TODO 刷新缓存 + UnitViewSnapshotVO unitViewSnapshot = snapshotService.queryBySystemUuidAndUseCaseUuid(systemUuid, useCaseUuid); + refresh(unitViewSnapshot); } + + public Graph get(String systemUuid, String useCaseUuid) { + return REPOSITORY.get(new GraphKey(systemUuid, useCaseUuid)); + } + + private void refresh(UnitViewSnapshotVO unitViewSnapshot) { + if (unitViewSnapshot == null) { + return; + } + String systemUuid = unitViewSnapshot.getSystemUuid(); + String useCaseUuid = unitViewSnapshot.getUseCaseUuid(); + REPOSITORY.put(new GraphKey(systemUuid, useCaseUuid), JSONUtil.toBean(unitViewSnapshot.getSnapshot(), Graph.class)); + } + } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/EdgeStyleDtsServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/EdgeStyleDtsServiceImpl.java index 5f0eece412c889882747c631aba09ab60c7b0677..45e6416a58c277a8258fe506b8c795881fc7a185 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/EdgeStyleDtsServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/EdgeStyleDtsServiceImpl.java @@ -1,13 +1,23 @@ package cn.icanci.loopstack.bic.biz.dts.impl; +import java.util.List; +import java.util.Set; + import javax.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import com.google.common.collect.Sets; + import cn.icanci.loopstack.bic.biz.dts.DTS; import cn.icanci.loopstack.bic.biz.dts.GraphDtsService; import cn.icanci.loopstack.bic.biz.service.SnapshotService; +import cn.icanci.loopstack.bic.biz.service.UnitViewService; import cn.icanci.loopstack.bic.common.model.base.EdgeStyleVO; +import cn.icanci.loopstack.bic.common.model.graph.UnitEdgeVO; +import cn.icanci.loopstack.bic.common.model.graph.UnitViewVO; /** * @author icanci @@ -19,16 +29,32 @@ import cn.icanci.loopstack.bic.common.model.base.EdgeStyleVO; public class EdgeStyleDtsServiceImpl implements GraphDtsService { @Resource private SnapshotService snapshotService; + @Resource + private UnitViewService unitViewService; @Override public void dtsUnitViewTree(EdgeStyleVO edgeStyle) { - // Tips: 创建线程池进行并行更新 - // 1 获取边被使用的系统和用例 - // 1.1 如果没有,结束 - // 1.2 如果有,获取所有使用此边的纠察图 - // 2 遍历进行更新 - // TODO 自动刷新快照和版本, - // 自动刷新纠察图结构缓存 - // snapshotService.refresh(edgeStyle.getSystemUuid(),); + List unitViews = unitViewService.queryBySystemUuid(edgeStyle.getSystemUuid()); + if (CollectionUtils.isEmpty(unitViews)) { + return; + } + + Set useCaseUuids = Sets.newHashSet(); + for (UnitViewVO unitView : unitViews) { + List edges = unitView.getEdges(); + if (CollectionUtils.isEmpty(edges)) { + continue; + } + + for (UnitEdgeVO edge : edges) { + if (StringUtils.equals(edgeStyle.getUuid(), edge.getStyleUuid())) { + useCaseUuids.add(unitView.getUseCaseUuid()); + } + } + } + // TODO 如果执行的慢可以使用线程池进行更新,此处咱不处理 + useCaseUuids.forEach(useCaseUuid -> { + snapshotService.refresh(edgeStyle.getSystemUuid(), useCaseUuid); + }); } } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeStyleDtsServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeStyleDtsServiceImpl.java index 1a8508af99247cd05674f434062abb786fa0ad8f..8fce3182df591b58f7bce45d93be2ec4ad2ad8a4 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeStyleDtsServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeStyleDtsServiceImpl.java @@ -1,13 +1,23 @@ package cn.icanci.loopstack.bic.biz.dts.impl; +import java.util.List; +import java.util.Set; + import javax.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import com.google.common.collect.Sets; + import cn.icanci.loopstack.bic.biz.dts.DTS; import cn.icanci.loopstack.bic.biz.dts.GraphDtsService; import cn.icanci.loopstack.bic.biz.service.SnapshotService; +import cn.icanci.loopstack.bic.biz.service.UnitViewService; import cn.icanci.loopstack.bic.common.model.base.NodeStyleVO; +import cn.icanci.loopstack.bic.common.model.graph.UnitNodeVO; +import cn.icanci.loopstack.bic.common.model.graph.UnitViewVO; /** * @author icanci @@ -19,14 +29,31 @@ import cn.icanci.loopstack.bic.common.model.base.NodeStyleVO; public class NodeStyleDtsServiceImpl implements GraphDtsService { @Resource private SnapshotService snapshotService; + @Resource + private UnitViewService unitViewService; @Override - public void dtsUnitViewTree(NodeStyleVO type) { - // 1 获取节点被使用的系统和用例 - // 1.1 如果没有,结束 - // 1.2 如果有,获取所有使用此节点的纠察图 - // 2 遍历进行更新 - // TODO 自动刷新快照和版本, - // 节点样式变更之后:自动刷新纠察图结构缓存 + public void dtsUnitViewTree(NodeStyleVO nodeStyle) { + List unitViews = unitViewService.queryBySystemUuid(nodeStyle.getSystemUuid()); + if (CollectionUtils.isEmpty(unitViews)) { + return; + } + Set useCaseUuids = Sets.newHashSet(); + for (UnitViewVO unitView : unitViews) { + List nodes = unitView.getNodes(); + if (CollectionUtils.isEmpty(nodes)) { + continue; + } + + for (UnitNodeVO node : nodes) { + if (StringUtils.equals(nodeStyle.getUuid(), node.getStyleUuid())) { + useCaseUuids.add(unitView.getUseCaseUuid()); + } + } + } + // TODO 如果执行的慢可以使用线程池进行更新,此处咱不处理 + useCaseUuids.forEach(useCaseUuid -> { + snapshotService.refresh(nodeStyle.getSystemUuid(), useCaseUuid); + }); } } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeVueDtsServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeVueDtsServiceImpl.java index b658c5ceb44c4fbefabb932ab31e3dee9b94e22e..ddd618d7c9b9896fd124789a09a82f8aa752d3b1 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeVueDtsServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/NodeVueDtsServiceImpl.java @@ -1,13 +1,23 @@ package cn.icanci.loopstack.bic.biz.dts.impl; +import java.util.List; +import java.util.Set; + import javax.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import com.google.common.collect.Sets; + import cn.icanci.loopstack.bic.biz.dts.DTS; import cn.icanci.loopstack.bic.biz.dts.GraphDtsService; import cn.icanci.loopstack.bic.biz.service.SnapshotService; +import cn.icanci.loopstack.bic.biz.service.UnitViewService; import cn.icanci.loopstack.bic.common.model.base.NodeVueVO; +import cn.icanci.loopstack.bic.common.model.graph.UnitNodeVO; +import cn.icanci.loopstack.bic.common.model.graph.UnitViewVO; /** * @author icanci @@ -19,14 +29,32 @@ import cn.icanci.loopstack.bic.common.model.base.NodeVueVO; public class NodeVueDtsServiceImpl implements GraphDtsService { @Resource private SnapshotService snapshotService; + @Resource + private UnitViewService unitViewService; @Override - public void dtsUnitViewTree(NodeVueVO type) { - // 1 获取节点被使用的系统和用例 - // 1.1 如果没有,结束 - // 1.2 如果有,获取所有使用此节点的纠察图 - // 2 遍历进行更新 - // TODO 自动刷新快照和版本 - // 节点组件变更之后:自动刷新纠察图结构缓存 + public void dtsUnitViewTree(NodeVueVO nodeVue) { + List unitViews = unitViewService.queryBySystemUuid(nodeVue.getSystemUuid()); + if (CollectionUtils.isEmpty(unitViews)) { + return; + } + + Set useCaseUuids = Sets.newHashSet(); + for (UnitViewVO unitView : unitViews) { + List nodes = unitView.getNodes(); + if (CollectionUtils.isEmpty(nodes)) { + continue; + } + + for (UnitNodeVO node : nodes) { + if (StringUtils.equals(nodeVue.getUuid(), node.getNodeVue())) { + useCaseUuids.add(unitView.getUseCaseUuid()); + } + } + } + // TODO 如果执行的慢可以使用线程池进行更新,此处咱不处理 + useCaseUuids.forEach(useCaseUuid -> { + snapshotService.refresh(nodeVue.getSystemUuid(), useCaseUuid); + }); } } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/UnitViewTreeGraphDtsServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/UnitViewTreeGraphDtsServiceImpl.java index d2ffe659c9fc236ff19dc2183ef7beb73c114f5a..0fea34697258735bc888accf3cb6b9b6031d4113 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/UnitViewTreeGraphDtsServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/dts/impl/UnitViewTreeGraphDtsServiceImpl.java @@ -1,7 +1,9 @@ package cn.icanci.loopstack.bic.biz.dts.impl; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Resource; @@ -14,9 +16,11 @@ import com.google.common.collect.Sets; import cn.hutool.core.lang.Pair; import cn.icanci.loopstack.bic.biz.dts.DTS; import cn.icanci.loopstack.bic.biz.dts.GraphDtsService; +import cn.icanci.loopstack.bic.biz.service.NodeVueService; import cn.icanci.loopstack.bic.biz.service.SnapshotService; import cn.icanci.loopstack.bic.biz.service.UnitViewService; import cn.icanci.loopstack.bic.common.enums.NodeTypeEnum; +import cn.icanci.loopstack.bic.common.model.base.NodeVueVO; import cn.icanci.loopstack.bic.common.model.graph.*; /** @@ -30,6 +34,8 @@ public class UnitViewTreeGraphDtsServiceImpl implements GraphDtsService, List> adapter2Pair(List relationModel) { + List nodeVueList = nodeVueService.queryAll(); + Map nodeVueMap = nodeVueList.stream().collect(Collectors.toMap(NodeVueVO::getUuid, nodeVueVO -> nodeVueVO)); List edges = Lists.newArrayList(); Set nodes = Sets.newHashSet(); - loopAdapter(edges, nodes, relationModel); + + int deep = 0; + loopAdapter(deep, edges, nodes, relationModel, nodeVueMap); return new Pair<>(edges, Lists.newArrayList(nodes)); } - private void loopAdapter(List edges, Set nodes, List relationModel) { + private void loopAdapter(int edgeDeep, List edges, Set nodes, List relationModel, Map nodeVueMap) { for (UnitViewTreeRelationVO rm : relationModel) { - nodes.add(buildSourceNode(rm)); - nodes.add(buildTargetNode(rm)); - edges.add(buildEdge(rm)); + nodes.add(buildSourceNode(rm, nodeVueMap.get(rm.getSourceNodeUuid()))); + nodes.add(buildTargetNode(rm, nodeVueMap.get(rm.getTargetNodeUuid()))); + edges.add(buildEdge(rm, edgeDeep)); if (CollectionUtils.isNotEmpty(rm.getChildren())) { - loopAdapter(edges, nodes, rm.getChildren()); + loopAdapter(++edgeDeep, edges, nodes, rm.getChildren(), nodeVueMap); } } } @@ -92,16 +102,18 @@ public class UnitViewTreeGraphDtsServiceImpl implements GraphDtsService { +} diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/mapper/GraphMapper.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/mapper/GraphMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..b1fa74f28a273d996992cb58963776c87b7917b2 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/mapper/GraphMapper.java @@ -0,0 +1,15 @@ +package cn.icanci.loopstack.bic.biz.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.NullValueMappingStrategy; + +import cn.icanci.loopstack.bic.graph.Graph; +import cn.icanci.loopstack.bic.graph.UnitViewGraph; + +/** + * @author icanci + * @since 1.0 Created in 2023/09/23 23:06 + */ +@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL) +public interface GraphMapper extends BaseMapper { +} diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/BuryingService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/BuryingService.java index 54645792787852cba1997e463ed5774474e2a4f1..10ab684c911447f0c5d1c80baa78d2f2aab1598b 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/BuryingService.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/BuryingService.java @@ -18,4 +18,6 @@ public interface BuryingService { PageList queryPage(BuryingVO burying, int pageNum, int pageSize); void save(BuryingVO burying); + + List queryBySystemAndUseCase(String systemUuid, String useCaseUuid, String traceId, String orderSerialNo); } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/GraphService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/GraphService.java new file mode 100644 index 0000000000000000000000000000000000000000..e9a1844e35084832a14227e63560ac0c0b9c68ee --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/GraphService.java @@ -0,0 +1,20 @@ +package cn.icanci.loopstack.bic.biz.service; + +import cn.icanci.loopstack.bic.graph.UnitViewGraph; + +/** + * @author icanci + * @since 1.0 Created in 2023/09/23 23:00 + */ +public interface GraphService { + /** + * 构建单元纠察图 + * + * @param systemUuid 系统uuid + * @param useCaseUuid 用例uuid + * @param traceId traceId + * @param orderSerialNo 订单流水号 + * @return 单元纠察图 + */ + UnitViewGraph buildOneGraph(String systemUuid, String useCaseUuid, String traceId, String orderSerialNo); +} diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeService.java index d86e0e8e9867f39f6afd508d456d49672f45da19..bb2d9772bb82fa54b0e81e0923c6b17302440f5d 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeService.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeService.java @@ -30,4 +30,6 @@ public interface NodeService extends BaseService { List loadSelector(String systemUuid); List loadAllSelector(); + + NodeVO queryByUuid(String nodeUuid); } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeStyleService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeStyleService.java index c79164786f6d2c96351f1dd869b178d398fd617a..ed5c87580315547248d2106f2570af9aab5d4132 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeStyleService.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/NodeStyleService.java @@ -30,4 +30,6 @@ public interface NodeStyleService extends BaseService { List loadSelector(String systemUuid); String loadDefaultStyle(); + + NodeStyleVO queryByUuid(String styleUuid); } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/SnapshotService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/SnapshotService.java index 19a071902c513e96c451195c383595f581f70961..c0722ba701eb74cd129236ba815d0ba2eb26e1de 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/SnapshotService.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/SnapshotService.java @@ -1,5 +1,9 @@ package cn.icanci.loopstack.bic.biz.service; +import java.util.List; + +import cn.icanci.loopstack.bic.common.model.snapshot.UnitViewSnapshotVO; + /** * @author icanci * @since 1.0 Created in 2023/09/21 00:08 @@ -12,4 +16,8 @@ public interface SnapshotService { * @param useCaseUuid useCaseUuid */ void refresh(String systemUuid, String useCaseUuid); + + List loadUseCaseSnapshot(); + + UnitViewSnapshotVO queryBySystemUuidAndUseCaseUuid(String systemUuid, String useCaseUuid); } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewService.java index 4430e449536fcc7b9f101f8310f1cff8bc296ea9..20799d8c0cfb8bb4ae5ab6364773765bfb7e4908 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewService.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewService.java @@ -23,4 +23,6 @@ public interface UnitViewService extends BaseService { PageList queryPage(UnitViewVO unitViewVO, int pageNum, int pageSize); UnitViewVO queryBySystemUuidAndUseCaseUuid(String systemUuid, String useCaseUuid); + + List queryBySystemUuid(String systemUuid); } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewSnapshotService.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewSnapshotService.java index 476f14b75a2e978dfc3748029fb577e9dd6dc32e..2ad421e97370a2c559f7b89ed1f3870226a8e42c 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewSnapshotService.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/UnitViewSnapshotService.java @@ -22,8 +22,6 @@ public interface UnitViewSnapshotService extends BaseService @Override PageList queryPage(UnitViewSnapshotVO unitViewSnapshotVO, int pageNum, int pageSize); - UnitViewSnapshotVO queryBySystemUuidAndUseCaseUuid(String systemUuid, String useCaseUuid); - UnitViewSnapshotVO queryBySystemUuidAndUseCaseUuidAndVersion(String systemUuid, String useCaseUuid, long version); } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/BuryingServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/BuryingServiceImpl.java index fd2155f770e010dd18885dce544a9e51b3a894f0..64f4e122e1fa28f80050c7bb0ada06187722ce6d 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/BuryingServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/BuryingServiceImpl.java @@ -54,6 +54,11 @@ public class BuryingServiceImpl implements BuryingService { } } + @Override + public List queryBySystemAndUseCase(String systemUuid, String useCaseUuid, String traceId, String orderSerialNo) { + return buryingMapper.dos2vos(buryingDAO.queryBySystemAndUseCase(systemUuid, useCaseUuid, traceId, orderSerialNo)); + } + private boolean doInsert(BuryingVO burying) { return StringUtils.isBlank(burying.getId()); } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/GraphServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/GraphServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d8e26f19366a2fca3138535bdb3f24cad2e6c071 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/GraphServiceImpl.java @@ -0,0 +1,103 @@ +package cn.icanci.loopstack.bic.biz.service.impl; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; + +import cn.icanci.loopstack.bic.biz.cache.GraphRepository; +import cn.icanci.loopstack.bic.biz.mapper.GraphBuryingMapper; +import cn.icanci.loopstack.bic.biz.mapper.GraphMapper; +import cn.icanci.loopstack.bic.biz.service.BuryingService; +import cn.icanci.loopstack.bic.biz.service.GraphService; +import cn.icanci.loopstack.bic.common.enums.NodeDataModeEnum; +import cn.icanci.loopstack.bic.graph.Graph; +import cn.icanci.loopstack.bic.graph.GraphBurying; +import cn.icanci.loopstack.bic.graph.UnitViewGraph; +import cn.icanci.loopstack.bic.graph.edge.Edge; +import cn.icanci.loopstack.bic.graph.node.UnitViewNode; +import lombok.Data; + +/** + * @author icanci + * @since 1.0 Created in 2023/09/23 23:00 + */ +@Service +public class GraphServiceImpl implements GraphService { + @Resource + private GraphRepository graphRepository; + @Resource + private BuryingService buryingService; + @Resource + private GraphMapper graphMapper; + @Resource + private GraphBuryingMapper graphBuryingMapper; + + @Override + public UnitViewGraph buildOneGraph(String systemUuid, String useCaseUuid, String traceId, String orderSerialNo) { + Graph graph = graphRepository.get(systemUuid, useCaseUuid); + UnitViewGraph unitViewGraph = graphMapper.do2vo(graph); + if (unitViewGraph == null) { + return null; + } + List graphBuryingList = graphBuryingMapper.vos2dos(buryingService.queryBySystemAndUseCase(systemUuid, useCaseUuid, traceId, orderSerialNo)); + // 数据集合 + Map> uniqueKeyMap = graphBuryingList.stream().collect(Collectors.groupingBy(GraphBurying::getUniqueKey)); + // 根据前缀匹配和全部匹配进行值匹配 + for (UnitViewNode node : unitViewGraph.getNodes()) { + NodeDataModeEnum nodeDataMode = NodeDataModeEnum.getEnumByCode(node.getNodeDataMode()); + String nodeDataKey = node.getNodeDataKey(); + node.setBuryings(buildBuryings(nodeDataMode, nodeDataKey, uniqueKeyMap)); + } + // 图渲染,构建额外参数 + unitViewGraphRender(unitViewGraph); + return unitViewGraph; + } + + private void unitViewGraphRender(UnitViewGraph unitViewGraph) { + Map nodeMap = unitViewGraph.getNodes().stream().collect(Collectors.toMap(UnitViewNode::getId, node -> node)); + // 组装边节点的临时变量 + List edgeRelations = Lists.newArrayList(); + for (Edge edge : unitViewGraph.getEdges()) { + UnitViewNode source = nodeMap.get(edge.getSource().getCell()); + UnitViewNode target = nodeMap.get(edge.getTarget().getCell()); + EdgeRelation edgeRelation = new EdgeRelation(); + edgeRelation.setSource(source); + edgeRelation.setTarget(target); + edgeRelation.setEdge(edge); + edgeRelations.add(edgeRelation); + } + // 对EdgeRelation进行排序,排序从大到小,会有个深度的计算 + edgeRelations = edgeRelations.stream().sorted((o1, o2) -> o2.getEdge().getDeep() - o1.getEdge().getDeep()).collect(Collectors.toList()); + // 组装边节点的临时变量 + for (EdgeRelation edgeRelation : edgeRelations) { + UnitViewNode target = edgeRelation.getTarget(); + if (target.hasPathPass()) { + edgeRelation.getSource().setPathPass(true); + } + } + } + + private List buildBuryings(NodeDataModeEnum nodeDataMode, String nodeDataKey, Map> uniqueKeyMap) { + // 构建当前匹配key的数据值 + if (nodeDataMode == NodeDataModeEnum.PREFIX) { + return uniqueKeyMap.entrySet().stream().filter(entry -> entry.getKey().startsWith(nodeDataKey)).map(Map.Entry::getValue).flatMap(List::stream) + .collect(Collectors.toList()); + } else if (nodeDataMode == NodeDataModeEnum.ALL) { + return uniqueKeyMap.entrySet().stream().filter(entry -> entry.getKey().equals(nodeDataKey)).map(Map.Entry::getValue).flatMap(List::stream).collect(Collectors.toList()); + } + return Lists.newArrayList(); + } + + @Data + private static class EdgeRelation { + private UnitViewNode source; + private UnitViewNode target; + private Edge edge; + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeServiceImpl.java index 74a22a0f5252ee8d0f7a6fe246d29341a4479d0f..3bed976217d376393fbddaccc10b1fee35cc04a2 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeServiceImpl.java @@ -109,4 +109,9 @@ public class NodeServiceImpl implements NodeService { } return textValues; } + + @Override + public NodeVO queryByUuid(String nodeUuid) { + return nodeMapper.do2vo(nodeDAO.queryByUuid(nodeUuid)); + } } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeStyleServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeStyleServiceImpl.java index f81b8ec325c8e9290424fb77fcf2086e9f5d7819..1307d2538615399cc2dceeb7ba78a88e97040172 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeStyleServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/NodeStyleServiceImpl.java @@ -48,8 +48,6 @@ public class NodeStyleServiceImpl implements NodeStyleService { nodeStyleDAO.update(nodeStyleMapper.vo2do(nodeStyleVO)); graphDtsServiceProxy.dtsUnitViewTree(nodeStyleVO); } - // 更新视图样式 - // TODO 最后补充更新视图的逻辑,因为这个地方会构建缓存 } @Override @@ -100,4 +98,9 @@ public class NodeStyleServiceImpl implements NodeStyleService { public String loadDefaultStyle() { return TemplateFileUtils.queryDefaultNodeStyleTemplate(); } + + @Override + public NodeStyleVO queryByUuid(String styleUuid) { + return nodeStyleMapper.do2vo(nodeStyleDAO.queryByUuid(styleUuid)); + } } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/SnapshotServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/SnapshotServiceImpl.java index 5acb2f46d60287000eecefb2f4c7944e8b12483c..2de5c7bad2432b846b62d619a800361bea3803e9 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/SnapshotServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/SnapshotServiceImpl.java @@ -1,9 +1,15 @@ package cn.icanci.loopstack.bic.biz.service.impl; +import java.text.SimpleDateFormat; +import java.util.List; + import javax.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import com.google.common.collect.Lists; + import cn.hutool.json.JSONUtil; import cn.icanci.loopstack.bic.biz.adapter.GraphAdapter; import cn.icanci.loopstack.bic.biz.service.SnapshotService; @@ -28,23 +34,46 @@ public class SnapshotServiceImpl implements SnapshotService { @Resource private GraphAdapter graphAdapter; - // TODO 数据一致性问题 @Override public void refresh(String systemUuid, String useCaseUuid) { long version = refreshSnapshotIndex(systemUuid, useCaseUuid); Graph graph = graphAdapter.graph(systemUuid, useCaseUuid); String snapshot = JSONUtil.toJsonStr(graph); - UnitViewSnapshotVO unitViewSnapshot = unitViewSnapshotService.queryBySystemUuidAndUseCaseUuid(systemUuid, useCaseUuid); - if (unitViewSnapshot == null) { - unitViewSnapshot = new UnitViewSnapshotVO(); - unitViewSnapshot.setSystemUuid(systemUuid); - unitViewSnapshot.setUseCaseUuid(useCaseUuid); - } + UnitViewSnapshotVO unitViewSnapshot = new UnitViewSnapshotVO(); + unitViewSnapshot.setSystemUuid(systemUuid); + unitViewSnapshot.setUseCaseUuid(useCaseUuid); unitViewSnapshot.setVersion(version); unitViewSnapshot.setSnapshot(snapshot); + unitViewSnapshot.setName(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(version)); unitViewSnapshotService.save(unitViewSnapshot); } + @Override + public List loadUseCaseSnapshot() { + List indexes = unitViewSnapshotIndexService.queryAll(); + List ret = Lists.newArrayList(); + if (CollectionUtils.isEmpty(indexes)) { + return ret; + } + + for (UnitViewSnapshotIndexVO index : indexes) { + UnitViewSnapshotVO snapshot = unitViewSnapshotService.queryBySystemUuidAndUseCaseUuidAndVersion(index.getSystemUuid(), index.getUseCaseUuid(), index.getVersion()); + if (snapshot != null) { + ret.add(snapshot); + } + } + return ret; + } + + @Override + public UnitViewSnapshotVO queryBySystemUuidAndUseCaseUuid(String systemUuid, String useCaseUuid) { + UnitViewSnapshotIndexVO index = unitViewSnapshotIndexService.queryBySystemUuidAndUseCaseUuid(systemUuid, useCaseUuid); + if (index != null) { + return unitViewSnapshotService.queryBySystemUuidAndUseCaseUuidAndVersion(systemUuid, useCaseUuid, index.getVersion()); + } + return null; + } + /** * 刷新快照索引并返回版本 * diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewServiceImpl.java index dfdb9484e166cd7c178b896f35d5a23b5976ddf1..bd03bb8bef3f6f05fc548ce9b92f5d300d78c706 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewServiceImpl.java @@ -56,4 +56,9 @@ public class UnitViewServiceImpl implements UnitViewService { public UnitViewVO queryBySystemUuidAndUseCaseUuid(String systemUuid, String useCaseUuid) { return unitViewMapper.do2vo(unitViewDAO.queryBySystemUuidAndUseCaseUuid(systemUuid, useCaseUuid)); } + + @Override + public List queryBySystemUuid(String systemUuid) { + return unitViewMapper.dos2vos(unitViewDAO.queryBySystemUuid(systemUuid)); + } } diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewSnapshotServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewSnapshotServiceImpl.java index 478a3df494adb911b340c9f500cc975c1c04c5d9..2ceaba36f1bf4d521c5614913d2737aa58269da2 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewSnapshotServiceImpl.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/service/impl/UnitViewSnapshotServiceImpl.java @@ -57,11 +57,6 @@ public class UnitViewSnapshotServiceImpl implements UnitViewSnapshotService { } - @Override - public UnitViewSnapshotVO queryBySystemUuidAndUseCaseUuid(String systemUuid, String useCaseUuid) { - return unitViewSnapshotMapper.do2vo(unitViewSnapshotDAO.queryBySystemUuidAndUseCaseUuid(systemUuid, useCaseUuid)); - } - @Override public UnitViewSnapshotVO queryBySystemUuidAndUseCaseUuidAndVersion(String systemUuid, String useCaseUuid, long version) { return unitViewSnapshotMapper.do2vo(unitViewSnapshotDAO.queryBySystemUuidAndUseCaseUuidAndVersion(systemUuid, useCaseUuid, version)); diff --git a/biz/src/main/resources/style/default-edge-style-template.json b/biz/src/main/resources/style/default-edge-style-template.json index 0faeb86f2d79383aced5ac21e88e72a9ad1e03ed..c027f030c1dab7ea1681ad14075ffc0c0c36ecb7 100644 --- a/biz/src/main/resources/style/default-edge-style-template.json +++ b/biz/src/main/resources/style/default-edge-style-template.json @@ -1,4 +1,12 @@ { + "source": { + "cell": "${sourceId}", + "port": "port-right" + }, + "target": { + "cell": "${targetId}", + "port": "port-left" + }, "attrs": { "line": { "stroke": "#7c68fc", diff --git a/biz/src/main/resources/style/demo-edge-style-template.json b/biz/src/main/resources/style/demo-edge-style-template.json index 426101f2fc76dd4bf6a13b751a721bb70afd120e..cb930936ccbaaa38a641211592484166018a996e 100644 --- a/biz/src/main/resources/style/demo-edge-style-template.json +++ b/biz/src/main/resources/style/demo-edge-style-template.json @@ -1,4 +1,12 @@ { + "source": { + "cell": "BICXXXXX1", + "port": "port-right" + }, + "target": { + "cell": "BICXXXXX2", + "port": "port-left" + }, "attrs": { "line": { "stroke": "#7c68fc", diff --git a/common/src/main/java/cn/icanci/loopstack/bic/common/enums/NodeDataModeEnum.java b/common/src/main/java/cn/icanci/loopstack/bic/common/enums/NodeDataModeEnum.java index 878605888e675aadb26666c6f8dca2c8b7b6224f..ce1b6f4be99e9ce418226ebd625ee6eeff2396b0 100644 --- a/common/src/main/java/cn/icanci/loopstack/bic/common/enums/NodeDataModeEnum.java +++ b/common/src/main/java/cn/icanci/loopstack/bic/common/enums/NodeDataModeEnum.java @@ -26,4 +26,13 @@ public enum NodeDataModeEnum { private final String code; private final String desc; + + public static NodeDataModeEnum getEnumByCode(String nodeDataMode) { + for (NodeDataModeEnum nodeDataModeEnum : NodeDataModeEnum.values()) { + if (nodeDataModeEnum.getCode().equals(nodeDataMode)) { + return nodeDataModeEnum; + } + } + return ALL; + } } diff --git a/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitEdgeVO.java b/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitEdgeVO.java index f19d708679c5acce9d95b1ad7670b7aa10496cf7..400d7bded99f32855aea7f95b8f8fcf7e77122c0 100644 --- a/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitEdgeVO.java +++ b/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitEdgeVO.java @@ -18,4 +18,6 @@ public class UnitEdgeVO { private String targetUuid; /** 样式ID */ private String styleUuid; + /** 边的深度 */ + private int deep; } diff --git a/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitNodeVO.java b/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitNodeVO.java index 266a27e76961fdfa7aa83c63bf8e263e03021a62..6f0004b0e6afc5adf3dcd2ff63e9253ce4ff1944 100644 --- a/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitNodeVO.java +++ b/common/src/main/java/cn/icanci/loopstack/bic/common/model/graph/UnitNodeVO.java @@ -24,6 +24,8 @@ public class UnitNodeVO { private String nodeDataKey; /** 节点类型 */ private NodeTypeEnum nodeType; + /** 节点组件 */ + private String nodeVue; @Override public boolean equals(Object object) { diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/BuryingDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/BuryingDAO.java index e4e12e8c1d9509f63846586af408ab5cf0472524..b797f425411f2dc9354eff825d8e1d4f49a7e367 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/BuryingDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/BuryingDAO.java @@ -21,6 +21,8 @@ public interface BuryingDAO extends BaseDAO { */ void batchInsert(List buryingList); + List queryBySystemAndUseCase(String systemUuid, String useCaseUuid, String traceId, String orderSerialNo); + /** 列 */ interface BuryingColumn extends BaseColumn { /** TraceId */ @@ -44,7 +46,7 @@ public interface BuryingDAO extends BaseDAO { /** LOGGER_LEVEL */ String LOGGER_LEVEL = "loggerLevel"; /** UNIQUE_KEY */ - String UNIQUE_KEY = "uniqueKey"; + String UNIQUE_KEY = "uniqueKey"; } } diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeDAO.java index bbc1c5453503009c2f7e14e2a07c6ba920cd5c60..28085ddcd9f05f068300996cc4ade67535ae4420 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeDAO.java @@ -16,6 +16,8 @@ public interface NodeDAO extends BaseDAO { NodeDO queryBySystemUuidAndKey(String systemUuid, String key); + NodeDO queryByUuid(String nodeUuid); + /** 列 */ interface NodeColumn extends BaseColumn { String NODE_NAME = "nodeName"; diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeStyleDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeStyleDAO.java index 42bd97d0bfd904193e8c7b52be98b04ce0a5a7bb..ddc7a0466dd3021b5e780834c8afb42aa3c27955 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeStyleDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/NodeStyleDAO.java @@ -16,6 +16,8 @@ public interface NodeStyleDAO extends BaseDAO { NodeStyleDO queryBySystemUuidAndKey(String systemUuid, String key); + NodeStyleDO queryByUuid(String styleUuid); + /** 列 */ interface NodeStyleColumn extends BaseColumn { String SYSTEM_UUID = "systemUuid"; diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/UnitViewDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/UnitViewDAO.java index 8dd54000bce28cf629f78513335b384089c31399..2b25a7c70980dd7cb327e7da9b45f3361e4b7ad3 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/UnitViewDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/daointerface/UnitViewDAO.java @@ -2,19 +2,29 @@ package cn.icanci.loopstack.bic.dal.mongo.daointerface; import cn.icanci.loopstack.bic.dal.mongo.dateobject.UnitViewDO; +import java.util.List; + /** * @author icanci * @since 1.0 Created in 2023/09/16 11:00 */ public interface UnitViewDAO extends BaseDAO { - /** 文档对应的名字 */ + /** + * 文档对应的名字 + */ String COLLECTION_NAME = BASE_COLLECTION_NAME + "unit-view"; - /** 文档对应的Class */ + /** + * 文档对应的Class + */ Class COLLECTION_CLASS = UnitViewDO.class; UnitViewDO queryBySystemUuidAndUseCaseUuid(String systemUuid, String useCaseUuid); - /** 列 */ + List queryBySystemUuid(String systemUuid); + + /** + * 列 + */ interface UnitViewColumn extends BaseColumn { String SYSTEM_UUID = "systemUuid"; String USE_CASE_UUID = "useCaseUuid"; diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/dateobject/UnitEdgeDO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/dateobject/UnitEdgeDO.java index 1c02162725c32df6f2f4684b249f49f27241e4a3..80c6d7c248c526d670e248e59aa4407899a74fb7 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/dateobject/UnitEdgeDO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/dateobject/UnitEdgeDO.java @@ -18,4 +18,6 @@ public class UnitEdgeDO { private String targetUuid; /** 样式ID */ private String styleUuid; + /** 深度 */ + private int deep; } diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoBuryingDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoBuryingDAO.java index d02994dd0d0b18cf04556f534b33838a47791e33..125d39962355d7fe00858be29cde80f6055f11f9 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoBuryingDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoBuryingDAO.java @@ -100,6 +100,21 @@ public class MongoBuryingDAO extends AbstractBaseDAO implements Buryi mongoTemplate.insert(buryingList, COLLECTION_NAME); } + @Override + public List queryBySystemAndUseCase(String systemUuid, String useCaseUuid, String traceId, String orderSerialNo) { + Criteria criteria = Criteria.where(BuryingColumn.ENV).is(DEFAULT_ENV); + criteria.and(BuryingColumn.SYSTEM_KEY).is(systemUuid); + criteria.and(BuryingColumn.USE_CASE).is(useCaseUuid); + if (StringUtils.isNotBlank(traceId)) { + criteria.and(BuryingColumn.TRACE_ID).is(traceId); + } + if (StringUtils.isNotBlank(orderSerialNo)) { + criteria.and(BuryingColumn.BUSINESS_NO).is(orderSerialNo); + } + Query query = new Query(criteria); + return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME); + } + @Override protected void doInsert(BuryingDO buryingDO) { super.doInsert(buryingDO); diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeDAO.java index ac284b4c57fa442ec2d8873e344f3cf7cf6e17fe..74f024b2334b1e32b469eb5d49a87b482ecf588f 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeDAO.java @@ -86,4 +86,12 @@ public class MongoNodeDAO extends AbstractBaseDAO implements NodeDAO { Query query = new Query(criteria); return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); } + + @Override + public NodeDO queryByUuid(String nodeUuid) { + Criteria criteria = Criteria.where(NodeColumn.UUID).is(nodeUuid); + criteria.and(NodeColumn.ENV).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } } diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeStyleDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeStyleDAO.java index 894065512e2f454f1c1853cea2a8f29152753c2c..accd845d64ae2929328ab1f2d9dd777010cf0a88 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeStyleDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeStyleDAO.java @@ -90,4 +90,12 @@ public class MongoNodeStyleDAO extends AbstractBaseDAO implements N return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); } + + @Override + public NodeStyleDO queryByUuid(String styleUuid) { + Criteria criteria = Criteria.where(NodeStyleColumn.UUID).is(styleUuid); + criteria.and(NodeStyleColumn.ENV).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } } diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoUnitViewDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoUnitViewDAO.java index f058d927f87a4e7976968aae23602c1bcdd07b38..7e3ceaff4cb2ee2b7a44b069f966289a218eec99 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoUnitViewDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoUnitViewDAO.java @@ -72,4 +72,12 @@ public class MongoUnitViewDAO extends AbstractBaseDAO implements Uni Query query = new Query(criteria); return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); } + + @Override + public List queryBySystemUuid(String systemUuid) { + Criteria criteria = Criteria.where(UnitViewColumn.ENV).is(DEFAULT_ENV); + criteria.and(UnitViewColumn.SYSTEM_UUID).is(systemUuid); + Query query = new Query(criteria); + return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME); + } } diff --git a/graph/src/main/java/cn/icanci/loopstack/bic/graph/GraphBurying.java b/graph/src/main/java/cn/icanci/loopstack/bic/graph/GraphBurying.java new file mode 100644 index 0000000000000000000000000000000000000000..4cb89a9085ea017ff3549257a5173cd9376ffb74 --- /dev/null +++ b/graph/src/main/java/cn/icanci/loopstack/bic/graph/GraphBurying.java @@ -0,0 +1,53 @@ +package cn.icanci.loopstack.bic.graph; + +import lombok.Data; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * @author icanci + * @since 1.0 Created in 2023/09/23 23:08 + */ +@Data +public class GraphBurying { + /** mongodb id */ + private String id; + /** 雪花算法随机UUID */ + private String uuid; + /** 创建时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** 更新时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + /** 状态 false 有效,true 无效 */ + private boolean deleted; + /** 环境 */ + private String env; + /** TraceId */ + private String traceId; + /** 业务标识 */ + private String businessNo; + /** 系统应用唯一标识 */ + private String systemKey; + /** 应用系统用例 */ + private String useCase; + /** 模块 */ + private String module; + /** 分类,用于区分同模块下不同的展示类型 */ + private String category; + /** 子模块,用于区分同模块下不同的展示类型 */ + private String subCategory; + /** 扩展属性 */ + private String ext; + /** 时间 */ + private long time; + /** 执行数据 */ + private String message; + /** 日志等级 */ + private String loggerLevel; + /** 数据的唯一标识 */ + private String uniqueKey; +} diff --git a/graph/src/main/java/cn/icanci/loopstack/bic/graph/edge/Edge.java b/graph/src/main/java/cn/icanci/loopstack/bic/graph/edge/Edge.java index 4393874025f944b51fe3840235aae662d7d5cc12..e8fbc8d50d6fecba754426708e4a5adfe79a097f 100644 --- a/graph/src/main/java/cn/icanci/loopstack/bic/graph/edge/Edge.java +++ b/graph/src/main/java/cn/icanci/loopstack/bic/graph/edge/Edge.java @@ -20,4 +20,6 @@ public class Edge { private List labels; private EdgeConsumerInfo consumerInfo; private EdgeHistoryInfo historyInfo; + /** 深度,只用来计算节点的样式 */ + private transient int deep; } diff --git a/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/Node.java b/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/Node.java index e9ad1ec30eec53208c011a58783556777f4d3e10..8b60e5324ece4747ed74ca7b37fa5935cd91d8d4 100644 --- a/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/Node.java +++ b/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/Node.java @@ -13,4 +13,10 @@ public class Node { private double width; private double height; private NodeAttrs attrs; + /** 节点Data模式:前缀匹配、全部匹配 */ + private String nodeDataMode; + /** 节点DataKey: UseCase-Module-Category-SubCategory */ + private String nodeDataKey; + /** 节点类型 */ + private String nodeType; } diff --git a/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/UnitViewNode.java b/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/UnitViewNode.java index a542ba6db5bbd35fbc7fab87e8e937a2e880a667..c94f2f0548252dda502350e7b80680860d3832dd 100644 --- a/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/UnitViewNode.java +++ b/graph/src/main/java/cn/icanci/loopstack/bic/graph/node/UnitViewNode.java @@ -1,5 +1,9 @@ package cn.icanci.loopstack.bic.graph.node; +import java.util.List; + +import cn.hutool.core.collection.CollectionUtil; +import cn.icanci.loopstack.bic.graph.GraphBurying; import lombok.Data; /** @@ -8,5 +12,16 @@ import lombok.Data; */ @Data public class UnitViewNode extends Node { - // 节点的一些额外参数 + /** 节点的数据 */ + List buryings; + /** 路径是否经过 */ + private boolean pathPass; + + public boolean hasBurying() { + return CollectionUtil.isNotEmpty(buryings); + } + + public boolean hasPathPass() { + return pathPass || hasBurying(); + } } diff --git a/pom.xml b/pom.xml index 333529079f35ea5c36f435a066b8e955b98ace62..52da86c7044089d0f39a4a3b6e26298a59caf8a5 100644 --- a/pom.xml +++ b/pom.xml @@ -62,6 +62,7 @@ 1.18.2 4.0.0 + 1.10.0 @@ -187,6 +188,11 @@ lucene-core ${lucene-core.version} + + org.apache.commons + commons-text + ${commons-text.version} + diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/GraphController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/GraphController.java new file mode 100644 index 0000000000000000000000000000000000000000..b8abdf326c71ebebebcb267a2ee9691586ffc520 --- /dev/null +++ b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/GraphController.java @@ -0,0 +1,30 @@ +package cn.icanci.loopstack.bic.web.controller; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import cn.icanci.loopstack.bic.biz.service.GraphService; +import cn.icanci.loopstack.bic.common.result.R; +import cn.icanci.loopstack.bic.web.model.Graph; + +/** + * 返回单元纠察图数据 + * + * @author icanci + * @since 1.0 Created in 2023/09/23 22:58 + */ +@RestController +@RequestMapping("/bicAdmin/graph") +public class GraphController { + @Resource + private GraphService graphService; + + @PostMapping("load") + public R load(@RequestBody Graph graph) { + return R.builderOk().data("graph", graphService.buildOneGraph(graph.getSystemUuid(), graph.getUseCaseUuid(), graph.getTraceId(), graph.getOrderSerialNo())).build(); + } +} diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/SnapshotController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/SnapshotController.java new file mode 100644 index 0000000000000000000000000000000000000000..25ec6d90cb619883343abb894c6450b8b8b14674 --- /dev/null +++ b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/SnapshotController.java @@ -0,0 +1,16 @@ +package cn.icanci.loopstack.bic.web.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * TODO 版本的页面查询 + * + * @author icanci + * @since 1.0 Created in 2023/09/23 22:57 + */ +@RestController +@RequestMapping("/bicAdmin/snapshot") +public class SnapshotController { + +} diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/UnitViewController.java b/web/src/main/java/cn/icanci/loopstack/bic/web/controller/UnitViewController.java deleted file mode 100644 index c56f5b5d19ec6ac9f7eb895c246ff64b56e228ff..0000000000000000000000000000000000000000 --- a/web/src/main/java/cn/icanci/loopstack/bic/web/controller/UnitViewController.java +++ /dev/null @@ -1,45 +0,0 @@ -//package cn.icanci.loopstack.bic.web.controller; -// -//import javax.annotation.Resource; -// -//import org.springframework.web.bind.annotation.*; -// -//import cn.icanci.loopstack.bic.biz.service.UnitViewService; -//import cn.icanci.loopstack.bic.common.model.graph.UnitViewVO; -//import cn.icanci.loopstack.bic.common.result.R; -//import cn.icanci.loopstack.bic.web.form.UnitViewQueryForm; -//import cn.icanci.loopstack.bic.web.mapper.UnitViewWebMapper; -//import cn.icanci.loopstack.bic.web.model.UnitView; -// -///** -// * @author icanci -// * @since 1.0 Created in 2023/09/16 10:55 -// */ -//@RestController -//@RequestMapping("/bicAdmin/unitView") -//public class UnitViewController { -// @Resource -// private UnitViewWebMapper unitViewWebMapper; -// @Resource -// private UnitViewService unitViewService; -// -// // ================================ CRUD ================================ -// @PostMapping("query") -// public R query(@RequestBody UnitViewQueryForm form) { -// return R.builderOk() -// .data("queryPage", unitViewService.queryPage(unitViewWebMapper.web2vo(form.getUnitView()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())) -// .build(); -// } -// -// @PostMapping("save") -// public R save(@RequestBody UnitView unitView) { -// unitViewService.save(unitViewWebMapper.web2vo(unitView)); -// return R.builderOk().build(); -// } -// -// @GetMapping("validateUnique/{systemUuid}/{useCaseUuid}") -// public R validateUnique(@PathVariable("systemUuid") String systemUuid, @PathVariable("useCaseUuid") String useCaseUuid) { -// UnitViewVO unitView = unitViewService.queryBySystemUuidAndUseCaseUuid(systemUuid, useCaseUuid); -// return R.builderOk().data("result", unitView == null).build(); -// } -//} diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/model/Graph.java b/web/src/main/java/cn/icanci/loopstack/bic/web/model/Graph.java new file mode 100644 index 0000000000000000000000000000000000000000..96b1099883c4b9d1cf5174ba65c540c1fd346fcc --- /dev/null +++ b/web/src/main/java/cn/icanci/loopstack/bic/web/model/Graph.java @@ -0,0 +1,15 @@ +package cn.icanci.loopstack.bic.web.model; + +import lombok.Data; + +/** + * @author icanci + * @since 1.0 Created in 2023/09/24 10:58 + */ +@Data +public class Graph { + private String traceId; + private String orderSerialNo; + private String systemUuid; + private String useCaseUuid; +} diff --git a/web/src/main/java/cn/icanci/loopstack/bic/web/model/UnitEdge.java b/web/src/main/java/cn/icanci/loopstack/bic/web/model/UnitEdge.java index 423d8bc4bf20a39c96abef7132adf14ea4a64c87..6df27eee47e2450ddf5d6a5691c6467527c1a490 100644 --- a/web/src/main/java/cn/icanci/loopstack/bic/web/model/UnitEdge.java +++ b/web/src/main/java/cn/icanci/loopstack/bic/web/model/UnitEdge.java @@ -18,4 +18,6 @@ public class UnitEdge { private String targetUuid; /** 样式ID */ private String styleUuid; + /** 深度 */ + private int deep; }