Merge branch 'master-mj-yuanjinpeng' into 'master-mj'
fix:数据库恢复验证概况优化 See merge request !1153
Showing
5 changed files
with
350 additions
and
2 deletions
1 | +/** 应急演练 */ | ||
2 | +layui.define(['table', 'form', 'sessions', 'admin', 'common', 'echarts', 'laydate', 'element'], function (exports) { | ||
3 | + var $ = layui.$; | ||
4 | + var form = layui.form; | ||
5 | + var table = layui.table; | ||
6 | + var admin = layui.admin; | ||
7 | + var common = layui.common; | ||
8 | + var laydate = layui.laydate; | ||
9 | + | ||
10 | + exports('prediction', function () { | ||
11 | + var sessions = layui.sessions; | ||
12 | + var accessToken = localStorage.getItem("accessToken"); | ||
13 | + var domainName = common.domainName; | ||
14 | + | ||
15 | + form.render(); | ||
16 | + renderpredictionListTable(); | ||
17 | + | ||
18 | + // 回车搜索 | ||
19 | + $('[lay-filter="form-prediction-condition"] input').keydown(function (e) { | ||
20 | + if (e.keyCode === 13) { | ||
21 | + reloadAllChange(); | ||
22 | + } | ||
23 | + }); | ||
24 | + // 加载设备出入表格 | ||
25 | + function renderpredictionListTable() { | ||
26 | + var conditions = form.val('form-prediction-condition'); | ||
27 | + Object.assign(conditions, { | ||
28 | + access_token: accessToken, | ||
29 | + keyword: $("#keyword").val(), | ||
30 | + viewMode: 'true' | ||
31 | + }); | ||
32 | + table.render({ | ||
33 | + elem: '#prediction-table', | ||
34 | + url: domainName + '/api-web/prediction/list', | ||
35 | + where: conditions, | ||
36 | + height: 'full-360', | ||
37 | + page: { | ||
38 | + layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'], | ||
39 | + theme: '#1E9FFF' | ||
40 | + }, | ||
41 | + end: function (e) { | ||
42 | + form.render() | ||
43 | + }, | ||
44 | + limit: common.limit, | ||
45 | + limits: common.limits, | ||
46 | + even: true, | ||
47 | + cols: [[ | ||
48 | + { | ||
49 | + type: 'numbers', title: '序号' | ||
50 | + }, { | ||
51 | + field: 'resName', title: '预测资源', align: 'center', | ||
52 | + }, { | ||
53 | + field: 'kpiName', title: '预测指标', align: 'center', | ||
54 | + }, { | ||
55 | + field: 'flag', title: '标识flag', align: 'center' | ||
56 | + }, | ||
57 | + { | ||
58 | + title: '预测效果', align: 'center', | ||
59 | + templet: '<div><span data-resid="{{d.resId}}" data-kpiid="{{d.kpiId}}" data-flag="{{d.flag}}" data-kpiname="{{d.kpiName}}" data-predictnum="{{d.predictNum}}" class="layui-table-link view-prediction-detail">查看</span></div>' | ||
60 | + } | ||
61 | + ]], | ||
62 | + done: function () { | ||
63 | + //获取预测效果展示 | ||
64 | + $('.view-prediction-detail').on('click', function () { | ||
65 | + var resId = $(this).data('resid'); | ||
66 | + var kpiId = $(this).data('kpiid'); | ||
67 | + var flag = $(this).data('flag'); | ||
68 | + var kpiName =$(this).data('kpiname'); | ||
69 | + var predictNum = $(this).data('predictnum'); | ||
70 | + openpredictionDetail(resId, kpiId,flag,kpiName,predictNum) | ||
71 | + }) | ||
72 | + | ||
73 | + } | ||
74 | + }); | ||
75 | + } | ||
76 | + | ||
77 | + //查看预测效果信息 | ||
78 | + function openpredictionDetail(resId, kpiId,flag,kpiName,predictNum) { | ||
79 | + var title = "预测效果"; | ||
80 | + common.openWin('prediction/detail', title, {resId: resId, kpiId: kpiId,flag:flag,kpiName:kpiName,predictNum:predictNum}, ['确定', '取消']) | ||
81 | + } | ||
82 | + | ||
83 | + // 图表,表格重新加载 | ||
84 | + function reloadAllChange() { | ||
85 | + renderpredictionListTable(); | ||
86 | + } | ||
87 | + }); | ||
88 | +}); |
1 | +//性能曲线图 | ||
2 | +layui.define(['element', 'admin', 'form', 'echarts', 'commonDetail'], function (exports) { | ||
3 | + var $ = layui.$; | ||
4 | + var echarts = layui.echarts; | ||
5 | + var admin = layui.admin; | ||
6 | + var common = layui.common; | ||
7 | + var commonDetail = layui.commonDetail; | ||
8 | + //对外暴露的接口 | ||
9 | + exports('predictionDetail', function (data) { | ||
10 | + var resId = ''; //资源ID | ||
11 | + var kpiId = ''; //指标ID | ||
12 | + var flag = '';//二级资源标识 | ||
13 | + var kpiName = ''; | ||
14 | + var predictNum = 24; | ||
15 | + resId = data.resId; //资源ID | ||
16 | + kpiId = data.kpiId; //指标ID | ||
17 | + flag = data.flag;//二级资源标识 | ||
18 | + kpiName = data.kpiName;//指标名称 | ||
19 | + predictNum = data.predictNum;//预测值数量 | ||
20 | + //性能走势 | ||
21 | + var zshiLoadIndex = null; | ||
22 | + var bizyshixiaoChart = null; | ||
23 | + | ||
24 | + renderLineChart(); | ||
25 | + | ||
26 | + //性能曲线图 | ||
27 | + function renderLineChart() { | ||
28 | + zshiLoadIndex = layer.load(2);//加载loading | ||
29 | + var url = common.domainName + '/api-web/prediction/line/chart?&resId=' + resId + '&kpiId=' + kpiId + '&flag=' + flag; | ||
30 | + //获取性能曲线图数据 | ||
31 | + admin.req({ | ||
32 | + url: url | ||
33 | + }).done(function (res) { | ||
34 | + layer.close(zshiLoadIndex); | ||
35 | + //var kpiUnit = res.data.kpiUnit == null ? "" : res.data.kpiUnit; | ||
36 | + var data = []; | ||
37 | + if (res.object == null || res.object.timeList.length == 0) { | ||
38 | + data = { | ||
39 | + timeList: ['00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00'], | ||
40 | + predictionList: [ | ||
41 | + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
42 | + ], | ||
43 | + performanceList: [ | ||
44 | + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
45 | + ], | ||
46 | + } | ||
47 | + } else { | ||
48 | + data = res.object; | ||
49 | + } | ||
50 | + | ||
51 | + (function () { | ||
52 | + var series = []; | ||
53 | + | ||
54 | + series.push({ | ||
55 | + name: kpiName, | ||
56 | + type: 'line', | ||
57 | + data: data.performanceList, | ||
58 | + symbolSize: "none", | ||
59 | + symbol: 'circle', | ||
60 | + markLine: { | ||
61 | + silent: true, | ||
62 | + symbol: ["none","none"], | ||
63 | + lineStyle:{ | ||
64 | + color: "#ccc" | ||
65 | + }, | ||
66 | + animation: false, | ||
67 | + label:{ | ||
68 | + show:false | ||
69 | + }, | ||
70 | + data:[ | ||
71 | + { | ||
72 | + xAxis: data.timeList.length-predictNum | ||
73 | + }, | ||
74 | + ] | ||
75 | + } | ||
76 | + }) | ||
77 | + | ||
78 | + var option = { | ||
79 | + tooltip: { | ||
80 | + trigger: 'axis', | ||
81 | + backgroundColor: 'rgba(50,50,50,0.7)', | ||
82 | + borderColor: "#333", | ||
83 | + formatter: function (params) { | ||
84 | + let str = '<div>' + params[0].name + '</div>'; | ||
85 | + let unit = ''; | ||
86 | + for (let i = 0; i < params.length; i++) { | ||
87 | + let dataVal = 0; | ||
88 | + if (params[i].data && params[i].data != undefined && params[i].data != 'undefined') { | ||
89 | + dataVal = params[i].data.toFixed(2); | ||
90 | + } | ||
91 | + str += "<div style='display:flex;justify-content: space-between'><span>" + params[i].marker + params[i].seriesName + "</span><span style='margin-left:10px;'>" + dataVal + unit + "</span></div>" | ||
92 | + } | ||
93 | + return str | ||
94 | + }, | ||
95 | + textStyle: { | ||
96 | + color: "#fff", | ||
97 | + align: 'left' | ||
98 | + } | ||
99 | + | ||
100 | + }, | ||
101 | + legend: { | ||
102 | + show: true | ||
103 | + }, | ||
104 | + grid: { | ||
105 | + top: '10%', | ||
106 | + left: '3%', | ||
107 | + right: '4%', | ||
108 | + bottom: '3%', | ||
109 | + containLabel: true | ||
110 | + }, | ||
111 | + toolbox: { | ||
112 | + feature: { | ||
113 | + saveAsImage: { | ||
114 | + show: false | ||
115 | + } | ||
116 | + } | ||
117 | + }, | ||
118 | + xAxis: { | ||
119 | + type: 'category', | ||
120 | + data: data.timeList, | ||
121 | + axisLine: { | ||
122 | + lineStyle: { | ||
123 | + color: '#c9c9c9' | ||
124 | + } | ||
125 | + }, | ||
126 | + axisLabel: { | ||
127 | + color: '#232425', | ||
128 | + showMaxLabel: true, | ||
129 | + fontSize: 12, | ||
130 | + formatter: function (params) { | ||
131 | + let val = params | ||
132 | + if(params.indexOf(' ' != -1)){ | ||
133 | + //console.log(params.split(' ')[0].substr(5,5)); | ||
134 | + return params.split(' ')[0].substr(5,5) +" "+params.split(' ')[1].substr(0,5); | ||
135 | + } | ||
136 | + return val; | ||
137 | + } | ||
138 | + }, | ||
139 | + splitArea: { | ||
140 | + show: true, | ||
141 | + areaStyle: { | ||
142 | + color: ['rgba(200,200,200,0.1)', 'transparent' | ||
143 | + ] | ||
144 | + } | ||
145 | + } | ||
146 | + }, | ||
147 | + yAxis: { | ||
148 | + type: 'value', | ||
149 | + axisLine: { | ||
150 | + lineStyle: { | ||
151 | + color: '#232425' | ||
152 | + }, | ||
153 | + show: false | ||
154 | + }, | ||
155 | + axisTick: { | ||
156 | + show: false | ||
157 | + }, | ||
158 | + splitLine: { | ||
159 | + lineStyle: { | ||
160 | + color: ['#ccc'] | ||
161 | + } | ||
162 | + } | ||
163 | + }, | ||
164 | + visualMap: { | ||
165 | + type: "piecewise", | ||
166 | + show: false, | ||
167 | + dimension: 0, | ||
168 | + seriesIndex: 0, | ||
169 | + pieces: [ | ||
170 | + { | ||
171 | + gt: 0, | ||
172 | + lt: data.timeList.length-predictNum, | ||
173 | + color: "rgba(41,11,236,0.68)",//大于0小于12为蓝色 | ||
174 | + }, | ||
175 | + { | ||
176 | + gt: data.timeList.length-predictNum, | ||
177 | + color: "rgba(229,27,88,0.68)",//大于12区间为红色 | ||
178 | + }, | ||
179 | + ], | ||
180 | + }, | ||
181 | + series: series | ||
182 | + }; | ||
183 | + // 使用刚指定的配置项和数据显示图表 | ||
184 | + if (bizyshixiaoChart === null) { | ||
185 | + bizyshixiaoChart = echarts.init(document.getElementById('predictionKpiLineChart')); | ||
186 | + } else { | ||
187 | + bizyshixiaoChart.clear(); | ||
188 | + } | ||
189 | + | ||
190 | + bizyshixiaoChart.setOption(option); | ||
191 | + | ||
192 | + //性能曲线图的点击事件 | ||
193 | + bizyshixiaoChart.off("click"); | ||
194 | + | ||
195 | + })(); | ||
196 | + }).error(function () { | ||
197 | + layer.close(zshiLoadIndex); | ||
198 | + | ||
199 | + }); | ||
200 | + } | ||
201 | + | ||
202 | + | ||
203 | + }); | ||
204 | +}); |
@@ -63,7 +63,7 @@ layui.define(['table', 'form', 'sessions', 'admin', 'common', 'echarts', 'laydat | @@ -63,7 +63,7 @@ layui.define(['table', 'form', 'sessions', 'admin', 'common', 'echarts', 'laydat | ||
63 | function renderrecoverycountListTable() { | 63 | function renderrecoverycountListTable() { |
64 | var conditions = form.val('form-recoverycount-condition'); | 64 | var conditions = form.val('form-recoverycount-condition'); |
65 | Object.assign(conditions, { | 65 | Object.assign(conditions, { |
66 | - access_token: accessToken, | 66 | + accessToken: accessToken, |
67 | period: period, | 67 | period: period, |
68 | busId: $("#slt-recoverycount-biz").val() | 68 | busId: $("#slt-recoverycount-biz").val() |
69 | }); | 69 | }); |
@@ -139,7 +139,7 @@ layui.define(['table', 'form', 'sessions', 'admin', 'common', 'echarts', 'laydat | @@ -139,7 +139,7 @@ layui.define(['table', 'form', 'sessions', 'admin', 'common', 'echarts', 'laydat | ||
139 | 139 | ||
140 | $("#recoverycount-export-excel").on('click', function () { | 140 | $("#recoverycount-export-excel").on('click', function () { |
141 | 141 | ||
142 | - let href = common.domainName + '/api-web/recoverycount/export?access_token=' + accessToken + "&createtime=" + createTime + '&dateLimit=' + dateLimit + '&limit=1000'; | 142 | + let href = common.domainName + '/api-web/recoverycount/export?accessToken=' + accessToken + "&createtime=" + createTime + '&dateLimit=' + dateLimit + '&limit=1000'; |
143 | 143 | ||
144 | window.open(href) | 144 | window.open(href) |
145 | }) | 145 | }) |
1 | +<!--性能曲线图--> | ||
2 | +<article class="page-container template"> | ||
3 | + <div class="page-panel"> | ||
4 | + <div class="main"> | ||
5 | + <div class="layui-card" id="predictionDetailContent"> | ||
6 | + <div class="layui-card-body"> | ||
7 | + | ||
8 | + <!--预测跟实际曲线--> | ||
9 | + <div class="lay-row"> | ||
10 | + <div class="lay-row-item"> | ||
11 | + <div class="detail_linechart" id="predictionKpiLineChart" style="margin-top:35px;"></div> | ||
12 | + </div> | ||
13 | + </div> | ||
14 | + | ||
15 | + | ||
16 | + </div> | ||
17 | + </div> | ||
18 | + </div> | ||
19 | + </div> | ||
20 | +</article> | ||
21 | + | ||
22 | +<script> | ||
23 | + layui.use('predictionDetail', function (fn) { | ||
24 | + fn({{d}}) | ||
25 | + }); | ||
26 | +</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" style="margin-top: 10px;"> | ||
7 | + <div style="display: flex"> | ||
8 | + <form class="layui-form layui-card-header" onsubmit="return false" | ||
9 | + lay-filter="form-prediction-condition"> | ||
10 | + <div class="layui-form-item"> | ||
11 | + <div class="layui-inline"> | ||
12 | + <div class="layui-input-inline layui-input-inline--long"> | ||
13 | + <input type="text" name="keyword" lay-tips="关键字检索包含: </br>资源名称 </br>指标名称</br>flag" placeholder="输入关键字,回车搜索" autocomplete="off" class="layui-input"> | ||
14 | + </div> | ||
15 | + </div> | ||
16 | + </div> | ||
17 | + </form> | ||
18 | + | ||
19 | + </div> | ||
20 | + <table id="prediction-table" class="layui-table" lay-filter="prediction-table"></table> | ||
21 | + </div> | ||
22 | + </div> | ||
23 | + </div> | ||
24 | + </div> | ||
25 | +</article> | ||
26 | +<script> | ||
27 | + layui.use('prediction', function (fn) { | ||
28 | + fn(); | ||
29 | + }); | ||
30 | +</script> |
-
Please register or login to post a comment