Quellcode durchsuchen

fix:转发规则操作符

lvkun996 vor 2 Jahren
Ursprung
Commit
f3b9b2dc69

+ 36 - 7
src/pages/Iot/device/components/msgTrack.vue

@@ -6,9 +6,12 @@
 
     <AlertTsx style="margin-top: 20px;"  >
       <template #valueSlot>
-        <div v-if="state.dataSource.length" >
+        <div v-if="state.dataSource.length && state.trackStart" >
           结束时间: {{state.formatStartTime}}
         </div>
+        <div v-else-if="state.trackStart" >
+          开始追踪:当前暂无消息记录
+        </div>
         <div v-else >
           尚未追踪
         </div>
@@ -41,7 +44,20 @@
       :pagination="false"
       style="height: 400px;overflow: hidden;overflow-y: auto;"
     >
-
+      <template #bodyCell="{column, record}">
+        <template v-if="column.key === 'eventType'" >
+          {{EventController.eventTypeMap.get(record.eventType)?.name}}
+        </template>
+        <template v-if="column.key === 'eventPayload'" >
+          <a-tooltip placement="topLeft" >
+            <template #title> {{record.eventPayload}}</template>
+            {{record.eventPayload}}
+          </a-tooltip>
+        </template>
+        <template v-else-if="column.key === 'eventTs'" >
+          {{ dayjs(record.eventTs).format('YYYY-MM-DD hh:mm:ss') }}
+        </template>
+      </template>
     </a-table>
   </a-card>
 </template>
@@ -60,27 +76,39 @@ const deviceId = route.query.id as string
 const columns = [
   {
     title: '业务名称',
-    dataIndex: 'eventName'
+    dataIndex: 'eventName',
+    width: 100
   },
   {
     title: '业务类型',
-    dataIndex: 'eventType'
+    dataIndex: 'eventType',
+    key: 'eventType',
+    width: 100
   },
   {
     title: '业务详情',
-    dataIndex: 'eventPayload'
+    dataIndex: 'eventPayload',
+    key: 'eventPayload',
+    width: 100,
+    ellipsis: true
   },
   {
     title: '记录时间',
-    dataIndex: 'eventTs'
+    dataIndex: 'eventTs',
+    key: 'eventTs',
+    width: 100
   }
 ]
 
+const eventTypeList = Array.from(EventController.eventTypeMap, ([key, value]) => ({ ...value, value: value.key }))
+
 const state = reactive({
   loading: false,
   dataSource: [],
   total: 0,
-  startTime: new Date().getTime() - 2000,
+  trackStart: false,
+  // startTime: new Date().getTime() - 2000,
+  startTime: 0,
   lastId: '',
   formatStartTime: ''
 })
@@ -91,6 +119,7 @@ const clearDataSource = () => {
 
 const addEventTrace = async () => {
   await EventController.addTrace({ deviceId: deviceId })
+  state.trackStart = true
   stop()
   getEventTraceList()
 }

+ 52 - 10
src/pages/Iot/rule/forwardRule.vue

@@ -106,7 +106,7 @@
                   @confirm="delForwardRule(record.id)"
                 >
                   <a>删除</a>
-                </a-popconfirm>
+              </a-popconfirm>
         </a-space>
       </template>
     </template>
@@ -129,6 +129,28 @@
       <div v-if="state.stepCount === 0" >针对部分类型数据提供的快速配置,将引导您完成简单的业务设置。您也可以直接编辑过滤语句,实现更复杂的查询要求</div>
       <div v-else-if="state.stepCount === 1" >您可以设置将数据转发至华为云其他服务或私有服务器。</div>
     </div>
+    <!-- <div v-if="state.stepCount == 0">
+      <a-form :label-col="{span: 4 }" :wrapper-col="{ span: 14 }" style="height: 600px; overflow-y: auto;">
+        <a-form-item  label="规则名称" >
+          <a-input></a-input>
+        </a-form-item>
+        <a-form-item label="转发目标">
+            <a-select
+            allowClear
+            style="width: 100%;"
+            v-model:value="forwardState.targetType"
+          >
+            <a-select-option
+              v-for="item in forwardTatget"
+              :key="item.key"
+              :value="item.key"
+            >
+              {{item.name}}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-form>
+    </div> -->
     <form-pro
       v-if="state.stepCount == 0"
       validate
@@ -353,7 +375,7 @@
     <a-form-item label="数据来源"> {{RuleController.SubjectResourceMap.get(detailForwardRef.subjectResource)?.name}} </a-form-item>
     <a-form-item label="触发事件"> {{RuleController.SubjectEventMap.get(detailForwardRef.subjectEvent)?.name}} </a-form-item>
     <a-form-item label="状态"> {{detailForwardRef.status ?  '运行中' : '已停止'}} </a-form-item>
-    <a-form-item label="HTTP">
+    <a-form-item label="HTTP" v-if="detailHTTPList.length">
       <a-table
         :columns="detailColumn['HTTP']"
         :data-source="detailHTTPList"
@@ -361,7 +383,7 @@
       />
 
     </a-form-item>
-    <a-form-item label="Kafka">
+    <a-form-item label="Kafka"  v-if="detailKAFKAList.length">
       <a-table
         :columns="detailColumn['Kafka']"
         :data-source="detailKAFKAList"
@@ -370,7 +392,7 @@
 
       </a-table>
     </a-form-item>
-    <a-form-item label="MQTT">
+    <a-form-item label="MQTT" v-if="detailMQTTList.length">
       <a-table
         :columns="detailColumn['MQTT']"
         :data-source="detailMQTTList"
@@ -379,7 +401,7 @@
 
       </a-table>
     </a-form-item>
-    <a-form-item label="RabbitMQ">
+    <a-form-item label="RabbitMQ" v-if="detailRABBITList.length">
       <a-table
         :columns="detailColumn['RabbitMQ']"
         :data-source="detailRABBITList"
@@ -406,12 +428,11 @@
 import { onMounted, reactive, ref } from 'vue'
 import { RuleController } from '@/controller/index'
 import type { FormItemProps } from '@/components/FormPro/index.vue'
-import { Form, Empty } from 'ant-design-vue'
+import { Form, Empty, message } from 'ant-design-vue'
 import { computed } from '@vue/reactivity'
 import TestDialog from './components/testDialog.vue'
-import { object } from 'vue-types'
-import { RtsController } from '@/controller/rts'
 import StatisticsTemplate from '@/components/StatisticsTemplate/index.vue'
+import { SubjectEventEnum, SubjectResourceEnum } from '@/enum/common'
 
 const columns = [
   {
@@ -467,7 +488,7 @@ const formProps: FormItemProps[] = [
     type: 'select',
     rules: true,
     value: '',
-    request: async () => await Array.from(RuleController.SubjectEventMap, ([key, value]) => ({ ...value, value: value.key }))
+    request: async () => await subjectEventList.value
   },
   {
     label: '规则描述',
@@ -535,6 +556,7 @@ const forwardRuleTargetsColumns = [
     dataIndex: 'action',
     key: 'action'
   }
+
 ]
 
 const forwardTatget = [
@@ -552,7 +574,22 @@ const HttpRequestMethods = [
 
 const subjectResourceList = Array.from(RuleController.SubjectResourceMap, ([key, value]) => ({ ...value, value: value.key }))
 
-const subjectEventList = Array.from(RuleController.SubjectEventMap, ([key, value]) => ({ ...value, value: value.key }))
+console.log('subjectResourceList', subjectResourceList)
+
+const subjectEventListByResourceMap = new Map([
+  [SubjectResourceEnum.DEVICE, [SubjectEventEnum.DEVICE_CREATE, SubjectEventEnum.DEVICE_DELETE]],
+  [SubjectResourceEnum.DEVICE_STATUS, [SubjectEventEnum.DEVICE_ATTRIBUTE_REPORT]],
+  [SubjectResourceEnum.DEVICE_ATTRIBUTE, [SubjectEventEnum.DEVICE_STATUS_UPDATE]],
+  [SubjectResourceEnum.MODEL, [SubjectEventEnum.MODEL_CREATE, SubjectEventEnum.MODEL_DELETE]]
+])
+
+const subjectEventList = computed(() => {
+  const subjectevents = Array.from(RuleController.SubjectEventMap, ([key, value]) => ({ ...value, value: value.key }))
+  const keys = subjectEventListByResourceMap.get(queryParams.subjectResource as SubjectResourceEnum)
+  console.log('keys:', keys)
+  const a = queryParams
+  return subjectevents.filter(subjectevent => keys?.includes(subjectevent.key))
+})
 
 const statusList = [
   { name: '所有状态', key: '', value: '' },
@@ -751,6 +788,11 @@ const openModalDebug = (id: string) => {
 const openModal = async (opraState: 'add' | 'update', record) => {
   state.opraState = opraState
 
+  if (opraState === 'update' && record.status) {
+    message.error('规则运行中,停止后可编辑')
+    return
+  }
+
   if (opraState === 'update') {
     state.forwardId = record.id
     const { data } = await RuleController.forwardById(record.id)

+ 43 - 27
src/pages/Iot/rule/linkRules.vue

@@ -349,33 +349,42 @@
               </a-select>
             </a-form-item>
             <a-form-item label="操作符" >
-              <a-select
-              allowClear
-                style="width: 170px"
-                placeholder="请选择操作符"
-                v-model:value="initConditionsData.operator"
-              >
-                <a-select-option
-                  v-for="operaItem in operatorList"
-                  :key="operaItem"
-                  :value="operaItem"
-                >
-                  {{operaItem}}
-                </a-select-option>
-              </a-select>
+              <a-space>
+                <a-select
+                  allowClear
+                    style="width: 170px"
+                    placeholder="请选择操作符"
+                    v-model:value="initConditionsData.operator"
+                  >
+                    <a-select-option
+                      v-for="operaItem in operatorList"
+                      :key="operaItem.operator"
+                      :value="operaItem.operator"
+                    >
+                      {{operaItem.label}}
+                    </a-select-option>
+                </a-select>
+              </a-space>
+
             </a-form-item>
             <a-form-item label="触发值" >
-              <a-input
-              allowClear
-                v-if="initConditionsData.operator !== 'BETWEEN'"
-                style="width: 170px;"
-                placeholder="请选择触发值"
-                v-model:value="initConditionsData.value"
-              ></a-input>
-              <a-input-group compact v-else >
-                <a-input allowClear placeholder="值1" v-model:value="initConditionsData.v1" style="width: 20%" />
-                <a-input  allowClear placeholder="值2" v-model:value="initConditionsData.v2" style="width: 30%" />
-              </a-input-group>
+              <a-space>
+                <a-input
+                  allowClear
+                    v-if="initConditionsData.operator !== 'BETWEEN'"
+                    style="width: 170px;"
+                    placeholder="请选择触发值"
+                    v-model:value="initConditionsData.value"
+                  ></a-input>
+                  <a-input-group compact v-else >
+                    <a-input allowClear placeholder="值1" v-model:value="initConditionsData.v1" style="width: 20%" />
+                    <a-input  allowClear placeholder="值2" v-model:value="initConditionsData.v2" style="width: 30%" />
+                  </a-input-group>
+                  <a-tooltip>
+                    <template #title>字符串类型的值必须增加 单引号,区间范围 使用示范,{1,100}</template>
+                    <question-circle-outlined />
+                  </a-tooltip>
+              </a-space>
             </a-form-item>
             </span>
             <span v-else-if="initConditionsData.conditionType === 'DEVICE_SESSION'" >
@@ -677,7 +686,7 @@
 import { FormItemProps } from '@/components/FormPro/index.vue'
 import { ModelAttrController, ModelCmdController, ModelController, RuleController } from '@/controller'
 import { computed, onMounted, reactive, ref, watch, getCurrentInstance } from 'vue'
-import { DownOutlined } from '@ant-design/icons-vue'
+import { DownOutlined, QuestionCircleOutlined } from '@ant-design/icons-vue'
 import SelectDevice from './components/selectDevice.vue'
 import { useId } from '@/hooks'
 import { Form } from 'ant-design-vue'
@@ -814,8 +823,15 @@ const warnSeverityList = [
   { key: 'EMERGENCY', name: '紧急' }
 ]
 
+// const operatorList = ['EQ', 'NE', 'GT', 'GE', 'LT', 'LE', 'BETWEEN']
 const operatorList = [
-  'EQ', 'NE', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'
+  { operator: 'EQ', label: '等于' },
+  { operator: 'NE', label: '不等于' },
+  { operator: 'GT', label: '大于' },
+  { operator: 'GE', label: '大于或等于' },
+  { operator: 'LT', label: '小于' },
+  { operator: 'LE', label: '小于或等于' },
+  { operator: 'BETWEEN', label: '两者之间' }
 ]
 
 const selectDeviceRef = ref('')