Authored by 王涛

搜索

... ... @@ -102,10 +102,14 @@ export default {
w += parseFloat(v.width) ;
})
let max = props.maxWidth;
if(props.showTools){
max -= 80;
}
if(w < props.maxWidth){
if(w < max){
console.log('%');
return props.maxWidth / w * width;
return max / w * width;
}
}
return width;
... ...
... ... @@ -152,7 +152,7 @@ global.viewer = (path, proxy) => {
global.openBlankWindow("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(res.str));
} else {
var access_token = 'access_token=' + proxy.$http.getToken();
let viewUrl =`/api-web/openoffice/downloadByPath?path=${encodeURIComponent(path)}&${access_token}`;
let viewUrl = `/api-web/openoffice/downloadByPath?path=${encodeURIComponent(path)}&${access_token}`;
let mimeType = res.object;
// TODO 浏览器不能播放视频
// 图片视频
... ... @@ -244,21 +244,21 @@ global.openDetail = (resId, resType, proxy) => {
* @param code 报表code
* @param parans map参数 key:参数key value:参数值
*/
global.openReport = (code, parans) =>{
global.openReport = (code, parans) => {
let arr =[];
if(Object.keys(parans).length > 0){
let arr = [];
if (Object.keys(parans).length > 0) {
for (const key in parans) {
let val = parans[key];
if(!val){
if (!val) {
val = '';
}
arr.push(`${key}=${val}`);
}
}
// 报表URL
var url = sessionStorage.getItem('jimuReport') + `/page/${code}?access_token=${localStorage.getItem('access_token')}`;
if(arr.length > 0){
var url = sessionStorage.getItem('jimuReport') + `/page/${code}?access_token=${localStorage.getItem('access_token')}`;
if (arr.length > 0) {
url += "&" + arr.join('&')
}
global.openBlankWindow(url);
... ... @@ -292,14 +292,22 @@ global.getBase64 = (file) => {
* 作者: Wang
* 时间:2021/12/13 14:31
*/
global.isAdminRole = () =>{
global.isAdminRole = () => {
let roles = sessionStorage.getItem('roles');
if(roles && roles.indexOf('ADMIN') != -1){
if (roles && roles.indexOf('ADMIN') != -1) {
return true;
}
return false;
}
global.getAlarmLevel = (level) => {
let params = {
"3": {name: '严重告警', color: '#D81E06'},
"2": {name: '重要告警', color: '#FF7E00'},
"1": {name: '一般告警', color: '#1e9fff'}
}
return params[level];
}
// 组件默认大小 medium / small / mini
global.elementSize = '';
... ...
... ... @@ -3,8 +3,8 @@
<div>
{{detailInfo.info}}
</div>
<el-progress :text-inside="true" :stroke-width="26" :percentage="detailInfo.rate" >
<span style="color: black">正常占比:{{detailInfo.rate}}%</span>
<el-progress :text-inside="true" :stroke-width="26" :percentage="detailInfo.rate*100" >
<span style="color: black">正常占比:{{detailInfo.rate*100}}%</span>
</el-progress>
</div>
<div>
... ... @@ -14,10 +14,10 @@
:showIndex="true"
:showBorder="true"
:showPage="false"
:showTools="false"
:showTools="showDetail"
:maxWidth="width"
:height="200">
<template #tools="{scope}" v-if="showDetail">
<template #tools="{scope}">
<el-button type="text" size="small" @click.prevent="handleClick(scope.row,scope.$index)">
明细
</el-button>
... ... @@ -25,7 +25,13 @@
</cm-table-page>
</div>
<div>
{{showLineDialog}}
{{alarmFlg}}
{{resListDialog}}
</div>
<!-- 弹框区域 -->
<!-- 曲线图 -->
<cm-dialog top="3vh" title="曲线图" width="900px" :showDialogVisible="showLineDialog"
@hidedialog="closeLineDialog" :showFooter="false">
<template v-slot>
... ... @@ -34,4 +40,40 @@
</div>
</template>
</cm-dialog>
<!-- 资源明细 -->
<cm-dialog top="3vh" title="资源明细" width="900px" :showDialogVisible="resListDialog"
@hidedialog="showResListDialog" :showFooter="false">
<template v-slot>
<div>
<cm-table-page v-if="resList.columns.length > 0" :columns="resList.columns"
:dataList="resList.dataList"
:showIndex="true"
:showBorder="true"
@loaddata="loadPage"
:showPage="false"
:height="500"
:showTools="false">
</cm-table-page>
</div>
</template>
</cm-dialog>
<!-- 告警列表 -->
<cm-dialog top="3vh" title="告警列表" width="80%" :showDialogVisible="alarmFlg"
@hidedialog="showAlarmDialog" :showFooter="false">
<template v-slot>
<div>
<cm-table-page v-if="alarmList.columns.length > 0" :columns="alarmList.columns"
:dataList="alarmList.dataList"
:showIndex="true"
:showBorder="true"
@loaddata="loadPage"
:showPage="false"
:height="500"
:showTools="false">
</cm-table-page>
</div>
</template>
</cm-dialog>
</div>
... ...
/**
* 折线图
* <p>
* 作者: Wang
* 时间:2021/12/15 19:59
*/
const lineDetail = () => {
let showLineDialog = Vue.ref(false);
let closeLineDialog = (flg) => {
showLineDialog.value = flg;
}
let openLine = (row) => {
debugger
closeLineDialog(true);
}
return {
showLineDialog,
closeLineDialog
closeLineDialog,
openLine
}
}
/**
* 告警列表
* <p>
* 作者: Wang
* 时间:2021/12/15 19:59
*/
const alarmDialog = () => {
const {proxy} = Vue.getCurrentInstance();
let alarmFlg = Vue.ref(false);
let alarmList = Vue.ref({
columns: [/*{
prop: "resId",
label: "资源ID",
},*/ {
prop: "kpiId",
label: "指标ID",
}, {
prop: "flag",
label: "FLAG",
}, /*{
prop: "id",
label: "告警ID",
},*/ {
prop: "alarmTime",
label: "首次告警时间",
}, {
prop: "alarmContent",
label: "告警内容",
}, {
prop: "noticeTime",
label: "通知时间",
}, {
prop: "alarmRepeatCnt",
label: "告警次数",
},/* {
prop: "alarmContent",
label: "通知内容",
},*/ {
prop: "alarmLevel",
label: "告警级别",
render: function (row) {
let obj = proxy.$global.getAlarmLevel(row.alarmLevel);
if (obj) {
return `<span style="color: ${obj.color}">${obj.name}</span>`
}
return '';
}
}, {
prop: "durationStr",
label: "持续时长",
}],
dataList: [],
total: 0
});
let showAlarmDialog = (flg) => {
alarmFlg.value = flg;
}
let openAlarmDialog = (row) => {
showAlarmDialog(true);
// 获取告警列表
proxy.$http.get(`/api-web/home/alarm/alarmListPage?page=1&limit=10000&resId=${row.resId}`, {}, function (res) {
if (res && res.success) {
if (res.data) {
alarmList.value.dataList = res.data;
}
} else {
proxy.$global.showMsg(res.msg ? res.msg : '暂无告警数据!', "warning");
}
});
}
return {
showAlarmDialog,
openAlarmDialog,
alarmList,
alarmFlg
}
}
const colTypes = (props,list) => {
/**
* 数据转换
* <p>
* 作者: Wang
* 时间:2021/12/15 18:08
*/
const colTypes = (props, list,openLine,openAlarmDialog) => {
// 指标
let lineKpiIds = ['point_succ', 'count', 'response_rate', 'success_rate']
let getItem = (v) => {
let item = {};
item.resId = v.resId;
item.resName = v.resName;
item.kpiName = v.kpiName;
item.bizId = v.bizId;
item.bizName = v.bizName;
item.kpiId = v.kpiId;
item.flag = v.flag;
return item;
}
/**
* KPI数据处理方式
* <p>
... ... @@ -20,33 +137,35 @@ const colTypes = (props,list) => {
let dataTypeByKpi = (data) => {
let dataList = [];
let col = [{
prop: 'kpiName',
prop: 'resName',
label: props.itemName,
width: 120,
click: function (row) {
closeLineDialog(true);
}
width: 100
}];
let index = 0;
for (let resId in data) {
let list = data[resId];
let item = {};
item.resId = list[0].resId;
item.resName = list[0].resName;
item.bizId = list[0].bizId;
item.bizName = list[0].bizName;
let item = getItem(list[0]);
list.forEach(function (v) {
item[v.kpiId] = v.kpiValue;
item.kpiName = v.kpiName;
if (index == 0) {
col.push({
let colInfo = {
prop: v.kpiId,
label: v.kpiName,
width: 80
})
};
if (lineKpiIds.indexOf(v.kpiId) != -1) {
colInfo['click'] = function (row) {
openLine(row);
}
colInfo['render'] = function (row) {
return `<span style="text-decoration: underline;color: blue;">${row[v.kpiId]}</span>`
}
}
col.push(colInfo)
}
});
dataList.push(item);
... ... @@ -76,41 +195,31 @@ const colTypes = (props,list) => {
}, {
prop: "alarm",
label: "告警",
click: function (row) {
openAlarmDialog(row);
},
render: function (row) {
return `<span style="text-decoration: underline;color: blue;">${row.alarm}</span>`
}
}];
let dataList = [];
let col = [{
prop: 'kpiName',
label: props.itemName,
width: 100,
click: function (row) {
closeLineDialog(true);
}
width: 100
}];
flags.forEach(function ({prop, label}) {
col.push({
prop: prop,
label: label,
width: 80
})
flags.forEach(function (item) {
col.push(item)
})
let index = 0;
for (let resId in data) {
let list = data[resId];
let item = {};
item.resId = list[0].resId;
item.resName = list[0].resName;
item.bizId = list[0].bizId;
item.bizName = list[0].bizName;
item.kpiName = list[0].kpiName;
let item = getItem(list[0]);
list.forEach(function (v) {
item[v.flag] = v.kpiValue;
});
dataList.push(item);
index++;
}
... ... @@ -121,6 +230,78 @@ const colTypes = (props,list) => {
return {dataTypeByKpi, dataTypeByFlag}
}
const resDetail = (props) => {
const {proxy} = Vue.getCurrentInstance();
let resListDialog = Vue.ref(false);
let resList = Vue.ref({
columns: [{
prop: "resName",
label: "资源名称",
}, {
prop: "bizName",
label: "业务名称",
}, {
prop: "kpiId",
label: "指标",
}, {
prop: "kpiName",
label: "指标名称",
}, {
prop: "kpiValue",
label: "指标值",
}, {
prop: "targetType",
label: "分类",
}],
dataList: [],
total: 0
});
let showResListDialog = (flg) => {
resListDialog.value = flg;
}
let handleClick = (row, index) => {
debugger
showResListDialog(true);
getResListPage(row);
}
let getResListPage = (row) => {
let params = {
faultNo: props.faultNo,
targeType: props.targeType,
resId: row.resId,
kpiId: row.kpiId,
flag: row.flag
}
proxy.$http.get('/api-web/fault/result/findResList', params, function (res) {
if (res && res.success) {
if (res.data) {
resList.value.dataList = res.data;
}
} else {
proxy.$global.showMsg(res.msg, "warning");
}
});
}
let loadPage = () => {
}
return {
resList,
resListDialog,
showResListDialog,
getResListPage,
loadPage,
handleClick
}
}
export default {
name: 'resultItemIndex',
template: '',
... ... @@ -157,7 +338,7 @@ export default {
},
},
setup(props, {attrs, slots, emit}) {
let width = Vue.ref(window.innerWidth * 0.8 - 190);
let width = Vue.ref(window.innerWidth * 0.8 - 220);
const {proxy} = Vue.getCurrentInstance();
let list = Vue.ref({
columns: [],
... ... @@ -166,12 +347,35 @@ export default {
});
let detailInfo = Vue.ref({
rate:0,
info:''
rate: 0,
info: ''
});
const {
showLineDialog,
closeLineDialog,
openLine
} = lineDetail();
const {
resList,
resListDialog,
showResListDialog,
getResListPage,
loadPage,
handleClick
} = resDetail(props);
const {
showAlarmDialog,
openAlarmDialog,
alarmList,
alarmFlg
} = alarmDialog();
// 数据统计方式
const {dataTypeByKpi, dataTypeByFlag} = colTypes(props,list);
const {dataTypeByKpi, dataTypeByFlag} = colTypes(props, list,openLine,openAlarmDialog);
/**
* 获取表格数据
... ... @@ -186,11 +390,11 @@ export default {
}
proxy.$http.get('/api-web/fault/result/findResult', params, function (res) {
if (res && res.success) {
if(res.map){
if (res.map) {
callback(res.map);
}
} else {
proxy.$global.showMsg(res.msg,"warning");
proxy.$global.showMsg(res.msg, "warning");
}
});
... ... @@ -211,27 +415,22 @@ export default {
/**
* 获取统计信息
*/
let findCountInfo = () =>{
let findCountInfo = () => {
let params = {
faultNo: props.faultNo,
targeType: props.targeType
}
proxy.$http.get('/api-web/fault/result/findCountInfo', params, function (res) {
if (res && res.success) {
if( res.map){
if (res.map) {
detailInfo.value = res.map;
}
} else {
proxy.$global.showMsg(res.msg,"warning");
proxy.$global.showMsg(res.msg, "warning");
}
});
}
const {
showLineDialog,
closeLineDialog
} = lineDetail();
// 监听编辑状态
Vue.watch(() => props.faultNo, (newValue, oldVlaue) => {
getPage();
... ... @@ -248,8 +447,25 @@ export default {
list,
detailInfo,
// 折线图
showLineDialog,
closeLineDialog
closeLineDialog,
openLine,
// 资源详情
resList,
resListDialog,
showResListDialog,
getResListPage,
loadPage,
handleClick,
// 告警弹框
showAlarmDialog,
openAlarmDialog,
alarmList,
alarmFlg
}
}
}
... ...
... ... @@ -45,7 +45,7 @@
<cm-dialog :title="faultDetailDialogTitle" width="80%" :showDialogVisible="showFaultDetailDialog"
@hidedialog="closeFaultDetailDialog" :showFooter="false">
<template v-slot>
<div style="text-align: left;height:720px;max-height:720px;overflow-y: auto">
<div style="text-align: left;height:720px;max-height:720px;overflow-y: auto;overflow-x: hidden;">
<div style="text-align: right;padding-right: 10px">
<el-button type="text" size="small"
@click.prevent="$global.openReport('GZZDS',{faultNumber:faultDetailDetailInfo.faultNo})">
... ...
... ... @@ -33,7 +33,7 @@ const faultDetail = () => {
color: '#67C23A',
itemName:'检测指标',
detail:true,
colType:'kpi'
colType:'flag'
}, {
faultType: 'APM',
faultTypeName: 'APM',
... ... @@ -285,6 +285,7 @@ export default {
proxy.$http.get(`/api-web/fault/page`, searchForm.value, function (res) {
if (res && res.data) {
list.value.dataList = res.data;
list.value.total = res.count;
}
});
}
... ...