Authored by wangtao

Merge branch 'master-500-dev' of http://113.200.75.45:82/monitor_v3/hg-monitor-w…

…eb into master-500-dev
Showing 38 changed files with 3811 additions and 677 deletions
@@ -321,7 +321,8 @@ layui.define(['xmSelect', 'md5'], function (exports) { @@ -321,7 +321,8 @@ layui.define(['xmSelect', 'md5'], function (exports) {
321 resTypeSelect: function (targtetId, callback, ajaxParams) { 321 resTypeSelect: function (targtetId, callback, ajaxParams) {
322 var options = "<option value=''>=资源类型=</option>"; 322 var options = "<option value=''>=资源类型=</option>";
323 admin.req(Object.assign({ 323 admin.req(Object.assign({
324 - url: this.domainName + '/api-web/home/restype/getAllResType' 324 + url: this.domainName + '/api-web/home/restype/getAllResType',
  325 + async: false
325 }, ajaxParams)).done(function (res) { 326 }, ajaxParams)).done(function (res) {
326 var reslist = res.data; 327 var reslist = res.data;
327 $.each(reslist, function (i, v) { 328 $.each(reslist, function (i, v) {
@@ -446,6 +447,7 @@ layui.define(['xmSelect', 'md5'], function (exports) { @@ -446,6 +447,7 @@ layui.define(['xmSelect', 'md5'], function (exports) {
446 var accessToken = sessions.getToken()['access_token']; 447 var accessToken = sessions.getToken()['access_token'];
447 $.ajax({ 448 $.ajax({
448 url: obj.domainName + '/api-web/manage/protocol/page?page=1&limit=10000&access_token=' + accessToken, 449 url: obj.domainName + '/api-web/manage/protocol/page?page=1&limit=10000&access_token=' + accessToken,
  450 + async: false,
449 success: function (res) { 451 success: function (res) {
450 if (res && res.data) { 452 if (res && res.data) {
451 res.data.forEach(function (v) { 453 res.data.forEach(function (v) {
@@ -336,6 +336,80 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -336,6 +336,80 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
336 }); 336 });
337 }, 337 },
338 /** 338 /**
  339 + * 渲染文本,指定列数展示,key、value展示的方式
  340 + * @param targetId html存放目标id
  341 + * @param resId 资源id
  342 + * @param kpiId 指标id,多个指标逗号隔开
  343 + * @param cols 指定列(一组key value为一列)
  344 + */
  345 + anapshotRenderTextCols: function (targetId,data, cols, isBasic) {
  346 + var flags = "";
  347 + var kpiIdList = "";
  348 + if (data.length > 0) {
  349 + var dataArr = common.splieceGroup(data, cols);
  350 + var li = "";
  351 + //先遍历分组后的,在遍历组内的数组
  352 + $.each(dataArr, function (i, v) {
  353 + var span = '';
  354 + $.each(v, function (j, ar) {
  355 + var valueStr = '';
  356 + var titleStr = '';
  357 + //end lsq 2022-06-08
  358 + if (ar.kpiId == 'KPIE13DD9A3') {
  359 + valueStr = laytpl($("#linkStateDetailTpl").html()).render({linkStateList: ar.value});
  360 + } else if (ar.value != 'null') {
  361 + if (ar.value == 'Infinity%') {
  362 + valueStr = ''
  363 + } else {
  364 + valueStr = ar.kpiValue;
  365 + }
  366 + titleStr = valueStr;
  367 + }
  368 + if (ar.kpiId == 'KPIE13DD9A3' || ar.kpiId == 'KPI02786E8D') {
  369 + //获取flag
  370 + $.each(ar.value, function (i, v) {
  371 + flags += v.flag + ",";
  372 + });
  373 + if (flags != '') {
  374 + flags = flags.substring(0, flags.length - 1);
  375 + }
  376 + //获取kpi
  377 + kpiIdList += ar.kpiId + ",";
  378 + }
  379 + //start lsq 更改下探图标的属性值 2022-06-08
  380 + var tips = '<a class="detail_row_menu hide" data-id=' + ar.kpiId + ' data-flag=' + ar.flag +
  381 + ' data-name=' + ar.kpiName + ' data-kpiname=' + ar.kpiName + ' data-iswarning=1 data-ident=1' +
  382 + ' data-trend=0 data-unit="" data-hidem="hidem" data-nature="true" ' +
  383 + ' data-restype=' + (ar.resType ? ar.resType : "") + '>\n' +
  384 + '<img style="width: 17px;height: 17px;" src="/src/style/img/icon_row_menu.png">\n' +
  385 + '</a>'
  386 + //end lsq 2022-06-08
  387 + var menuId = "";
  388 + if (ar.kpiId == 'KPIE13DD9A3' || ar.kpiId == 'KPI02786E8D' ) {
  389 + ar.kpiName = ar.kpiName + tips;
  390 + menuId = "id=\"" + targetId + "_detail_row_menu\" class='statusMenu'";
  391 + }
  392 + var $html = addIconByValue(valueStr);
  393 + var resStyle = obj.alarmEleMatchStyle(ar.flag, ar.kpiId);
  394 + span += ' <span ' + menuId + ' style="text-align:left;width:40%">' + ar.kpiName + '</span>' +
  395 + '<span title="' + titleStr + '" style="width:60%;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;' + resStyle + '">'
  396 + + $html + valueStr + '</span>';
  397 + //补充空白区域
  398 + if (v.length < cols) {
  399 + var l = cols - v.length;
  400 + var appendSpan = '';
  401 + for (var n = 0; n < l; n++) {
  402 + appendSpan += "<span></span><span></span>";
  403 + }
  404 + span += appendSpan;
  405 + }
  406 + });
  407 + li += '<li>' + span + '</li>'
  408 + });
  409 + $("#" + targetId).html(li);
  410 + }
  411 + },
  412 + /**
339 *仪表盘数据格式 413 *仪表盘数据格式
340 * @param targetId 仪表盘所在区域ID 414 * @param targetId 仪表盘所在区域ID
341 * @param resId 资源ID 415 * @param resId 资源ID
@@ -596,6 +670,36 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -596,6 +670,36 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
596 670
597 }); 671 });
598 }, 672 },
  673 + snapshotRenderResHealth: function (data){
  674 + var clas = 'res-state-pie--good';
  675 + if (data.icon == 'worst') {
  676 + clas = 'res-state-pie--bad';
  677 + }
  678 + if (data.icon == 'worse') {
  679 + clas = 'res-state-pie--middle';
  680 + }
  681 + var reslt = "优", yz = '0', yb = '0', zy = '0';
  682 + if (data.state) {
  683 + reslt = data.state;
  684 + }
  685 + if (data.yz) {
  686 + yz = data.yz == 'null' || '' ? 0 : data.yz;
  687 + }
  688 + if (data.zy) {
  689 + zy = data.zy == 'null' || '' ? 0 : data.zy;
  690 + }
  691 + if (data.yb) {
  692 + yb = data.yb == 'null' || '' ? 0 : data.yb;
  693 + }
  694 + var html = '<div class="res-state-pie ' + clas + '">' + reslt + '</div>' +
  695 + ' <ul>' +
  696 + ' <li>严重告警:' + yz + '</li>' +
  697 + ' <li>重要告警:' + zy + '</li>' +
  698 + ' <li>一般告警:' + yb + '</li>' +
  699 + ' </ul>';
  700 +
  701 + $("#hostminicomputerpartition_resstate").html(html);
  702 + },
599 703
600 /** 704 /**
601 * 资源状态 705 * 资源状态
@@ -2172,6 +2276,8 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -2172,6 +2276,8 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
2172 }); 2276 });
2173 }, 2277 },
2174 2278
  2279 +
  2280 +
2175 /** 2281 /**
2176 * 柱状图+折线图 2282 * 柱状图+折线图
2177 * @params targetId 目标dom 2283 * @params targetId 目标dom
@@ -2620,20 +2726,20 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -2620,20 +2726,20 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
2620 '<input type="radio" name="noticeFlag" value="true" title="是">&nbsp;是' + 2726 '<input type="radio" name="noticeFlag" value="true" title="是">&nbsp;是' +
2621 '<input type="radio" name="noticeFlag" value="false" title="否" checked="" style="margin-left: 20px;">&nbsp;否</div> '); 2727 '<input type="radio" name="noticeFlag" value="false" title="否" checked="" style="margin-left: 20px;">&nbsp;否</div> ');
2622 } 2728 }
2623 - //start lsq 添加状态指标下探 2022-06-09  
2624 - $("[lay-id='" + tableId + "']").find(".layui-table-cell").hover(function () {  
2625 - var $that = $(this)  
2626 - var $btn = $that.find(".detail_row_menu");  
2627 - if ($btn.length > 0) {  
2628 - $(".layui-card-body").find(".detail_row_menu:not(.hide)").addClass("hide")  
2629 - $btn.removeClass("hide");  
2630 - }  
2631 - })  
2632 - filterSuppressMonitor(resId);  
2633 - //end lsq 2022-06-09  
2634 } 2729 }
2635 }) 2730 })
2636 }); 2731 });
  2732 + //start lsq 添加状态指标下探 2022-06-09
  2733 + $("[lay-id='" + tableId + "']").find(".layui-table-cell").hover(function () {
  2734 + var $that = $(this)
  2735 + var $btn = $that.find(".detail_row_menu");
  2736 + if ($btn.length > 0) {
  2737 + $(".layui-card-body").find(".detail_row_menu:not(.hide)").addClass("hide")
  2738 + $btn.removeClass("hide");
  2739 + }
  2740 + })
  2741 + filterSuppressMonitor(resId);
  2742 + //end lsq 2022-06-09
2637 } 2743 }
2638 }); 2744 });
2639 if ($('.layui-show').find(".detail-left-panel").length == 0) { 2745 if ($('.layui-show').find(".detail-left-panel").length == 0) {
@@ -2742,6 +2848,47 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -2742,6 +2848,47 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
2742 } 2848 }
2743 }, 2849 },
2744 /** 2850 /**
  2851 + * 活动告警
  2852 + * @param tableId
  2853 + * @param resId
  2854 + */
  2855 + snapshotRenderActiveAlarms: function (title,tableId, data) {
  2856 + //start lsq 状态信息的状态也增加下探 202-06-08
  2857 + let statusF = false;//是否为状态信息
  2858 + //end lsq 2022-06-08
  2859 + $('#' + tableId).prev().text(title)
  2860 + var alarmlist = table.render({
  2861 + elem: '#' + tableId
  2862 + , data: data
  2863 + , cols: [[
  2864 + {
  2865 + field: 'LAY_INDEX', title: '序号', align: 'center', width: 100,
  2866 + templet: function (d) {
  2867 + return '<span>' + d.LAY_INDEX + '</span>';
  2868 + }
  2869 + }
  2870 + , {
  2871 + field: 'alarmLevel', title: '告警级别', align: 'center', width: 140, sort: true,
  2872 + templet: function (d) {
  2873 + if (d.alarmLevel == 3) {
  2874 + return '<span class="layui-table-warn" style="width: 100%;">严重</span>';
  2875 + } else if (d.alarmLevel == 2) {
  2876 + return '<span class="layui-table-close" style="width: 100%;">重要</span>';
  2877 + } else if (d.alarmLevel == 1) {
  2878 + return '<span class="layui-table-normal" style="width: 100%;">一般</span>';
  2879 + }
  2880 + }
  2881 + }
  2882 + , {field: 'alarmContent', title: '告警内容', align: 'center'}
  2883 + , {
  2884 + field: 'kpiName', title: '指标名称', align: 'center', width: '20%',
  2885 + }
  2886 + , {field: 'updateTime', title: '告警时间', align: 'center', width: '15%'}
  2887 + ]],
  2888 + });
  2889 +
  2890 + },
  2891 + /**
2745 * 虚拟化虚拟机列表 2892 * 虚拟化虚拟机列表
2746 * @param tableId 2893 * @param tableId
2747 * @param resId 2894 * @param resId
@@ -3329,6 +3476,8 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -3329,6 +3476,8 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
3329 title += `<a class="layui-icon res-view-relation-topo" data-id=${resId} lay-tips="查看资源关系拓扑" style="margin-left: 10px"><i class="iconfont">&#XE515;</i></a>`; 3476 title += `<a class="layui-icon res-view-relation-topo" data-id=${resId} lay-tips="查看资源关系拓扑" style="margin-left: 10px"><i class="iconfont">&#XE515;</i></a>`;
3330 //lsq 2022-04-25 增加ping详情提交按钮 3477 //lsq 2022-04-25 增加ping详情提交按钮
3331 title += `<a class="layui-icon res-view-ping" data-id=${resId} data-resname=${resName} data-ip=${ip} data-restypename=${resTypeName} data-adminname=${adminName} lay-tips="历史数据" style="margin-left: 10px;position:relative;top:-3px;"> <img width="20" src="/src/style/img/ping.png" ></a>`; 3478 title += `<a class="layui-icon res-view-ping" data-id=${resId} data-resname=${resName} data-ip=${ip} data-restypename=${resTypeName} data-adminname=${adminName} lay-tips="历史数据" style="margin-left: 10px;position:relative;top:-3px;"> <img width="20" src="/src/style/img/ping.png" ></a>`;
  3479 + title += `<a class="layui-icon res-view-history" data-id=${resId} data-resname=${res.resName} data-ip=${ip} data-restypename=${res.resTypeName} data-adminname=${res.adminName} lay-tips="快照历史记录" style="top: -3px;float: right;"> <img width="20" src="/src/style/img/snapshothistory.png" ></a>`;
  3480 + title += `<a class="layui-icon res-view-addSnapshot" data-id=${resId} lay-tips="创建快照" style="top: -3px;float: right; margin-right: 10px"> <img width="20" src="/src/style/img/snapshotadd.png" ></a>`;
3332 if (resCategory === 'share' && hardwareFlag.endsWith("Y")) { 3481 if (resCategory === 'share' && hardwareFlag.endsWith("Y")) {
3333 /* 3482 /*
3334 title += `<a class="layui-icon res-view-assets-details" data-ip=${ip} data-name=${name} data-restype=${resType} data-id=${resId} lay-tips="资产配置信息"><i class="iconfont">&#XE517;</i></a>`; 3483 title += `<a class="layui-icon res-view-assets-details" data-ip=${ip} data-name=${name} data-restype=${resType} data-id=${resId} lay-tips="资产配置信息"><i class="iconfont">&#XE517;</i></a>`;
@@ -3354,6 +3503,8 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -3354,6 +3503,8 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
3354 title += `<a class="layui-icon res-view-relation-topo" data-id=${resId} lay-tips="查看资源关系拓扑" style="margin-left: 10px"><i class="iconfont">&#XE515;</i></a>`; 3503 title += `<a class="layui-icon res-view-relation-topo" data-id=${resId} lay-tips="查看资源关系拓扑" style="margin-left: 10px"><i class="iconfont">&#XE515;</i></a>`;
3355 //lsq 2022-04-25 增加ping详情提交按钮 3504 //lsq 2022-04-25 增加ping详情提交按钮
3356 title += `<a class="layui-icon res-view-ping" data-id=${resId} data-resname=${res.resName} data-ip=${ip} data-restypename=${res.resTypeName} data-adminname=${res.adminName} lay-tips="历史数据" style="margin-left: 10px;position:relative;top:-3px;"> <img width="20" src="/src/style/img/ping.png" ></a>`; 3505 title += `<a class="layui-icon res-view-ping" data-id=${resId} data-resname=${res.resName} data-ip=${ip} data-restypename=${res.resTypeName} data-adminname=${res.adminName} lay-tips="历史数据" style="margin-left: 10px;position:relative;top:-3px;"> <img width="20" src="/src/style/img/ping.png" ></a>`;
  3506 + title += `<a class="layui-icon res-view-history" data-id=${resId} data-resname=${res.resName} data-ip=${ip} data-restypename=${res.resTypeName} data-adminname=${res.adminName} lay-tips="快照历史记录" style="top: -3px;float: right;"> <img width="20" src="/src/style/img/snapshothistory.png" ></a>`;
  3507 + title += `<a class="layui-icon res-view-addSnapshot" data-id=${resId} lay-tips="创建快照" style="top: -3px;float: right; margin-right: 10px"> <img width="20" src="/src/style/img/snapshotadd.png" ></a>`;
3357 if (resCategory === 'share' && hardwareFlag.endsWith("Y")) { 3508 if (resCategory === 'share' && hardwareFlag.endsWith("Y")) {
3358 /* 3509 /*
3359 title += `<a class="layui-icon res-view-assets-details" data-ip=${ip} data-name=${name} data-restype=${resType} data-id=${resId} lay-tips="资产配置信息"><i class="iconfont">&#XE517;</i></a>`; 3510 title += `<a class="layui-icon res-view-assets-details" data-ip=${ip} data-name=${name} data-restype=${resType} data-id=${resId} lay-tips="资产配置信息"><i class="iconfont">&#XE517;</i></a>`;
@@ -3645,7 +3796,39 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele @@ -3645,7 +3796,39 @@ layui.define(['laytpl', 'admin', 'form', 'table', 'echarts', 'sessions', 'xmSele
3645 }); 3796 });
3646 }); 3797 });
3647 //end lsq 2022-04-24 3798 //end lsq 2022-04-24
3648 - 3799 + $('a.res-view-addSnapshot').unbind('click').on('click', function () {
  3800 + var resId = $(this).data('id');
  3801 + layer.confirm('将创建该资源的所有快照信息,请确认', {
  3802 + btn: ['确定', '取消'] //按钮
  3803 + }, function () {
  3804 + admin.req({
  3805 + url: common.domainName + '/api-web/snapshot/his/add?access_token=' + layui.sessions.getToken().access_token +'&resId=' + resId
  3806 + , type: 'get'
  3807 + , done: function (res) {
  3808 + if (res.success) {
  3809 + layer.msg('操作成功!', {offset: '15px', icon: 1, time: 2000});
  3810 + } else {
  3811 + layer.msg(res.msg, {offset: '15px', icon: 7, time: 2000});
  3812 + }
  3813 + }
  3814 + });
  3815 + });
  3816 + });
  3817 + $('a.res-view-history').unbind('click').on('click', function () {
  3818 + let name = $(this).data('resname')+' |'+$(this).data('restypename')+' |'+$(this).data('ip')+' |'+'历史快照数据';
  3819 + let paramStr = '?resId=' + $(this).data('id');
  3820 + layer.open({
  3821 + title: [name, 'font-size:18px;'],
  3822 + type: 2,
  3823 + area: ['65%', '90%'],
  3824 + shadeClose: true,//开启遮罩层
  3825 + id: 'res-history',
  3826 + content: ['/vue3/index.html#/vue3/snapshot/history' + paramStr, 'no'],
  3827 + cancel: function () {
  3828 + clearTimeout();
  3829 + }
  3830 + });
  3831 + });
3649 // 查看资产配置信息 3832 // 查看资产配置信息
3650 $('a.res-view-assets-details').unbind('click').on('click', function () { 3833 $('a.res-view-assets-details').unbind('click').on('click', function () {
3651 var $that = $(this); 3834 var $that = $(this);
1 /** 指标组新增 */ 1 /** 指标组新增 */
2 layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'laydate', 'element', 'admin', 'kpiIndex', 'resourcetype'], function (exports) { 2 layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'laydate', 'element', 'admin', 'kpiIndex', 'resourcetype'], function (exports) {
3 - var $ = layui.$;  
4 - var form = layui.form;  
5 - var table = layui.table;  
6 - var common = layui.common;  
7 - var admin = layui.admin;  
8 - var view = layui.view;  
9 - var element = layui.element;  
10 -  
11 - // 对外暴露的接口  
12 - exports('kpiflagEdit', function (data) {  
13 - var flagId = data.id ? data.id : '';  
14 - var sessions = layui.sessions;  
15 - var accessToken = sessions.getToken().access_token;  
16 - var domainName = common.domainName;  
17 - // 表格数据  
18 - var kpiFlagTableData = [];  
19 - var resTypeTableData = [];  
20 - var appTableData = [];  
21 - var serverTableData = [];  
22 - // 加载遮罩  
23 - var loading;  
24 - // 如果是编辑,回显数据  
25 - var flag = {  
26 - id: '',  
27 - flag: '',  
28 - name: '',  
29 - remark: '',  
30 - bindResTypeCount: 0,  
31 - bindAppCount: 0,  
32 - bindServerCount: 0,  
33 - bindList: []  
34 - };  
35 - if (flagId) {  
36 - $.ajax({  
37 - url: common.domainName + '/api-web/manage/Kpiflag/getByFlagId?access_token=' + accessToken + '&flagId=' + flagId,  
38 - type: 'get',  
39 - success: function (res) {  
40 - flag = res.object;  
41 - form.val('form-flag-edit', res.object);  
42 - kpiFlagTableData = res.data;  
43 - reloadKpiFlagTable();  
44 - }  
45 - });  
46 - admin.req({  
47 - url: domainName + '/api-web/manage/restype/list',  
48 - data: {  
49 - flagId: flagId  
50 - }  
51 - }).done(function (response) {  
52 - resTypeTableData = response.data;  
53 - reloadResTypeTable();  
54 - });  
55 - admin.req({  
56 - url: domainName + '/api-web/manage/application/page',  
57 - data: {  
58 - page: -1,  
59 - limit: -1,  
60 - flagId: flagId  
61 - }  
62 - }).done(function (response) {  
63 - appTableData = response.data;  
64 - reloadAppTable();  
65 - });  
66 - admin.req({  
67 - url: domainName + '/api-web/manage/server/page',  
68 - data: {  
69 - page: -1,  
70 - limit: -1,  
71 - flagId: flagId  
72 - }  
73 - }).done(function (response) {  
74 - serverTableData = response.data;  
75 - reloadServerTable();  
76 - }); 3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var table = layui.table;
  6 + var common = layui.common;
  7 + var admin = layui.admin;
  8 + var view = layui.view;
  9 + var element = layui.element;
  10 +
  11 + // 对外暴露的接口
  12 + exports('kpiflagEdit', function (data) {
  13 + var flagId = data.id ? data.id : '';
  14 + var sessions = layui.sessions;
  15 + var accessToken = sessions.getToken().access_token;
  16 + var domainName = common.domainName;
  17 + // 表格数据
  18 + var kpiFlagTableData = [];
  19 + var resTypeTableData = [];
  20 + var appTableData = [];
  21 + var serverTableData = [];
  22 + // 加载遮罩
  23 + var loading;
  24 + // 如果是编辑,回显数据
  25 + var flag = {
  26 + id: '',
  27 + flag: '',
  28 + name: '',
  29 + remark: '',
  30 + bindResTypeCount: 0,
  31 + bindAppCount: 0,
  32 + bindServerCount: 0,
  33 + bindList: []
  34 + };
  35 + if (flagId) {
  36 + $.ajax({
  37 + url: common.domainName + '/api-web/manage/Kpiflag/getByFlagId?access_token=' + accessToken + '&flagId=' + flagId,
  38 + type: 'get',
  39 + success: function (res) {
  40 + flag = res.object;
  41 + form.val('form-flag-edit', res.object);
  42 + kpiFlagTableData = res.data;
  43 + reloadKpiFlagTable();
  44 + }
  45 + });
  46 + admin.req({
  47 + url: domainName + '/api-web/manage/restype/list',
  48 + data: {
  49 + flagId: flagId
  50 + }
  51 + }).done(function (response) {
  52 + resTypeTableData = response.data;
  53 + reloadResTypeTable();
  54 + });
  55 + admin.req({
  56 + url: domainName + '/api-web/manage/application/page',
  57 + data: {
  58 + page: -1,
  59 + limit: -1,
  60 + flagId: flagId
77 } 61 }
78 - element.render('collapse'); 62 + }).done(function (response) {
  63 + appTableData = response.data;
  64 + reloadAppTable();
  65 + });
  66 + admin.req({
  67 + url: domainName + '/api-web/manage/server/page',
  68 + data: {
  69 + page: -1,
  70 + limit: -1,
  71 + flagId: flagId
  72 + }
  73 + }).done(function (response) {
  74 + serverTableData = response.data;
  75 + reloadServerTable();
  76 + });
  77 + }
  78 + element.render('collapse');
  79 + form.render();
  80 + // 刷新指标表格
  81 + var kpiflagTable = table.render({
  82 + elem: '#kpiflag-edit-table'
  83 + , cellMinWidth: 80
  84 + , limit: 10
  85 + , even: true
  86 + , data: kpiFlagTableData
  87 + , cols: [[{
  88 + field: 'kpiName', title: '指标名称', align: 'center', templet: function (d) {
  89 + return d.kpi.kpiName
  90 + }
  91 + }, {
  92 + field: 'kpiIdent', title: '指标分类', align: 'center',
  93 + templet: function (d) {
  94 + switch (d.kpi.kpiIdent) {
  95 + case '0':
  96 + return '基本指标';
  97 + case '1':
  98 + return '性能指标';
  99 + case '2':
  100 + return '状态指标';
  101 + case '3':
  102 + return '告警指标';
  103 + default:
  104 + return '';
  105 + }
  106 + }
  107 + },
  108 + {
  109 + title: '唯一标志', align: 'center',
  110 + templet: function (d) {
  111 + var radioDom = $('<input type="checkbox" name="isUnique" data-index="' + (d.LAY_INDEX-1) + '" lay-skin="switch" lay-text="是|否" lay-filter="switchIsUnique">') ;
  112 + var isUnique = kpiFlagTableData[(d.LAY_INDEX-1)].isUnique;
  113 + if (isUnique === '1') { //当是1时,表示时唯一标志
  114 + radioDom.attr('checked', true);
  115 + }else{
  116 + radioDom.attr('checked', false);
  117 + }
  118 + return radioDom.prop('outerHTML');
  119 + }
  120 + },
  121 + {
  122 + title: '排序', align: 'center',
  123 + templet: function (d) {
  124 + var selectDom = $('<select class="defaultSortSel" class="layui-select" data-index="' + (d.LAY_INDEX-1) + '" lay-filter="select-kpiflag-table-isSort">' +
  125 + '<option>无</option>' +
  126 + '<option>正序</option>' +
  127 + '<option>倒序</option>' +
  128 + '</select>');
  129 + var defaultSort = kpiFlagTableData[(d.LAY_INDEX-1)].defaultSort;
  130 + if (defaultSort == 'asc') {
  131 + selectDom.find('option:contains("正序")').attr('selected', 'selected');
  132 + } else if (defaultSort == 'desc') {
  133 + selectDom.find('option:contains("倒序")').attr('selected', 'selected');
  134 + } else {
  135 + selectDom.find('option:contains("无")').attr('selected', 'selected');
  136 + }
  137 + return selectDom.prop('outerHTML');
  138 + }
  139 + }, {
  140 + field: 'sort', title: '列表顺序', align: 'center',
  141 + templet: function (d) {
  142 + var inputDom = $('<input id="txt-kpiflag-table-sort-' + (d.LAY_INDEX-1) + '" data-index="' + (d.LAY_INDEX-1) + '" type="number" autocomplete="off" class="layui-input txt-kpiflag-table-sort">');
  143 + var sort = kpiFlagTableData[(d.LAY_INDEX-1)].sort;
  144 + if (sort != null) {
  145 + inputDom.attr("value", sort);
  146 + }
  147 + return inputDom.prop('outerHTML');
  148 + }
  149 + },
  150 + {field: 'createUser', title: '创建人', align: 'center'},
  151 + {field: 'createTime', title: '创建时间', align: 'center'},
  152 + {
  153 + title: '操作',width: 100, align: 'center', templet: '<div><span data-index="{{(d.LAY_INDEX-1)}}" class="link link-kpiflag-delete">' +
  154 + '<a class="layui-btn layui-btn-xs layui-btn-normal" title="删除"><i class="layui-icon"></i></a></span>'
  155 + }]],
  156 + done: function (res, curr, count) {
79 form.render(); 157 form.render();
80 - // 刷新指标表格  
81 - var kpiflagTable = table.render({  
82 - elem: '#kpiflag-edit-table'  
83 - , cellMinWidth: 80  
84 - , limit: 10  
85 - , even: true  
86 - , data: kpiFlagTableData  
87 - , cols: [[{  
88 - field: 'kpiName', title: '指标名称', align: 'center', templet: function (d) {  
89 - return d.kpi.kpiName  
90 - }  
91 - }, {  
92 - field: 'kpiIdent', title: '指标分类', align: 'center',  
93 - templet: function (d) {  
94 - switch (d.kpi.kpiIdent) {  
95 - case '0':  
96 - return '基本指标';  
97 - case '1':  
98 - return '性能指标';  
99 - case '2':  
100 - return '状态指标';  
101 - case '3':  
102 - return '告警指标';  
103 - default:  
104 - return '';  
105 - }  
106 - }  
107 - }, {  
108 - title: '唯一标志', align: 'center',  
109 - templet: function (d) {  
110 - var radioDom = $('<form class="layui-form">' +  
111 - '<div class="layui-form-item layui-form-item-flex"><div class="layui-input-block input-flex-1"><input type="radio" data-index="' + d.LAY_TABLE_INDEX + '" name="isUnique" lay-filter="rdo-kpiflag-table-isUnique"></div></div>' +  
112 - '</form>');  
113 - if (d.isUnique === '1') {  
114 - radioDom.find('input[type="radio"]').attr('checked', true);  
115 - }  
116 - return radioDom.prop('outerHTML');  
117 - }  
118 - }, {  
119 - title: '是否排序指标', align: 'center',  
120 - templet: function (d) {  
121 - var selectDom = $('<select data-index="' + d.LAY_TABLE_INDEX + '" lay-filter="select-kpiflag-table-isSort">' +  
122 - '<option>是</option>' +  
123 - '<option>否</option>' +  
124 - '</select>')  
125 - if (d.sort != '' && d.sort != null) {  
126 - selectDom.find('option:contains("是")').attr('selected', 'selected');  
127 - } else {  
128 - selectDom.find('option:contains("否")').attr('selected', 'selected');  
129 - }  
130 - return selectDom.prop('outerHTML');  
131 - }  
132 - }, {  
133 - field: 'sort', title: '列表顺序', align: 'center',  
134 - templet: function (d) {  
135 - var inputDom = $('<input id="txt-kpiflag-table-sort-' + d.LAY_TABLE_INDEX + '" data-index="' + d.LAY_TABLE_INDEX + '" type="number" autocomplete="off" class="layui-input txt-kpiflag-table-sort">');  
136 - if (d.sort != '' && d.sort != null) {  
137 - inputDom.attr("value", d.sort);  
138 - } else {  
139 - inputDom.attr('disabled', true);  
140 - }  
141 - return inputDom.prop('outerHTML');  
142 - }  
143 - }, {  
144 - title: '操作',  
145 - align: 'center',  
146 - templet: '<div><span data-index="{{d.LAY_TABLE_INDEX}}" class="link link-kpiflag-delete">' +  
147 - '<a class="layui-btn layui-btn-xs layui-btn-normal" title="删除"><i class="layui-icon"></i></a></span>'  
148 - }]],  
149 - done: function (res, curr, count) {  
150 - form.render();  
151 - // 是否排序下拉框改变事件  
152 - form.on('select(select-kpiflag-table-isSort)', function (data) {  
153 - var index = $(data.elem).data('index');  
154 - if (data.value === '是') {  
155 - $('#txt-kpiflag-table-sort-' + index).attr('disabled', false);  
156 - } else {  
157 - kpiFlagTableData[index].sort = '';  
158 - $('#txt-kpiflag-table-sort-' + index).val('');  
159 - $('#txt-kpiflag-table-sort-' + index).attr('disabled', true);  
160 - }  
161 - });  
162 - // radio选择事件  
163 - form.on('radio(rdo-kpiflag-table-isUnique)', function (data) {  
164 - for (var i = 0; i < kpiFlagTableData.length; i++) {  
165 - kpiFlagTableData[i].isUnique = '0';  
166 - }  
167 - kpiFlagTableData[$(data.elem).data('index')].isUnique = '1';  
168 - });  
169 - // 排序输入框输入事件  
170 - $('.txt-kpiflag-table-sort').change(function () {  
171 - kpiFlagTableData[$(this).data('index')].sort = $(this).val();  
172 - });  
173 - // 删除事件  
174 - $('.link-kpiflag-delete').click(function () {  
175 - kpiFlagTableData.splice($(this).data('index'), 1);  
176 - reloadKpiFlagTable();  
177 - });  
178 - } 158 + $(".kpiflag-edit-table .layui-table-body,.kpiflag-edit-table .layui-table-box,.kpiflag-edit-table .layui-table-cell").css('overflow', 'visible');
  159 + // 排序下拉框改变事件
  160 + form.on('select(select-kpiflag-table-isSort)', function (data) {
  161 + var index = $(data.elem).data('index');
  162 + var defaultSort = 'none';
  163 + if (data.value === '正序') {
  164 + defaultSort = 'asc';
  165 + } else if (data.value === '倒序') {
  166 + defaultSort = 'desc';
  167 + }
  168 + kpiFlagTableData[index].defaultSort = defaultSort;
179 }); 169 });
180 - // 资源类型绑定表格  
181 - var resTypeBindTable = table.render({  
182 - elem: '#table-flag-bind-retype'  
183 - , cellMinWidth: 80  
184 - , limit: 9999  
185 - , even: true  
186 - , data: resTypeTableData  
187 - , page: {  
188 - layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],  
189 - theme: '#1E9FFF'  
190 - }  
191 - , cols: [[{  
192 - field: 'resTypeName', title: '名称', align: 'center', sort: true, width: '280'  
193 - }, {  
194 - field: 'resTypeCode', title: '编码', align: 'center', sort: true, width: '390'  
195 - }, {  
196 - field: 'resTypeDesc', title: '类别', align: 'center', sort: true, width: '280'  
197 - }, {  
198 - field: 'createTime', title: '创建时间', align: 'center', sort: true, width: '275'  
199 - }, {  
200 - title: '操作', align: 'center', fixed: 'right', width: '170',  
201 - toolbar:  
202 - '<div>' +  
203 - ' <span data-index="{{d.LAY_TABLE_INDEX}}" class="layui-btn layui-btn-xs layui-btn-normal btn-flag-bind-restype-delete" title="取消绑定">' +  
204 - '<i class="layui-icon layui-icon-unlink"></i></span>' +  
205 - '</div>'  
206 - }]],  
207 - done: function (res, curr, count) {  
208 - $('.btn-flag-bind-restype-delete').click(function () {  
209 - resTypeTableData.splice($(this).data('index'), 1);  
210 - reloadResTypeTable();  
211 - });  
212 - } 170 + //唯一标志开关事件
  171 + form.on('switch(switchIsUnique)', function(data){
  172 + if (this.checked){
  173 + kpiFlagTableData[$(data.elem).data('index')].isUnique = '1';
  174 + }else{
  175 + kpiFlagTableData[$(data.elem).data('index')].isUnique = '0';
  176 + }
213 }); 177 });
214 -  
215 - // 应用绑定表格  
216 - var appBindTable = table.render({  
217 - elem: '#table-flag-bind-app'  
218 - , cellMinWidth: 80  
219 - , limit: 9999  
220 - , even: true  
221 - , data: []  
222 - , page: {  
223 - layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],  
224 - theme: '#1E9FFF'  
225 - }  
226 - , cols: [[{  
227 - field: 'appCode', title: '应用编号', align: 'center', sort: true, width: '240'  
228 - }, {  
229 - field: 'appName', title: '应用名称', align: 'center', sort: true, width: '240'  
230 - }, {  
231 - field: 'busTypeName', title: '所属业务', align: 'center', sort: true, width: '193',  
232 - templet: function (d) {  
233 - return d.busType.busTypeName;  
234 - }  
235 - }, {  
236 - field: 'appDesc', title: '应用描述', align: 'center', sort: true, width: '340'  
237 - }, {  
238 - field: 'createTime', title: '创建时间', align: 'center', sort: true, width: '190'  
239 - }, {  
240 - title: '操作', align: 'center', fixed: 'right', width: '190',  
241 - toolbar:  
242 - '<div>' +  
243 - ' <span data-index="{{d.LAY_TABLE_INDEX}}" class="layui-btn layui-btn-xs layui-btn-normal btn-flag-bind-app-delete" title="取消绑定">' +  
244 - '<i class="layui-icon layui-icon-unlink"></i></span>' +  
245 - '</div>'  
246 - }]],  
247 - done: function (res, curr, count) {  
248 - $('.btn-flag-bind-app-delete').click(function () {  
249 - appTableData.splice($(this).data('index'), 1);  
250 - reloadAppTable();  
251 - });  
252 - } 178 + // 排序输入框输入事件
  179 + $('.txt-kpiflag-table-sort').change(function () {
  180 + kpiFlagTableData[$(this).data('index')].sort = $(this).val();
253 }); 181 });
254 -  
255 - // 服务绑定表格  
256 - var serverBindTable = table.render({  
257 - elem: '#table-flag-bind-server'  
258 - , cellMinWidth: 80  
259 - , limit: 9999  
260 - , even: true  
261 - , data: []  
262 - , page: {  
263 - layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],  
264 - theme: '#1E9FFF'  
265 - }  
266 - , cols: [[{  
267 - field: 'serverCode', title: '服务编号', align: 'center', sort: true, width: '190'  
268 - }, {  
269 - field: 'serverName', title: '服务名称', align: 'center', sort: true, width: '190'  
270 - }, {  
271 - field: 'busTypeName', title: '所属业务', align: 'center', sort: true, width: '190',  
272 - templet: function (d) {  
273 - return d.application.busType.busTypeName;  
274 - }  
275 - }, {  
276 - field: 'appName', title: '所属应用', align: 'center', sort: true, width: '190',  
277 - templet: function (d) {  
278 - return d.application.appName;  
279 - }  
280 - }, {  
281 - field: 'serverDesc', title: '服务描述', align: 'center', sort: true, width: '300'  
282 - }, {  
283 - field: 'createTime', title: '创建时间', align: 'center', sort: true, width: '160'  
284 - }, {  
285 - title: '操作', align: 'center', fixed: 'right', width: '173',  
286 - toolbar:  
287 - '<div>' +  
288 - ' <span data-index="{{d.LAY_TABLE_INDEX}}" class="layui-btn layui-btn-xs layui-btn-normal btn-flag-bind-server-delete" title="取消绑定">' +  
289 - '<i class="layui-icon layui-icon-unlink"></i></span>' +  
290 - '</div>'  
291 - }]],  
292 - done: function (res, curr, count) {  
293 - $('.btn-flag-bind-server-delete').click(function () {  
294 - serverTableData.splice($(this).data('index'), 1);  
295 - reloadServerTable();  
296 - });  
297 - } 182 + // 删除事件
  183 + $('.link-kpiflag-delete').click(function () {
  184 + kpiFlagTableData.splice($(this).data('index'), 1);
  185 + reloadKpiFlagTable();
298 }); 186 });
299 -  
300 - // 绑定资源类型  
301 - $('#btn-kpi-flag-restype-bind').click(function () {  
302 - //先关闭已经打开的资源类型页签  
303 - $('[lay-id="/baseconfig/resourcetype/index"]').find('.layui-tab-close').trigger('click');  
304 - var resourcetype = layui.resourcetype();  
305 - common.openWin('/baseconfig/resourcetype/index', '选择资源类型', {}, ['选择', '取消'], function () {  
306 - var checks = resourcetype.getResTypeChecks();  
307 - $.each(checks, function (index, value) {  
308 - var flag = true;  
309 - $.each(resTypeTableData, function (i, v) {  
310 - if (value.resTypeId === v.resTypeId) {  
311 - flag = false;  
312 - return;  
313 - }  
314 - });  
315 - if (flag) {  
316 - resTypeTableData.push(value);  
317 - }  
318 - });  
319 - reloadResTypeTable();  
320 - return true;  
321 - }, null, ['90%', '90%']) 187 + }
  188 + });
  189 + // 资源类型绑定表格
  190 + var resTypeBindTable = table.render({
  191 + elem: '#table-flag-bind-retype'
  192 + , cellMinWidth: 80
  193 + , limit: 9999
  194 + , even: true
  195 + , data: resTypeTableData
  196 + , page: {
  197 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],
  198 + theme: '#1E9FFF'
  199 + }
  200 + , cols: [[{
  201 + field: 'resTypeName', title: '名称', align: 'center', sort: true
  202 + }, {
  203 + field: 'resTypeCode', title: '编码', align: 'center', sort: true
  204 + }, {
  205 + field: 'resTypeDesc', title: '类别', align: 'center', sort: true
  206 + },{field: 'createUser', title: '创建人', align: 'center'
  207 + }, {
  208 + field: 'createTime', title: '创建时间', align: 'center'
  209 + }, {
  210 + title: '操作', align: 'center', fixed: 'right', width: '170',
  211 + toolbar:
  212 + '<div>' +
  213 + ' <span data-index="{{d.LAY_TABLE_INDEX}}" class="layui-btn layui-btn-xs layui-btn-normal btn-flag-bind-restype-delete" title="取消绑定">' +
  214 + '<i class="layui-icon layui-icon-unlink"></i></span>' +
  215 + '</div>'
  216 + }]],
  217 + done: function (res, curr, count) {
  218 + $('.btn-flag-bind-restype-delete').click(function () {
  219 + resTypeTableData.splice($(this).data('index'), 1);
  220 + reloadResTypeTable();
322 }); 221 });
  222 + }
  223 + });
323 224
324 - // 绑定应用  
325 - $('#btn-kpi-flag-app-bind').click(function () {  
326 - //先关闭已经打开的应用页签  
327 - $('[lay-id="/baseconfig/application/index"]').find('.layui-tab-close').trigger('click');  
328 - common.openWin('/baseconfig/application/index', '选择应用', {}, ['选择', '取消'], function () {  
329 - var checks = table.checkStatus('application-table').data;  
330 - $.each(checks, function (index, value) {  
331 - var flag = true;  
332 - $.each(appTableData, function (i, v) {  
333 - if (value.appId === v.appId) {  
334 - flag = false;  
335 - return;  
336 - }  
337 - });  
338 - if (flag) {  
339 - appTableData.push(value);  
340 - }  
341 - });  
342 - reloadAppTable();  
343 - return true;  
344 - }, null, ['1500px', '90%']) 225 + // 应用绑定表格
  226 + var appBindTable = table.render({
  227 + elem: '#table-flag-bind-app'
  228 + , cellMinWidth: 80
  229 + , limit: 9999
  230 + , even: true
  231 + , data: []
  232 + , page: {
  233 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],
  234 + theme: '#1E9FFF'
  235 + }
  236 + , cols: [[{
  237 + field: 'appCode', title: '应用编号', align: 'center', sort: true, width: '240'
  238 + }, {
  239 + field: 'appName', title: '应用名称', align: 'center', sort: true, width: '240'
  240 + }, {
  241 + field: 'busTypeName', title: '所属业务', align: 'center', sort: true, width: '193',
  242 + templet: function (d) {
  243 + return d.busType.busTypeName;
  244 + }
  245 + }, {
  246 + field: 'appDesc', title: '应用描述', align: 'center', sort: true, width: '340'
  247 + }, {
  248 + field: 'createTime', title: '创建时间', align: 'center', sort: true, width: '190'
  249 + }, {
  250 + title: '操作', align: 'center', fixed: 'right', width: '190',
  251 + toolbar:
  252 + '<div>' +
  253 + ' <span data-index="{{d.LAY_TABLE_INDEX}}" class="layui-btn layui-btn-xs layui-btn-normal btn-flag-bind-app-delete" title="取消绑定">' +
  254 + '<i class="layui-icon layui-icon-unlink"></i></span>' +
  255 + '</div>'
  256 + }]],
  257 + done: function (res, curr, count) {
  258 + $('.btn-flag-bind-app-delete').click(function () {
  259 + appTableData.splice($(this).data('index'), 1);
  260 + reloadAppTable();
345 }); 261 });
  262 + }
  263 + });
  264 +
  265 + // 服务绑定表格
  266 + var serverBindTable = table.render({
  267 + elem: '#table-flag-bind-server'
  268 + , cellMinWidth: 80
  269 + , limit: 9999
  270 + , even: true
  271 + , data: []
  272 + , page: {
  273 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],
  274 + theme: '#1E9FFF'
  275 + }
  276 + , cols: [[{
  277 + field: 'serverCode', title: '服务编号', align: 'center', sort: true, width: '190'
  278 + }, {
  279 + field: 'serverName', title: '服务名称', align: 'center', sort: true, width: '190'
  280 + }, {
  281 + field: 'busTypeName', title: '所属业务', align: 'center', sort: true, width: '190',
  282 + templet: function (d) {
  283 + return d.application.busType.busTypeName;
  284 + }
  285 + }, {
  286 + field: 'appName', title: '所属应用', align: 'center', sort: true, width: '190',
  287 + templet: function (d) {
  288 + return d.application.appName;
  289 + }
  290 + }, {
  291 + field: 'serverDesc', title: '服务描述', align: 'center', sort: true, width: '300'
  292 + }, {
  293 + field: 'createTime', title: '创建时间', align: 'center', sort: true, width: '160'
  294 + }, {
  295 + title: '操作', align: 'center', fixed: 'right', width: '173',
  296 + toolbar:
  297 + '<div>' +
  298 + ' <span data-index="{{d.LAY_TABLE_INDEX}}" class="layui-btn layui-btn-xs layui-btn-normal btn-flag-bind-server-delete" title="取消绑定">' +
  299 + '<i class="layui-icon layui-icon-unlink"></i></span>' +
  300 + '</div>'
  301 + }]],
  302 + done: function (res, curr, count) {
  303 + $('.btn-flag-bind-server-delete').click(function () {
  304 + serverTableData.splice($(this).data('index'), 1);
  305 + reloadServerTable();
  306 + });
  307 + }
  308 + });
346 309
347 - // 绑定服务  
348 - $('#btn-kpi-flag-server-bind').click(function () {  
349 - //先关闭已经打开的应用页签  
350 - $('[lay-id="/baseconfig/server/index"]').find('.layui-tab-close').trigger('click');  
351 - common.openWin('/baseconfig/server/index', '选择服务', {}, ['选择', '取消'], function () {  
352 - var checks = table.checkStatus('server-table').data;  
353 - $.each(checks, function (index, value) {  
354 - var flag = true;  
355 - $.each(serverTableData, function (i, v) {  
356 - if (value.serverId === v.serverId) {  
357 - flag = false;  
358 - return;  
359 - }  
360 - });  
361 - if (flag) {  
362 - serverTableData.push(value);  
363 - }  
364 - });  
365 - reloadServerTable();  
366 - return true;  
367 - }, null, ['1500px', '90%']) 310 + // 绑定资源类型
  311 + $('#btn-kpi-flag-restype-bind').click(function () {
  312 + //先关闭已经打开的资源类型页签
  313 + $('[lay-id="/baseconfig/resourcetype/index"]').find('.layui-tab-close').trigger('click');
  314 + var resourcetype = layui.resourcetype();
  315 + common.openWin('/baseconfig/resourcetype/index', '选择资源类型', {}, ['选择', '取消'], function () {
  316 + var checks = resourcetype.getResTypeChecks();
  317 + $.each(checks, function (index, value) {
  318 + var flag = true;
  319 + $.each(resTypeTableData, function (i, v) {
  320 + if (value.resTypeId === v.resTypeId) {
  321 + flag = false;
  322 + return;
  323 + }
  324 + });
  325 + if (flag) {
  326 + // value.createUser = form.val('form-flag-edit').createUser;
  327 + // value.createTime = common.getToday('');
  328 + resTypeTableData.push(value);
  329 + }
  330 + });
  331 + reloadResTypeTable();
  332 + return true;
  333 + }, null, ['90%', '90%'])
  334 + });
  335 +
  336 + // 绑定应用
  337 + $('#btn-kpi-flag-app-bind').click(function () {
  338 + //先关闭已经打开的应用页签
  339 + $('[lay-id="/baseconfig/application/index"]').find('.layui-tab-close').trigger('click');
  340 + common.openWin('/baseconfig/application/index', '选择应用', {}, ['选择', '取消'], function () {
  341 + var checks = table.checkStatus('application-table').data;
  342 + $.each(checks, function (index, value) {
  343 + var flag = true;
  344 + $.each(appTableData, function (i, v) {
  345 + if (value.appId === v.appId) {
  346 + flag = false;
  347 + return;
  348 + }
  349 + });
  350 + if (flag) {
  351 + appTableData.push(value);
  352 + }
  353 + });
  354 + reloadAppTable();
  355 + return true;
  356 + }, null, ['1500px', '90%'])
  357 + });
  358 +
  359 + // 绑定服务
  360 + $('#btn-kpi-flag-server-bind').click(function () {
  361 + //先关闭已经打开的应用页签
  362 + $('[lay-id="/baseconfig/server/index"]').find('.layui-tab-close').trigger('click');
  363 + common.openWin('/baseconfig/server/index', '选择服务', {}, ['选择', '取消'], function () {
  364 + var checks = table.checkStatus('server-table').data;
  365 + $.each(checks, function (index, value) {
  366 + var flag = true;
  367 + $.each(serverTableData, function (i, v) {
  368 + if (value.serverId === v.serverId) {
  369 + flag = false;
  370 + return;
  371 + }
  372 + });
  373 + if (flag) {
  374 + serverTableData.push(value);
  375 + }
368 }); 376 });
  377 + reloadServerTable();
  378 + return true;
  379 + }, null, ['1500px', '90%'])
  380 + });
369 381
370 - // 刷新指标表格  
371 - function reloadKpiFlagTable() {  
372 - kpiflagTable.reload({  
373 - page: {curr: 1},  
374 - data: kpiFlagTableData  
375 - });  
376 - } 382 + // 刷新指标表格
  383 + function reloadKpiFlagTable() {
  384 + kpiflagTable.reload({
  385 + page: {curr: 1},
  386 + data: kpiFlagTableData
  387 + });
  388 + }
377 389
378 - // 刷新绑定资源类型表格  
379 - function reloadResTypeTable() {  
380 - $('#txt-flag-bind-resTypeCount').html(resTypeTableData.length);  
381 - resTypeBindTable.reload({  
382 - page: {curr: 1},  
383 - data: resTypeTableData  
384 - });  
385 - } 390 + // 刷新绑定资源类型表格
  391 + function reloadResTypeTable() {
  392 + $('#txt-flag-bind-resTypeCount').html(resTypeTableData.length);
  393 + resTypeBindTable.reload({
  394 + page: {curr: 1},
  395 + data: resTypeTableData
  396 + });
  397 + }
  398 +
  399 + // 刷新绑定应用表格
  400 + function reloadAppTable() {
  401 + $('#txt-flag-bind-appCount').html(appTableData.length);
  402 + appBindTable.reload({
  403 + page: {curr: 1},
  404 + data: appTableData
  405 + });
  406 + }
  407 +
  408 + // 刷新绑定服务表格
  409 + function reloadServerTable() {
  410 + $('#txt-flag-bind-serverCount').html(serverTableData.length);
  411 + serverBindTable.reload({
  412 + page: {curr: 1},
  413 + data: serverTableData
  414 + });
  415 + }
386 416
387 - // 刷新绑定应用表格  
388 - function reloadAppTable() {  
389 - $('#txt-flag-bind-appCount').html(appTableData.length);  
390 - appBindTable.reload({  
391 - page: {curr: 1},  
392 - data: appTableData  
393 - }); 417 + // 表单提交事件
  418 + form.on('submit(form-flag-edit)', function (data) {
  419 + loading = layer.load(2);
  420 + var flag = {
  421 + id: flagId,
  422 + flag: '',
  423 + name: '',
  424 + remark: '',
  425 + dimension: '',
  426 + kpiFlagList: kpiFlagTableData,
  427 + bindList: []
  428 + };
  429 + $.each(resTypeTableData, function (i, v) {
  430 + flag.bindList.push({
  431 + id: '',
  432 + flagId: '',
  433 + bindId: v.resTypeId,
  434 + bindType: '1',
  435 + bindCode: v.resTypeCode
  436 + });
  437 + });
  438 + $.each(appTableData, function (i, v) {
  439 + flag.bindList.push({
  440 + id: '',
  441 + flagId: '',
  442 + bindId: v.appId,
  443 + bindType: '2'
  444 + });
  445 + });
  446 + $.each(serverTableData, function (i, v) {
  447 + flag.bindList.push({
  448 + id: '',
  449 + flagId: '',
  450 + bindId: v.serverId,
  451 + bindType: '3'
  452 + });
  453 + });
  454 + Object.assign(flag, form.val('form-flag-edit'));
  455 + admin.req({
  456 + url: common.domainName + '/api-web/manage/Kpiflag/saveFlag?access_token=' + accessToken,
  457 + type: 'POST',
  458 + contentType: 'application/json',
  459 + data: JSON.stringify(flag),
  460 + error: function () {
  461 + layer.close(loading);
394 } 462 }
395 -  
396 - // 刷新绑定服务表格  
397 - function reloadServerTable() {  
398 - $('#txt-flag-bind-serverCount').html(serverTableData.length);  
399 - serverBindTable.reload({  
400 - page: {curr: 1},  
401 - data: serverTableData  
402 - }); 463 + }).done(function (response) {
  464 + layer.close(loading);
  465 + if (response.success) {
  466 + layer.msg('保存成功', {icon: 1, timeout: 3000});
  467 + layer.closeAll('page');
  468 + table.reload('kpiflag_table', {
  469 + page: {
  470 + curr: 1
  471 + }
  472 + , where: {
  473 + access_token: accessToken,
  474 + keyWord: $("#kpiflag_keyword").val(),
  475 + dimension: $('select[name="dimension"]').val()
  476 + }
  477 + });
  478 + } else {
  479 + layer.msg('保存失败', {icon: 2, timeout: 3000});
403 } 480 }
  481 + });
  482 + return false;
  483 + });
404 484
405 - // 表单提交事件  
406 - form.on('submit(form-flag-edit)', function (data) {  
407 - loading = layer.load(2);  
408 - var flag = {  
409 - id: flagId,  
410 - flag: '',  
411 - name: '',  
412 - remark: '',  
413 - kpiFlagList: kpiFlagTableData,  
414 - bindList: []  
415 - };  
416 - $.each(resTypeTableData, function (i, v) {  
417 - flag.bindList.push({  
418 - id: '',  
419 - flagId: '',  
420 - bindId: v.resTypeId,  
421 - bindType: '1'  
422 - });  
423 - });  
424 - $.each(appTableData, function (i, v) {  
425 - flag.bindList.push({  
426 - id: '',  
427 - flagId: '',  
428 - bindId: v.appId,  
429 - bindType: '2'  
430 - });  
431 - });  
432 - $.each(serverTableData, function (i, v) {  
433 - flag.bindList.push({  
434 - id: '',  
435 - flagId: '',  
436 - bindId: v.serverId,  
437 - bindType: '3'  
438 - });  
439 - });  
440 - Object.assign(flag, form.val('form-flag-edit'));  
441 - admin.req({  
442 - url: common.domainName + '/api-web/manage/Kpiflag/saveFlag?access_token=' + accessToken,  
443 - type: 'POST',  
444 - contentType: 'application/json',  
445 - data: JSON.stringify(flag),  
446 - error: function () {  
447 - layer.close(loading);  
448 - }  
449 - }).done(function (response) {  
450 - layer.close(loading);  
451 - if (response.success) {  
452 - layer.msg('保存成功', {icon: 1, timeout: 3000});  
453 - layer.closeAll('page');  
454 - table.reload('kpiflag_table', {  
455 - page: {  
456 - curr: 1  
457 - }  
458 - , where: {  
459 - access_token: accessToken,  
460 - keyWord: $("#kpiflag_keyword").val(),  
461 - }  
462 - });  
463 - } else {  
464 - layer.msg('保存失败', {icon: 2, timeout: 3000}); 485 + // 选择指标
  486 + $('#btn-kpiflag-kpi-bind').click(function () {
  487 + $('[lay-id="/baseconfig/kpi/index"]').find('.layui-tab-close').trigger('click');
  488 + layer.open({
  489 + title: '选择指标',
  490 + id: 'kpiIndexChooseHtml',
  491 + type: 1,
  492 + area: ['90%', '800px'],
  493 + btn: ['确定', '取消'],
  494 + scrollbar: true,
  495 + success: function () {
  496 + view(this.id).render('/baseconfig/kpi/index', {});
  497 + },
  498 + yes: function (index, layero) {
  499 + var kpiIndex = layui.kpiIndex({});
  500 + var data = kpiIndex.getData();
  501 + if (data.length > 0) {
  502 + $.each(data, function (i, e) {
  503 + var flag = true;
  504 + $.each(kpiFlagTableData, function (j, k) {
  505 + if (e.kpiId == k.kpiId) {
  506 + flag = false;
465 } 507 }
  508 + });
  509 + if (flag == true) {
  510 + kpiFlagTableData.push({
  511 + id: '',
  512 + flagId: flagId,
  513 + kpiId: e.kpiId,
  514 + defaultSort: e.defaultSort,
  515 + kpi: {
  516 + kpiId: e.kpiId,
  517 + kpiName: e.kpiName,
  518 + kpiIdent: e.kpiIdent
  519 + },
  520 + isUnique: '0',
  521 + sort: kpiFlagTableData.length+1,
  522 + createUser: form.val('form-flag-edit').createUser,
  523 + createTime: common.getToday('')
  524 + });
  525 + }
466 }); 526 });
  527 + layer.close(index);
  528 + reloadKpiFlagTable();
  529 + } else {
  530 + layer.msg("无选中的数据", {offset: '15px', icon: 7, time: 2000})
467 return false; 531 return false;
468 - });  
469 -  
470 - // 选择指标  
471 - $('#btn-kpiflag-kpi-bind').click(function () {  
472 - $('[lay-id="/baseconfig/kpi/index"]').find('.layui-tab-close').trigger('click');  
473 - layer.open({  
474 - title: '选择指标',  
475 - id: 'kpiIndexChooseHtml',  
476 - type: 1,  
477 - area: ['90%', '800px'],  
478 - btn: ['确定', '取消'],  
479 - scrollbar: true,  
480 - success: function () {  
481 - view(this.id).render('/baseconfig/kpi/index', {});  
482 - },  
483 - yes: function (index, layero) {  
484 - var kpiIndex = layui.kpiIndex({});  
485 - var data = kpiIndex.getData();  
486 - if (data.length > 0) {  
487 - $.each(data, function (i, e) {  
488 - var flag = true;  
489 - $.each(kpiFlagTableData, function (j, k) {  
490 - if (e.kpiId == k.kpiId) {  
491 - flag = false;  
492 - }  
493 - });  
494 - if (flag == true) {  
495 - kpiFlagTableData.push({  
496 - id: '',  
497 - flagId: flagId,  
498 - kpiId: e.kpiId,  
499 - kpi: {  
500 - kpiId: e.kpiId,  
501 - kpiName: e.kpiName,  
502 - kpiIdent: e.kpiIdent  
503 - },  
504 - isUnique: '0',  
505 - sort: ''  
506 - });  
507 - }  
508 - });  
509 - layer.close(index);  
510 - reloadKpiFlagTable();  
511 - } else {  
512 - layer.msg("无选中的数据", {offset: '15px', icon: 7, time: 2000})  
513 - return false;  
514 - }  
515 - }  
516 - });  
517 - form.render();  
518 - }); 532 + }
  533 + }
  534 + });
  535 + form.render();
519 }); 536 });
520 -}); 537 + });
  538 +});
1 -layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDetail"], function (exports) { 1 +layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDetail", 'xmSelect'], function (exports) {
2 var $ = layui.$; 2 var $ = layui.$;
3 var form = layui.form; 3 var form = layui.form;
4 var layer = layui.layer; 4 var layer = layui.layer;
5 var admin = layui.admin; 5 var admin = layui.admin;
6 var table = layui.table; 6 var table = layui.table;
  7 + var xmSelect = layui.xmSelect;
7 var common = layui.common; 8 var common = layui.common;
8 var domainName = common.domainName; 9 var domainName = common.domainName;
9 10
@@ -13,12 +14,38 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe @@ -13,12 +14,38 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe
13 var accessToken = sessions.getToken()['access_token']; 14 var accessToken = sessions.getToken()['access_token'];
14 var checkList = common.checkPermission(accessToken); 15 var checkList = common.checkPermission(accessToken);
15 16
  17 + form.render();
  18 +
16 //回车事件 19 //回车事件
17 $('#kpiflag_keyword').keydown(function (e) { 20 $('#kpiflag_keyword').keydown(function (e) {
18 if (e.keyCode === 13) { 21 if (e.keyCode === 13) {
19 reloadTable(); 22 reloadTable();
20 } 23 }
21 }); 24 });
  25 + //回车事件
  26 + $('#kpiflag_describe').keydown(function (e) {
  27 + if (e.keyCode === 13) {
  28 + reloadTable();
  29 + }
  30 + });
  31 + //回车事件
  32 + $('#kpiflag_kpis').keydown(function (e) {
  33 + if (e.keyCode === 13) {
  34 + reloadTable();
  35 + }
  36 + });
  37 + //回车事件
  38 + $('#kpiflag_restypes').keydown(function (e) {
  39 + if (e.keyCode === 13) {
  40 + reloadTable();
  41 + }
  42 + });
  43 + $("#kpiflagQueryBtn").unbind().on("click", function () {
  44 + reloadTable();
  45 + })
  46 + form.on('select(change)', function (data) {
  47 + reloadTable();
  48 + })
22 $("#addkpiflag").unbind().on("click", function () { 49 $("#addkpiflag").unbind().on("click", function () {
23 if ($.inArray('back:kpiflag:save', checkList) == -1) { 50 if ($.inArray('back:kpiflag:save', checkList) == -1) {
24 layer.msg('暂无权限!', {icon: 7, time: 3000}); 51 layer.msg('暂无权限!', {icon: 7, time: 3000});
@@ -44,29 +71,54 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe @@ -44,29 +71,54 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe
44 , where: { 71 , where: {
45 access_token: accessToken, 72 access_token: accessToken,
46 keyWord: $("#kpiflag_keyword").val(), 73 keyWord: $("#kpiflag_keyword").val(),
  74 + describe: $("#kpiflag_describe").val(),
  75 + kpis: $("#kpiflag_kpis").val(),
  76 + restypes: $("#kpiflag_restypes").val(),
  77 + dimension: $('select[name="dimension"]').val()
47 } 78 }
48 - , height: 'full-340' 79 + , height: 'full-200'
49 , cellMinWidth: 80 80 , cellMinWidth: 80
50 , page: { 81 , page: {
51 layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'] 82 layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
52 , theme: '#1E9FFF' 83 , theme: '#1E9FFF'
53 } 84 }
54 - , limit: 10  
55 , even: true 85 , even: true
56 , cols: [[ 86 , cols: [[
57 {type: 'checkbox'} 87 {type: 'checkbox'}
  88 + , {field: 'index', title: '序号', align: 'center', type: 'numbers'}
58 , { 89 , {
59 - field: 'name', title: '名称', align: 'center', sort: true,  
60 - templet: '<div><span kpiflag-data-edit="{{d.id}}" data-flag="{{d.flag}}" class="layui-table-link">{{d.name}}</span></div>' 90 + field: 'name', title: '名称', align: 'center', sort: true,width: 200,
  91 + templet: '<div>' +
  92 + '<span kpiflag-data-edit="{{d.id}}" data-flag="{{d.flag}}" class="layui-table-link">{{d.name}}</span>' +
  93 + '</div>'
  94 + }
  95 + , {field: 'flag', title: '标识', align: 'center', sort: true,width: 200}
  96 + , {field: 'describes', title: '指标组描述', align: 'left',width: 300}
  97 + , { field: 'dimension', title: '维度', align: 'center', width: 80, templet: `
  98 + <div>
  99 + {{#
  100 + if (d.dimension == '1D') {
  101 + }} <span>一维</span> {{#
  102 + }else{
  103 + }} <span>二维</span> {{#
  104 + }
  105 + }}
  106 + </div>
  107 + `
61 } 108 }
62 - , {field: 'flag', title: '标识', align: 'center', sort: true}  
63 - , {field: 'remark', title: '备注', align: 'center'} 109 + , {field: 'kpis', title: '绑定指标', align: 'left',width: 500}
  110 + , {field: 'restypes', title: '绑定资源类型', align: 'left',width: 300}
  111 + , {field: 'createUser', title: '创建人',width: 100, align: 'center'}
  112 + , {field: 'createTime', title: '创建时间', align: 'center',width: 180}
  113 + , {field: 'remark', title: '备注', align: 'left',width: 500}
64 , { 114 , {
65 title: '操作', 115 title: '操作',
66 align: 'center', 116 align: 'center',
67 fixed: 'right', 117 fixed: 'right',
68 - width: 120,  
69 - templet: '<div><span kpiflag-data-delete="{{d.id}}" data-flag="{{d.flag}}" class="layui-table-link">删除</span>' 118 + width: 100,
  119 + templet: '<div>' +
  120 + '<button kpiflag-data-delete="{{d.id}}" data-flag="{{d.flag}}" class="layui-btn layui-btn-xs layui-btn-normal link-restypepage-delete" lay-tips="删除"><i class="layui-icon layui-icon-delete"></i></button>' +
  121 + '</div>'
70 } 122 }
71 ]], 123 ]],
72 done: function (res, curr, count) { 124 done: function (res, curr, count) {
@@ -112,7 +164,7 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe @@ -112,7 +164,7 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe
112 return; 164 return;
113 } 165 }
114 //确认提示框 166 //确认提示框
115 - layer.confirm('确认删除当前采集协议及协议参数吗?', { 167 + layer.confirm('确认删除数据吗?', {
116 btn: ['确定', '取消'] //按钮 168 btn: ['确定', '取消'] //按钮
117 }, function () { 169 }, function () {
118 admin.req({ 170 admin.req({
@@ -142,9 +194,20 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe @@ -142,9 +194,20 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', "commonDe
142 , where: { 194 , where: {
143 access_token: accessToken, 195 access_token: accessToken,
144 keyWord: $("#kpiflag_keyword").val(), 196 keyWord: $("#kpiflag_keyword").val(),
  197 + describe: $("#kpiflag_describe").val(),
  198 + kpis: $("#kpiflag_kpis").val(),
  199 + restypes: $("#kpiflag_restypes").val(),
  200 + dimension: $('select[name="dimension"]').val()
145 } 201 }
146 }); 202 });
147 } 203 }
  204 +
  205 + //获取选中的数据
  206 + function getCheckData() {
  207 + return table.checkStatus('kpiflag_table').data;
  208 + }
  209 +
  210 + return {getData: getCheckData};
148 }); 211 });
149 212
150 }); 213 });
@@ -91,24 +91,27 @@ layui.define(['laypage', 'commonDetail', 'common', 'element', 'admin'], function @@ -91,24 +91,27 @@ layui.define(['laypage', 'commonDetail', 'common', 'element', 'admin'], function
91 } 91 }
92 }) 92 })
93 for (let nodeInfo of nodeInfoList) { 93 for (let nodeInfo of nodeInfoList) {
  94 + // lsq 详情页节电池样式修改 2022-08-08
94 htmlStr += `<div class="detail-loadbalancing-vs" data-flag="${nodeInfo.flag}"> 95 htmlStr += `<div class="detail-loadbalancing-vs" data-flag="${nodeInfo.flag}">
95 <div class="vs-title"> 96 <div class="vs-title">
96 <p>${nodeInfo.nodeName}</p> 97 <p>${nodeInfo.nodeName}</p>
97 </div> 98 </div>
98 - <div class="vs-icon-div ${nodeInfo.healthStatus == 'normal' ? 'vs-icon-up' : 'vs-icon-down'}">  
99 - <div class="vs-icon"></div> 99 + <div class="vs-flex">
  100 + <div class="vs-icon-div ${nodeInfo.healthStatus == 'normal' ? 'vs-icon-up' : 'vs-icon-down'}">
  101 + <div class="vs-icon"></div>
  102 + </div>
  103 + <ul class="vs-info">
  104 + <li>
  105 + ${nodeInfo.configStatus == 'enable' ? '<i class="iconfont icon-size good">\ue659</i> 已启用' : '<i class="iconfont icon-size serious">\ue668</i> 未启用'}
  106 + </li>
  107 + <li>
  108 + 当前连接数: ${nodeInfo.currentConnections}
  109 + </li>
  110 + <li>
  111 + 新增连接数: ${nodeInfo.newConnections}
  112 + </li>
  113 + </ul>
100 </div> 114 </div>
101 - <ul class="vs-info">  
102 - <li>  
103 - ${nodeInfo.configStatus == 'enable' ? '<i class="iconfont icon-size good">\ue659</i> 已启用' : '<i class="iconfont icon-size serious">\ue668</i> 未启用'}  
104 - </li>  
105 - <li>  
106 - 当前连接数: ${nodeInfo.currentConnections}  
107 - </li>  
108 - <li>  
109 - 新增连接数: ${nodeInfo.newConnections}  
110 - </li>  
111 - </ul>  
112 </div>` 115 </div>`
113 } 116 }
114 $vsDiv.html(htmlStr) 117 $vsDiv.html(htmlStr)
@@ -168,27 +171,30 @@ layui.define(['laypage', 'commonDetail', 'common', 'element', 'admin'], function @@ -168,27 +171,30 @@ layui.define(['laypage', 'commonDetail', 'common', 'element', 'admin'], function
168 } 171 }
169 }) 172 })
170 for (let nodeInfo of nodeInfoList) { 173 for (let nodeInfo of nodeInfoList) {
  174 + // lsq 详情页节电池样式修改 2022-08-08
171 htmlStr += `<div class="detail-loadbalancing-vs" data-flag="${nodeInfo.flag}"> 175 htmlStr += `<div class="detail-loadbalancing-vs" data-flag="${nodeInfo.flag}">
172 <div class="vs-title"> 176 <div class="vs-title">
173 <p>${nodeInfo.nodeName}</p> 177 <p>${nodeInfo.nodeName}</p>
174 </div> 178 </div>
175 - <div class="node-icon-div ${nodeInfo.healthStatus == 'normal' ? 'vs-icon-up' : 'vs-icon-down'}">  
176 - <div class="node-icon"></div> 179 + <div class="vs-flex">
  180 + <div class="node-icon-div ${nodeInfo.healthStatus == 'normal' ? 'vs-icon-up' : 'vs-icon-down'}">
  181 + <div class="node-icon"></div>
  182 + </div>
  183 + <ul class="vs-info">
  184 + <li>
  185 + ${nodeInfo.configStatus == 'enable' ? '<i class="iconfont icon-size good">\ue659</i> 已启用' : '<i class="iconfont icon-size serious">\ue668</i> 未启用'}
  186 + </li>
  187 + <li>
  188 + 当前连接数: ${nodeInfo.currentConnections}
  189 + </li>
  190 + <li>
  191 + 新增连接数: ${nodeInfo.newConnections}
  192 + </li>
  193 + <li>
  194 + ${nodeInfo.ipAddr}:${nodeInfo.port}
  195 + </li>
  196 + </ul>
177 </div> 197 </div>
178 - <ul class="vs-info">  
179 - <li>  
180 - ${nodeInfo.configStatus == 'enable' ? '<i class="iconfont icon-size good">\ue659</i> 已启用' : '<i class="iconfont icon-size serious">\ue668</i> 未启用'}  
181 - </li>  
182 - <li>  
183 - 当前连接数: ${nodeInfo.currentConnections}  
184 - </li>  
185 - <li>  
186 - 新增连接数: ${nodeInfo.newConnections}  
187 - </li>  
188 - <li>  
189 - ${nodeInfo.ipAddr}:${nodeInfo.port}  
190 - </li>  
191 - </ul>  
192 </div>` 198 </div>`
193 } 199 }
194 $vsDiv.html(htmlStr) 200 $vsDiv.html(htmlStr)
@@ -537,16 +537,7 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect @@ -537,16 +537,7 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect
537 resType: resType, 537 resType: resType,
538 isSend: $('#notice_search_isSend').val() 538 isSend: $('#notice_search_isSend').val()
539 }; 539 };
540 - var typeName = new Map();  
541 - typeName.set("10", "告警通知");  
542 - typeName.set("11", "告警消除");  
543 - //2021-10-15 添加合并通知 XuHaoJie  
544 - typeName.set("13", "合并通知");  
545 - typeName.set("20", "巡检报表通知");  
546 - typeName.set("30", "系统通知");  
547 - typeName.set("40", "工单通知");  
548 - typeName.set("99", "测试通知");  
549 - typeName.set("0", "测试通知"); 540 + //lsq 分类分组统计的x轴标签显示undefined修改 2022-08-08
550 $.ajax({ 541 $.ajax({
551 url: `${common.domainName}/api-web/notice/groupByType`, 542 url: `${common.domainName}/api-web/notice/groupByType`,
552 method: 'GET', 543 method: 'GET',
@@ -556,7 +547,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect @@ -556,7 +547,8 @@ layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect
556 var yData = []; 547 var yData = [];
557 if (res && res.map) { 548 if (res && res.map) {
558 $.each(res.map.typeList, function (i, v) { 549 $.each(res.map.typeList, function (i, v) {
559 - xData.push(typeName.get(v)) 550 + //lsq 分类分组统计的x轴标签显示undefined修改 2022-08-08
  551 + xData.push(v)
560 }) 552 })
561 yData = res.map.countList; 553 yData = res.map.countList;
562 } 554 }
@@ -325,7 +325,20 @@ layui.define(['admin', 'form', 'table', 'element', 'sessions', 'common', 'echart @@ -325,7 +325,20 @@ layui.define(['admin', 'form', 'table', 'element', 'sessions', 'common', 'echart
325 color: '#333', 325 color: '#333',
326 show: true, 326 show: true,
327 interval: 0, 327 interval: 0,
328 - rotate: 15 328 + rotate: 15,
  329 + formatter: val => {
  330 + // 一行字数
  331 + const max = 6
  332 + // 标签长度
  333 + const valLength = val.length
  334 + // 换行数
  335 + const rowNum = valLength / 6
  336 + if (valLength > 6) {
  337 + return val.slice(0,5) + '...';
  338 + } else {
  339 + return val
  340 + }
  341 + }
329 }, 342 },
330 axisLine: { 343 axisLine: {
331 lineStyle: { 344 lineStyle: {
  1 +/** 指标组新增 */
  2 +layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'laydate', 'element', 'admin', 'kpiIndex', 'resourcetype','kpiflagIndex'], function (exports) {
  3 + var $ = layui.$;
  4 + var form = layui.form;
  5 + var table = layui.table;
  6 + var common = layui.common;
  7 + var admin = layui.admin;
  8 + var view = layui.view;
  9 + var element = layui.element;
  10 +
  11 + // 对外暴露的接口
  12 + exports('restypepageEdit', function (data) {
  13 + var id = data.id ? data.id : '';
  14 + var sessions = layui.sessions;
  15 + var accessToken = sessions.getToken().access_token;
  16 + var domainName = common.domainName;
  17 + // 表格数据
  18 + var restypepageFlagTableData = [];
  19 + // 指标自定义类型数据组装option
  20 + var restypekpitype;
  21 + //指标表格
  22 + var restypepageFlagTable;
  23 + // 加载遮罩
  24 + var loading;
  25 + // 如果是编辑,回显数据
  26 + var restypePageData = {
  27 + id: '',
  28 + resType: '',
  29 + os: '',
  30 + provider: '',
  31 + model: '',
  32 + protocol: ''
  33 + };
  34 +
  35 + //初始化下拉框数据
  36 + initSelect();
  37 + //进入页面后第一次加载指标表格数据
  38 + loadRestypepageKpiFlagTable();
  39 + //获取指标自定义类型字典数据
  40 + getRestypePageKpiTypes();
  41 +
  42 + /**
  43 + * 初始化下拉框数据
  44 + *
  45 + * */
  46 + function initSelect() {
  47 + common.resTypeSelect("restypepagekpi_select_resType", function () {
  48 + form.render("select");
  49 + });
  50 + common.renderCollProtocolSelect('restypepagekpiCollProtocol', function () {
  51 + form.render("select");
  52 + });
  53 + common.renderCollProtocolSelect('restypepagekpiCollProtocol');
  54 + //绑定厂商下拉选择
  55 + common.providerSelect("restypepagekpiProvider", function () {
  56 + form.render("select");
  57 + });
  58 + common.renderDdicSelect('restypepagekpiOs', 'os', function () {
  59 + form.render("select");
  60 + }, "=操作系统=");
  61 + // 根据id查询资源类型页面配置信息,在下拉框加载完成后,防止因未加载完成,造成回填异常
  62 + getrestypePageInfo(id);
  63 + }
  64 +
  65 +
  66 + /**
  67 + * 获取指标自定义类型字典数据
  68 + *
  69 + * */
  70 + function getRestypePageKpiTypes() {
  71 + var options = '';
  72 + admin.req({
  73 + url: common.domainName + '/api-web/manage/ddic/findSucDdics/restypepage_kpi_type',
  74 + type: 'POST',
  75 + async: false,
  76 + }).done(function (res) {
  77 + var list = res.data;
  78 + options += '<option value="">=请选择=</option>';
  79 + $.each(list, function (i, v) {
  80 + options += '<option value="' + v.ddicCode + '">' + v.ddicName + '</option>';
  81 + });
  82 + restypekpitype = options;
  83 + }).error(function (error) {
  84 + console.error(error);
  85 + });
  86 + }
  87 +
  88 + /**
  89 + * 根据id查询资源类型页面配置信息
  90 + *
  91 + * */
  92 + function getrestypePageInfo(id) {
  93 + if (id){
  94 + $.ajax({
  95 + url: common.domainName + '/api-web/manage/restypePage/getById?access_token=' + accessToken + '&id=' + id,
  96 + type: 'get',
  97 + success: function (res) {
  98 + restypePageData = res.object;
  99 + form.val('form-restypepage-edit', res.object);
  100 + restypepageFlagTableData = res.object.restypePageFlags;
  101 + reloadRestypepageKpiFlagTable();
  102 + }
  103 + });
  104 + }
  105 + }
  106 +
  107 + element.render('collapse');
  108 + form.render();
  109 +
  110 + /**
  111 + * 加载指标表格数据
  112 + *
  113 + * */
  114 + function loadRestypepageKpiFlagTable(){
  115 + restypepageFlagTable = table.render({
  116 + elem: '#restypepage-edit-table'
  117 + , cellMinWidth: 80
  118 + , limit: 10
  119 + , even: true
  120 + , data: restypepageFlagTableData
  121 + , cols: [[
  122 + {field: 'index', title: '序号', align: 'center', type: 'numbers'},
  123 + {field: 'flagName', title: '指标组名称', align: 'center'},
  124 + {field: 'flagDesc', title: '指标组描述', align: 'center'},
  125 + {
  126 + title: '类型', align: 'center',
  127 + templet: function (d) {
  128 + var selectDom = $('<select class="typeSel" lay-search="" class="layui-select" data-index="' + (d.LAY_INDEX-1) + '" lay-filter="select-restypepagekpi-table-type">' +
  129 + restypekpitype +
  130 + '</select>');
  131 + var index = (d.LAY_INDEX-1);
  132 + var type = restypepageFlagTableData[index].type;
  133 + selectDom.find('option[value="'+type+'"]').attr('selected', 'selected');
  134 + return selectDom.prop('outerHTML');
  135 + }
  136 + },
  137 + {field: 'createUser', title: '创建人', align: 'center'},
  138 + {field: 'createTime', title: '创建时间', align: 'center'},
  139 + {
  140 + field: 'sort', title: '排序', align: 'center',
  141 + templet: function (d) {
  142 + var inputDom = $('<input id="txt-restypepagekpi-table-sort-' + (d.LAY_INDEX-1) + '" data-index="' + (d.LAY_INDEX-1) + '" type="number" autocomplete="off" class="layui-input txt-restypepagekpi-table-sort">');
  143 + if (d.sort != null) {
  144 + inputDom.attr("value", restypepageFlagTableData[(d.LAY_INDEX-1)].sort);
  145 + }
  146 + return inputDom.prop('outerHTML');
  147 + }
  148 + }, {
  149 + title: '操作',
  150 + width: 100,
  151 + align: 'center',
  152 + templet: '<div><span data-index="{{(d.LAY_INDEX-1)}}" class="link link-restypepagekpi-delete">' +
  153 + '<a class="layui-btn layui-btn-xs layui-btn-normal" title="删除"><i class="layui-icon"></i></a></span>'
  154 + }]],
  155 + done: function (res, curr, count) {
  156 + form.render();
  157 + $(".restypepage-edit-table .layui-table-body,.restypepage-edit-table .layui-table-box,.restypepage-edit-table .layui-table-cell").css('overflow', 'visible');
  158 + // 排序下拉框改变事件
  159 + form.on('select(select-restypepagekpi-table-type)', function (data) {
  160 + var index = $(data.elem).data('index');
  161 + restypepageFlagTableData[index].type = data.value;
  162 + });
  163 + // 排序输入框输入事件
  164 + $('.txt-restypepagekpi-table-sort').change(function () {
  165 + restypepageFlagTableData[$(this).data('index')].sort = $(this).val();
  166 + });
  167 + // 删除事件
  168 + $('.link-restypepagekpi-delete').click(function () {
  169 + restypepageFlagTableData.splice($(this).data('index'), 1);
  170 + reloadRestypepageKpiFlagTable();
  171 + });
  172 + }
  173 + });
  174 + }
  175 +
  176 + // 刷新指标表格
  177 + function reloadRestypepageKpiFlagTable() {
  178 + restypepageFlagTable.reload({
  179 + page: {curr: 1},
  180 + data: restypepageFlagTableData
  181 + });
  182 + }
  183 +
  184 + // 表单提交事件
  185 + form.on('submit(form-restypepage-edit)', function (data) {
  186 + loading = layer.load(2);
  187 + var restypePage = {
  188 + id: id,
  189 + resType: '',
  190 + os: '',
  191 + provider: '',
  192 + model: '',
  193 + protocol: '',
  194 + remark: '',
  195 + restypePageFlags: restypepageFlagTableData
  196 + };
  197 + Object.assign(restypePage, form.val('form-restypepage-edit'));
  198 + admin.req({
  199 + url: common.domainName + '/api-web/manage/restypePage/saveRestypePage?access_token=' + accessToken,
  200 + type: 'POST',
  201 + contentType: 'application/json',
  202 + data: JSON.stringify(restypePage),
  203 + error: function () {
  204 + layer.close(loading);
  205 + }
  206 + }).done(function (response) {
  207 + layer.close(loading);
  208 + if (response.success) {
  209 + layer.msg('保存成功', {icon: 1, timeout: 3000});
  210 + layer.closeAll('page');
  211 + table.reload('table-restypepage-list', {
  212 + page: {
  213 + curr: 1
  214 + }
  215 + , where: {
  216 + access_token: accessToken,
  217 + keyword: $("#restypepageQueryForm").find("input[name='keyword']").val(),
  218 + resType: $("#restypepageQueryForm").find("select[name='restypepageresType']").val(),
  219 + os: $("#restypepageQueryForm").find("select[name='restypepageos']").val(),
  220 + protocol: $("#restypepageQueryForm").find("select[name='restypepagecollProtocol']").val(),
  221 + provider: $("#restypepageQueryForm").find("select[name='restypepageprovider']").val(),
  222 + }
  223 + });
  224 + } else {
  225 + layer.msg('保存失败', {icon: 2, timeout: 3000});
  226 + }
  227 + });
  228 + return false;
  229 + });
  230 +
  231 + // 选择指标
  232 + $('#btn-restypepage-kpi-bind').click(function () {
  233 + $('[lay-id="/baseconfig/kpiflag/index"]').find('.layui-tab-close').trigger('click');
  234 + layer.open({
  235 + title: '选择指标',
  236 + id: 'restypepageFlagIndexChooseHtml',
  237 + type: 1,
  238 + area: ['90%', '800px'],
  239 + btn: ['确定', '取消'],
  240 + scrollbar: true,
  241 + success: function () {
  242 + view(this.id).render('/baseconfig/kpiflag/index', {});
  243 + },
  244 + yes: function (index, layero) {
  245 + var kpiflagIndex = layui.kpiflagIndex({});
  246 + var data = kpiflagIndex.getData();
  247 + if (data.length > 0) {
  248 + $.each(data, function (i, e) {
  249 + console.log(JSON.stringify(e));
  250 + var flag = true;
  251 + $.each(restypepageFlagTableData, function (j, k) {
  252 + if (e.id == k.flagId) {
  253 + flag = false;
  254 + }
  255 + });
  256 + if (flag == true) {
  257 + restypepageFlagTableData.push({
  258 + flagName: e.name,
  259 + flagDesc: e.describes,
  260 + id: '',
  261 + pageId: id,
  262 + resType: restypePageData.resType,
  263 + flagDimension: e.dimension,
  264 + flagId: e.id,
  265 + type: 'base',
  266 + sort: restypepageFlagTableData.length+1,
  267 + createUser: form.val('form-restypepage-edit').createUser,
  268 + createTime: common.getToday('')
  269 + });
  270 + }
  271 + });
  272 + layer.close(index);
  273 + reloadRestypepageKpiFlagTable();
  274 + } else {
  275 + layer.msg("无选中的数据", {offset: '15px', icon: 7, time: 2000})
  276 + return false;
  277 + }
  278 + }
  279 + });
  280 + form.render();
  281 + });
  282 + });
  283 +});
  1 +layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'treeTable', 'xmSelect'], function (exports) {
  2 + var $ = layui.$;
  3 + var form = layui.form;
  4 + var layer = layui.layer;
  5 + var admin = layui.admin;
  6 + var table = layui.table;
  7 + var common = layui.common;
  8 + var treeTable = layui.treeTable;
  9 + var xmSelect = layui.xmSelect;
  10 +
  11 + exports('restypepageIndex', function () {
  12 + var sessions = layui.sessions;
  13 + var accessToken = sessions.getToken()['access_token'];
  14 + var domainName = common.domainName;
  15 + var restypepageTable;
  16 + //加载权限列表
  17 + var checkList = common.checkPermission(accessToken);
  18 +
  19 + //初始化下拉框
  20 + initSelect();
  21 + //初始化事件
  22 + initEvent()
  23 + //初次加载表格
  24 + loadTable();
  25 +
  26 +
  27 + /**
  28 + * 初初始化事件
  29 + *
  30 + * */
  31 + function initEvent() {
  32 + // 回车搜索
  33 + $('form[lay-filter="form-restypepage-condition"] input').keydown(function (e) {
  34 + if (e.keyCode === 13) {
  35 + reloadTable();
  36 + }
  37 + });
  38 + //查询按钮点击事件
  39 + $("#restypepageQueryBtn").unbind().on("click", function () {
  40 + reloadTable();
  41 + })
  42 + //搜索下拉框change事件监听
  43 + form.on('select(change)', function (data) {
  44 + reloadTable();
  45 + })
  46 + // 添加资源类型页面配置信息
  47 + $('#btn-restypepage-add').click(function () {
  48 + if ($.inArray('back:restypepage:add', checkList) == -1) {
  49 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  50 + return;
  51 + }
  52 + openEditHtml();
  53 + });
  54 + // 删除事件
  55 + $('#btn-restypepage-delete').click(function () {
  56 + var checks = table.checkStatus('table-restypepage-list').data;
  57 + var ids = $.map(checks, function (item) {
  58 + return item.id;
  59 + });
  60 + deleteByIds(ids);
  61 + });
  62 + }
  63 +
  64 +
  65 + /**
  66 + * 初始化下拉框数据
  67 + *
  68 + * */
  69 + function initSelect() {
  70 + common.renderCollProtocolSelect('restypepageCollProtocol', function () {
  71 + form.render("select");
  72 + });
  73 + // common.renderCollProtocolSelect('restypepageCollProtocol');
  74 + //绑定厂商下拉选择
  75 + common.providerSelect("restypepageProvider", function () {
  76 + form.render("select");
  77 + });
  78 +
  79 + common.renderDdicSelect('restypepageOs', 'os', function () {
  80 + form.render("select");
  81 + }, "=操作系统=");
  82 + //资源类型下拉框
  83 + common.resTypeSelect("restypepage_select_resType",function () {
  84 + form.render("select");
  85 + });
  86 + }
  87 + /**
  88 + * 将查询条件作为方法
  89 + *
  90 + * */
  91 + function whereSearch() {
  92 + form.render();
  93 + var $from = $("#restypepageQueryForm")
  94 + var search = {
  95 + access_token: accessToken,
  96 + keyword: $from.find("input[name='keywords']").val(),
  97 + resType: $from.find("select[name='restypepageresType']").val(),
  98 + os: $from.find("select[name='restypepageos']").val(),
  99 + protocol: $from.find("select[name='restypepagecollProtocol']").val(),
  100 + provider: $from.find("select[name='restypepageprovider']").val(),
  101 + }
  102 + return search;
  103 + }
  104 +
  105 + // 加载表格
  106 + function loadTable() {
  107 + restypepageTable = table.render({
  108 + elem: '#table-restypepage-list',
  109 + url: domainName + '/api-web/manage/restypePage/page',
  110 + where: whereSearch(),
  111 + height: 'full-200',
  112 + limit: common.limit,
  113 + limits: common.limits,
  114 + page: {
  115 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],
  116 + theme: '#1E9FFF'
  117 + },
  118 + cols: [[
  119 + { type: 'checkbox' }
  120 + , {field: 'index', title: '序号', align: 'center', type: 'numbers',width: 50}
  121 + , {
  122 + field: 'name', title: '页面名称', align: 'center', sort: true,width: 400,
  123 + templet: '<div>' +
  124 + '<span restypepage-data-edit="{{d.id}}" data-flag="{{d.flag}}" class="layui-table-link">{{d.name}}</span>' +
  125 + '</div>'
  126 + }
  127 + , { field: 'resTypeName', title: '资源类型', align: 'center',width: 250}
  128 + , { field: 'osName', title: '操作系统', align: 'center',width: 100}
  129 + , { field: 'provderName', title: '厂商', align: 'center',width: 100}
  130 + , { field: 'protocolName', title: '采集协议', align: 'center',width: 200}
  131 + , { field: 'model', title: '型号', align: 'center',width: 200}
  132 + , { field: 'keyword', title: '辅助关键字', align: 'center',width: 200}
  133 + , { field: 'flags', title: '配置指标组', align: 'left',width: 300}
  134 + , { field: 'kpis', title: '配置指标', align: 'left',width: 300}
  135 + , { field: 'remark', title: '备注', align: 'left',width: 300}
  136 + , {
  137 + title: '操作', align: 'center',fixed: 'right', width: 100,
  138 + templet:
  139 + '<div>' +
  140 + '<button data-id="{{d.id}}" class="layui-btn layui-btn-xs layui-btn-normal link-restypepage-edit" lay-tips="编辑"><i class="layui-icon layui-icon-edit"></i></button>'+
  141 + '<button data-id="{{d.id}}" class="layui-btn layui-btn-xs layui-btn-normal link-restypepage-delete" lay-tips="删除"><i class="layui-icon layui-icon-delete"></i></button>' +
  142 + '</div>'
  143 + }]],
  144 + done: function (res) {
  145 + //点击协议名称 进行编辑
  146 + $('[restypepage-data-edit]').on('click', function () {
  147 + if ($.inArray('back:restypepage:add', checkList) == -1) {
  148 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  149 + return;
  150 + }
  151 + openEditHtml($(this).attr("restypepage-data-edit"));
  152 + });
  153 + // 点击编辑事件
  154 + $('.link-restypepage-edit').click(function () {
  155 + if ($.inArray('back:restypepage:add', checkList) == -1) {
  156 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  157 + return;
  158 + }
  159 + openEditHtml($(this).data('id'));
  160 + });
  161 + // 点击删除事件
  162 + $('.link-restypepage-delete').click(function () {
  163 + deleteByIds([$(this).data('id')]);
  164 + });
  165 + }
  166 + });
  167 + }
  168 +
  169 + //刷新表格
  170 + function reloadTable() {
  171 + restypepageTable.reload({
  172 + page: {
  173 + curr: 1
  174 + }
  175 + , where: whereSearch()
  176 + });
  177 + }
  178 +
  179 + // 新增或编辑资源类型页面配置信息
  180 + function openEditHtml(id) {
  181 + common.openWin('/baseconfig/restypepage/add', `<a class="layui-icon layui-icon-edit win_title_icon"></a>` + id ? '编辑' : '新增',
  182 + {id: id}, ['保存', '取消'], function () {
  183 + $('#btn-restypepage-submit').click();
  184 + }, null, ['80%', '90%'], null, {resize: false});
  185 + form.render();
  186 + }
  187 +
  188 + // 根据id删除字典信息
  189 + function deleteByIds(ids) {
  190 + if ($.inArray('back:restypepage:delete', checkList) == -1) {
  191 + layer.msg('暂无权限!', {icon: 7, time: 3000});
  192 + return;
  193 + }
  194 + if (ids.length == 0) {
  195 + layer.msg('请至少选择一条数据', {icon: 0, time: 3000});
  196 + return;
  197 + }
  198 + layer.confirm('确认要删除数据吗?', {icon: 3}, function () {
  199 + layer.load(2);
  200 + admin.req({
  201 + url: domainName + '/api-web/manage/restypePage/deleteByIds',
  202 + data: {
  203 + ids: ids
  204 + }
  205 + }).done(function (response) {
  206 + layer.closeAll('loading');
  207 + if (response.success) {
  208 + layer.msg('删除成功!', {icon: 1, time: 3000});
  209 + reloadTable();
  210 + } else {
  211 + layer.msg('删除失败!', {icon: 2, time: 3000});
  212 + }
  213 + }).error(function () {
  214 + layer.closeAll('loading');
  215 + });
  216 + });
  217 + }
  218 + });
  219 +});
  1 +layui.define(['commonDetail', 'common', 'sessions'], function (exports) {
  2 + var commonDetail = layui.commonDetail;
  3 + var $ = layui.$
  4 + , laytpl = layui.laytpl
  5 + //对外暴露的接口
  6 + exports('snapshot_detail', function (data) {
  7 + var common = layui.common;
  8 + var sessions = layui.sessions;
  9 + var table = layui.table;
  10 + var view = layui.view;
  11 + var laytpl = layui.laytpl;
  12 + var resId = '';
  13 + var batchNo = '';
  14 + var showFlag = common.getUrlParam("show");
  15 + if (showFlag && showFlag == '0') {
  16 + resId = common.getUrlParam("resId");
  17 + batchNo = common.getUrlParam("batchNo");
  18 + } else {
  19 + resId = data.resId;
  20 + batchNo = data.batchNo;
  21 + }
  22 + findAllSnapshot();
  23 +
  24 + commonDetail.bindTips();
  25 +
  26 + function findAllSnapshot() {
  27 + // 删除所有的子元素
  28 + $('#table_arr_body').empty();
  29 + let url = common.domainName + '/api-web/snapshot/info?resId='+ resId + '&batchNo='+batchNo +'&access_token='+sessions.getToken().access_token;
  30 + $.ajax({
  31 + url: url,
  32 + type: 'get',
  33 + async: false,
  34 + success: function (res) {
  35 + if (res.success){
  36 + if (res.object.snapshotResState){
  37 + commonDetail.snapshotRenderResHealth(res.object.snapshotResState);
  38 + }
  39 + commonDetail.anapshotRenderTextCols('hostminicomputerpartition_jbxx',res.object.snapshotBaseInformationList,2);
  40 + if (res.object.importantInformationList != null && res.object.importantInformationList.length > 0){
  41 + commonDetail.anapshotRenderTextCols('hostminicomputerpartition_sysfile',res.object.importantInformationList,2);
  42 + }else {
  43 + $("#hostminicomputerpartition_sysfile").html('<div style="text-align:center;"><span style="line-height: 150px; padding:20px;font-style:normal;">暂无数据</span></div>')
  44 + }
  45 + commonDetail.snapshotRenderActiveAlarms("告警列表","snapshow_active_alram", res.object.snapshotAlamList);
  46 + console.log(res.object.snapshotRecordList);
  47 + let tableArr = res.object.snapshotRecordList;
  48 + let domTableArr='';
  49 + // 渲染生成节点
  50 + tableArr.forEach((item,index)=>{
  51 + domTableArr+=`
  52 + <div class="lay-row">
  53 + <div class="lay-row-item">
  54 + <h5 class="lay-row-title">${item.name}
  55 + <span class="layui-table-link" id="snapshot_wkinfoDownload_${index}"
  56 + style="margin-left: 10px;">下载</span>
  57 + <span class="layui-table-link" id="snapshot_wkinfoMore_${index}">更多</span>
  58 + </h5>
  59 + <div id="snapshot_wkinfo_${index}"></div>
  60 + </div>
  61 + </div>
  62 + `
  63 + })
  64 + // console.log(domTableArr);
  65 + $('#table_arr_body').append(domTableArr)
  66 +
  67 + // 渲染节点表格数据
  68 + tableArr.forEach((item,index)=>{
  69 + let cols = [];
  70 + let datas = [];
  71 + item.header.map((headerItem,headerIndex)=>{
  72 + if (headerItem.unit){
  73 + cols.push({
  74 + field:headerItem.id,title:headerItem.name+'('+headerItem.unit+')',sort:true,align:"center",
  75 + })
  76 + }else {
  77 + cols.push({
  78 + field:headerItem.id,title:headerItem.name,sort:true,align:"center",
  79 + })
  80 + }
  81 + })
  82 + item.content.map((contItem,contIndex)=>{
  83 + let obj = {};
  84 + contItem.map((v,i)=>{
  85 + obj[v.kpiId] = v.kpiValue
  86 + })
  87 + datas.push(obj)
  88 + })
  89 +
  90 + /*console.log('cols--------------',cols);
  91 + console.log('datas--------------',datas);*/
  92 + // 创建渲染实例
  93 + table.render({
  94 + elem: `#snapshot_wkinfo_${index}`
  95 + ,page: false
  96 + ,data: datas
  97 + ,cols: [cols]
  98 + ,done(response, curr, count){
  99 + delete response.data[0].LAY_TABLE_INDEX //
  100 + let keys = response.data[0]
  101 + let params = {
  102 + kpiId:Object.keys(keys).join(','),
  103 + resId:resId,
  104 + batchNo:batchNo,
  105 + tableName:item.name,
  106 + flagPrefix:item.flagPrefix
  107 + }
  108 + // 点击下载的方法
  109 + $(`#snapshot_wkinfoDownload_${index}`).unbind('click').on('click',()=>{
  110 + let url = `${common.domainName}/api-web/snapshot/info/download?kpiId=${params.kpiId}&resId=${params.resId}&batchNo=${params.batchNo}&tableName=${params.tableName}&flagPrefix=${params.flagPrefix}&access_token=${sessions.getToken().access_token}`
  111 + window.open(url)
  112 + })
  113 + // 点击更多的方法
  114 + $(`#snapshot_wkinfoMore_${index}`).unbind('click').on('click',()=>{
  115 + view('commonViewModel').render("template/detail/snapshot_detail_more").then(function (res) {
  116 + layer.open({
  117 + title: ["更多", 'font-size:18px;'],
  118 + type: 1,
  119 + shadeClose: true,//开启遮罩层
  120 + area: ['90%', '690px'],
  121 + content: laytpl(res.body).render(JSON.stringify(params))
  122 + });
  123 + });
  124 + })
  125 + }
  126 + ,error(){
  127 +
  128 + }
  129 + })
  130 + })
  131 + }else {
  132 + layer.msg(res.msg, {
  133 + icon: 7, time: 2000
  134 + });
  135 + }
  136 + }
  137 + })
  138 + }
  139 +
  140 +
  141 +
  142 + //定时任务
  143 + // var timer = setInterval(function () {
  144 + // findAllSnapshot()
  145 + // }, commonDetail.timerTime);
  146 + // commonDetail.detailTimer.push(timer);
  147 +
  148 + });
  149 +});
  1 +//更多列表
  2 +layui.define(['table', 'admin', 'layer', 'common', 'commonDetail'], function (exports) {
  3 + var $ = layui.$;
  4 + var admin = layui.admin;
  5 + var table = layui.table;
  6 + var common = layui.common;
  7 + var sessions = layui.sessions;
  8 + var commonDetail = layui.commonDetail;
  9 + //对外暴露的接口
  10 + exports('snapshot_detail_more', function (data) {
  11 + // console.log(data);
  12 + var commonDetail = layui.commonDetail;
  13 + var resId = data.resId;
  14 + var kpiId = data.kpiId;
  15 + var batchNo = data.batchNo;
  16 + var flagPrefix = data.flagPrefix;
  17 + var page = '1';
  18 + var limit = "10";
  19 + let cols = [];
  20 +
  21 + let url = `${common.domainName}/api-web/snapshot/info/page?access_token=${sessions.getToken().access_token}`;
  22 + $.ajax({
  23 + url: url,
  24 + data:{
  25 + resId,
  26 + kpiId,
  27 + batchNo,
  28 + flagPrefix,
  29 + page,
  30 + limit,
  31 + },
  32 + type: 'get',
  33 + async: false,
  34 + success:(res)=>{
  35 + console.log(res.object.header);
  36 + cols = res.object.header.map(item=>{
  37 + if (item.unit){
  38 + return {
  39 + field:item.id,title:item.name+'('+item.unit+')',sort:true,align:"center",
  40 + }
  41 + }else {
  42 + return {
  43 + field:item.id,title:item.name,sort:true,align:"center",
  44 + }
  45 + }
  46 + })
  47 + // let tableArr = res.object;
  48 + // let datas = [];
  49 + // let cols = [];
  50 + // tableArr.header.map((headerItem,headerIndex)=>{
  51 + // cols.push({
  52 + // field:headerItem.id,title:headerItem.name,sort:true,align:"center",
  53 + // })
  54 + // })
  55 + // tableArr.content.map((contItem,contIndex)=>{
  56 + // let obj = {};
  57 + // contItem.map((v,i)=>{
  58 + // obj[v.kpiId] = v.kpiValue
  59 + // })
  60 + // datas.push(obj)
  61 + // })
  62 + },
  63 + error:(err)=>{
  64 +
  65 + }
  66 + })
  67 +
  68 +
  69 + table.render({
  70 + elem: '#detail_more_snapshot'
  71 + ,url:url
  72 + , cols: [cols]
  73 + , where:{
  74 + resId,
  75 + kpiId,
  76 + batchNo,
  77 + flagPrefix,
  78 + }
  79 + , id: 'detail_more_snapshot'
  80 + , page: {
  81 + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
  82 + , theme: '#1E9FFF'
  83 + }
  84 + , height: 'full-300'
  85 + , limit: common.limit
  86 + , limits: common.limits
  87 + , done(){
  88 +
  89 + }
  90 + ,error(){
  91 +
  92 + }
  93 + })
  94 + })
  95 +});
@@ -7992,12 +7992,13 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now { @@ -7992,12 +7992,13 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now {
7992 /*通知页面中间统计图布局样式*/ 7992 /*通知页面中间统计图布局样式*/
7993 7993
7994 .detail-loadbalancing-vs { 7994 .detail-loadbalancing-vs {
7995 - width: calc(12.5% - 22px); 7995 + /*lsq 详情页节电池样式修改 2022-08-08*/
  7996 + width: calc(14% - 0px);
7996 height: 115px; 7997 height: 115px;
7997 margin: 5px; 7998 margin: 5px;
7998 float: left; 7999 float: left;
7999 border: 1px solid #dcdcdc; 8000 border: 1px solid #dcdcdc;
8000 - padding: 10px 20px; 8001 + padding: 10px;
8001 border-radius: 5px; 8002 border-radius: 5px;
8002 cursor: pointer; 8003 cursor: pointer;
8003 } 8004 }
@@ -8006,15 +8007,20 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now { @@ -8006,15 +8007,20 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now {
8006 font-size: 15px; 8007 font-size: 15px;
8007 font-weight: bold; 8008 font-weight: bold;
8008 height: 30px; 8009 height: 30px;
  8010 + word-wrap: break-word;
8009 } 8011 }
8010 8012
8011 .detail-loadbalancing-vs .vs-title { 8013 .detail-loadbalancing-vs .vs-title {
8012 margin-bottom: 10px; 8014 margin-bottom: 10px;
8013 } 8015 }
8014 - 8016 +/*lsq 详情页节点池样式修改 2022-08-08*/
  8017 +.detail-loadbalancing-vs .vs-flex{
  8018 + display: flex;
  8019 + align-items: center;
  8020 +}
8015 .detail-loadbalancing-vs div.vs-icon-div { 8021 .detail-loadbalancing-vs div.vs-icon-div {
8016 - width: 55px;  
8017 - height: 55px; 8022 + width: 45px;
  8023 + height: 45px;
8018 padding: 4px; 8024 padding: 4px;
8019 float: left; 8025 float: left;
8020 border-radius: 10px; 8026 border-radius: 10px;
@@ -8030,8 +8036,8 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now { @@ -8030,8 +8036,8 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now {
8030 } 8036 }
8031 8037
8032 .detail-loadbalancing-vs div.vs-icon { 8038 .detail-loadbalancing-vs div.vs-icon {
8033 - width: 50px;  
8034 - height: 50px; 8039 + width: 40px;
  8040 + height: 40px;
8035 background-repeat: no-repeat; 8041 background-repeat: no-repeat;
8036 background-position: center; 8042 background-position: center;
8037 background-image: url(/src/style/img/icon-db.png); 8043 background-image: url(/src/style/img/icon-db.png);
@@ -8062,6 +8068,8 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now { @@ -8062,6 +8068,8 @@ table.table-duty tbody td div.table-duty-td-day .duty-td-div-now {
8062 width: 61%; 8068 width: 61%;
8063 float: left; 8069 float: left;
8064 padding-left: 10px; 8070 padding-left: 10px;
  8071 + /*lsq 详情页节点池样式修改 2022-08-08*/
  8072 + flex:1;
8065 } 8073 }
8066 8074
8067 .detail-loadbalancing-vs .vs-info li { 8075 .detail-loadbalancing-vs .vs-info li {
@@ -8375,7 +8383,7 @@ form.layui-card-header.layuiadmin-card-header-auto { @@ -8375,7 +8383,7 @@ form.layui-card-header.layuiadmin-card-header-auto {
8375 8383
8376 .info-table .div-link-state-list { 8384 .info-table .div-link-state-list {
8377 height: 30px; 8385 height: 30px;
8378 - width: calc(100% - 12px); 8386 + width: calc(100%);
8379 float: left; 8387 float: left;
8380 } 8388 }
8381 8389
@@ -8551,4 +8559,7 @@ form.layui-card-header.layuiadmin-card-header-auto { @@ -8551,4 +8559,7 @@ form.layui-card-header.layuiadmin-card-header-auto {
8551 } 8559 }
8552 .res .layui-card-body{ 8560 .res .layui-card-body{
8553 background: #ffffff; 8561 background: #ffffff;
8554 -}  
  8562 +}
  8563 +.layui-layer-tips{
  8564 + word-break: break-all;
  8565 +}
1 <article> 1 <article>
2 - <form action="" class="layui-form layui-form-pane" lay-filter="form-flag-edit">  
3 - <fieldset class="layui-elem-field layui-field-title">  
4 - <legend>基本信息</legend>  
5 - </fieldset>  
6 - <div class="layui-form-item">  
7 - <div class="inline-half layui-inline ">  
8 - <label class="layui-form-label">编码</label>  
9 - <div class="layui-input-inline">  
10 - <input class="layui-input" lay-verify="required" name="flag" placeholder="请输入编码" type="text">  
11 - </div>  
12 - </div>  
13 - <div class="inline-half layui-inline">  
14 - <label class="layui-form-label">名称</label>  
15 - <div class="layui-input-inline">  
16 - <input class="layui-input" lay-verify="required" name="name" placeholder="请输入名称" required  
17 - type="text">  
18 - </div>  
19 - </div> 2 + <form class="layui-form layui-form-pane" action="" lay-filter="form-flag-edit">
  3 + <fieldset class="layui-elem-field layui-field-title">
  4 + <legend>基本信息</legend>
  5 + </fieldset>
  6 + <div class="layui-form-item">
  7 + <div class="inline-half layui-inline ">
  8 + <label class="layui-form-label">编码<span style="color: red">*</span></label>
  9 + <div class="layui-input-inline">
  10 + <input type="text" name="flag" lay-verify="required" placeholder="请输入编码" class="layui-input">
20 </div> 11 </div>
21 - <div class="layui-form-item">  
22 - <label class="layui-form-label textarea-label">说明</label>  
23 - <div class="layui-input-block">  
24 - <textarea class="layui-textarea" name="remark" placeholder="请输入说明"></textarea>  
25 - </div> 12 + </div>
  13 + <div class="inline-half layui-inline">
  14 + <label class="layui-form-label">维度<span style="color: red">*</span></label>
  15 + <div class="layui-input-inline">
  16 + <select name="dimension" lay-verify="required" class="layui-select">
  17 + <option value="">=选择维度=</option>
  18 + <option value="1D">一维</option>
  19 + <option value="2D">二维</option>
  20 + </select>
26 </div> 21 </div>
27 - <button class="hide" id="btn-kpiflag-submit" lay-filter="kpi-flag-submit" lay-submit>提交</button>  
28 - </form>  
29 - <form class="layui-form layui-form-pane" onsubmit="return false">  
30 - <fieldset class="layui-elem-field layui-field-title">  
31 - <legend>绑定指标&nbsp;&nbsp;  
32 - <button class="layui-btn layui-btn-xs layui-btn-normal fieldset-btn" id="btn-kpiflag-kpi-bind"><i  
33 - class="layui-icon">&#xe624;</i></button>  
34 - </legend>  
35 - </fieldset>  
36 - <div class="layui-form-item layui-form-item-flex">  
37 - <table class="input-flex-1" id="kpiflag-edit-table"></table> 22 + </div>
  23 + </div>
  24 + <div class="layui-form-item">
  25 + <div class="inline-half layui-inline">
  26 + <label class="layui-form-label">名称<span style="color: red">*</span></label>
  27 + <div class="layui-input-inline">
  28 + <input type="text" name="name" required lay-verify="required" placeholder="请输入名称" class="layui-input">
38 </div> 29 </div>
39 - <div class="layui-form-item layui-form-item-flex hide">  
40 - <div class="layui-input-block input-flex-1">  
41 - <input name="chartType" title="列表" type="radio" value="">  
42 - <input name="chartType" title="折线图" type="radio" value="">  
43 - <input name="chartType" title="柱状图" type="radio" value="">  
44 - <input name="chartType" title="饼图" type="radio" value="">  
45 - </div> 30 + </div>
  31 + <div class="inline-half layui-inline">
  32 + <label class="layui-form-label">描述<span style="color: red">*</span></label>
  33 + <div class="layui-input-inline">
  34 + <input type="text" name="describes" required lay-verify="required" placeholder="请输入名称" class="layui-input">
46 </div> 35 </div>
47 - <div class="layui-form-item">  
48 - <div class="layui-inline">  
49 - <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-kpi-flag-restype-bind"><i  
50 - class="layui-icon">&#xe654;</i>绑定到资源类型  
51 - </button>  
52 - </div>  
53 - <div class="layui-inline">  
54 - <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-kpi-flag-app-bind"><i  
55 - class="layui-icon">&#xe654;</i>绑定到应用  
56 - </button>  
57 - </div>  
58 - <div class="layui-inline">  
59 - <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-kpi-flag-server-bind"><i  
60 - class="layui-icon">&#xe654;</i>绑定到服务  
61 - </button>  
62 - </div> 36 + </div>
  37 + </div>
  38 + <div class="layui-form-item">
  39 + <div class="inline-half layui-inline">
  40 + <label class="layui-form-label">创建人<span style="color: red">*</span></label>
  41 + <div class="layui-input-inline">
  42 + <input type="text" name="createUser" required lay-verify="required" placeholder="请输入创建人" class="layui-input">
63 </div> 43 </div>
64 - </form>  
65 - <form class="layui-form layui-form-pane" onsubmit="return false">  
66 - <fieldset class="layui-elem-field layui-field-title">  
67 - <legend>绑定信息</legend>  
68 - </fieldset>  
69 - <div class="layui-collapse" id="div-flag-bind">  
70 - <div class="layui-colla-item flex-1">  
71 - <h2 class="layui-colla-title">绑定的资源类型&nbsp;&nbsp;数量:<span id="txt-flag-bind-resTypeCount">0</span></h2>  
72 - <div class="layui-colla-content">  
73 - <table id="table-flag-bind-retype"></table>  
74 - </div>  
75 - </div>  
76 - <div class="layui-colla-item">  
77 - <h2 class="layui-colla-title">绑定的应用&nbsp;&nbsp;数量:<span id="txt-flag-bind-appCount">0</span></h2>  
78 - <div class="layui-colla-content">  
79 - <table id="table-flag-bind-app"></table>  
80 - </div>  
81 - </div>  
82 - <div class="layui-colla-item">  
83 - <h2 class="layui-colla-title">绑定的服务&nbsp;&nbsp;数量:<span id="txt-flag-bind-serverCount">0</span></h2>  
84 - <div class="layui-colla-content">  
85 - <table id="table-flag-bind-server"></table>  
86 - </div>  
87 - </div> 44 + </div>
  45 + <div class="inline-half layui-inline">
  46 + <label class="layui-form-label">创建时间</label>
  47 + <div class="layui-input-inline">
  48 + <input type="text" name="createTime" disabled class="layui-input">
88 </div> 49 </div>
89 - </form> 50 + </div>
  51 + </div>
  52 + <div class="layui-form-item">
  53 + <label class="layui-form-label textarea-label">说明</label>
  54 + <div class="layui-input-block">
  55 + <textarea name="remark" placeholder="请输入说明" class="layui-textarea"></textarea>
  56 + </div>
  57 + </div>
  58 + <button id="btn-kpiflag-submit" class="hide" lay-submit lay-filter="kpi-flag-submit">提交</button>
  59 + </form>
  60 + <form class="layui-form layui-form-pane" onsubmit="return false">
  61 + <fieldset class="layui-elem-field layui-field-title">
  62 + <legend>绑定指标&nbsp;&nbsp;
  63 + <button class="layui-btn layui-btn-xs layui-btn-normal fieldset-btn" id="btn-kpiflag-kpi-bind"><i class="layui-icon">&#xe624;</i></button>
  64 + </legend>
  65 + </fieldset>
  66 + <div class="layui-form-item layui-form-item-flex kpiflag-edit-table">
  67 + <table id="kpiflag-edit-table" class="input-flex-1"></table>
  68 + </div>
  69 + <div class="layui-form-item layui-form-item-flex hide">
  70 + <div class="layui-input-block input-flex-1">
  71 + <input type="radio" name="chartType" value="" title="列表">
  72 + <input type="radio" name="chartType" value="" title="折线图">
  73 + <input type="radio" name="chartType" value="" title="柱状图">
  74 + <input type="radio" name="chartType" value="" title="饼图">
  75 + </div>
  76 + </div>
  77 + <div class="layui-form-item">
  78 + <div class="layui-inline">
  79 + <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-kpi-flag-restype-bind"><i class="layui-icon">&#xe654;</i>绑定到资源类型</button>
  80 + </div>
  81 + <div class="layui-inline">
  82 + <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-kpi-flag-app-bind"><i class="layui-icon">&#xe654;</i>绑定到应用</button>
  83 + </div>
  84 + <div class="layui-inline">
  85 + <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-kpi-flag-server-bind"><i class="layui-icon">&#xe654;</i>绑定到服务</button>
  86 + </div>
  87 + </div>
  88 + </form>
  89 + <form class="layui-form layui-form-pane" onsubmit="return false">
  90 + <fieldset class="layui-elem-field layui-field-title">
  91 + <legend>绑定信息</legend>
  92 + </fieldset>
  93 + <div class="layui-collapse" id="div-flag-bind">
  94 + <div class="layui-colla-item flex-1">
  95 + <h2 class="layui-colla-title">绑定的资源类型&nbsp;&nbsp;数量:<span id="txt-flag-bind-resTypeCount">0</span></h2>
  96 + <div class="layui-colla-content">
  97 + <table id="table-flag-bind-retype"></table>
  98 + </div>
  99 + </div>
  100 + <div class="layui-colla-item">
  101 + <h2 class="layui-colla-title">绑定的应用&nbsp;&nbsp;数量:<span id="txt-flag-bind-appCount">0</span></h2>
  102 + <div class="layui-colla-content">
  103 + <table id="table-flag-bind-app"></table>
  104 + </div>
  105 + </div>
  106 + <div class="layui-colla-item">
  107 + <h2 class="layui-colla-title">绑定的服务&nbsp;&nbsp;数量:<span id="txt-flag-bind-serverCount">0</span></h2>
  108 + <div class="layui-colla-content">
  109 + <table id="table-flag-bind-server"></table>
  110 + </div>
  111 + </div>
  112 + </div>
  113 + </form>
90 </article> 114 </article>
91 <script> 115 <script>
92 - layui.use('kpiflagEdit', function (fn) {  
93 - fn({{ d }});  
94 - });  
95 -</script> 116 + layui.use('kpiflagEdit', function (fn) {
  117 + fn({{d}});
  118 + });
  119 +</script>
@@ -5,30 +5,58 @@ @@ -5,30 +5,58 @@
5 <div class="layui-card"> 5 <div class="layui-card">
6 <div class="layui-card-header"> 6 <div class="layui-card-header">
7 <div class="layui-status"> 7 <div class="layui-status">
8 - <form class="layui-form layui-card-header layuiadmin-card-header-auto"  
9 - lay-filter="kpiflag-form"> 8 + <form class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="kpiflag-form">
10 <div class="layui-form-item"> 9 <div class="layui-form-item">
11 <div class="layui-inline"> 10 <div class="layui-inline">
12 <div class="layui-input-inline layui-input-inline--long"> 11 <div class="layui-input-inline layui-input-inline--long">
13 - <input autocomplete="off" class="layui-input" id="kpiflag_keyword"  
14 - lay-tips="关键字检索包含: </br>指标组名称" name="kpiflag_keyword"  
15 - placeholder="输入关键字,回车搜索"  
16 - type="text">  
17 - <input style="display: none" type="text"> 12 + <input type="text" id="kpiflag_keyword" name="kpiflag_keyword" placeholder="输入关键字,回车搜索" autocomplete="off"
  13 + lay-tips="关键字检索包含: </br>指标组名称</br>flag</br>备注</br>绑定资源类型</br>绑定指标</br>指标组描述</br>创建人"
  14 + class="layui-input">
  15 + <input type="text" style="display: none">
18 </div> 16 </div>
19 </div> 17 </div>
  18 + <div class="layui-inline">
  19 + <div class="layui-input-inline layui-input-inline--long">
  20 + <input type="text" id="kpiflag_describe" name="kpiflag_describe" placeholder="输入指标组描述,回车搜索" autocomplete="off"
  21 + class="layui-input">
  22 + <input type="text" style="display: none">
  23 + </div>
  24 + </div>
  25 + <div class="layui-inline">
  26 + <div class="layui-input-inline layui-input-inline--long">
  27 + <input type="text" id="kpiflag_kpis" name="kpiflag_kpis" placeholder="输入指标名称,回车搜索" autocomplete="off"
  28 + class="layui-input">
  29 + <input type="text" style="display: none">
  30 + </div>
  31 + </div>
  32 + <div class="layui-inline">
  33 + <div class="layui-input-inline layui-input-inline--long">
  34 + <input type="text" id="kpiflag_restypes" name="kpiflag_restypes" placeholder="输入资源类型,回车搜索" autocomplete="off"
  35 + class="layui-input">
  36 + <input type="text" style="display: none">
  37 + </div>
  38 + </div>
  39 + <div class="layui-inline">
  40 + <div class="layui-input-inline layui-input-inline--long">
  41 + <select name="dimension" class="layui-select" lay-filter="change">
  42 + <option value="">=选择维度=</option>
  43 + <option value="1D">一维</option>
  44 + <option value="2D">二维</option>
  45 + </select>
  46 + </div>
  47 + </div>
  48 + <button class="layui-btn layui-btn-normal" id="kpiflagQueryBtn" type="button">
  49 + <!--lsq 查询按钮取消掉图标 2022-06-30-->
  50 + 查询
  51 + </button>
20 </div> 52 </div>
21 </form> 53 </form>
22 </div> 54 </div>
23 </div> 55 </div>
24 <div class="layui-card-body"> 56 <div class="layui-card-body">
25 <div class="warn-btns"> 57 <div class="warn-btns">
26 - <button class="layui-btn layui-btn-sm layui-btn-normal" id="addkpiflag" type="button"><i  
27 - class="layui-icon">&#xe654;</i>新增  
28 - </button>  
29 - <button class="layui-btn layui-btn-sm layui-btn-normal" id="delkpiflag" type="button"><i  
30 - class="layui-icon">&#xe640;</i>删除  
31 - </button> 58 + <button id="addkpiflag" type="button" class="layui-btn layui-btn-sm layui-btn-normal"><i class="layui-icon">&#xe654;</i>新增</button>
  59 + <button id="delkpiflag" type="button" class="layui-btn layui-btn-sm layui-btn-normal"><i class="layui-icon">&#xe640;</i>删除</button>
32 </div> 60 </div>
33 <table id="kpiflag_table"></table> 61 <table id="kpiflag_table"></table>
34 </div> 62 </div>
@@ -42,3 +70,8 @@ @@ -42,3 +70,8 @@
42 fn(); 70 fn();
43 }); 71 });
44 </script> 72 </script>
  73 +<style>
  74 + .layui-status .layui-input-inline--long {
  75 + width: 190px !important;
  76 + }
  77 +</style>
  1 +<article>
  2 + <form class="layui-form layui-form-pane" action="" lay-filter="form-restypepage-edit">
  3 + <fieldset class="layui-elem-field layui-field-title">
  4 + <legend>基本信息</legend>
  5 + </fieldset>
  6 + <div class="layui-form-item">
  7 + <div class="inline-half layui-inline">
  8 + <label class="layui-form-label">页面名称<span style="color: red">*</span></label>
  9 + <div class="layui-input-inline">
  10 + <input type="text" name="name" lay-verify="required" placeholder="请输入页面名称" class="layui-input">
  11 + </div>
  12 + </div>
  13 + <div class="inline-half layui-inline">
  14 + <label class="layui-form-label">资源类型<span style="color: red">*</span></label>
  15 + <div class="layui-input-inline">
  16 + <select name="resType" lay-verify="required" lay-search="" id="restypepagekpi_select_resType" class="layui-select">
  17 + <option value="">=资源类型=</option>
  18 + </select>
  19 + </div>
  20 + </div>
  21 + </div>
  22 + <div class="layui-form-item">
  23 + <div class="inline-half layui-inline">
  24 + <label class="layui-form-label">操作系统</label>
  25 + <div class="layui-input-inline">
  26 + <select name="os" id="restypepagekpiOs" lay-search="" class="layui-select">
  27 + <option value="">=操作系统=</option>
  28 + </select>
  29 + </div>
  30 + </div>
  31 + <div class="inline-half layui-inline">
  32 + <label class="layui-form-label">厂商</label>
  33 + <div class="layui-input-inline">
  34 + <select name="provider" id="restypepagekpiProvider" lay-search="" class="layui-select">
  35 + <option value="">=厂商=</option>
  36 + </select>
  37 + </div>
  38 + </div>
  39 + </div>
  40 + <div class="layui-form-item">
  41 + <div class="inline-half layui-inline">
  42 + <label class="layui-form-label">采集协议</label>
  43 + <div class="layui-input-inline">
  44 + <select name="protocol" id="restypepagekpiCollProtocol" lay-search="" class="layui-select">
  45 + <option value="">=采集协议=</option>
  46 + </select>
  47 + </div>
  48 + </div>
  49 + <div class="inline-half layui-inline">
  50 + <label class="layui-form-label">型号</label>
  51 + <div class="layui-input-inline">
  52 + <input type="text" name="model" placeholder="请输入型号" class="layui-input">
  53 + </div>
  54 + </div>
  55 + </div>
  56 + <div class="layui-form-item">
  57 + <div class="inline-half layui-inline">
  58 + <label class="layui-form-label">排序<span style="color: red">*</span></label>
  59 + <div class="layui-input-inline">
  60 + <input class="layui-input" lay-verify="required" name="sort" value="1" placeholder="请输入排序" type="number">
  61 + </div>
  62 + </div>
  63 + <div class="inline-half layui-inline">
  64 + <label class="layui-form-label">辅助关键字</label>
  65 + <div class="layui-input-inline">
  66 + <input type="text" name="keyword" placeholder="请输入辅助关键字" class="layui-input">
  67 + </div>
  68 + </div>
  69 + </div>
  70 + <div class="layui-form-item">
  71 + <div class="inline-half layui-inline">
  72 + <label class="layui-form-label">创建人<span style="color: red">*</span></label>
  73 + <div class="layui-input-inline">
  74 + <input type="text" name="createUser" required lay-verify="required" placeholder="请输入创建人" class="layui-input">
  75 + </div>
  76 + </div>
  77 + </div>
  78 + <div class="layui-form-item">
  79 + <label class="layui-form-label textarea-label">备注</label>
  80 + <div class="layui-input-block">
  81 + <textarea name="remark" placeholder="请输入备注" class="layui-textarea"></textarea>
  82 + </div>
  83 + </div>
  84 + <button id="btn-restypepage-submit" class="hide" lay-submit lay-filter="kpi-flag-submit">提交</button>
  85 + </form>
  86 + <form class="layui-form layui-form-pane" onsubmit="return false">
  87 + <fieldset class="layui-elem-field layui-field-title">
  88 + <legend>选择指标组&nbsp;&nbsp;
  89 + <button class="layui-btn layui-btn-xs layui-btn-normal fieldset-btn" id="btn-restypepage-kpi-bind"><i class="layui-icon">&#xe624;</i></button>
  90 + </legend>
  91 + </fieldset>
  92 + <div class="layui-form-item layui-form-item-flex restypepage-edit-table">
  93 + <table id="restypepage-edit-table" class="input-flex-1"></table>
  94 + </div>
  95 + </form>
  96 +</article>
  97 +<script>
  98 + layui.use('restypepageEdit', function (fn) {
  99 + fn({{d}});
  100 + });
  101 +</script>
  102 +<style>
  103 + [lay-id="restypepage-edit-table"] .layui-table-cell {
  104 + height: auto !important;
  105 + }
  106 +</style>
  1 +<title>资源类型页面配置</title>
  2 +<article class="page-container">
  3 + <div class="page-panel">
  4 + <div class="main commonDiv">
  5 + <div class="layui-card">
  6 + <div class="layui-card-header">
  7 + <div class="layui-status">
  8 + <form class="layui-card-header layuiadmin-card-header-auto layui-form"
  9 + lay-filter="form-restypepage-condition" id="restypepageQueryForm">
  10 + <div class="layui-form-item">
  11 + <div class="layui-inline">
  12 + <div class="layui-input-inline layui-input-inline--long">
  13 + <input autocomplete="off" class="layui-input" name="keywords" placeholder="输入关键字,回车搜索" lay-tips="关键字检索包含:</br>页面名称</br>型号</br>关键字</br>备注</br>指标组名称</br>指标名称"
  14 + type="text">
  15 + </div>
  16 + </div>
  17 + <div class="layui-inline">
  18 + <div class="layui-input-inline">
  19 + <select name="restypepageresType" id="restypepage_select_resType" lay-search="" lay-filter="change">
  20 + <option value="">=资源类型=</option>
  21 + </select>
  22 + </div>
  23 + </div>
  24 + <div class="layui-inline">
  25 + <div class="layui-input-inline">
  26 + <select id="restypepageCollProtocol" lay-search="" name="restypepagecollProtocol" lay-filter="change">
  27 + <option value="">=采集协议=</option>
  28 + </select>
  29 + </div>
  30 + </div>
  31 + <div class="layui-inline">
  32 + <div class="layui-input-inline">
  33 + <select id="restypepageOs" lay-search="" name="restypepageos" lay-filter="change">
  34 + <option value="">=操作系统=</option>
  35 + </select>
  36 + </div>
  37 + </div>
  38 + <div class="layui-inline">
  39 + <div class="layui-input-inline">
  40 + <select id="restypepageProvider" lay-search="" name="restypepageprovider" lay-filter="change">
  41 + <option value="">=厂商=</option>
  42 + </select>
  43 + </div>
  44 + </div>
  45 + <button class="layui-btn layui-btn-normal" id="restypepageQueryBtn" type="button">
  46 + <!--lsq 查询按钮取消掉图标 2022-06-30-->
  47 + 查询
  48 + </button>
  49 + </div>
  50 + </form>
  51 + </div>
  52 + </div>
  53 + <div class="layui-card-body">
  54 + <div class="warn-btns">
  55 + <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-restypepage-add">
  56 + <i class="layui-icon layui-icon-add-1"></i>新增
  57 + </button>
  58 + <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-restypepage-delete">
  59 + <i class="layui-icon layui-icon-delete"></i>删除
  60 + </button>
  61 + </div>
  62 + <table id="table-restypepage-list" lay-filter="table-restypepage-list"></table>
  63 + </div>
  64 + </div>
  65 + </div>
  66 + </div>
  67 +</article>
  68 +<script>
  69 + layui.use('restypepageIndex', function (fn) {
  70 + fn();
  71 + });
  72 +</script>
  1 +<title>快照管理</title>
  2 +<iframe src="/vue3/index.html#/vue3/snapshot" frameborder="0" class="layadmin-iframe" style="height: 99.5%!important;"/>
  1 +<title>快照概览</title>
  2 +<iframe src="/vue3/index.html#/vue3/snapshotOverview" frameborder="0" class="layadmin-iframe" style="height: 99.5%!important;"/>
  1 +<!--快照详细页面-->
  2 +<article class="page-container template">
  3 + <div class="page-panel">
  4 + <div class="main">
  5 + <div class="layui-card">
  6 + <div class="layui-card-body">
  7 + <div class="lay-row">
  8 + <div class="lay-row-item" style="max-width: 200px">
  9 + <h5 class="lay-row-title">资源状态</h5>
  10 + <div class="res-state" id="hostminicomputerpartition_resstate">
  11 + <div class="res-state-pie res-state-pie--good"></div>
  12 + <ul>
  13 + <li>严重告警:0</li>
  14 + <li>重要告警:0</li>
  15 + <li>一般告警:0</li>
  16 + </ul>
  17 + </div>
  18 + </div>
  19 + <div class="lay-row-item lay-row-item--half" style="width: calc(100% - 200px)">
  20 + <h5 class="lay-row-title">基本信息<i class="iconfont detail_base_info"
  21 + data-id="hostminicomputerpartition_jbxx">&#xe61e;</i></h5>
  22 + <ul class="info-table" id="hostminicomputerpartition_jbxx">
  23 + </ul>
  24 + </div>
  25 + </div>
  26 + <div class="lay-row">
  27 + <div class="lay-row-item lay-row-item--half" style="width: calc(100% - 10px)">
  28 + <h5 class="lay-row-title">性能信息<i class="iconfont detail_base_info"
  29 + data-id="hostminicomputerpartition_sysfile">&#xe61e;</i></h5>
  30 + <ul class="info-table" id="hostminicomputerpartition_sysfile"></ul>
  31 + </div>
  32 + </div>
  33 + <div id="table_arr_body">
  34 + </div>
  35 + <div class="lay-row">
  36 + <div class="lay-row-item">
  37 + <h5 class="lay-row-title">告警列表</h5>
  38 + <div id="snapshow_active_alram"></div>
  39 + </div>
  40 + </div>
  41 + </div>
  42 + </div>
  43 + </div>
  44 + </div>
  45 +</article>
  46 +<textarea id="snapshot_detail_param_id" style="display: none;">{{d}}</textarea>
  47 +<script>
  48 + layui.use('snapshot_detail', function (fn) {
  49 + var $ = layui.$;
  50 + var parm = $("#snapshot_detail_param_id").val();
  51 + if (parm.indexOf('{{d') != -1) {
  52 + fn();
  53 + } else {
  54 + fn(JSON.parse(parm));
  55 + }
  56 + });
  57 +</script>
  1 +<title>快照更多展示</title>
  2 +<article class="page-container">
  3 + <div class="page-panel">
  4 + <div class="main">
  5 + <div class="layui-card">
  6 + <div class="layui-card-body">
  7 + <table id="detail_more_snapshot" lay-filter="detail_more_snapshot"></table>
  8 + </div>
  9 + </div>
  10 + </div>
  11 + </div>
  12 +</article>
  13 +
  14 +<script>
  15 + layui.use('snapshot_detail_more', function (fn) {
  16 + fn({{ d }});
  17 + });
  18 +</script>
1 <div> 1 <div>
2 <el-select :size="$global.elementConfig.size.input" :collapse-tags="true" :filter-method="selectFilterMethod" :filterable="isFilter" 2 <el-select :size="$global.elementConfig.size.input" :collapse-tags="true" :filter-method="selectFilterMethod" :filterable="isFilter"
3 - :size="size" @change="selectChangeMethod" @visible-change="selectClose" clearable placeholder="所属系统" 3 + :size="size" @change="selectChangeMethod" @visible-change="selectClose" clearable placeholder="所属业务"
4 style="min-width: 120px;" v-model="modelValueLabel"> 4 style="min-width: 120px;" v-model="modelValueLabel">
5 <el-option :value="modelValue" style="height: auto;padding: 0;"> 5 <el-option :value="modelValue" style="height: auto;padding: 0;">
6 <el-tree :check-on-click-node="true" :check-strictly="false" :data="list" :default-expand-all="isDefaultAll" 6 <el-tree :check-on-click-node="true" :check-strictly="false" :data="list" :default-expand-all="isDefaultAll"
@@ -64,7 +64,7 @@ export default { @@ -64,7 +64,7 @@ export default {
64 }, 64 },
65 selectFilterMethod(val) { 65 selectFilterMethod(val) {
66 // 下拉框调用tree树筛选 66 // 下拉框调用tree树筛选
67 - this.$refs.kpiTree.filter(val) 67 + this.$refs.bizTree.filter(val)
68 }, 68 },
69 selectChangeMethod(e) { 69 selectChangeMethod(e) {
70 var arrNew = [] 70 var arrNew = []
@@ -78,7 +78,7 @@ export default { @@ -78,7 +78,7 @@ export default {
78 } 78 }
79 } 79 }
80 // 设置勾选的值 80 // 设置勾选的值
81 - this.$refs.kpiTree.setCheckedNodes(arrNew) 81 + this.$refs.bizTree.setCheckedNodes(arrNew)
82 }, 82 },
83 filterNode(value, data) { 83 filterNode(value, data) {
84 if (!value) return true 84 if (!value) return true
  1 +<div>
  2 + <el-select :size="$global.elementConfig.size.input" :collapse-tags="true" :filter-method="selectFilterMethod" :filterable="isFilter"
  3 + :size="size" @change="selectChangeMethod" @visible-change="selectClose" clearable placeholder="选择用户"
  4 + style="min-width: 120px;" v-model="modelValueLabel">
  5 + <el-option :value="modelValue" style="height: auto;padding: 0;">
  6 + <el-tree :check-on-click-node="true" :check-strictly="false" :data="list" :default-expand-all="isDefaultAll"
  7 + :empty-text="emptyText" :expand-on-click-node="true" :filter-node-method="filterNode"
  8 + :props="defaultProps" :show-checkbox="isMultiple" :show-checkbox="checkbox" @check-change="handleCheckChange"
  9 + node-key="id" node-key="id" ref="userTree">
  10 + </el-tree>
  11 + </el-option>
  12 + </el-select>
  13 +</div>
  1 +export default {
  2 + template: '',
  3 + name: 'user-tree-input',
  4 + props: {
  5 + // echoObj 可以用于回显,它的值为需要回显的对象,多个时可以使用数组
  6 + echoObj: {},
  7 + // 是否开启搜索
  8 + isFilter: {
  9 + default: true
  10 + },
  11 + // 尺寸
  12 + size: {
  13 + default: ''
  14 + },
  15 + placeholderText: {
  16 + default: '选择用户'
  17 + },
  18 + isTag: {
  19 + default: true
  20 + },
  21 + isDefaultAll: {
  22 + default: true
  23 + },
  24 + // 点击节点是否展开
  25 + expandClickNode: {
  26 + default: false
  27 + },
  28 + // 字段key,用于取出数据中的名字
  29 + fieldName: {
  30 + default: 'title'
  31 + },
  32 + emptyText: {
  33 + default: '无匹配项'
  34 + },
  35 + // 字段key, 数据中的id
  36 + fieldId: {
  37 + default: ''
  38 + },
  39 + // 配置是否可多选
  40 + isMultiple: {
  41 + type: Boolean,
  42 + default: true
  43 + },
  44 +
  45 + },
  46 + data() {
  47 + return {
  48 + defaultProps: {
  49 + children: 'children',
  50 + label: 'nickname'
  51 + },
  52 + list: [],
  53 + // 实际选中值
  54 + modelValue: [],
  55 + // 下拉框绑定值(选中值名字)
  56 + modelValueLabel: []
  57 + }
  58 + },
  59 + methods: {
  60 + selectClose(bool) {
  61 + if (bool) {
  62 + this.selectFilterMethod('')
  63 + }
  64 + },
  65 + selectFilterMethod(val) {
  66 + // 下拉框调用tree树筛选
  67 + this.$refs.userTree.filter(val)
  68 + },
  69 + selectChangeMethod(e) {
  70 + var arrNew = []
  71 + var dataLength = this.modelValue.length
  72 + var eLength = e.length
  73 + for (var i = 0; i < dataLength; i++) {
  74 + for (var j = 0; j < eLength; j++) {
  75 + if (e[j] === JSON.parse('this.modelValue[i].' + this.fieldName)) {
  76 + arrNew.push(this.modelValue[i])
  77 + }
  78 + }
  79 + }
  80 + // 设置勾选的值
  81 + this.$refs.userTree.setCheckedNodes(arrNew)
  82 + },
  83 + filterNode(value, data) {
  84 + if (!value) return true
  85 +
  86 + return data[this.fieldName].indexOf(value) !== -1
  87 + },
  88 + handleCheckChange(data, checked, indeterminate) {
  89 + let that = this;
  90 +
  91 + var selectArr = [];
  92 + selectArr.push(data);
  93 + // data[that.defaultProps.children].forEach(function (v) {
  94 + // selectArr.push(data);
  95 + // });
  96 +
  97 + if (checked) {
  98 + // 已选中
  99 + that.modelValue = that.modelValue.concat(selectArr)
  100 + } else {
  101 + that.modelValue.forEach(function (v, i) {
  102 + selectArr.forEach(function (v1) {
  103 + if (v.busId == v1.busId) {
  104 + that.modelValue.splice(i, 1);
  105 + }
  106 + })
  107 + })
  108 + }
  109 + that.modelValueLabel = that.modelValue.map(function (v) {
  110 + return v[that.defaultProps.label];
  111 + });
  112 + that.$emit('callback', this.modelValue)
  113 + }
  114 + },
  115 + watch: {},
  116 + mounted() {
  117 + let that = this;
  118 + //加载资源列表
  119 + const {proxy} = Vue.getCurrentInstance()
  120 + // 加载列表
  121 + proxy.$http.get("/api-user/users/getAll", {}, function (res) {
  122 + if (res) {
  123 + that.list = res;
  124 + }
  125 + })
  126 + },
  127 + created() {
  128 +
  129 +
  130 + }
  131 +}
@@ -40,16 +40,16 @@ Promise.all([ @@ -40,16 +40,16 @@ Promise.all([
40 .component('cm-document', Vue.defineAsyncComponent(() => myImport('components/common/document/index'))) 40 .component('cm-document', Vue.defineAsyncComponent(() => myImport('components/common/document/index')))
41 //指标类型数 41 //指标类型数
42 .component('cm-kpi-type-tree-input', Vue.defineAsyncComponent(() => myImport('components/common/inputkpitree/index'))) 42 .component('cm-kpi-type-tree-input', Vue.defineAsyncComponent(() => myImport('components/common/inputkpitree/index')))
43 - //所属系统 43 + //所属业务
44 .component('cm-biz-type-tree-input', Vue.defineAsyncComponent(() => myImport('components/common/inputbiztypetree/index'))) 44 .component('cm-biz-type-tree-input', Vue.defineAsyncComponent(() => myImport('components/common/inputbiztypetree/index')))
45 //时间范围组件 45 //时间范围组件
46 .component('cm-date-range-influx', Vue.defineAsyncComponent(() => myImport('components/common/dateRange/indexInflux'))) 46 .component('cm-date-range-influx', Vue.defineAsyncComponent(() => myImport('components/common/dateRange/indexInflux')))
47 //富文本框组件 47 //富文本框组件
48 .component('cm-wang-editor', Vue.defineAsyncComponent(() => myImport('components/common/wangEditorComponent/index'))) 48 .component('cm-wang-editor', Vue.defineAsyncComponent(() => myImport('components/common/wangEditorComponent/index')))
49 //告警通知统计信息 49 //告警通知统计信息
50 - .component('cm-notice-statistics', Vue.defineAsyncComponent(() => myImport('components/common/noticeStatistics/index')));  
51 -  
52 - 50 + .component('cm-notice-statistics', Vue.defineAsyncComponent(() => myImport('components/common/noticeStatistics/index')))
  51 + //告警通知统计信息
  52 + .component('cm-user-type-tree-input', Vue.defineAsyncComponent(() => myImport('components/common/inputusertree/index')));
53 // // 自定义指令 53 // // 自定义指令
54 // app.directive('permissions', { 54 // app.directive('permissions', {
55 // // 当被绑定的元素插入到 DOM 中时…… 55 // // 当被绑定的元素插入到 DOM 中时……
@@ -149,6 +149,24 @@ const routes = [{ @@ -149,6 +149,24 @@ const routes = [{
149 name: 'busyConfig', 149 name: 'busyConfig',
150 component: () => myImport('views/busyConfig/index') 150 component: () => myImport('views/busyConfig/index')
151 }, 151 },
  152 + //快照管理
  153 + {
  154 + path: '/vue3/snapshot',
  155 + name: 'snapshot',
  156 + component: () => myImport('views/snapshot/index')
  157 + },
  158 + //快照历史
  159 + {
  160 + path: '/vue3/snapshot/history',
  161 + name: 'snapshotHistory',
  162 + component: () => myImport('views/snapshot/history/index')
  163 + },
  164 + //快照概览
  165 + {
  166 + path: '/vue3/snapshotOverview',
  167 + name: 'snapshotOverview',
  168 + component: () => myImport('views/snapshotOverview/index')
  169 + },
152 ]; 170 ];
153 171
154 // hash模式: createWebHashHistory 172 // hash模式: createWebHashHistory
@@ -295,7 +295,11 @@ global.openDetail = (resId, resType, proxy) => { @@ -295,7 +295,11 @@ global.openDetail = (resId, resType, proxy) => {
295 295
296 }); 296 });
297 } 297 }
298 - 298 +//跳转详情页
  299 +global.openNewWin = (url, name, params, editFlag, fn, cancelfn, type, sign) => {
  300 + let lyaui = global.layui;
  301 + lyaui.commonDetail.openNewWin(url, name, params, editFlag, fn, cancelfn, type, sign)
  302 +}
299 /** 303 /**
300 * @description 打开选择layUI弹窗 304 * @description 打开选择layUI弹窗
301 * @author XuHaoJie 305 * @author XuHaoJie
  1 +<div :style="{'height':height+'px','max-height':height+'px','padding':'10px 0 10px 10px','background':'#fff','box-sizing':'border-box'}"
  2 + class="container">
  3 + <div :style="{'min-height':height+'px','max-height':height+'px','height':'100%','padding-top':'3px'}"
  4 + class="cm-card">
  5 + <div class="search">
  6 + <div class="condition ping">
  7 + <el-form-item>
  8 + <el-date-picker
  9 + :size="$global.elementConfig.size.input"
  10 + end-placeholder="开始时间"
  11 + placeholder="开始时间"
  12 + type="datetime"
  13 + v-model="search.startTime"
  14 + value-format="YYYY-MM-DD HH:mm:ss"
  15 + />
  16 +
  17 + </el-form-item>
  18 + <el-form-item>
  19 + <el-date-picker
  20 + :size="$global.elementConfig.size.input"
  21 + end-placeholder="结束时间"
  22 + placeholder="结束时间"
  23 + type="datetime"
  24 + v-model="search.endTime"
  25 + value-format="YYYY-MM-DD HH:mm:ss"
  26 + />
  27 + </el-form-item>
  28 + <el-form-item>
  29 + <el-button :size="$global.elementConfig.size.button" type="primary" @click="getDataList">查询</el-button>
  30 + </el-form-item>
  31 + <el-form-item>
  32 + <el-button :size="$global.elementConfig.size.button" @click="deleteHistory">删除</el-button>
  33 + </el-form-item>
  34 + </div>
  35 + </div>
  36 + <div class="search-table">
  37 + <cm-table-page :columns="tableData.columns" :dataList="tableData.dataList" :height="(height - 110)"
  38 + :loading="false" :pageSize="search.pageSize" :showBorder="true"
  39 + :showIndex="true" :showPage="true" :showSelection="true"
  40 + :showTools="true" :total="tableData.count" @loaddata="loaddata" @selectionChange="selectionChange">
  41 + <template #default="{row,prop,column}">
  42 + <div v-if="prop == 'state'">
  43 + <div v-if="row.state == 0">
  44 + <el-tag>创建中</el-tag>
  45 + </div>
  46 + <div v-if="row.state == 1">
  47 + <el-tag type="success">已创建</el-tag>
  48 + </div>
  49 + <div v-if="row.state == 2">
  50 + <el-tag type="danger">创建失败</el-tag>
  51 + </div>
  52 + </div>
  53 + </template>
  54 + <template #tools="{scope}">
  55 + <div class="list-handle">
  56 + <span class="icon-bg">
  57 + <i @click="handleDetail(scope.row)" class="el-icon-document" title="查看详情"></i>
  58 + </span>
  59 + <span class="icon-bg">
  60 + <i @click="handleDelete(scope.row)" class="el-icon-delete" title="删除"></i>
  61 + </span>
  62 + </div>
  63 + </template>
  64 + </cm-table-page>
  65 + </div>
  66 + </div>
  67 +</div>
  68 +
  1 +export default {
  2 + name: 'snapshotHistory',
  3 + template: '',
  4 + components: {},
  5 + props: [],
  6 + setup(props, {attrs, slots, emit}) {
  7 + const {proxy} = Vue.getCurrentInstance();
  8 + let height = Vue.ref(window.innerHeight);
  9 + let resId = Vue.ref('');
  10 + //选择的数据
  11 + let selectionData = Vue.ref([]);
  12 + let search = Vue.ref({
  13 + pageNum: 1,
  14 + pageSize: 20,
  15 + startTime: '',
  16 + endTime: '',
  17 + keyWord: ''
  18 +
  19 + });
  20 + let selectionChange = (val) => {
  21 + selectionData.value = val;
  22 + }
  23 + //表格字段
  24 + let tableData = Vue.ref({
  25 + count: 0,
  26 + dataList: [],
  27 + columns: [
  28 + {
  29 + prop: 'createUser',
  30 + label: '快照创建人',
  31 + sortable: true,
  32 + align: 'center',
  33 + width: '250'
  34 + },
  35 + {
  36 + prop: 'createTime',
  37 + label: '快照创建时间',
  38 + sortable: true,
  39 + align: 'center',
  40 + width: '300'
  41 + },
  42 + {
  43 + prop: 'state',
  44 + label: '同步状态',
  45 + sortable: true,
  46 + align: 'center',
  47 + width: '170'
  48 + },
  49 + {
  50 + prop: 'batchNo',
  51 + label: '批次号',
  52 + sortable: true,
  53 + align: 'center',
  54 + }
  55 + ]
  56 + })
  57 + // 获取列表
  58 + let getDataList = () => {
  59 + let params = {
  60 + resId: resId.value,
  61 + startTime: search.value.startTime,
  62 + endTime: search.value.endTime,
  63 + keyWord: search.value.keyword,
  64 + pageNum:search.value.pageNum,
  65 + pageSize: search.value.pageSize
  66 + }
  67 + proxy.$http.get(`/api-web/snapshot/his/getList`, params, function (res) {
  68 + if (res.success) {
  69 + tableData.value.dataList = res.data;
  70 + tableData.value.count = res.count;
  71 + } else {
  72 + tableData.value.dataList = [];
  73 + tableData.value.count = 0;
  74 + }
  75 + });
  76 + }
  77 + //删除快照历史数据
  78 + let handleDelete = (row) =>{
  79 + let params = {
  80 + resId: resId.value,
  81 + batchNo: row.batchNo
  82 + }
  83 + deleteSnapshot(params);
  84 + }
  85 + //多选删除
  86 + let deleteHistory = () =>{
  87 + if (selectionData.value.length > 0) {
  88 + let id = [];
  89 + let batchNo = [];
  90 + selectionData.value.map(item => {
  91 + id.push(item.resId);
  92 + batchNo.push(item.batchNo);
  93 + })
  94 + let params = {
  95 + resId: id.toString(),
  96 + batchNo: batchNo.toString()
  97 + }
  98 + deleteSnapshot(params);
  99 + }else {
  100 + proxy.$global.showMsg("请选择需要删除的历史快照数据","warning");
  101 + }
  102 + }
  103 + //删除
  104 + let deleteSnapshot = (param) =>{
  105 + proxy.$global.confirm('确认删除吗?', function () {
  106 + proxy.$http.get(`/api-web/snapshot/his/delete`, param, function (res) {
  107 + if (res.success) {
  108 + proxy.$global.showMsg("删除成功","success");
  109 + getDataList();
  110 + } else {
  111 + proxy.$global.showMsg("删除失败","error");
  112 + }
  113 + });
  114 + });
  115 + }
  116 +
  117 +
  118 + //获取resId
  119 + let getResId = () => {
  120 + resId.value = proxy.$route.query.resId;
  121 + }
  122 + let loaddata = ({page, limit}) => {
  123 + search.value.pageNum = page;
  124 + search.value.pageSize = limit;
  125 + getDataList();
  126 + }
  127 + //快照详情
  128 + let handleDetail = (row)=>{
  129 + proxy.$global.openNewWin('template/detail/snapshot_detail', row.createUser+'在'+row.createTime+'创建的'+row.resName+'的快照', {resId:row.resId,'batchNo':row.batchNo},false);
  130 + }
  131 +
  132 + //查看资源详情
  133 + let goResDetail = (row) => {
  134 + proxy.$global.openDetail(row.resId, row.resType, proxy);
  135 + }
  136 + // 挂载完
  137 + Vue.onMounted(() => {
  138 + getResId();
  139 + getDataList();
  140 + })
  141 +
  142 +
  143 + return {
  144 + height,
  145 + resId,
  146 + getDataList,
  147 + tableData,
  148 + search,
  149 + loaddata,
  150 + goResDetail,
  151 + handleDelete,
  152 + handleDetail,
  153 + selectionChange,
  154 + deleteHistory,
  155 + deleteSnapshot
  156 + }
  157 + }
  158 +
  159 +}
  1 +<div class="container" :style="{'height':height+'px','max-height':height+'px','padding':'10px 0 10px 10px','background':'#fff','box-sizing':'border-box'}">
  2 + <div class="cm-card" :style="{'min-height':height+'px','max-height':height+'px','height':'100%','padding-top':'3px'}">
  3 + <div class="search">
  4 + <div class="condition esData-conditon" style="justify-content: space-between;width: 100%;">
  5 + <el-form :inline="true">
  6 + <el-form-item>
  7 + <el-tooltip placement="bottom-start">
  8 + <template #content> 资源名称 <br /> 资源ip <br /> 业务名称</template>
  9 + <el-input clearable :size="$global.elementConfig.size.input" v-model="queryParams.keyWord" placeholder="关键字检索" />
  10 + </el-tooltip>
  11 + </el-form-item>
  12 + <el-form-item>
  13 + <el-dropdown>
  14 + <cm-res-type-tree-input @callback="getResType" clearable collapseTags multiple/>
  15 + </el-dropdown>
  16 + </el-form-item>
  17 + <el-form-item>
  18 + <el-dropdown>
  19 + <cm-biz-type-tree-input @callback="getBizType" clearable collapseTags multiple/>
  20 + </el-dropdown>
  21 + </el-form-item>
  22 + <el-form-item>
  23 + <el-button @click="handleQuery" :size="$global.elementConfig.size.button" type="primary">查询</el-button>
  24 + </el-form-item>
  25 + </el-form>
  26 + <el-button-group>
  27 + <el-button @click="handleBtnGroup('today')" :type="queryParams.time=='today'?'primary':''">今天</el-button>
  28 + <el-button @click="handleBtnGroup('week')" :type="queryParams.time=='week'?'primary':''">近7天</el-button>
  29 + <el-button @click="handleBtnGroup('month')" :type="queryParams.time=='month'?'primary':''">近30天</el-button>
  30 + <el-button @click="handleBtnGroup('quarter')" :type="queryParams.time=='quarter'?'primary':''">近90天</el-button>
  31 + <el-popover
  32 + v-model:visible="visiblePopover"
  33 + :width="420"
  34 + placement="bottom-end">
  35 + <template #reference>
  36 + <el-button @click="handleBtnGroup(4)" :type="queryParams.time!='today' && queryParams.time!='week' && queryParams.time!='month' && queryParams.time!='quarter'?'primary':''">自定义</el-button>
  37 + </template>
  38 + <el-date-picker
  39 + format="YYYY-MM-DD HH:mm:ss"
  40 + value-format="YYYY-MM-DD HH:mm:ss"
  41 + @change="handleChangeDatetime"
  42 + v-model="datetimerange"
  43 + type="datetimerange"
  44 + range-separator="-"
  45 + start-placeholder="开始时间"
  46 + end-placeholder="结束时间"
  47 + />
  48 + </el-popover>
  49 + </el-button-group>
  50 + </div>
  51 + </div>
  52 +
  53 + <el-row :gutter="20" style="padding: 3px 10px;">
  54 + <el-col :span="8">
  55 + <h3 style="text-align: left;color:#2b9eef;">资源类型快照量TOP5</h3>
  56 + <div ref="bizChartsRefs" style="width: 100%;height: 320px;border: 1px solid #e4e4e4;"></div>
  57 + </el-col>
  58 + <el-col :span="8">
  59 + <h3 style="text-align: left;color:#2b9eef;">业务系统快照量TOP5</h3>
  60 + <div ref="devChartsRefs" style="width: 100%;height: 320px;border: 1px solid #e4e4e4;"></div>
  61 + </el-col>
  62 + <el-col :span="8">
  63 + <h3 style="text-align: left;color:#2b9eef;">快照量</h3>
  64 + <div ref="snapshotChartsRefs" style="width: 100%;height: 320px;border: 1px solid #e4e4e4;"></div>
  65 + </el-col>
  66 + </el-row>
  67 +
  68 + <div class="search-table">
  69 + <h3 style="text-align: left;color:#2b9eef;">快照信息</h3>
  70 + <cm-table-page :columns="tableData.columns" :dataList="tableData.dataList"
  71 + :height="height - 550"
  72 + :loading="false"
  73 + :pageSize="queryParams.pageSize"
  74 + :showBorder="true"
  75 + :showIndex="true"
  76 + :showPage="true"
  77 + :showSelection="false"
  78 + :showTools="true"
  79 + :total="queryParams.count"
  80 + @loaddata="loaddata">
  81 + <template #default="{row,prop,column}">
  82 + <div v-if="prop == 'resName'">
  83 + <!-- 资源名称点击事件 -->
  84 + <el-tooltip placement="top">
  85 + <el-button @click.prevent="goResDetail(row)" size="small" type="text">
  86 + <span class="">{{row.resName}}</span>
  87 + </el-button>
  88 + <template #content>{{row.resName}}</template>
  89 + </el-tooltip>
  90 + </div>
  91 + <div v-if="prop == 'busTypeName'">
  92 + <div v-if="(row.busTypeName || '').split(',').length <= '3'">
  93 + <div v-if="row.busTypeName != null && row.busTypeName.indexOf(',') != -1" v-for="item in row.busTypeName.split(',')">
  94 + <el-tooltip placement="top">
  95 + <template #content>{{item}}</template>
  96 + <el-tag style="margin: 2px;" type="info" class="mx-1" effect="light">{{item}}</el-tag>
  97 + </el-tooltip>
  98 + </div>
  99 + <div v-else-if="row.busTypeName != null && row.busTypeName.indexOf(',') == -1 ">
  100 + <el-tooltip placement="top">
  101 + <template #content>{{row.busTypeName}}</template>
  102 + <el-tag type="info" class="mx-1" effect="light">{{row.busTypeName}}</el-tag>
  103 + </el-tooltip>
  104 + </div>
  105 + </div>
  106 + <div v-else>
  107 + <el-button @click="goBus(row)" size="small" type="text">
  108 + <span>共计:{{row.nickname.split(',').length}}个业务</span>
  109 + </el-button>
  110 + </div>
  111 + </div>
  112 + <div v-if="prop == 'nickname'">
  113 + <div v-if="(row.nickname || '').split(',').length <= '3'">
  114 + <div v-if="row.nickname != null && row.nickname.indexOf(',') != -1" v-for="item in row.nickname.split(',')">
  115 + <el-tooltip placement="top">
  116 + <template #content>{{item}}</template>
  117 + <el-tag style="margin: 2px;" type="info" class="mx-1" effect="light">{{item}}</el-tag>
  118 + </el-tooltip>
  119 + </div>
  120 + <div v-else-if="row.nickname != null && row.nickname.indexOf(',') == -1 ">
  121 + <el-tooltip placement="top">
  122 + <template #content>{{row.nickname}}</template>
  123 + <el-tag type="info" class="mx-1" effect="light">{{row.nickname}}</el-tag>
  124 + </el-tooltip>
  125 + </div>
  126 + </div>
  127 + <div v-else>
  128 + <el-button @click="goBus(row)" size="small" type="text">
  129 + <span>共计:{{row.nickname.split(',').length}}个业务负责人</span>
  130 + </el-button>
  131 + </div>
  132 + </div>
  133 + <div v-if="prop == 'admin'">
  134 + <div v-if="row.admin != null">
  135 + <el-tooltip placement="top">
  136 + <template #content>{{row.admin}}</template>
  137 + <el-tag type="info" class="mx-1" effect="light">{{row.admin}}</el-tag>
  138 + </el-tooltip>
  139 + </div>
  140 + </div>
  141 + <div v-if="prop == 'createUser'">
  142 + <div v-if="row.createUser != null">
  143 + <el-tooltip placement="top">
  144 + <template #content>{{row.createUser}}</template>
  145 + <el-tag type="info" class="mx-1" effect="light">{{row.createUser}}</el-tag>
  146 + </el-tooltip>
  147 + </div>
  148 + </div>
  149 + </template>
  150 + <template #tools="{scope}">
  151 + <div class="list-handle">
  152 + <span class="icon-bg" @click="handleDetail(scope.row)">
  153 + <i class="el-icon-document" title="详情"></i>
  154 + </span>
  155 + <span class="icon-bg"@click="handleDel(scope.row)">
  156 + <i class="el-icon-delete"></i>
  157 + </span>
  158 + </div>
  159 + </template>
  160 + </cm-table-page>
  161 + </div>
  162 + </div>
  163 +</div>
  164 +
  165 +<cm-dialog :showDialogVisible="showBus" :showFooter="false" :title="title" @hidedialog="cancelBtn"
  166 + width="700px">
  167 + <template v-slot>
  168 + <div class="dialog">
  169 + <div v-model="busType" v-for="item in busType" style="display: inline-block">
  170 + <el-tag type="info" class="mx-1" effect="light">{{item}}</el-tag>
  171 + </div>
  172 + </div>
  173 + </template>
  174 +</cm-dialog>
  1 +export default {
  2 + name:"snapshot",
  3 + template:"",
  4 + setup(props, {attrs, slots, emit}){
  5 + const {proxy} = Vue.getCurrentInstance();
  6 + let height = Vue.ref(window.innerHeight);
  7 + let formSize = Vue.ref('default');
  8 + let datetimerange = Vue.ref([]);
  9 + let visiblePopover = Vue.ref(false);
  10 + let queryParams = Vue.ref({
  11 + keyWord:'',
  12 + resType:'',
  13 + busId:'',
  14 + time:"today",
  15 + pageNum: 1,
  16 + pageSize: 10,
  17 + count:0,
  18 + })
  19 + let btnGroupType = Vue.ref(0);
  20 + //表格字段
  21 + let tableData = Vue.ref({
  22 + count: 0,
  23 + dataList: [],
  24 + columns: [
  25 + {
  26 + prop: 'resTypeName',
  27 + label: '资源类型',
  28 + sortable: true,
  29 + align: 'center',
  30 + width: '200',
  31 + },
  32 + {
  33 + prop: 'resName',
  34 + label: '资源名称',
  35 + sortable: true,
  36 + align: 'center'
  37 + },
  38 + {
  39 + prop: 'ip',
  40 + label: 'IP地址',
  41 + sortable: true,
  42 + align: 'center',
  43 + width: '130'
  44 + }, {
  45 + prop: 'admin',
  46 + label: '负责人',
  47 + sortable: true,
  48 + align: 'center',
  49 + width: '130'
  50 + }, {
  51 + prop: 'busTypeName',
  52 + label: '所属业务系统',
  53 + sortable: true,
  54 + align: 'center',
  55 + width: '270'
  56 + },
  57 + {
  58 + prop: 'nickname',
  59 + label: '业务系统负责人',
  60 + sortable: true,
  61 + align: 'center',
  62 + width: '150'
  63 + },
  64 + {
  65 + prop: 'createUser',
  66 + label: '快照创建人',
  67 + sortable: true,
  68 + align: 'center',
  69 + width: '130'
  70 + },
  71 + {
  72 + prop: 'createTime',
  73 + label: '快照创建时间',
  74 + sortable: true,
  75 + align: 'center',
  76 + width: '170'
  77 + },
  78 + ]
  79 + })
  80 +
  81 + let loaddata = ({page, limit}) => {
  82 + queryParams.value.pageNum = page;
  83 + queryParams.value.pageSize = limit;
  84 + getDataList();
  85 + getEchartsData();
  86 + }
  87 +
  88 + let getResType = (arr) => {
  89 + let types = arr.map(function (v) {
  90 + return v.id;
  91 + });
  92 + queryParams.value.resType = types.join(',');
  93 + }
  94 + let getBizType = (arr) => {
  95 + let types = arr.map(function (v) {
  96 + return v.busId;
  97 + });
  98 + queryParams.value.busId = types.join(',');
  99 + }
  100 +
  101 + // 获取列表
  102 + let getDataList = () => {
  103 + // console.log(queryParams.value);
  104 + proxy.$http.get(`/api-web/snapshot/manage/getList`,queryParams.value,(res)=>{
  105 + // console.log(res.data);
  106 + tableData.value.dataList = res.data;
  107 + queryParams.value.count = res.count;
  108 + },(err)=>{
  109 + console.log(err);
  110 + })
  111 + };
  112 + // 查询事件
  113 + let handleQuery = ()=> {
  114 + queryParams.value.pageSize=10;
  115 + queryParams.value.pageNum=1;
  116 + getDataList();
  117 + getEchartsData();
  118 + }
  119 + // 按钮组点击事件
  120 + let handleBtnGroup = (val)=>{
  121 + queryParams.value.time = val;
  122 + if (val == 4){
  123 + visiblePopover.value = !visiblePopover.value;
  124 + }else{
  125 + visiblePopover.value = false;
  126 + getDataList();
  127 + getEchartsData();
  128 + }
  129 + };
  130 +
  131 + // echarts
  132 + let bizChartsRefs = Vue.ref(null);
  133 + let devChartsRefs = Vue.ref(null);
  134 + let snapshotChartsRefs = Vue.ref(null);
  135 + let bizCharts = Vue.ref('')
  136 + let devCharts = Vue.ref('')
  137 + let snapshotCharts = Vue.ref('')
  138 + let showBus = Vue.ref(false);
  139 + let title = Vue.ref('');
  140 + let busType = Vue.ref();
  141 + let getEcharts = ()=>{
  142 + bizCharts = echarts.init(bizChartsRefs.value);
  143 + let bizOption = {
  144 + grid:{
  145 + top:"8%",
  146 + bottom:"8%",
  147 + left:"4%",
  148 + containLabel:true,
  149 + },
  150 + tooltip: {
  151 + trigger: 'axis',
  152 + axisPointer: {
  153 + type: 'shadow',
  154 + }
  155 + },
  156 + color:"#60a0f7",
  157 + xAxis: {
  158 + type: 'category',
  159 + data: [],
  160 + axisTick:false,
  161 + axisLabel: {
  162 + interval: 0,
  163 + formatter: val => {
  164 + // 一行字数
  165 + const max = 6
  166 + // 标签长度
  167 + const valLength = val.length
  168 + // 换行数
  169 + const rowNum = valLength / 6
  170 + if (valLength > 6) {
  171 + return val.slice(0,5) + '...';
  172 + } else {
  173 + return val
  174 + }
  175 + }
  176 + }
  177 + },
  178 + yAxis: {
  179 + type: 'value',
  180 + axisLine:{
  181 + show:true,
  182 + },
  183 + //分隔线样式
  184 + splitLine:{
  185 + show:true,
  186 + lineStyle:{
  187 + type:'dashed'
  188 + }
  189 + }
  190 + },
  191 + series: [
  192 + {
  193 + data: [],
  194 + type: 'bar',
  195 + barWidth: 26,//设置柱状图大小
  196 + itemStyle:{
  197 + borderRadius:[20,20,0,0]
  198 + }
  199 + }
  200 + ]
  201 + }
  202 + bizCharts.setOption(bizOption);
  203 +
  204 + devCharts = echarts.init(devChartsRefs.value);
  205 + let devOption = {
  206 + grid:{
  207 + top:"8%",
  208 + bottom:"8%",
  209 + left:"4%",
  210 + containLabel:true,
  211 + },
  212 + tooltip: {
  213 + trigger: 'axis',
  214 + axisPointer: {
  215 + type: 'shadow',
  216 + }
  217 + },
  218 + color:"#60a0f7",
  219 + xAxis: {
  220 + type: 'category',
  221 + data: [],
  222 + axisTick:false,
  223 + axisLabel: {
  224 + interval: 0,
  225 + formatter: val => {
  226 + // 一行字数
  227 + const max = 6
  228 + // 标签长度
  229 + const valLength = val.length
  230 + // 换行数
  231 + const rowNum = valLength / 6
  232 + if (valLength > 6) {
  233 + return val.slice(0,5) + '...';
  234 + } else {
  235 + return val
  236 + }
  237 + }
  238 + }
  239 + },
  240 + yAxis: {
  241 + type: 'value',
  242 + axisLine:{
  243 + show:true,
  244 + },
  245 + //分隔线样式
  246 + splitLine:{
  247 + show:true,
  248 + lineStyle:{
  249 + type:'dashed'
  250 + }
  251 + }
  252 + },
  253 + series: [
  254 + {
  255 + data: [],
  256 + type: 'bar',
  257 + barWidth: 26,//设置柱状图大小
  258 + itemStyle:{
  259 + borderRadius:[20,20,0,0]
  260 + }
  261 + }
  262 + ]
  263 + }
  264 + devCharts.setOption(devOption);
  265 +
  266 + snapshotCharts = echarts.init(snapshotChartsRefs.value);
  267 + let shapshotOption = {
  268 + grid:{
  269 + top:"8%",
  270 + bottom:"8%",
  271 + left:"4%",
  272 + containLabel:true,
  273 + },
  274 + tooltip: {
  275 + trigger: 'axis',
  276 + axisPointer: {
  277 + type: 'shadow',
  278 + }
  279 + },
  280 + color:"#60a0f7",
  281 + xAxis: {
  282 + type: 'category',
  283 + data: [],
  284 + axisTick:false,
  285 + },
  286 + yAxis: {
  287 + type: 'value',
  288 + axisLine:{
  289 + show:true,
  290 + },
  291 + //分隔线样式
  292 + splitLine:{
  293 + show:true,
  294 + lineStyle:{
  295 + type:'dashed'
  296 + }
  297 + }
  298 + },
  299 + series: [
  300 + {
  301 + data: [],
  302 + type: 'bar',
  303 + barWidth: 26,//设置柱状图大小
  304 + itemStyle:{
  305 + borderRadius:[20,20,0,0]
  306 + }
  307 + }
  308 + ]
  309 + }
  310 + snapshotCharts.setOption(shapshotOption);
  311 + }
  312 +
  313 + let getEchartsData = ()=>{
  314 + let resTypeData = {
  315 + xaxis:[],
  316 + yaxis:[],
  317 + }
  318 + proxy.$http.get(`/api-web/snapshot/manage/resTypeTop`,queryParams.value,(res)=>{
  319 + // console.log(res.object);
  320 + res.object.forEach(item=>{
  321 + resTypeData.xaxis.push(item.xaxis);
  322 + resTypeData.yaxis.push(item.yaxis)
  323 + })
  324 + bizCharts.setOption({
  325 + xAxis:{
  326 + data:resTypeData.xaxis,
  327 + },
  328 + series:[
  329 + {
  330 + data:resTypeData.yaxis
  331 + }
  332 + ]
  333 + });
  334 + },(err)=>{
  335 + console.log(err);
  336 + })
  337 +
  338 + let busTypeData = {
  339 + xaxis:[],
  340 + yaxis:[],
  341 + }
  342 + proxy.$http.get(`/api-web/snapshot/manage/busTop`,queryParams.value,(res)=>{
  343 + // console.log(res.object);
  344 + res.object.forEach(item=>{
  345 + busTypeData.xaxis.push(item.xaxis);
  346 + busTypeData.yaxis.push(item.yaxis)
  347 + })
  348 + devCharts.setOption({
  349 + xAxis:{
  350 + data:busTypeData.xaxis,
  351 + },
  352 + series:[
  353 + {
  354 + data:busTypeData.yaxis
  355 + }
  356 + ]
  357 + });
  358 + },(err)=>{
  359 + console.log(err);
  360 + })
  361 +
  362 + let snapshotNumData = {
  363 + xaxis:[],
  364 + yaxis:[],
  365 + }
  366 + proxy.$http.get(`/api-web/snapshot/manage/snapshotNum`,queryParams.value,(res)=>{
  367 + // console.log(res.object);
  368 + res.object.forEach(item=>{
  369 + snapshotNumData.xaxis.push(item.xaxis);
  370 + snapshotNumData.yaxis.push(item.yaxis)
  371 + })
  372 + snapshotCharts.setOption({
  373 + xAxis:{
  374 + data:snapshotNumData.xaxis,
  375 + },
  376 + series:[
  377 + {
  378 + data:snapshotNumData.yaxis
  379 + }
  380 + ]
  381 + });
  382 + },(err)=>{
  383 + console.log(err);
  384 + })
  385 + }
  386 +
  387 + // 时间范围快捷键 修改事件
  388 + let handleChangeDatetime = (value)=>{
  389 + visiblePopover.value = false;
  390 + queryParams.value.time = value.join(',');
  391 + getDataList();
  392 + getEchartsData();
  393 + }
  394 +
  395 + // 表格删除事件
  396 + let handleDel = (row)=>{
  397 + // console.log(row);
  398 + proxy.$global.confirm("确认删除吗?", function () {
  399 + deleteItems([row.resId],[row.batchNo]);
  400 + })
  401 + }
  402 + //删除
  403 + let deleteItems = (ids,nos) => {
  404 + let params = {
  405 + resId: ids.toString(),
  406 + batchNo:nos.toString(),
  407 + }
  408 + proxy.$http.get('/api-web/snapshot/his/delete', params, function (res) {
  409 + if (res && res.success) {
  410 + proxy.$global.showMsg('删除成功');
  411 + handleQuery()
  412 + }
  413 + })
  414 + }
  415 +
  416 + //快照详情
  417 + let handleDetail = (row)=>{
  418 + // console.log(row);
  419 + // proxy.$global.openNewWin('template/detail/snapshot_detail_v1', "快照详情", {resId:row.resId,'batchNo':row.batchNo},false);
  420 + proxy.$global.openNewWin('template/detail/snapshot_detail', row.createUser+'在'+row.createTime+'创建的'+row.resName+'的快照', {resId:row.resId,'batchNo':row.batchNo},false);
  421 + }
  422 +
  423 + //查看资源详情
  424 + let goResDetail = (row) => {
  425 + proxy.$global.openDetail(row.resId, row.resType, proxy);
  426 + }
  427 +
  428 + //查看业务系统
  429 + let goBus = (row) => {
  430 + title.value = row.resName+'所属业务系统信息';
  431 + let busTypeAdmin = [];
  432 + for (let i = 0; i < row.busTypeName.split(',').length; i++) {
  433 + for (let j = 0; j < row.nickname.split(',').length; j++) {
  434 + if (i==j){
  435 + busTypeAdmin.push(row.busTypeName.split(',')[i]+'('+row.nickname.split(',')[i]+')')
  436 + }
  437 + }
  438 + }
  439 + busType.value = busTypeAdmin;
  440 + showBus.value = true;
  441 +
  442 + }
  443 + //关闭弹框
  444 + let cancelBtn = () => {
  445 + showBus.value = false;
  446 + }
  447 +
  448 + Vue.onMounted(()=>{
  449 + getEcharts();
  450 + getDataList();
  451 + getEchartsData();
  452 + })
  453 +
  454 + return{
  455 + height,
  456 + formSize,
  457 + queryParams,
  458 + tableData,
  459 + btnGroupType,
  460 + bizChartsRefs,
  461 + devChartsRefs,
  462 + snapshotChartsRefs,
  463 + handleBtnGroup,
  464 + datetimerange,
  465 + visiblePopover,
  466 + handleChangeDatetime,
  467 + getResType,
  468 + getBizType,
  469 + handleQuery,
  470 + loaddata,
  471 + handleDel,
  472 + handleDetail,
  473 + goResDetail,
  474 + goBus,
  475 + showBus,
  476 + cancelBtn,
  477 + title,
  478 + busType
  479 + }
  480 + }
  481 +}
  1 +<div class="container" :style="{'height':height+'px','max-height':height+'px','padding':'10px 0 10px 10px','background':'#fff','box-sizing':'border-box'}">
  2 + <div class="cm-card" :style="{'min-height':height+'px','max-height':height+'px','height':'100%','padding-top':'3px'}">
  3 + <div class="search">
  4 + <div class="condition esData-conditon" style="justify-content: space-between;width: 100%;">
  5 + <el-form :inline="true">
  6 + <el-form-item>
  7 + <el-tooltip placement="bottom-start">
  8 + <template #content> 资源名称 <br /> 资源ip <br /> 业务名称</template>
  9 + <el-input clearable :size="$global.elementConfig.size.input" v-model="queryParams.keyWord" placeholder="关键字检索" />
  10 + </el-tooltip>
  11 + </el-form-item>
  12 + <el-form-item>
  13 + <el-dropdown>
  14 + <cm-res-type-tree-input @callback="getResType" clearable collapseTags multiple/>
  15 + </el-dropdown>
  16 + </el-form-item>
  17 + <el-form-item>
  18 + <el-dropdown>
  19 + <cm-biz-type-tree-input @callback="getBizType" clearable collapseTags multiple/>
  20 + </el-dropdown>
  21 + </el-form-item>
  22 + <el-form-item>
  23 + <el-dropdown>
  24 + <cm-user-type-tree-input @callback="getUser" clearable collapseTags multiple/>
  25 + </el-dropdown>
  26 + </el-form-item>
  27 + <el-form-item>
  28 + <el-button @click="handleQuery" :size="$global.elementConfig.size.button" type="primary">查询</el-button>
  29 + </el-form-item>
  30 + </el-form>
  31 + <el-button-group>
  32 + <el-button @click="handleBtnGroup('today')" :type="queryParams.time=='today'?'primary':''">今天</el-button>
  33 + <el-button @click="handleBtnGroup('week')" :type="queryParams.time=='week'?'primary':''">近7天</el-button>
  34 + <el-button @click="handleBtnGroup('month')" :type="queryParams.time=='month'?'primary':''">近30天</el-button>
  35 + <el-button @click="handleBtnGroup('quarter')" :type="queryParams.time=='quarter'?'primary':''">近90天</el-button>
  36 + <el-popover
  37 + v-model:visible="visiblePopover"
  38 + :width="420"
  39 + placement="bottom-end">
  40 + <template #reference>
  41 + <el-button @click="handleBtnGroup(4)" :type="queryParams.time!='today' && queryParams.time!='week' && queryParams.time!='month' && queryParams.time!='quarter'?'primary':''">自定义</el-button>
  42 + </template>
  43 + <el-date-picker
  44 + format="YYYY-MM-DD HH:mm:ss"
  45 + value-format="YYYY-MM-DD HH:mm:ss"
  46 + @change="handleChangeDatetime"
  47 + v-model="datetimerange"
  48 + type="datetimerange"
  49 + range-separator="-"
  50 + start-placeholder="开始时间"
  51 + end-placeholder="结束时间"
  52 + />
  53 + </el-popover>
  54 + </el-button-group>
  55 + </div>
  56 + </div>
  57 +
  58 + <el-row :gutter="20" style="padding: 3px 10px;">
  59 + <el-col :span="12">
  60 + <h3 style="text-align: left;color:#2b9eef;">资源类型快照量TOP5</h3>
  61 + <div ref="bizChartsRefs" style="width: 100%;height: 320px;border: 1px solid #e4e4e4;"></div>
  62 + </el-col>
  63 + <el-col :span="12">
  64 + <h3 style="text-align: left;color:#2b9eef;">业务系统快照量TOP5</h3>
  65 + <div ref="devChartsRefs" style="width: 100%;height: 320px;border: 1px solid #e4e4e4;"></div>
  66 + </el-col>
  67 + <el-col :span="12">
  68 + <h3 style="text-align: left;color:#2b9eef;">人员快照量</h3>
  69 + <div ref="peopleSSChartsRefs" style="width: 100%;height: 320px;border: 1px solid #e4e4e4;"></div>
  70 + </el-col>
  71 + <el-col :span="12">
  72 + <h3 style="text-align: left;color:#2b9eef;">快照量</h3>
  73 + <div ref="snapshotChartsRefs" style="width: 100%;height: 320px;border: 1px solid #e4e4e4;"></div>
  74 + </el-col>
  75 + </el-row>
  76 +
  77 +
  78 + <div class="search-table">
  79 + <h3 style="text-align: left;color:#2b9eef;">快照信息</h3>
  80 + <cm-table-page :columns="tableData.columns" :dataList="tableData.dataList"
  81 + :height="height - 423"
  82 + :loading="false"
  83 + :pageSize="queryParams.pageSize"
  84 + :showBorder="true"
  85 + :showIndex="true"
  86 + :showPage="true"
  87 + :showSelection="false"
  88 + :showTools="true"
  89 + :total="queryParams.count"
  90 + @loaddata="loaddata">
  91 + <template #default="{row,prop,column}">
  92 + <div v-if="prop == 'resName'">
  93 + <!-- 资源名称点击事件 -->
  94 + <el-tooltip placement="top">
  95 + <el-button @click.prevent="goResDetail(row)" size="small" type="text">
  96 + <span class="">{{row.resName}}</span>
  97 + </el-button>
  98 + <template #content>{{row.resName}}</template>
  99 + </el-tooltip>
  100 + </div>
  101 + <div v-if="prop == 'busTypeName'">
  102 + <div v-if="(row.busTypeName || '').split(',').length <= '3'">
  103 + <div v-if="row.busTypeName != null && row.busTypeName.indexOf(',') != -1" v-for="item in row.busTypeName.split(',')">
  104 + <el-tooltip placement="top">
  105 + <template #content>{{item}}</template>
  106 + <el-tag style="margin: 2px;" type="info" class="mx-1" effect="light">{{item}}</el-tag>
  107 + </el-tooltip>
  108 + </div>
  109 + <div v-else-if="row.busTypeName != null && row.busTypeName.indexOf(',') == -1 ">
  110 + <el-tooltip placement="top">
  111 + <template #content>{{row.busTypeName}}</template>
  112 + <el-tag type="info" class="mx-1" effect="light">{{row.busTypeName}}</el-tag>
  113 + </el-tooltip>
  114 + </div>
  115 + </div>
  116 + <div v-else>
  117 + <el-button @click="goBus(row)" size="small" type="text">
  118 + <span>共计:{{row.nickname.split(',').length}}个业务</span>
  119 + </el-button>
  120 + </div>
  121 + </div>
  122 + <div v-if="prop == 'nickname'">
  123 + <div v-if="(row.nickname || '').split(',').length <= '3'">
  124 + <div v-if="row.nickname != null && row.nickname.indexOf(',') != -1" v-for="item in row.nickname.split(',')">
  125 + <el-tooltip placement="top">
  126 + <template #content>{{item}}</template>
  127 + <el-tag style="margin: 2px;" type="info" class="mx-1" effect="light">{{item}}</el-tag>
  128 + </el-tooltip>
  129 + </div>
  130 + <div v-else-if="row.nickname != null && row.nickname.indexOf(',') == -1 ">
  131 + <el-tooltip placement="top">
  132 + <template #content>{{row.nickname}}</template>
  133 + <el-tag type="info" class="mx-1" effect="light">{{row.nickname}}</el-tag>
  134 + </el-tooltip>
  135 + </div>
  136 + </div>
  137 + <div v-else>
  138 + <el-button @click="goBus(row)" size="small" type="text">
  139 + <span>共计:{{row.nickname.split(',').length}}个业务负责人</span>
  140 + </el-button>
  141 + </div>
  142 + </div>
  143 + <div v-if="prop == 'admin'">
  144 + <div v-if="row.admin != null">
  145 + <el-tooltip placement="top">
  146 + <template #content>{{row.admin}}</template>
  147 + <el-tag type="info" class="mx-1" effect="light">{{row.admin}}</el-tag>
  148 + </el-tooltip>
  149 + </div>
  150 + </div>
  151 + <div v-if="prop == 'createUser'">
  152 + <div v-if="row.createUser != null">
  153 + <el-tooltip placement="top">
  154 + <template #content>{{row.createUser}}</template>
  155 + <el-tag type="info" class="mx-1" effect="light">{{row.createUser}}</el-tag>
  156 + </el-tooltip>
  157 + </div>
  158 + </div>
  159 + </template>
  160 + <template #tools="{scope}">
  161 + <div class="list-handle">
  162 + <span class="icon-bg" @click="handleDetail(scope.row)">
  163 + <i class="el-icon-document" title="详情"></i>
  164 + </span>
  165 + </div>
  166 + </template>
  167 + </cm-table-page>
  168 + </div>
  169 + </div>
  170 +</div>
  171 +
  172 +<cm-dialog :showDialogVisible="showBus" :showFooter="false" :title="title" @hidedialog="cancelBtn"
  173 + width="700px">
  174 + <template v-slot>
  175 + <div class="dialog">
  176 + <div v-model="busType" v-for="item in busType" style="display: inline-block">
  177 + <el-tag type="info" class="mx-1" effect="light">{{item}}</el-tag>
  178 + </div>
  179 + </div>
  180 + </template>
  181 +</cm-dialog>
  182 +
  1 +export default {
  2 + name:"snapshotOverview",
  3 + template:"",
  4 + setup(props,{attrs,slots,emit}){
  5 + const {proxy} = Vue.getCurrentInstance();
  6 + let height = Vue.ref(window.innerHeight);
  7 + let btnGroupType = Vue.ref(0);
  8 + let datetimerange = Vue.ref([]);
  9 + let visiblePopover = Vue.ref(false);
  10 + let queryParams = Vue.ref({
  11 + keyWord:'',
  12 + resType:'',
  13 + busId:'',
  14 + userName:'',
  15 + time:"today",
  16 + pageNum: 1,
  17 + pageSize: 10,
  18 + count:0,
  19 + })
  20 + //表格字段
  21 + let tableData = Vue.ref({
  22 + dataList: [],
  23 + columns: [
  24 + {
  25 + prop: 'resTypeName',
  26 + label: '资源类型',
  27 + sortable: true,
  28 + align: 'center',
  29 + width: '200',
  30 + },
  31 + {
  32 + prop: 'resName',
  33 + label: '资源名称',
  34 + sortable: true,
  35 + align: 'center'
  36 + },
  37 + {
  38 + prop: 'ip',
  39 + label: 'IP地址',
  40 + sortable: true,
  41 + align: 'center',
  42 + width: '130'
  43 + }, {
  44 + prop: 'admin',
  45 + label: '负责人',
  46 + sortable: true,
  47 + align: 'center',
  48 + width: '130'
  49 + }, {
  50 + prop: 'busTypeName',
  51 + label: '所属业务系统',
  52 + sortable: true,
  53 + align: 'center',
  54 + width: '270'
  55 + },
  56 + {
  57 + prop: 'nickname',
  58 + label: '业务系统负责人',
  59 + sortable: true,
  60 + align: 'center',
  61 + width: '150'
  62 + },
  63 + {
  64 + prop: 'createUser',
  65 + label: '快照创建人',
  66 + sortable: true,
  67 + align: 'center',
  68 + width: '130'
  69 + },
  70 + {
  71 + prop: 'createTime',
  72 + label: '快照创建时间',
  73 + sortable: true,
  74 + align: 'center',
  75 + width: '170'
  76 + },
  77 + ]
  78 + })
  79 +
  80 + let loaddata = ({page, limit}) => {
  81 + queryParams.value.pageNum = page;
  82 + queryParams.value.pageSize = limit;
  83 + getDataList();
  84 + }
  85 + // 获取列表
  86 + let getDataList = () => {
  87 + proxy.$http.get(`/api-web/snapshot/overview/getList`,queryParams.value,(res)=>{
  88 + tableData.value.dataList = res.data;
  89 + queryParams.value.count = res.count;
  90 + },(err)=>{
  91 + console.log(err);
  92 + })
  93 + };
  94 +
  95 + let getEchartsData = ()=>{
  96 + let resTypeData = {
  97 + xaxis:[],
  98 + yaxis:[],
  99 + }
  100 + proxy.$http.get(`/api-web/snapshot/overview/resTypeTop`,queryParams.value,(res)=>{
  101 + res.object.forEach(item=>{
  102 + resTypeData.xaxis.push(item.xaxis);
  103 + resTypeData.yaxis.push(item.yaxis)
  104 + })
  105 + bizCharts.setOption({
  106 + xAxis:{
  107 + data:resTypeData.xaxis,
  108 + },
  109 + series:[
  110 + {
  111 + data:resTypeData.yaxis
  112 + }
  113 + ]
  114 + });
  115 + },(err)=>{
  116 + console.log(err);
  117 + })
  118 +
  119 + let busTypeData = {
  120 + xaxis:[],
  121 + yaxis:[],
  122 + }
  123 + proxy.$http.get(`/api-web/snapshot/overview/busTop`,queryParams.value,(res)=>{
  124 + res.object.forEach(item=>{
  125 + busTypeData.xaxis.push(item.xaxis);
  126 + busTypeData.yaxis.push(item.yaxis)
  127 + })
  128 + devCharts.setOption({
  129 + xAxis:{
  130 + data:busTypeData.xaxis,
  131 + },
  132 + series:[
  133 + {
  134 + data:busTypeData.yaxis
  135 + }
  136 + ]
  137 + });
  138 + },(err)=>{
  139 + console.log(err);
  140 + })
  141 +
  142 + let snapshotNumData = {
  143 + xaxis:[],
  144 + yaxis:[],
  145 + }
  146 + proxy.$http.get(`/api-web/snapshot/overview/snapshotNum`,queryParams.value,(res)=>{
  147 + res.object.forEach(item=>{
  148 + snapshotNumData.xaxis.push(item.xaxis);
  149 + snapshotNumData.yaxis.push(item.yaxis)
  150 + })
  151 + snapshotCharts.setOption({
  152 + yAxis:{
  153 + data:snapshotNumData.xaxis,
  154 + },
  155 + series:[
  156 + {
  157 + data:snapshotNumData.yaxis
  158 + }
  159 + ]
  160 + });
  161 + },(err)=>{
  162 + console.log(err);
  163 + })
  164 +
  165 + var peopleSSChartsData = [];
  166 + proxy.$http.get(`/api-web/snapshot/overview/snapshotNumByUser`,queryParams.value,(res)=>{
  167 + res.object.forEach(item=>{
  168 + let list = {};
  169 + list.name = item.xaxis + '('+item.yaxis+ ')';
  170 + list.value = item.yaxis;
  171 + peopleSSChartsData.push(list);
  172 + })
  173 + console.log(peopleSSChartsData);
  174 + peopleSSCharts.setOption({
  175 + series:[
  176 + {
  177 + data:peopleSSChartsData
  178 + }
  179 + ]
  180 + });
  181 + },(err)=>{
  182 + console.log(err);
  183 + })
  184 + }
  185 + // 查询事件
  186 + let handleQuery = ()=> {
  187 + queryParams.value.pageSize=10;
  188 + queryParams.value.pageNum=1;
  189 + getDataList();
  190 + getEchartsData();
  191 + }
  192 + let getResType = (arr) => {
  193 + let types = arr.map(function (v) {
  194 + return v.id;
  195 + });
  196 + queryParams.value.resType = types.join(',');
  197 + }
  198 + let getBizType = (arr) => {
  199 + let types = arr.map(function (v) {
  200 + return v.busId;
  201 + });
  202 + queryParams.value.busId = types.join(',');
  203 + }
  204 + let getUser = (arr) => {
  205 + let types = arr.map(function (v) {
  206 + return v.username;
  207 + });
  208 + queryParams.value.userName = types.join(',');
  209 + }
  210 +
  211 + // 按钮组点击事件
  212 + let handleBtnGroup = (val)=>{
  213 + queryParams.value.time = val;
  214 + if (val == 4){
  215 + visiblePopover.value = !visiblePopover.value;
  216 + }else{
  217 + visiblePopover.value = false;
  218 + getDataList();
  219 + getEchartsData();
  220 + }
  221 + };
  222 +
  223 + // echarts
  224 + let bizChartsRefs = Vue.ref(null);
  225 + let devChartsRefs = Vue.ref(null);
  226 + let snapshotChartsRefs = Vue.ref(null);
  227 + let peopleSSChartsRefs = Vue.ref(null);
  228 + let bizCharts = Vue.ref('');
  229 + let devCharts = Vue.ref('');
  230 + let snapshotCharts = Vue.ref('');
  231 + let peopleSSCharts = Vue.ref('');
  232 + let showBus = Vue.ref(false);
  233 + let title = Vue.ref('');
  234 + let busType = Vue.ref();
  235 + let getEcharts = ()=>{
  236 + bizCharts = echarts.init(bizChartsRefs.value);
  237 + let bizOption = {
  238 + grid:{
  239 + top:"8%",
  240 + bottom:"4%",
  241 + left:"2%",
  242 + containLabel:true,
  243 + },
  244 + tooltip: {
  245 + trigger: 'axis',
  246 + axisPointer: {
  247 + type: 'shadow',
  248 + }
  249 + },
  250 + color:"#60a0f7",
  251 + xAxis: {
  252 + type: 'category',
  253 + data: [],
  254 + axisTick:false,
  255 + axisLabel: {
  256 + interval: 0,
  257 + formatter: val => {
  258 + // 标签长度
  259 + const valLength = val.length
  260 + if (valLength > 8) {
  261 + return val.slice(0,7) + '...';
  262 + } else {
  263 + return val
  264 + }
  265 + }
  266 + }
  267 + },
  268 + yAxis: {
  269 + type: 'value',
  270 + axisLine:{
  271 + show:true,
  272 + },
  273 + //分隔线样式
  274 + splitLine:{
  275 + show:true,
  276 + lineStyle:{
  277 + type:'dashed'
  278 + }
  279 + }
  280 + },
  281 + series: [
  282 + {
  283 + data: [],
  284 + type: 'bar',
  285 + barWidth: 26,//设置柱状图大小
  286 + itemStyle:{
  287 + borderRadius:[20,20,0,0]
  288 + }
  289 + }
  290 + ]
  291 + }
  292 + bizCharts.setOption(bizOption);
  293 +
  294 + devCharts = echarts.init(devChartsRefs.value);
  295 + let devOption = {
  296 + grid:{
  297 + top:"8%",
  298 + bottom:"4%",
  299 + left:"2%",
  300 + containLabel:true,
  301 + },
  302 + tooltip: {
  303 + trigger: 'axis',
  304 + axisPointer: {
  305 + type: 'shadow',
  306 + }
  307 + },
  308 + color:"#60a0f7",
  309 + xAxis: {
  310 + type: 'category',
  311 + data: [],
  312 + axisTick:false,
  313 + axisLabel: {
  314 + interval: 0,
  315 + formatter: val => {
  316 + // 标签长度
  317 + const valLength = val.length
  318 + if (valLength > 8) {
  319 + return val.slice(0,7) + '...';
  320 + } else {
  321 + return val
  322 + }
  323 + }
  324 + }
  325 + },
  326 + yAxis: {
  327 + type: 'value',
  328 + axisLine:{
  329 + show:true,
  330 + },
  331 + //分隔线样式
  332 + splitLine:{
  333 + show:true,
  334 + lineStyle:{
  335 + type:'dashed'
  336 + }
  337 + }
  338 + },
  339 + series: [
  340 + {
  341 + data: [],
  342 + type: 'bar',
  343 + barWidth: 26,//设置柱状图大小
  344 + itemStyle:{
  345 + borderRadius:[20,20,0,0]
  346 + }
  347 + }
  348 + ]
  349 + }
  350 + devCharts.setOption(devOption);
  351 +
  352 + snapshotCharts = echarts.init(snapshotChartsRefs.value);
  353 + let shapshotOption = {
  354 + grid:{
  355 + top:"8%",
  356 + bottom:"8%",
  357 + left:"2%",
  358 + containLabel:true,
  359 + },
  360 + tooltip: {
  361 + trigger: 'axis',
  362 + axisPointer: {
  363 + type: 'shadow',
  364 + }
  365 + },
  366 + color:"#EF8166",
  367 + xAxis: {
  368 + type: 'value',
  369 + axisLine:{
  370 + show:true,
  371 + },
  372 + //分隔线样式
  373 + splitLine:{
  374 + show:true,
  375 + lineStyle:{
  376 + type:'dashed'
  377 + }
  378 + }
  379 + },
  380 + yAxis: {
  381 + type: 'category',
  382 + data: [],
  383 + axisTick:false,
  384 + },
  385 + series: [
  386 + {
  387 + data: [],
  388 + type: 'bar',
  389 + barWidth: 26,//设置柱状图大小
  390 + itemStyle:{
  391 + borderRadius:[0,20,20,0]
  392 + }
  393 + }
  394 + ]
  395 + }
  396 + snapshotCharts.setOption(shapshotOption);
  397 +
  398 + peopleSSCharts = echarts.init(peopleSSChartsRefs.value);
  399 + let peopleOption = {
  400 + grid:{
  401 + top:"14%",
  402 + bottom:"8%"
  403 + },
  404 + //color:"#60a0f7",
  405 + tooltip: {
  406 + trigger: 'item'
  407 + },
  408 + legend: {
  409 + orient: 'vertical',
  410 + top:"middle",
  411 + right:"10%",
  412 + itemWidth:35,
  413 + icon:"rect",
  414 + },
  415 + series: [
  416 + {
  417 + data: [],
  418 + center: ['40%', '50%'],
  419 + type: 'pie',
  420 + //高亮状态的扇区和标签样式。
  421 + emphasis: {
  422 + label: {
  423 + show: true
  424 + },
  425 + itemStyle: {
  426 + shadowBlur: 10,
  427 + shadowOffsetX: 0,
  428 + shadowColor: 'rgba(0, 0, 0, 0.5)'
  429 + }
  430 + },
  431 + label: {
  432 + show: false
  433 + },
  434 + }
  435 + ]
  436 + }
  437 + peopleSSCharts.setOption(peopleOption);
  438 + }
  439 + // 表格删除事件
  440 + let handleDel = (row)=>{
  441 + // console.log(row);
  442 + proxy.$global.confirm("确认删除吗?", function () {
  443 + deleteItems([row.resId],[row.batchNo]);
  444 + })
  445 + }
  446 + //删除
  447 + let deleteItems = (ids,nos) => {
  448 + let params = {
  449 + resId: ids.toString(),
  450 + batchNo:nos.toString(),
  451 + }
  452 + proxy.$http.get('/api-web/snapshot/his/delete', params, function (res) {
  453 + if (res && res.success) {
  454 + proxy.$global.showMsg('删除成功');
  455 + handleQuery();
  456 + }
  457 + })
  458 + }
  459 + //快照详情
  460 + let handleDetail = (row)=>{
  461 + proxy.$global.openNewWin('template/detail/snapshot_detail', row.createUser+'在'+row.createTime+'创建的'+row.resName+'的快照', {resId:row.resId,'batchNo':row.batchNo},false);
  462 + }
  463 +
  464 +
  465 + //查看业务系统
  466 + let goBus = (row) => {
  467 + title.value = row.resName+'所属业务系统信息';
  468 + let busTypeAdmin = [];
  469 + for (let i = 0; i < row.busTypeName.split(',').length; i++) {
  470 + for (let j = 0; j < row.nickname.split(',').length; j++) {
  471 + if (i==j){
  472 + busTypeAdmin.push(row.busTypeName.split(',')[i]+'('+row.nickname.split(',')[i]+')')
  473 + }
  474 + }
  475 + }
  476 + busType.value = busTypeAdmin;
  477 + showBus.value = true;
  478 +
  479 + }
  480 + //关闭弹框
  481 + let cancelBtn = () => {
  482 + showBus.value = false;
  483 + }
  484 +
  485 + //查看资源详情
  486 + let goResDetail = (row) => {
  487 + proxy.$global.openDetail(row.resId, row.resType, proxy);
  488 + }
  489 +
  490 + // 时间范围快捷键 修改事件
  491 + let handleChangeDatetime = (value)=>{
  492 + visiblePopover.value = false;
  493 + queryParams.value.time = value.join(',');
  494 + getDataList();
  495 + getEchartsData();
  496 + }
  497 +
  498 +
  499 +
  500 + Vue.onMounted(()=>{
  501 + getEcharts();
  502 + getEchartsData();
  503 + getDataList();
  504 + })
  505 +
  506 + return {
  507 + height,
  508 + tableData,
  509 + queryParams,
  510 + btnGroupType,
  511 + loaddata,
  512 + handleBtnGroup,
  513 + bizChartsRefs,
  514 + devChartsRefs,
  515 + snapshotChartsRefs,
  516 + peopleSSChartsRefs,
  517 + datetimerange,
  518 + visiblePopover,
  519 + handleChangeDatetime,
  520 + handleDel,
  521 + goResDetail,
  522 + handleDetail,
  523 + goBus,
  524 + showBus,
  525 + cancelBtn,
  526 + title,
  527 + busType,
  528 + getResType,
  529 + getBizType,
  530 + handleQuery,
  531 + getUser
  532 + }
  533 + }
  534 +}
@@ -1135,6 +1135,8 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', @@ -1135,6 +1135,8 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
1135 }); 1135 });
1136 //告警级别 1136 //告警级别
1137 form.on('select(alarmLevelSearch)', function (data) { 1137 form.on('select(alarmLevelSearch)', function (data) {
  1138 + //lsq 切换告警级别时,获取统计告警量接口的参数更改 2022-08-08
  1139 + alarmLevel = $("#alarmLevelSearchBox").val()
1138 reloadTable(); 1140 reloadTable();
1139 }); 1141 });
1140 // 告警确认 1142 // 告警确认
@@ -921,6 +921,8 @@ @@ -921,6 +921,8 @@
921 class="layui-btn layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click"> 921 class="layui-btn layui-btn-danger layui-bg-red layui-btn-radius layui-btn-xs p-0-15 cant-click">
922 失败 922 失败
923 </button>`; 923 </button>`;
  924 + /*lsq 连接失败时tips显示连接失败 2022-08-08*/
  925 + linkStateTips='连接失败';
924 } 926 }
925 } 927 }
926 }} 928 }}
@@ -244,6 +244,24 @@ const routes = [{ @@ -244,6 +244,24 @@ const routes = [{
244 name: 'busyConfig', 244 name: 'busyConfig',
245 component: () => myImport('views/busyConfig/index') 245 component: () => myImport('views/busyConfig/index')
246 }, 246 },
  247 + //快照管理
  248 + {
  249 + path: '/vue3/snapshot',
  250 + name: 'snapshot',
  251 + component: () => myImport('views/snapshot/index')
  252 + },
  253 + //快照历史
  254 + {
  255 + path: '/vue3/snapshot/history',
  256 + name: 'snapshotHistory',
  257 + component: () => myImport('views/snapshot/history/index')
  258 + },
  259 + //快照概览
  260 + {
  261 + path: '/vue3/snapshotOverview',
  262 + name: 'snapshotOverview',
  263 + component: () => myImport('views/snapshotOverview/index')
  264 + },
247 ]; 265 ];
248 266
249 // hash模式: createWebHashHistory 267 // hash模式: createWebHashHistory