Commit 2913e9a5 by 吴斌

update:自定义规则

parent 856382f9
......@@ -34,8 +34,8 @@
<!-- placeholder="搜索图形"-->
<!-- :prefix-icon="Search"-->
<!-- />-->
<div class="w-full" :style="{height: nodeAreaHeight}">
<el-scrollbar :max-height="nodeAreaHeight">
<div class="w-full" :style="{height: panelScrollAreaHeight}">
<el-scrollbar :max-height="panelScrollAreaHeight">
<SourceNodeCollection></SourceNodeCollection>
</el-scrollbar>
</div>
......@@ -89,14 +89,7 @@
>
<el-form>
<el-form-item label="路线:">{{spliceListMapWithKey(path, 'nodeName', '->')}}</el-form-item>
<!-- <el-form-item label="权重">-->
<!-- <el-input v-model="value.weight"></el-input>-->
<!-- </el-form-item>-->
</el-form>
<!-- <div class="flex justify-center">-->
<!-- <el-checkbox @change="highlightPath(key)" v-model="value.highlight">高亮</el-checkbox>-->
<!-- <el-button type="primary">确定</el-button>-->
<!-- </div>-->
</el-collapse-item>
</el-collapse>
</el-scrollbar>
......@@ -104,6 +97,34 @@
</div>
</div>
</el-tab-pane>
<el-tab-pane label="规则">
<div class="space-y-1 p-2 flex flex-col">
<el-button icon="Plus" type="primary" @click="showAddRuleDialog">新建规则</el-button>
<el-empty description="暂无规则" v-if="ruleList.length === 0"></el-empty>
<el-scrollbar :max-height="panelScrollAreaHeight">
<div class="space-y-1 p-2 flex flex-col" v-show="ruleList.length > 0" v-for="rule in ruleList">
<div class="flex-col rounded-lg bg-white p-4 shadow-[0_2px_10px_2px_rgba(0,0,0,0.1),0_10px_20px_-2px_rgba(0,0,0,0.08)] dark:bg-black">
<div class="flex space-x-1">
<el-text truncated>{{rule['name']}}</el-text>
<div class="flex-1"></div>
<el-switch v-model="rule['enable']"></el-switch>
</div>
<el-text class="text-xs text-gray-400" v-if="rule['description']">{{rule['description']}}</el-text>
<el-divider class="m-2"></el-divider>
<div class="flex space-x-1">
<el-button text type="success" class="p-2" @click="runRuleWithTestData(rule['id'])">
<el-icon size="20px">
<CaretRight/>
</el-icon>
</el-button>
<el-button icon="edit" text class="p-2" @click="showEditRuleDialog(rule)"></el-button>
<el-button icon="delete" text class="p-2" type="danger" @click="deleteRule(rule['id'])"></el-button>
</div>
</div>
</div>
</el-scrollbar>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
......@@ -159,6 +180,52 @@
<el-button type="primary" @click="confirmEditPort">确定</el-button>
</template>
</el-dialog>
<!-- 添加/修改规则弹窗-->
<el-dialog v-model="ruleDialog.visible" :title="ruleDialog.type === 'update'?'修改规则':'新建规则'" class="w-[500px] h-[500px] flex-col">
<el-scrollbar max-height="300px">
<el-form v-model="ruleDialog.data">
<el-form-item label="规则名称" >
<el-input v-model="ruleDialog.data.name"></el-input>
</el-form-item>
<el-form-item label="规则描述" >
<el-input v-model="ruleDialog.data.description"></el-input>
</el-form-item>
<el-form-item label="输入参数">
<div>
<el-button type="primary" @click="addRuleParam">添加参数</el-button>
<div v-for="(input,index) in ruleDialog.data.inputs" class="flex mt-2 space-x-1">
<el-select v-model="input['key']" class="flex-1">
<el-option
v-for="device in deviceMap"
:key="device.key"
:label="device.name"
:value="device.key"
/>
</el-select>
<el-select v-model="input['valueKey']" class="flex-1">
<el-option
v-for="(_value,key) in deviceMap[input['key']]"
:key="key"
:label="key"
:value="key"
/>
</el-select>
<el-input placeholder="测试数据" v-model="input['testData']" class="flex-1"></el-input>
<el-button icon="Delete" type="danger" @click="deleteRuleParam(index)"></el-button>
</div>
</div>
</el-form-item>
<el-form-item label="规则函数">
<el-input type="textarea" v-model="ruleDialog.data.func"></el-input>
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<div class="flex justify-end">
<el-button type="primary" @click="confirmAddRule">{{ruleDialog.type==='update'?"修改":"添加"}}</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
......@@ -172,7 +239,7 @@ import {
findNodesAllWayBetween,
highlightLink,
cancelHighlightLink,
spliceListMapWithKey,
spliceListMapWithKey, getDeviceMapData,
} from "./kit/GOJSKit.ts";
import {createRotatingTool, makeDiagramNodeTemplate} from "./kit/NodeTemplateKit.ts";
import {GuidedDraggingTool} from "./kit/extensions/GuidedDraggingTool.ts";
......@@ -181,7 +248,7 @@ import {ArrowLink, FlowLink} from "./kit/LinkTemplateKit.ts";
import {Inspector} from "./kit/extensions/DataInspector.ts";
import {uuid} from "vue3-uuid";
import {SnapLinkReshapingTool} from "./kit/extensions/SnapLinkReshapingTool.ts";
import {Edit, View} from "@element-plus/icons-vue";
import {CaretRight, Edit, View} from "@element-plus/icons-vue";
import {ElMessage} from "element-plus";
import {
DeviceType,
......@@ -191,6 +258,8 @@ import {
getExceedingDefectInfluenceCoefficient,
getManagementSystemEvaluationCoefficient
} from "./kit/core/Analyse.ts";
import {addRule, deleteRuleById, rules, runAllEnableRule, testRuleById, updateRule} from "./kit/rule/Rule";
import {diagramModelData} from "./kit/ModelData.ts";
// 变量定义
// region
// 图表配置
......@@ -249,14 +318,29 @@ const portTypeList =[
// 线路分析结果的名称
const analyzePathsName = ref<Record<string, any>[][]>([])
// 显示规则库弹窗
const ruleList = ref<Record<string, any>[]>([])
const deviceMap = ref<Record<string, any>>({})
// const deviceParamsList = ref<any[]>([])
const ruleDialog = ref<Record<string, any>>({
visible:false,
type:"add",
data:{
name: "",
inputs:[],
func:"",
}
})
// 源节点搜索
// let inputSearchNode = ref('')
// 用于计算源区域的滚动条区域高度
let nodeAreaHeight = ref()
// 用于计算左右面板滚动区域高度,主要是为了自适应
let panelScrollAreaHeight = ref()
// endregion
onMounted(()=>{
getNodeSourceScrollAreaHeight()
getPanelScrollAreaHeight()
initDiagram()
listenDiagram()
initInspector()
......@@ -283,63 +367,27 @@ function changeDiagramConfig(key:string, value:string){
// Toolbar 相关函数
// region
function importData(){
let json = { "class": "GraphLinksModel",
"copiesArrays": true,
"copiesArrayObjects": true,
"linkFromPortIdProperty": "fromPort",
"linkToPortIdProperty": "toPort",
'linkKeyProperty': "key",
"nodeDataArray": [
{"name":"氨分离罐","nodeCollection":"ammonia","img":"src/assets/models/ammonia/氨分离罐.svg","category":"svg","key":-1,"loc":"-450 -400","size":"100 209.94475138121547","portArray":[{"name":"端口1","portId":"11c8ba71-e7cc-41ee-b7d3-cd2814e26f0f","alignment":"0.7939024142622645 0.4946518480722313 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"256b782d-5870-4e05-94ff-34f130c5060e","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"dcd15cc2-ec1b-4a35-b861-377b6f75d0b9","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"}]},
{"name":"冷却器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器.svg","category":"svg","key":-5,"loc":"-250 -330","size":"97.77777777777777 40","portArray":[{"name":"端口1","portId":"51b9d16b-8eea-4c4e-92a2-5bb9d99d294f","alignment":"0 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"a8e9572b-53fb-4791-a173-e272c28bc8af","alignment":"1 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false}]},
{"name":"压缩机","nodeCollection":"ammonia","img":"src/assets/models/ammonia/压缩机.svg","category":"svg","key":-7,"loc":"-457.5 -60","size":"80 65.625","portArray":[{"name":"端口1","portId":"55950fe5-ebe1-4d75-b6b4-30da5e97af17","alignment":"0 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":"0","toMaxLinks":"1","fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"4226d10a-0eb2-4c7a-b839-287003f573ff","alignment":"0.5200892857142833 0.09365079365079423 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"3f0de33c-e4c4-4187-b7bf-d8192b0708d9","alignment":"1 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false}]},
{"name":"冷却器-2","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器-2.svg","category":"svg","key":-6,"loc":"-263 -70.3125","size":"100 40","portArray":[{"name":"端口1","portId":"0be6a460-df3a-423f-be3d-b38a4adead36","alignment":"0.11857314993877253 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口2","portId":"0d7b8599-993d-4474-9fb7-a1f1425cbe32","alignment":"0.11857314993877253 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"}]},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":-2,"loc":"-180 -200","angle":180},
{"name":"换热器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/换热器.svg","category":"svg","key":-3,"loc":"20 -100","size":"135.51724137931035 30.000000000000004","portArray":[{"name":"端口1","portId":"e8cd7aef-9139-480c-ade2-1ef79cc4261d","alignment":"0 0.47043270833333206 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"fdc201ee-d40d-4d87-bd11-df445f3f976d","alignment":"0.4984260146753545 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"17fac662-e52f-43de-8c27-d24452d9ed2a","alignment":"1 0.4299158333333329 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口4","portId":"2b860c7b-eafc-49b2-90ba-d32d007a2e7b","alignment":"0.4984260146753545 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"}]},
{"name":"换热器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/换热器.svg","category":"svg","key":-8,"loc":"20 10","size":"135.51724137931035 30.000000000000004","portArray":[{"name":"端口2","portId":"fdc201ee-d40d-4d87-bd11-df445f3f976d","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"17fac662-e52f-43de-8c27-d24452d9ed2a","alignment":"1 0.5301687499999994 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false}]},
{"name":"冷却器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器.svg","category":"svg","key":-9,"loc":"250 100","portArray":[{"name":"端口1","portId":"d5501d1f-5fa8-4d71-8a77-37c64482de72","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口2","portId":"d17eb676-1f01-43f1-b658-b16fde8e4159","alignment":"0 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0"},{"name":"端口3","portId":"96dee2d1-babb-4b4d-b5cb-0bafad3131d9","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":"1","toMaxLinks":"0","fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}]},
{"name":"冷却器-2","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器-2.svg","category":"svg","key":-10,"loc":"20 -400","portArray":[{"name":"端口1","portId":"16d8e009-b1b1-45c2-a94f-1a90943ee090","alignment":"1 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0"},{"name":"端口2","portId":"ba564564-2ac8-48da-a430-3af06ea4997d","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0"}],"angle":90},
{"name":"合成塔","nodeCollection":"ammonia","img":"src/assets/models/ammonia/合成塔.svg","category":"svg","key":-11,"loc":"220 -460","portArray":[{"name":"端口1","portId":"415f271d-1dd7-415f-ab4f-d5a7221b095a","alignment":"0.9735206395348852 0.9054140969669111 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"ab215031-702e-4d22-9663-8c4f631c19ed","alignment":"0.8675171875000016 0.23956692325367507 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"ec58dcb4-39fb-400e-bb0e-018ecee51d56","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false}]},
{"name":"开工炉","nodeCollection":"ammonia","img":"src/assets/models/ammonia/开工炉.svg","category":"svg","key":-4,"loc":"470 -441.25","portArray":[{"name":"端口1","portId":"3a24769a-5f3a-49e6-953d-a5e1fce7e8be","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"},{"name":"端口2","portId":"58c1fc66-36b0-4e21-af4f-85e52828ac76","alignment":"0.19673376572327342 0.33276178892215375 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0"}]},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":-12,"loc":"470 -114.5625","angle":180},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":-13,"loc":"680 -240","angle":90},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":-15,"loc":"357.5 -620","angle":0}
],
"linkDataArray": [
{"key":-1,"from":-5,"to":-1,"fromPort":"51b9d16b-8eea-4c4e-92a2-5bb9d99d294f","toPort":"11c8ba71-e7cc-41ee-b7d3-cd2814e26f0f","points":[-301.3888888888889,-330,-311.3888888888889,-330,-311.3888888888889,-330,-311.3888888888889,-401.1228164268244,-408.10975857377355,-401.1228164268244,-418.10975857377355,-401.1228164268244],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-2,"from":-1,"fromPort":"256b782d-5870-4e05-94ff-34f130c5060e","toPort":"","points":[-450,-507.47237569060775,-450,-517.4723756906078,-450,-547.6190476190478,-519.0476190476192,-547.6190476190478,-588.0952380952383,-547.6190476190478,-598.0952380952383,-547.6190476190478],"from_text":"","middle_text":"","to_text":"燃料气","category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-3,"from":-1,"fromPort":"dcd15cc2-ec1b-4a35-b861-377b6f75d0b9","toPort":"","points":[-450,-292.5276243093923,-450,-282.5276243093923,-450,-248.57142857142867,-519.0476190476192,-248.57142857142867,-588.0952380952383,-248.57142857142867,-598.0952380952383,-248.57142857142867],"from_text":"","middle_text":"","to_text":"氨产品","category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-4,"from":-7,"to":-6,"fromPort":"3f0de33c-e4c4-4187-b7bf-d8192b0708d9","toPort":"0be6a460-df3a-423f-be3d-b38a4adead36","points":[-415,-60,-405,-60,-370,-60,-370,-102.8125,-301.14268500612275,-102.8125,-301.14268500612275,-92.8125],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-5,"from":-2,"to":-5,"fromPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","toPort":"a8e9572b-53fb-4791-a173-e272c28bc8af","points":[-180,-221.75,-180,-231.75,-180,-330,-184.30555555555557,-330,-188.61111111111114,-330,-198.61111111111114,-330],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-6,"from":-2,"to":-7,"fromPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","toPort":"4226d10a-0eb2-4c7a-b839-287003f573ff","points":[-213,-188.5,-223,-188.5,-455.89285714285734,-188.5,-455.89285714285734,-143.83333333333331,-455.89285714285734,-99.16666666666663,-455.89285714285734,-89.16666666666663],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-7,"to":-7,"fromPort":"","toPort":"55950fe5-ebe1-4d75-b6b4-30da5e97af17","points":[-599.2109634992121,-61.18966252420353,-589.2109634992121,-61.18966252420353,-550,-61.18966252420353,-550,-60,-510,-60,-500,-60],"from_text":"原料气","middle_text":"","to_text":"","category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-8,"from":-6,"to":-9,"fromPort":"0d7b8599-993d-4474-9fb7-a1f1425cbe32","toPort":"d17eb676-1f01-43f1-b658-b16fde8e4159","points":[-301.14268500612275,-47.8125,-301.14268500612275,-37.8125,-301.14268500612275,100,-64.19634250306137,100,172.75,100,182.75,100],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-9,"from":-9,"to":-8,"fromPort":"d5501d1f-5fa8-4d71-8a77-37c64482de72","toPort":"17fac662-e52f-43de-8c27-d24452d9ed2a","points":[251.25,70.5,251.25,60.5,251.25,12.155062499999984,175.1293103448276,12.155062499999984,99.00862068965517,12.155062499999984,89.00862068965517,12.155062499999984],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-10,"from":-9,"fromPort":"96dee2d1-babb-4b4d-b5cb-0bafad3131d9","toPort":"","points":[251.25,129.5,251.25,139.5,251.25,208.17973750000021,251.60979375000034,208.17973750000021,251.60979375000034,276.85947500000043,251.60979375000034,286.85947500000043],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-11,"from":-3,"to":-2,"fromPort":"e8cd7aef-9139-480c-ade2-1ef79cc4261d","toPort":"854f9c8e-0652-44aa-9705-95dc825ad577","points":[-50.258620689655174,-100.88701875000004,-60.258620689655174,-100.88701875000004,-98.62931034482759,-100.88701875000004,-98.62931034482759,-188.5,-137,-188.5,-147,-188.5],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-12,"from":-8,"to":-3,"fromPort":"fdc201ee-d40d-4d87-bd11-df445f3f976d","toPort":"2b860c7b-eafc-49b2-90ba-d32d007a2e7b","points":[18.75,-6.25,18.75,-16.25,18.75,-44.375,19,-44.375,19,-72.5,19,-82.5],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-13,"from":-10,"to":-3,"fromPort":"16d8e009-b1b1-45c2-a94f-1a90943ee090","toPort":"fdc201ee-d40d-4d87-bd11-df445f3f976d","points":[18.75,-316.75,18.75,-306.75,18.75,-217.125,19.786697850832525,-217.125,19.786697850832525,-127.5,19.786697850832525,-117.5],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-14,"from":-3,"to":-12,"fromPort":"17fac662-e52f-43de-8c27-d24452d9ed2a","toPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","points":[90.25862068965517,-102.10252500000001,100.25862068965517,-102.10252500000001,263.62931034482756,-102.10252500000001,263.62931034482756,-103.0625,427,-103.0625,437,-103.0625],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-15,"from":-12,"to":-4,"fromPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","toPort":"3a24769a-5f3a-49e6-953d-a5e1fce7e8be","points":[470,-136.3125,470,-146.3125,470,-204.65625,470,-204.65625,470,-263,470,-273],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-16,"from":-12,"to":-13,"fromPort":"854f9c8e-0652-44aa-9705-95dc825ad577","toPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","points":[503,-103.0625,513,-103.0625,691.5,-103.0625,691.5,-150.03125,691.5,-197,691.5,-207],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-17,"from":-13,"to":-11,"fromPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","toPort":"415f271d-1dd7-415f-ab4f-d5a7221b095a","points":[658.25,-240,648.25,-240,481.0977750000001,-240,481.0977750000001,-238.20473125000035,313.94555000000025,-238.20473125000035,303.94555000000025,-238.20473125000035],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-18,"from":-4,"to":-15,"fromPort":"58c1fc66-36b0-4e21-af4f-85e52828ac76","toPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","points":[419.2806687500005,-498.35756250000065,409.2806687500005,-498.35756250000065,412,-498.35756250000065,412,-498.35756250000065,357.5,-498.35756250000065,357.5,-588.25,357.5,-598.25],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-19,"from":-15,"to":-11,"fromPort":"854f9c8e-0652-44aa-9705-95dc825ad577","toPort":"ab215031-702e-4d22-9663-8c4f631c19ed","points":[324.5,-631.5,314.5,-631.5,314.5,-631.5,314.5,-600,295,-600,285,-600],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-20,"from":-13,"to":-15,"fromPort":"854f9c8e-0652-44aa-9705-95dc825ad577","toPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","points":[691.5,-273,691.5,-283,691.5,-631.5,546,-631.5,400.5,-631.5,390.5,-631.5],"category":"Arrow", 'highlightColor':'red', 'color':'black'},
{"key":-21,"from":-11,"to":-10,"fromPort":"ec58dcb4-39fb-400e-bb0e-018ecee51d56","toPort":"ba564564-2ac8-48da-a430-3af06ea4997d","category":"Arrow", 'highlightColor':'red', 'color':'black',"points":[220,-733.25,220,-743.25,92.125,-743.25,92.125,-401.25,58.25,-401.25,48.25,-401.25]}
]}
let json = diagramModelData['diagramData']
myDiagram.model = go.Model.fromJson(json)
getRuleList()
changeDiagramConfig('mode', 'readonly')
}
function exportData(){
console.log(myDiagram.model.toJson())
let diagramData = myDiagram.model.toJson()
let ruleData = ruleList.value
console.log({
'diagramData': JSON.parse(diagramData),
'ruleData': ruleData
})
}
function saveData(){
console.log(selectedNode.value)
}
// endregion
// diagram 部分
......@@ -429,7 +477,6 @@ function listenDiagram(){
selectedNode.value = null
selectedLink.value = null
let currentSelected = myDiagram.selection.first()
console.log(currentSelected)
if (currentSelected === null) {
ifSelectNode.value = false
ifSelectLink.value = false
......@@ -457,6 +504,9 @@ function listenDiagram(){
}
})
});
myDiagram.addModelChangedListener(function(e:any){
if (e.isTransactionFinished) runAllEnableRule(getDeviceMapData(myDiagram));
})
}
function freshSelectionNode(){
......@@ -630,6 +680,7 @@ function changeDeviceData(){
let model = myDiagram.model
let nodeDataArray = myDiagram.model.nodeDataArray
let linkDataArray = myDiagram.model.linkDataArray
myDiagram.startTransaction('changeDeviceData')
nodeDataArray.forEach((item:any)=>{
// model.set(item, "press", Math.floor(Math.random()*100))
// model.set(item, "thick", Math.random().toFixed(2))
......@@ -665,7 +716,7 @@ function changeDeviceData(){
model.set(item, 'failurePossibility', deviceFailurePossibility.valueOf())
}
)
myDiagram.commitTransaction('changeDeviceData')
}
function changeDataRealTime(){
......@@ -704,17 +755,81 @@ function analyzeData(){
}
//endregion
// 规则部分
//region
function getRuleList(){
ruleList.value = rules
triggerRef(ruleList)
}
function showAddRuleDialog(){
ruleDialog.value.visible = true
ruleDialog.value.type = 'add'
// 图表有修改,需要更新设备列表
deviceMap.value = getDeviceMapData(myDiagram)
ruleDialog.value.data = {
name: "",
inputs:[],
func:"",
}
}
function showEditRuleDialog(ruleData:any){
ruleDialog.value.visible = true
ruleDialog.value.type = 'update'
ruleDialog.value.data = ruleData
}
function addRuleParam(){
ruleDialog.value.data.inputs.push(
{key:"", valueKey:"", testData:""}
)
}
function confirmAddRule(){
let ruleData = ruleDialog.value.data
console.log(ruleData)
if(!ruleData.name) {
ElMessage.error('规则名称不能为空')
return
}
if(ruleDialog.value.type === 'add'){
addRule(ruleData.name, ruleData.inputs, ruleData.func)
}else if(ruleDialog.value.type === 'update'){
updateRule(ruleData.id, ruleData.name, ruleData.inputs, ruleData.func)
}
ruleDialog.value.visible = false
getRuleList()
}
function deleteRuleParam(index:number){
ruleDialog.value.data.inputs.splice(index, 1)
}
function runRuleWithTestData(id:string){
testRuleById(id)
}
function deleteRule(id:string){
deleteRuleById(id)
getRuleList()
}
//endregion
// 其他
// region
// 浏览器大小变化时
window.onresize = function (){
getNodeSourceScrollAreaHeight()
getPanelScrollAreaHeight()
}
// 为了在页面大小变化时,让节点区域的滚动条区域高度自适应
function getNodeSourceScrollAreaHeight(){
function getPanelScrollAreaHeight(){
// 滚动区域高度为浏览器窗口高度 - 144px(固定的上方ToolBar + 本页面的输入框和最下方的按钮)
nodeAreaHeight.value = window.innerHeight - 144 + 'px'
panelScrollAreaHeight.value = window.innerHeight - 144 + 'px'
}
// endregion
</script>
......
......@@ -6,7 +6,6 @@ export var GO = go.GraphObject.make;
* 获取节点的所有连接,存储为一个Map。{key:{next:[], data:{}}}
*/
export function getMapData(myDiagram:any) {
let model = myDiagram.model
let nodeDataArray = model.nodeDataArray
let linkDataArray = model.linkDataArray
......@@ -26,6 +25,26 @@ export function getMapData(myDiagram:any) {
}
/**
* 不区分节点和连接
*/
export function getDeviceMapData(myDiagram:any){
let nodeDataArray = myDiagram.model.nodeDataArray
let linkDataArray = myDiagram.model.linkDataArray
let deviceMap: Record<any, any> = {}
nodeDataArray.forEach((item:any)=>{
deviceMap[item.key] = item
})
linkDataArray.forEach((item:any)=>{
let from = item.from?deviceMap[item.from]['name']:""
let to = item.to?deviceMap[item.to]['name']:""
item.name = from + " -> " + to
deviceMap[item.key] = item
})
return deviceMap
}
/**
* 获取所有选择的节点
* @param {go.Diagram} myDiagram
* @return [{},{}]
......
......@@ -69,3 +69,89 @@ export const SourceNodeModel = [
]
}
]
export const diagramModelData = {
diagramData:{
"class": "GraphLinksModel",
"copiesArrays": true,
"copiesArrayObjects": true,
"linkKeyProperty": "key",
"linkFromPortIdProperty": "fromPort",
"linkToPortIdProperty": "toPort",
"nodeDataArray": [
{"name":"氨分离罐","nodeCollection":"ammonia","img":"src/assets/models/ammonia/氨分离罐.svg","category":"svg","key":"2e1c41ef-f5bd-4365-a9b9-988e3f13b8e7","loc":"-450 -399.99999999999994","size":"100 209.94475138121547","portArray":[{"name":"端口1","portId":"11c8ba71-e7cc-41ee-b7d3-cd2814e26f0f","alignment":"0.7939024142622645 0.4946518480722313 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"256b782d-5870-4e05-94ff-34f130c5060e","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"dcd15cc2-ec1b-4a35-b861-377b6f75d0b9","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"}]},
{"name":"冷却器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器.svg","category":"svg","key":"f78b6be4-4cc2-4812-96e1-aa065118398a","loc":"-250 -330","size":"97.77777777777777 40","portArray":[{"name":"端口1","portId":"51b9d16b-8eea-4c4e-92a2-5bb9d99d294f","alignment":"0 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"a8e9572b-53fb-4791-a173-e272c28bc8af","alignment":"1 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false}]},
{"name":"压缩机","nodeCollection":"ammonia","img":"src/assets/models/ammonia/压缩机.svg","category":"svg","key":"c768e62d-251e-4eb6-bcd0-b80310bcca97","loc":"-457.5 -60","size":"80 65.625","portArray":[{"name":"端口1","portId":"55950fe5-ebe1-4d75-b6b4-30da5e97af17","alignment":"0 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":"0","toMaxLinks":"1","fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"4226d10a-0eb2-4c7a-b839-287003f573ff","alignment":"0.5200892857142833 0.09365079365079423 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"3f0de33c-e4c4-4187-b7bf-d8192b0708d9","alignment":"1 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false}]},
{"name":"冷却器-2","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器-2.svg","category":"svg","key":"f188844a-ad0e-42bc-9112-6a1c3126bb81","loc":"-263 -70.3125","size":"100 40","portArray":[{"name":"端口1","portId":"0be6a460-df3a-423f-be3d-b38a4adead36","alignment":"0.11857314993877253 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口2","portId":"0d7b8599-993d-4474-9fb7-a1f1425cbe32","alignment":"0.11857314993877253 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"}]},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":"df1e7ada-0f3f-4d9e-a3f5-e20ff03674f5","loc":"-180 -200","angle":180},
{"name":"换热器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/换热器.svg","category":"svg","key":"989dd43f-e522-446a-9983-bb0652f82606","loc":"20 -100","size":"135.51724137931035 30.000000000000004","portArray":[{"name":"端口1","portId":"e8cd7aef-9139-480c-ade2-1ef79cc4261d","alignment":"0 0.47043270833333206 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"fdc201ee-d40d-4d87-bd11-df445f3f976d","alignment":"0.4984260146753545 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"17fac662-e52f-43de-8c27-d24452d9ed2a","alignment":"1 0.4299158333333329 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口4","portId":"2b860c7b-eafc-49b2-90ba-d32d007a2e7b","alignment":"0.4984260146753545 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"}]},
{"name":"换热器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/换热器.svg","category":"svg","key":"140db11d-8c76-4b77-9513-d08927e9a898","loc":"20 10","size":"135.51724137931035 30.000000000000004","portArray":[{"name":"端口2","portId":"fdc201ee-d40d-4d87-bd11-df445f3f976d","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口3","portId":"17fac662-e52f-43de-8c27-d24452d9ed2a","alignment":"1 0.5301687499999994 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false}]},
{"name":"冷却器","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器.svg","category":"svg","key":"518ecc34-5089-45b6-85fa-6347bcf6c3b0","loc":"250 100","portArray":[{"name":"端口1","portId":"d5501d1f-5fa8-4d71-8a77-37c64482de72","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false},{"name":"端口2","portId":"d17eb676-1f01-43f1-b658-b16fde8e4159","alignment":"0 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0"},{"name":"端口3","portId":"96dee2d1-babb-4b4d-b5cb-0bafad3131d9","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":"1","toMaxLinks":"0","fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}]},
{"name":"冷却器-2","nodeCollection":"ammonia","img":"src/assets/models/ammonia/冷却器-2.svg","category":"svg","key":"ebd9e84e-03cb-446c-8a01-45b0c72cd28b","loc":"20 -400","portArray":[{"name":"端口1","portId":"16d8e009-b1b1-45c2-a94f-1a90943ee090","alignment":"1 0.5 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0"},{"name":"端口2","portId":"ba564564-2ac8-48da-a430-3af06ea4997d","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0"}],"angle":90},
{"name":"合成塔","nodeCollection":"ammonia","img":"src/assets/models/ammonia/合成塔.svg","category":"svg","key":"875e1fd3-4e77-4def-86cb-aba8b62285c4","loc":"220 -460","portArray":[{"name":"端口1","portId":"415f271d-1dd7-415f-ab4f-d5a7221b095a","alignment":"0.9735206395348852 0.9054140969669111 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"ab215031-702e-4d22-9663-8c4f631c19ed","alignment":"0.8675171875000016 0.23956692325367507 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"ec58dcb4-39fb-400e-bb0e-018ecee51d56","alignment":"0.5 0 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 0 0 0","toSpot":"0.5 0 0 0","isHighlighted":false}]},
{"name":"开工炉","nodeCollection":"ammonia","img":"src/assets/models/ammonia/开工炉.svg","category":"svg","key":"fe4eae7d-50ed-431d-a37a-3b21d6bc4d58","loc":"470 -441.25","portArray":[{"name":"端口1","portId":"3a24769a-5f3a-49e6-953d-a5e1fce7e8be","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0"},{"name":"端口2","portId":"58c1fc66-36b0-4e21-af4f-85e52828ac76","alignment":"0.19673376572327342 0.33276178892215375 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0"}]},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":"92578a96-c463-4233-a1c8-f2909365828d","loc":"470 -114.5625","angle":180},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":"0b219174-ad9c-4e57-bd52-a1b8981c4d05","loc":"680 -240","angle":90},
{"name":"三头","nodeCollection":"pipe","geometry":"F1 M0 0 L60 0 60 20 50 20 Q40 20 40 30 L40 40 20 40 20 30 Q20 20 10 20 L0 20z","fill":"rgba(128, 128, 128, 0.5)","category":"geometry","portArray":[{"name":"端口1","portId":"854f9c8e-0652-44aa-9705-95dc825ad577","alignment":"0 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0 0.5 0 0","toSpot":"0 0.5 0 0","isHighlighted":false},{"name":"端口2","portId":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","alignment":"1 0.25 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"1 0.5 0 0","toSpot":"1 0.5 0 0","isHighlighted":false},{"name":"端口3","portId":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","alignment":"0.5 1 0 0","fromLinkable":true,"toLinkable":true,"fromMaxLinks":999,"toMaxLinks":999,"fromSpot":"0.5 1 0 0","toSpot":"0.5 1 0 0","isHighlighted":false}],"key":"b3f1e722-12cc-47b0-a612-bf148b7e0844","loc":"357.5 -620","angle":0}
],
"linkDataArray": [
{"key":"4a76dc14-276a-4c31-8ed5-26bb673d163d","from":"f78b6be4-4cc2-4812-96e1-aa065118398a","to":"2e1c41ef-f5bd-4365-a9b9-988e3f13b8e7","fromPort":"51b9d16b-8eea-4c4e-92a2-5bb9d99d294f","toPort":"11c8ba71-e7cc-41ee-b7d3-cd2814e26f0f","points":[-301.3888888888889,-330,-311.3888888888889,-330,-311.3888888888889,-330,-311.3888888888889,-401.1228164268244,-408.10975857377355,-401.1228164268244,-418.10975857377355,-401.1228164268244],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"c892d490-b8c6-4419-a119-890ade12e00e","from":"2e1c41ef-f5bd-4365-a9b9-988e3f13b8e7","fromPort":"256b782d-5870-4e05-94ff-34f130c5060e","toPort":"","points":[-450,-507.47237569060775,-450,-517.4723756906078,-450,-547.6190476190478,-588.0952380952383,-547.6190476190478,-588.0952380952383,-547.6190476190478,-598.0952380952383,-547.6190476190478],"from_text":"","middle_text":"","to_text":"燃料气","category":"Arrow","highlightColor":"red","color":"black"},
{"key":"bba68221-f36d-407b-8092-638688122a5d","from":"2e1c41ef-f5bd-4365-a9b9-988e3f13b8e7","fromPort":"dcd15cc2-ec1b-4a35-b861-377b6f75d0b9","toPort":"","points":[-450,-292.5276243093923,-450,-282.5276243093923,-450,-248.57142857142867,-588.0952380952383,-248.57142857142867,-588.0952380952383,-248.57142857142867,-598.0952380952383,-248.57142857142867],"from_text":"","middle_text":"","to_text":"氨产品","category":"Arrow","highlightColor":"red","color":"black"},
{"key":"fc015221-552a-4524-8dc7-67088046eaec","from":"c768e62d-251e-4eb6-bcd0-b80310bcca97","to":"f188844a-ad0e-42bc-9112-6a1c3126bb81","fromPort":"3f0de33c-e4c4-4187-b7bf-d8192b0708d9","toPort":"0be6a460-df3a-423f-be3d-b38a4adead36","points":[-415,-60,-405,-60,-370,-60,-370,-102.8125,-301.14268500612275,-102.8125,-301.14268500612275,-92.8125],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"e905f3b0-480d-45b2-b922-f978995e3106","from":"df1e7ada-0f3f-4d9e-a3f5-e20ff03674f5","to":"f78b6be4-4cc2-4812-96e1-aa065118398a","fromPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","toPort":"a8e9572b-53fb-4791-a173-e272c28bc8af","points":[-180,-221.75,-180,-231.75,-180,-330,-188.61111111111114,-330,-188.61111111111114,-330,-198.61111111111114,-330],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"83744eca-100d-4458-9406-1fb5efcd345e","to":"c768e62d-251e-4eb6-bcd0-b80310bcca97","fromPort":"","toPort":"55950fe5-ebe1-4d75-b6b4-30da5e97af17","points":[-603.1746031746034,-58.95691609977325,-593.1746031746034,-58.95691609977325,-560,-58.95691609977325,-560,-60,-510,-60,-500,-60],"from_text":"原料气","middle_text":"","to_text":"","category":"Arrow","highlightColor":"red","color":"black","adjusting":"End"},
{"key":"fccb1002-adab-4624-9564-450c9168c82c","from":"f188844a-ad0e-42bc-9112-6a1c3126bb81","to":"518ecc34-5089-45b6-85fa-6347bcf6c3b0","fromPort":"0d7b8599-993d-4474-9fb7-a1f1425cbe32","toPort":"d17eb676-1f01-43f1-b658-b16fde8e4159","points":[-301.14268500612275,-47.8125,-301.14268500612275,-37.8125,-301.14268500612275,100,172.75,100,172.75,100,182.75,100],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"9dc2f55f-574d-49d8-8858-3b1a9d9f9cc3","from":"518ecc34-5089-45b6-85fa-6347bcf6c3b0","to":"140db11d-8c76-4b77-9513-d08927e9a898","fromPort":"d5501d1f-5fa8-4d71-8a77-37c64482de72","toPort":"17fac662-e52f-43de-8c27-d24452d9ed2a","points":[251.25,70.5,251.25,60.5,251.25,12.155062499999984,99.00862068965517,12.155062499999984,99.00862068965517,12.155062499999984,89.00862068965517,12.155062499999984],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"4e31a0bc-34b4-4a85-99b6-b87322620410","from":"518ecc34-5089-45b6-85fa-6347bcf6c3b0","fromPort":"96dee2d1-babb-4b4d-b5cb-0bafad3131d9","toPort":"","points":[251.25,129.5,251.25,139.5,251.25,208.17973750000021,251.60979375000034,208.17973750000021,251.60979375000034,276.85947500000043,251.60979375000034,286.85947500000043],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"a795b94a-93ab-4e59-b0c2-e6c33f9820b3","from":"989dd43f-e522-446a-9983-bb0652f82606","to":"df1e7ada-0f3f-4d9e-a3f5-e20ff03674f5","fromPort":"e8cd7aef-9139-480c-ade2-1ef79cc4261d","toPort":"854f9c8e-0652-44aa-9705-95dc825ad577","points":[-50.258620689655174,-100.88701875000004,-60.258620689655174,-100.88701875000004,-98.62931034482759,-100.88701875000004,-98.62931034482759,-188.5,-137,-188.5,-147,-188.5],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"efe3745c-23b2-41b9-a08c-1a08ab23c0ef","from":"140db11d-8c76-4b77-9513-d08927e9a898","to":"989dd43f-e522-446a-9983-bb0652f82606","fromPort":"fdc201ee-d40d-4d87-bd11-df445f3f976d","toPort":"2b860c7b-eafc-49b2-90ba-d32d007a2e7b","points":[18.75,-6.25,18.75,-16.25,18.75,-44.375,19.786697850832525,-44.375,19.786697850832525,-72.5,19.786697850832525,-82.5],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"97b97604-8d4b-400f-968f-bc872835548d","from":"ebd9e84e-03cb-446c-8a01-45b0c72cd28b","to":"989dd43f-e522-446a-9983-bb0652f82606","fromPort":"16d8e009-b1b1-45c2-a94f-1a90943ee090","toPort":"fdc201ee-d40d-4d87-bd11-df445f3f976d","points":[18.75,-316.75,18.75,-306.75,18.75,-217.125,19.786697850832525,-217.125,19.786697850832525,-127.5,19.786697850832525,-117.5],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"da9b8c04-edfb-4def-823c-d073ae591a30","from":"989dd43f-e522-446a-9983-bb0652f82606","to":"92578a96-c463-4233-a1c8-f2909365828d","fromPort":"17fac662-e52f-43de-8c27-d24452d9ed2a","toPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","points":[90.25862068965517,-102.10252500000001,100.25862068965517,-102.10252500000001,263.62931034482756,-102.10252500000001,263.62931034482756,-103.0625,427,-103.0625,437,-103.0625],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"87fc47be-0a0f-454d-b81a-bbf94043927b","from":"0b219174-ad9c-4e57-bd52-a1b8981c4d05","to":"875e1fd3-4e77-4def-86cb-aba8b62285c4","fromPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","toPort":"415f271d-1dd7-415f-ab4f-d5a7221b095a","points":[658.25,-240,648.25,-240,481.0977750000001,-240,481.0977750000001,-238.20473125000035,313.94555000000025,-238.20473125000035,303.94555000000025,-238.20473125000035],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"83ff62ba-92cf-41ce-86dc-8b626f6df1d0","from":"fe4eae7d-50ed-431d-a37a-3b21d6bc4d58","to":"b3f1e722-12cc-47b0-a612-bf148b7e0844","fromPort":"58c1fc66-36b0-4e21-af4f-85e52828ac76","toPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","points":[419.2806687500005,-498.35756250000065,409.2806687500005,-498.35756250000065,412,-498.35756250000065,412,-498.35756250000065,357.5,-498.35756250000065,357.5,-588.25,357.5,-598.25],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"b86e2225-a5b4-4678-9150-df63e61075b3","from":"b3f1e722-12cc-47b0-a612-bf148b7e0844","to":"875e1fd3-4e77-4def-86cb-aba8b62285c4","fromPort":"854f9c8e-0652-44aa-9705-95dc825ad577","toPort":"ab215031-702e-4d22-9663-8c4f631c19ed","points":[324.5,-631.5,314.5,-631.5,314.5,-631.5,314.5,-600.4255937500008,295.7129562500003,-600.4255937500008,285.7129562500003,-600.4255937500008],"category":"Arrow","highlightColor":"red","color":"black"},
{"key":"9b61f83c-6340-4f5b-b290-49c0c1a92d1b","from":"875e1fd3-4e77-4def-86cb-aba8b62285c4","to":"ebd9e84e-03cb-446c-8a01-45b0c72cd28b","fromPort":"ec58dcb4-39fb-400e-bb0e-018ecee51d56","toPort":"ba564564-2ac8-48da-a430-3af06ea4997d","category":"Arrow","highlightColor":"red","color":"black","points":[220,-733.25,220,-743.25,92.125,-743.25,92.125,-401.25,58.25,-401.25,48.25,-401.25]},
{"from":"df1e7ada-0f3f-4d9e-a3f5-e20ff03674f5","to":"c768e62d-251e-4eb6-bcd0-b80310bcca97","fromPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","toPort":"4226d10a-0eb2-4c7a-b839-287003f573ff","key":-21,"category":"Arrow","highlight":false,"highlightColor":"red","color":"black","points":[-213,-188.5,-223,-188.5,-455.89285714285734,-188.5,-455.89285714285734,-143.83333333333331,-455.89285714285734,-99.16666666666663,-455.89285714285734,-89.16666666666663]},
{"from":"92578a96-c463-4233-a1c8-f2909365828d","to":"0b219174-ad9c-4e57-bd52-a1b8981c4d05","fromPort":"854f9c8e-0652-44aa-9705-95dc825ad577","toPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","key":-22,"category":"Arrow","highlight":false,"highlightColor":"red","color":"black","points":[503,-103.0625,513,-103.0625,691.5,-103.0625,691.5,-150.03125,691.5,-197,691.5,-207]},
{"from":"0b219174-ad9c-4e57-bd52-a1b8981c4d05","to":"b3f1e722-12cc-47b0-a612-bf148b7e0844","fromPort":"854f9c8e-0652-44aa-9705-95dc825ad577","toPort":"9c6c8565-d1f4-46fa-b67b-db673fd127aa","key":-23,"category":"Arrow","highlight":false,"highlightColor":"red","color":"black","points":[691.5,-273,691.5,-283,691.5,-631.5,546,-631.5,400.5,-631.5,390.5,-631.5]},
{"from":"92578a96-c463-4233-a1c8-f2909365828d","to":"fe4eae7d-50ed-431d-a37a-3b21d6bc4d58","fromPort":"d88aaad3-7e10-47ab-81ec-0040f3c21cf7","toPort":"3a24769a-5f3a-49e6-953d-a5e1fce7e8be","key":-24,"category":"Arrow","highlight":false,"highlightColor":"red","color":"black","points":[470,-136.3125,470,-146.3125,470,-204.65625,470,-204.65625,470,-263,470,-273]}
]
},
ruleData:[
{
id:"51b9d16b-8eea-4c4e-92a2-5bb9d99d298t",
name:"测试脚本",
inputs:[{
"key": "f78b6be4-4cc2-4812-96e1-aa065118398a",
"valueKey": "failurePossibility"
}],
func:'function a(data) {if(data<0.1)alert("测试小于0.1"+data)}',
enable:true,
description:"测试小于0.1",
},
{
id:"51b9d15b-8eea-4c4e-92a2-5bb9d99d298t",
name:"测试脚本",
inputs:[{
"key": "f78b6be4-4cc2-4812-96e1-aa065118398a",
"valueKey": "failurePossibility"
}],
func:'function a(data) {if(data ===0);alert("测试等于零"+data)}',
enable:true,
description:"测试等于零",
},
{
id:"51b9d16b-8eea-4c4e-92a2-5bb9599d298t",
name:"测试脚本",
inputs:[{
"key": "f78b6be4-4cc2-4812-96e1-aa065118398a",
"valueKey": "failurePossibility"
}],
func:'function a(data) {if(data < 0)alert("测试小于零"+data)}',
enable:true,
description:"测试<0",
},
]
}
import * as math from 'mathjs'
/* DeviceType 类定义不同类型设备的常量。 */
export class DeviceType{
static CONTAINER = 'container';
static PUMP = 'pump';
......
import {uuid} from "vue3-uuid";
import {diagramModelData} from "../ModelData.ts";
export const rules :Record<string, any>[]= diagramModelData['ruleData']
/**
* 添加规则
* @param name 规则名称
* @param inputs 输入参数 [{key:-1 ,valueKey:'thick',testData:""}] key表示节点在diagram中的唯一id,valueKey表示节点的属性key
* @param func 规则函数
*/
export function addRule(name:string, inputs:any[], func:Function){
rules.push({
id: uuid.v4(),
name: name,
inputs: inputs,
func: func,
enable:false,
})
}
/**
* 更新规则
* @param id 规则id
* @param name 规则名称
* @param inputs 输入参数
* @param func 规则函数
*/
export function updateRule(id:string, name:string, inputs:[], func:Function){
let ruleIndex = rules.findIndex((item:any) => item.id == id)
if (ruleIndex !== -1){
rules[ruleIndex].name = name
rules[ruleIndex].inputs = inputs
rules[ruleIndex].func = func
}
}
/**
* 删除规则
* @param id
*/
export function deleteRuleById(id:string){
rules.splice(rules.findIndex((item:any) => item.id == id), 1)
}
/**
* 运行规则
* @param rule 规则
* @param deviceMap 设备数据
*/
export function runRule(rule:any, deviceMap:Record<string, any>){
let inputData = []
let runFunc = null
if (rule){
for (let input of rule.inputs){
inputData.push(deviceMap[input.key][input.valueKey])
}
runFunc = new Function( "return " + rule.func)
try {
runFunc()(...inputData)
}catch (e){
alert(e)
}
}
}
export function runAllEnableRule(deviceMap:Record<string, any>){
rules.forEach((item:any) => {
if(item['enabled']) runRule(item, deviceMap)
})
}
export function runRuleById(id:string, deviceMap:Record<string, any>){
let rule = rules.find((item:any) => item.id == id)
runRule(rule, deviceMap)
}
export function testRule(rule:any){
let inputData = []
let runFunc = null
if (rule){
for (let input of rule.inputs){
inputData.push(input['testData'])
}
runFunc = new Function( "return " + rule.func)
try {
runFunc()(...inputData)
}catch (e){
alert(e)
}
}
}
export function testRuleById(id:string){
let rule = rules.find((item:any) => item.id == id)
testRule(rule)
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment