var DialogObject = { HintWinHander: null, MoveState: 0, //移动状态。0 停止移动 1 开始移动 2 移动中 //消息提示窗口。该类型窗口在未关闭时,多次调用时会复用原窗口 OpenHint: function(container, opt) { if (this.HintWinHander == null) this.HintWinHander = this.Open(container, opt); return this.HintWinHander; }, Open: function(container, opt) { var newcontainer = container.clone(); $("body").append(newcontainer); newcontainer.attr("id", "dig_" + new Date().getTime()); newcontainer.find(".fa-times,.dlg_close").off("click").on("click", function() { var container = $(this).parents(".site_device_list"); if (container.css("z-index") == 10000) $(".clearn").hide(); container.remove(); }); newcontainer.on("click", ".layui-tools button", function() { if ($(this).hasClass("cancel")) $(this).parents(".site_device_list").find(".fa-times").trigger('click'); else if ($(this).hasClass("confirm")) { if (opt != null && opt.onSave != null) { opt.onSave(newcontainer, opt.para, this); } } }); if (opt != null && opt.size != null) { newcontainer.css({ width: opt.size[0], height: opt.size[1], }); } var total_height = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); $(".clearn").show().css("height", total_height + "px"); newcontainer.show(); var left = parseInt(newcontainer.width() / 2); left = -left; var top = parseInt(newcontainer.height() / 2); top = -top; newcontainer.css({ "margin-left": left + "px", "margin-top": top + "px" }); newcontainer.find(".caption").width(newcontainer.width() - 8).on("mousedown", function(e) { newcontainer.attr("MoveState", 1); var oldpageX = e.pageX; var oldpageY = e.pageY; var oldLeft = parseInt(newcontainer.css("left")); var oldTop = parseInt(newcontainer.css("top")); newcontainer.on("mousemove", function(ev) { // console.log(e) if (newcontainer.attr("MoveState") == "1") { newcontainer.css({ "left": ev.pageX - oldpageX + oldLeft + "px", "top": ev.pageY - oldpageY + oldTop + "px" }) } }) }).on("mouseup", function() { newcontainer.attr("MoveState", 0); newcontainer.off("mousemove"); }); if (opt != null && opt.callback != null) { opt.callback(newcontainer, opt.para); } return newcontainer; }, Close: function($ele) { if ($ele != null) { $(".clearn").hide(); $ele.hide(); } else { $(".layout_dialog,.clearn").hide(); } }, Msg: function(msg, opt) { var ind = layer.msg(msg, opt); $("#layui-layer" + ind).css("z-index", Global.GetSeqNext()); } } var hRate = 1; var wRate = 1; var PoliceObject = { IntervalTime: 1000 * 60 * 5, //每5分钟刷新一次页面 LoddingText: "数据加载中...", MessageObject: null, AreaID: 0, //当前站/区域ID ScdID: 0, //当前SCDID CurentMark: "", AreaInfo: {}, MainHeight: 0, //页页内容区高度 Tips: { tips: [3, "#f47920"], area: ['400', "auto"] }, CurentCompCheckID: "", //当前用户正在一致性校验的记录ID CurentParseScdName: "", //当前用户正在解析的SCD名称 TempScdID: "", //临时查看的scdID ScdList: [], //scd列表 VoltageLevel: [], //电压等级 AreaList: [], //间隔列表 DeviceType: [], //装置类型列表 IedList: [], //IED装置列表 IedTypeMap: {}, OnInited: null, //初始化完成事件 NetWork_ApNodes: null, init: function() { //显示用户账号 var userInfo = localStorage.getItem("userinfo"); userInfo = JSON.parse(userInfo); $("#login_user_name").html(userInfo["name"]); $("#login_user_role").html("[" + userInfo["rolename"] + "]"); var main_width = $(".monitor_center").width(); var screen_width = document.documentElement.clientWidth; wRate = (screen_width / 1920).toFixed(2); var screen_height = document.documentElement.clientHeight; hRate = (screen_height / 1080).toFixed(2); $("#left_area_item").prevAll().css("margin-bottom", 20 * hRate + "px"); PoliceObject.MainHeight = Math.ceil(screen_height - 65 * hRate); $(".body_content,#right_area,#container_map").height(PoliceObject.MainHeight); // $("body").append(''); //scd树初始化 $("#scd_tree_list").css({ "height": PoliceObject.MainHeight - (70 * hRate) + "px" }); $("#scd_tree_list>.title:first").css({ "height": 4 + "rem", "line-height": 4 + "rem" }); $("#scd_tree_list>.list:first").css({ "height": 66 + "rem" }).slimScroll({ height: 62 + "rem", width: "98%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); $("body").on('click', function() { if ($(this).attr("id") != "scd_info" && $(this).parent().attr("id") != "scd_info") { $("#scd_list").addClass("hidden"); $("#scd_info").find("i").attr("class", "fa fa-caret-up"); } if ($(this).attr("id") != "stationname" && $(this).parent().attr("id") != "stationname") { $("#station_list").addClass("hidden"); $("#stationname").find("i").attr("class", "fa fa-caret-up"); } if ($(this).attr("id") != "voltage_level_select" && $(this).parent().attr("id") != "voltage_level_select") { $("#voltage_level_list").addClass("hidden"); $("#voltage_level_select").find("i").attr("class", "fa fa-caret-up"); } if ($(this).attr("id") != "area_select" && $(this).parent().attr("id") != "area_select") { $("#area_list").addClass("hidden"); $("#area_select").find("i").attr("class", "fa fa-caret-up"); } if ($(this).attr("id") != "device_type_select" && $(this).parent().attr("id") != "device_type_select") { $("#device_type_list").addClass("hidden"); $("#device_type_select").find("i").attr("class", "fa fa-caret-up"); } }); //初始化搜索事件 $(document).on("click", function() { $("#search_result").html("").addClass("hidden"); $("#fulltext_search_condition .datelist").addClass("hidden"); }); //全局关闭窗口事件 $(".layout_close").off("click").on("click", function() { var container = $(this).parents(".layout_dialog"); container.hide(); if (container.css("z-index") == 10000) $(".clearn").hide(); }); $("#area_list>div:eq(0)").slimScroll({ height: (300 * hRate) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); $("#site_device_list").css({ "bottom": 30 * hRate + "px", "left": 480 * wRate + "px", "height": 400 * hRate + "px", "width": 360 * wRate + "px" }).children(".dataitemlist").slimScroll({ height: (360 * hRate) + "px", width: 340 * wRate + "px", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); //点击顶端菜单 $(".main_bar>div").off("click").on("click", function() { var mark = $(this).attr("mark"); if (mark == null || mark == "") return; PoliceObject.CurentMark = mark; var oldActiveEle = $("#main_bar .app_active").removeClass("app_active").addClass("app_default"); $(this).addClass("app_active"); if (mark == "elevator") { //智感梯间 if ($("#container_fulltext_search").is(":visible")) $("#container_fulltext_search").addClass("hidden"); PoliceObject.GoFloor(0, ""); } else if (mark == "search") { $("body").css("background-color", "#EEF3FF"); PoliceObject.GoSearch(); } }); $("#search_panel").show(); this.LoadOrgConfig(); this.LoadNoreadNoitce(); //初始化MQTT //初始订阅全局人脸搜索结果主题 var face_mqtt = new MqttClient(null, null, ["/jujutong/scd/#"], function() { console.log("=====订阅成功==="); }); //定义接收消息处理过程 face_mqtt.AddReceivedMqttMessage("/jujutong/scd/", function(topic, message) { console.log(topic + ":" + message) //scd文件解析通知 ///jujutong/scd/parse/30000012:{"msg":"","name":"750kVQXB.scd","node":"load-file","rootid":"30000012","state":"0"} ///jujutong/scd/parse/30000012:{"msg":"","name":"750kVQXB.scd","node":"load-file","rootid":"30000012","state":"1"} ///jujutong/scd/parse/30000012:{"load":"0","msg":"","name":"750kVQXB.scd","node":"write-db","rootid":"30000012","state":"0","total":"925515"} ///jujutong/scd/ruleparse/30000012:节点LN属性prefix值最大长度不能超过6,当前属性值[QGD2ILB]长度无效! ///jujutong/scd/parse/30000012:{"load":"5000","msg":"","name":"750kVQXB.scd","node":"write-db","rootid":"30000012","state":"2","total":"925515"} ///jujutong/scd/parse/30000012:{"load":"925515","msg":"","name":"750kVQXB.scd","node":"write-db","rootid":"30000012","state":"1","total":"925515"} ///jujutong/scd/comp/3:{"state":0} ///jujutong/scd/notice/17:{"Id":0,"StationId":827,"Caption":"有新的SCD文件任务【SCD签入】需要您发布。","NoticeType":100,"SenderName":"李领","SenderTime":"2022-10-30 20:36:26","Content":"","RevId":17,"ReadFlag":0,"ReadTime":"","Cr":"","Ct":""} ///jujutong/scd/iedblockrelations/30000012/CB7522:{"code":1} ///jujutong/scd/iedblockinputs/30000012/CB7522/IB7522A:{"code":1} if (topic.indexOf("/jujutong/scd/notice") > -1) { PoliceObject.LoadNoreadNoitce(); return; } if (topic.indexOf("/jujutong/scd/parse") > -1) { if (topic.indexOf("error") > 0) { layer.msg(message, { icon: Global.ICON_ERROR }) return; } var jsonobj = JSON.parse(message); //PoliceObject.CurentParseScdName:当前需要解析有SCD名称 //如果是签入操作,该变量值由FlowObject对的签入第一步骤提交时设置 if (PoliceObject.CurentParseScdName != jsonobj.name && PoliceObject.AreaID != jsonobj.stationid) { return; } if (DialogObject.HintWinHander == null) { DialogObject.OpenHint($("#dialog_public"), { size: ["40rem", "20rem"], para: { "scdname": jsonobj.name }, callback: function(win, para) { win.find(".node_area").remove(); win.find(".caption>b").html("SCD解析"); var $dataitemlist = win.find(".dataitemlist").html("
"); var showH = $dataitemlist.height() - 25; $dataitemlist.slimScroll({ height: showH + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); $dataitemlist.height(showH - 30); } }); } var msgHintEle = DialogObject.HintWinHander.find(".process_msg_hint"); if (jsonobj.state == "1") { var message = ""; if (jsonobj.node == "load-file") message = Tools.OkIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "加载完成!"; else if (jsonobj.node == "write-db") message = Tools.OkIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "结构解析入库完成!"; else if (jsonobj.node == "check-file") message = Tools.OkIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "语法校验完成!"; else if (jsonobj.node == "crc-file") message = Tools.OkIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "CRC校验完成!"; Tools.Loading2Ok(msgHintEle); msgHintEle.append("
" + message + "
"); if (typeof(FlowObject) == "object") { //当前处于签出签入界面时,自动刷新数据列表 FlowObject.GetScdInoutRecord(1, 10, MakeScdInoutRecord); return; } if (typeof(LoadStationFiles) == "function") { //当前处于配置文件界面时,自动刷新数据列表 //需要延迟一点点时间执行,否则获取的数据状态可能不对 setTimeout(function() { LoadStationFiles(1, 20); }, 1000); return; } } else if (jsonobj.state == "0") { var message = ""; if (jsonobj.node == "load-file") message = Tools.LoadingIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "开始加载..."; else if (jsonobj.node == "write-db") message = Tools.LoadingIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "正在结构解析中,时间可能会稍长,请耐心等待完成... [总节点数:" + jsonobj.total + " 已解析:-]"; else if (jsonobj.node == "check-file") message = Tools.LoadingIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "正在进行语法校验,请耐心等待完成...]"; else if (jsonobj.node == "crc-file") message = Tools.LoadingIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "正在进行CRC校验,请耐心等待完成...]"; msgHintEle.append("
" + message + "
"); } else if (jsonobj.state == "2") { msgHintEle.find("#write-db-parse-count").html(jsonobj.load); } return; } if (topic.indexOf("/jujutong/scd/ruleparse") > -1) { var jsonobj = JSON.parse(message); //PoliceObject.CurentParseScdName:当前需要解析有SCD名称 //如果是签入操作,该变量值由FlowObject对的签入第一步骤提交时设置 if (jsonobj.scdid == null || PoliceObject.ScdID != jsonobj.scdid) { return; } if (jsonobj.code == 0) { layer.msg(jsonobj.msg, { icon: Global.ICON_ERROR }); return; } if (DialogObject.HintWinHander == null) { DialogObject.OpenHint($("#dialog_public"), { size: ["40rem", "20rem"], para: { "scdname": jsonobj.name }, callback: function(win, para) { win.find(".caption>b").html("SCD校验"); var $dataitemlist = win.find(".dataitemlist").html("
" + message + "
"); $dataitemlist.slimScroll({ height: ($dataitemlist.height() - 5) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); } }); } var msgHintEle = DialogObject.HintWinHander.find(".process_msg_hint"); if (jsonobj.state == "1") { var message = Tools.OkIcon() + new Date().Format("hh:mm:ss") + "===SCD文件校验完成!"; Tools.Loading2Ok(msgHintEle); msgHintEle.append("
" + message + "
"); } else if (jsonobj.state == "0") { var message = Tools.LoadingIcon() + new Date().Format("hh:mm:ss") + "===SCD文件开始进行校验..."; msgHintEle.append("
" + message + "
"); } return; } if (topic.indexOf("/jujutong/scd/comp") > -1) { var jsonobj = JSON.parse(message); if (PoliceObject.CurentCompCheckID != jsonobj.id) { return; } var msgHintEle = DialogObject.HintWinHander == null ? null : DialogObject.HintWinHander.find(".process_msg_hint"); //SCD文件一致性对比完成 var state = jsonobj.state; if (state == "1") { var btn_scdcomp_start = $(".dialog_public .func_scdcomp_start"); if (btn_scdcomp_start.length > 0) { if ("1" == $.trim(btn_scdcomp_start.attr("comping"))) { layer.closeAll(); layer.msg("SCD一致性校验完成", { icon: 1 }); btn_scdcomp_start.attr("comping", "0"); PoliceObject.LoadScdCompList(); return; } } Tools.Loading2Ok(msgHintEle); var message = Tools.OkIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "一致性校验完成!"; if (msgHintEle != null) msgHintEle.append("
" + message + "
"); } else { var message = Tools.LoadingIcon() + new Date().Format("hh:mm:ss") + "===SCD文件" + jsonobj.name + "开始进行一致性校验..."; if (msgHintEle != null) msgHintEle.append("
" + message + "
"); } } if (topic.indexOf("/jujutong/scd/delete") > -1) { //清除SCD文件操作 var jsonobj = JSON.parse(message); layer.closeAll(); if (jsonobj.state == 0) layer.msg("SCD文件[" + jsonobj.scd_name + "]及相关数据正在被" + jsonobj.user + "删除中...", { icon: Global.ICON_LOADING, time: 0 }) else { layer.msg("SCD文件[" + jsonobj.scd_name + "]及相关数据已被" + jsonobj.user + "完全删除!", { icon: Global.ICON_OK }); if (typeof(LoadStationFiles) == "function") { //当前处于配置文件界面时,自动刷新数据列表 //需要延迟一点点时间执行,否则获取的数据状态可能不对 setTimeout(function() { LoadStationFiles(1, 20); }, 1000); return; } } return; } if (topic.indexOf("/jujutong/scd/iedblockrelations") > -1) { var jsonobj = JSON.parse(message); var iedname = jsonobj["ied_name"]; //数据块关系解析完成消息 var v_win = $(".dialog_public[ied_name='" + iedname + "']"); if (v_win.length == 0) return; var curBtn = v_win.find("#ied_list_tools .layui-this"); if (curBtn.attr("ind") == "2") { //当前正在查看输入输出控制块信息 console.log("重新加载" + iedname + "输入输出控制块信息"); //PoliceObject.LoadIedCtrlRelation(PoliceObject.IedList[iedname]); setTimeout(function() { curBtn.trigger("click"); }, 500); } return; } if (topic.indexOf("/jujutong/scd/iedblockinputs") > -1) { //虚端子关系解析完成消息 return; } if (message != "" && message.substring(0, 1) == "{") { var jsonobj = JSON.parse(message); } }); if (PoliceObject.OnInited != null) PoliceObject.OnInited(); //初始化完成事件 }, OpenToXml: function(scdid, lineno, desc) { //查看指定行数的scd源xml文件 if (typeof lineXmlDig != "undefined") DialogObject.Close(lineXmlDig); lineXmlDig = DialogObject.Open($("#dialog_public"), { size: ["70rem", "65rem"], para: { "title": "SCD源XML查看", "scdid": scdid, "lineno": lineno, "desc": desc }, callback: function(win, para) { if (typeof lineXmlDig != "undefined") win.css("margin-left", "0px"); win.find(".caption>b").html(para.title); var winContent = win.find(".dataitemlist").css("cssText", "padding-top: 0rem !important;").html('
' + para.desc + '
正在加载数据中
').height(win.height() - win.find(".caption").height() - win.find(".footer").height()); $.getJSON(Global.AccessUrl + "/api/screen/scd/line/sourcexml", { "scd_id": para.scdid, "lineno": para.lineno }, function(data) { if (data.code != 0) { win.find(".dataitemlist>div:last").html(data.msg); return } var linestr = []; var topLine = 0; for (var i = 0; i < data.data.length; i++) { var linechars = data.data[i].indexOf(" ") var lno = data.data[i].substring(0, linechars) if (para.lineno == lno) { topLine = i + 1 if (topLine > 25) topLine = topLine - 15; } linestr.push('
' + lno + ' ' + data.data[i].substring(linechars).replace(//g, '>') + '
'); } win.find(".dataitemlist>div:last").height(winContent.height() - win.find(".dataitemlist>div:first").height()).html(linestr.join('')).scrollTop(topLine * win.find(".dataitemlist>div:last>div:eq(0)").height()) }) } }); }, toScd: function(stationid, scddid, scdname, scdpath) { //查看指定scd文件 window.localStorage.setItem("PoliceObject.TempScdID", scddid); window.localStorage.setItem("PoliceObject.TempAreaID", stationid); window.localStorage.setItem("PoliceObject.TempScdName", scdname); window.localStorage.setItem("PoliceObject.AreaID", stationid); window.location.href = 'scd_o.html'; }, //加载配置的单位名称 LoadOrgConfig: function() { //获取配置的单位名称 $.getJSON(Global.AccessUrl + "/api/getSysParamList", { "param_name": "orgname" }, function(r) { if (r.code != 0 || r.data == null) return; $("#orgname").html(r.data[0].param_value); }); }, //加载未读通知提醒 LoadNoreadNoitce: function() { $.getJSON(Global.AccessUrl + "/api/notice/list", { "isread": 0 }, function(r) { if (r.code != 0 || r.data == null) return; changeBell(r.data.length); }); var openNoticeWin = function() { $.getJSON(Global.AccessUrl + "/api/notice/list", { "isread": 0 }, function(r) { if (r.code != 0 || r.data == null) return; changeBell(r.data.length); if (r.data.length == 0) { return; } DialogObject.Open($("#dialog_public"), { size: ["81rem", "40rem"], para: { "title": "", "list": r.data }, callback: function(win, para) { win.find(".caption>b").html("最新提醒"); win.find(".node_area").remove(); var h = (win.height() - win.find(".caption").height() - win.find(".footer").height()); var dataitemlist = win.find(".dataitemlist").height(h + "px").html("
"); dataitemlist.children(".notice_header").html('时间变电站提醒内容发布者操作'); var noticeLst = []; for (var i = 0; i < para.list.length; i++) { noticeLst.push("
" + para.list[i].sender_time + "" + para.list[i].station_name + "" + para.list[i].caption + "" + para.list[i].sender_name + "已读
"); } var notice_list = dataitemlist.children(".notice_list").html(noticeLst.join("")); notice_list.slimScroll({ height: (h - dataitemlist.children(".notice_header").height() - 5) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); notice_list.find(".btn").off().on('click', function() { var row = $(this), noticeid = row.attr("noticeid"); $.post(Global.AccessUrl + "/api/notice/read", { "id": noticeid }, function(r) { layer.msg("操作成功!"); row.parent().parent().remove(); if (notice_list.find(".notice_item").length == 0) { win.remove(); changeBell(0); } else { changeBell(-1); } }); }); } }); }); } var changeBell = function(numer) { var menu = $(".monitor_center .header .header_background>div:first"); var noitcemenu = menu.find(".app_default.notice"); if (numer == null || numer == 0) { noitcemenu.prev().remove(); noitcemenu.remove(); return; } //fa-bell if (noitcemenu.length == 0) { $('
|
' + '' + numer + '' + '
').insertBefore(menu.children(".app_default:eq(2)")); noitcemenu = menu.find(".app_default.notice"); noitcemenu.off().on('click', function() { openNoticeWin(); }); } else { if (numer == -1) { //当前值减1 numer = noitcemenu.find(".notice_number").text() * 1 - 1; } //最多显示99的数量 noitcemenu.find(".notice_number").html(numer > 99 ? 99 : numer); } } //openNoticeWin(); }, //加载装置类型 LoadDeviceType: function(clickcallback) { $.getJSON(Global.AccessUrl + "/api/scd/ied/typelist", { "scd_id": PoliceObject.ScdID }, function(r) { if (r.code != 0 || r.returncode == 500 || r.data == null) return; PoliceObject.DeviceType = r.data; var container_map_ied = $("#container_map_ied"); var tarEle = container_map_ied.find("#device_type_select").off().on('click', function(e) { e.stopPropagation(); var t = $(this), t1 = $("#device_type_list"); t1.removeClass("hidden").css({ top: t.offset().top + t.height() + 10, left: t.offset().left + t.width() - t1.width() }); $(this).find("i").attr("class", "fa fa-caret-down"); }); //设备类型采用code,需要把id删除去除 for (var i = 0; i < r.data.length; i++) { delete(r.data[i]["id"]); } $("#device_type_list").html(template('select_item_tpl', { data: [{ "id": "", "name": "全部" }].concat(r.data) })).find(".station_list_item").off().on('click', function() { var v = $(this).attr("value"); tarEle.attr("vid", v).children(".filter_text").html("装置类型:" + $(this).text()); tarEle.find("i").attr("class", "fa fa-caret-up"); if (clickcallback != null) clickcallback(v, $(this).text()); }); }); }, //加载变电站列表 LoadStationList: function(loadcallback, clickcallback) { //获取变电站列表。后台已经根据当前登录人员做了权限过滤 $.getJSON(Global.AccessUrl + "/api/basic_area/list", { "pid": "0" }, function(r) { if (r.code != 0 || r.data == null) return; var stationname = $("#stationname").html(r.data[0].area_name); if (loadcallback != null) loadcallback(r); if (r.data.length > 0) { PoliceObject.AreaID = r.data[0].id; //当前人员有权限的站超过1个时,才显示选择列表 /* stationname.append(''); stationname.off().on('click', function(e) { //点击站名时,显示变电站下拉列表 e.stopPropagation(); $("#station_list").removeClass("hidden"); $(this).find("i").attr("class", "fa fa-caret-down"); });*/ //生成站列表元素 var station_list = $("#scd_tree_list .list").html(template("station_list_item_tpl", r)); /*station_list.css({ top: stationname.offset().top + stationname.height() + 10, left: stationname.offset().left + stationname.width() - station_list.width() });*/ station_list.find(".station_list_item").off().on('click', function() { $("#scd_tree_list .list .active").removeClass("active"); $(this).addClass("active"); //选择某个站时,加载该站的scd信息 var stationid = $(this).attr("stationid"); PoliceObject.AreaID = stationid; window.localStorage.setItem("PoliceObject.AreaID", stationid); //stationname.html($(this).text() + ''); if (clickcallback != null) clickcallback(stationid); }); var cur_station_id = $.trim(window.localStorage.getItem("PoliceObject.AreaID")); if (cur_station_id != "") { station_list.find(".station_list_item[stationid='" + cur_station_id + "']").trigger('click'); } else { //默认选择第一个 station_list.find(".station_list_item:first").addClass("active").trigger('click'); } } }); }, //加载电压等级列表 LoadVoltageLevelSelect: function(stationid, clickcallback) { var tmp_load = function(r) { //绑定电压等级选择事件 var container_map_ied = $("#container_map_ied"); var tarEle = container_map_ied.find("#voltage_level_select").off().on('click', function(e) { e.stopPropagation(); var t = $(this), t1 = $("#voltage_level_list"); t1.removeClass("hidden").css({ top: t.offset().top + t.height() + 10, left: t.offset().left + t.width() - t1.width() }); $(this).find("i").attr("class", "fa fa-caret-down"); }); $("#voltage_level_list").html(template('select_item_tpl', { data: [{ "id": "", "name": "全部" }].concat(r) })).find(".station_list_item").off().on('click', function() { var tarEle = $("#voltage_level_select"); var v = $(this).attr("value"); tarEle.attr("vid", v).children(".filter_text").html("电压等级:" + $(this).text()); tarEle.find("i").attr("class", "fa fa-caret-up"); $("#area_select").attr("vid", "").children(".filter_text").html("间隔"); $("#device_type_select").attr("vid", "").children(".filter_text").html("装置类型"); //过虑所选择的电压等级的间隔 var area_select = $("#area_list"); if (v == "") area_select.find(".station_list_item").removeClass("hidden"); else { for (var i = 0; i < PoliceObject.AreaList.length; i++) { var tarItemEle = area_select.find(".station_list_item[value='" + PoliceObject.AreaList[i].id + "']"); if (PoliceObject.AreaList[i].voltage_level == v) { tarItemEle.removeClass("hidden"); } else { tarItemEle.addClass("hidden"); } } } if (clickcallback != null) clickcallback(v, $(this).text()); }); if (container_map_ied.find(".scd_area").length > 0) { //填充电压等级-间隔列表 var scdArea = container_map_ied.find(".scd_area").html(template('voltage_level_item_tpl', { data: PoliceObject.VoltageLevel })); scdArea.slimScroll({ height: $("#container_map .scd_main").height() - $("#container_map .scd_main .scd_filter").height() - $("#container_map .scd_main .scd_filter").css("margin-top").replace("px", "") * 1, width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); //填充间隔列表 PoliceObject.LoadAreaSelect(PoliceObject.ScdID, function(v, text) { PoliceObject.OpenShowIedList(text, { "area_id": v, "voltage_level_id": "", "device_type_id": "" }); }); } if (container_map_ied.find("#network").length > 0) { //console.log("================PoliceObject.GetSubNetwork") //填充网络结构 //PoliceObject.GetSubNetwork(); } } if (PoliceObject.VoltageLevel == null || PoliceObject.VoltageLevel.length == 0) { //加载电压等级 $.getJSON(Global.AccessUrl + "/api/getGlobalCode", { "pcode": "voltage_level" }, function(r) { if (r.code != 0 || r.returncode == 500 || r.data == null) return; PoliceObject.VoltageLevel = r.data; tmp_load(PoliceObject.VoltageLevel); }); } else { tmp_load(PoliceObject.VoltageLevel); } }, //加载间隔列表 LoadAreaSelect: function(scdid, clickcallback) { if (PoliceObject.ScdID == 0) return; var tmp_load = function(r) { var container_map_ied = $("#container_map_ied"); var tarEle = container_map_ied.find("#area_select").off().on('click', function(e) { e.stopPropagation(); var t = $(this), t1 = $("#area_list"); t1.removeClass("hidden").css({ top: t.offset().top + t.height() + 10, left: t.offset().left + t.width() - t1.width() }); }); $("#area_list>div>div:eq(0)").html(template('select_item_tpl', { data: [{ "id": "", "name": "全部" }].concat(PoliceObject.AreaList) })).find(".station_list_item").off().on('click', function() { var v = $(this).attr("value"); tarEle.attr("vid", v).children(".filter_text").html("间隔:" + $(this).text()); tarEle.find("i").attr("class", "fa fa-caret-up"); $("#device_type_select").attr("vid", "").children(".filter_text").html("装置类型"); if (clickcallback != null) clickcallback(v, $(this).text()); }); container_map_ied.find(".scd_area .voltage_level_item").each(function() { if (PoliceObject.AreaList == null) return; //显示每个电压等级下属的间隔 var $t = $(this), volid = $t.attr("itemid"); var showDiv = $t.find(".voltage_level_area").html(""); for (var i = 0; i < PoliceObject.AreaList.length; i++) { var item = PoliceObject.AreaList[i]; if (volid == item.voltage_level) { showDiv.append('' + item.name + '') } } var areaLen = showDiv.find(".voltage_level_area_item").length; if (areaLen == 0) { //移除没有ied的间隔电压等级 $t.remove(); //移除电压等级列表项 $("#voltage_level_list .station_list_item[value=" + volid + "]").remove(); return } if (areaLen > 7) { //如果间隔超过2排时,需要动态增加区域高度.显示区域默认高度只能显示2排 var trowH = Math.ceil(areaLen / 7) * 12 * hRate; showDiv.css("height", trowH + "rem"); showDiv.prev().css({ "height": trowH + "rem", "line-height": (trowH + 1) + "rem" }); showDiv.parent().css("height", trowH + "rem"); } /* showDiv.slimScroll({ height: (14 * hRate) + "rem", width: "88%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" });*/ }); container_map_ied.find(".scd_area .voltage_level_area_item").off().on("click", function() { //点击间隔,查看该间隔下的IED var $t = $(this); var tit = $t.parent().prev().text() + "—" + $t.text(); PoliceObject.OpenShowIedList(tit, { "area_id": $t.attr("area_id") }); }); } if (this.AreaList == null || this.AreaList.length == 0) { //获取当前变电站的间隔列表 $.getJSON(Global.AccessUrl + "/api/scd/area/list", { "scd_id": scdid }, function(r) { if (r.code != 0) { layer.msg("间隔信息获取失败:" + r.msg); return; } PoliceObject.AreaList = r.data; tmp_load(r.data); }) } else { tmp_load(this.AreaList); } }, CheckScdID: "", CheckScdTaretID: "", CheckTools: function(type, title, scdid, scdpath, scdname) { if (scdid == "0") { layer.msg("该SCD文件还未解析!", { icon: Global.ICON_ERROR }); return; } var winSize = ["150rem", "65rem"]; if (type == "scd") { //scd一致性比较 DialogObject.Open($("#dialog_public"), { size: ["130rem", "65rem"], para: { "title": title, "type": type, "scdpath": scdpath, "scdname": scdname }, callback: function(win, para) { win.find(".caption>b").html(para.title); win.find(".dataitemlist").css("cssText", "padding-top: 1rem !important;").html(template('checktools_' + para.type + '_tpl', {})).height(win.height() - win.find(".caption").height() - win.find(".footer").height()); eval("PoliceObject.checktools_" + para.type + "(win)"); } }); return; } if (type == "cid" || type == "cid_scd" || type == "ccd" || type == "ccd_scd") { //非scd一致性比较 //开始CID校验 $.post(Global.AccessUrl + "/api/scd/comp/start", { station_id: PoliceObject.AreaID, source_scd_id: scdid, ids: scdpath, type: type }, function(r) { layer.closeAll(); if (r.code != 0) { layer.msg("操作失败:" + r.msg, { icon: Global.ICON_ERROR }); return; } //$("#comp_ied_list .ied_data_list").html(r.data.info.iedname + "
" + (r.data.info.ieddesc || "")); //$("#comp_ied_result_show #node_tree>div:first>b").html(r.data.info.f1.filename + "(" + r.data.info.f1.ct + ")"); //$("#comp_ied_result_show #node_tree>div:last>b").html(r.data.info.f2.filename + "(" + r.data.info.f2.ct + ")"); if (r.data.list == null || r.data.list.length == 0) { layer.msg("当前2个对比文件无差异", { "icon": Global.ICON_HINT }) return; } r.data["file_type"] = type; PoliceObject.CheckTools_Scd_Comp_ied_Detail(0, scdid, "", "", 'u', r.data); }); return; } if ($.trim(scdid) == "" && $.trim(scdpath) != "" && $.trim(scdname) != "") { $.getJSON(Global.AccessUrl + "/api/screen/scd/info", { 'scdpath': scdpath, 'scdname': scdname }, function(r) { if (r.code != 0) { layer.msg(r.msg); return; } if (r.data == null) { layer.msg("无效的SCD名称和路径"); return; } PoliceObject.CheckScdID = r.data.id; DialogObject.Open($("#dialog_public"), { size: ["150rem", "65rem"], para: { "title": r.data.station_name + "—" + r.data.scd_name + "—" + title, "type": type, "scdpath": scdpath, "scdname": scdname, "info": r.data }, callback: function(win, para) { win.find(".caption>b").html(para.title); if (para.info.is_parse == 1) { win.find(".dataitemlist").html(template('checktools_' + para.type + '_tpl', {})).height(win.height() - win.find(".caption").height() - win.find(".footer").height()); eval("PoliceObject.checktools_" + para.type + "(win)"); } else { win.find(".dataitemlist").html(Tools.HintText("文件" + para.scdname + "正在解析中...,稍候重试")); } } }); }); } else if (scdid != null && scdid != "") { this.CheckScdID = scdid; PoliceObject.ScdID = scdid; } else { this.CheckScdID = PoliceObject.ScdID; } if (type != "scd" && (this.CheckScdID == null || this.CheckScdID == "")) { layer.msg("请选择一个SCD文件", { "icon": Global.ICON_ERROR }) return; } if (type == "crc") { winSize = ["100rem", "60rem"]; } $.getJSON(Global.AccessUrl + "/api/screen/scd/info", { "scd_id": this.CheckScdID }, function(jsondata) { if (jsondata.code != 0) { layer.msg(jsondata.msg); return; } DialogObject.Open($("#dialog_public"), { size: winSize, para: { "title": jsondata.data.station_name + "—" + jsondata.data.scd_name + "—" + title, "type": type, "scdpath": jsondata.data.path, "scdname": jsondata.data.scd_name }, callback: function(win, para) { win.find(".caption>b").html(para.title); win.find(".dataitemlist").html(template('checktools_' + para.type + '_tpl', {})).height(win.height() - win.find(".caption").height() - win.find(".footer").height()); eval("PoliceObject.checktools_" + para.type + "(win)"); } }); }) }, checktools_scl: function(win) { var tree = win.find("#node_tree .ztree"); var dataitemlistH = win.find(".dataitemlist").height() - win.find(".dataitemlist").css("padding-top").replace("px", "") * 1; tree.slimscroll({ height: (dataitemlistH - 10) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); var selectedIedName = ""; var selectedNodeName = ""; var selectedNodeId = ""; var stat = win.find("#content_div .stat"); var pagebar = win.find("#content_div .pagebar"); var datalist = win.find("#content_div .datalist"); datalist.slimscroll({ height: (dataitemlistH - stat.height() - pagebar.height() - win.find(".datalist_header").height() - 10) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); win.find(".func_scdcomp_exportexcel").off().on('click', function() { var isall = $(this).attr("isall"); if (isall == "1") { //导出所有结果 Tools.ExpExcel({ "code": "scl-check-result", "caption": "SCL校验结果", "expcols": "line_no,CREATED_TIME,attr_name,attr_desc,alert_level,parse_result,apply_standard,apply_standard_no", "expcolnames": "行号,日期,装置名称,装置描述,等级,校验结果内容,应用标准,标准条款", "scd_id": PoliceObject.CheckScdID, }); return } //导出当前节点结果 Tools.ExpExcel({ "code": "scl-check-result", "caption": "SCL校验结果", "expcols": "line_no,CREATED_TIME,attr_name,attr_desc,alert_level,parse_result,apply_standard,apply_standard_no", "expcolnames": "行号,日期,装置名称,装置描述,等级,校验结果内容,应用标准,标准条款", "scd_id": PoliceObject.CheckScdID, "level": stat.find("span[alert_level].alert_level_active").attr("alert_level"), "ied_name": selectedIedName, "node_name": selectedNodeName, "node_id": selectedNodeId }); }); var iedHint = false; var sumresult = {}; var arearesult = {}; var vlresult = {}; //电压等级提示 var topIedHintType = ""; //最高级的校验结果类型,默认为hint var topSCLHintType = ""; $.getJSON(Global.AccessUrl + "/api/scd/check/sum/result", { scd_id: PoliceObject.CheckScdID }, function(r) { if (r.code != 0) { layer.msg("汇总校验结果错误:" + r.msg); return; } if (r.data == null) { r.data = []; } Global.Ztree.Init(tree, { url: Global.AccessUrl + "/api/screen/scd/checktools/tree?scd_id=" + PoliceObject.CheckScdID, idKey: "id", pidKey: "pid", nameKey: "title", AjaxParam: ["datatype"], childrenNodeIcon: 'fa-file-code-o', callback: { onClick: function(event, treeId, treeNode) { //console.log(treeNode) paginationLoaded = false; selectedIedName = treeNode.attr_name; selectedNodeName = treeNode.datatype; selectedNodeId = treeNode.attr_name || treeNode.id; stat.find("span[alert_level].alert_level_active").removeClass("alert_level_active"); loadSclCheckResult(1, 20); }, onAsyncSuccess: function(event, treeId, treeNode, msg) { } }, DiyDom: function(treeId, treeNode) { var aObj = $("#" + treeNode.tId + "_a"); //console.log(treeNode) //aObj.append("5"); var curNodeId = treeNode.id; aObj.append(""); } }); }); //获取当前scd所有的结果 var paginationLoaded = false; var loadSclCheckResult = function(pageno, pagesize) { $.getJSON(Global.AccessUrl + "/api/scd/check/stat/level", { "scd_id": PoliceObject.CheckScdID, "ied_name": selectedIedName, "node_name": selectedNodeName, "node_id": selectedNodeId }, function(r1) { $("#content_div .stat>span>span[alert_level] b").html("0"); if (r1.code != 0) { layer.msg("分类统计校验信息错误:" + r1.msg); return; } var all = 0; if (r1.data == null) { layer.msg("校验结果正在统计中,请稍候重试!"); return; } for (var i = 0; i < r1.data.length; i++) { var item = r1.data[i]; all += item.cnt * 1; var alertlevel = item["alert_level"]; stat.find("span[alert_level='" + alertlevel + "']>b").html(item.cnt); } stat.find("span[alert_level='']>b").html(all); stat.find("span[alert_level]").off().on("click", function() { var t = $(this); t.parent().find(".alert_level_active").removeClass("alert_level_active"); t.addClass("alert_level_active"); paginationLoaded = false; loadSclCheckResult(1, 20, $(this).attr("alert_level")); }); }); layer.msg("正在查询校验信息中...", { time: 30000 }); $.getJSON(Global.AccessUrl + "/api/scd/check/resultlist", { "scd_id": PoliceObject.CheckScdID, "pageno": pageno, "pagesize": pagesize, "level": stat.find("span[alert_level].alert_level_active").attr("alert_level"), "ied_name": selectedIedName, "node_name": selectedNodeName, "node_id": selectedNodeId }, function(r) { if (r.code != 0) { layer.msg("查询校验信息错误:" + r.msg); return; } layer.closeAll(); var dl = template('checktools_scl_datalist_tpl', r); datalist.html(dl); if (r.data == null) { r.count = 0; pagebar.addClass("hidden"); datalist.html(Tools.HintText("该节点校验无误!")); } pagebar.removeClass("hidden"); if (!paginationLoaded) { //生成分页 pagebar.pagination(r.count, { num_edge_entries: 2, num_display_entries: 6, prev_show_always: false, next_show_always: false, prev_text: "<", next_text: ">", callback: function(page_index, jq) { //console.log("page_index:" + page_index) if (paginationLoaded) loadSclCheckResult(page_index + 1, 20); }, items_per_page: 20 }); paginationLoaded = true; } }) } loadSclCheckResult(1, 20); }, checktools_scd: function(win) { if (PoliceObject.CurentCompCheckID != "") { layer.msg("正在进行SCD的一致性比对,请稍候...", { time: -1, icon: Global.ICON_LOADING }) //有scd正在对比中 win.find(".func_scdcomp_new,.func_scdcomp_start").attr("comping", "1").addClass("btn_disabled"); } var source_scd_id = ""; var target_scd_id = ""; win.find(".func_scdcomp_exportexcel").off().on('click', function() { var compid = 0; var selectComp = win.find("#scd_comp_list .datalist input[name='comp_selected']:checked"); if (selectComp.length > 0) { compid = selectComp.val(); } if (compid == 0) { layer.msg("请选择一条历史对比记录或创建新的一致性对比!"); return; } Tools.ExpExcel({ "code": "scd-comp-result", "caption": "SCD一致性比对结果", "expcols": "source_scd_name,target_scd_name,ied_name,ied_desc,opt,diff_object_type,diff_object_name,desc", "expcolnames": "基准SCD,目标比对SCD,装置名称,装置描述,操作,比对内容类型,差异项,差异内容", "comp_id": compid }); }); win.find(".func_scdcomp_new").off().on('click', function() { if ($.trim($(this).attr("comping")) == "1") { return; } DialogObject.Open($("#dialog_public"), { size: ["80rem", "45rem"], para: { "title": "新的SCD一致性对比校验" }, callback: function(childwin, para) { childwin.find(".caption>b").html(para.title); var body = childwin.find("#ln_strcut_detail"); body.html("
请同时选择2个scd文件进行对比!
"); var scddiv = body.find("div.left"); body.find(".layui-tools .cancel").off().on("click", function() { childwin.find(".dlg_close").trigger('click'); }); body.find(".layui-tools .confirm").off().on("click", function() { //确定按钮 var scdlist = []; scddiv.find("input[type='checkbox']:checked").each(function() { var v_scdid = $(this).parent().attr("scdid") scdlist.push(v_scdid) if (v_scdid != source_scd_id) target_scd_id = v_scdid; }); if (scdlist.length != 2) { layer.msg("请同时选择2个scd文件进行对比", { icon: Global.ICON_HINT }) return; } win.find(".func_scdcomp_start").trigger('click'); childwin.find(".dlg_close").trigger('click'); }); body.find(".left>div").slimscroll({ "height": scddiv.height() + "px", "width": "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }) scddiv = scddiv.children("div:first").children("div:first"); var showScdMap = {}; if (PoliceObject.ScdList != null) { for (var i = 0; i < PoliceObject.ScdList.length; i++) { showScdMap[PoliceObject.ScdList[i].id] = 1; scddiv.append('
' + PoliceObject.ScdList[i].version + '' + PoliceObject.ScdList[i].scd_name + '
'); } } //获取非管控SCD列表 $.getJSON(Global.AccessUrl + "/api/screen/scd/list", { "stationid": PoliceObject.AreaID, "ischeckinscd": "" }, function(jsondata) { if (jsondata.code != 0) { layer.msg("获取非管控SCD列表出错误:" + jsondata.msg, { icon: Global.ICON_ERROR }) return; } if (jsondata.data == null) return; for (var i = 0; i < jsondata.data.length; i++) { if (showScdMap[jsondata.data[i].id] != null) continue; scddiv.append('
' + jsondata.data[i].version + '' + jsondata.data[i].scd_name + '
'); } scddiv.find("input[type='radio']").off().on('click', function() { var t = $(this); source_scd_id = t.attr("scdid"); }); scddiv.find("input[type='checkbox']").off().on('click', function() { var t = $(this); if (scddiv.find("input[type='checkbox']:checked").length == 3) { t.prop("checked", false); layer.msg("最多可选择2个文件进行比对校验!", { icon: Global.ICON_HINT }) return } if (t[0].checked) t.parent().find("input[name='base_scd_radio']").parent().removeClass("hidden"); else t.parent().find("input[name='base_scd_radio']").parent().addClass("hidden"); var basescd = $(scddiv.find("input[type='checkbox']:checked")[0]).parent().find("input[name='base_scd_radio']").prop("checked", true) source_scd_id = basescd.attr("scdid"); }); }) } }); }); win.find(".func_scdcomp_start").off().on('click', function() { if ($.trim($(this).attr("comping")) == "1") { return; } layer.msg("正在进行SCD的一致性比对,请稍候...", { time: -1, icon: Global.ICON_LOADING }) var compid = 0; var selectComp = win.find("#scd_comp_list .datalist input[name='comp_selected']:checked"); if (selectComp.length > 0) { compid = selectComp.val(); } if (compid == 0 && source_scd_id == "") { layer.msg("请选择一条历史校验记录或创建新一致性校验!", { icon: 3 }); return; } var optbtn = $(this); layer.confirm('该操作耗时较长,校验开始后将清除原有校验结果且无法中止,确定开始吗?', { icon: Global.ICON_ASK, btn: ['确定', '取消'] //按钮 }, function(index) { layer.close(index); optbtn.attr("comping", "1").addClass("btn_disabled"); win.find(".func_scdcomp_new").attr("comping", "1").addClass("btn_disabled"); layer.msg("正在进行SCD的一致性比对...请稍候", { icon: 16, time: -1 }); PoliceObject.CurentCompCheckID = compid + source_scd_id; $.post(Global.AccessUrl + "/api/scd/comp/start", { station_id: PoliceObject.AreaID, source_scd_id: source_scd_id, target_scd_id: target_scd_id, type: "SCD", comp_id: compid }, function(r) { win.find(".func_scdcomp_new,.func_scdcomp_start").attr("comping", "0").removeClass("btn_disabled"); PoliceObject.CurentCompCheckID = ""; layer.closeAll(); if (r.code != 0) { layer.msg("操作失败:" + r.msg, { icon: Global.ICON_ERROR }); return; } PoliceObject.LoadScdCompList(); //等校验完成后,mqtt推送状态信息并更新界面 }); }); }); var scd_comp_list = win.find("#scd_comp_list"); var dataitemlistH = win.find(".dataitemlist").height() - win.find(".dataitemlist").css("padding-top").replace("px", "") * 1; scd_comp_list.find(".datalist").slimscroll({ height: (dataitemlistH - win.find(".datalist_header").height() - win.find("#scd_comp_tools").height() - 5) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); this.LoadScdCompList(); }, checktools_crc: function(win) { var iedcrclist = win.find("#iedcrclist"); iedcrclist.slimScroll({ height: iedcrclist.height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); iedcrclist.html(Tools.HintText("正在加载数据中")); $.getJSON(Global.AccessUrl + "/api/screen/scd/crc", { "scd_id": PoliceObject.ScdID }, function(jsondata) { if (jsondata.code != 0) { iedcrclist.html(Tools.HintText(jsondata.msg)); return } win.find("#scdcrc").html(jsondata.data["scdcrc"]["scdcrc"] || '无'); win.find("#scdcrc2").html(jsondata.data["scdcrc"]["checkcrc"]); win.find("#scdcrcresult").html(jsondata.data["scdcrc"]["checkcrc"] == jsondata.data["scdcrc"]["scdcrc"] ? "校验通过" : "不一致").find(".fa-search").off().on('change', function() { var selecttext = $(this).val(); iedcrclist.find("tr").each(function() { var tr = $(this); if (selecttext != "全部" && tr.find("td:last").text().indexOf(selecttext) != 0) { tr.addClass("hidden") } else { tr.removeClass("hidden") } }) }); var h = template('checktools_crc_list_tpl', { "data": jsondata.data.list.sort(Tools.SortBy("iedname", true)) }); iedcrclist.css("height", "96%").html(h); }); }, LoadScdCompList: function() { $("#scd_comp_list .datalist").html(Tools.HintText("正在加载数据中...")); $.getJSON(Global.AccessUrl + "/api/scd/comp/list", { "station_id": PoliceObject.AreaID }, function(r) { if (r.code != 0) { layer.msg(r.msg, { icon: Global.ICON_ERROR }); return } if (r.data == null || r.data.length == 0) { $("#scd_comp_list .datalist").html(Tools.HintText("还没有SCD一致性校验比对记录!")); return; } var h = template('checktools_scd_datalist_tpl', r); $("#scd_comp_list .datalist").html(h); }) }, CurrentCompResult: null, //当前查看的SCD比对结果 CheckTools_Scd_Comp_Detail: function(e, compId, sourcescdname, targetscdname, sourcescdid, targetscdid) { var queryScdId = ""; var selectedNodeID = ""; var selectedNodeType = ""; var paginationLoaded = false; var queryDir = "source"; //查询的是比对的源数据还是目标数据。默认为源数据 var win = $(e).parents(".site_device_list"); var scdinfos = win.find("#node_tree>div"); $(scdinfos[0]).children("b").html(sourcescdname); $(scdinfos[2]).children("b").html(targetscdname); layer.msg("正在加载数据中") $.getJSON(Global.AccessUrl + "/api/scd/comp/stat/result", { comp_id: compId }, function(r) { if (r.data != null && r.data.length > 0) { layer.closeAll(); var data = { "crc": {}, "version": {}, "ied": { "addnum": 0, "editnum": 0, "delnum": 0 } }; PoliceObject.CurrentCompResult = r.data; for (var i = 0; i < r.data.length; i++) { if (r.data[i]["diff_object_type"] == "scd.crc") { var v = JSON.parse(r.data[i]["diff_desc"]); if (v != null) { data["crc"]["source"] = v[0]; data["crc"]["target"] = v[1]; } } else if (r.data[i]["diff_object_type"] == "scd.version") { var v = JSON.parse(r.data[i]["diff_desc"]); if (v != null) { data["version"]["source"] = v[0]; data["version"]["target"] = v[1]; } } else if (r.data[i]["diff_object_type"] == "scd.ied") { if (r.data[i]["diff_opt"] == "i") data.ied.addnum++; if (r.data[i]["diff_opt"] == "u") data.ied.editnum++; if (r.data[i]["diff_opt"] == "d") data.ied.delnum++; } } var html = template('comp_scd_tpl', data); var comp_show_area = win.find("#comp_show_area").html(html); var iedDiv = comp_show_area.find(".comp_scd:last"); var ied_change_stat = win.find("#ied_change_stat"); ied_change_stat.css({ "top": iedDiv.position().top + iedDiv.height() + 250, "left": iedDiv.position().left + iedDiv.width() / 2 - ied_change_stat.width() / 2, }); ied_change_stat.find(".change_btn").off().on('click', function() { if ($(this).attr('change_num') == "0") { return } var change_type = $(this).attr("change_type"); if (change_type == 'u') PoliceObject.CheckTools_Scd_Comp_ied_Detail(compId, sourcescdid, sourcescdname, targetscdname, $(this).attr('change_type')); else { var iedlist = []; for (var i = 0; i < PoliceObject.CurrentCompResult.length; i++) { var item = PoliceObject.CurrentCompResult[i]; if (item.diff_opt == change_type && item.diff_object_type == 'scd.ied') { iedlist.push({ "ied_name": item.ied_name, "ied_desc": item.ied_desc, "scd_id": change_type == "d" ? targetscdid : sourcescdid, }); } } //查看新增或删除的IED信息 DialogObject.Open($("#dialog_public"), { size: ["150rem", "72rem"], para: { "title": iedlist[0].ied_desc + "(" + iedlist[0].ied_name + ")—详细信息", "scd_id": change_type == "d" ? targetscdid : sourcescdid, "ied_name": iedlist[0].ied_name, }, callback: function(win, p1) { win.attr({ "ied_name": p1.ied_name, "scd_id": p1.scd_id }); win.find(".caption>b").html(p1.title); var h = (win.height() - win.find(".caption").height() - win.find(".footer").height()); win.find(".dataitemlist").height(h + "px").html(template('ied_detail_tpl', {})); win.find(".content").height(h - win.find(".tools").height() + "px"); win.find("#ied_list_tree").height(h - 20 * hRate); //绑定快速查找 win.find("#ied_list_tree .fast_find_list").off().on("input propertychange", function() { var v = ($(this).val()).toLocaleLowerCase(); var tarEle = win.find("#ied_list_tree .station_list_item"); if (v == "") tarEle.removeClass("hidden"); else { tarEle.each(function() { var $this = $(this); if ($this.text().toLocaleLowerCase().indexOf(v) > -1) $this.removeClass("hidden"); else $this.addClass("hidden"); }) } }); PoliceObject.LoadIedTreeList2(null, iedlist, null); PoliceObject.LoadIedGraph(null, PoliceObject.GetIedData(p1.ied_name, p1.scd_id)); } }); } }); setTimeout(function() { var x = iedDiv.position().left + iedDiv.width() / 2; var y = iedDiv.position().top + iedDiv.height() var h = ied_change_stat.position().top - y; comp_show_area.append('
') iedDiv = ied_change_stat.find(".change_btn:first"); x = ied_change_stat.position().left + (iedDiv.css("margin-left").replace("px", "") * 2 + 4 + iedDiv.width()) / 2; h = 40; y = ied_change_stat.position().top - h; comp_show_area.append('
') iedDiv = ied_change_stat.find(".change_btn:last"); var x3 = ied_change_stat.position().left + (iedDiv.css("margin-left").replace("px", "") * 2 + iedDiv.width() + 4) * 2.5; h = 40; var y3 = ied_change_stat.position().top - h; comp_show_area.append('
') comp_show_area.append('
') }, 100) } else if (r.code != 0) { layer.msg("加载失败:" + r.msg + ",建议进行重新比对!", { icon: Global.ICON_ERROR }) } else { layer.msg("当前2个SCD文件没有差异!", { icon: Global.ICON_HINT }); win.find("#comp_show_area").html("当前2个SCD文件没有差异!"); } }); }, CheckTools_Scd_Comp_ied_Detail: function(compId, sourcescdid, sourcescdname, targetscdname, ctype, ccd_cid_info) { DialogObject.Open($("#dialog_public"), { size: ["130rem", "65rem"], para: { "title": "一致性比对结果", "type": ctype, "compId": compId, "sourcescdid": sourcescdid, "sourcescdname": ccd_cid_info != null ? ccd_cid_info.info.f1.filename + "—" + ccd_cid_info.info.f1.ct : sourcescdname, "targetscdname": ccd_cid_info != null ? ccd_cid_info.info.f2.filename + "—" + ccd_cid_info.info.f2.ct : targetscdname, "ccd_cid_info": ccd_cid_info }, callback: function(win, para) { win.find(".caption>b").html(para.title); var opt = para.type == "i" ? "新增" : (para.type == "u" ? "更改" : "删除"); var iedlist = []; if (para.ccd_cid_info != null) { iedlist.push({ "ied_name": para.ccd_cid_info.info.iedname, "ied_desc": para.ccd_cid_info.info.ieddesc }); //根据变更、新增、删除类型排序 var tmpList = []; for (var i = 0; i < para.ccd_cid_info.list.length; i++) { if (para.ccd_cid_info.list[i].diff_opt == 'u') { tmpList.unshift(para.ccd_cid_info.list[i]); } else { tmpList.push(para.ccd_cid_info.list[i]) } } para.ccd_cid_info.list = tmpList; } else { for (var i = 0; i < PoliceObject.CurrentCompResult.length; i++) { var item = PoliceObject.CurrentCompResult[i]; if (item.diff_opt == para.type && item.diff_object_type == 'scd.ied') { iedlist.push({ "ied_name": item.ied_name, "ied_desc": item.ied_desc }); } } } var compTplName = "comp_scd_ied_tpl"; //对比结果加载模板名称 if (para.ccd_cid_info != null && (para.ccd_cid_info.file_type == "ccd" || para.ccd_cid_info.file_type == "ccd_scd")) compTplName = "comp_ccd_ied_tpl"; win.find(".dataitemlist").css("cssText", "padding-top: 1rem !important;").html(template(compTplName, { 'opt': opt, "list": iedlist, "num": iedlist.length })).height(win.height() - win.find(".caption").height() - win.find(".footer").height()); var comp_show_area = $("#comp_ied_result_show"); var scdinfos = comp_show_area.find("#node_tree>div"); $(scdinfos[0]).children("b").html(para.sourcescdname); $(scdinfos[2]).children("b").html(para.targetscdname); var ieddatalist = win.find("#comp_ied_list .ied_data_list"); ieddatalist.slimScroll({ height: ieddatalist.height() + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); win.find("#comp_ied_list .ied_comp_items .node").off().on("click", function() { var t = $(this); if (t.attr("num") == '0') return; var t1 = t.parent().find(".node.active").removeClass("active"); t1.find(".fa").remove(); t1.prepend(''); //fa存在伪元素,removeclass后有残留,只能用此方法 t.addClass("active") t.parent().find(".children[p_type='" + t1.attr("type") + "']").addClass("hidden"); t.find(".fa").remove(); t.prepend(''); //fa存在伪元素,removeclass后有残留,只能用此方法 t.parent().find(".children[p_type='" + t.attr("type") + "']").removeClass("hidden"); t.parent().find(".children[p_type='" + t.attr("type") + "'][num!='0']:first").trigger('click'); }); win.find("#comp_ied_list .ied_comp_items .node[num!='0']:first").trigger('click'); win.find("#comp_ied_list .ied_comp_items .children").off().on("click", function() { var t = $(this); if (t.attr("num") == '0') return; t.parent().find(".children.active").removeClass("active"); t.addClass("active") PoliceObject.GetCompItemDetail(win, para.compId, ieddatalist.find(".ied_item.active").attr("ied_name"), para.type, t.attr("type"), sourcescdid) }); var loadIedCompStat = function(data) { var ptypeNums = {}; var scdiedRelationNum = 0; //回路数量 var eles = win.find("#comp_ied_list .ied_comp_items"); for (var k in data) { var num = data[k] * 1; var ele = eles.find(".children[type='" + k + "']").attr("num", num); ele.children(".num").html(num); var ptypeNum = ptypeNums[ele.attr("p_type")]; if (ptypeNum == null) ptypeNums[ele.attr("p_type")] = num; else ptypeNums[ele.attr("p_type")] = ptypeNum * 1 + num; if (k == "scd.ied.ExtRef") scdiedRelationNum = scdiedRelationNum + num; } for (var k in ptypeNums) { var ele = eles.find(".node[type='" + k + "']").attr("num", ptypeNums[k]); ele.children(".num").html(ptypeNums[k]); } if (scdiedRelationNum > 0) { var ele = eles.find(".children[type='scd.ied.Relation']").attr("num", scdiedRelationNum); ele.children(".num").html(scdiedRelationNum); } //触发第一个有变化的节点 win.find("#comp_ied_list .ied_comp_items .node[num!='0']:first").trigger('click'); } if (ccd_cid_info != null) { win.ccd_cid_info = ccd_cid_info; var numstatdata = {}; //统计差异类型数量 for (var i = 0; i < ccd_cid_info.list.length; i++) { var diff_object_type = ccd_cid_info.list[i].diff_object_type; if (numstatdata[diff_object_type] == null) numstatdata[diff_object_type] = 1; else numstatdata[diff_object_type] = numstatdata[diff_object_type] + 1; } loadIedCompStat(numstatdata); ieddatalist.find(".ied_item:first").addClass("active"); } else { ieddatalist.find(".ied_item").off().on("click", function() { ieddatalist.find(".ied_item.active").removeClass("active"); $(this).addClass("active"); //获取装备差异分类统计 var eles = win.find("#comp_ied_list .ied_comp_items"); eles.children("div").each(function() { $(this).attr("num", "0").find(".num").html("0") }); $("#comp_ied_result_show .comp_show_area").html('
正在加载数据中
') layer.msg("正在加载数据中", { icon: Global.ICON_HINT }); var clickIedName = $(this).attr("ied_name"); $.getJSON(Global.AccessUrl + "/api/scd/comp/iedstat/type", { 'comp_id': para.compId, 'ied_name': clickIedName, 'comptype': para.type }, function(jsondata) { layer.closeAll(); if (jsondata.code != 0) { layer.msg(jsondata.msg, { icon: Global.ICON_ERROR }) return } loadIedCompStat(jsondata.data); }) }).eq(0).trigger('click'); } } }); }, currentCompItem: null, //当前展示差异数据的对象 GetCompItemDetail: function(win, compid, iedname, ctype, itemcode, sourcescdid) { var itemcode_icon = { "scd.ied": "icon_baseinfo.png", "scd.ied.YC": "icon_yc.png", "scd.ied.YX": "icon_yx.png", "scd.ied.YK": "icon_yk.png", "scd.ied.YM": "icon_ym.png", "scd.ied.DZ": "icon_dz.png", "scd.ied.FCDA": "icon_publish.png", "scd.ied.ExtRef": "icon_sub.png", "scd.ied.Relation": "icon_relation.png", "scd.ied.ReportControl": "icon_report_block.png", "scd.ied.LogControl": "icon_log_block.png", "scd.ied.GSEControl": "icon_goose_block.png", "scd.ied.goosepub": "icon_goose_block.png", "scd.ied.goosesub": "icon_goose_block.png", "scd.ied.SampledValueControl": "icon_sv_block.png", "scd.ied.svpub": "icon_sv_block.png", "scd.ied.svsub": "icon_sv_block.png", "scd.ied.Communication": "icon_ap.png", "scd.ied.goosepub.Communication": "icon_ap.png", "scd.ied.goosesub.Communication": "icon_ap.png", "scd.ied.smvpub.Communication": "icon_ap.png", "scd.ied.smvsub.Communication": "icon_ap.png", "scd.ied.Communication.GSE": "icon_goose.png", "scd.ied.goosepub.Communication.GSE": "icon_goose.png", "scd.ied.goosesub.Communication.GSE": "icon_goose.png", "scd.ied.Communication.SMV": "icon_sv.png", "scd.ied.smvpub.Communication.GSE": "icon_sv.png", "scd.ied.smvsub.Communication.GSE": "icon_sv.png", "scd.ied.Communication.S1": "icon_mms.png", "scd.ied.DatSet": "icon_dataset.png", "scd.ied.DatSetMeber": "icon_fcda.png", "scd.ied.goosepub.FCDA": "icon_fcda.png", "scd.ied.goosesub.FCDA": "icon_fcda.png", "scd.ied.smvpub.FCDA": "icon_fcda.png", "scd.ied.smvsub.FCDA": "icon_fcda.png", } var extCompAttrName = { "DAI": 1, "Address": 1, "MaxTime": 1, "MinTime": 1, "lineno": 1, "node_id": 1, "SDI": 1, "TrgOps": 1, "OptFields": 1, "RptEnabled": 1, "Private": 1, "GSE": 1, "SMV": 1, "PhysConn": 1, "SmvOpts": 1, } var tempCacheData = {}; //绘制指定差异属性的数据图 var drawDiffMap = function(ele, iedname) { var drawFlagId = ele.attr("idno"); var itemcode = ele.attr("itemcode"); var item = tempCacheData[itemcode + "_" + drawFlagId] if (item == null) return; var diff_desc = JSON.parse(item.diff_desc.replace(/\'| /gi, "").replace(/\r|\n|\t/gi, "")); if (diff_desc == null) return; var itemname = item.diff_object_name; var itemchangetype = item.diff_opt; if (item.diff_opt == 'u') { //ied变化类型 //比较差异项 var s1 = (diff_desc[0]) var t1 = (diff_desc[1]) s1DaiMap = {}; t1DaiMap = {}; var daiList = diff_desc[0]["DAI"]; if (daiList != null) { for (var p = 0; p < daiList.length; p++) { s1DaiMap[daiList[p]["Name"]] = $.trim(daiList[p]["Val"].InnerText); } } daiList = diff_desc[1]["DAI"]; if (daiList != null) { for (var p = 0; p < daiList.length; p++) { t1DaiMap[daiList[p]["Name"]] = $.trim(daiList[p]["Val"].InnerText) } } if (diff_desc[0]["P"] != null) { for (var p = 0; p < diff_desc[0]["P"].length; p++) { var vitem = diff_desc[0]["P"][p]; s1DaiMap[vitem.Type] = $.trim(vitem.InnerText); s1[vitem.Type] = s1DaiMap[vitem.Type] } delete(s1["P"]); } if (diff_desc[0]["Address"] != null && diff_desc[0]["Address"]["P"] != null) { for (var p = 0; p < diff_desc[0]["Address"]["P"].length; p++) { var vitem = diff_desc[0]["Address"]["P"][p]; s1DaiMap[vitem.Type] = $.trim(vitem.InnerText); s1[vitem.Type] = s1DaiMap[vitem.Type] } delete(s1["Address"]); } if (diff_desc[0]["MaxTime"] != null) { s1DaiMap["MaxTime"] = $.trim(diff_desc[0]["MaxTime"].InnerText); s1DaiMap["MinTime"] = $.trim(diff_desc[0]["MinTime"].InnerText); } if (diff_desc[1]["P"] != null) { for (var p = 0; p < diff_desc[1]["P"].length; p++) { var vitem = diff_desc[1]["P"][p]; t1DaiMap[vitem.Type] = $.trim(vitem.InnerText); t1[vitem.Type] = t1DaiMap[vitem.Type] } delete(t1["P"]); } if (diff_desc[1]["Address"] != null && diff_desc[1]["Address"]["P"] != null) { for (var p = 0; p < diff_desc[1]["Address"]["P"].length; p++) { var vitem = diff_desc[1]["Address"]["P"][p]; t1DaiMap[vitem.Type] = $.trim(vitem.InnerText); t1[vitem.Type] = t1DaiMap[vitem.Type] } delete(t1["Address"]); } if (diff_desc[1]["MaxTime"] != null) { t1DaiMap["MaxTime"] = $.trim(diff_desc[1]["MaxTime"].InnerText); t1DaiMap["MinTime"] = $.trim(diff_desc[1]["MinTime"].InnerText); } var diffresult = Tools.GetMapDiffItems(s1DaiMap, t1DaiMap) for (var k in s1) { if (extCompAttrName[k] != null) { for (var c1 in s1[k]) { if (JSON.stringify(s1[k][c1]) != JSON.stringify(t1[k][c1])) { diffresult.edit[k + "." + c1] = [s1[k][c1] || '[空]', t1[k][c1] || '[空]']; diffresult._edit_cnt++; } } continue } if (s1[k] != t1[k]) { diffresult.edit[k] = [s1[k] || '[空]', t1[k] || '[空]']; diffresult._edit_cnt++; } } //绘制修改的项 if (diffresult._edit_cnt > 0) PoliceObject.MakeComp(iedname, itemcode, drawFlagId, itemname, item.diff_opt, 'u', diffresult.edit); //绘制新增的项 if (diffresult._add_cnt > 0) PoliceObject.MakeComp(iedname, itemcode, drawFlagId, itemname, item.diff_opt, 'i', diffresult.add); //绘制删除的项 if (diffresult._del_cnt > 0) PoliceObject.MakeComp(iedname, itemcode, drawFlagId, itemname, item.diff_opt, 'd', diffresult.del); } else if (item.diff_opt == 'i') { if (diff_desc["RptEnabled"] != null) diff_desc["RptEnabled.Max"] = diff_desc["RptEnabled"]["Max"] var obj = {} if (diff_desc["P"] != null) { for (var p = 0; p < diff_desc["P"].length; p++) { var vitem = diff_desc["P"][p]; diff_desc[vitem.Type] = $.trim(vitem.InnerText); } delete(diff_desc["P"]); } if (diff_desc["Address"] != null && diff_desc["Address"]["P"] != null) { for (var p = 0; p < diff_desc["Address"]["P"].length; p++) { var vitem = diff_desc["Address"]["P"][p]; diff_desc[vitem.Type] = $.trim(vitem.InnerText); } delete(diff_desc["Address"]); } for (var k in diff_desc) { if (extCompAttrName[k] == null) obj[k] = diff_desc[k]; } diffresult = { "add": obj } //绘制数据变化图 PoliceObject.MakeComp(iedname, itemcode, drawFlagId, itemname, item.diff_opt, 'i', diffresult.add); } else if (item.diff_opt == 'd') { var obj = {} if (diff_desc["P"] != null) { for (var p = 0; p < diff_desc["P"].length; p++) { var vitem = diff_desc["P"][p]; diff_desc[vitem.Type] = $.trim(vitem.InnerText); } delete(diff_desc["P"]); } if (diff_desc["Address"] != null && diff_desc["Address"]["P"] != null) { for (var p = 0; p < diff_desc["Address"]["P"].length; p++) { var vitem = diff_desc["Address"]["P"][p]; diff_desc[vitem.Type] = $.trim(vitem.InnerText); } delete(diff_desc["Address"]); } for (var k in diff_desc) { if (extCompAttrName[k] == null) obj[k] = diff_desc[k]; } diffresult = { "del": obj } //绘制数据变化图 PoliceObject.MakeComp(iedname, itemcode, drawFlagId, itemname, item.diff_opt, 'd', diffresult.del); } } var loadCompResult = function(iedname, itemcode, resultData) { var comp_show_area = $("#comp_ied_result_show .comp_show_area"); comp_show_area.attr("itemcode", itemcode).html(template('comp_ied_result_show_tpl', {})); var vh = comp_show_area.height(); comp_show_area.slimScroll({ height: (vh * 0.99) + "px", width: "98%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); comp_show_area.css("width", "100%").find(".comp_ied_result_split_line"); if (itemcode == "scd.ied.Relation") { //虚回路 resultData.sort(Tools.SortBy("no", true)); PoliceObject.drawIedInputsRelation(sourcescdid, PoliceObject.GetIedData(iedname, sourcescdid), comp_show_area, resultData); return } var source_ied = comp_show_area.find(".source_ied .ied_name").html(iedname).parent(); var target_ied = comp_show_area.find(".target_ied .ied_name").html(iedname).parent(); var drawFlagId = {}; var nosameitem = {}; //基础信息显示 if (itemcode == "scd.ied") { if (ctype == 'u') { //比较差异项 for (var k in resultData[0]) { if (k == "lineno" || k == "node_id") continue; if (resultData[0][k] != resultData[1][k]) { nosameitem[k] = [resultData[0][k] || '[空]', resultData[1][k] || '[空]']; } } } else { for (var k in resultData[0]) { if (k == "lineno" || k == "node_id") continue; nosameitem[k] = resultData[0][k] || '[空]'; } } tempCacheData[itemcode + "_9999"] = item; var itemname = "基本信息"; var itemchangetype = 'u' comp_show_area.append('
' + itemname + '
') comp_show_area.append('
' + itemname + '
') setTimeout(function() { comp_show_area.find(".typeele[dir='source']:first").trigger('click'); PoliceObject.MakeComp(iedname, itemcode, 9999, itemname, 'u', ctype, nosameitem); }, 300) } else { for (var i = 0; i < resultData.length; i++) { var item = resultData[i]; //console.log(item.diff_desc.replace(/\'| /gi, "").replace(/\r|\n|\t/gi, "a")) var diff_desc = JSON.parse(item.diff_desc.replace(/\'| /gi, "").replace(/\r|\n|\t/gi, "")); if (diff_desc == null) continue; var itemname = item.diff_object_name; var itemchangetype = item.diff_opt; drawFlagId[itemcode + i] = 1001 + (i * 100000) //当前类型将绘制元素的起始id号及差异项代码 tempCacheData[itemcode + "_" + drawFlagId[itemcode + i]] = item; if (item.diff_opt == 'u') { comp_show_area.append('
' + itemname + '
') comp_show_area.append('
' + itemname + '
') } else if (item.diff_opt == 'i') { comp_show_area.append('
' + itemname + '
') } else if (item.diff_opt == 'd') { comp_show_area.append('
' + itemname + '
') } } //drawDiffMap(comp_show_area.find(".typeele:first"), iedname); } var iedFirstLineWidth = 40; var iedItemLineWidth = 20; //重新排列基准SCD中的typeele var totlcnt = comp_show_area.find(".typeele[dir='source']").length; if (totlcnt >= 1) { //绘制IED与差异之前的连线 var sourceIedLine = PoliceObject.drawDivLine(comp_show_area, [source_ied.position().left + source_ied.width(), source_ied.position().top + source_ied.css("margin-top").replace("px", "") * 1 + source_ied.height() / 2], [iedFirstLineWidth, null], "source_ied_first_line", "bgcolor_0" ); var sourceIedLineXY = sourceIedLine.position(); var one = comp_show_area.find(".typeele[dir='source']:first"); var left = sourceIedLineXY.left + iedFirstLineWidth + iedItemLineWidth; var sigleH = one.height() + one.css("margin-top").replace("px", "") * 1; var totalH = totlcnt * sigleH; var inith = 0; //初始化top if (totalH >= vh) { inith = 60; comp_show_area.find(".comp_ied_result_split_line").height(inith + 30 + sigleH * totlcnt); } else { if (totlcnt > 1) inith = (vh - totalH) / 2; else inith = sourceIedLineXY.top - sigleH / 2; } var preEle = null; var firstEle = null; comp_show_area.find(".typeele[dir='source']").each(function(index) { var t = $(this); t.on('click', function() { var t = $(this); if (PoliceObject.currentCompItem != null) { var oldIDNo = PoliceObject.currentCompItem.attr("idno"); comp_show_area.find(".typeele.active").removeClass("active"); comp_show_area.find(".typeele[dir='target'][idno='" + oldIDNo + "']").removeClass("active"); //清除之前绘制的元素 comp_show_area.children("div[flagid='" + oldIDNo + "']").remove(); } PoliceObject.currentCompItem = t.addClass("active"); comp_show_area.find(".typeele[dir='target'][idno='" + t.attr("idno") + "']").addClass("active"); //点击差异属性,切换展示数据数据图 //绘制点击元素的数据图 var currentCompItemXY = PoliceObject.currentCompItem.position(); //如果当前元素top为负时,需要自动将画布向上滚动一定距离,至少保证top为不负数 if (currentCompItemXY.top < 60) { var scrollHeight = PoliceObject.currentCompItem.attr("oldtop") * 1 - currentCompItemXY.top; comp_show_area.slimScroll({ scrollTo: scrollHeight - 100 }); setTimeout(function() { //当点击元素处于非完全可见时(即top为负时),需要延时绘图,等滚动条自动滚动完成,否则获取到的位置不正确 drawDiffMap(t, iedname); }, 300) return; } drawDiffMap(t, iedname); }); var newtop = inith; if (preEle == null) t.css({ "top": inith, "left": left }); else { newtop = preEle.position().top + (preEle.height() + preEle.css("margin-top").replace("px", "") * 1); t.css({ "top": newtop, "left": left }); } if (firstEle == null) firstEle = t; preEle = t.attr("oldtop", newtop); PoliceObject.drawDivLine(comp_show_area, [sourceIedLineXY.left + sourceIedLine.width(), newtop + (t.height() + t.css("margin-top").replace("px", "") * 1) / 2], [iedItemLineWidth, null], "source_ied_item_line_" + index, "bgcolor_0" ); }) var lineH = preEle.position().top - firstEle.position().top; PoliceObject.drawDivLine(comp_show_area, [sourceIedLineXY.left + sourceIedLine.width(), firstEle.position().top + (firstEle.css("margin-top").replace("px", "") * 1 + firstEle.height()) / 2], [null, lineH], "source_ied_item_line", "bgcolor_0" ); } //重新排列比对SCD中的typeele var targettotlcnt = comp_show_area.find(".typeele[dir='target']").length; if (targettotlcnt >= 1) { //绘制IED与差异之前的连线 var targetIedLine = PoliceObject.drawDivLine(comp_show_area, [target_ied.position().left - iedFirstLineWidth, target_ied.position().top + target_ied.css("margin-top").replace("px", "") * 1 + target_ied.height() / 2], [iedFirstLineWidth, null], "target_ied_first_line", "bgcolor_0" ); var targetIedLineXY = targetIedLine.position(); var one = comp_show_area.find(".typeele[dir='target']:first"); var left = targetIedLineXY.left - iedItemLineWidth; var sigleH = one.height() + one.css("margin-top").replace("px", "") * 1; var totalH = targettotlcnt * sigleH; var inith = 0; //初始化top if (totalH >= vh) { inith = 60; if (comp_show_area.find(".comp_ied_result_split_line").height() < totalH) { comp_show_area.find(".comp_ied_result_split_line").height(inith + 30 + sigleH * totlcnt); } } else { if (targettotlcnt > 1) inith = (vh - totalH) / 2; else inith = targetIedLineXY.top - sigleH / 2; } var preEle = null; var firstEle = null; comp_show_area.find(".typeele[dir='target']").each(function(index) { var t = $(this); if (t.attr("itemopt") == "d") { t.on('click', function() { var t = $(this); if (PoliceObject.currentCompItem != null) { var oldIDNo = PoliceObject.currentCompItem.attr("idno"); comp_show_area.find(".typeele.active").removeClass("active"); comp_show_area.find(".typeele[dir='source'][idno='" + oldIDNo + "']").removeClass("active"); //清除之前绘制的元素 comp_show_area.children("div[flagid='" + oldIDNo + "']").remove(); } PoliceObject.currentCompItem = t.addClass("active"); comp_show_area.find(".typeele[dir='source'][idno='" + t.attr("idno") + "']").addClass("active"); //点击差异属性,切换展示数据数据图 //绘制点击元素的数据图 var currentCompItemXY = PoliceObject.currentCompItem.position(); //如果当前元素top为负时,需要自动将画布向上滚动一定距离,至少保证top为不负数 if (currentCompItemXY.top < 60) { var scrollHeight = PoliceObject.currentCompItem.attr("oldtop") * 1 - currentCompItemXY.top; comp_show_area.slimScroll({ scrollTo: scrollHeight - 100 }); setTimeout(function() { //当点击元素处于非完全可见时(即top为负时),需要延时绘图,等滚动条自动滚动完成,否则获取到的位置不正确 drawDiffMap(t, iedname); //调整当前查看的差异属性连线位置 var scrollHeight = PoliceObject.currentCompItem.attr("oldtop") * 1 - PoliceObject.currentCompItem.position().top; var itemAttrsSourcelineEle = comp_show_area.find("#" + t.attr("idno") + "_item_attrs_target").css("top", scrollHeight + t.position().top + t.height() / 2); var itemAttrsSourceAlllineEle = comp_show_area.find("#" + t.attr("idno") + "_item_attrs_target_all"); if (itemAttrsSourceAlllineEle.position().top > itemAttrsSourcelineEle.position().top) { itemAttrsSourceAlllineEle.css({ "top": itemAttrsSourcelineEle.position().top, "height": itemAttrsSourceAlllineEle.position().top - itemAttrsSourcelineEle.position().top }) } }, 300) return; } drawDiffMap(t, iedname); var deallist = ["target"]; for (var di = 0; di < deallist.length; di++) { //调整当前查看的差异属性连线位置 var scrollHeight = PoliceObject.currentCompItem.attr("oldtop") * 1 - PoliceObject.currentCompItem.position().top; var itemAttrsSourcelineEle = comp_show_area.find("#" + t.attr("idno") + "_item_attrs_" + deallist[di]).css("top", scrollHeight + t.position().top + t.height() / 2); var itemAttrsSourceAlllineEle = comp_show_area.find("#" + t.attr("idno") + "_item_attrs_" + deallist[di] + "_all"); if (itemAttrsSourceAlllineEle.position().top > itemAttrsSourcelineEle.position().top) { itemAttrsSourceAlllineEle.css({ "top": itemAttrsSourcelineEle.position().top, "height": itemAttrsSourceAlllineEle.position().top - itemAttrsSourcelineEle.position().top }) } } }); } var newtop = inith; if (preEle == null) t.css({ "top": inith, "left": left - t.width() }); else { newtop = preEle.position().top + (preEle.height() + preEle.css("margin-top").replace("px", "") * 1); t.css({ "top": newtop, "left": left - t.width() }); } if (firstEle == null) firstEle = t; preEle = t.attr("oldtop", newtop); PoliceObject.drawDivLine(comp_show_area, [targetIedLineXY.left - iedItemLineWidth, newtop + (t.height() + t.css("margin-top").replace("px", "") * 1) / 2], [iedItemLineWidth, null], "target_ied_item_line_" + index, "bgcolor_0" ); }) var lineH = preEle.position().top - firstEle.position().top; PoliceObject.drawDivLine(comp_show_area, [targetIedLineXY.left, firstEle.position().top + (firstEle.css("margin-top").replace("px", "") * 1 + firstEle.height()) / 2], [null, lineH], "target_ied_item_line", "bgcolor_0" ); } if (totlcnt > 0) { comp_show_area.find(".typeele[dir='source']:first").trigger('click'); } else { //如果基准scd侧没有变化的元素,则默认自动点击对比侧第一个元素 comp_show_area.find(".typeele[dir='target']:first").trigger('click'); } layer.closeAll(); } this.currentCompItem = null; layer.msg("正在加载数据中"); if (win.ccd_cid_info != null) { var datalist = []; for (var i = 0; i < win.ccd_cid_info.list.length; i++) { if (win.ccd_cid_info.list[i].diff_object_type == itemcode) { if (itemcode == "scd.ied") { //转换ied基本差异信息 var diff_desc = JSON.parse(win.ccd_cid_info.list[i].diff_desc.replace(/\'| /gi, "").replace(/\r|\n|\t/gi, "")); if (diff_desc == null) continue; datalist = diff_desc; } else { datalist.push(win.ccd_cid_info.list[i]); } } } loadCompResult(iedname, itemcode, datalist); } else { $.getJSON(Global.AccessUrl + "/api/scd/comp/result", { comp_id: compid, ied_name: iedname, comptype: ctype, itemcode: itemcode }, function(jsondata) { if (jsondata.code != 0) { layer.msg(jsondata.msg, { icon: Global.ICON_ERROR }) return } loadCompResult(iedname, itemcode, jsondata.data); }); } }, MakeComp: function(iedname, itemcode, flagId, itemname, itemchangetype, ctype, nosameitem) { var comp_show_area = $("#comp_ied_result_show .comp_show_area"); var sourceied = comp_show_area.find(".source_ied .ied_name").parent(); var targetied = comp_show_area.find(".target_ied .ied_name").parent(); //生成详细项.先确定细项位置 var v_top = 60; //初始位置 var scrollHeight = 0; //滚动条滚动距离 if (PoliceObject.currentCompItem != null) { var currentCompItemXY = PoliceObject.currentCompItem.position(); //当前元素的当前位置。当滚动了画布时,以当前为置为准 v_top = PoliceObject.currentCompItem.attr("oldtop") * 1; scrollHeight = v_top - currentCompItemXY.top; } var detailItemtotalH = 0; var detailItems = null; var firstDetailItem = null; var detailItemsCount = 0; for (var k in nosameitem) { var attrDesc = Global.SCD_COMP_ATTR_CONST["ied." + k] if (attrDesc == null) attrDesc = k; if (ctype == 'u') { //属性修改 detailItems = $('
' + (nosameitem[k][0] == "" ? "[空]" : nosameitem[k][0]) + '
' + (nosameitem[k][1] == "" ? "[空]" : nosameitem[k][1]) + '
'); } else if (ctype == 'i') { //属性新增 detailItems = $('
' + (nosameitem[k] == "" ? "[空]" : nosameitem[k]) + '
'); } else { //属性删除 detailItems = $('
' + (nosameitem[k] == "" ? "[空]" : nosameitem[k]) + '
'); } comp_show_area.append(detailItems) if (firstDetailItem == null) firstDetailItem = detailItems; v_top = detailItems.position().top + detailItems.height() + 50 + scrollHeight; detailItemsCount++; } if (detailItems == null) return; detailItemtotalH = detailItems.position().top + detailItems.height() - firstDetailItem.position().top; //重新计算初始位置 ,使其显示的中间 var vh = comp_show_area.height(); //根据当前点击的变化属性元素,计算出需要上下移动的距离 var v_top_new = 60; if (vh >= detailItemtotalH) { v_top_new = (vh - detailItemtotalH) / 2; } var lineFirstXY = null; //基准侧第一个属性元素框 var lineEndXY = null; //基准侧最后一属性元素框 var lineFirstXY_right = null; //比对侧第一个属性元素框 var lineEndXY_right = null; //比对侧最后一属性元素框 var currentCompItemXY = PoliceObject.currentCompItem.position(); var one = comp_show_area.find(".comp_scd_detail_item:first"); one.css("top", scrollHeight + currentCompItemXY.top - 100); var lastEle = one; var oneXY = one.position(); var topSub = v_top_new - oneXY.top; comp_show_area.find(".comp_scd_detail_item").each(function() { var t = $(this); if (detailItemsCount > 1) { //微调差异内容框top位置 if (lastEle == null) { var tmpTop = t.css("top").replace("px", "") * 1 + (topSub); if (t.next().length == 0 && tmpTop > currentCompItemXY.top) { tmpTop = tmpTop - topSub; //还原top } } else { tmpTop = scrollHeight + lastEle.position().top + lastEle.height() + 40; } } else { var tmpTop = scrollHeight + currentCompItemXY.top + (PoliceObject.currentCompItem.height() / 2) + 1 - (t.height() + 4) / 2; } t.css("top", tmpTop); lastEle = t; var txy = t.position(); var newTop = scrollHeight + txy.top + t.css("padding-top").replace("px", "") * 1 + t.height() / 2; //绘制差异内容框与元素之间的连接线 if (ctype == 'u' || ctype == 'i') { //基准SCD var tMarginleft = txy.left + t.css("margin-left").replace("px", "") * 1 var line = PoliceObject.drawDivLine(comp_show_area, [tMarginleft - 100, newTop], [100, null], null, "bgcolor_" + ctype); line.attr({ "flagId": flagId }) } if (ctype == 'u' || ctype == 'd') { var tMarginleft = txy.left + t.css("margin-left").replace("px", "") * 1 //比对SCD,其中4为左右边框总宽度 var right_left = tMarginleft + t.width() + t.css("padding-right").replace("px", "") * 2 + 4; var line = PoliceObject.drawDivLine(comp_show_area, [right_left, newTop], [100, null], null, "bgcolor_" + ctype); line.attr({ "flagId": flagId }) } //绘制差异项名称 if (ctype == 'u' || ctype == 'i') { //基准SCD comp_show_area.append('
' + t.attr('attr_name') + '
'); } if (ctype == 'u' || ctype == 'd') { //比对SCD comp_show_area.append('
' + t.attr('attr_name') + '
'); } if (ctype == 'u' || ctype == 'i') { if (lineFirstXY == null) lineFirstXY = [tMarginleft - 100, newTop]; lineEndXY = [tMarginleft - 100, newTop]; } if (ctype == 'u' || ctype == 'd') { if (lineFirstXY_right == null) lineFirstXY_right = [right_left + line.width(), newTop]; lineEndXY_right = [right_left + line.width(), newTop]; } }); //绘制当前点击差异属性元素与内容项之间的连接线 if (ctype == 'u' || ctype == 'i') { var lineEle2 = PoliceObject.drawDivLine(comp_show_area, lineFirstXY, [null, lineEndXY[1] - lineFirstXY[1]], flagId + "_item_attrs_source_all", "bgcolor_" + ctype); lineEle2.attr({ "flagId": flagId }) var currEleXY = PoliceObject.currentCompItem.position(); var v_x = currEleXY.left + PoliceObject.currentCompItem.width() + PoliceObject.currentCompItem.css("border-width").replace("px", "") * 2; var lineEle = PoliceObject.drawDivLine(comp_show_area, [v_x, scrollHeight + currEleXY.top - 1 + PoliceObject.currentCompItem.css("margin-top").replace("px", "") * 1 + PoliceObject.currentCompItem.height() / 2], [lineFirstXY[0] - v_x, null], flagId + "_item_attrs_source", "bgcolor_" + ctype); lineEle.attr({ "flagId": flagId }) if (lineEle2.height() == 0) { if (lineFirstXY[1] > scrollHeight + lineEle.position().top) lineFirstXY[1] = lineEle.position().top lineEle2.css({ "top": lineFirstXY[1], "height": lineEndXY[1] - lineFirstXY[1] }); } } if (ctype == 'u' || ctype == 'd') { var currEle = comp_show_area.find(".typeele[dir='target'][idno='" + PoliceObject.currentCompItem.attr("idno") + "']"); if (currEle.length > 0) { //绘制与比对ied差异项元素之间的连接线 var lineEle2 = PoliceObject.drawDivLine(comp_show_area, lineFirstXY_right, [null, lineEndXY_right[1] - lineFirstXY_right[1]], flagId + "_item_attrs_target_all", "bgcolor_" + ctype); lineEle2.attr({ "flagId": flagId }) var li1 = $("#" + PoliceObject.currentCompItem.attr("idno") + "_item_attrs_target_all") var v_x = li1.position().left var lineEle = PoliceObject.drawDivLine(comp_show_area, [v_x, scrollHeight + currEle.position().top - 1 + currEle.css("margin-top").replace("px", "") * 1 + currEle.height() / 2], [currEle.position().left - v_x, null], flagId + "_item_attrs_target", "bgcolor_" + ctype); lineEle.attr({ "flagId": flagId }) if (lineEle2.height() == 0) { if (lineFirstXY_right[1] > scrollHeight + lineEle.position().top) lineFirstXY_right[1] = lineEle.position().top lineEle2.css({ "top": lineFirstXY_right[1], "height": lineEndXY_right[1] - lineFirstXY_right[1] }); } } } var maxH = 0; if (lineEndXY != null) { var typeeleLast = comp_show_area.find(".typeele[dir='source']:last"); var typeeleLastY = typeeleLast.position().top + typeeleLast.height(); maxH = lineEndXY[1]; if (maxH < typeeleLastY) maxH = typeeleLastY; } if (lineEndXY_right != null) { var tmpH = lineEndXY_right[1]; var typeeleLast = comp_show_area.find(".typeele[dir='target']:last"); var typeeleLastY = typeeleLast.position().top + typeeleLast.height(); if (maxH < tmpH) maxH = tmpH; if (maxH < typeeleLastY) maxH = typeeleLastY; } maxH = maxH + 74; var splitLine = comp_show_area.find(".comp_ied_result_split_line"); if (maxH > splitLine.height()) splitLine.height(maxH); }, drawDivLine: function(parentele, fromXY, toWH, lineid, color) { var id = (lineid == null ? ("L" + (parseInt(fromXY[0]) + "_" + parseInt(fromXY[1]))) : lineid); while (parentele.find("#" + id).length > 0) { id = id + (parentele.find("#" + id).length + 1) } parentele.append('
') var line = parentele.find("#" + id); if (color != null) line.addClass(color); line.css({ left: fromXY[0], top: fromXY[1], width: toWH[0] == null ? 1 : toWH[0], height: toWH[1] == null ? 1 : toWH[1], }); return line; }, subNetworkIsLoading: false, GetSubNetwork: function() { if (this.subNetworkIsLoading) { return; } this.subNetworkIsLoading = true; var network = $("#container_map_ied #network").html(""); network.css("top", 20 * hRate); $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": PoliceObject.ScdID, "pagesize": 10000, "name": "SubNetwork" }, function(r) { PoliceObject.subNetworkIsLoading = false; if (r.data == null) return; var avgWidth = 100 / r.data.length; for (var i = 0; i < r.data.length; i++) { network.append('
' + r.data[i].attr_desc + '
' + r.data[i].attr_name + '
'); } network.find(".network_item").off().on("click", function() { network.find(".active").removeClass("active"); loadNetworkAPInfo($(this).attr('network_id')); }); network.append('
正在加载数据中
'); network.append('
'); var loadNetworkAPInfo = function(networkid) { var loadApInfo = []; var $aplistEle = $("#network .network_ap").attr("networkid", networkid).html(""); var ledlist = $("#network .network-iedlist").html("
"); $("#network .network-line").remove(); $("#network .network-ied-line").remove(); $("#network .network-ied-line2").remove(); for (var key in PoliceObject.NetWork_ApNodes) { if (networkid == null || key.indexOf(networkid) > -1) { networkid = key.split(".")[0]; loadApInfo.push(PoliceObject.NetWork_ApNodes[key]); } } var sourceNetworkEle = network.find(".network_item[network_id='" + networkid + "']").addClass("active"); if (loadApInfo.length == 0) { return; } for (var i = 0; i < loadApInfo.length; i++) { var apname = loadApInfo[i].attr_ap_name; $aplistEle.append('
' + apname + '
') } $aplistEle.css("height", loadApInfo.length * 22 + "px").find(".sub_line").off().on('click', function() { //单击总线,只显示该总线的设备 if ($aplistEle.find(".sub_line").length < 2) return; var tmp1 = $(this); tmp1.parent().find(".sub_line").css("opacity", 0.3); tmp1.css("opacity", 1); var ishow = $.trim(tmp1.attr("ishow")); var v_apname = tmp1.attr("apname"); ishow = ishow == "" || ishow == "1" ? "0" : "1"; tmp1.attr("ishow", ishow); $("#network .network-line").each(function() { var t = $(this); t.css("opacity", t.attr("apname") == v_apname ? 1 : 0.3); /*if (t.attr("apname") == v_apname) { if (ishow == "0") t.addClass("hidden"); else t.removeClass("hidden"); t.css("opacity", 1); }*/ }); $("#network .network-ied-line").each(function() { var t = $(this); if (t.attr("apname") == v_apname) t.removeClass("hidden"); else t.addClass("hidden"); //t.css("opacity", t.attr("apname") == v_apname ? 1 : 0.2); /*if (t.attr("apname") == v_apname) { if (ishow == "0") t.addClass("hidden"); else t.removeClass("hidden"); t.css("opacity", 1); }*/ }); var rel_ied_list = []; $("#network .network-ied-line2").each(function() { var t = $(this); if (t.attr("apname") == v_apname) t.removeClass("hidden"); else t.addClass("hidden"); //t.css("opacity", t.attr("apname") == v_apname ? 1 : 0.2); if (t.attr("apname") == v_apname) { rel_ied_list.push(t.attr("foried")); } /* if (t.attr("apname") == v_apname) { if (ishow == "0") t.addClass("hidden"); else t.removeClass("hidden"); }*/ }); $("#network .network-iedlist .ied_item").css("opacity", 0.3); for (var i = 0; i < rel_ied_list.length; i++) { $("#network .network-iedlist .ied_item[ied_name='" + rel_ied_list[i] + "']").css("opacity", 1); } }); //绘制ap与总线的连接线 //初始连接线位置 var w = 10 * wRate; //固定间隔距离 if (sourceNetworkEle.length == 0) { return; } var linkLeft = sourceNetworkEle.position().left + (sourceNetworkEle.width() - ((loadApInfo.length - 1) * w)) / 2; var startTop = sourceNetworkEle.position().top + sourceNetworkEle.height() + sourceNetworkEle.css("margin-top").replace("px", "") * 1; $aplistEle.find(".sub_line").each(function(ind) { var tmp0 = $(this); var h = tmp0.position().top + tmp0.parent().position().top - startTop; network.append('
'); }); var iedListTop = $("#network .sub_line:last").position().top + $("#network .sub_line:last").parent().position().top + 60 * hRate; var iedListH = $("#container_map_ied .network").height() - iedListTop; ledlist.css({ "top": iedListTop, //"height": iedListH + "px" }); //加载IED var iedListDiv = $("#network .network-iedlist>div:first"); $aplistEle.find(".sub_line").each(function() { var apname = $(this).attr("apname"); //ap对应的总线 var totalLine = network.find(".sub_line[apname='" + apname + "']"); var vTop = totalLine.position().top + totalLine.parent().position().top + totalLine.height(); var viedList = PoliceObject.NetWork_ApNodes[networkid + "." + apname]; if (viedList.list == null) return; for (var i = 0; i < viedList.list.length; i++) { var ieddata = viedList.list[i].ied_name; var curIed = network.find(".network-iedlist .ied_item[ied_name='" + ieddata.attr_ied_name + "']"); if (curIed.length == 0) { var iplist = []; var ip = PoliceObject.IedNetaddrList[ieddata.attr_ied_name + "ip"]; if (ip != null) { for (var ipi = 0; ipi < ip.length; ipi++) { iplist.push('
' + ip[ipi].node_value + '
'); } } iedListDiv.append('
' + ieddata.attr_desc + '
' + ieddata.attr_ied_name + '
' + iplist.join("") + '
'); curIed = network.find(".network-iedlist .ied_item[ied_name='" + ieddata.attr_ied_name + "']"); } //绘制总线与IED连接线 var left = curIed.position().left.toFixed(1); var h = curIed.position().top - vTop + ledlist.position().top + 40 * hRate; var lineCss = "left:" + left + "px;top:" + vTop + "px;height:" + h + "px"; network.append('
'); var w = 45 * wRate; var lineCss2 = "left:" + left + "px;top:" + (vTop + h) + "px;width:" + w + "px"; network.append('
'); } }); iedListDiv.find(".ied_item").off().on('click', function() { //点击装置时查看装备信息 var t = $(this); //查看IED信息 DialogObject.Open($("#dialog_public"), { size: ["150rem", "72rem"], para: { "title": t.attr("title") + "(" + t.attr("ied_name") + ")—详细信息", "ied_id": t.attr("id"), "ied_name": t.attr("ied_name"), }, callback: function(win, p1) { win.attr("ied_name", p1.ied_name); win.find(".caption>b").html(p1.title); var h = (win.height() - win.find(".caption").height() - win.find(".footer").height() - 20 * hRate); //20为paddingTop win.find(".dataitemlist").height(h + "px").html(template('ied_detail_tpl', {})); win.find(".content").height(h - win.find(".tools").height() + "px"); win.find("#ied_list_tree").height(h - 20 * hRate); //20为底边留空 //绑定快速查找 win.find("#ied_list_tree .fast_find_list").off().on("input propertychange", function() { var v = ($(this).val()).toLocaleLowerCase(); var tarEle = win.find("#ied_list_tree .station_list_item"); if (v == "") tarEle.removeClass("hidden"); else { tarEle.each(function() { var $this = $(this); if ($this.text().toLocaleLowerCase().indexOf(v) > -1) $this.removeClass("hidden"); else $this.addClass("hidden"); }) } }); PoliceObject.LoadIedGraph(null, PoliceObject.IedList[p1.ied_name]); } }); }); //如果有2条及以上总线时,需要判断同一设备是否接入多条总线,是则需要微调连接位置 ,使其不重合 if ($aplistEle.find(".sub_line").length > 0) { var leftSameLine = {}; network.find(".network-ied-line").each(function() { var t = $(this); var v_apname = t.attr("apname"); var v_left = t.css("left"); if (leftSameLine[v_left] == null) leftSameLine[v_left] = [{ "apname": v_apname, "ele": t }]; else { var has = 0; for (var i = 0; i < leftSameLine[v_left].length; i++) { if (leftSameLine[v_left][i].apname == v_apname) { has = 1; break; } } if (has == 0) leftSameLine[v_left].push({ "apname": v_apname, "ele": t }); } }) //遍历查找同一ap同一left相同连线数量大于2条的 //console.log(leftSameLine) for (var left in leftSameLine) { if (leftSameLine[left].length < 2) continue; for (var i = 1; i < leftSameLine[left].length; i++) { //从第二条开始微调left var v_ele = leftSameLine[left][i].ele; var oldLeft = v_ele.css("left"); var v_apname = leftSameLine[left][i].apname; network.find(".network-ied-line[apname='" + v_apname + "']").each(function() { var t1 = $(this); var t1Left = t1.css("left"); if (oldLeft == t1Left) { t1.css({ "left": oldLeft.replace("px", "") * 1 - (i * 5 * wRate) + "px", "height": t1.height() + (i * 5) + "px" }); } }); //调整当前总线-连接线上的装置连接线 network.find(".network-ied-line2[apname='" + v_apname + "']").each(function() { var t1 = $(this); var t1Left = t1.css("left"); var t1OldTop = t1.css("top"); if (oldLeft == t1Left) { var newTop = t1OldTop.replace("px", "") * 1 + (i * 5 * hRate); t1.css({ "top": newTop + "px", "width": t1.width() + (i * 5 * wRate) + "px", "left": oldLeft.replace("px", "") * 1 - (i * 5 * wRate) + "px" }); } }); } } } var divH = $("#container_map_ied").height() - $("#container_map_ied .scd_tools").height() - (70 * hRate); network.slimScroll({ height: divH + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }) network.height(divH); layer.closeAll(); } if (PoliceObject.NetWork_ApNodes == null) { $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": PoliceObject.ScdID, "pagesize": 10000, "name": "ConnectedAP" }, function(list) { PoliceObject.NetWork_ApNodes = {}; for (var i = 0; i < list.data.length; i++) { var pid = list.data[i].parent_node_id; var apname = list.data[i]["attr_ap_name"]; var key = pid + "." + apname; if (PoliceObject.NetWork_ApNodes[key] == null) { PoliceObject.NetWork_ApNodes[key] = ($.extend({ "node_type": "ap", "name": key, list: [{ "ied_name": list.data[i] }] }, list.data[i])); } else { PoliceObject.NetWork_ApNodes[key].list.push({ "ied_name": list.data[i] }); } } network.find(".apname").off().on('click', function() { var $t = $(this); LoadIedGraph(null, $t.parent().parent().find(".network_name").text() + "—" + $t.attr("apname"), "ap"); }); //PoliceObject.NetWork_ApNodes.sort(Tools.SortBy("name", true)) loadNetworkAPInfo(); }); } else { loadNetworkAPInfo(); } }) }, LoadIedList: function() { //layer.msg("努力加载文件数据中...") $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/relation", { "scd_id": PoliceObject.ScdID }, function(r) { PoliceObject.IedList = r.data; var container_map_ied = $("#container_map_ied"); container_map_ied.find(".scd_filter .iedNumber>b").html(r.count); var firstShowIed = "", refCount = 0; for (var iedname in r.data) { if (refCount < r.data[iedname].list.length) { firstShowIed = iedname; refCount = r.data[iedname].list.length; } } iedLoadState = 1; PoliceObject.LoadIedNetAddr(); }); }, LoadIedNetAddr: function() { PoliceObject.IedNetaddrList = {}; $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/netaddr", { "scd_id": PoliceObject.ScdID }, function(r) { if (r.code != 0) { $("#network").html(Tools.HintText(r.msg + "\n该SCD可能已被清理,需要重新分析!")); return; } if (r.data == null) { $("#network").html(Tools.HintText("未发现网络配置信息,或者该SCD可能已被清理,需要重新分析!")); return; } for (var i = 0; i < r.data.length; i++) { var k = r.data[i].attr_ied_name + r.data[i].addrtype; var lst = PoliceObject.IedNetaddrList[k]; if (lst == null) PoliceObject.IedNetaddrList[k] = [r.data[i]]; else PoliceObject.IedNetaddrList[k].push(r.data[i]); } netaddrLoadState = 1; if ($("#network .network-iedlist .ied_item").length == 0) { //尝试再加载一次网络结构 PoliceObject.GetSubNetwork(); } }); }, OpenShowIedList: function(title, filter_cond) { var tmp_load = function(title, data) { DialogObject.Open($("#dialog_public"), { size: ["122rem", "70rem"], para: { "title": title, "list": data }, callback: function(win, para) { win.find(".caption>b").html(para.title); var h = template("ied_list_tpl", { data: para.list }); win.find(".dataitemlist").css("margin-top", "-2rem").html(h).slimScroll({ height: (win.height() - win.find(".caption").height() - win.find(".footer").height()) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); win.find(".ied_list_item").off().on('click', function() { var t = $(this); //查看IED信息 DialogObject.Open($("#dialog_public"), { size: ["150rem", "72rem"], para: { "title": t.find("span:last").text() + "(" + t.find("span:first").text() + ")—详细信息", "ied_id": t.attr("id"), "ied_name": t.attr("name"), }, callback: function(win, p1) { win.attr("ied_name", p1.ied_name); win.find(".caption>b").html(p1.title); var h = (win.height() - win.find(".caption").height() - win.find(".footer").height()); win.find(".dataitemlist").height(h + "px").html(template('ied_detail_tpl', {})); win.find(".content").height(h - win.find(".tools").height() + "px"); win.find("#ied_list_tree").height(h - 20 * hRate); //绑定快速查找 win.find("#ied_list_tree .fast_find_list").off().on("input propertychange", function() { var v = ($(this).val()).toLocaleLowerCase(); var tarEle = win.find("#ied_list_tree .station_list_item"); if (v == "") tarEle.removeClass("hidden"); else { tarEle.each(function() { var $this = $(this); if ($this.text().toLocaleLowerCase().indexOf(v) > -1) $this.removeClass("hidden"); else $this.addClass("hidden"); }) } }); PoliceObject.LoadIedGraph(null, PoliceObject.IedList[p1.ied_name]); } }); }); } }); } var lst = []; //判断是否是根据间隔ID来查看 $.getJSON(Global.AccessUrl + "/api/scd/area/ied/list", { scd_id: PoliceObject.ScdID, area_id: filter_cond.area_id, voltage_level_id: filter_cond.voltage_level_id, device_type_id: filter_cond.device_type_id }, function(r) { if (r.code != 0) { layer.msg(r.msg, { icon: Global.ICON_ERROR }); return; } if (r.data == null) { layer.msg("该类型下无装置!", { icon: Global.ICON_ERROR }) return } tmp_load(title, r.data.sort(Tools.SortBy("attr_name", true))); }) }, LoadIedNetWorkInfo: function(ied_name, scdid, callback) { if (scdid == null) scdid = ""; var lst = PoliceObject.GetIedData(ied_name, scdid).network; if (lst != null) { if (callback != null) callback(lst); return; } $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/network/info", { "scd_id": scdid == null || scdid == "" ? PoliceObject.ScdID : scdid, "ied_name": ied_name }, function(r) { if (r.code != 0) { return; } var ieddata = PoliceObject.OtherIedList[scdid + ied_name]; if (ieddata != null) ieddata["network"] = r.data; else PoliceObject.IedList[ied_name]["network"] = r.data; if (callback != null) callback(r.data); }) }, LoadIedTreeList: function(iedListTree, isrefesh) { this.LoadIedTreeList2(iedListTree, null, isrefesh); }, LoadIedTreeList2: function(iedListTree, iedlist, isrefesh) { iedListTree = iedListTree == null ? $("#ied_list_tree") : iedListTree; if (isrefesh == null && iedListTree.attr("isloaded") == "1") return; if (iedListTree.find(".station_list_item").length == 0) { var iedListTreeDiv = iedListTree.children("div:last").html('').slimscroll({ height: (iedListTree.height() - iedListTree.children("div:first").height()) + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); var lstItems = []; var isOtherScdid = ""; if (iedlist != null) { for (var i = 0; i < iedlist.length; i++) { isOtherScdid = iedlist[i].scd_id; lstItems.push({ "scd_id": iedlist[i].scd_id, "code": iedlist[i].ied_name, "name": "" + iedlist[i].ied_name + "" + iedlist[i].ied_desc + "" }); } } else { for (var ied_name in PoliceObject.IedList) { lstItems.push({ "code": ied_name, "name": "" + ied_name + "" + PoliceObject.IedList[ied_name].desc + "" }); } } iedListTreeDiv.html(template('select_item_tpl', { data: lstItems.sort(Tools.SortBy("code", true)) })).find(".station_list_item").attr("scd_id", isOtherScdid).off().on('click', function() { iedListTreeDiv.find(".active").removeClass("active"); var $t = $(this), v = $t.attr("value"); $t.addClass("active"); var scdid = $.trim($t.attr("scd_id")); $t.parents(".site_device_list").attr("scd_id", scdid == "" ? PoliceObject.ScdID : scdid).attr("ied_name", v).find(".caption>b").html($t.children("span:last").text() + "(" + $t.children("span:first").text() + ")" + "—详细信息"); var tools = iedListTree.next(); //tools.find("li").removeClass("layui-this"); //tools.find("li:first").addClass("layui-this"); tools.find("li.layui-this").trigger('click'); //PoliceObject.LoadIedGraph(PoliceObject.IedList[v]); }); } var tools = iedListTree.next(); tools.find("li").removeClass("layui-this"); tools.find("li:first").addClass("layui-this"); iedListTree.attr("isloaded", "1"); }, LoadIedCtrlRelation: function(evt, ieddata) { //加载IED列表树 this.LoadIedTreeList($("#ied_list_tree")); var tmp_load = function(data) { ied_strcut_detail.html('').slimscroll({ height: ied_strcut_detail.height() + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); ied_strcut_detail.append(''); var selfIed = ied_strcut_detail.children(".ied_show_block.self_ied").html(ieddata.ied_name + "
" + ieddata.desc).attr("ied_name", ieddata.ied_name); var iddXY = ied_strcut_detail.position(); for (var i = 0; i < ieddata.list.length; i++) { var itme = ieddata.list[i]; if (itme.ref_ied_name == null || itme.ref_ied_name == "" || ied_strcut_detail.find("span[ied_name='" + itme.ref_ied_name + "']").length > 0) continue; if (itme.ref_type == "1") { //输入关系 ied_strcut_detail.append('' + itme.ref_ied_name + '
' + itme.ref_ied_desc + '
'); } else { //输出关系 ied_strcut_detail.append('' + itme.ref_ied_name + '
' + itme.ref_ied_desc + '
'); } } ied_strcut_detail.find(".salve_ied").off().on('click', function() { //点击装置进行切换 PoliceObject.LoadIedCtrlRelation(null, PoliceObject.GetIedData($(this).attr("ied_name"))); }); if (data.ControlBlock == null) return; //生成其他IED控制块 for (var i = 0; i < data.ControlBlock.length; i++) { var item = data.ControlBlock[i]; if (item.ref_type == 0) { //主IED输出到其他IED //var sourceCtrlID=item.ctrl_id; //目标IED //var toIedName=item.source_ied_name; continue; } if (item.ld_id == "") { console.log(item) continue; } var tarEle = ied_strcut_detail.find(".ied_show_block[ied_name='" + item.target_ied_name + "']"); var ldEle = tarEle.children(".ld[ld_id=" + item.ld_id + "]"); if (ldEle.length == 0) { tarEle.append('' + item.ld_inst + ' ' + item.ld_desc + ''); ldEle = tarEle.children(".ld[ld_id=" + item.ld_id + "]"); } ldEle.append('
' + item.ctrl_name + '
' + item.datset_desc + '
'); } var iedList = ied_strcut_detail.children("span.salve_ied"); for (var i = 0; i < iedList.length; i++) { if (i % 2 == 0) iedList.eq(i).addClass("left"); else iedList.eq(i).addClass("right"); } ied_strcut_detail.children("span.ied_show_block.left").each(function(ind) { var t = 150; if (ind > 0) { var $tmp = ied_strcut_detail.children("span.ied_show_block.left:eq(" + (ind - 1) + ")"); t = $tmp.position().top + $tmp.height() + 30; } $(this).css({ left: "5rem", top: t + "px" }); }); ied_strcut_detail.children("span.ied_show_block.right").each(function(ind) { var t = 150; if (ind > 0) { var $tmp = ied_strcut_detail.children("span.ied_show_block.right:eq(" + (ind - 1) + ")"); t = $tmp.position().top + $tmp.height() + 30; } $(this).css({ left: "90rem", top: t + "px" }); }); //计算主IED的高度 var lastLeftEle = ied_strcut_detail.children("span.ied_show_block.left:last"); var lastRigthEle = ied_strcut_detail.children("span.ied_show_block.right:last"); if (lastLeftEle.length > 0 && lastRigthEle.length > 0) selfIed.css("height", Math.max(lastLeftEle.position().top + lastLeftEle.height(), lastRigthEle.position().top + lastRigthEle.height()) + 50 + "px"); else if (lastLeftEle.length > 0) selfIed.css("height", Math.max(lastLeftEle.position().top + lastLeftEle.height(), 0) + 50 + "px"); else if (lastRigthEle.length > 0) selfIed.css("height", Math.max(0, lastRigthEle.position().top + lastRigthEle.height()) + 50 + "px"); else return; //生成主IED的控制块 makeSlefIedBlock(selfIed, data, drawRelationLine); } var drawRelationLine = function(data) { var selfIed = ied_strcut_detail.children(".ied_show_block.self_ied"); ied_strcut_detail.append(""); var canvas = PoliceObject.p_createCanvas(ied_strcut_detail.find("canvas")); //--------------------------- //绘制连接线 var selfIedXY = selfIed.position(); ied_strcut_detail.find(".ied_show_block.left .block").each(function() { //左侧ied输入到主IED的连接线 var t = $(this), xy = t.position(); var leftSelf = selfIedXY.left + selfIed.css("margin-left").replace("px", "") * 1; var left = xy.left + t.width() + t.parent().parent().position().left + (t.css("margin-left").replace("px", "") * 1) + 2; var top = xy.top + (t.height() / 2) + t.parent().parent().position().top + (t.css("margin-top").replace("px", "") * 1) + 1; var lineColor = "#134BEA"; var attrtype = $.trim(t.attr('attr_type')).toLocaleLowerCase(); if (attrtype != "" && "smv,sv".indexOf(attrtype) > -1) { lineColor = "red"; t.css({ "color": lineColor, "border-color": lineColor }); } PoliceObject.p_drawLine(canvas, [left, top], [leftSelf, top], lineColor); var n1 = PoliceObject.p_drawNumber(ied_strcut_detail, [leftSelf, top], [left, top], t.attr('inputs_cnt'), "left"); n1.attr({ "m_iedname": selfIed.attr("ied_name"), "s_iedname": t.parents(".salve_ied").attr("ied_name"), "s_ctrlid": t.attr('ctrl_id') }); }); ied_strcut_detail.find(".ied_show_block.right .block").each(function() { //右侧ied输入到主IED的连接线 var t = $(this), xy = t.position(); var left1 = selfIedXY.left + selfIed.width() + selfIed.css("margin-left").replace("px", "") * 1 + 5; var left2 = xy.left + t.parent().parent().position().left + (t.css("margin-left").replace("px", "") * 1) + 2; var top = xy.top + (t.height() / 2) + t.parent().parent().position().top + (t.css("margin-top").replace("px", "") * 1) + 1; var lineColor = "#134BEA"; var attrtype = $.trim(t.attr('attr_type')).toLocaleLowerCase(); if (attrtype != "" && "smv,sv".indexOf(attrtype) > -1) { lineColor = "red"; t.css({ "color": lineColor, "border-color": lineColor }); } PoliceObject.p_drawLine(canvas, [left2, top], [left1, top], lineColor); var n1 = PoliceObject.p_drawNumber(ied_strcut_detail, [left1, top], [left2, top], t.attr('inputs_cnt'), "right"); n1.attr({ "m_iedname": selfIed.attr("ied_name"), "s_iedname": t.parents(".salve_ied").attr("ied_name"), "s_ctrlid": t.attr('ctrl_id') }); }); //绘制输出连接线 var outR_cnt = 0; var outL_cnt = 0; for (var i = 0; i < data.ControlBlock.length; i++) { var item = data.ControlBlock[i]; //主IED输出到其他IED var sourceCtrl = selfIed.find(".block[node_id='" + item.ctrl_id + "']"); //目标IED var toIed = ied_strcut_detail.find(".ied_show_block[ied_name='" + item.source_ied_name + "']"); var x1, y1, x2, y2 = 0; var w, h, l, t = 0; var lineColor = "#516380"; var attrtype = $.trim(sourceCtrl.attr('attr_type')).toLocaleLowerCase(); if (attrtype != "" && "smv,sv".indexOf(attrtype) > -1) { lineColor = "red"; sourceCtrl.css({ "color": lineColor, "border-color": lineColor }); } if (item.ref_type == 0) { var direction = ""; if (toIed.hasClass("left")) { direction = "left"; //在左边 x1 = selfIedXY.left + sourceCtrl.position().left + sourceCtrl.css("margin-left").replace("px", "") * 1 + selfIed.css("margin-left").replace("px", "") * 1; y1 = selfIedXY.top + sourceCtrl.position().top + sourceCtrl.css("margin-top").replace("px", "") * 1 + selfIed.css("margin-top").replace("px", "") * 1 + sourceCtrl.height() / 2; x2 = toIed.position().left + toIed.width(); y2 = toIed.position().top + (toIed.height() / 2); PoliceObject.p_drawLine(canvas, [x1, y1], [x2, y2 + outL_cnt * 8], lineColor); outL_cnt++; } else { direction = "right"; //在右边 x1 = selfIedXY.left + sourceCtrl.position().left + sourceCtrl.width() + sourceCtrl.css("margin-left").replace("px", "") * 1 + selfIed.css("margin-left").replace("px", "") * 1 + 5; y1 = selfIedXY.top + sourceCtrl.position().top + sourceCtrl.css("margin-top").replace("px", "") * 1 + (sourceCtrl.height() / 2); x2 = toIed.position().left; y2 = toIed.position().top + (toIed.height() / 2); PoliceObject.p_drawLine(canvas, [x1, y1], [x2, y2 + outR_cnt * 8], lineColor); outR_cnt++; } var n1 = PoliceObject.p_drawNumber(ied_strcut_detail, [x1, y1], [x2, y2], item.inputs_cnt, direction); n1.attr({ "m_iedname": selfIed.attr("ied_name"), "s_iedname": item.source_ied_name, "m_ctrlid": item.ctrl_id, "s_ctrlid": "" }); } } //绑定控制块关系数量,点击数量打开许端子详细关系窗口 ied_strcut_detail.find(".inputs_num").off().on('click', function() { var tmpEle = $(this); DialogObject.Open($("#dialog_public"), { size: ["100rem", "55rem"], para: { "title": "虚端子—详细信息", "s_ied_name": $.trim(tmpEle.attr("s_iedname")), "m_ied_name": $.trim(tmpEle.attr("m_iedname")), "m_ctrlid": $.trim(tmpEle.attr("m_ctrlid")), "s_ctrlid": $.trim(tmpEle.attr("s_ctrlid")), "scd_id": ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID }, callback: function(win, p1) { win.find(".caption>b").html(p1.title); var h = (win.height() - win.find(".caption").height() - win.find(".footer").height() - win.find(".dataitemlist").css("padding-top").replace("px", "") * 1); var dataContent = win.find(".dataitemlist").height(h + "px").html(Tools.LoadingText("正在加载数据中...")).slimscroll({ height: h + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/inputs", p1, function(r) { dataContent.html("
"); if (r.code != 0) { layer.msg(r.msg); return; } var mIedEle = dataContent.find("#m_ied"); var sIedEle = dataContent.find("#s_ied"); mIedData = PoliceObject.GetIedData(p1.m_ied_name, p1.scd_id) sIedData = PoliceObject.GetIedData(p1.s_ied_name, p1.scd_id) mIedEle.append('
' + p1.m_ied_name + '' + mIedData.desc + '
'); sIedEle.append('
' + p1.s_ied_name + '' + sIedData.desc + '
'); //获取控制块信息 var inout_type = ""; //相对于主IED的输入输出关系 for (var i = 0; i < mIedData.ControlBlock.length; i++) { var ctrlInfo = mIedData.ControlBlock[i]; if (ctrlInfo.ctrl_id == p1.m_ctrlid || ctrlInfo.ctrl_id == p1.s_ctrlid) { inout_type = ctrlInfo.ref_type; //console.log(ctrlInfo) if (ctrlInfo.ref_type == 1) { //输入控制块 mIedEle.append('
' + (r.data[0].to_ld_inst || '') + " " + (r.data[0].to_ld_desc || '') + '
 
'); //输出控制块 sIedEle.append('
' + ctrlInfo.ld_inst + " " + ctrlInfo.ld_desc + '
' + ctrlInfo.ctrl_name + '' + ctrlInfo.datset_desc + '
'); } else { sIedEle.append('
' + (r.data[0].to_ld_inst || '') + " " + (r.data[0].to_ld_desc || '') + '
 
'); //输出控制块 mIedEle.append('
' + ctrlInfo.ld_inst + " " + ctrlInfo.ld_desc + '
' + ctrlInfo.ctrl_name + '' + ctrlInfo.datset_desc + '
'); } break; } } var mIedEleCtl = mIedEle.children("div:last"); var sIedEleCtl = sIedEle.children("div:last"); //生成许端子元素 for (var i = 0; i < r.data.length; i++) { var item = r.data[i]; var fIntAddr = item.attr_ld_inst + "/" + (item.attr_prefix || '') + item.attr_ln_class + item.attr_ln_inst + "." + item.attr_do_name + "." + item.attr_da_name; if (inout_type == 1) { mIedEleCtl.append('
' + item.to_doi_desc + '' + item.attr_int_addr + '
'); sIedEleCtl.append('
' + item.from_doi_desc + '' + fIntAddr + '
'); } else { mIedEleCtl.append('
' + item.from_doi_desc + '' + fIntAddr + '
'); sIedEleCtl.append('
' + item.to_doi_desc + '' + item.attr_int_addr + '
'); } } //重新计算 区域高度 mIedEle.height(mIedEleCtl.height() + 120 * hRate); sIedEle.height(sIedEleCtl.height() + 120 * hRate); var maxH = Math.max(mIedEle.height(), sIedEle.height()) + 100 * hRate; //dataContent.height(maxH); //绘制连接 dataContent.append(""); var canvas = PoliceObject.p_createCanvas(win.find("#canvas")); var m_ied_position = $("#m_ied").position(); var s_ied_position = win.find("#s_ied").position(); mIedEle.find(".inputs_extref").each(function(ind) { var ele = $(this), eleXY = ele.position(); var y = m_ied_position.top + eleXY.top + ele.parent().position().top + ele.height() / 2 - dataContent.css("padding-top").replace("px", "") * 1; var x = ele.offset().left - ele.css("margin-left").replace("px", "") * 1 - ele.parent().position().left - win.css("padding-left").replace("px", "") * 1; var masterIedJoinPoint = [x, y]; var s_ied_extref = win.find("#s_ied .inputs_extref:eq(" + ind + ")"); var sy = s_ied_position.top + s_ied_extref.position().top + s_ied_extref.parent().position().top + s_ied_extref.height() / 2 - dataContent.css("padding-top").replace("px", "") * 1; var sx = s_ied_extref.offset().left - s_ied_extref.css("margin-left").replace("px", "") * 1 - s_ied_extref.parent().position().left - s_ied_extref.width() - win.css("padding-left").replace("px", "") * 1; var salveJoinPoint = [sx, sy]; if (p1.m_ctrlid != "") { //m_Ied->s_Ied:连线从左到右,箭头在右 PoliceObject.p_drawLine(canvas, masterIedJoinPoint, salveJoinPoint, "#134BEA"); } else { //m_Ied<-s_Ied:连线从右到左,箭头在左 PoliceObject.p_drawLine(canvas, salveJoinPoint, masterIedJoinPoint, "#134BEA") } }) }); } }); }); } var makeSlefIedBlock = function(iedEle, data, callback) { var count = 0; if (data.SampledValueControl != null && data.SampledValueControl.length > 0) { for (var i = 0; i < data.SampledValueControl.length; i++) { var item = data.SampledValueControl[i]; iedEle.append('
' + item.ldinst + '/' + item.attr_name + '
' + item.datset_desc + '
'); count++; } } if (data.GSEControl != null && data.GSEControl.length > 0) { for (var i = 0; i < data.GSEControl.length; i++) { var item = data.GSEControl[i]; //if(item.attr_type!="GOOSE") continue; iedEle.append('
' + item.ldinst + '/' + item.attr_name + '
' + item.datset_desc + '
'); count++; } } PoliceObject.LoadIedNetWorkInfo(data.ied_name, ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, function(r) { for (var i = 0; i < r.length; i++) { var tmpEle = iedEle.children(".block[cb_name='" + r[i].ld_inst + "/" + r[i].cb_name + "']"); if (tmpEle.length == 0 || r[i].address_json == "") continue; var addressJson = JSON.parse(r[i].address_json); tmpEle.children("div:eq(2)").html("APPID:" + (addressJson["APPID"] || "")); } var lastBlock = iedEle.find(".block:last"); var totalH = lastBlock.position().top + lastBlock.height() + 60 + lastBlock.css("margin-top").replace("px", "") * 1; var iedEleH = iedEle.height(); var marginTop = 0; if (iedEleH < totalH) { iedEle.height(totalH + "px"); } else { marginTop = (iedEleH - totalH) / 2; iedEle.find(".block:first").css("margin-top", marginTop + "px"); } if (callback != null) callback(data); }); } if (evt != null) { var $t = $(evt); //切换显示div var chs = $t.parents(".dataitemlist").children(".content"); chs.children("div:eq(" + $t.index() + ")").removeClass("hidden"); chs.children("div:not(" + $t.index() + ")").addClass("hidden"); } var ele = $("#ied_relation").removeClass("hidden"); ele.parents(".site_device_list").attr("ied_name", ieddata.ied_name).find("b").html(ieddata.desc + "(" + ieddata.ied_name + ")—详细信息"); ele.children("div.tools").children("li").off().on("click", function() { var liclass = $.trim($(this).attr("class").replace("layui-this", "")); switch (liclass) { case "ref_map": //块关联图 PoliceObject.LoadIedCtrlRelation(null, ieddata); break; case "sv_send": //sv发送 PoliceObject.LoadIedSVSendBlockTable(null, ieddata); break; case "sv_revice": //sv接收 PoliceObject.LoadIedSVReviceBlockTable(null, ieddata); break; case "goose_send": //goose接收 PoliceObject.LoadIedGooseSendBlockTable(null, ieddata); break; case "goose_revice": //goose接收 PoliceObject.LoadIedGooseReviceBlockTable(null, ieddata); break; default: break; } }); if (!ele.children("div.tools").find(".ref_map").hasClass("layui-this")) { //如果当前不是块关联图,自动切换过去 ele.children("div.tools").find(".ref_map").addClass("layui-this").trigger('click'); return; } var ied_strcut_detail = ele.find("#ied_strcut_detail").html(""); ied_strcut_detail.html(Tools.LoadingText("正在加载装置(" + ieddata.ied_name + ")数据中...")); if (ieddata["GSEControl"] != null || ieddata["SampledValueControl"] != null) { //判断装置关联关系是否已分析.未分析时重新分析 if ($.trim(ieddata["isreset"]) != "1" && (ieddata.list == null || ieddata.list.length <= 1)) { $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/relation", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name, "reset": "1" }, function(r) { if (r.code != 0) { layer.msg("获取装置信息失败:" + r.msg) return; } layer.closeAll(); if (r.data == null) { return } ieddata = r.data[ieddata.ied_name]; ieddata["isreset"] = "1"; PoliceObject.IedList[ieddata.ied_name] = ieddata; PoliceObject.LoadIedCtrlRelation(null, ieddata, "1"); }); return; } else { tmp_load(ieddata); } } else { var scdid = $.trim(ied_strcut_detail.parents(".site_device_list").attr("scd_id")); scdid = scdid == "" ? PoliceObject.ScdID : scdid $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/ctrlblock", { "scd_id": scdid, "ied_name": ieddata.ied_name }, function(r) { if (r.code != 0) { layer.msg(r.msg); return; } ieddata["GSEControl"] = r.data.GSEControl; ieddata["SampledValueControl"] = r.data.SampledValueControl; PoliceObject.IedList[ieddata.ied_name] = ieddata; $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/ref/ctrlblock", { "scd_id": scdid, "ied_name": ieddata.ied_name, "forcerefresh": ieddata["isforcerefresh"] == null ? "0" : ieddata["isforcerefresh"] }, function(r1) { if (r1.code != 0) { layer.msg(r1.msg); return; } if ($.trim(ieddata["isforcerefresh"]) != "1") { //判断返回的块关系数是否与装置关系数相同,如果不同重新生成一次 if (r1.data != null && r1.data.length < ieddata.list.length) { ieddata["GSEControl"] = null; ieddata["SampledValueControl"] = null; ieddata["isforcerefresh"] = "1"; PoliceObject.LoadIedCtrlRelation(null, ieddata); return; } } ieddata["isforcerefresh"] = "0"; ieddata["ControlBlock"] = r1.data; PoliceObject.IedList[ieddata.ied_name] = ieddata; tmp_load(ieddata); }); }); } }, //装置关联关系 LoadIedGraph: function(evt, ieddata, node_type, isreset) { if (ieddata == null) return; //加载IED列表树 this.LoadIedTreeList($("#ied_list_tree")); if (evt != null) { var $t = $(evt); //切换显示div var chs = $t.parents(".dataitemlist").children(".content"); chs.children("div:eq(" + $t.index() + ")").removeClass("hidden"); chs.children("div:not(" + $t.index() + ")").addClass("hidden"); } var ele = $("#ied_info").removeClass("hidden"); ele.parents(".site_device_list").attr("ied_name", ieddata.ied_name).find("b").html(ieddata.desc + "(" + ieddata.ied_name + ")—详细信息"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(""); var iedRefList = ieddata.list; if (iedRefList == null || iedRefList.length == 0) { return; } if (iedRefList.length == 1 && isreset == null) { //尝试重新分析该装置关系 this.GetIedData(ieddata.ied_name); PoliceObject.LoadIedGraph(null, PoliceObject.IedList[ieddata.ied_name], node_type, 1); return } ied_strcut_detail.slimscroll({ height: ied_strcut_detail.height() + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); ied_strcut_detail.append(''); var selfIed = ied_strcut_detail.children(".ied_show_block.self_ied").html("
" + ieddata.ied_name + "
" + ieddata.desc + "
").attr("ied_name", ieddata.ied_name); var iddXY = ied_strcut_detail.position(); for (var i = 0; i < ieddata.list.length; i++) { var itme = ieddata.list[i]; var existRefIed = ied_strcut_detail.find("span[ied_name='" + itme.ref_ied_name + "']"); if (itme.ref_ied_name == null || itme.ref_ied_name == "" || existRefIed.length > 0) { if (existRefIed.attr("ref_type") != itme.ref_type) { //双向输入输出关系 existRefIed.attr("ref_type", '2'); } continue; } if (itme.ref_type == "1") { //输入关系 ied_strcut_detail.append('
' + itme.ref_ied_name + '
' + itme.ref_ied_desc + '
'); } else { //输出关系 ied_strcut_detail.append('
' + itme.ref_ied_name + '
' + itme.ref_ied_desc + '
'); } } ied_strcut_detail.find(".ied_show_item").off().on('click', function() { //点击装置进行切换 PoliceObject.LoadIedGraph(null, PoliceObject.IedList[$(this).attr("ied_name")]); }); var iedList = ied_strcut_detail.children("span.salve_ied"); for (var i = 0; i < iedList.length; i++) { if (i % 2 == 0) iedList.eq(i).addClass("left"); else iedList.eq(i).addClass("right"); } var leftIedCount = 0; ied_strcut_detail.children("span.ied_show_block.left").each(function(ind) { var t = 0; if (ind > 0) { var $tmp = ied_strcut_detail.children("span.ied_show_block.left:eq(" + (ind - 1) + ")"); t = $tmp.position().top + $tmp.height() + 50; } $(this).css({ left: "5rem", top: t + "px" }); leftIedCount++; }); var rightIedCount = 0; //右边IED显示的装置总数 ied_strcut_detail.children("span.ied_show_block.right").each(function(ind) { var t = 0; if (ind > 0) { var $tmp = ied_strcut_detail.children("span.ied_show_block.right:eq(" + (ind - 1) + ")"); t = $tmp.position().top + $tmp.height() + 50; } $(this).css({ left: "90rem", top: t + "px" }); rightIedCount++; }); //计算主IED的高度 var lastLeftEle = ied_strcut_detail.children("span.ied_show_block.left:last"); var lastRigthEle = ied_strcut_detail.children("span.ied_show_block.right:last"); if (lastLeftEle.length > 0 && lastRigthEle.length > 0) { selfIed.css("height", Math.max(lastLeftEle.position().top + lastLeftEle.height(), lastRigthEle.position().top + lastRigthEle.height()) + 50 + "px"); } else if (lastLeftEle.length > 0) selfIed.css("height", Math.max(lastLeftEle.position().top + lastLeftEle.height(), 500) + 50 + "px"); else if (lastRigthEle.length > 0) selfIed.css("height", Math.max(500, lastRigthEle.position().top + lastRigthEle.height()) + 50 + "px"); if (selfIed.height() < 500) selfIed.height(500); //中间的主IED最小高度 //当右边装置数量不是偶数时,需要重新排列右边装置的位置,主要是top位置 //if (rightIedCount % 2 != 0) { var rightIedFirst = ied_strcut_detail.children("span.ied_show_block.right:first"); if (rightIedFirst.length > 0) { var newRightFirstIedTop = (selfIed.height() - rightIedCount * (rightIedFirst.height() + (rightIedCount == 1 ? 0 : 50))) / 2; var topSubValue = newRightFirstIedTop - rightIedFirst.css("top").replace("px", "") * 1; //微调每一个右侧IED的top ied_strcut_detail.children("span.ied_show_block.right").each(function() { var v_ied_oldtop = $(this).css("top").replace("px", "") * 1; var t = v_ied_oldtop + topSubValue + selfIed.css("top").replace("px", "") * 1; if (t < 0) t = 0; $(this).css("top", t + "px"); }); } var leftIedFirst = ied_strcut_detail.children("span.ied_show_block.left:first"); if (leftIedFirst.length > 0) { var newLeftFirstIedTop = (selfIed.height() - leftIedCount * (leftIedFirst.height() + (leftIedCount == 1 ? 0 : 50))) / 2; var topSubValue = newLeftFirstIedTop - leftIedFirst.css("top").replace("px", "") * 1; //微调每一个左侧IED的top ied_strcut_detail.children("span.ied_show_block.left").each(function() { var v_ied_oldtop = $(this).css("top").replace("px", "") * 1; var t = v_ied_oldtop + topSubValue + selfIed.css("top").replace("px", "") * 1; if (t < 0) t = 10; $(this).css("top", t + "px"); }); } ied_strcut_detail.append(""); var canvas = this.p_createCanvas(ied_strcut_detail.find("canvas")); //绘制连接线 //主设备的左右边连接点[x,y] var masterIedLeftJoinPoint = [selfIed.position().left + selfIed.css("margin-left").replace("px", "") * 1, selfIed.position().top + selfIed.height() / 2]; var masterIedRightJoinPoint = [selfIed.position().left + selfIed.width() + selfIed.css("margin-left").replace("px", "") * 1, selfIed.position().top + selfIed.height() / 2]; //绘制左边连接 var inIedCnt = 0; ied_strcut_detail.children("span.ied_show_block.left").each(function(ind) { var t = $(this); var salveRightJoinPoint = [t.position().left + t.width() + 5 - (t.width() * 0.2), t.position().top + t.height() / 2]; if (t.attr("ref_type") == "0") //输出到其他IED PoliceObject.p_drawLine(canvas, masterIedLeftJoinPoint, salveRightJoinPoint, "#134BEA"); else if (t.attr("ref_type") == "1") { PoliceObject.p_drawLine(canvas, salveRightJoinPoint, [masterIedLeftJoinPoint[0], masterIedLeftJoinPoint[1] + inIedCnt * 5], "#516380"); inIedCnt++; } else { PoliceObject.p_drawLine(canvas, [masterIedLeftJoinPoint[0], masterIedLeftJoinPoint[1] + inIedCnt * 5], salveRightJoinPoint, "#516380"); PoliceObject.p_drawLine(canvas, salveRightJoinPoint, [masterIedLeftJoinPoint[0], masterIedLeftJoinPoint[1] + inIedCnt * 5], "#134BEA"); inIedCnt++; } //var n1 = PoliceObject.p_drawNumber(ied_strcut_detail, masterIedLeftJoinPoint, salveRightJoinPoint, 12, "left"); //n1.attr("ied_name", t.attr("ied_name")); }); //绘制右边连接 var outIedCnt = 0; ied_strcut_detail.children("span.ied_show_block.right").each(function(ind) { var t = $(this); var salveLeftJoinPoint = [t.position().left + (t.width() * 0.2) - 5, t.position().top + t.height() / 2]; if (t.attr("ref_type") == "0") //输出到其他IED { PoliceObject.p_drawLine(canvas, masterIedRightJoinPoint, salveLeftJoinPoint, "#134BEA"); } else if (t.attr("ref_type") == "1") { PoliceObject.p_drawLine(canvas, salveLeftJoinPoint, [masterIedRightJoinPoint[0], masterIedRightJoinPoint[1] + outIedCnt * 5], "#516380"); outIedCnt++; } else { PoliceObject.p_drawLine(canvas, [masterIedRightJoinPoint[0], masterIedRightJoinPoint[1] + outIedCnt * 5], salveLeftJoinPoint, "#516380"); PoliceObject.p_drawLine(canvas, salveLeftJoinPoint, [masterIedRightJoinPoint[0], masterIedRightJoinPoint[1] + outIedCnt * 5], "#134BEA"); outIedCnt++; } //var n1 = PoliceObject.p_drawNumber(ied_strcut_detail, masterIedRightJoinPoint, salveLeftJoinPoint, 12, "right"); //n1.attr("ied_name", t.attr("ied_name")); }); }, //指定指定SCD下的ied信息 OtherIedList: {}, GetIedData: function(ied_name, scdid) { if (scdid == null || scdid == PoliceObject.ScdID) scdid = ""; var ieddata = scdid != PoliceObject.ScdID ? PoliceObject.OtherIedList[scdid + ied_name] : PoliceObject.IedList[ied_name]; if (ieddata == null) { layer.msg("正在获取装置信息...", { time: 0 }); $.ajaxSettings.async = false; $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/relation", { "scd_id": (scdid == null || scdid == "") ? PoliceObject.ScdID : scdid, "ied_name": ied_name, "reset": "1" }, function(r) { $.ajaxSettings.async = true; if (r.code != 0) { layer.msg("获取装置信息失败:" + r.msg) return null; } layer.closeAll(); if (r.data == null) { return null; } ieddata = r.data[ied_name]; if (scdid != null && scdid != "" && scdid == PoliceObject.ScdID) PoliceObject.IedList[ied_name] = ieddata; else PoliceObject.OtherIedList[scdid + ied_name] = ieddata return ieddata; }); $.ajaxSettings.async = true; } layer.closeAll(); return ieddata; }, LoadIedAllPointRelation: function(evt, refdata) { if (evt != null) { var $t = $(evt); //切换显示div var chs = $t.parents(".dataitemlist").children(".content"); chs.children("div:eq(" + $t.index() + ")").removeClass("hidden"); chs.children("div:not(" + $t.index() + ")").addClass("hidden"); } var ele = $("#ied_allpoint_info").removeClass("hidden"); ele.parents(".site_device_list").attr("ied_name", refdata.ied_name).find("b").html(refdata.desc + "(" + refdata.ied_name + ")—详细信息"); var dataitemlist = ele.find("#ied_strcut_detail").html(PoliceObject.LoddingText); var curIedName = refdata.ied_name; /* for (var iedname in PoliceObject.IedList) { //输出关系 if (curIedName == iedname) { for (var i = 0; i < PoliceObject.IedList[iedname].list.length; i++) { var itme = PoliceObject.IedList[iedname].list[i]; if (itme.ref_type == "1") { //输入关系 ref_ied_list.append('' + itme.ref_ied_desc + ''); } else { //输出关系 ref_ied_list.append('' + itme.ref_ied_desc + ''); } } } }*/ var v_scdid = ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID; $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/inputs", { "scd_id": v_scdid, "ied_name": curIedName }, function(r) { PoliceObject.drawIedInputsRelation(v_scdid, refdata, dataitemlist, r.data); }) }, //绘制装置的输入输出关系图 drawIedInputsRelation: function(v_scdid, refdata, dataitemlist, data) { var w = dataitemlist.width(), h = dataitemlist.height(); var curIedName = refdata.ied_name //定义IED名称图形,该图形固定显示在中间,并且不显示连接点 dataitemlist.html("
" + refdata.desc + "" + curIedName + "
"); var links = []; var tmp = {}; var masterIed = dataitemlist.find(".master_ied"); var preExtrefEle_no = 0; for (var i = 0; i < data.length; i++) { var item = data[i]; if (item.no != null) { if (preExtrefEle_no > 0 && (preExtrefEle_no + 1) != (item.no * 1)) { //判断no是否是连续的,不连续时使用一个...代表中间有间隔 masterIed.append("
...
"); } preExtrefEle_no = item.no * 1; } var daname = $.trim(item["attr_da_name"]) == "" ? "" : "." + item["attr_da_name"]; var targetName = item["attr_ld_inst"] + "/" + item["attr_prefix"] + item["attr_ln_class"] + item["attr_ln_inst"] + "." + item["attr_do_name"] + daname; if (item.inout_type == "out") { masterIed.append("
" + (item["no"] || '') + "" + targetName + "
" + item["do_source_desc"] + "
"); } else { masterIed.append("
" + (item["no"] || '') + "" + item["attr_int_addr"] + "
" + item["do_target_desc"] + "
"); } var ied_slave = dataitemlist.find(".ied." + item.inout_type + "[ied_name='" + item.ied_name + "']"); if (ied_slave.length == 0) { var iedObj = PoliceObject.GetIedData(item.ied_name, item.scd_id || v_scdid) if (item.inout_type == "in") { var inIedCnt = dataitemlist.find(".ied.in:last"); var top = inIedCnt.length == 0 ? 10 : inIedCnt.height() + inIedCnt.position().top + 10; if (iedObj == null) { console.log(item) continue; } dataitemlist.append("
" + iedObj.desc + "" + item.ied_name + "
"); } else { var inIedCnt = dataitemlist.find(".ied.out:last"); var top = inIedCnt.length == 0 ? 10 : inIedCnt.height() + inIedCnt.position().top + 10; if (iedObj == null) { console.log(item) continue; } dataitemlist.append("
" + iedObj.desc + "" + item.ied_name + "
"); } ied_slave = dataitemlist.find(".ied." + item.inout_type + "[ied_name='" + item.ied_name + "']"); } if (item.inout_type == "out") { ied_slave.attr("class", "ied out"); //显示在主设备右边 ied_slave.find(".master_ied").append("
" + item["attr_int_addr"] + "
" + item["do_target_desc"] + "
"); } else { ied_slave.attr("class", "ied in"); //显示在主设备左边 ied_slave.find(".master_ied").append("
" + targetName + "
" + item["do_source_desc"] + "
"); } } if (item.opt == null) { dataitemlist.find(".ied").off().on('click', function() { //切换装置 PoliceObject.LoadIedAllPointRelation(null, PoliceObject.GetIedData($(this).attr("ied_name"), v_scdid)); }); } var maxTopHei = 0; dataitemlist.find(".ied.out").each(function(ind) { var $t = $(this); var thisIedName = $t.attr("ied_name"); var master_ied_first_extref = masterIed.children(".extref[to_ied_name='" + thisIedName + "']:first"); if (ind == 0) { $t.css({ "left": "auto", "right": "10%", "top": master_ied_first_extref.position().top + "px" }); } else { var prev = dataitemlist.find(".ied.out:eq(" + (ind - 1) + ")"); $t.css({ "left": "auto", "right": "10%", "top": (prev.position().top * 1 + prev.height() + 30) + "px" }); } var tmpH = $t.position().top * 1 + $t.height(); if (maxTopHei < tmpH) maxTopHei = tmpH; }); dataitemlist.find(".ied.in").each(function(ind) { var $t = $(this); if (ind == 0) { $t.css({ "left": "20%", "right": "auto", "top": "1rem" }); } else { var prev = dataitemlist.find(".ied.in:eq(" + (ind - 1) + ")"); $t.css({ "left": "20%", "right": "auto", "top": (prev.position().top * 1 + prev.height() + 30) + "px" }); } var tmpH = $t.position().top * 1 + $t.height(); if (maxTopHei < tmpH) maxTopHei = tmpH; }); var masterParentIed = masterIed.parent(); var master_ied_H = masterParentIed.position().top * 1 + masterParentIed.height(); if (maxTopHei < master_ied_H) maxTopHei = master_ied_H; dataitemlist.append("
"); dataitemlist.slimscroll({ height: dataitemlist.height() + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); dataitemlist.append(""); var canvas = PoliceObject.p_createCanvas(dataitemlist.find("canvas")); var lastIed = dataitemlist.find(".ied.blank"); var topP = dataitemlist.offset(); dataitemlist.find(".extref").each(function() { var $t = $(this), toiedname = $.trim($t.attr("to_ied_name")), toextref = $t.attr("to_addr"); var currIedname = $t.parent().parent().attr("ied_name"); if (toiedname == "") { return; } var point = $t.find(".linkpoint_right,.linkpoint_left"); try { if (point.length > 0) { var toEle = dataitemlist.find(".ied[ied_name='" + toiedname + "'] .extref[intaddr='" + toextref + "'][in_ied_name='" + currIedname + "']").find(".linkpoint_right,.linkpoint_left"); var p = point.position(), p1 = point.parents(".ied"); var t = toEle.position(), t1 = toEle.parents(".ied"); var sourceLeft = p1.position().left * 1; if (point.hasClass("linkpoint_right")) sourceLeft = sourceLeft + p1.width() + 5 - (p1.css("margin-left").replace("px", "") * -1); else sourceLeft = p1.left - (p1.css("margin-left").replace("px", "") * -1); var targetLeft = t1.position().left * 1; if (toEle.hasClass("linkpoint_right")) targetLeft = targetLeft + t1.width() + 5 - (t1.css("margin-left").replace("px", "") * -1); else targetLeft = targetLeft - (t1.css("margin-left").replace("px", "") * -1); //p_drawPoly(canvascontext, [sourceLeft, p.top * 1 - topP.top + 5], [targetLeft, t.top * 1 - topP.top + 5]); PoliceObject.p_drawLine(canvas, [sourceLeft, p1.position().top * 1 + 5 + point.parent().position().top + point.position().top], [targetLeft, t1.position().top + toEle.parent().position().top + toEle.position().top + 5], "#A6B1BF"); } } catch (e) { console.log(e) } }) }, //加载装置基本信息 LoadIedStrcut: function(evt, ieddata) { //console.log(ieddata) if (evt != null) { var $t = $(evt); //切换显示div var chs = $t.parents(".dataitemlist").children(".content"); chs.children("div:eq(" + $t.index() + ")").removeClass("hidden"); chs.children("div:not(" + $t.index() + ")").addClass("hidden"); } var ele = $("#ied_basicinfo").removeClass("hidden"); if (ele.parent().hasClass("slimScrollDiv")) { ele.parent().removeClass("hidden"); } var ied_strcut_detail = ele.find("#ied_strcut_detail").html(PoliceObject.LoddingText); ele.slimscroll({ height: ele.height() + "px", width: "100%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); var iddXY = ied_strcut_detail.position(); $.getJSON(Global.AccessUrl + "/api/screen/scd/node/attrs", { "scd_id": ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "node_id": ieddata.node_id, "ied_name": ieddata.ied_name, }, function(list) { var thisIedName = list.data.name; var wh = 200 * wRate; var l = (ele.width() - wh) / 2; ied_strcut_detail.html('
' + list.data.desc + '
' + list.data.name + '
' + list.data.manufacturer + '
' + list.data.type + '
'); //生成IED装备固上定位置的连接点(上下左右) var tmpIed = ied_strcut_detail.find(".ied_strcut"); var tmpIedOffset = tmpIed.position(); //主设备上的4连接点坐标 var iedTopPointXY = [tmpIedOffset.left + tmpIed.width() / 2, tmpIedOffset.top - iddXY.top]; var iedBottompointXY = [tmpIedOffset.left + tmpIed.width() / 2, tmpIedOffset.top - iddXY.top + tmpIed.height()]; var iedLeftPointXY = [tmpIedOffset.left, tmpIedOffset.top - iddXY.top + tmpIed.height() / 2]; var iedRightPointXY = [tmpIedOffset.left + tmpIed.width(), tmpIedOffset.top - iddXY.top + tmpIed.height() / 2]; //在界面上创建主IED在连接点 ied_strcut_detail.append(''); //固定的dataset关系 ied_strcut_detail.append('
'); var accesspointEle = ied_strcut_detail.find(".accessPoint[accessPoint='DataSet']").css("left", function() { return iedTopPointXY[0] - $(this).width() / 2; }); var datasetPointStart = ied_strcut_detail.find(".ied_linkpoint[accessPoint='DataSet']").css({ "left": iedTopPointXY[0], "top": accesspointEle.position().top + accesspointEle.height() - iddXY.top - 10 }); //生成固定的dataset连接线 var datasetlineheight = (iddXY.top + iedTopPointXY[1] - datasetPointStart.position().top); ied_strcut_detail.append('
DataSet
'); //加载DataSet列表 PoliceObject.LoadDataSet(thisIedName); $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "pagesize": 10000, "ied_name": thisIedName, "name": "AccessPoint" }, function(result) { //生成访问点并进行布局。现固定支持最多3个accesspoint for (var i = 0; i < result.data.length; i++) { var master_link_point = ied_strcut_detail.find(".ied_linkpoint[ind=" + (i + 1) + "]").removeClass("hidden"); if (master_link_point.length == 0) continue; var item = result.data[i]; var css = ""; var linkpoint_css = ""; var top = master_link_point.position().top - iddXY.top; var linpoint_left = 0; if (i == 0) { //底边区域:第一个访问点生成及位置 var top1 = top + 120; var left = master_link_point.position().left - ied_strcut_detail.width() / 2; //left=master_link_point.offset().left-left; css = 'width:39rem;height:auto;left:50%;top:' + top1 + 'px;margin-left: -20rem;min-height: 5rem;'; linpoint_left = iedBottompointXY[0]; linkpoint_css = 'top: ' + (top1 - 5) + 'px;'; } else if (i == 1) { //右边区域:第2个访问点生成及位置 var top1 = top - 20; css = 'width:39rem;height:auto;left:17%;top:' + top1 + 'px;margin-left: -20rem;min-height: 5rem;'; linkpoint_css = 'top: ' + iedLeftPointXY[1] + 'px;'; } else if (i == 2) { //右边区域:第3个访问点生成及位置 var top1 = top - 20; //var left=master_link_point.offset().left-ied_strcut_detail.width()*0.75; css = 'width:39rem;height:auto;left:80%;top:' + top1 + 'px;margin-left: -20rem;min-height: 5rem;'; linkpoint_css = 'top: ' + iedRightPointXY[1] + 'px;'; } //生成AccessPoint区域 ied_strcut_detail.append('
' + item.attr_name + ' (' + (item.attr_desc || '—') + ')
正在加载网络信息...
LDevice
'); if (i > 0) { //计算左右2侧accesspoint上的连接点left位置 accesspointEle = ied_strcut_detail.find(".accessPoint[accessPoint='" + item.attr_name + "']"); linpoint_left = accesspointEle.position().left + accesspointEle.css("margin-left").replace("px", "") * 1; if (i == 1) linpoint_left = linpoint_left + accesspointEle.width(); } //生成目标连接点 ied_strcut_detail.append(''); } //生成连线 ied_strcut_detail.find(".ied_linkpoint[accessPoint='ied']").each(function() { var $t = $(this), start = $t.position(); if (!$t.hasClass("hidden")) { var ind = $t.attr("ind"); if (ind == "") return; //dataset的连接点不具备ind属性 //需要连接的目标AccessPoint var toEle = ied_strcut_detail.find(".ied_linkpoint[ind=" + ind + "][accessPoint!='ied']"), to = toEle.position(); //计算连线长度 var line_width = Math.abs(start.left - to.left); if (ind == 1) { //连线高度 line_width = Math.abs(start.top - to.top); ied_strcut_detail.append('
AccessPoint
'); } else { //判断目标AccessPoint在主IED在左边还是右边 if (start.left < to.left) ied_strcut_detail.append('
AccessPoint
'); else { ied_strcut_detail.append('
AccessPoint
'); } } } }); //获取每个访问点下的Ldevice列表 for (var i = 0; i < result.data.length; i++) { PoliceObject.LoadLdeviceList(result.data[i].node_id, result.data[i].attr_name); } //获取设备的网络信息 PoliceObject.LoadIedNetWorkInfo(ieddata.ied_name, ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, function(r) { var tmpEle = ied_strcut_detail.find(".accessPoint .networkinfo").html(""); for (var i = 0; i < r.length; i++) { var apName = r[i].ap_name; var accesspointEle = ied_strcut_detail.find(".accessPoint[accessPoint='" + apName + "']"); if (accesspointEle.length == 0) continue; var address_json = $.trim(r[i].address_json); if (address_json == "") continue; address_json = JSON.parse(address_json); var accesspointNetEle = accesspointEle.children(".networkinfo"); var netHtml = []; netHtml.push('
'); netHtml.push('
MAC-Address:' + (address_json['MAC-Address'] || "无") + '
'); netHtml.push('
VLAN-PRIORITY:' + (address_json['VLAN-PRIORITY'] || "无") + '
'); netHtml.push('
APPID:' + (address_json['APPID'] || "无") + '
'); netHtml.push('
VLAN-ID:' + (address_json['VLAN-ID'] || "无") + '
'); netHtml.push('
'); accesspointNetEle.append(netHtml.join("")); var accesspointNumnerEle = accesspointEle.children(".networkinfo_nmuber"); accesspointNumnerEle.append('' + (accesspointNumnerEle.children("span").length + 1) + ''); } ied_strcut_detail.find(".accessPoint[accessPoint]").each(function() { var t123 = $(this).find(".networkinfo"); if (t123.children("div").length == 0) { t123.addClass("hidden") } }); ied_strcut_detail.find(".networkinfo_nmuber").each(function() { var me = $(this); var mespan = me.children('span'); if (mespan.length > 1) me.removeClass("hidden"); else return; mespan.off().on('click', function() { var t = $(this); var tp = t.parent().prev(); t.parent().children(".active").removeClass("active"); tp.children("div").addClass("hidden"); tp.children("div[cbname='" + t.attr("title") + "']").removeClass("hidden"); t.addClass("active"); }).eq(0).trigger('click'); }); }); }); }); }, //加载装置定值条目 LoadIedDingzhiTable: function(evt, ieddata) { ///api/screen/scd/dingzhi/list?scd_id=4000002&pagesize=10000&ied_name=AE1101&name=DataSet var $t = null; if (evt != null) { var $t = $(evt); //切换显示div var chs = $t.parents(".dataitemlist").children(".content"); chs.children("div:eq(" + $t.index() + ")").removeClass("hidden"); chs.children("div:not(" + $t.index() + ")").addClass("hidden"); } var ele = $("#ied_dingzhiinfo").removeClass("hidden"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(PoliceObject.LoddingText); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/dingzhi", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name }, function(jsondata) { if (jsondata.code != 0) { layer.msg(jsondata.msg) return; } if (jsondata.data.length == 0) { ied_strcut_detail.html(Tools.HintText("没有定值信息")); return; } ied_strcut_detail.html('
定值条目列表详情(共 条)
'); var tmpDsList = ied_strcut_detail.find(".datasetlist"); for (var i = 0; i < jsondata.data.length; i++) { jsondata.data[i]["fcdalist"] = JSON.stringify(jsondata.data[i]["list"]); } tmpDsList.html(template("dingzhi_datasetlist_tpl", jsondata)).find("tbody>tr").off('click').on('click', function() { tmpDsList.find("tr.active").removeClass("active"); var fcdalist = $.trim($(this).addClass("active").attr("fcdalist")); var targetdiv = ied_strcut_detail.find(".fcdalist"); $("#dataset_fcda_total").html("-"); if (fcdalist == "") { targetdiv.html(Tools.HintText("没有条目信息")); return; } fcdalist = JSON.parse(fcdalist); ied_strcut_detail.find("#dataset_fcda_total").html(fcdalist.length); targetdiv.html(template("dingzhi_fcdalist_tpl", { "data": fcdalist })).find("tbody>tr").off('click').on('click', function() { targetdiv.find("tr.active").removeClass("active"); $(this).addClass("active"); }); targetdiv.children(".detailtable").slimscroll({ height: targetdiv.height() - targetdiv.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); }); tmpDsList.children(".detailtable").slimscroll({ height: tmpDsList.height() - (tmpDsList.css("margin").replace("px", "") * 2) - tmpDsList.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); tmpDsList.height(tmpDsList.height() - 24).find("tbody>tr:first").trigger('click'); }); }, //加载信息点表 LoadIedPointTable: function(evt, ieddata) { ///api/screen/scd/dingzhi/list?scd_id=4000002&pagesize=10000&ied_name=AE1101&name=DataSet var $t = null; if (evt != null) { var $t = $(evt); //切换显示div var chs = $t.parents(".dataitemlist").children(".content"); chs.children("div:eq(" + $t.index() + ")").removeClass("hidden"); chs.children("div:not(" + $t.index() + ")").addClass("hidden"); } var ele = $("#ied_pointtableinfo").removeClass("hidden"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(PoliceObject.LoddingText); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/pointtable", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name }, function(jsondata) { if (jsondata.code != 0) { layer.msg(jsondata.msg) return; } if (jsondata.data.length == 0) { ied_strcut_detail.html(Tools.HintText("没有信息点表")); return; } ied_strcut_detail.html('
点表条目列表详情(共 条)
'); var tmpDsList = ied_strcut_detail.find(".datasetlist"); for (var i = 0; i < jsondata.data.length; i++) { jsondata.data[i]["fcdalist"] = JSON.stringify(jsondata.data[i]["list"]); jsondata.data[i]["point_cnt"] = jsondata.data[i]["list"].length; } tmpDsList.html(template("pointtable_datasetlist_tpl", jsondata)).find("tbody>tr").off('click').on('click', function() { tmpDsList.find("tr.active").removeClass("active"); var fcdalist = $.trim($(this).addClass("active").attr("fcdalist")); var targetdiv = ied_strcut_detail.find(".fcdalist"); $("#dataset_fcda_total").html("-"); if (fcdalist == "") { targetdiv.html(Tools.HintText("没有条目信息")); return; } fcdalist = JSON.parse(fcdalist); ied_strcut_detail.find("#dataset_fcda_total").html(fcdalist.length); targetdiv.html(template("pointtable_fcdalist_tpl", { "data": fcdalist })).find("tbody>tr").off('click').on('click', function() { targetdiv.find("tr.active").removeClass("active"); $(this).addClass("active"); }); targetdiv.children(".detailtable").slimscroll({ height: targetdiv.height() - targetdiv.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); }); tmpDsList.children(".detailtable").slimscroll({ height: tmpDsList.height() - (tmpDsList.css("margin").replace("px", "") * 2) - tmpDsList.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); tmpDsList.height(tmpDsList.height() - 24).find("tbody>tr:first").trigger('click'); }); }, //加载信息点表 LoadIedSourceXML: function(evt, ieddata) { var $t = null; if (evt != null) { var $t = $(evt); //切换显示div var chs = $t.parents(".dataitemlist").children(".content"); chs.children("div:eq(" + $t.index() + ")").removeClass("hidden"); chs.children("div:not(" + $t.index() + ")").addClass("hidden"); } var ele = $("#ied_sourcexmlinfo").removeClass("hidden"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(PoliceObject.LoddingText); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/sourcexml", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name }, function(jsondata) { if (jsondata.code != 0) { layer.msg(jsondata.msg) return; } ied_strcut_detail.html(""); }); }, //加载SV发送列表 LoadIedSVSendBlockTable: function(evt, ieddata) { var ele = $("#ied_relation").removeClass("hidden"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(Tools.LoadingText("正在加载装置(" + ieddata.ied_name + ")数据中...")); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/ctrlblock", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name }, function(jsondata) { if (jsondata.code != 0) { ied_strcut_detail.html(jsondata.msg); return; } if (jsondata.data.SampledValueControl == null || jsondata.data.SampledValueControl.length == 0) { ied_strcut_detail.html(Tools.HintText("该装置无SV发送")) return; } var h = template('svsend_datasetlist_tpl', { "data": jsondata.data.SampledValueControl }); ied_strcut_detail.html('
SMV端子列表详情(共 条)
'); var tmpDsList = ied_strcut_detail.find(".datasetlist"); tmpDsList.html(h).find("tbody>tr").off('click').on('click', function() { tmpDsList.find("tr.active").removeClass("active"); var fcdalist = $.trim($(this).addClass("active").attr("fcdalist")); var ctrlId = $(this).attr("ctrl_id") var targetdiv = ied_strcut_detail.find(".fcdalist"); $("#dataset_fcda_total").html("-"); targetdiv.html(Tools.HintText("正在加载端子列表数据...")); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/smv_ctrlblock/sendfcdalist", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name, "ctrlid": ctrlId }, function(jsondata) { if (jsondata.code != 0) { targetdiv.html(Tools.HintText(jsondata.msg)); return; } if (jsondata.data == null || jsondata.data.length == 0) { $("#dataset_fcda_total").html("0"); targetdiv.html(Tools.HintText("未查找到端子列表")); return; } $("#dataset_fcda_total").html(jsondata.data.length); targetdiv.html(template('svsend_fcdalist_tpl', jsondata)); targetdiv.children(".detailtable").slimscroll({ height: targetdiv.height() - targetdiv.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); }) }); tmpDsList.children(".detailtable").slimscroll({ height: tmpDsList.height() - (tmpDsList.css("margin").replace("px", "") * 2) - tmpDsList.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); tmpDsList.height(tmpDsList.height() - 24).find("tbody>tr:first").trigger('click'); }); }, //加载SV接收列表 LoadIedSVReviceBlockTable: function(evt, ieddata) { var ele = $("#ied_relation").removeClass("hidden"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(Tools.LoadingText("正在加载装置(" + ieddata.ied_name + ")数据中...")); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/smv_ctrlblock/receive", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name }, function(jsondata) { if (jsondata.code != 0) { ied_strcut_detail.html(jsondata.msg); return; } if (jsondata.data == null || jsondata.data.length == 0) { ied_strcut_detail.html(Tools.HintText("该装置无SV接收")) return; } //拆分为主从结构 var masterdatalist = [], tmplist = {}; for (var i = 0; i < jsondata.data.length; i++) { var item = jsondata.data[i]; var key = item.out_ied_name + item.out_smv_ctrl_name + item.out_dataset_name; if (tmplist[key] == null) { tmplist[key] = { "info": item, "list": [item] }; } else { tmplist[key]["list"].push(item); } } for (var k in tmplist) { tmplist[k]["info"]["list"] = JSON.stringify(tmplist[k]["list"]); masterdatalist.push(tmplist[k]); } var h = template('svrev_datasetlist_tpl', { "data": masterdatalist }); tmplist = null; masterdatalist = null; ied_strcut_detail.html('
SMV端子列表详情(共 条)
'); var tmpDsList = ied_strcut_detail.find(".datasetlist"); tmpDsList.html(h).find("tbody>tr").off('click').on('click', function() { tmpDsList.find("tr.active").removeClass("active"); var fcdalist = $.trim($(this).addClass("active").attr("fcdalist")); var ctrlId = $(this).attr("ctrl_id") var targetdiv = ied_strcut_detail.find(".fcdalist"); ied_strcut_detail.find("#dataset_fcda_total").html("-"); if (fcdalist == "") { ied_strcut_detail.find("#dataset_fcda_total").html("0"); targetdiv.html(Tools.HintText("未查找到端子列表")); return; } fcdalist = JSON.parse(fcdalist); ied_strcut_detail.find("#dataset_fcda_total").html(fcdalist.length); targetdiv.html(template('svrev_fcdalist_tpl', { "data": fcdalist })); targetdiv.children(".detailtable").slimscroll({ height: targetdiv.height() - targetdiv.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); }); tmpDsList.children(".detailtable").slimscroll({ height: tmpDsList.height() - (tmpDsList.css("margin").replace("px", "") * 2) - tmpDsList.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); tmpDsList.height(tmpDsList.height() - 24).find("tbody>tr:first").trigger('click'); }); }, //加载goose发送列表 LoadIedGooseSendBlockTable: function(evt, ieddata) { var ele = $("#ied_relation").removeClass("hidden"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(Tools.LoadingText("正在加载装置(" + ieddata.ied_name + ")数据中...")); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/ctrlblock", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name }, function(jsondata) { if (jsondata.code != 0) { ied_strcut_detail.html(jsondata.msg); return; } if (jsondata.data.GSEControl == null || jsondata.data.GSEControl.length == 0) { ied_strcut_detail.html(Tools.HintText("该装置无GOOSE发送")) return; } var h = template('goosesend_datasetlist_tpl', { "data": jsondata.data.GSEControl }); ied_strcut_detail.html('
GOOSE端子列表详情(共 条)
'); var tmpDsList = ied_strcut_detail.find(".datasetlist"); tmpDsList.html(h).find("tbody>tr").off('click').on('click', function() { tmpDsList.find("tr.active").removeClass("active"); var fcdalist = $.trim($(this).addClass("active").attr("fcdalist")); var ctrlId = $(this).attr("ctrl_id") var targetdiv = ied_strcut_detail.find(".fcdalist"); $("#dataset_fcda_total").html("-"); targetdiv.html(Tools.HintText("正在加载端子列表数据...")); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/goose_ctrlblock/sendfcdalist", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name, "ctrlid": ctrlId }, function(jsondata) { if (jsondata.code != 0) { targetdiv.html(Tools.HintText(jsondata.msg)); return; } if (jsondata.data == null || jsondata.data.length == 0) { $("#dataset_fcda_total").html("0"); targetdiv.html(Tools.HintText("未查找到端子列表")); return; } $("#dataset_fcda_total").html(jsondata.data.length); targetdiv.html(template('goosesend_fcdalist_tpl', jsondata)); targetdiv.children(".detailtable").slimscroll({ height: targetdiv.height() - targetdiv.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); }) }); tmpDsList.children(".detailtable").slimscroll({ height: tmpDsList.height() - (tmpDsList.css("margin").replace("px", "") * 2) - tmpDsList.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); tmpDsList.height(tmpDsList.height() - 24).find("tbody>tr:first").trigger('click'); }); }, //加载GOOSE接收列表 LoadIedGooseReviceBlockTable: function(evt, ieddata) { var ele = $("#ied_relation").removeClass("hidden"); var ied_strcut_detail = ele.find("#ied_strcut_detail").html(Tools.LoadingText("正在加载装置(" + ieddata.ied_name + ")数据中...")); $.getJSON(Global.AccessUrl + "/api/screen/scd/ied/goose_ctrlblock/receive", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "ied_name": ieddata.ied_name }, function(jsondata) { if (jsondata.code != 0) { ied_strcut_detail.html(jsondata.msg); return; } if (jsondata.data == null || jsondata.data.length == 0) { ied_strcut_detail.html(Tools.HintText("该装置无GOOSE接收")) return; } //拆分为主从结构 var masterdatalist = [], tmplist = {}; for (var i = 0; i < jsondata.data.length; i++) { var item = jsondata.data[i]; var key = item.out_ied_name + item.out_smv_ctrl_name + item.out_dataset_name; if (tmplist[key] == null) { tmplist[key] = { "info": item, "list": [item] }; } else { tmplist[key]["list"].push(item); } } for (var k in tmplist) { tmplist[k]["info"]["list"] = JSON.stringify(tmplist[k]["list"]); masterdatalist.push(tmplist[k]); } var h = template('gooserev_datasetlist_tpl', { "data": masterdatalist }); tmplist = null; masterdatalist = null; ied_strcut_detail.html('
GOOSE端子列表详情(共 条)
'); var tmpDsList = ied_strcut_detail.find(".datasetlist"); tmpDsList.html(h).find("tbody>tr").off('click').on('click', function() { tmpDsList.find("tr.active").removeClass("active"); var fcdalist = $.trim($(this).addClass("active").attr("fcdalist")); var ctrlId = $(this).attr("ctrl_id") var targetdiv = ied_strcut_detail.find(".fcdalist"); ied_strcut_detail.find("#dataset_fcda_total").html("-"); if (fcdalist == "") { ied_strcut_detail.find("#dataset_fcda_total").html("0"); targetdiv.html(Tools.HintText("未查找到端子列表")); return; } fcdalist = JSON.parse(fcdalist); ied_strcut_detail.find("#dataset_fcda_total").html(fcdalist.length); targetdiv.html(template('gooserev_fcdalist_tpl', { "data": fcdalist })); targetdiv.children(".detailtable").slimscroll({ height: targetdiv.height() - targetdiv.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); }); tmpDsList.children(".detailtable").slimscroll({ height: tmpDsList.height() - (tmpDsList.css("margin").replace("px", "") * 2) - tmpDsList.find(".headertable").height() + "px", width: "99%", alwaysVisible: false, wheelStep: 10, size: "6px", color: "#03aee7" }); tmpDsList.height(tmpDsList.height() - 24).find("tbody>tr:first").trigger('click'); }); }, //加载DataSet列表 LoadDataSet: function(thisIedName) { var $ied_strcut = $("#ied_basicinfo"); var $datasetList = $("#ied_basicinfo #dataset_list"); if ($datasetList.length == 0) { $ied_strcut.append('
'); $datasetList = $("#ied_basicinfo #dataset_list"); } else { $datasetList.removeClass("hidden").html(""); } var datasetEle = $ied_strcut.find(".accessPoint[accessPoint='DataSet']"); $datasetList.css({ "left": "1rem", "top": datasetEle.position().top }); $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": $ied_strcut.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "pagesize": 10000, "ied_name": thisIedName, "name": "DataSet" }, function(result) { var eles = []; for (var i = 0; i < result.data.length; i++) { eles.push('' + result.data[i].attr_name + '(' + result.data[i].attr_desc + ')'); } $datasetList.html(eles.join("")).children("span").off().on('click', function() { var t = $(this); PoliceObject.LoadFCDAList(this, t.attr("dataset_id"), t.find("span:last").text()); }); var datasetPoint = $(".ied_linkpoint[accesspoint='DataSet']").css({ "top": $datasetList.position().top + $datasetList.height() + (15 * hRate) + "px" }) var h1 = $(".ied_linkpoint.top").position().top - datasetPoint.position().top; datasetPoint.next().css({ "top": datasetPoint.position().top + 5 + "px", "height": h1 + "px", "line-height": h1 + "px" }); }); }, //加载AccessPoint下的LDevice列表 LoadLdeviceList: function(accessPointId, accessPointName) { var ele = $("#ied_basicinfo .accessPoint[accesspoint='" + accessPointName + "']"); if (ele.length == 0) return; $.getJSON(Global.AccessUrl + "/api/screen/scd/ldevice/list", { "scd_id": ele.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "accessPointId": accessPointId }, function(r) { if (r.data == null) { return; } var $ldeviceList = ele.find(".ldevice_list"); for (var i = 0; i < r.data.length; i++) { var item = r.data[i]; var txt = item.attr_inst; if (item.attr_desc != "") txt += "
" + item.attr_desc + ""; $ldeviceList.append('
' + txt + '
'); } }); }, //加载LDevice下的LN列表 LoadLnList: function(ele, ldeviceId) { var $ied_strcut = $("#ied_basicinfo"); var ied_strcut_detail = $("#ied_basicinfo #ied_strcut_detail"); layer.msg("正在加载LN列表...", { time: 0 }); var showLnList = $ied_strcut.find("#showLnList"); if (showLnList.length == 0) { $ied_strcut.append("
序号instlnClasslnTypedesc
"); showLnList = $ied_strcut.find("#showLnList"); } else { showLnList.removeClass("hidden").find(".ln_list table").html(""); } var toEle = $(ele), toXY = toEle.position(); showLnList.find(".caption").html(toEle.text() + "—LN/LN0节点列表"); showLnList.css({ top: $ied_strcut.height() * 0.25, left: ($ied_strcut.width() - showLnList.width()) / 2 }); var lndatalistEle = showLnList.find(".ln_list table"); $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "parent_node_id": ldeviceId, "pagesize": 1000, "name": "LN0" }, function(r) { var trs = []; for (var i = 0; i < r.data.length; i++) { var item = r.data[i]; trs.push("1" + (item.attr_inst || " ") + "" + item.attr_ln_class + "" + item.attr_ln_type + "" + item.attr_desc + ""); } lndatalistEle.prepend(trs.join("")); lndatalistEle.find("tr").each(function(ind, ele) { $(ele).children("td:first").html(ind + 1); }); }); $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "parent_node_id": ldeviceId, "pagesize": 1000, "name": "LN" }, function(r) { var trs = []; layer.closeAll(); for (var i = 0; i < r.data.length; i++) { var item = r.data[i]; trs.push("序号" + (item.attr_inst || " ") + "" + item.attr_ln_class + "" + item.attr_ln_type + "" + item.attr_desc + ""); } lndatalistEle.append(trs.join("")); lndatalistEle.find("tr").each(function(ind, ele) { $(ele).children("td:first").html(ind + 1); }); }); lndatalistEle.off().on("click", "tr", function() { var jsondata = JSON.parse($(this).attr("json")); //暂时屏蔽该逻辑 /* DialogObject.Open($("#dialog_public"), { callback: PoliceObject.LoadLnStrcut, para: jsondata, size: ["100rem", "70rem"] }); */ }); }, LoadLnStrcut: function(win, para) { win.find(".caption>b").html((para.attr_ln_class == "LLN0" ? "LLN0" : "LN") + "结构详情—" + para.attr_desc); var h = (win.height() - win.find(".caption").height() - win.find(".footer").height()); win.find(".dataitemlist").height(h + "px"); var ln_strcut_detail = win.find("#ln_strcut_detail"); layer.msg("正在加载DOI数据...", { time: 0 }); //生成根节点 var trs = [{ "id": para.node_id, "isroot": true, "topic": para.attr_desc || para.attr_ln_class }]; kmsjsmap.inited = kmsjsmap.isInit = false; //重置初始化状态为未初始化 var jsmind = kmsjsmap.init({ container: ln_strcut_detail[0], data: trs, editable: false, onRelation: function(item) { if (item.children.length == 0 && item.data.badge != "" && !item.data.isloaded) { //加载该节点下的子节点 var node = jsmind.get_node(item.id); //console.log('当前选择中的是', node) PoliceObject.AppendMindNodes(para.scdid, jsmind, node, item.id, item.topic); } } }); //移除组件自带的放大缩小插件 win.find(".lui-jsmind-innerToolBar").remove(); PoliceObject.AppendMindNodeType(para.scdid, jsmind, jsmind.get_node(para.node_id), para.node_id); }, AppendMindNodeType: function(scdid, jsmind, parentItem, pid, callback) { layer.closeAll(); //获取下级节点及数量 $.getJSON(Global.AccessUrl + "/api/screen/scd/node/children/stat", { "scd_id": scdid, "node_id": pid }, function(r) { parentItem.data.isloaded = true; if (r.data == null || r.data.length == 0) { if (callback != null) callback(); return; } jsmind.options.editable = true; for (var i = 0; i < r.data.length; i++) { var cItem = r.data[i]; var nid = pid + "_" + cItem.node_name; jsmind.data.jm.add_node(parentItem, nid, cItem.node_name, { "badge": cItem.cnt, "isloaded": false }); } jsmind.options.editable = false; if (callback != null) callback(); }); }, //加载指定节点的子节点到导图中 AppendMindNodes: function(scdid, jsmind, parentItem, pid, nodeName, callback) { $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": scdid, "parent_node_id": pid, "name": nodeName, "pagesize": 10000 }, function(r) { parentItem.data.isloaded = true; if (r.data == null || r.data.length == 0) { if (callback != null) callback(); return; } jsmind.options.editable = true; for (var i = 0; i < r.data.length; i++) { var daiItem = r.data[i]; var sddr = daiItem.attr_saddr; var txt = daiItem.attr_name; if (daiItem.node_name == "SDI") { if ($.trim(daiItem.attr_desc) != "") txt = txt + "(" + daiItem.attr_desc + ")"; } if (daiItem.node_name == "DAI") { if ($.trim(daiItem.attr_saddr) != "") txt = txt + "(sAddr:" + daiItem.attr_saddr + ")"; } if (daiItem.node_name == "Val") { txt = daiItem.node_value; } if (daiItem.node_name == "FCDA") { txt = daiItem.attr_ln_class + "_" + daiItem.attr_ln_inst; } if (daiItem.node_name == "ExtRef") { txt = daiItem.attr_ln_class + "_" + daiItem.attr_ln_inst + "(intAddr:" + daiItem.attr_int_addr + ")"; } var nid = daiItem.node_id || daiItem.nodeid; var newNode = jsmind.data.jm.add_node(parentItem, nid, txt, { "badge": "", "isloaded": false }); PoliceObject.AppendMindNodeType(jsmind, newNode, nid); } jsmind.options.editable = false; if (callback != null) callback(); }); }, //加载DataSet下的FCDA列表 LoadFCDAList: function(ele, dataset_id, dataset_name) { var $ied_strcut = $("#ied_basicinfo"); var ied_strcut_detail = $ied_strcut.find("#ied_strcut_detail"); layer.msg("正在加载FCDA列表...", { time: 0 }); var showLnList = $ied_strcut.find("#showLnList"); if (showLnList.length == 0) { $ied_strcut.append("
ldInstprefixlnClasslnInstdoNamedaNamefc
"); showLnList = $ied_strcut.find("#showLnList"); } else { showLnList.removeClass("hidden").find(".ln_list table").html(""); } var toEle = $(ele), toXY = toEle.position(); showLnList.find(".caption").html(dataset_name + "—FCDA列表"); showLnList.css({ top: $ied_strcut.height() * 0.25, left: ($ied_strcut.width() - showLnList.width()) / 2 }); var lndatalistEle = showLnList.find(".ln_list table"); $.getJSON(Global.AccessUrl + "/api/screen/scd/node/list", { "scd_id": ied_strcut_detail.parents(".site_device_list").attr("scd_id") || PoliceObject.ScdID, "parent_node_id": dataset_id, "pagesize": 1000, "name": "FCDA" }, function(r) { var trs = []; layer.closeAll(); for (var i = 0; i < r.data.length; i++) { var item = r.data[i]; trs.push("" + (item.attr_ld_inst || " ") + "" + (item.attr_prefix || " ") + "" + (item.attr_ln_class || " ") + "" + (item.attr_ln_inst || " ") + "" + (item.attr_do_name || " ") + "" + (item.attr_da_name || " ") + "" + (item.attr_fc || " ") + ""); } lndatalistEle.prepend(trs.join("")); }); }, p_createCanvas: function(canvasconEle) { var canvas = canvasconEle[0]; canvas.width = canvasconEle.width(); canvas.height = canvasconEle.height(); var canvascontext = canvas.getContext('2d'); return canvascontext }, p_drawPoly(canvascontext, point1, point2) { //canvascontext.setLineDash([]); canvascontext.strokeStyle = "#08b008"; canvascontext.lineWidth = 1; canvascontext.lineJoin = 'round'; canvascontext.lineCap = 'round'; canvascontext.beginPath(); canvascontext.moveTo(point1[0], point1[1]); canvascontext.lineTo(point1[0] + 10, point1[1]); canvascontext.stroke(); canvascontext.closePath(); canvascontext.beginPath(); canvascontext.moveTo(point1[0] + 9, point1[1]); if (point2[1] < point1[1]) canvascontext.quadraticCurveTo(point1[0] + 50, point1[1] - 20, point2[0], point2[1]); else canvascontext.quadraticCurveTo(point1[0] + 50, point1[1] + 20, point2[0], point2[1]); canvascontext.stroke(); }, p_drawNumber: function(ele, masterIedJoinPoint, salveJoinPoint, num, direction) { //额外加减的11px为数字高宽的一半 if (direction == "left") { var numberLeft = masterIedJoinPoint[0] - (masterIedJoinPoint[0] - salveJoinPoint[0]) / 2 - 11; var numberTop = masterIedJoinPoint[1] - (masterIedJoinPoint[1] - salveJoinPoint[1]) / 2 - 11; return ele.append('' + num + '').find(".inputs_num:last"); } else { //右边的 var numberLeft = masterIedJoinPoint[0] + (salveJoinPoint[0] - masterIedJoinPoint[0]) / 2 - 11; var numberTop = masterIedJoinPoint[1] - (masterIedJoinPoint[1] - salveJoinPoint[1]) / 2 - 11; return ele.append('' + num + '').find(".inputs_num:last"); } }, p_drawLine: function(cxt, point1, point2, color) { /*cxt.strokeStyle = "#fff"; cxt.lineWidth = 1; cxt.lineJoin = 'round'; cxt.lineCap = 'round'; //cxt.fillStyle = paintConfig.fillStyle; cxt.beginPath(); cxt.moveTo(point1[0], point1[1]); cxt.lineTo(point2[0], point2[1]); cxt.stroke();*/ //this.p_drawArrow(cxt, point1[0], point1[1], point2[0], point2[1], 30, 10, 1, color); this.p_drawArrow2(cxt, point1[0], point1[1], point2[0], point2[1], 1, 1, 18, 5, color, 1.5) }, // //ctx:Canvas绘图环境 //fromX, fromY:起点坐标(也可以换成p1,只不过它是一个数组) //toX, toY:终点坐标 (也可以换成p2,只不过它是一个数组) //theta:三角斜边一直线夹角 //headlen:三角斜边长度 //width:箭头线宽度 //color:箭头颜色 p_drawArrow: function(ctx, fromX, fromY, toX, toY, theta, headlen, width, color) { theta = typeof(theta) != 'undefined' ? theta : 30; headlen = typeof(theta) != 'undefined' ? headlen : 10; width = typeof(width) != 'undefined' ? width : 1; color = typeof(color) != 'undefined' ? color : '#fff'; // 计算各角度和对应的P2,P3坐标 var angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI, angle1 = (angle + theta) * Math.PI / 180, angle2 = (angle - theta) * Math.PI / 180, topX = headlen * Math.cos(angle1), topY = headlen * Math.sin(angle1), botX = headlen * Math.cos(angle2), botY = headlen * Math.sin(angle2); ctx.save(); ctx.beginPath(); var arrowX = fromX - topX, arrowY = fromY - topY; ctx.moveTo(arrowX, arrowY); ctx.moveTo(fromX, fromY); ctx.lineTo(toX, toY); arrowX = toX + topX; arrowY = toY + topY; ctx.moveTo(arrowX, arrowY); ctx.lineTo(toX, toY); arrowX = toX + botX; arrowY = toY + botY; ctx.lineTo(arrowX, arrowY); ctx.strokeStyle = color; ctx.lineWidth = width; ctx.stroke(); ctx.restore(); }, // Draw arrow head drawHead: function(ctx, x0, y0, x1, y1, x2, y2, style, color, width) { if (typeof(x0) == 'string') { x0 = parseInt(x0); } if (typeof(y0) == 'string') { y0 = parseInt(y0); } if (typeof(x1) == 'string') { x1 = parseInt(x1); } if (typeof(y1) == 'string') { y1 = parseInt(y1); } if (typeof(x2) == 'string') { x2 = parseInt(x2); } if (typeof(y2) == 'string') { y2 = parseInt(y2); } var radius = 3, twoPI = 2 * Math.PI; ctx.save(); ctx.beginPath(); ctx.strokeStyle = color; ctx.fillStyle = color; ctx.lineWidth = width; ctx.moveTo(x0, y0); ctx.lineTo(x1, y1); ctx.lineTo(x2, y2); switch (style) { case 0: var backdist = Math.sqrt(((x2 - x0) * (x2 - x0)) + ((y2 - y0) * (y2 - y0))); ctx.arcTo(x1, y1, x0, y0, .55 * backdist); ctx.fill(); break; case 1: ctx.beginPath(); ctx.moveTo(x0, y0); ctx.lineTo(x1, y1); ctx.lineTo(x2, y2); ctx.lineTo(x0, y0); ctx.fill(); break; case 2: ctx.stroke(); break; case 3: var cpx = (x0 + x1 + x2) / 3; var cpy = (y0 + y1 + y2) / 3; ctx.quadraticCurveTo(cpx, cpy, x0, y0); ctx.fill(); break; case 4: var cp1x, cp1y, cp2x, cp2y, backdist; var shiftamt = 5; if (x2 == x0) { backdist = y2 - y0; cp1x = (x1 + x0) / 2; cp2x = (x1 + x0) / 2; cp1y = y1 + backdist / shiftamt; cp2y = y1 - backdist / shiftamt; } else { backdist = Math.sqrt(((x2 - x0) * (x2 - x0)) + ((y2 - y0) * (y2 - y0))); var xback = (x0 + x2) / 2; var yback = (y0 + y2) / 2; var xmid = (xback + x1) / 2; var ymid = (yback + y1) / 2; var m = (y2 - y0) / (x2 - x0); var dx = (backdist / (2 * Math.sqrt(m * m + 1))) / shiftamt; var dy = m * dx; cp1x = xmid - dx; cp1y = ymid - dy; cp2x = xmid + dx; cp2y = ymid + dy; } ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x0, y0); ctx.fill(); break; } ctx.restore(); }, // draw arrow //p_drawArrow2(ctx, 100, 50, 200, 50, 1, 1, 18, 5, '#f36', 1); //p_drawArrow2(ctx, 300, 50, 450, 50, 2, 1, 18, 4, 'blue', 0.5); p_drawArrow2: function(ctx, x1, y1, x2, y2, style, which, angle, d, color, width) { if (typeof(x1) == 'string') { x1 = parseInt(x1); } if (typeof(y1) == 'string') { y1 = parseInt(y1); } if (typeof(x2) == 'string') { x2 = parseInt(x2); } if (typeof(y2) == 'string') { y2 = parseInt(y2); } style = typeof(style) != 'undefined' ? style : 3; which = typeof(which) != 'undefined' ? which : 1; angle = typeof(angle) != 'undefined' ? angle : Math.PI / 9; d = typeof(d) != 'undefined' ? d : 10; color = typeof(color) != 'undefined' ? color : '#fff'; width = typeof(width) != 'undefined' ? width : 1; var toDrawHead = typeof(style) != 'function' ? this.drawHead : style; var dist = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); var ratio = (dist - d / 3) / dist; var tox, toy, fromx, fromy; if (which & 1) { tox = Math.round(x1 + (x2 - x1) * ratio); toy = Math.round(y1 + (y2 - y1) * ratio); } else { tox = x2; toy = y2; } if (which & 2) { fromx = x1 + (x2 - x1) * (1 - ratio); fromy = y1 + (y2 - y1) * (1 - ratio); } else { fromx = x1; fromy = y1; } ctx.beginPath(); ctx.strokeStyle = color; ctx.lineWidth = width; ctx.moveTo(fromx, fromy); ctx.lineTo(tox, toy); ctx.stroke(); var lineangle = Math.atan2(y2 - y1, x2 - x1); var h = Math.abs(d / Math.cos(angle)); if (which & 1) { var angle1 = lineangle + Math.PI + angle; var topx = x2 + Math.cos(angle1) * h; var topy = y2 + Math.sin(angle1) * h; var angle2 = lineangle + Math.PI - angle; var botx = x2 + Math.cos(angle2) * h; var boty = y2 + Math.sin(angle2) * h; toDrawHead(ctx, topx, topy, x2, y2, botx, boty, style, color, width); } if (which & 2) { var angle1 = lineangle + angle; var topx = x1 + Math.cos(angle1) * h; var topy = y1 + Math.sin(angle1) * h; var angle2 = lineangle - angle; var botx = x1 + Math.cos(angle2) * h; var boty = y1 + Math.sin(angle2) * h; toDrawHead(ctx, topx, topy, x1, y1, botx, boty, style, color, width); } }, AlwaysTimer: function() { var time = new Date(); var year = time.getFullYear(); var month = time.getMonth() + 1; var date = time.getDate(); var hour = time.getHours(); var minutes = time.getMinutes(); var seconds = time.getSeconds(); month = month < 10 ? "0" + month : month; date = date < 10 ? "0" + date : date; if (hour < 10) { hour = "0" + hour; } if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + seconds; } $(".yyyymmdd").html(year + "-" + month + "-" + date); $(".week").html(PoliceObject.GetWeek()); $(".hour_minute").html(hour + ":" + minutes + ":" + seconds); setTimeout('PoliceObject.AlwaysTimer()', 1000); }, GetWeek: function() { var time = new Date(); var day = time.getDay(); var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; return weeks[day]; } }