Эх сурвалжийг харах

feat: 优化规则编排,增加子规则链类型

yanglzh 5 сар өмнө
parent
commit
3457bba570

+ 40 - 0
pnpm-lock.yaml

@@ -14,6 +14,9 @@ importers:
       '@element-plus/icons-vue':
       '@element-plus/icons-vue':
         specifier: 2.0.9
         specifier: 2.0.9
         version: 2.0.9(vue@3.2.37)
         version: 2.0.9(vue@3.2.37)
+      '@guolao/vue-monaco-editor':
+        specifier: ^1.5.5
+        version: 1.5.5(monaco-editor@0.52.2)(vue@3.2.37)
       axios:
       axios:
         specifier: 0.26.0
         specifier: 0.26.0
         version: 0.26.0
         version: 0.26.0
@@ -71,6 +74,9 @@ importers:
       mitt:
       mitt:
         specifier: 3.0.0
         specifier: 3.0.0
         version: 3.0.0
         version: 3.0.0
+      monaco-editor:
+        specifier: ^0.52.2
+        version: 0.52.2
       nprogress:
       nprogress:
         specifier: 0.2.0
         specifier: 0.2.0
         version: 0.2.0
         version: 0.2.0
@@ -318,6 +324,16 @@ packages:
   '@floating-ui/utils@0.2.7':
   '@floating-ui/utils@0.2.7':
     resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==}
     resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==}
 
 
+  '@guolao/vue-monaco-editor@1.5.5':
+    resolution: {integrity: sha512-NFGImQ8dBYj6ehIxy1DngPRkctB9b6GbxvCm6aXZztNsgm/TtM4u+YM9ZwZHQPlXt7a4IODXoKCcTYEVycBSyA==}
+    peerDependencies:
+      '@vue/composition-api': ^1.7.1
+      monaco-editor: '>=0.43.0'
+      vue: ^2.6.14 || >=3.0.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+
   '@humanwhocodes/config-array@0.9.5':
   '@humanwhocodes/config-array@0.9.5':
     resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==}
     resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==}
     engines: {node: '>=10.10.0'}
     engines: {node: '>=10.10.0'}
@@ -439,6 +455,9 @@ packages:
     resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==}
     resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==}
     engines: {node: '>= 0.4'}
     engines: {node: '>= 0.4'}
 
 
+  '@monaco-editor/loader@1.5.0':
+    resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==}
+
   '@nodelib/fs.scandir@2.1.5':
   '@nodelib/fs.scandir@2.1.5':
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     engines: {node: '>= 8'}
     engines: {node: '>= 8'}
@@ -1631,6 +1650,9 @@ packages:
     resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==}
     resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==}
     engines: {node: '>= 0.4'}
     engines: {node: '>= 0.4'}
 
 
+  monaco-editor@0.52.2:
+    resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==}
+
   ms@2.1.3:
   ms@2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
 
 
@@ -1922,6 +1944,9 @@ packages:
     resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
     resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
     engines: {node: '>=0.8'}
     engines: {node: '>=0.8'}
 
 
+  state-local@1.0.7:
+    resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
+
   string.prototype.trim@1.2.9:
   string.prototype.trim@1.2.9:
     resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
     resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
     engines: {node: '>= 0.4'}
     engines: {node: '>= 0.4'}
@@ -2412,6 +2437,13 @@ snapshots:
 
 
   '@floating-ui/utils@0.2.7': {}
   '@floating-ui/utils@0.2.7': {}
 
 
+  '@guolao/vue-monaco-editor@1.5.5(monaco-editor@0.52.2)(vue@3.2.37)':
+    dependencies:
+      '@monaco-editor/loader': 1.5.0
+      monaco-editor: 0.52.2
+      vue: 3.2.37
+      vue-demi: 0.14.10(vue@3.2.37)
+
   '@humanwhocodes/config-array@0.9.5':
   '@humanwhocodes/config-array@0.9.5':
     dependencies:
     dependencies:
       '@humanwhocodes/object-schema': 1.2.1
       '@humanwhocodes/object-schema': 1.2.1
@@ -2565,6 +2597,10 @@ snapshots:
     dependencies:
     dependencies:
       call-bind: 1.0.7
       call-bind: 1.0.7
 
 
+  '@monaco-editor/loader@1.5.0':
+    dependencies:
+      state-local: 1.0.7
+
   '@nodelib/fs.scandir@2.1.5':
   '@nodelib/fs.scandir@2.1.5':
     dependencies:
     dependencies:
       '@nodelib/fs.stat': 2.0.5
       '@nodelib/fs.stat': 2.0.5
@@ -3903,6 +3939,8 @@ snapshots:
       hasown: 2.0.2
       hasown: 2.0.2
       isarray: 2.0.5
       isarray: 2.0.5
 
 
+  monaco-editor@0.52.2: {}
+
   ms@2.1.3: {}
   ms@2.1.3: {}
 
 
   nanoid@3.3.7: {}
   nanoid@3.3.7: {}
@@ -4139,6 +4177,8 @@ snapshots:
     dependencies:
     dependencies:
       frac: 1.1.2
       frac: 1.1.2
 
 
+  state-local@1.0.7: {}
+
   string.prototype.trim@1.2.9:
   string.prototype.trim@1.2.9:
     dependencies:
     dependencies:
       call-bind: 1.0.7
       call-bind: 1.0.7

+ 11 - 7
src/views/iot/rule-engine/edit.vue

@@ -4,6 +4,13 @@
       <el-form-item label="名称" prop="name">
       <el-form-item label="名称" prop="name">
         <el-input v-model.trim="formData.name" placeholder="输入名称" />
         <el-input v-model.trim="formData.name" placeholder="输入名称" />
       </el-form-item>
       </el-form-item>
+      <el-form-item label="根规则链" prop="types">
+        <el-switch v-model="formData.types" :active-value="1" :inactive-value="0" active-text="创建根规则链" inactive-text="创建子规则链"></el-switch>
+      </el-form-item>
+      <el-form-item label="调试模式" prop="status">
+        <el-switch v-model="formData.status" :active-value="2" :inactive-value="0"></el-switch>
+        开启后会覆盖节点的调试模式配置,所有节点会打印调试日志
+      </el-form-item>
       <el-form-item label="说明" prop="expound">
       <el-form-item label="说明" prop="expound">
         <el-input v-model="formData.expound" type="textarea" :rows="3" />
         <el-input v-model="formData.expound" type="textarea" :rows="3" />
       </el-form-item>
       </el-form-item>
@@ -29,10 +36,6 @@ import { v4 as uuid } from "uuid";
 const emit = defineEmits(["getList"]);
 const emit = defineEmits(["getList"]);
 
 
 const props = defineProps({
 const props = defineProps({
-  types: {
-    type: Number,
-    default: 0, // 规则编排是0 数据转发是1
-  },
   model: {
   model: {
     type: String,
     type: String,
     default: "sagoo-rule", // sagoo-rule 、node-red
     default: "sagoo-rule", // sagoo-rule 、node-red
@@ -51,10 +54,10 @@ const formRef = ref();
 const baseForm = {
 const baseForm = {
   id: undefined,
   id: undefined,
   name: "",
   name: "",
-  types: props.types,
-  // types: 0,
+  types: 1,
   flowId: "",
   flowId: "",
   expound: "",
   expound: "",
+  status: 0,
 };
 };
 
 
 const formData = reactive({
 const formData = reactive({
@@ -78,7 +81,8 @@ const onSubmit = async () => {
           ruleChain: {
           ruleChain: {
             id: id,
             id: id,
             name: formData.name,
             name: formData.name,
-            root: true,
+            root: formData.types === 1,
+            debugMode: formData.status === 2,
             additionalInfo: {
             additionalInfo: {
               description: formData.expound,
               description: formData.expound,
               layoutX: "130",
               layoutX: "130",

+ 12 - 6
src/views/iot/rule-engine/index.vue

@@ -14,18 +14,24 @@
       <el-table :data="tableData" style="width: 100%" v-loading="loading">
       <el-table :data="tableData" style="width: 100%" v-loading="loading">
         <el-table-column type="index" label="序号" width="80" align="center" />
         <el-table-column type="index" label="序号" width="80" align="center" />
         <el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
         <el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="types" label="规则链类型" width="110" align="center">
+          <template #default="scope">
+            <el-tag type="primary" size="small" v-if="scope.row.types == 1">根规则链</el-tag>
+            <el-tag type="success" size="small" v-else>子规则链</el-tag>
+          </template>
+        </el-table-column>
         <el-table-column prop="expound" label="说明" show-overflow-tooltip></el-table-column>
         <el-table-column prop="expound" label="说明" show-overflow-tooltip></el-table-column>
         <el-table-column prop="createdAt" label="创建时间" min-width="100" align="center"></el-table-column>
         <el-table-column prop="createdAt" label="创建时间" min-width="100" align="center"></el-table-column>
-        <el-table-column prop="status" label="状态" width="100" align="center">
+        <!-- <el-table-column prop="status" label="状态" width="100" align="center">
           <template #default="scope">
           <template #default="scope">
             <el-tag type="success" size="small" v-if="scope.row.status == 1">已启动</el-tag>
             <el-tag type="success" size="small" v-if="scope.row.status == 1">已启动</el-tag>
             <el-tag type="info" size="small" v-else>已停止</el-tag>
             <el-tag type="info" size="small" v-else>已停止</el-tag>
           </template>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column label="操作" width="200" align="center">
         <el-table-column label="操作" width="200" align="center">
           <template #default="scope">
           <template #default="scope">
-            <el-button size="small" text type="info" v-auth="'startOrStop'" v-if="scope.row.status" @click="setStatus(scope.row, 0)">停止</el-button>
-            <el-button size="small" text type="primary" v-auth="'startOrStop'" v-else @click="setStatus(scope.row, 1)">启动</el-button>
+            <!-- <el-button size="small" text type="info" v-auth="'startOrStop'" v-if="scope.row.status" @click="setStatus(scope.row, 0)">停止</el-button>
+            <el-button size="small" text type="primary" v-auth="'startOrStop'" v-else @click="setStatus(scope.row, 1)">启动</el-button> -->
             <el-button size="small" text type="primary" v-auth="'edit'" @click="addOrEdit(scope.row)">编辑</el-button>
             <el-button size="small" text type="primary" v-auth="'edit'" @click="addOrEdit(scope.row)">编辑</el-button>
             <el-button size="small" text type="warning" @click="edit(scope.row)">规则编辑</el-button>
             <el-button size="small" text type="warning" @click="edit(scope.row)">规则编辑</el-button>
             <el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
             <el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
@@ -33,7 +39,7 @@
         </el-table-column>
         </el-table-column>
       </el-table>
       </el-table>
       <pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
       <pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
-      <EditForm :model="model" ref="editFormRef" @getList="getList(1)" :types="0"></EditForm>
+      <EditForm :model="model" ref="editFormRef" @getList="getList(1)"></EditForm>
     </el-card>
     </el-card>
   </div>
   </div>
 </template>
 </template>
@@ -52,7 +58,7 @@ const editFormRef = ref();
 // 规则引擎模式 node-red、 sagoo-rule
 // 规则引擎模式 node-red、 sagoo-rule
 const model: "node-red" | "sagoo-rule" = import.meta.env.VITE_RULE_MODEL;
 const model: "node-red" | "sagoo-rule" = import.meta.env.VITE_RULE_MODEL;
 
 
-const { params, tableData, getList, loading } = useSearch<any[]>(api.getList, "Data", { types: 0 });
+const { params, tableData, getList, loading } = useSearch<any[]>(api.getList, "Data", { types: null, status: null });
 
 
 const headers = {
 const headers = {
   Authorization: "Bearer " + getToken(),
   Authorization: "Bearer " + getToken(),