Bläddra i källkod

Merge branch 'master' into professional2

yanglzh 1 år sedan
förälder
incheckning
0ea0023693

+ 1 - 1
src/views/iot/device/instance/detail.vue

@@ -60,7 +60,7 @@
                   </div>
                 </div>
                 <div>
-                  <devantd :json="item.list" :antdid="item.key" v-if="item.type == 'int' || item.type == 'float' || item.type == 'string'" />
+                  <devantd :json="item.list" :antdid="item.key" v-if="item.type == 'int' || item.type == 'float' || item.type == 'string' || item.type == 'double'" />
                 </div>
               </div>
             </div>

+ 8 - 29
src/views/iot/scene/manage/component/actionParallelItem.vue

@@ -11,9 +11,9 @@
       <div class="product flex flex-warp">
         <el-form-item label="动作类型:" prop="actionType">
           <el-select v-model="item.actionType" filterable clearable placeholder="请选择动作类型" @change="saveData">
-            <el-option v-for="it in sourceActionTypeData" :key="it.key" :label="it.name" :value="it.key">
-              <span style="float: left">{{ it.name }}</span>
-              <span style="float: right; font-size: 13px">{{ it.key }}</span>
+            <el-option v-for="it in sence_action_type" :key="it.value" :label="it.label" :value="it.value">
+              <span style="float: left">{{ it.label }}</span>
+              <span style="float: right; font-size: 13px">{{ it.value }}</span>
             </el-option>
           </el-select>
         </el-form-item>
@@ -35,7 +35,7 @@
 </template>
 
 <script lang="ts" setup>
-import { PropType, ref,watch  } from 'vue'
+import { PropType, ref, watch, getCurrentInstance  } from 'vue'
 import { DocumentAdd, CircleClose } from '@element-plus/icons-vue';
 import DeviceOut from './actionType/deviceOut.vue';
 import SendNotice from './actionType/sendNotice.vue';
@@ -43,8 +43,10 @@ import CallWebService from './actionType/callWebService.vue';
 import TriggerAlarm from './actionType/triggerAlarm.vue';
 import DelayExecution from './actionType/delayExecution.vue';
 import TriggerCustomEvent from './actionType/triggerCustomEvent.vue';
-const deviceListData = ref<testIValueType[]>([]);
-const emit = defineEmits(['addScenesDetail','delData','saveData']);
+const emit = defineEmits(['addScenesDetail', 'delData', 'saveData']);
+
+const { proxy } = getCurrentInstance() as any;
+const { sence_action_type } = proxy.useDict('sence_action_type');
 
 interface IValueType {
   actionType?:string;
@@ -52,7 +54,6 @@ interface IValueType {
 interface testIValueType {
   key?: string;
   name?: string;
-
 }
 
 const props = defineProps({
@@ -68,28 +69,6 @@ const props = defineProps({
   index: {
     type: Number ,
     default: () => []
-  },
-  sourceActionTypeData: {
-    type: Array as PropType<testIValueType[]>,
-    default: () => [{
-      'key': 'deviceOutput',
-      'name': '设备输出',
-    }, {
-      'key': 'sendNotice',
-      'name': '发送通知',
-    }, {
-      'key': 'callWebService',
-      'name': '调用WEB服务',
-    }, {
-      'key': "triggerAlarm",
-      'name': '触发告警',
-    }, {
-      'key': 'delayExecution',
-      'name': '延迟执行',
-    }, {
-      'key': 'triggerCustomEvent',
-      'name': '触发场景自定义事件',
-    }]
   }
 })
 const parallelValue = ref(props.parallel);

+ 8 - 33
src/views/iot/scene/manage/component/actionSerialItem.vue

@@ -11,9 +11,9 @@
       <div class="product flex flex-warp">
         <el-form-item label="动作类型:" prop="actionType">
           <el-select v-model="item.actionType" filterable clearable placeholder="请选择动作类型" @change="saveData">
-            <el-option v-for="it in sourceActionTypeData" :key="it.key" :label="it.name" :value="it.key">
-              <span style="float: left">{{ it.name }}</span>
-              <span style="float: right; font-size: 13px">{{ it.key }}</span>
+            <el-option v-for="it in sence_action_type" :key="it.value" :label="it.label" :value="it.value">
+              <span style="float: left">{{ it.label }}</span>
+              <span style="float: right; font-size: 13px">{{ it.value }}</span>
             </el-option>
           </el-select>
         </el-form-item>
@@ -35,7 +35,7 @@
 </template>
 
 <script lang="ts" setup>
-import { PropType, ref,watch  } from 'vue'
+import { PropType, ref, watch, getCurrentInstance  } from 'vue'
 import { DocumentAdd, CircleClose } from '@element-plus/icons-vue';
 import DeviceOut from './actionType/deviceOut.vue';
 import SendNotice from './actionType/sendNotice.vue';
@@ -43,8 +43,10 @@ import CallWebService from './actionType/callWebService.vue';
 import TriggerAlarm from './actionType/triggerAlarm.vue';
 import DelayExecution from './actionType/delayExecution.vue';
 import TriggerCustomEvent from './actionType/triggerCustomEvent.vue';
-const deviceListData = ref<testIValueType[]>([]);
-const emit = defineEmits(['addScenesDetail','delData','saveData']);
+const emit = defineEmits(['addScenesDetail', 'delData', 'saveData']);
+
+const { proxy } = getCurrentInstance() as any;
+const { sence_action_type } = proxy.useDict('sence_action_type');
 
 interface IValueType {
   actionType?:string;
@@ -68,28 +70,6 @@ const props = defineProps({
   index: {
     type: Number ,
     default: () => []
-  },
-  sourceActionTypeData: {
-    type: Array as PropType<testIValueType[]>,
-    default: () => [{
-      'key': 'deviceOutput',
-      'name': '设备输出',
-    }, {
-      'key': 'sendNotice',
-      'name': '发送通知',
-    }, {
-      'key': 'callWebService',
-      'name': '调用WEB服务',
-    }, {
-      'key': "triggerAlarm",
-      'name': '触发告警',
-    }, {
-      'key': 'delayExecution',
-      'name': '延迟执行',
-    }, {
-      'key': 'triggerCustomEvent',
-      'name': '触发场景自定义事件',
-    }]
   }
 })
 const serialValue = ref(props.serial);
@@ -105,9 +85,6 @@ watch(() => props.serial, (newSerial) => {
   serialValue.value = newSerial;
 });
 
-
-
-
 const SetSaveData = (data:any) => {
   serialValue.value[data.index] = data.data;
   let newData={
@@ -130,8 +107,6 @@ const delScene = (index: number) => {
   emit('saveData',newData);
 }
 
-
-
 </script>
 <style scoped lang="scss">
 .type-item {

+ 15 - 16
src/views/iot/scene/manage/component/actionType/callWebService.vue

@@ -6,7 +6,7 @@
     </el-select>
   </el-form-item>
   <el-form-item label="编码:" prop="executeAction" class="form-item">
-    <el-select v-model="fromData.callWebService.encoding" filterable clearable placeholder="请选择触发类型"  @change="saveData">
+    <el-select v-model="fromData.callWebService.encoding" filterable clearable placeholder="请选择触发类型" @change="saveData">
       <el-option label="UTF-8" value="UTF-8" />
       <el-option label="GBK" value="GBK" />
     </el-select>
@@ -15,15 +15,16 @@
     <el-input v-model="fromData.callWebService.url" placeholder="请输入服务地址:" @input="saveData" />
   </el-form-item>
   <el-form-item label="设置请求头:" prop="executeAction" class="form-item">
-      <el-input v-model="fromData.callWebService.headers" type="textarea" @input="saveData" />
+    <el-input rows="4" v-model="fromData.callWebService.headers" placeholder='请输入合法的JSON字符串,如:{ "Accept":"application/json, text/plain, */*", "Authorization":"Bearer XXX" }' type="textarea" @blur="saveData" />
   </el-form-item>
-  <el-form-item label="参数编写:" prop="executeAction" class="form-item" style="margin-left: 30px;">
-      <el-input v-model="fromData.callWebService.parameter" type="textarea" @input="saveData" />
+  <el-form-item label="参数编写:" prop="executeAction" class="form-item" style="margin-left: 20px;">
+    <el-input rows="4" v-model="fromData.callWebService.parameter" type="textarea" placeholder='请输入合法的JSON字符串,如:{ "name":"张三", "age":22 }' @blur="saveData" />
   </el-form-item>
 </template>
 
 <script lang="ts" setup>
-import {  ref,onMounted } from 'vue'
+import { ElMessage } from 'element-plus';
+import { ref, onMounted } from 'vue'
 const emit = defineEmits(['SetSaveData']);
 
 const props = defineProps({
@@ -31,7 +32,7 @@ const props = defineProps({
     type: Object,
     default: () => { }
   },
-  index:{
+  index: {
     type: Number,
     default: () => 0
   },
@@ -43,25 +44,23 @@ const fromData = ref({
     method: "",
     template: "",
     headers: "",
-    encoding:"",
+    encoding: "",
     parameter: "",
   }
 })
 
-
 const saveData = () => {
-  let newdata={
-    index:props.index,
-    data:fromData.value,
+  let newdata = {
+    index: props.index,
+    data: fromData.value,
   }
-  emit('SetSaveData',newdata);
-
+  emit('SetSaveData', newdata);
 }
 
 onMounted(() => {
-    if (props.data && props.data.callWebService) {
-      fromData.value.callWebService = { ...props.data.callWebService }
-    }
+  if (props.data && props.data.callWebService) {
+    fromData.value.callWebService = { ...props.data.callWebService }
+  }
 });
 </script>
 <style scoped lang="scss">

+ 7 - 8
src/views/iot/scene/manage/component/condition.vue

@@ -4,7 +4,7 @@
 
       <div v-if="index > 0"><el-divider>或满足以下条件</el-divider></div>
       <div class="type-item">
-        <div class="conicon" style="width: 100%; text-align: right; position: relative; right: -15px; top: -5px; color: red" v-if="index > 0">
+        <div class="conicon" style="width: 100%; text-align: right; position: relative; right: -15px; top: -5px; color: red" v-if="condition.length > 1">
           <el-icon @click="delScene(index)">
             <CircleClose />
           </el-icon>
@@ -13,7 +13,6 @@
         <div class="flex-warp item_list">
 
           <div v-for="(vo, i) in item" :key="i">
-
             <div class="items">
               <el-button style="background: #fff; color: #000;border: 1px solid #d9cde3;margin-left: 10px;margin-right: 10px;" v-if="(i as number) > 0">并且</el-button>
 
@@ -49,16 +48,14 @@
 
               <el-popover placement="bottom" trigger="click">
                 <template #reference>
-                  <el-button style="background: #bc7dee1a; color: #692ca7;border: 1px solid #bc7dee80;">{{ vo.value ||
-                    '参数值' }}</el-button>
+                  <el-button style="background: #bc7dee1a; color: #692ca7;border: 1px solid #bc7dee80;">{{ vo.value || '参数值' }}</el-button>
                 </template>
                 <div class="popover-content">
-                  <el-input v-model="vo.value" placeholder="请输入参数值" @input="saveData" />
-
+                  <el-input v-model="vo.value" placeholder="请输入参数值" @blur="saveData" />
                 </div>
               </el-popover>
 
-              <el-icon size="16" v-if="(i as number) > 0" @click="DelSceneItem(i as number, index)" style="position: relative;top: -13px;">
+              <el-icon size="16" v-if="item.length > 1" @click="DelSceneItem(i as number, index)" style="position: relative;top: -13px;">
                 <CircleClose />
               </el-icon>
 
@@ -79,7 +76,7 @@
 
     </div>
 
-    <div class="mt15"><el-button @click="addScene()">增加条件</el-button></div>
+    <div class="mt15"><el-button @click="addScene()">增加条件</el-button></div>
 
   </div>
 </template>
@@ -149,9 +146,11 @@ const addScene = () => {
     'operator': '',
     'value': ''
   }]);
+  saveData();
 };
 const delScene = (index: number) => {
   props.condition.splice(index, 1);
+  saveData();
 }
 onMounted(() => {
   props.condition.forEach((item) => {

+ 37 - 66
src/views/iot/scene/manage/component/sceneItem.vue

@@ -1,8 +1,7 @@
 <template>
   <div class="type-item">
     <div v-for="(item, index) in sceneList" :key="index" class="item " :class="index > 0 ? 'biankang' : ''">
-      <div class="conicon" style="width: 100%; text-align: right; position: relative; right: -8px; top: -8px; color: red"
-        v-if="index > 0">
+      <div class="conicon" style="width: 100%; text-align: right; position: relative; right: -8px; top: -8px; color: red" v-if="index > 0">
         <el-icon @click="delScene(index)">
           <CircleClose />
         </el-icon>
@@ -12,8 +11,7 @@
       </div>
       <div class="product flex flex-warp">
         <el-form-item label="产品:" prop="productKey">
-          <el-select v-model="item.productKey" filterable clearable placeholder="请选择产品"
-            @change="seletChange(index, item.productKey!)">
+          <el-select v-model="item.productKey" filterable clearable placeholder="请选择产品" @change="seletChange(index, item.productKey!)">
             <el-option v-for="it in sourceData" :key="it.key" :label="it.name" :value="it.key">
               <span style="float: left">{{ it.name }}</span>
               <span style="float: right; font-size: 13px">{{ it.key }}</span>
@@ -29,16 +27,14 @@
           </el-select>
         </el-form-item>
         <el-form-item label="触发类型:" prop="triggerType">
-          <el-select v-model="item.triggerType" clearable filterable placeholder="请选择触发类型"
-            @change="getSelectcolumns(index, item.triggerType!)">
-            <el-option v-for="it in sourceTypeData" :key="it.key" :label="it.name" :value="it.key">
-              <span style="float: left">{{ it.name }}</span>
-              <span style="float: right; font-size: 13px">{{ it.key }}</span>
+          <el-select v-model="item.triggerType" clearable filterable placeholder="请选择触发类型" @change="getSelectcolumns(index, item.triggerType!)">
+            <el-option v-for="it in sence_source_type" :key="it.value" :label="it.label" :value="it.value">
+              <span style="float: left">{{ it.label }}</span>
+              <span style="float: right; font-size: 13px">{{ it.value }}</span>
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="定时请求"
-          v-if="item.triggerType && ['readAttribute', 'functionCall'].includes(item.triggerType)">
+        <el-form-item label="定时请求" v-if="item.triggerType && ['readAttribute', 'functionCall'].includes(item.triggerType)">
           <div style="display:flex">
             <el-input v-model="item.timer" placeholder="请输入cron表达式" />
             <el-dialog v-model="dialogVisible" title="选择Cron规则" width="60%">
@@ -50,10 +46,10 @@
         </el-form-item>
       </div>
       <div class="title flex">
-        <div class="icon"></div> 触发条件 <div class="ml10"> <el-switch v-model="item.triggerSwitch"   @change="EditPen(index)"/>
+        <div class="icon"></div> 触发条件 <div class="ml10"> <el-switch v-model="item.triggerSwitch" @change="EditPen(index)" />
         </div>
       </div>
-      <Condition :condition="item.condition" :operate_index="index" :columnList="columnList" v-if="item.triggerSwitch && columnList.length>0" @EditPen="EditPen">
+      <Condition :condition="item.condition" :operate_index="index" :columnList="columnList" v-if="item.triggerSwitch && columnList.length > 0" @EditPen="EditPen">
       </Condition>
     </div>
     <div>
@@ -75,7 +71,10 @@ import datahub from '/@/api/datahub';
 import Condition from './condition.vue';
 const { proxy } = getCurrentInstance() as any;
 const scene_type = proxy.useDict('scene_type');
-const emit = defineEmits(['addScenesDetail','delScenesDetail','editScenesDetail']);
+
+const { sence_source_type } = proxy.useDict('sence_source_type');
+
+const emit = defineEmits(['addScenesDetail', 'delScenesDetail', 'editScenesDetail']);
 const dialogVisible = ref();
 const deviceListData = ref<testIValueType[]>([]);
 const functionCallList = ref<testIValueType[]>([]);
@@ -109,40 +108,10 @@ const props = defineProps({
     type: String,
     default: () => '',
   },
-  sourceData:{
+  sourceData: {
     type: Array as PropType<testIValueType[]>,
     default: () => []
   },
-  sourceTypeData: {
-    type: Array as PropType<testIValueType[]>,
-    default: () => [{
-      'key': 'onLine',
-      'name': '设备上线',
-    }, {
-      'key': 'offLine',
-      'name': '设备离线',
-    }, 
-    
-    {
-      'key': 'readAttribute',
-      'name': '读取属性',
-    }, {
-      'key': 'modifyAttribute',
-      'name': '修改属性',
-    }, 
-    {
-      'key': 'reportAttribute',
-      'name': '属性上报',
-    }, {
-      'key': 'reportEvent',
-      'name': '事件上报',
-    },
-     {
-      'key': 'functionCall',
-      'name': '功能调用',
-    }
-  ]
-  }
 })
 
 const seletChange = (index: number, val: string) => {
@@ -168,11 +137,11 @@ const getDeviceList = (productKey: any) => {
     deviceListData.value = res.device || []
   })
 }
-const getSelectcolumns=(index: number, val: string) => {
+const getSelectcolumns = (index: number, val: string) => {
   EditPen(index);
-  getcolumns(index,val);
-    // 重置当前项的 condition 值
-    props.sceneList[index].condition = [[{
+  getcolumns(index, val);
+  // 重置当前项的 condition 值
+  props.sceneList[index].condition = [[{
     'parameter': '',
     'operator': '',
     'value': ''
@@ -217,7 +186,7 @@ const getcolumns = (index: number, val: string) => {
 }
 const getcolumnsList = (where: any) => {
   api.manage.getColumns(where).then((res: any) => {
-    if(res){
+    if (res) {
       columnList.value = res;
     }
   })
@@ -239,8 +208,8 @@ const addScene = () => {
   emit('addScenesDetail', 'definition');
 };
 
-const EditPen=(index: number)=>{
-  emit('editScenesDetail',index);
+const EditPen = (index: number) => {
+  emit('editScenesDetail', index);
 }
 const delScene = (index: number) => {
   emit('delScenesDetail', index);
@@ -260,20 +229,19 @@ const cronclose = () => {
   dialogVisible.value = false;
 }
 //初始化
-const intScenel=()=>{
-  let array_data=props.sceneList;
-  array_data.map((val:any,index) => {
-      if(val.productKey){
-          product_key = val.productKey;
-          let info = props.sourceData?.find((pro: { key: any; }) => pro.key === val.productKey);
-
-          if (info) {
-            getDeviceList(info.key)
-          }
+const intScenel = () => {
+  let array_data = props.sceneList;
+  array_data.map((val: any, index) => {
+    if (val.productKey) {
+      product_key = val.productKey;
+      let info = props.sourceData?.find((pro: { key: any; }) => pro.key === val.productKey);
+      if (info) {
+        getDeviceList(info.id)
       }
-      if(val.triggerType){
-        getcolumns(index,val.triggerType)
-      } 
+    }
+    if (val.triggerType) {
+      getcolumns(index, val.triggerType)
+    }
   });
 }
 intScenel();
@@ -300,13 +268,15 @@ intScenel();
   .item {
     padding: 10px;
   }
+
   .biankang {
     border: 1px solid #e8e2e2;
     border-radius: 10px;
     padding: 10px;
     margin-top: 10px;
   }
-    .title {
+
+  .title {
     height: 40px;
 
     .icon {
@@ -317,6 +287,7 @@ intScenel();
       background-color: #315efb;
     }
   }
+
   .product {
     .el-form-item {
       margin-left: 30px;

+ 7 - 2
src/views/iot/scene/manage/detail.vue

@@ -214,16 +214,21 @@ export default defineComponent({
 		const editScenesDetail = (index: number) => {
 			let saveData = state.sceneList[index];
 			let ids = originalSceneList.value[index].id;
+
+			// 如果触发条件关闭,则清空触发条件的数据
+			if (!saveData.triggerSwitch) {
+				saveData.condition = []
+			}
+
 			api.manage.editDetail({ id: ids, bodyjson: saveData }).then((res: any) => {
 				getOneDetail();
 			});
-
 		}
+
 		const addOrEdit = async (row?: any) => {
 			editFormRef.value.open(row);
 		};
 
-
 		onMounted(() => {
 			getDetail();
 		});

+ 2 - 2
src/views/system/config/component/editConfig.vue

@@ -9,8 +9,8 @@
           <el-input v-model="ruleForm.configKey" placeholder="请输入参数键名" />
         </el-form-item>
         <!-- 字典类型下拉框 -->
-        <el-form-item label="字典分类" prop="moduleClassify">
-          <el-select v-model="ruleForm.moduleClassify" placeholder="字典分类" clearable style="width: 240px">
+        <el-form-item label="参数分类" prop="moduleClassify">
+          <el-select v-model="ruleForm.moduleClassify" placeholder="参数分类" clearable style="width: 240px">
             <el-option v-for="dict in param_class_type" :label="dict.label" :value="dict.value" />
           </el-select>
         </el-form-item>