liyangzheng 1 year ago
parent
commit
26f217ab46
1 changed files with 570 additions and 572 deletions
  1. 570 572
      src/pages/components/drawModal/LineDouble.vue

+ 570 - 572
src/pages/components/drawModal/LineDouble.vue

@@ -55,635 +55,633 @@
                 </span>
             </template>
         </el-dialog>
-        <<<<<<< HEAD <SureCancel v-if="sureModal" :showCaptionText="fcdaRelationDlgTitle" :sureModal="sureModal"
-            :reload="reload" :checkObj="checkObj" @cancelBack="cancelBack">
-            </SureCancel>
-            =======
-            <SureCancel v-if="sureModal" :sureModal="sureModal" :reload="reload" :checkObj="checkObj"
-                @cancelBack="cancelBack">
-            </SureCancel>
-            >>>>>>> liyangzheng
+        <SureCancel v-if="sureModal" :showCaptionText="fcdaRelationDlgTitle" :sureModal="sureModal" :reload="reload"
+            :checkObj="checkObj" @cancelBack="cancelBack">
+        </SureCancel>
+        <!-- <SureCancel v-if="sureModal" :sureModal="sureModal" :reload="reload" :checkObj="checkObj"
+            @cancelBack="cancelBack">
+        </SureCancel> -->
     </div>
 </template>
 
-    <script>
-    import { ref, onMounted, watch, toRefs, computed, onBeforeUnmount } from 'vue';
-    import flow from '@/api/flow/flow';
-    import { ElMessage } from 'element-plus';
-    import LeaderLine from "../../../../public/leader-line.min.js";
-    import SureCancel from './SureCancel.vue';
-    export default {
-        props: {
-            ldModal: {
-                type: Boolean,
-                required: true,
-            },
-            startTarget: {
-                type: Object,
-                required: true
-            },//开始数据
-            endTarget: {
-                type: Object,
-                required: true,
-            },//结尾数据
-            modelId: {
-                type: String,
-                required: true,
-            },//模型id
-            numCase: {
-                type: Number,
-                required: true
-            },//用于判断goose还是sv,0为sv,1为goose
-            startText: {
-                type: String,
-                required: true
-            },//开始节点文本
-            endText: {
-                type: String,
-                required: true
-            },//结束文本
-            lineType: {
-                type: String,
-                required: true
-            },//用于判断goose还是sv
+<script>
+import { ref, onMounted, watch, toRefs, computed, onBeforeUnmount } from 'vue';
+import flow from '@/api/flow/flow';
+import { ElMessage } from 'element-plus';
+import LeaderLine from "../../../../public/leader-line.min.js";
+import SureCancel from './SureCancel.vue';
+export default {
+    props: {
+        ldModal: {
+            type: Boolean,
+            required: true,
         },
-        setup(props, { emit }) {
-            let dialogVisible = ref(false)//模态框开关
-            let starts = ref({})//开始装置数据
-            let ends = ref({})//结束装置数据
-            let modelIds = ref("")//本组件的模型id
-            let startTxt = ref("")//本组件开始文本
-            let endTxt = ref("")//本组件结束文本
-            let curList = ref([])//箭头开始list
-            let outList = ref([])//箭头结束list
-            let numStatus = ref(0)//判断goose还是sv
-            let visibleItems = ref([])//选择的数组
-            let fcdaIds = ref("")//需要的fcda_ids
-            let leftIndex = ref(-1)//左侧选择的输出下标
-            let leftFcda = ref("")//左侧的fcdaid
-            let together = ref("")//绑定的id
-            let oldCheckList = ref([])//存储最后一次操作后,已选中的目标装置端子列表数据。用于与checklist对比,已判断当前是取消关联还是建立关联
-            let checkList = ref([])//当前已选中的目标装置端子列表数据
-            let loading = ref(false)
-            let arrNew = ref([])//新的存储fdcdids
-            let gv = ref('')
-            let pastLoading = ref(false)
-            let sureModal = ref(false)//SureCancel.vue组件展示开关
-            let leaderLineList = ref({})//组件leader-line数据,以方便离开组件时清除画线
-            let checkObj = ref({})//选择的对象
-            let fcdaRelationDlgTitle = ref('')
-            watch(() => props.modelId, (newVal) => {
-                modelIds.value = newVal
-            })
-            watch(() => props.startText, (newVal) => {
-                startTxt.value = newVal
-            })
-            watch(() => props.endText, (newVal) => {
-                endTxt.value = newVal
-            })
-            watch(() => props.numCase, (newVal) => {
-                numStatus.value = newVal
-            })
-            watch(() => props.lineType, (newVal) => {
-                gv.value = newVal
-            })
-            // 初始化函数
-            async function reload() {
-                checkList.value = []
-                oldCheckList.value = []
-                pastLoading.value = true
-                dialogVisible.value = props.ldModal
-                modelIds.value = props.modelId
-                starts.value = props.startTarget
-                ends.value = props.endTarget
-                if (props.startText == null || props.startText == '') {
-                    startTxt.value = starts.value.ied_type
-                } else {
-                    startTxt.value = props.startText
-                }
-                if (props.endText == null || props.endText == '') {
-                    endTxt.value = ends.value.ied_type
-                } else {
-                    endTxt.value = props.endText
-                }
-                numStatus.value = props.numCase
-                gv.value = props.lineType
-                await flow.getModelAndIed({
-                    model_id: modelIds.value - 0,
-                    ied_type: starts.value.ied_type,
-                    sv_or_goose: gv.value,
-                    in_or_out: "输出",
-                    ref_ied_type: ends.value.ied_type
-                }).then(res => {
-                    //if ( res.data) {
-                    //liling:避免提示空错误提示,res.data为空不代表接口有错误,所以先判断接口code值
-                    pastLoading.value = false
-                    if (res.code == 0) {
-                        if (res.data == null || res.data == "") {
-                            curList.value = [];
-                            return;
-                        }
-
-                        let tmpList = [];
-                        //对结果进行重排排序:将已关联到输出装置的端子排在前面
-                        res.data.forEach((item, index) => {
-                            if (item.to_ied_type == ends.value.ied_type) {
-                                tmpList.unshift(item)
-                            } else {
-                                //未关联的端子按原结果顺序排列
-                                tmpList.push(item)
-                            }
-                        })
-
-                        curList.value = tmpList
-                        //pastLoading.value = false
-                    } else {
-                        ElMessage({
-                            message: res.msg,
-                            type: "error"
-                        })
-                    }
-                })
-                await flow.getModelAndIed({
-                    model_id: modelIds.value - 0,
-                    ied_type: ends.value.ied_type,
-                    sv_or_goose: gv.value,
-                    in_or_out: "接收",
-                    ref_ied_type: starts.value.ied_type
-                }).then(res => {
-                    //if ( res.data) {
-                    //liling:避免提示空错误提示,res.data为空不代表接口有错误,所以先判断接口code值
-                    if (res.code == 0) {
-                        if (res.data == null || res.data == "") {
-                            outList.value = [];
-                            return;
-                        }
+        startTarget: {
+            type: Object,
+            required: true
+        },//开始数据
+        endTarget: {
+            type: Object,
+            required: true,
+        },//结尾数据
+        modelId: {
+            type: String,
+            required: true,
+        },//模型id
+        numCase: {
+            type: Number,
+            required: true
+        },//用于判断goose还是sv,0为sv,1为goose
+        startText: {
+            type: String,
+            required: true
+        },//开始节点文本
+        endText: {
+            type: String,
+            required: true
+        },//结束文本
+        lineType: {
+            type: String,
+            required: true
+        },//用于判断goose还是sv
+    },
+    setup(props, { emit }) {
+        let dialogVisible = ref(false)//模态框开关
+        let starts = ref({})//开始装置数据
+        let ends = ref({})//结束装置数据
+        let modelIds = ref("")//本组件的模型id
+        let startTxt = ref("")//本组件开始文本
+        let endTxt = ref("")//本组件结束文本
+        let curList = ref([])//箭头开始list
+        let outList = ref([])//箭头结束list
+        let numStatus = ref(0)//判断goose还是sv
+        let visibleItems = ref([])//选择的数组
+        let fcdaIds = ref("")//需要的fcda_ids
+        let leftIndex = ref(-1)//左侧选择的输出下标
+        let leftFcda = ref("")//左侧的fcdaid
+        let together = ref("")//绑定的id
+        let oldCheckList = ref([])//存储最后一次操作后,已选中的目标装置端子列表数据。用于与checklist对比,已判断当前是取消关联还是建立关联
+        let checkList = ref([])//当前已选中的目标装置端子列表数据
+        let loading = ref(false)
+        let arrNew = ref([])//新的存储fdcdids
+        let gv = ref('')
+        let pastLoading = ref(false)
+        let sureModal = ref(false)//SureCancel.vue组件展示开关
+        let leaderLineList = ref({})//组件leader-line数据,以方便离开组件时清除画线
+        let checkObj = ref({})//选择的对象
+        let fcdaRelationDlgTitle = ref('')
+        watch(() => props.modelId, (newVal) => {
+            modelIds.value = newVal
+        })
+        watch(() => props.startText, (newVal) => {
+            startTxt.value = newVal
+        })
+        watch(() => props.endText, (newVal) => {
+            endTxt.value = newVal
+        })
+        watch(() => props.numCase, (newVal) => {
+            numStatus.value = newVal
+        })
+        watch(() => props.lineType, (newVal) => {
+            gv.value = newVal
+        })
+        // 初始化函数
+        async function reload() {
+            checkList.value = []
+            oldCheckList.value = []
+            pastLoading.value = true
+            dialogVisible.value = props.ldModal
+            modelIds.value = props.modelId
+            starts.value = props.startTarget
+            ends.value = props.endTarget
+            if (props.startText == null || props.startText == '') {
+                startTxt.value = starts.value.ied_type
+            } else {
+                startTxt.value = props.startText
+            }
+            if (props.endText == null || props.endText == '') {
+                endTxt.value = ends.value.ied_type
+            } else {
+                endTxt.value = props.endText
+            }
+            numStatus.value = props.numCase
+            gv.value = props.lineType
+            await flow.getModelAndIed({
+                model_id: modelIds.value - 0,
+                ied_type: starts.value.ied_type,
+                sv_or_goose: gv.value,
+                in_or_out: "输出",
+                ref_ied_type: ends.value.ied_type
+            }).then(res => {
+                //if ( res.data) {
+                //liling:避免提示空错误提示,res.data为空不代表接口有错误,所以先判断接口code值
+                pastLoading.value = false
+                if (res.code == 0) {
+                    if (res.data == null || res.data == "") {
+                        curList.value = [];
+                        return;
                     }
-                    //对结果进行重排排序:将已关联到输出装置的端子排在前面
+
                     let tmpList = [];
+                    //对结果进行重排排序:将已关联到输出装置的端子排在前面
                     res.data.forEach((item, index) => {
-                        if (item.from_ied_type == starts.value.ied_type) {
+                        if (item.to_ied_type == ends.value.ied_type) {
                             tmpList.unshift(item)
                         } else {
                             //未关联的端子按原结果顺序排列
                             tmpList.push(item)
                         }
                     })
-                    outList.value = tmpList;
-                    setIndex()
-                    // 将 setTimeout 移动到 then 方法中
-                    setTimeout(() => {
-                        res.data.forEach((item, index) => {
-                            let line = {
-                                start: item.from_fcda_id,
-                                end: item.id
-                            };
-                            let starts = document.getElementById(line.start);
-                            let ends = document.getElementById(line.end).parentNode;
-                            // console.log(starts, ends, '??????');
-                            // 检查 starts 和 ends 是否存在
-                            if (starts && ends) {
-                                /*
-                                leaderLineList.value.push();
-                                */
-                                const key = line.start + ',' + line.end
-                                leaderLineList.value[key] = new LeaderLine(starts, ends, {
-                                    color: "#ccc",
-                                    size: 2,
-                                    path: "straight",
-                                    startSocket: "right",
-                                    endSocket: "left",
-                                    endPlug: 'arrow3',
-                                    endPlugSize: 2
-                                })
-                                hiddenLine();
-                                pastLoading.value = false
-                            } else {
-                                //console.error(`Element with ID ${line.start} or ${line.end} not found.`);
-                            }
-                        });
-                    }, 100);
-                })
-                curList.value.sort((obj1, obj2) => {
-                    if (outList.value[0] == null) return 1;
-                    const nameB = outList.value[0].fcda_name;
-                    if (obj1.fcda_name === nameB) return -1; // 将 name 与数组 b 中第一个对象的 name 属性相等的对象移到数组的第一位
-                    if (obj2.fcda_name === nameB) return 1;
-                    return 0;
-                });
-            }
-            // 关闭模态框
-            function closeModal() {
-                removeLine3()
-                dialogVisible.value = false
-                emit("lineBack", dialogVisible.value)
-            }
-            // 确认关闭模态框
-            function sureClose() {
-                dialogVisible.value = false
-                removeLine3()
-            }
-            // 返回goose还是sv
-            const setGooseOrSv = computed(() => {
-                if (gv.value == "SV") {
-                    return "SV"
-                } else if (gv.value == "GOOSE") {
-                    return "GOOSE"
-                }
-            })
-            // 返回图片
-            const setBackground = computed(() => {
-                if (gv.value == "SV") {
-                    return require("../../../assets/image/sv_orange.png")
-                } else if (gv.value == "GOOSE") {
-                    return require("../../../assets/image/goose_blue.png")
+
+                    curList.value = tmpList
+                    //pastLoading.value = false
+                } else {
+                    ElMessage({
+                        message: res.msg,
+                        type: "error"
+                    })
                 }
             })
-            // 返回文字颜色
-            const setColor = computed(() => {
-                if (gv.value == "SV") {
-                    return 'orange'
-                } else if (gv.value == "GOOSE") {
-                    return 'blue'
+            await flow.getModelAndIed({
+                model_id: modelIds.value - 0,
+                ied_type: ends.value.ied_type,
+                sv_or_goose: gv.value,
+                in_or_out: "接收",
+                ref_ied_type: starts.value.ied_type
+            }).then(res => {
+                //if ( res.data) {
+                //liling:避免提示空错误提示,res.data为空不代表接口有错误,所以先判断接口code值
+                if (res.code == 0) {
+                    if (res.data == null || res.data == "") {
+                        outList.value = [];
+                        return;
+                    }
                 }
-            })
-            // 下标选择
-            function setIndex(row, num) {
-                if (row && num) {
-                    leftFcda.value = row.id
-                    // checkList.value = [row.to_fcda_id]
-                    fcdaIds.value = row.to_fcda_id
-                    leftIndex.value = num
-                } else {
-                    if (curList.value.length > 0) {
-                        curList.value.map(item => {
-                            if (item.to_fcda_id != '0' && item.to_fcda_id != '') {
-                                console.log(item)
-                                checkList.value.push(item.to_fcda_id)
-                            }
-                        })
-                        oldCheckList.value = checkList.value
-                        leftFcda.value = curList.value[0].id
-                        // checkList.value = [curList.value[0].to_fcda_id]
-                        fcdaIds.value = curList.value[0].to_fcda_id
-                        leftIndex.value = 0
+                //对结果进行重排排序:将已关联到输出装置的端子排在前面
+                let tmpList = [];
+                res.data.forEach((item, index) => {
+                    if (item.from_ied_type == starts.value.ied_type) {
+                        tmpList.unshift(item)
                     } else {
-                        ElMessage({
-                            type: "info",
-                            message: "您还没有配置装置端子"
-                        })
-                        loading.value = false
+                        //未关联的端子按原结果顺序排列
+                        tmpList.push(item)
                     }
-                }
+                })
+                outList.value = tmpList;
+                setIndex()
+                // 将 setTimeout 移动到 then 方法中
+                setTimeout(() => {
+                    res.data.forEach((item, index) => {
+                        let line = {
+                            start: item.from_fcda_id,
+                            end: item.id
+                        };
+                        let starts = document.getElementById(line.start);
+                        let ends = document.getElementById(line.end).parentNode;
+                        // console.log(starts, ends, '??????');
+                        // 检查 starts 和 ends 是否存在
+                        if (starts && ends) {
+                            /*
+                            leaderLineList.value.push();
+                            */
+                            const key = line.start + ',' + line.end
+                            leaderLineList.value[key] = new LeaderLine(starts, ends, {
+                                color: "#ccc",
+                                size: 2,
+                                path: "straight",
+                                startSocket: "right",
+                                endSocket: "left",
+                                endPlug: 'arrow3',
+                                endPlugSize: 2
+                            })
+                            hiddenLine();
+                            pastLoading.value = false
+                        } else {
+                            //console.error(`Element with ID ${line.start} or ${line.end} not found.`);
+                        }
+                    });
+                }, 100);
+            })
+            curList.value.sort((obj1, obj2) => {
+                if (outList.value[0] == null) return 1;
+                const nameB = outList.value[0].fcda_name;
+                if (obj1.fcda_name === nameB) return -1; // 将 name 与数组 b 中第一个对象的 name 属性相等的对象移到数组的第一位
+                if (obj2.fcda_name === nameB) return 1;
+                return 0;
+            });
+        }
+        // 关闭模态框
+        function closeModal() {
+            removeLine3()
+            dialogVisible.value = false
+            emit("lineBack", dialogVisible.value)
+        }
+        // 确认关闭模态框
+        function sureClose() {
+            dialogVisible.value = false
+            removeLine3()
+        }
+        // 返回goose还是sv
+        const setGooseOrSv = computed(() => {
+            if (gv.value == "SV") {
+                return "SV"
+            } else if (gv.value == "GOOSE") {
+                return "GOOSE"
             }
-            function checkChange(e) {
-                checkObj.value = e
-                //const subItem = oldCheckList.value.filter(item => !checkList.value.includes(item)); //是否取消选择,取差集
-                const addItem = checkList.value.filter(item => !oldCheckList.value.includes(item)); //是否新选择的,取差集
-                let no = false
-                let hintTxt = ''
-                if (addItem.length > 0) {
-                    //判断是否选择源端子以及是否未关联任何其他端子,否则不允许关联                
-                    if (leftFcda.value == '') {
-                        hintTxt = "请选择关联的源(左侧)端子!"
-                        no = true
-                    }
-                    if (fcdaIds.value != '' && fcdaIds.value != '0') {
-                        //源端子已有关联
-                        hintTxt = "选择源(左侧)端子已有关联,请先取消关联或选择其它端子!"
-                        no = true
-                    }
-                    fcdaRelationDlgTitle.value = "确定在当前2个端子间建立关联关系?"
-                }
-                if (no) {
+        })
+        // 返回图片
+        const setBackground = computed(() => {
+            if (gv.value == "SV") {
+                return require("../../../assets/image/sv_orange.png")
+            } else if (gv.value == "GOOSE") {
+                return require("../../../assets/image/goose_blue.png")
+            }
+        })
+        // 返回文字颜色
+        const setColor = computed(() => {
+            if (gv.value == "SV") {
+                return 'orange'
+            } else if (gv.value == "GOOSE") {
+                return 'blue'
+            }
+        })
+        // 下标选择
+        function setIndex(row, num) {
+            if (row && num) {
+                leftFcda.value = row.id
+                // checkList.value = [row.to_fcda_id]
+                fcdaIds.value = row.to_fcda_id
+                leftIndex.value = num
+            } else {
+                if (curList.value.length > 0) {
+                    curList.value.map(item => {
+                        if (item.to_fcda_id != '0' && item.to_fcda_id != '') {
+                            console.log(item)
+                            checkList.value.push(item.to_fcda_id)
+                        }
+                    })
+                    oldCheckList.value = checkList.value
+                    leftFcda.value = curList.value[0].id
+                    // checkList.value = [curList.value[0].to_fcda_id]
+                    fcdaIds.value = curList.value[0].to_fcda_id
+                    leftIndex.value = 0
+                } else {
                     ElMessage({
                         type: "info",
-                        message: hintTxt
+                        message: "您还没有配置装置端子"
                     })
-                    //恢复未选状态
-                    let ind = checkList.value.indexOf(addItem[0])
-                    checkList.value.splice(ind, 1)
-                    return
+                    loading.value = false
                 }
-                sureModal.value = true
             }
-            //弹窗打开后使得线条在指定区域中
-            function hiddenLine() {
-                const elmWrapper = document.getElementById("wrapper");
-                // 移动 line
-                document.body.querySelectorAll("body .leader-line").forEach((node) => {
-                    elmWrapper.appendChild(node);
-                });
-                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)`;
-            };
-            // 稳定leader-line函数
-            function removeLine3() {
-                leaderLineList.value = {};
-                const elmWrapper = document.getElementById("wrapper");
-                if (elmWrapper) {
-                    document.body.querySelectorAll("#wrapper .leader-line").forEach((node) => {
-                        elmWrapper.removeChild(node);
-                    });
+        }
+        function checkChange(e) {
+            checkObj.value = e
+            //const subItem = oldCheckList.value.filter(item => !checkList.value.includes(item)); //是否取消选择,取差集
+            const addItem = checkList.value.filter(item => !oldCheckList.value.includes(item)); //是否新选择的,取差集
+            let no = false
+            let hintTxt = ''
+            if (addItem.length > 0) {
+                //判断是否选择源端子以及是否未关联任何其他端子,否则不允许关联                
+                if (leftFcda.value == '') {
+                    hintTxt = "请选择关联的源(左侧)端子!"
+                    no = true
                 }
-            };
-            //取消端子关联确认框返回事件处理
-            function cancelBack(data) {
-                // 本事件处理选择框
-                sureModal.value = false
-                const subItem = oldCheckList.value.filter(item => !checkList.value.includes(item)); //是否取消选择,取差集
-                const addItem = checkList.value.filter(item => !oldCheckList.value.includes(item)); //是否新选择的,取差集
-                if (!data.ok) {
-                    if (subItem.length > 0) {
-                        //恢复选中状态
-                        checkList.value.push(subItem[0])
-                    }
-                    if (addItem.length > 0) {
-                        //恢复未选状态
-                        let ind = checkList.value.indexOf(addItem[0])
-                        checkList.value.splice(ind, 1)
-                    }
-                    return
+                if (fcdaIds.value != '' && fcdaIds.value != '0') {
+                    //源端子已有关联
+                    hintTxt = "选择源(左侧)端子已有关联,请先取消关联或选择其它端子!"
+                    no = true
                 }
-                fcdaIds.value = checkObj.value.id
+                fcdaRelationDlgTitle.value = "确定在当前2个端子间建立关联关系?"
+            }
+            if (no) {
+                ElMessage({
+                    type: "info",
+                    message: hintTxt
+                })
+                //恢复未选状态
+                let ind = checkList.value.indexOf(addItem[0])
+                checkList.value.splice(ind, 1)
+                return
+            }
+            sureModal.value = true
+        }
+        //弹窗打开后使得线条在指定区域中
+        function hiddenLine() {
+            const elmWrapper = document.getElementById("wrapper");
+            // 移动 line
+            document.body.querySelectorAll("body .leader-line").forEach((node) => {
+                elmWrapper.appendChild(node);
+            });
+            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)`;
+        };
+        // 稳定leader-line函数
+        function removeLine3() {
+            leaderLineList.value = {};
+            const elmWrapper = document.getElementById("wrapper");
+            if (elmWrapper) {
+                document.body.querySelectorAll("#wrapper .leader-line").forEach((node) => {
+                    elmWrapper.removeChild(node);
+                });
+            }
+        };
+        //取消端子关联确认框返回事件处理
+        function cancelBack(data) {
+            // 本事件处理选择框
+            sureModal.value = false
+            const subItem = oldCheckList.value.filter(item => !checkList.value.includes(item)); //是否取消选择,取差集
+            const addItem = checkList.value.filter(item => !oldCheckList.value.includes(item)); //是否新选择的,取差集
+            if (!data.ok) {
                 if (subItem.length > 0) {
-                    flow.delModelFcdaOn({
-                        model_id: modelIds.value - 0,
-                        from_fcda_id: checkObj.value.from_fcda_id - 0,
-                        to_fcda_id: fcdaIds.value
-                    }).then(res => {
-                        if (res.code == 0) {
-                            ElMessage({
-                                type: "success",
-                                message: "操作成功!"
-                            })
-                            reload()
-                            removeLine3()
-                            emit("lineBack", dialogVisible.value)
-                        } else {
-                            ElMessage({
-                                type: "error",
-                                message: res.msg
-                            })
-                        }
-                    }).catch(res => {
+                    //恢复选中状态
+                    checkList.value.push(subItem[0])
+                }
+                if (addItem.length > 0) {
+                    //恢复未选状态
+                    let ind = checkList.value.indexOf(addItem[0])
+                    checkList.value.splice(ind, 1)
+                }
+                return
+            }
+            fcdaIds.value = checkObj.value.id
+            if (subItem.length > 0) {
+                flow.delModelFcdaOn({
+                    model_id: modelIds.value - 0,
+                    from_fcda_id: checkObj.value.from_fcda_id - 0,
+                    to_fcda_id: fcdaIds.value
+                }).then(res => {
+                    if (res.code == 0) {
+                        ElMessage({
+                            type: "success",
+                            message: "操作成功!"
+                        })
+                        reload()
+                        removeLine3()
+                        emit("lineBack", dialogVisible.value)
+                    } else {
                         ElMessage({
                             type: "error",
-                            message: '服务器发生异常'
+                            message: res.msg
                         })
+                    }
+                }).catch(res => {
+                    ElMessage({
+                        type: "error",
+                        message: '服务器发生异常'
                     })
-                }
-                if (addItem.length > 0) {
-                    flow.saveModelOn({
-                        model_id: modelIds.value - 0,
-                        from_ied_type: starts.value.ied_type,
-                        to_ied_type: ends.value.ied_type,
-                        from_fcda_id: leftFcda.value - 0,
-                        to_fcda_ids: fcdaIds.value,
-                        goosesv: setGooseOrSv.value,
-                    }).then(res => {
-                        if (res.code == 0) {
-                            ElMessage({
-                                type: "success",
-                                message: "关联成功!"
-                            })
-                            reload()
-                            removeLine3()
-                            emit("lineBack", dialogVisible.value)
-                        } else {
-                            ElMessage({
-                                type: "error",
-                                message: res.msg
-                            })
-                        }
-                    }).catch(res => {
+                })
+            }
+            if (addItem.length > 0) {
+                flow.saveModelOn({
+                    model_id: modelIds.value - 0,
+                    from_ied_type: starts.value.ied_type,
+                    to_ied_type: ends.value.ied_type,
+                    from_fcda_id: leftFcda.value - 0,
+                    to_fcda_ids: fcdaIds.value,
+                    goosesv: setGooseOrSv.value,
+                }).then(res => {
+                    if (res.code == 0) {
+                        ElMessage({
+                            type: "success",
+                            message: "关联成功!"
+                        })
+                        reload()
+                        removeLine3()
+                        emit("lineBack", dialogVisible.value)
+                    } else {
                         ElMessage({
                             type: "error",
-                            message: '服务器发生异常'
+                            message: res.msg
                         })
+                    }
+                }).catch(res => {
+                    ElMessage({
+                        type: "error",
+                        message: '服务器发生异常'
                     })
-                }
+                })
             }
-            onMounted(async () => {
-                await reload()
-            })
-            onBeforeUnmount(() => {
-                for (let key in leaderLineList.value) {
-                    leaderLineList.value[key].remove();
-                }
-                //leaderLineList.value.forEach(line => line.remove());//离开当前组件时清除连线
-                removeLine3()
-            })
-            return {
-                dialogVisible,//模态框开关
-                reload,//初始化函数
-                starts,//开始节点数据
-                ends,//结束节点数据
-                handleClose: closeModal,//关闭模态框
-                cancels: closeModal,//关闭模态框
-                sureClick: sureClose,//确认关闭模态框
-                modelIds,//本组件的模型id
-                startTxt,//本组件开始文本
-                endTxt,//本组件结束文本
-                curList,//渲染list
-                setGooseOrSv,//判断显示goose还是sv
-                setBackground,//判断显示背景图
-                setColor,//判断文字颜色
-                visibleItems,//选择的数组
-                // toggleVisibility,//模拟多选框方法
-                fcdaIds,//需要的fcda_ids
-                leftIndex,//左侧下标选择
-                setIndex,//下标选择函数
-                // getClass,//设置多选span的class函数
-                leftFcda,//左侧单选的fcdaid
-                outList,//箭头指向端list
-                together,//绑定的id
-                // isVisible,
-                loading,
-                checkList,
-                checkChange,
-                arrNew,//新的存储ids
-                gv,
-                pastLoading,//maxbox加载动画
-                leaderLineList,//组件库leader-line数据,以方便离开组件时清除画线
-                hiddenLine,//使leader-line显示在模态框内
-                removeLine3,// 稳定leader-line函数
-                sureModal,//SureCancel.vue组件展示开关
-                cancelBack,//SureCancel.vue返回模态框状态
-                checkObj,//选择的对象
-                fcdaRelationDlgTitle,
+        }
+        onMounted(async () => {
+            await reload()
+        })
+        onBeforeUnmount(() => {
+            for (let key in leaderLineList.value) {
+                leaderLineList.value[key].remove();
             }
-        },
-        components: {
-            SureCancel,//确认取消关系组件
+            //leaderLineList.value.forEach(line => line.remove());//离开当前组件时清除连线
+            removeLine3()
+        })
+        return {
+            dialogVisible,//模态框开关
+            reload,//初始化函数
+            starts,//开始节点数据
+            ends,//结束节点数据
+            handleClose: closeModal,//关闭模态框
+            cancels: closeModal,//关闭模态框
+            sureClick: sureClose,//确认关闭模态框
+            modelIds,//本组件的模型id
+            startTxt,//本组件开始文本
+            endTxt,//本组件结束文本
+            curList,//渲染list
+            setGooseOrSv,//判断显示goose还是sv
+            setBackground,//判断显示背景图
+            setColor,//判断文字颜色
+            visibleItems,//选择的数组
+            // toggleVisibility,//模拟多选框方法
+            fcdaIds,//需要的fcda_ids
+            leftIndex,//左侧下标选择
+            setIndex,//下标选择函数
+            // getClass,//设置多选span的class函数
+            leftFcda,//左侧单选的fcdaid
+            outList,//箭头指向端list
+            together,//绑定的id
+            // isVisible,
+            loading,
+            checkList,
+            checkChange,
+            arrNew,//新的存储ids
+            gv,
+            pastLoading,//maxbox加载动画
+            leaderLineList,//组件库leader-line数据,以方便离开组件时清除画线
+            hiddenLine,//使leader-line显示在模态框内
+            removeLine3,// 稳定leader-line函数
+            sureModal,//SureCancel.vue组件展示开关
+            cancelBack,//SureCancel.vue返回模态框状态
+            checkObj,//选择的对象
+            fcdaRelationDlgTitle,
         }
+    },
+    components: {
+        SureCancel,//确认取消关系组件
     }
+}
 </script>
 
-    <style scoped>
-    .masBox {
-        width: 100%;
-        height: calc(100vh - 400px);
-        /* border: 1px solid red; */
-        display: flex;
-        justify-content: space-around;
-        align-items: center;
-        overflow-y: auto;
-        position: relative;
-    }
+<style scoped>
+.masBox {
+    width: 100%;
+    height: calc(100vh - 400px);
+    /* border: 1px solid red; */
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    overflow-y: auto;
+    position: relative;
+}
 
-    .leftBox {
-        width: 33%;
-        /* height: calc(100vh - 420px); */
-        text-align: center;
-        background-color: #F7F8FB;
-        border: 2px dashed #A3ADE0;
-        position: absolute;
-        top: 2%;
-        left: 5%;
-    }
+.leftBox {
+    width: 33%;
+    /* height: calc(100vh - 420px); */
+    text-align: center;
+    background-color: #F7F8FB;
+    border: 2px dashed #A3ADE0;
+    position: absolute;
+    top: 2%;
+    left: 5%;
+}
 
-    .middleBox {
-        width: 22%;
-        height: calc(100vh - 420px);
-        display: flex;
-        justify-content: space-around;
-        align-items: center;
-        position: absolute;
-        top: 5%;
-        left: 39%;
-    }
+.middleBox {
+    width: 22%;
+    height: calc(100vh - 420px);
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    position: absolute;
+    top: 5%;
+    left: 39%;
+}
 
-    .rightBox {
-        width: 33%;
-        /* height: calc(100vh - 420px); */
-        text-align: center;
-        background-color: #EDF3FF;
-        border: 2px dashed #A3ADE0;
-        position: absolute;
-        top: 2%;
-        right: 5%;
-    }
+.rightBox {
+    width: 33%;
+    /* height: calc(100vh - 420px); */
+    text-align: center;
+    background-color: #EDF3FF;
+    border: 2px dashed #A3ADE0;
+    position: absolute;
+    top: 2%;
+    right: 5%;
+}
 
-    .result {
-        display: inline-block;
-        width: 11%;
-        height: 40px;
-        border: 1px solid blue;
-        text-align: center;
-        line-height: 40px;
-        background-color: #D9E6FE;
-        color: blue;
-        margin-right: 10px;
-    }
+.result {
+    display: inline-block;
+    width: 11%;
+    height: 40px;
+    border: 1px solid blue;
+    text-align: center;
+    line-height: 40px;
+    background-color: #D9E6FE;
+    color: blue;
+    margin-right: 10px;
+}
 
-    .anther {
-        display: inline-block;
-        width: 11%;
-        height: 40px;
-        border: 1px solid black;
-        text-align: center;
-        line-height: 40px;
-        background-color: #F5FAFE;
-        color: black;
-        margin-right: 10px;
-    }
+.anther {
+    display: inline-block;
+    width: 11%;
+    height: 40px;
+    border: 1px solid black;
+    text-align: center;
+    line-height: 40px;
+    background-color: #F5FAFE;
+    color: black;
+    margin-right: 10px;
+}
 
-    .results {
-        display: inline-block;
-        width: 75%;
-        height: 40px;
-        border: 1px solid blue;
-        text-align: left;
-        line-height: 40px;
-        background-color: #D9E6FE;
-        color: blue;
-        padding-left: 5px;
-    }
+.results {
+    display: inline-block;
+    width: 75%;
+    height: 40px;
+    border: 1px solid blue;
+    text-align: left;
+    line-height: 40px;
+    background-color: #D9E6FE;
+    color: blue;
+    padding-left: 5px;
+}
 
-    .anthers {
-        display: inline-block;
-        width: 75%;
-        height: 40px;
-        border: 1px solid black;
-        text-align: left;
-        line-height: 40px;
-        background-color: #F5FAFE;
-        color: black;
-        padding-left: 5px;
-    }
+.anthers {
+    display: inline-block;
+    width: 75%;
+    height: 40px;
+    border: 1px solid black;
+    text-align: left;
+    line-height: 40px;
+    background-color: #F5FAFE;
+    color: black;
+    padding-left: 5px;
+}
 
-    .background {
-        width: 90%;
-        height: calc(100vh - 850px);
-        /* background-position: 100%; */
-        background-repeat: no-repeat;
-        background-size: 100%;
-        text-align: center;
-        background-position: 100% 50%;
-        line-height: calc(100vh - 850px);
-    }
+.background {
+    width: 90%;
+    height: calc(100vh - 850px);
+    /* background-position: 100%; */
+    background-repeat: no-repeat;
+    background-size: 100%;
+    text-align: center;
+    background-position: 100% 50%;
+    line-height: calc(100vh - 850px);
+}
 
-    :deep(.el-checkbox__inner) {
-        width: 40px !important;
-        height: 40px !important;
-        background-color: white !important;
-    }
+:deep(.el-checkbox__inner) {
+    width: 40px !important;
+    height: 40px !important;
+    background-color: white !important;
+}
 
-    :deep(.el-checkbox__inner::after) {
-        height: 30px !important;
-        left: 11px !important;
-        width: 15px !important;
-        top: -2px !important;
-        border-color: #2B5AE5;
-    }
+:deep(.el-checkbox__inner::after) {
+    height: 30px !important;
+    left: 11px !important;
+    width: 15px !important;
+    top: -2px !important;
+    border-color: #2B5AE5;
+}
 
-    :deep(.el-checkbox__input.is-checked .el-checkbox__inner::after) {
-        border-color: #2B5AE5;
-    }
+:deep(.el-checkbox__input.is-checked .el-checkbox__inner::after) {
+    border-color: #2B5AE5;
+}
 
-    :deep(.el-checkbox) {
-        width: 300px !important;
-        height: 42px !important;
-        margin-right: 0 !important;
-        margin-bottom: 10px !important;
-    }
+:deep(.el-checkbox) {
+    width: 300px !important;
+    height: 42px !important;
+    margin-right: 0 !important;
+    margin-bottom: 10px !important;
+}
 
-    :deep(.el-checkbox__label) {
-        width: 202px !important;
-        height: 42px !important;
-        margin-left: 10px !important;
-        line-height: 42px !important;
-        text-align: center;
-    }
+:deep(.el-checkbox__label) {
+    width: 202px !important;
+    height: 42px !important;
+    margin-left: 10px !important;
+    line-height: 42px !important;
+    text-align: center;
+}
 
-    .leader-line {
-        z-index: 3000;
-    }
+.leader-line {
+    z-index: 3000;
+}
 
-    #wrapper {
-        width: 0;
-        height: 0;
-        position: relative;
-        /* Origin of coordinates for lines, and scrolled content (i.e. not `absolute`) */
-    }
+#wrapper {
+    width: 0;
+    height: 0;
+    position: relative;
+    /* Origin of coordinates for lines, and scrolled content (i.e. not `absolute`) */
+}
 
-    :deep(.el-radio__inner) {
-        width: 32px;
-        height: 32px;
-    }
+:deep(.el-radio__inner) {
+    width: 32px;
+    height: 32px;
+}
 
-    :deep(.el-radio__input.is-checked .el-radio__inner::after) {
-        width: 15px;
-        height: 15px;
-    }
+:deep(.el-radio__input.is-checked .el-radio__inner::after) {
+    width: 15px;
+    height: 15px;
+}
 
-    :deep(.el-radio-group) {
-        width: 100%;
-        justify-content: space-between;
-        margin: 4px;
-    }
+:deep(.el-radio-group) {
+    width: 100%;
+    justify-content: space-between;
+    margin: 4px;
+}
 </style>