|
@@ -188,6 +188,7 @@
|
|
|
<el-tree
|
|
|
:props="anyProps"
|
|
|
:data="anyData"
|
|
|
+ v-loading="treeLoading"
|
|
|
@node-click="handleCheckChange"
|
|
|
node-key="id"
|
|
|
highlight-current
|
|
@@ -272,14 +273,14 @@
|
|
|
>
|
|
|
</div> -->
|
|
|
<div class="choose-base" @click="checkTime">追加装置</div>
|
|
|
- <div class="choose-base" @click="setIedExtrefNo">端子编号</div>
|
|
|
+ <div class="choose-base" @click="setIedExtrefNo">支路编号</div>
|
|
|
<!-- <div style="margin: 5px">
|
|
|
<el-button
|
|
|
type="primary"
|
|
|
size="small"
|
|
|
plain
|
|
|
@click="setIedExtrefNo"
|
|
|
- >端子编号</el-button
|
|
|
+ >支路编号</el-button
|
|
|
>
|
|
|
</div> -->
|
|
|
</div>
|
|
@@ -309,12 +310,11 @@
|
|
|
</div>
|
|
|
<div v-if="successScd">
|
|
|
<el-button class="backs cancel-add" @click="backMent">返回</el-button>
|
|
|
- <el-button style="width: 100px; height: 30px" @click="aginParseArea"
|
|
|
+ <el-button style="width: 100px; height: 30px;" @click="aginParseArea"
|
|
|
>重新解析</el-button
|
|
|
>
|
|
|
- <el-button class="sure-add" type="primary" @click="iedSave"
|
|
|
- >保存</el-button
|
|
|
- >
|
|
|
+ <el-button class="backs cancel-add" @click="PointsMapping">端子匹配管理</el-button>
|
|
|
+ <el-button class="sure-add" type="primary" @click="iedSave">保存</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
<!-- 模态框组件 -->
|
|
@@ -344,6 +344,7 @@
|
|
|
v-if="iedModal"
|
|
|
:iedModal="iedModal"
|
|
|
:loadScdId="loadScdId"
|
|
|
+ :iedTypes="areaIedTypes"
|
|
|
@iedBack="iedBack"
|
|
|
@iedArrBack="iedArrBack"
|
|
|
>
|
|
@@ -415,6 +416,141 @@
|
|
|
</span>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
+ <el-dialog v-model="openIntervalPointsMapping"
|
|
|
+ width="70vw"
|
|
|
+ style="height: 740px"
|
|
|
+ append-to-body
|
|
|
+ draggable>
|
|
|
+ <template #header>
|
|
|
+ <div class="my-header">
|
|
|
+ <div class="title">间隔端子映射管理</div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <el-form>
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :xs="24" :sm="12" :md="8" :lg="6">
|
|
|
+ <el-form-item label="接收装置:" col=4>
|
|
|
+ <el-select
|
|
|
+ v-model="rev_ied_name"
|
|
|
+ placeholder="请选择"
|
|
|
+ clearable
|
|
|
+ style="width: 200px"
|
|
|
+ @change="revIedChange"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in mx"
|
|
|
+ :key="dict.ied_name"
|
|
|
+ :label="dict.attr_desc"
|
|
|
+ :value="dict.ied_name"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="8" :lg="6">
|
|
|
+ <el-form-item label="输入装置:" col=4>
|
|
|
+ <el-select
|
|
|
+ v-model="in_ied_name"
|
|
|
+ placeholder="请选择"
|
|
|
+ clearable
|
|
|
+ style="width: 200px"
|
|
|
+ @change="inIedChange"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in mx"
|
|
|
+ :key="dict.ied_name"
|
|
|
+ :label="dict.attr_desc"
|
|
|
+ :value="dict.ied_name"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12" :md="8" :lg="6">
|
|
|
+ <el-button @click="newPointsMapping" class="cancel-add">新增端子</el-button>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ <el-table :data="pingotstableData" v-loading="loadPpingotstableData" style="width: 100%;height: calc(100vh - 420px);text-align: center;">
|
|
|
+ <el-table-column label="序号" width="60" header-align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ scope.$index + 1 }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="信号接收装置" header-align="center">
|
|
|
+ <el-table-column prop="ied_name" label="装置名称" header-align="center" width="100">
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="attr_desc" label="装置描述" header-align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span v-if="scope.row.flag!='new'">{{ getIedDesc(scope.row.ied_name) }}</span>
|
|
|
+ <el-select v-else
|
|
|
+ v-model="scope.row.attr_desc"
|
|
|
+ placeholder="请选择"
|
|
|
+ @change="newMappingIedSelected"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in mx"
|
|
|
+ :key="dict.ied_name"
|
|
|
+ :label="dict.attr_desc"
|
|
|
+ :value="dict.ied_name"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="doi_desc" label="端子名称" header-align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input v-model="scope.row.doi_desc"/>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="" header-align="center" width="50"><-</el-table-column>
|
|
|
+ <el-table-column label="信号输入装置" header-align="center">
|
|
|
+ <el-table-column prop="in_ied_name" label="名称" header-align="center" width="100"/>
|
|
|
+ <el-table-column prop="in_ied_desc" label="描述" header-align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span v-if="scope.row.flag!='new'">{{ getIedDesc(scope.row.in_ied_name) }}</span>
|
|
|
+ <el-select v-else
|
|
|
+ v-model="scope.row.in_ied_desc"
|
|
|
+ placeholder="请选择"
|
|
|
+ @change="newMappingInIedSelected"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="dict in mx"
|
|
|
+ :key="dict.ied_name"
|
|
|
+ :label="dict.attr_desc"
|
|
|
+ :value="dict.ied_name"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="in_doi_desc" label="端子名称" header-align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input v-model="scope.row.in_doi_desc"/>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column fixed="right" label="操作" width="100" header-align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <!-- <el-popconfirm title="确认删除吗?" @confirm="firmSure">
|
|
|
+ <template #reference> -->
|
|
|
+ <el-button link type="primary" size="small" style="color: red;"
|
|
|
+ @click="delPointsMapping(scope.row)">删除</el-button>
|
|
|
+ <!-- </template>
|
|
|
+ </el-popconfirm> -->
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <template #footer>
|
|
|
+ <span
|
|
|
+ class="dialog-footer"
|
|
|
+ style="display: flex; justify-content: center"
|
|
|
+ >
|
|
|
+ <el-button type="primary" class="sure-add" @click="savePointsMapping">
|
|
|
+ 保存
|
|
|
+ </el-button>
|
|
|
+ <el-button @click="cancelClick" class="cancel-add">取消</el-button>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -434,6 +570,7 @@ import report from "@/api/report";
|
|
|
import scd from "@/api/scd";
|
|
|
import task from "@/api/task";
|
|
|
import cid from "@/api/cid/cid";
|
|
|
+import {fcdaList,doiMappingSave,doiMappingList} from "@/api/iedNetwork";
|
|
|
import LookScd from "../modalComp/LookScd.vue";
|
|
|
import ModelTree from "../modalComp/ModelTree.vue";
|
|
|
import FlashCreate from "../modalComp/FlashCreate.vue";
|
|
@@ -465,6 +602,13 @@ const props = defineProps({
|
|
|
});
|
|
|
let selects = props.btnSelect;
|
|
|
let arrList = props.taskList;
|
|
|
+let treeLoading = ref(true);
|
|
|
+const openIntervalPointsMapping = ref(false);
|
|
|
+const pingotstableData=ref([]);
|
|
|
+const loadPpingotstableData=ref(true)
|
|
|
+const rev_ied_name = ref('');
|
|
|
+const in_ied_name = ref('');
|
|
|
+let pointsDataAll=[];
|
|
|
let newMission = ref({
|
|
|
misName: "",
|
|
|
misNum: "",
|
|
@@ -524,6 +668,7 @@ let textIs = ref(false);
|
|
|
let filterLength = ref(0); //装置筛选有无attr_desc属性时的数组长度
|
|
|
let editTask_models = ref([]); //编辑任务时的原模型列表。保存时需要与选择的模型进行差异对比
|
|
|
const spaceInterval = ref([]); //所属间隔的数据
|
|
|
+let areaIedTypes = ref('');
|
|
|
watch(
|
|
|
() => props.editRow,
|
|
|
(newVal) => {
|
|
@@ -592,11 +737,23 @@ const reload = () => {
|
|
|
}
|
|
|
};
|
|
|
const modelId = ref(null);
|
|
|
-const areaType = ref("");
|
|
|
+const isSaveing = ref(false);
|
|
|
+let iedMaps={};
|
|
|
+const getIedDesc =(iedname)=>{
|
|
|
+ var v = iedMaps[iedname];
|
|
|
+ if(v==null){
|
|
|
+ var x1 = mx.value.filter((item)=>item.ied_name==iedname);
|
|
|
+ v=x1[0].attr_desc;
|
|
|
+ iedMaps[iedname] = v;
|
|
|
+ }
|
|
|
+ return v;
|
|
|
+}
|
|
|
const loadAreaInfo = (scdid) => {
|
|
|
mx.value = [];
|
|
|
+ treeLoading.value = true;
|
|
|
scd.getLoadScd({ scd_id: scdid }).then((res) => {
|
|
|
iedLoading.value = false;
|
|
|
+ treeLoading.value = false;
|
|
|
if (res.code == 0) {
|
|
|
successScd.value = true;
|
|
|
anyData.value = [];
|
|
@@ -776,10 +933,10 @@ const nowUpload = (e) => {
|
|
|
};
|
|
|
//树形组件
|
|
|
const handleCheckChange = (e) => {
|
|
|
- console.log("e====", e);
|
|
|
jg.value = e.area_name;
|
|
|
loadAreaId.value = e.area_id;
|
|
|
flashLevel.value = e.model_name.split("]")[1];
|
|
|
+ areaIedTypes.value = e.ied_types;
|
|
|
//优先从间隔结果中查找其ied装置列表,如果没找到,则尝试调用接口获取
|
|
|
let areaInfo = anyData.value.filter((r) => {
|
|
|
return r.area_id == e.area_id;
|
|
@@ -876,7 +1033,6 @@ const iedSave = () => {
|
|
|
});
|
|
|
};
|
|
|
const tagClose = (row, num) => {
|
|
|
- console.log("row", row, num);
|
|
|
ElMessageBox.confirm(
|
|
|
"确认从该间隔移除当前装置" + row.ied_name + "吗?",
|
|
|
"删除装置"
|
|
@@ -896,6 +1052,133 @@ const tagClick = (row, num) => {
|
|
|
// 将当前点击的对象的 isChoose 属性设置为 true
|
|
|
row.isChoose = true;
|
|
|
};
|
|
|
+const revIedChange=(item)=>{
|
|
|
+ if(item==''){
|
|
|
+ if(in_ied_name.value=='') pingotstableData.value = pointsDataAll;
|
|
|
+ else inIedChange(in_ied_name.value)
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var newLst = pointsDataAll.filter((ele) => (in_ied_name.value==''||ele.in_ied_name==in_ied_name.value) && ele.ied_name==item);
|
|
|
+ pingotstableData.value = newLst;
|
|
|
+}
|
|
|
+const inIedChange=(item)=>{
|
|
|
+ if(item==''){
|
|
|
+ if(rev_ied_name.value=='') pingotstableData.value = pointsDataAll;
|
|
|
+ else revIedChange(rev_ied_name.value);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var newLst = pointsDataAll.filter((ele) => (rev_ied_name.value==''||ele.ied_name==rev_ied_name.value) && ele.in_ied_name==item);
|
|
|
+ pingotstableData.value = newLst;
|
|
|
+}
|
|
|
+//打开端子匹配管理
|
|
|
+const PointsMapping= async ()=>{
|
|
|
+ if(loadAreaId.value==''){
|
|
|
+ ElMessage({
|
|
|
+ type: "info",
|
|
|
+ message: "请先选择一个间隔!",
|
|
|
+ duration: 3000,
|
|
|
+ })
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ loadPpingotstableData.value = true;
|
|
|
+ openIntervalPointsMapping.value=true;
|
|
|
+ rev_ied_name.value='';
|
|
|
+ in_ied_name.value='';
|
|
|
+ var tmp =[];
|
|
|
+ var iedNames = mx.value.map((item) => item.ied_name).join(",");
|
|
|
+ mx.value.forEach(async (item) => {
|
|
|
+ let data=null;
|
|
|
+ data = await doiMappingList({station_id:0,area_id:loadAreaId.value * 1,ied_name:item.ied_name});
|
|
|
+ if(data==null || data.data==null){
|
|
|
+ data = await fcdaList({
|
|
|
+ scd_id: loadScdId.value*1,
|
|
|
+ area_ids: null,
|
|
|
+ ied_name: item.ied_name,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (data && data.data){
|
|
|
+ var t1 = data.data;
|
|
|
+ tmp = tmp.concat(t1.filter((item) => iedNames.indexOf(item.in_ied_name)>-1));
|
|
|
+ pingotstableData.value = tmp;
|
|
|
+ pointsDataAll = tmp;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ loadPpingotstableData.value = false;
|
|
|
+}
|
|
|
+const newPointsMapping=()=>{
|
|
|
+ rev_ied_name.value='';
|
|
|
+ in_ied_name.value='';
|
|
|
+ pingotstableData.value = pointsDataAll;
|
|
|
+ var info={
|
|
|
+ flag:'new',attr_desc: "",attr_name: "",doi_desc: "",ied_name: "",in_doi_desc: "",in_ied_desc: "",in_ied_name: "",
|
|
|
+ }
|
|
|
+ var t = pingotstableData.value
|
|
|
+ t.unshift(info);
|
|
|
+ pingotstableData.value = t;
|
|
|
+}
|
|
|
+//保存端子配置
|
|
|
+const savePointsMapping= async()=>{
|
|
|
+ if(isSaveing.value){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ isSaveing.value=true
|
|
|
+ let msg = ElMessage({
|
|
|
+ type: "success",
|
|
|
+ message: '正在保存数据中...',
|
|
|
+ duration: 0,
|
|
|
+ });
|
|
|
+ var datalist = JSON.stringify(pointsDataAll);
|
|
|
+ var data = await doiMappingSave({station_id:0,area_id:loadAreaId.value * 1,datalist:datalist});
|
|
|
+ msg.close();
|
|
|
+ isSaveing.value = false;
|
|
|
+ if(data.code!=0){
|
|
|
+ ElMessage({
|
|
|
+ type: "error",
|
|
|
+ message: data.msg,
|
|
|
+ duration: 3000,
|
|
|
+ });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ElMessage({
|
|
|
+ type: "success",
|
|
|
+ message: '保存成功!',
|
|
|
+ duration: 3000,
|
|
|
+ });
|
|
|
+ openIntervalPointsMapping.value = false;
|
|
|
+}
|
|
|
+const delPointsMapping=(row)=>{
|
|
|
+ var tmp = pingotstableData.value;
|
|
|
+ var delInd = -1;
|
|
|
+ for(var i=0;i<tmp.length;i++){
|
|
|
+ var ele = tmp[i];
|
|
|
+ if(ele.in_ied_name==row.in_ied_name && ele.doi_desc==row.doi_desc && ele.in_doi_desc==row.in_doi_desc && ele.attr_name==row.attr_name){
|
|
|
+ delInd = i;
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(delInd>-1) {
|
|
|
+ tmp.splice(delInd,1);
|
|
|
+ pingotstableData.value = tmp;
|
|
|
+ }
|
|
|
+ delInd = -1;
|
|
|
+ for(var i=0;i<pointsDataAll.length;i++){
|
|
|
+ var ele = pointsDataAll[i];
|
|
|
+ if(ele.in_ied_name==row.in_ied_name && ele.doi_desc==row.doi_desc && ele.in_doi_desc==row.in_doi_desc && ele.attr_name==row.attr_name){
|
|
|
+ delInd = i;
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(delInd>-1) {
|
|
|
+ pointsDataAll.splice(delInd,1);
|
|
|
+ }
|
|
|
+}
|
|
|
+const newMappingIedSelected=(v)=>{
|
|
|
+ pingotstableData.value[0].attr_name = v;
|
|
|
+ pingotstableData.value[0].ied_name = v;
|
|
|
+}
|
|
|
+const newMappingInIedSelected=(v)=>{
|
|
|
+ pingotstableData.value[0].in_ied_name = v;
|
|
|
+}
|
|
|
//打开选择ied
|
|
|
const checkTime = () => {
|
|
|
iedModal.value = true;
|
|
@@ -991,13 +1274,11 @@ const setIedExtrefNo = () => {
|
|
|
)
|
|
|
.then(({ value }) => {
|
|
|
// 用户点击确定,value 是输入的内容
|
|
|
- scd
|
|
|
- .setAreaIedNo({
|
|
|
+ scd.setAreaIedNo({
|
|
|
area_id: loadAreaId.value * 1,
|
|
|
ied_name: ied[0].attr_name,
|
|
|
ied_no: value,
|
|
|
- })
|
|
|
- .then((res) => {
|
|
|
+ }).then((res) => {
|
|
|
if (res != null && res.code == 0) {
|
|
|
ElMessage({
|
|
|
message: "操作成功",
|
|
@@ -1011,12 +1292,11 @@ const setIedExtrefNo = () => {
|
|
|
} else {
|
|
|
ElMessage({
|
|
|
message: "操作失败:" + res.msg,
|
|
|
- type: "success",
|
|
|
+ type: "error",
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
- })
|
|
|
- .catch(() => {
|
|
|
+ }).catch(() => {
|
|
|
// 用户点击取消或关闭对话框
|
|
|
});
|
|
|
};
|
|
@@ -1069,6 +1349,7 @@ const sureAdd = debounce(async () => {
|
|
|
const cancelClick = () => {
|
|
|
reset();
|
|
|
openAddInterval.value = false;
|
|
|
+ openIntervalPointsMapping.value = false;
|
|
|
};
|
|
|
//删除间隔
|
|
|
const delInterval = (data) => {
|
|
@@ -1116,7 +1397,6 @@ em {
|
|
|
color: #5779d7;
|
|
|
margin-right: 5px;
|
|
|
}
|
|
|
-
|
|
|
.createMisBox {
|
|
|
width: 100%;
|
|
|
height: calc(100vh - 150px);
|