scd_tools.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. <!DOCTYPE html>
  2. <!--[if IE 8]>
  3. <html lang="en" class="ie8 no-js"> <![endif]-->
  4. <!--[if IE 9]>
  5. <html lang="en" class="ie9 no-js"> <![endif]-->
  6. <html>
  7. <head>
  8. <meta charset="utf-8"/>
  9. <title>SCD文档管理系统</title>
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  11. <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
  12. <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  13. <link rel="stylesheet" type="text/css" href="/static/css/sub_bureau.css">
  14. <link rel="stylesheet" type="text/css" href="/static/css/common.css"/>
  15. <link rel="stylesheet" type="text/css" href="/static/css/font-awesome.min.css"/>
  16. <link rel="stylesheet" type="text/css" href="/static/layui_2/css/layui.css" media="all"/>
  17. <link rel="stylesheet" type="text/css" href="/static/css/kmsjsmap.css"/>
  18. <script src="/static/js/jquery.min.js" type="text/javascript"></script>
  19. <script src="/static/js/echarts.min.js" type="text/javascript"></script>
  20. <script src="/static/js/template.js" type="text/javascript"></script>
  21. <script src="/static/js/police_o.js" type="text/javascript"></script>
  22. <script src="/static/layui_2/layui.js" type="text/javascript"></script>
  23. <script src="/static/js/global.js" type="text/javascript"></script>
  24. <script src="/static/js/jquery.slimscroll.min.js" type="text/javascript"></script>
  25. <script src="/static/js/TweenMax.js" type="text/javascript"></script>
  26. <script src="/static/js/mqtt.min.js" type="text/javascript"></script>
  27. <script src="/static/js/kmsjsmap.js" type="text/javascript"></script>
  28. <style type="text/css">
  29. </style>
  30. </head>
  31. <body>
  32. <div class="monitor_center" style="width:100%;height: 100%;">
  33. <div class="header">
  34. <div class="header_logo">
  35. <span class="system_big_title">SCD文档管理系统</span>
  36. <span class="system_middle_title"><span class="orgname" id="orgname"></span><span class="stationname" id="stationname"></span></span>
  37. <span class="system_small_title">SubStation SCD Document Application Platform</span>
  38. </div>
  39. <div class="header_background">
  40. <div>
  41. <div class="main_bar" id="main_bar" style="float: left;">
  42. <div class="app_default accessControl" mark="screen" access-code="pl_menu_screen" onclick="window.location.href='scd_o.html'">
  43. <i class="app_icon"></i>
  44. <span>SCD可视化</span>
  45. </div>
  46. <div class="app_default accessControl" mark="outin" access-code="pl_menu_outin" onclick="window.location.href='scd_inout.html'">
  47. <i class="app_icon"></i>
  48. <span>签入签出</span>
  49. </div>
  50. <div class="app_default accessControl app_active" mark="scdtools" access-code="pl_menu_scdtools" onclick="window.location.href='scd_tools.html'">
  51. <i class="app_icon"></i>
  52. <span>SCD工具</span>
  53. </div>
  54. <div class="app_default accessControl" mark="stat" access-code="pl_menu_stat" onclick="window.location.href='scd_stat.html'">
  55. <i class="app_icon"></i>
  56. <span>统计分析</span>
  57. </div>
  58. <div class="app_default accessControl" mark="admin" access-code="pl_menu_admin" onclick="window.location.href='police_o_admin.html'">
  59. <i class="app_icon"></i>
  60. <span>管理后台</span>
  61. </div>
  62. </div>
  63. <div class="app_default">
  64. <span class="week" style="cursor:default;">&nbsp</span>
  65. <span class="hour_minute" style="cursor:default;">&nbsp;</span>
  66. </div>
  67. <div class="app_default">
  68. <ul class="layui-nav layui-layout-right" style="background-color:transparent;">
  69. <li class="layui-nav-item layui-hide layui-show-md-inline-block">
  70. <a href="javascript:;" class="current_user" id="login_user_name"></a>
  71. </li>
  72. <span class="layui-nav-bar" style="left: 2rem; width: 0px; opacity: 0; top: 5.5rem;"></span>
  73. </ul>
  74. </div>
  75. <div class="app_default">
  76. <a style="font-size: 1.6rem;cursor: pointer;" href="/"><i class="layui-icon layui-icon-logout" style="background-color: transparent !important;color: #FFF;"></i> 退出</a>
  77. </div>
  78. </div>
  79. </div>
  80. <div class="user_role" id="login_user_role"></div>
  81. </div>
  82. <div class="body_content">
  83. <!--<div class="container_data_show_resize_left_icon hidden"><i class="fa fa-angle-double-left"></i></div>
  84. <div class="container_data_show_resize_right_icon hidden"><i class="fa fa-angle-double-right"></i></div>-->
  85. <!--搜索区域-->
  86. <div id="search_panel" class="search_panel" style="display:none;">
  87. <div class="search_box" style="background: #4b5b88;box-shadow: 2px 2px 0.5rem 2px rgb(60, 68, 87) !important;">
  88. <div class="search_key" style="font-size:1.4rem;color: #BAC5E1;border-right: 1px solid #6a738a;">装置搜索</div>
  89. <input class="search_input" style="width:65%;font-size:1.4rem;color: #BAC5E1" id="search_input" maxlength="40" placeholder="请输入IED编码或者名称"/>
  90. </div>
  91. <span class="search_botton" id="search_button" style="letter-spacing:0.5rem;font-size:1.4rem;width:7rem;margin-top: -3.8rem;height: 3.2rem;line-height: 3.2rem;">搜索</span>
  92. </div>
  93. <div class="map_search hidden" id="search_result"></div>
  94. <!--搜索区域结束-->
  95. <!--SCD信息-->
  96. <div class="scd_info" id="scd_info" style="position: absolute;right: 2rem;top: 8rem;height: 3rem;line-height: 3rem;z-index: 1;color: #fff;background-color: #1e0937;padding: 0.5rem 3rem;width: 26rem;cursor:pointer;border: 1px solid #362757;border-radius: 3px;">
  97. <span class="scd_name"></span>
  98. <span style="margin-left: 1rem;margin-right: 1rem;font-size: 2.4rem;float: right;"><i class="fa fa-angle-up"></i></span>
  99. </div>
  100. <div class="scd_list hidden" id="scd_list" style="position: absolute;right: 0rem;top: 9rem;height: 3rem;line-height: 3rem;z-index: 1;color: #fff;background-color: rgba(255, 255, 255, 0.13);padding: 0.5rem 3rem;">
  101. </div>
  102. <!--中间地图-->
  103. <div class="body_center home_center" id="container_map" style="display:block;background-image: url('/static/images/background.png');">
  104. <div class="" id="container_background_1" style="width: 87rem;height: 65rem; background-image: url('/static/images/bg1.png');background-size: contain;position: absolute;z-index: 0;top:50%;left:50%;margin-left: -43.5rem;margin-top: -32.5rem;"></div>
  105. <div id="container_map_ied" style="position: absolute;z-index: 1;height: 100%;width: 100%;left: 0;top:0;"></div>
  106. </div>
  107. </div>
  108. </div>
  109. <!--变电站列表-->
  110. <div class="station_list hidden" id="station_list"></div>
  111. <!--IED结构关系图窗口-->
  112. <div id="device_video" class="site_device_list hidden" style="height: 64rem;width: 48rem;">
  113. <span class="text_overflow caption" style="position: relative;color: #fff;height: 5%;line-height: 4rem;"><b></b><i class="fa fa-times" title="关闭窗口" onclick="$('#device_video').addClass('hidden')" style="font-size: 2.4rem;"></i></span>
  114. <div class="dataitemlist" style="padding:0;height:85%;width: 100%; text-align: center;overflow: auto;position: relative;">
  115. <canvas id="canvas" style="position: absolute;left: 0;top:0;z-index: 1;background-color: transparent;height:100%;width: 100%;"></canvas>
  116. <div id="dataitemlist" style="position: absolute;left: 0;top:0;z-index: 0;height:100%;width: 100%;"></div>
  117. </div>
  118. <span class="caption" style="position: relative;color: #fff;height: 10%;background-color: #ffffff45;">
  119. <span style="float: left;width: 4%;font-size: 1.8rem;text-align: center;background-color: #425280;padding: 1rem;">关联IED</span>
  120. <span style="float: left;width: 93%;overflow: auto;height: 6rem;" class="ref_ied_list"></span>
  121. </span>
  122. </div>
  123. <div id="ied_strcut" class="site_device_list hidden" style="height: 64rem;width: 48rem;">
  124. <span class="text_overflow caption" style="position: relative;color: #fff;height: 5%;line-height: 4rem;"><b></b><i class="fa fa-times" title="关闭窗口" onclick="$('#ied_strcut').addClass('hidden');$('#showLnList').remove();" style="font-size: 2.4rem;"></i></span>
  125. <div class="dataitemlist" style="padding:0;height:85%;width: 100%; text-align: center;overflow: auto;position: relative;">
  126. <div id="ied_strcut_detail" style="position: absolute;left: 0;top:0;z-index: 0;height:100%;width: 100%;overflow: auto;"></div>
  127. </div>
  128. <span class="caption" style="position: relative;color: #fff;height: 10%;background-color: #ffffff45;">
  129. <span style="float: left;width: 4%;font-size: 1.8rem;text-align: center;background-color: #425280;padding: 1rem;">关联IED</span>
  130. <span style="float: left;width: 93%;overflow: auto;height: 6rem;" class="ref_ied_list"></span>
  131. </span>
  132. </div>
  133. <div id="dialog_public" class="site_device_list" style="height: 64rem;width: 48rem;display: none;top:50%;left:50%;background-color: #080D18B8 !important;">
  134. <span class="text_overflow caption" style="position: relative;color: #fff;height: 5%;line-height: 3.2rem;text-align: left;padding-left: 1rem;width: 99%;"><b></b><i class="fa fa-times" title="关闭窗口" style="font-size: 2rem;"></i></span>
  135. <div class="dataitemlist" style="padding:0;height:100%;width: 100%; text-align: center;overflow: auto;position: relative;">
  136. <div id="ln_strcut_detail" style="position: absolute;left: 0;top:0;z-index: 0;height:100%;width: 100%;"></div>
  137. </div>
  138. </div>
  139. <div class="network" id="network">
  140. <div class="network_area"></div>
  141. </div>
  142. <script type="text/html" id="station_list_item_tpl">
  143. {{each data}}
  144. <div class="station_list_item" stationid="{{$value.id}}">{{$value.area_name}}</div>
  145. {{/each}}
  146. </script>
  147. <script type="text/javascript">
  148. template.helper("FullImgPath",function(imgsrc){
  149. if(imgsrc==null||imgsrc=="") return Global.AccessUrl+ "/static/images/userhead.png";
  150. if (imgsrc.substr(0, 4) != "http") {
  151. var _index = imgsrc.indexOf("static/");
  152. if (_index > -1) return Global.AccessUrl + imgsrc.substr(_index);
  153. }
  154. return imgsrc;
  155. })
  156. template.helper("ts2datetime",function(timestamp){
  157. if(timestamp==null||timestamp=="") return "";
  158. if(timestamp.indexOf("-")>-1 || timestamp.indexOf(":")>-1) return timestamp;
  159. if(timestamp.length>13) timestamp=timestamp.substring(0,13);
  160. else if( timestamp.length==10) timestamp=timestamp*1000;
  161. return new Date(timestamp).Format("yyyy-MM-dd hh:mm:ss");
  162. })
  163. template.helper("replaceStr",function(str,oldstr,newstr){
  164. if($.trim(str)=="") return "";
  165. var reg=new RegExp(oldstr);
  166. return str.replace(reg,newstr);
  167. })
  168. var option=({
  169. backgroundColor: "#ffffff00",
  170. //grid:{left:"15%",right:"5%"},
  171. xAxis: {
  172. show: false,
  173. type: "value"
  174. },
  175. yAxis: {
  176. show: false,
  177. type: "value"
  178. },
  179. tooltip: {
  180. show:false
  181. },
  182. series: [
  183. {
  184. type: "graph",
  185. name:"ied",
  186. zlevel: 5,
  187. draggable: true,
  188. //focusNodeAdjacency:false,
  189. //focusNodeAdjacencyOn: 'click',
  190. layout:"force",//circular
  191. //coordinateSystem: "cartesian2d", //使用二维的直角坐标系(也称笛卡尔坐标系)
  192. force: { //力引导布局相关的配置项
  193. //initLayout: "circular",
  194. layoutAnimation: true,//显示时不使用动画
  195. repulsion: 250, //节点之间的斥力因子。
  196. edgeLength: 350 //边的两个节点之间的距离,这个距离也会受 repulsion。
  197. },
  198. edgeSymbol: ["circle", "arrow"],
  199. symbol: "circle",
  200. symbolSize: 15,
  201. roam: true, //是否开启鼠标缩放和平移漫游
  202. label: {
  203. normal: {
  204. show: true,
  205. fontSize: 12,
  206. position: 'bottom',
  207. color:"#348AFF5E",
  208. formatter:function(v){
  209. if(v.data.iedname==selectedIedName){
  210. return v.data.netaddr!=null ? v.name+"{detail|}\n"+v.data.netaddr:v.name+"{detail|}";
  211. }
  212. return v.data.netaddr!=null?v.name+"\n"+v.data.netaddr:v.name;
  213. },
  214. rich:{
  215. detail:{
  216. height: 15,
  217. width:15,
  218. align: 'right',
  219. margin: [0, 5, 0, 5],
  220. backgroundColor: {
  221. image: '/static/images/img_remind.png'
  222. }
  223. }
  224. }
  225. }
  226. },
  227. data: [],
  228. links: [
  229. ],
  230. lineStyle: {
  231. normal: {
  232. opacity: 1,
  233. color: "#ededed",
  234. curveness: 0.2,
  235. width: 2
  236. }
  237. }
  238. },
  239. {
  240. type: "lines",
  241. coordinateSystem: "cartesian2d",
  242. z: 1,
  243. zlevel: 2,
  244. animation: false,
  245. effect: {
  246. show: true,
  247. period: 8,
  248. trailLength: 0.01,
  249. symbolSize: 12,
  250. symbol: "pin",
  251. loop: true,
  252. color: "rgba(55,155,255,0.9)"
  253. },
  254. lineStyle: {
  255. normal: {
  256. color: "#22AC38",
  257. width: 0,
  258. curveness: 0.2
  259. }
  260. },
  261. data: [
  262. {
  263. coords: [
  264. [170, 200],
  265. [400, 400]
  266. ]
  267. }
  268. ]
  269. }
  270. ]
  271. });
  272. var netaddrLoadState=0,iedLoadState=0,apLoadState=0;
  273. var IedList=[];
  274. var NetWork_ApNodes=[];
  275. var IedNetaddrList={};
  276. var myChart = null;
  277. var scdid="";
  278. //当前选中的IED
  279. var selectedIedName="";
  280. $(document).ready(function () {
  281. var token = $.trim(localStorage.getItem("sessionid"));
  282. if (token == "") {
  283. window.location.href = "/";
  284. return false;
  285. }
  286. Global.accessControl();
  287. $("body").on('click',function(){
  288. if($(this).attr("id")!="scd_info" && $(this).parent().attr("id")!="scd_info"){
  289. $("#scd_list").addClass("hidden");
  290. $("#scd_info").find("i").attr("class","fa fa-angle-up");
  291. }
  292. if($(this).attr("id")!="stationname" && $(this).parent().attr("id")!="stationname"){
  293. $("#station_list").addClass("hidden").find("i").attr("class","fa fa-angle-up");
  294. }
  295. });
  296. //获取配置的单位名称
  297. $.getJSON(Global.AccessUrl+"/api/getSysParamList",{"param_name":"orgname"},function(r){
  298. if(r.code!=0 || r.data==null) return;
  299. $("#orgname").html(r.data[0].param_value);
  300. });
  301. //获取变电站列表。后台已经根据当前登录人员做了权限过滤
  302. $.getJSON(Global.AccessUrl+"/api/basic_area/list",{"pid":"0"},function(r){
  303. if(r.code!=0 || r.data==null) return;
  304. var stationname=$("#stationname").html(r.data[0].area_name);
  305. //默认加载第一个站的scd信息
  306. InitLoadScdList(r.data[0].id);
  307. if(r.data.length>1){
  308. //当前人员有权限的站超过1个时,才显示选择列表
  309. stationname.append('<i class="fa fa-angle-up"></i>');
  310. stationname.off().on('click',function(e){
  311. //点击站名时,显示变电站下拉列表
  312. e.stopPropagation();
  313. $("#station_list").removeClass("hidden");
  314. $(this).find("i").attr("class","fa fa-angle-down");
  315. });
  316. //生成站列表元素
  317. var station_list=$("#station_list").html(template("station_list_item_tpl",r));
  318. station_list.css({top:stationname.offset().top+stationname.height(),left:stationname.offset().left});
  319. station_list.find(".station_list_item").off().on('click',function(){
  320. //选择某个站时,加载该站的scd信息
  321. var stationid=$(this).attr("stationid");
  322. stationname.html($(this).text()+'<i class="fa fa-angle-up"></i>');
  323. InitLoadScdList(stationid);
  324. });
  325. }
  326. });
  327. PoliceObject.AlwaysTimer();
  328. PoliceObject.init();
  329. var canvasW=1300;
  330. var isdrag=false;
  331. var data=[];
  332. $("#device_video,#ied_strcut").css({
  333. "top": "0",
  334. "left": "0",
  335. "height": "100%",
  336. "width": "100%",
  337. "background-color":"#324B86EB"
  338. });
  339. });
  340. function InitLoadScdList(stationid){
  341. myChart=null;
  342. echarts.init(document.getElementById('container_map_ied')).dispose();
  343. $("#scd_list").html("");
  344. $("#network").html("");
  345. $("#container_map_ied").html(Tools.LoadingText("正在加载数据中..."));
  346. var $scd_info=$("#scd_info");
  347. $scd_info.find(".scd_name").html("");
  348. $.getJSON(Global.AccessUrl+"/api/screen/scd/list",{"stationid":stationid},function(r){
  349. if(r.data==null||r.data.length==0){
  350. //还没有SCD文件
  351. $("#container_map_ied").html(Tools.LoadingText("该站还没有签入任何SCD文件!","red"));
  352. return;
  353. }
  354. $("#container_map_ied").html("");
  355. var data=r.data;
  356. //默认为第一个scd
  357. var lst=[];
  358. var scdobj=data[0];
  359. for (var i = 0; i < data.length; i++) {
  360. if(data[i].enable==1){
  361. scdobj=data[i];
  362. }
  363. lst.push('<div scdid="'+data[i].id+'" style="border-bottom: 1px solid #ffffff36;cursor:pointer;">'+data[i].scd_name+'</div>');
  364. }
  365. scdid=scdobj.id;
  366. $scd_info.on("click",function(e){
  367. e.stopPropagation();
  368. var $t=$(this), xy=$t.offset();
  369. $t.find("i").attr("class","fa fa-angle-down");
  370. $("#scd_list").removeClass("hidden").css({
  371. top:xy.top+$t.height()+15,
  372. left:xy.left,
  373. width:$t.width(),
  374. height:"auto"
  375. });
  376. }).find(".scd_name").html(scdobj.scd_name);
  377. $("#scd_list").html(lst.join("")).children("div").off().on("click",function(){
  378. var t=$(this);
  379. $scd_info.find(".scd_name").html(t.text());
  380. var tmpscdid=t.attr("scdid");
  381. $("#scd_list").addClass("hidden");
  382. $("#scd_info").find("i").attr("class","fa fa-angle-up");
  383. if(scdid==tmpscdid){
  384. return;
  385. }
  386. scdid=tmpscdid;
  387. netaddrLoadState=0;
  388. iedLoadState=0;
  389. apLoadState=0
  390. GetSubNetwork();
  391. LoadIedNetAddr();
  392. LoadIedList();
  393. });
  394. netaddrLoadState=0;
  395. iedLoadState=0;
  396. apLoadState=0
  397. GetSubNetwork();
  398. LoadIedNetAddr();
  399. LoadIedList();
  400. })
  401. }
  402. function p_drawPoly(canvascontext,point1,point2) {
  403. //canvascontext.setLineDash([]);
  404. canvascontext.strokeStyle = "#08b008";
  405. canvascontext.lineWidth = 1;
  406. canvascontext.lineJoin = 'round';
  407. canvascontext.lineCap = 'round';
  408. canvascontext.beginPath();
  409. canvascontext.moveTo(point1[0], point1[1]);
  410. canvascontext.lineTo(point1[0]+10, point1[1]);
  411. canvascontext.stroke();
  412. canvascontext.closePath();
  413. canvascontext.beginPath();
  414. canvascontext.moveTo(point1[0]+9, point1[1]);
  415. if(point2[1]<point1[1]) canvascontext.quadraticCurveTo(point1[0]+50,point1[1]-20,point2[0], point2[1]);
  416. else canvascontext.quadraticCurveTo(point1[0]+50,point1[1]+20,point2[0], point2[1]);
  417. canvascontext.stroke();
  418. }
  419. </script>
  420. <!--搜索结果列表-->
  421. <script type="text/html" id="search_result_list_tpl">
  422. <div style="color: #999;padding: 1rem;font-size: 1.2rem;">为您找到<span style="padding:0 5px;color:#233C7F;">{{count}}</span>个相关结果</div>
  423. <div class="search_result_list_item">
  424. {{each data}}
  425. <ul style="padding-bottom: 0.5rem;" ied_name="{{$value.ied_name}}" >
  426. <li style="color: #999">
  427. <span style="font-size: 1.6rem;display: inline-block;width: 2rem;height: 2rem;">
  428. </span>
  429. <span style="font-size: 1.6rem;">{{$value.desc}}</span>
  430. </li>
  431. </ul>
  432. {{/each}}
  433. </div>
  434. </script>