From ce86839af79e1406be9959654891ab92931493d1 Mon Sep 17 00:00:00 2001 From: icanci Date: Tue, 26 Sep 2023 22:22:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B8=E7=A6=BB=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bic/biz/adapter/GraphAdapterService.java | 4 +- .../biz/service/impl/GraphServiceImpl.java | 24 +++ .../bic/biz/utils/TemplateFileUtils.java | 36 ++++ .../default-free-node-style-template.json | 56 +++++++ .../vue/default-node-vue-template.vue | 10 +- .../main/resources/vue/default-node-vue.vue | 10 +- .../bic/dal/mongo/mongo/MongoNodeVueDAO.java | 3 + .../src/views/bic-view/bic-singleton-view.vue | 158 +++++++++--------- 8 files changed, 217 insertions(+), 84 deletions(-) create mode 100644 biz/src/main/resources/style/default-free-node-style-template.json 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 17b9a05..410f5d5 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 @@ -77,12 +77,12 @@ public class GraphAdapterService implements GraphAdapter { retNode.setNodeType(node.getNodeType().getCode()); NodeVueVO nodeVueVO = nodeVueService.queryByUuid(node.getNodeVue()); retNode.setNodeVueCode(nodeVueVO.getNodeVueCode()); - retNode.setNodeType(nodeVueVO.getNodeVueType().getCode()); + retNode.setNodeVueType(nodeVueVO.getNodeVueType().getCode()); return retNode; } private Map buildNodeMap(NodeVO node) { - HashMap nodeMap = Maps.newHashMap(); + Map nodeMap = Maps.newHashMap(); nodeMap.put("nodeId", node.getUuid()); nodeMap.put("nodeName", node.getNodeName()); return nodeMap; 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 index 6bfebed..c505158 100644 --- 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 @@ -2,6 +2,7 @@ package cn.icanci.loopstack.bic.biz.service.impl; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Resource; @@ -10,12 +11,14 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; 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.biz.utils.TemplateFileUtils; import cn.icanci.loopstack.bic.common.enums.NodeDataModeEnum; import cn.icanci.loopstack.bic.graph.Graph; import cn.icanci.loopstack.bic.graph.GraphBurying; @@ -49,17 +52,38 @@ public class GraphServiceImpl implements GraphService { List graphBuryingList = graphBuryingMapper.vos2dos(buryingService.queryBySystemAndUseCase(systemUuid, useCaseUuid, traceId, orderSerialNo)); // 数据集合 Map> uniqueKeyMap = graphBuryingList.stream().collect(Collectors.groupingBy(GraphBurying::getUniqueKey)); + Set nodeDataKeySet = Sets.newHashSet(); // 根据前缀匹配和全部匹配进行值匹配 for (UnitViewNode node : unitViewGraph.getNodes()) { NodeDataModeEnum nodeDataMode = NodeDataModeEnum.getEnumByCode(node.getNodeDataMode()); String nodeDataKey = node.getNodeDataKey(); node.setBuryings(buildBuryings(nodeDataMode, nodeDataKey, uniqueKeyMap)); + nodeDataKeySet.add(nodeDataKey); } // 图渲染,构建额外参数 unitViewGraphRender(unitViewGraph); + // 尝试新增游离节点 + tryAddFreeNode(unitViewGraph, nodeDataKeySet, uniqueKeyMap); return unitViewGraph; } + private void tryAddFreeNode(UnitViewGraph unitViewGraph, Set nodeDataKeySet, Map> uniqueKeyMap) { + for (String nodeDataKey : nodeDataKeySet) { + uniqueKeyMap.remove(nodeDataKey); + } + if (uniqueKeyMap.isEmpty()) { + return; + } + // 构建游离节点 + for (Map.Entry> entry : uniqueKeyMap.entrySet()) { + String key = entry.getKey(); + UnitViewNode node = TemplateFileUtils.buildDefaultNode(key); + node.setBuryings(entry.getValue()); + node.setPathPass(true); + unitViewGraph.getNodes().add(node); + } + } + private void unitViewGraphRender(UnitViewGraph unitViewGraph) { Map nodeMap = unitViewGraph.getNodes().stream().collect(Collectors.toMap(UnitViewNode::getId, node -> node)); // 组装边节点的临时变量 diff --git a/biz/src/main/java/cn/icanci/loopstack/bic/biz/utils/TemplateFileUtils.java b/biz/src/main/java/cn/icanci/loopstack/bic/biz/utils/TemplateFileUtils.java index 8ce4542..d8eba94 100644 --- a/biz/src/main/java/cn/icanci/loopstack/bic/biz/utils/TemplateFileUtils.java +++ b/biz/src/main/java/cn/icanci/loopstack/bic/biz/utils/TemplateFileUtils.java @@ -1,14 +1,27 @@ package cn.icanci.loopstack.bic.biz.utils; import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.commons.text.StringSubstitutor; import org.springframework.core.io.ClassPathResource; +import com.google.common.collect.Maps; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.bic.common.enums.NodeDataModeEnum; +import cn.icanci.loopstack.bic.common.enums.NodeVueTypeEnum; +import cn.icanci.loopstack.bic.graph.node.UnitViewNode; + /** * @author icanci * @since 1.0 Created in 2023/09/13 09:33 */ public class TemplateFileUtils { private static final String DEFAULT_NODE_STYLE_TEMPLATE = "style/default-node-style-template.json"; + private static final String DEFAULT_FREE_NODE_STYLE_TEMPLATE = "style/default-free-node-style-template.json"; private static final String DEFAULT_NODE_EDGE_TEMPLATE = "style/default-edge-style-template.json"; private static final String DEFAULT_NODE_VUE_TEMPLATE = "vue/default-node-vue-template.vue"; private static final String DEFAULT_NODE_VUE = "vue/default-node-vue.vue"; @@ -38,10 +51,14 @@ public class TemplateFileUtils { public static String queryDefaultNodeStyleTemplate() { return queryLocalFile(DEFAULT_NODE_STYLE_TEMPLATE); } + public static String queryDefaultFreeNodeStyleTemplate() { + return queryLocalFile(DEFAULT_FREE_NODE_STYLE_TEMPLATE); + } public static String queryDefaultNodeVueTemplate() { return queryLocalFile(DEFAULT_NODE_VUE_TEMPLATE); } + public static String queryDefaultNodeVue() { return queryLocalFile(DEFAULT_NODE_VUE); } @@ -50,4 +67,23 @@ public class TemplateFileUtils { return queryLocalFile(DEFAULT_NODE_EDGE_TEMPLATE); } + public static UnitViewNode buildDefaultNode(String name) { + String nodeStyleTemplate = queryDefaultFreeNodeStyleTemplate(); + StringSubstitutor sub = new StringSubstitutor(buildNodeMap(name)); + nodeStyleTemplate = sub.replace(nodeStyleTemplate); + UnitViewNode retNode = JSONUtil.toBean(nodeStyleTemplate, UnitViewNode.class); + retNode.setNodeDataMode(NodeDataModeEnum.ALL.getCode()); + retNode.setNodeDataKey("default"); + retNode.setNodeType(NodeDataModeEnum.ALL.getCode()); + retNode.setNodeVueCode(queryDefaultNodeVue()); + retNode.setNodeVueType(NodeVueTypeEnum.DIALOG.getCode()); + return retNode; + } + + private static Map buildNodeMap(String name) { + HashMap nodeMap = Maps.newHashMap(); + nodeMap.put("nodeId", UUID.randomUUID().toString()); + nodeMap.put("nodeName", name); + return nodeMap; + } } diff --git a/biz/src/main/resources/style/default-free-node-style-template.json b/biz/src/main/resources/style/default-free-node-style-template.json new file mode 100644 index 0000000..d20a18c --- /dev/null +++ b/biz/src/main/resources/style/default-free-node-style-template.json @@ -0,0 +1,56 @@ +{ + "id": "${nodeId}", + "shape": "ellipse", + "width": 100, + "height": 40, + "attrs": { + "body": { + "fill": "#ffffff", + "stroke": "#000", + "strokeDasharray": "10,2" + }, + "label": { + "text": "${nodeName}", + "fill": "#333", + "fontSize": 13 + } + }, + "ports": { + "groups": { + "in": { + "position": "left", + "attrs": { + "circle": { + "r": 2, + "magnet": true, + "stroke": "#31d0c6", + "strokeWidth": 2, + "fill": "#fff" + } + } + }, + "out": { + "position": "right", + "attrs": { + "circle": { + "r": 2, + "magnet": true, + "stroke": "#31d0c6", + "strokeWidth": 2, + "fill": "#fff" + } + } + } + }, + "items": [ + { + "id": "port-left", + "group": "in" + }, + { + "id": "port-right", + "group": "out" + } + ] + } +} \ No newline at end of file diff --git a/biz/src/main/resources/vue/default-node-vue-template.vue b/biz/src/main/resources/vue/default-node-vue-template.vue index eee3a3e..2e636b2 100644 --- a/biz/src/main/resources/vue/default-node-vue-template.vue +++ b/biz/src/main/resources/vue/default-node-vue-template.vue @@ -2,7 +2,7 @@

{{ name }}

现在请开始你的表演吧~

-

{{ getRow() }}

+
@@ -21,6 +21,12 @@ module.exports = { methods: { // 此方法不要覆盖和修改,其为取值逻辑 getRow() { + let vm = this + let pluginContext = vm.getPluginContext() + return JSON.stringify(pluginContext, null, '\t') + }, + // 此方法不要覆盖和修改,其为取值逻辑 + getPluginContext() { let vm = this while (vm.$parent && !vm.$parent.pluginContext) { vm = vm.$parent @@ -36,4 +42,4 @@ module.exports = { } } } - + \ No newline at end of file diff --git a/biz/src/main/resources/vue/default-node-vue.vue b/biz/src/main/resources/vue/default-node-vue.vue index eee3a3e..2e636b2 100644 --- a/biz/src/main/resources/vue/default-node-vue.vue +++ b/biz/src/main/resources/vue/default-node-vue.vue @@ -2,7 +2,7 @@

{{ name }}

现在请开始你的表演吧~

-

{{ getRow() }}

+
@@ -21,6 +21,12 @@ module.exports = { methods: { // 此方法不要覆盖和修改,其为取值逻辑 getRow() { + let vm = this + let pluginContext = vm.getPluginContext() + return JSON.stringify(pluginContext, null, '\t') + }, + // 此方法不要覆盖和修改,其为取值逻辑 + getPluginContext() { let vm = this while (vm.$parent && !vm.$parent.pluginContext) { vm = vm.$parent @@ -36,4 +42,4 @@ module.exports = { } } } - + \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeVueDAO.java b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeVueDAO.java index 43f29a4..799813f 100644 --- a/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeVueDAO.java +++ b/dal/src/main/java/cn/icanci/loopstack/bic/dal/mongo/mongo/MongoNodeVueDAO.java @@ -54,6 +54,9 @@ public class MongoNodeVueDAO extends AbstractBaseDAO implements NodeV if (StringUtils.isNotBlank(nodeVueDO.getNodeVueType())) { criteria.and(NodeVueColumn.NODE_VUE_TYPE).is(nodeVueDO.getNodeVueType()); } + if (StringUtils.isNotBlank(nodeVueDO.getNodeUuid())) { + criteria.and(NodeVueColumn.NODE_UUID).is(nodeVueDO.getNodeUuid()); + } Query query = new Query(criteria); query.with(Sort.by(Sort.Direction.DESC, NodeVueColumn.CREATE_TIME)); return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME); diff --git a/views/src/main/resources/vueboot/src/views/bic-view/bic-singleton-view.vue b/views/src/main/resources/vueboot/src/views/bic-view/bic-singleton-view.vue index 126c5ec..8f3ec0c 100644 --- a/views/src/main/resources/vueboot/src/views/bic-view/bic-singleton-view.vue +++ b/views/src/main/resources/vueboot/src/views/bic-view/bic-singleton-view.vue @@ -23,11 +23,11 @@
+ :inline="true" + :rules="rules" + ref="ruleForm" + :model="queryForm" + class="demo-form-inline"> + v-for="item in systemOptions" + :key="item.value" + :label="item.label" + :value="item.value"> @@ -46,10 +46,10 @@ + v-for="item in useCaseOptions" + :key="item.value" + :label="item.label" + :value="item.value"> @@ -68,74 +68,74 @@ + :title="dialogTableTitle" + append-to-body + width="75%" + :visible.sync="dialogTableVisible"> + :header-cell-style="{background:'#eef1f6',color:'#606266'}" + :data="currentBuryings" + border + :default-sort="{prop: 'updateTime', order: 'descending'}" + style="width: 100%; margin-top: 20px;font-size: 10px"> + align="center" + prop="systemKey" + label="systemKey"> + align="center" + prop="useCase" + label="useCase"> + align="center" + :show-overflow-tooltip="true" + prop="traceId" + label="traceId"> + align="center" + prop="businessNo" + label="businessNo"> + align="center" + prop="module" + label="module"> + align="center" + prop="category" + label="category"> + align="center" + prop="subCategory" + label="subCategory"> + align="center" + prop="" + label="日志级别"> + sortable + align="center" + width="150" + label="修改时间"> + fixed="right" + align="center" + width="50" + label="操作">