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;
}