Bläddra i källkod

修改从scd一致性校验进入新增修改弹窗,点击没有反应的问题,以及输入输出控制块的数据展示错误问题,装置关联关系的点击未完成

“yueshang” 1 år sedan
förälder
incheckning
80982ea317

+ 2 - 1
src/pages/netStructPicture/components/dialogIndex.vue

@@ -40,7 +40,7 @@
         }">
           <!-- isPhoto是输入输出控制块的, -->
           <component :is="activeNavName" :checkData="checkData" :isOpen="isOpen" :iedRelation="iedRelation"
-            @result="result" :isPhoto="isPhoto" :delScdId="delScdId"></component>
+            @result="result" :isPhoto="isPhoto" :delScdId="delScdId" :isScdView="isScdView"></component>
         </div>
       </div>
     </div>
@@ -218,6 +218,7 @@ const isPhoto = ref("photo");
 const clickInoutNav = (item, index) => {
   isPhoto.value = item.code;
   inoutItemNavIndex.value = index;
+  
 };
 </script>
 <style scoped lang="scss">

+ 48 - 22
src/pages/netStructPicture/components/inoutControl.vue

@@ -48,7 +48,7 @@
             class="midlestyle"
             v-for="(item, index) in svInfo"
             :key="index"
-            :class="{ 'smv-color': item.attr_name == 'smvcb0' }"
+            :class="{ 'smv-color': item.attr_name == 'smvcb0','smv-color':item.isred }"
             :ref="(el) => setdomMiddle2(el, item)"
           >
             <div>{{ `${item.ldinst}/${item.attr_name}` }}</div>
@@ -103,6 +103,7 @@
         :isPhoto="isPhoto"
         :checkData="checkData"
         :svInfo="svInfo"
+        :delScdId="delScdId"
       ></inoutSendOrRv>
     </div>
     <inoutDialog
@@ -153,10 +154,14 @@ const props = defineProps({
     type: Object,
     default: () => {},
   },
-  delScdId:{
-    type:String,
-    default: '',
-  }
+  delScdId: {
+    type: String,
+    default: "",
+  },
+  isScdView: {
+    type: Boolean,
+    default: false,
+  },
 });
 const svInfo = ref(null);
 
@@ -169,7 +174,7 @@ const getIedChild = async () => {
     ied_name: props.checkData.ied_name,
     forcerefresh: 0,
   });
-  if(!childRes.data||!listData2.value.list) return;
+  if (!childRes.data || !listData2.value.list) return;
   if (childRes.data) {
     //左右侧内部侧数据组装
     listData2.value.list.forEach((item, index) => {
@@ -192,7 +197,6 @@ const getIedChild = async () => {
               itemKey.ld_inst == key.ld_inst &&
               itemKey.ld_desc == key.ld_desc
             ) {
-              itemKey.childItem = [];
               itemKey.childItem.push(key);
             }
           });
@@ -207,12 +211,13 @@ const getIedChild = async () => {
 const getNetworkInfo = async () => {
   const svResInfo = await iednetworkInfo({
     scd_id: scdIdValue,
-    ied_name: props.checkData.ied_name,
+    ied_name: listData2.value.ied_name,
   });
   const svResInfoCtrl = await iedSVSendCtrlblock({
     scd_id: scdIdValue,
-    ied_name: props.checkData.ied_name,
+    ied_name: listData2.value.ied_name
   });
+  if(!svResInfoCtrl.data ||!svResInfo.data) return;
   if (svResInfoCtrl.data && svResInfoCtrl.data.GSEControl) {
     //处理数据得到APPID
     svResInfo.data.forEach((item) => {
@@ -222,10 +227,16 @@ const getNetworkInfo = async () => {
         }
       });
     });
-    svInfo.value = [
+    if(svResInfoCtrl.data.SampledValueControl){
+      svResInfoCtrl.data.SampledValueControl.forEach(item=>item.isred = true)
+      svInfo.value = [
       ...svResInfoCtrl.data.SampledValueControl,
       ...svResInfoCtrl.data.GSEControl,
     ];
+    }else{
+      svInfo.value = svResInfoCtrl.data.GSEControl
+    }
+
     if (svInfo.value && svInfo.value.length > 3) {
       middleElement.value.style.marginTop = "20px";
     } else {
@@ -284,7 +295,7 @@ const setdomRight2Child2 = (el, item) => {
 const processArray = (arr) => {
   // ref_ied_id作为键,obj作为值
   const uniqueObjects = new Map();
-  if(!arr) return;
+  if (!arr) return;
   // 遍历数组
   for (const obj of arr) {
     const { ref_ied_id } = obj;
@@ -301,14 +312,23 @@ const processArray = (arr) => {
   return Array.from(uniqueObjects.values());
 };
 //点击图片的时候筛选出数据
-const clickImg = (dataItem) => {
-  
-  Object.values(props.iedRelation).find((item) => {
-    if (item.ied_name == dataItem.ref_ied_name) {
-      listData2.value = item;
-    }
-  });
-  console.log('props.iedRelation1', props.iedRelation)
+const clickImg = async (dataItem) => {
+  if (!props.isScdView) {
+    Object.values(props.iedRelation).find((item) => {
+      if (item.ied_name == dataItem.ref_ied_name) {
+        listData2.value = item;
+      }
+    });
+  } else {
+    //如果是从scdView进来点到直接调用接口
+    const resRla = await scdIedRelation({
+      scd_id: scdIdValue,
+      ied_name: dataItem.ref_ied_name,
+      reset: 1,
+    });
+    if (!resRla.data) return;
+    listData2.value = resRla.data[dataItem.ref_ied_name];
+  }
 };
 
 //点击后重置数据和线条
@@ -325,7 +345,7 @@ const clickResetLine2 = () => {
 // 将设备列表分成两份
 const bothSide = (data) => {
   const formatArr = processArray(data);
-  if(!formatArr) return;
+  if (!formatArr) return;
   const arrlenght = formatArr.length;
   const long1 = Math.ceil(arrlenght / 2);
   leftList.value = formatArr.splice(0, long1);
@@ -695,7 +715,7 @@ const removeLine2 = () => {
     });
   }
 };
-let scdIdValue = '';
+let scdIdValue = "";
 onMounted(() => {
   if (props.delScdId) {
     scdIdValue = props.delScdId;
@@ -756,6 +776,7 @@ watch(
       svInfo.value = [];
       listData2.value = newValue;
       if (tabValue.value == "photo") {
+        removeLine2();
         getIedChild();
         getNetworkInfo();
         clickResetLine2();
@@ -764,7 +785,12 @@ watch(
     }
   }
 );
-
+//是否是从SCD文件一致性校核进入的该界面
+// watch(()=>props.isScdView,(newValue)=>{
+//   if(newValue){
+//     getIedChild()
+//   }
+// })
 watch(
   () => props.isOpen,
   (newValue) => {

+ 13 - 2
src/pages/netStructPicture/components/inoutSendOrRv.vue

@@ -212,6 +212,8 @@ import {
   gooseSendfcdalist,
   gooseReceivefcdalist,
 } from "@/api/iedNetwork";
+import { useRoute } from "vue-router";
+const route = useRoute();
 const props = defineProps({
   checkData: {
     type: Object,
@@ -225,8 +227,12 @@ const props = defineProps({
     type: Array,
     default: [],
   },
+  delScdId: {
+    type: String,
+    default: "",
+  },
 });
-const scdIdValue = inject("scdId");
+let scdIdValue = "";
 const myTable = ref(null);
 const myTable2 = ref(null);
 const myTable3 = ref(null);
@@ -310,7 +316,7 @@ const getGooseReList = async () => {
     scd_id: scdIdValue,
     ied_name: props.checkData.ied_name,
   });
-  if(!gooseRes.data) return;
+  if (!gooseRes.data) return;
   if (gooseRes.data && gooseRes.data.length > 0) {
     //上面表格的数据
     gooseRes.data.forEach((item) => {
@@ -394,6 +400,11 @@ watch(
   }
 );
 onMounted(() => {
+  if (props.delScdId) {
+    scdIdValue = props.delScdId;
+  } else {
+    scdIdValue = route.query.id;
+  }
   getSvSendCtrl();
   smvCtrlblockRe();
   getGooseReList();

+ 84 - 46
src/pages/netStructPicture/components/virtualRelation.vue

@@ -4,7 +4,12 @@
     <!-- 关联图 -->
     <div class="main-cont" id="treedom3">
       <div class="main-left">
-        <div v-for="(item, index) in leftList" :key="index" class="conts" @click="clickImg(item)">
+        <div
+          v-for="(item, index) in leftList"
+          :key="index"
+          class="conts"
+          @click="clickImg(item)"
+        >
           <div class="cont-title">
             <img :src="devicePng" alt="" class="img-item" />
             <div class="cont-item">
@@ -12,11 +17,15 @@
               <div>{{ item.ref_ied_name }}</div>
             </div>
           </div>
-          <div v-for="(cItem, index2) in item.titleItems" :key="index2" :ref="(el) => setdomLeftChild3(el, cItem)">
+          <div
+            v-for="(cItem, index2) in item.titleItems"
+            :key="index2"
+            :ref="(el) => setdomLeftChild3(el, cItem)"
+          >
             <div class="text-midle">
               <div>
                 {{
-                  `${cItem.attr_ld_inst}/${cItem.attr_prefix}${cItem.attr_ln_class}.${cItem.attr_do_name}.${cItem.attr_da_name}`
+                  `${cItem.attr_ld_inst}/${cItem.attr_prefix}${cItem.attr_ln_class}${cItem.attr_ln_inst}.${cItem.attr_do_name}.${cItem.attr_da_name}`
                 }}
               </div>
               <div>{{ cItem.do_source_desc }}</div>
@@ -34,18 +43,28 @@
           </div>
         </div>
         <div class="middle-item">
-          <div class="midle-cont" v-for="(item, index) in svInfo" :key="index" :ref="(el) => setdomMiddle3(el, item)">
+          <div
+            class="midle-cont"
+            v-for="(item, index) in svInfo"
+            :key="index"
+            :ref="(el) => setdomMiddle3(el, item)"
+          >
             <div style="margin: 0 4px" v-if="!item.isDecollate">
               {{ item.no }}
             </div>
             <div class="midlestyle" v-if="!item.isDecollate">
-              <div v-if="item.attr_da_name == 'in'">
+              <div v-if="item.inout_type == 'out'">
                 {{
-                  `${item.attr_ld_inst}/${item.attr_ln_class}${item.attr_ln_inst}.${item.attr_do_name}.${item.attr_da_name}`
+                  `${item.attr_ld_inst}/${item.attr_prefix}/${item.attr_ln_class}${item.attr_ln_inst}.${item.attr_do_name}.${item.attr_da_name}`
                 }}
               </div>
-              <div v-else>{{ item.attr_int_addr }}</div>
-              <div>{{ item.do_source_desc }}</div>
+              <div v-else-if="item.inout_type == 'in'">{{ item.attr_int_addr }}</div>
+              <div v-if="item.inout_type == 'out'">
+                  {{ item.do_source_desc }}
+                </div>
+                <div v-else-if="item.inout_type == 'in'">
+                  {{ item.do_target_desc }}
+                </div>
             </div>
             <div class="midlestyle omit" v-if="item.isDecollate">
               {{ item.do_source_desc }}
@@ -55,7 +74,12 @@
       </div>
       <!-- 右侧 -->
       <div class="main-right">
-        <div v-for="(item, index) in rightList" :key="index" class="conts" @click="clickImg(item)">
+        <div
+          v-for="(item, index) in rightList"
+          :key="index"
+          class="conts"
+          @click="clickImg(item)"
+        >
           <div class="cont-title">
             <img :src="devicePng" alt="" class="img-item" />
             <div class="cont-item">
@@ -63,7 +87,11 @@
               <div>{{ item.ref_ied_name }}</div>
             </div>
           </div>
-          <div v-for="(cItem, index2) in item.titleItems" :key="index2" :ref="(el) => setdomRightChild3(el, cItem)">
+          <div
+            v-for="(cItem, index2) in item.titleItems"
+            :key="index2"
+            :ref="(el) => setdomRightChild3(el, cItem)"
+          >
             <div class="text-midle">
               <div>{{ `${cItem.attr_int_addr}` }}</div>
               <div>{{ cItem.do_target_desc }}</div>
@@ -83,13 +111,14 @@ import AnimEvent from "../../../../public/anim-event.min.js";
 import {
   //虚短子关系
   getMiddleinputs,
+  scdIedRelation,
 } from "@/api/iedNetwork";
 import { useRoute } from "vue-router";
 const route = useRoute();
 const props = defineProps({
   checkData: {
     type: Object,
-    default: () => { },
+    default: () => {},
   },
   isOpen: {
     type: Boolean,
@@ -97,16 +126,21 @@ const props = defineProps({
   },
   iedRelation: {
     type: Object,
-    default: () => { },
+    default: () => {},
   },
   delScdId: {
     type: String,
     default: "",
-  }
+  },
+  isScdView: {
+    type: Boolean,
+    default: false,
+  },
 });
 const svInfo = ref(null);
 //处理两边的数据
 const processBoth = (list, svResInfo, inoutType) => {
+  console.log('svResInfo.data', svResInfo.data)
   if (!list||!svResInfo.data) return;
   list.forEach((item, index) => {
     item.titleItems = [];
@@ -124,6 +158,7 @@ const processBoth = (list, svResInfo, inoutType) => {
       }
     });
   });
+  // console.log('listaaaaaaaaa', list)
 };
 let leaderLines3 = ref([]); //控制线条显示
 const leftList = ref([]);
@@ -154,11 +189,11 @@ const setdomRightChild3 = (el, item) => {
 
 let tagList = ref(null); //左侧更改的设备列表
 //得到中间的子版块数据
-const getNetworkInfo3 = async () => {
+const getNetworkInfo3 = async (names) => {
   let svResInfo;
   svResInfo = await getMiddleinputs({
     scd_id: scdIdValue,
-    ied_name: props.checkData.ied_name,
+    ied_name: names,
   });
   const data = {
     attr_ld_inst: "",
@@ -171,6 +206,7 @@ const getNetworkInfo3 = async () => {
     isDecollate: true,
   };
   //处理两边的数据
+  console.log('leftList.value2222', leftList.value,rightList.value)
   if (svResInfo.data.length > 0) {
     processBoth(leftList.value, svResInfo, "in");
     processBoth(rightList.value, svResInfo, "out");
@@ -190,32 +226,32 @@ const getNetworkInfo3 = async () => {
 
   svInfo.value = newData;
 };
-const processArray = (arr) => {
-  // ref_ied_id作为键,obj作为值
-  const uniqueObjects = new Map();
-  if(!arr) return;
-  // 遍历数组
-  for (const obj of arr) {
-    const { ref_ied_id } = obj;
-    // 如果当前对象的 ref_ied_id 属性已经存在于 uniqueObjects 中
-    if (uniqueObjects.has(ref_ied_id)) {
-      // 将对应对象的 ref_type 属性设为 2,箭头双向
-      uniqueObjects.get(ref_ied_id).ref_type = 2;
-    } else {
-      // 否则,将当前对象添加到 uniqueObjects 中
-      uniqueObjects.set(ref_ied_id, obj);
-    }
-  }
-  // 将 uniqueObjects 中的值转为数组并返回
-  return Array.from(uniqueObjects.values());
-};
 //点击图片的时候筛选出数据
-const clickImg = (dataItem) => {
-  Object.values(props.iedRelation).find((item) => {
-    if (item.ied_name == dataItem.ref_ied_name) {
-      listData3.value = item;
-    }
-  });
+const clickImg = async (dataItem) => {
+  if (!props.isScdView) {
+    Object.values(props.iedRelation).find((item) => {
+      if (item.ied_name == dataItem.ref_ied_name) {
+        listData3.value = item;
+      }
+    });
+  } else {
+    console.log('dataItem', dataItem)
+    // listData3.value.ied_name = dataItem.ref_ied_name;
+    // listData3.value.ied_desc = dataItem.ref_ied_desc;
+        //如果是从scdView进来点到直接调用接口
+        const resRla = await scdIedRelation({
+      scd_id: scdIdValue,
+      ied_name: dataItem.ref_ied_name,
+      reset: 1,
+    });
+    if (!resRla.data) return;
+    listData3.value = resRla.data[dataItem.ref_ied_name];
+    getNetworkInfo3(dataItem.ref_ied_name)
+    // const ResInput = await getMiddleinputs({
+    //   ied_name: dataItem.ref_ied_name,
+    //   scd_id: scdIdValue,
+    // });
+  }
 };
 
 //点击后重置数据和线条
@@ -232,7 +268,8 @@ const clickResetLine3 = () => {
 const bothSide = (data) => {
   leftList.value = [];
   rightList.value = [];
-  if(!data) return;
+  console.log('data=------------', data)
+  if (!data) return;
   data.forEach((item) => {
     if (item.ref_type == 2 || item.ref_type == 1) {
       item.titleItems = [];
@@ -325,8 +362,9 @@ const hiddenLine = () => {
   elmWrapper.style.transform = "none";
   var rectWrapper = elmWrapper.getBoundingClientRect();
   // Move to the origin of coordinates as the document
-  elmWrapper.style.transform = `translate(${(rectWrapper.left + window.scrollY) * -1
-    }px, ${(rectWrapper.top + window.scrollX) * -1}px)`;
+  elmWrapper.style.transform = `translate(${
+    (rectWrapper.left + window.scrollY) * -1
+  }px, ${(rectWrapper.top + window.scrollX) * -1}px)`;
 };
 const setLine = () => {
   if (listData3.value) {
@@ -354,9 +392,8 @@ onMounted(() => {
   } else {
     scdIdValue = route.query.id;
   }
-
   if (props.checkData != null) {
-    getNetworkInfo3();
+    getNetworkInfo3(listData3.value.ied_name);
   }
   //不加条件切换下方tab时会出现bug
   nextTick(() => {
@@ -369,8 +406,9 @@ watch(
     listData3.value = [];
     svInfo.value = [];
     listData3.value = newValue;
+    console.log('newValue======', newValue)
     if (newValue != null) {
-      getNetworkInfo3();
+      getNetworkInfo3(listData3.value.ied_name);
     }
     clickResetLine3();
     emit("result", newValue);