Authored by 王涛

Merge branch 'master-mj-yuanjinpeng' into 'master-mj'

fix:数据库恢复验证概况优化



See merge request !1153
  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>