Authored by 鲁尚清

Merge branch 'master' of http://192.168.1.136:82/monitor_v3/hg-monitor-web into …

…master-v32-lushangqing
... ... @@ -19,7 +19,7 @@
</div>
<div class="layui-form-item">
<label class="layadmin-user-login-icon layui-icon layui-icon-password" for="loginPswd"></label>
<input type="password" name="password" id="loginPswd" lay-verify="required|password" minlength="4" placeholder="密码"
<input type="password" name="password" id="loginPswd" lay-verify="required|password" placeholder="密码"
class="layui-input">
</div>
<!--验证码-->
... ...
... ... @@ -76,7 +76,7 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
});
//绑定业务下拉选择数据
admin.req({
url: domainName + '/api-web/home/business/findUserBusTypeAll?table=b_alarm',
url: domainName + '/api-web/home/business/findUserBusTypeAll?table=',
success: function (response) {
if (response && response.success) {
busTypeList = response.data;
... ...
<div>
<div>
<el-progress :percentage="90" />
<div style="padding: 2px 0px 6px 10px">
<div>
{{detailInfo.info}}
</div>
<el-progress :text-inside="true" :stroke-width="26" :percentage="detailInfo.rate" >
<span style="color: black">正常占比:{{detailInfo.rate}}%</span>
</el-progress>
</div>
<div>
<cm-table-page v-if="list.columns.length > 0" :columns="list.columns"
... ...
const lineDetail = () => {
let showLineDialog = Vue.ref(false);
let closeLineDialog = (flg) =>{
let closeLineDialog = (flg) => {
showLineDialog.value = flg;
}
return {
... ... @@ -9,6 +9,118 @@ const lineDetail = () => {
closeLineDialog
}
}
const colTypes = (props,list) => {
/**
* KPI数据处理方式
* <p>
* 作者: Wang
* 时间:2021/12/15 16:12
*/
let dataTypeByKpi = (data) => {
let dataList = [];
let col = [{
prop: 'kpiName',
label: props.itemName,
width: 120,
click: function (row) {
closeLineDialog(true);
}
}];
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;
list.forEach(function (v) {
item[v.kpiId] = v.kpiValue;
item.kpiName = v.kpiName;
if (index == 0) {
col.push({
prop: v.kpiId,
label: v.kpiName,
width: 80
})
}
});
dataList.push(item);
index++;
}
// 设置数据
list.value.dataList = dataList;
list.value.columns = col;
}
/**
* KPI数据处理方式
* <p>
* 作者: Wang
* 时间:2021/12/15 16:12
*/
let dataTypeByFlag = (data) => {
let flags = [{
prop: "count",
label: "检测项目数",
}, {
prop: "normal",
label: "正常数"
}, {
prop: "abnormal",
label: "异常出",
}, {
prop: "alarm",
label: "告警",
}];
let dataList = [];
let col = [{
prop: 'kpiName',
label: props.itemName,
width: 100,
click: function (row) {
closeLineDialog(true);
}
}];
flags.forEach(function ({prop, label}) {
col.push({
prop: prop,
label: label,
width: 80
})
})
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;
list.forEach(function (v) {
item[v.flag] = v.kpiValue;
});
dataList.push(item);
index++;
}
// 设置数据
list.value.dataList = dataList;
list.value.columns = col;
}
return {dataTypeByKpi, dataTypeByFlag}
}
export default {
name: 'resultItemIndex',
template: '',
... ... @@ -21,22 +133,31 @@ export default {
return {}
},
props: {
faultType:{
targeType: {
type: String,
default: ''
},
faultNo: {
type: String,
default:''
default: ''
},
faultNo:{
itemName: {
type: String,
default:''
default: ''
},
// 展示详情页
showDetail:{
showDetail: {
type: String,
default:''
}
default: ''
},
// 数据转行方式
colType: {
type: String,
default: 'kpi'
},
},
setup(props, {attrs, slots, emit}) {
let width = Vue.ref(window.innerWidth*0.8 - 190);
let width = Vue.ref(window.innerWidth * 0.8 - 190);
const {proxy} = Vue.getCurrentInstance();
let list = Vue.ref({
columns: [],
... ... @@ -44,48 +165,66 @@ export default {
total: 0
});
let detailInfo = Vue.ref({
rate:0,
info:''
});
let getPage = () =>{
let data = {};
// 数据统计方式
const {dataTypeByKpi, dataTypeByFlag} = colTypes(props,list);
let dataList = [];
let col = [{
prop: 'resName',
label: '检测指标',
width: 100,
click: function (row) {
closeLineDialog(true);
}
}];
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;
list.forEach(function (v){
item[v.kpiId] = v.kpiValue;
if(index == 0){
col.push({
prop: v.kpiId,
label: v.kpiName,
width: 80
})
/**
* 获取表格数据
* <p>
* 作者: Wang
* 时间:2021/12/15 17:26
*/
let getPage = () => {
let params = {
faultNo: props.faultNo,
targeType: props.targeType
}
proxy.$http.get('/api-web/fault/result/findResult', params, function (res) {
if (res && res.success) {
if(res.map){
callback(res.map);
}
});
} else {
proxy.$global.showMsg(res.msg,"warning");
}
});
dataList.push(item);
index ++;
}
// 设置数据
list.value.dataList = dataList;
list.value.columns = col;
let callback = (data) => {
switch (props.colType) {
case 'kpi':
dataTypeByKpi(data);
break;
case 'flag':
dataTypeByFlag(data);
break;
}
}
}
/**
* 获取统计信息
*/
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){
detailInfo.value = res.map;
}
} else {
proxy.$global.showMsg(res.msg,"warning");
}
});
}
const {
... ... @@ -101,11 +240,13 @@ export default {
// 挂载完
Vue.onMounted(() => {
getPage();
findCountInfo();
})
return {
width,
list,
detailInfo,
showLineDialog,
closeLineDialog
... ...
... ... @@ -56,9 +56,12 @@
<el-timeline-item v-for="item in faultDetailDetailInfo.items" center :timestamp="item.faultTypeName"
placement="top" :color="item.color" :hollow="true">
<el-card>
<component v-bind:is="item.components" :faultType="item.faultType"
<component v-bind:is="item.components"
:targeType="item.faultType"
:faultNo="faultDetailDetailInfo.faultNo"
:showDetail="item.detail"/>
:colType="item.colType"
:itemName="item.itemName"
:showDetail="item.detail"/>
</el-card>
</el-timeline-item>
</el-timeline>
... ... @@ -105,8 +108,8 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="影响范围" prop="influencescope">
<el-input v-model="handleInfoForm.influencescope"></el-input>
<el-form-item label="影响范围" prop="influenceScope">
<el-input v-model="handleInfoForm.influenceScope"></el-input>
</el-form-item>
</el-col>
</el-row>
... ... @@ -115,15 +118,15 @@
<el-col :span="12">
<el-form-item label="处理结果" prop="solveway">
<el-radio-group v-model="handleInfoForm.solveway">
<el-radio label="未解决"></el-radio>
<el-radio label="已解决"></el-radio>
<el-radio label="人工处理"></el-radio>
<el-radio label="自动处理"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="处理时间" prop="solvetime">
<el-form-item label="处理时间" prop="solveTime">
<el-date-picker
v-model="handleInfoForm.solvetime"
v-model="handleInfoForm.solveTime"
type="datetime"
format="YYYY/MM/DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
... ...
... ... @@ -15,25 +15,33 @@ const faultDetail = () => {
faultTypeName: '拨测',
components: 'result-item',
color: '#67C23A',
detail:false
itemName:'场景名称',
detail:false,
colType:'kpi'
},{
faultType: 'NPM',
faultTypeName: 'NPM',
components: 'result-item',
color: '#E6A23C',
detail:false
itemName:'链路(流名称)',
detail:false,
colType:'kpi'
},{
faultType: 'BASE',
faultTypeName: '基础',
components: 'result-item',
color: '#67C23A',
detail:true
itemName:'检测指标',
detail:true,
colType:'kpi'
}, {
faultType: 'APM',
faultTypeName: 'APM',
components: 'result-item',
color: '#F56C6C',
detail:true
itemName:'检测指标',
detail:true,
colType:'flag'
}/*, {
faultType: 'NETLINK',
faultTypeName: '网络链路',
... ... @@ -89,9 +97,9 @@ const handleInfo = () => {
faultState: '',
duration: '',
faultBody: '',
influencescope: '',
influenceScope: '',
solveway: '',
solvetime: '',
solveTime: '',
reason: '',
solution: ''
})
... ... @@ -245,7 +253,7 @@ export default {
prop: 'solveway',
label: '处理方式'
}, {
prop: 'solvetime',
prop: 'solveTime',
label: '处理时间'
}, {
prop: 'solveby',
... ... @@ -260,7 +268,7 @@ export default {
prop: 'solution',
label: '处理方案'
}, {
prop: 'influencescope',
prop: 'influenceScope',
label: '影响范围'
}],
dataList: [],
... ...