|
|
//活动告警
|
|
|
layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common', 'sessions','commonDetail','soulTable', 'treeTable'], function (exports) {
|
|
|
var $ = layui.$;
|
|
|
var form = layui.form;
|
|
|
var layer = layui.layer;
|
|
|
var admin = layui.admin;
|
|
|
var table = layui.table;
|
|
|
var laydate = layui.laydate;
|
|
|
var laytpl = layui.laytpl;
|
|
|
var treeTable = layui.treeTable;
|
|
|
var common = layui.common;
|
|
|
var commonDetail=layui.commonDetail;
|
|
|
var domainName = common.domainName;
|
|
|
var todayStr = '';
|
|
|
//对外暴露的接口
|
|
|
exports('activewarning', function () {
|
|
|
var sessions = layui.sessions;
|
|
|
var accessToken = sessions.getToken()['access_token'];
|
|
|
var router = layui.router();
|
|
|
var alarmLevel = router.search.level; //告警级别
|
|
|
var checkList = common.checkPermission(accessToken);
|
|
|
var resId = router.search.resId;//资源Id
|
|
|
var kpiId = router.search.kpiId;//指标Id
|
|
|
var bizId = router.search.bizId;//业务Id
|
|
|
var alarmNo = router.search.alarmNo;//告警编号
|
|
|
var busIdSelect;
|
|
|
var busTypeList = [];
|
|
|
if(!bizId){
|
|
|
bizId='';
|
|
|
}
|
|
|
if (resId) {
|
|
|
resId = decodeURIComponent(resId);
|
|
|
}
|
|
|
if (alarmNo) {
|
|
|
$("#activewarningkw").val(alarmNo);
|
|
|
}
|
|
|
var netFlag = router.search.netFlag;//网络标识
|
|
|
var resType = router.search.restype ? router.search.restype : '';//资源类型
|
|
|
var soulTable = layui.soulTable;
|
|
|
|
|
|
var sortKey = '';
|
|
|
|
|
|
if ($("#alarmLevelSearchBox").val()) {
|
|
|
alarmLevel = $("#alarmLevelSearchBox").val()
|
|
|
}
|
|
|
//回显告警级别
|
|
|
$("#alarmLevelSearchBox").val(alarmLevel);
|
|
|
form.render("select");
|
|
|
|
|
|
function initDate() {
|
|
|
//开始时间
|
|
|
var start = laydate.render({
|
|
|
elem: '#activewarningStartdate'
|
|
|
, trigger: 'click'
|
|
|
, done: function (value, date) {
|
|
|
date.month--;
|
|
|
end.config.min = date;
|
|
|
var endDate = $("#activewarningEnddate").val();
|
|
|
if (endDate != null && endDate != "") {
|
|
|
reloadTable();
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
//结束时间
|
|
|
var end = laydate.render({
|
|
|
elem: '#activewarningEnddate'
|
|
|
, trigger: 'click'
|
|
|
, done: function (value, date) {
|
|
|
date.month--;
|
|
|
start.config.max = date;
|
|
|
var benginDate = $("#activewarningStartdate").val();
|
|
|
if (benginDate != null && benginDate != "") {
|
|
|
reloadTable();
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
//绑定业务下拉选择数据
|
|
|
admin.req({
|
|
|
url: domainName + '/api-web/home/business/findAllBusType',
|
|
|
success: function (response) {
|
|
|
if (response && response.success) {
|
|
|
busTypeList = response.data;
|
|
|
var bizList = response.data.map(item => {
|
|
|
return {
|
|
|
name: item.busTypeName,
|
|
|
value: item.busId,
|
|
|
parentId: item.parentId
|
|
|
}
|
|
|
});
|
|
|
var bizTree=common.pidToChildren(bizList, 'value', 'parentId');
|
|
|
|
|
|
// 影响业务下拉框
|
|
|
busIdSelect = xmSelect.render({
|
|
|
el: '#bisTypeSearchBox',
|
|
|
name: 'bizId',
|
|
|
tips: '=所属业务=',
|
|
|
//开启搜索
|
|
|
filterable: true,
|
|
|
clickClose: true,
|
|
|
initValue: [bizId.split(',')[0]],
|
|
|
toolbar: {
|
|
|
show: true,
|
|
|
list: ['ALL', 'REVERSE', 'CLEAR']
|
|
|
},
|
|
|
height: 'auto',
|
|
|
tree: {
|
|
|
show: true,
|
|
|
showFolderIcon: true,
|
|
|
showLine: true,
|
|
|
strict: true,
|
|
|
//间距
|
|
|
indent: 20,
|
|
|
},
|
|
|
model: {
|
|
|
label: {
|
|
|
type: 'text'
|
|
|
}
|
|
|
},
|
|
|
data: bizTree,
|
|
|
on: function (data) {
|
|
|
if (data.arr.length != 0) {
|
|
|
var str='';
|
|
|
$.each(data.arr,function (i,v) {
|
|
|
str+=v.value+',';
|
|
|
})
|
|
|
bizId = str.substring(0,str.length-1);
|
|
|
} else {
|
|
|
bizId = '';
|
|
|
}
|
|
|
form.render();
|
|
|
reloadTable();
|
|
|
}
|
|
|
});
|
|
|
if(busIdSelect){
|
|
|
//追加样式
|
|
|
$('#bisTypeSearchBox').find('.xm-body').eq(0).css("width","230px");
|
|
|
}
|
|
|
} else {
|
|
|
layer.msg('获取业务失败', {icon: 2});
|
|
|
}
|
|
|
},
|
|
|
error: function () {
|
|
|
layer.msg('获取业务失败', {icon: 2});
|
|
|
}
|
|
|
});
|
|
|
|
|
|
$.ajax({
|
|
|
url: common.domainName + '/api-web/manage/kpi/findKpiInAlarm?access_token='+accessToken+'&tableName=b_alarm',
|
|
|
type: "get",
|
|
|
success:function (res) {
|
|
|
var kpis = res.data;
|
|
|
var html = '<option value="">=指标名称=</option>'
|
|
|
$.each(kpis,function (i,e) {
|
|
|
html+='<option value="'+e.kpiId+'">'+e.kpiName+'</option>'
|
|
|
})
|
|
|
$("#alarmKpiSearchBox").html('');
|
|
|
$("#alarmKpiSearchBox").append(html);
|
|
|
form.render();
|
|
|
}
|
|
|
})
|
|
|
$.ajax({
|
|
|
url: `${common.domainName}/api-web/manage/restype/list?access_token=${accessToken}`,
|
|
|
method: 'GET',
|
|
|
success: function (res) {
|
|
|
// 资源类型下拉框
|
|
|
var resTypeList = res.data.map(item => {
|
|
|
return {
|
|
|
name: item.resTypeName,
|
|
|
value: item.resTypeCode,
|
|
|
parentId: item.parentId
|
|
|
}
|
|
|
});
|
|
|
var resTypeTree = treeTable.pidToChildren(resTypeList, "value", "parentId");
|
|
|
xmSelect.render({
|
|
|
el: '#resTypeSearchBox',
|
|
|
name: "resType",
|
|
|
tips: '=资源类型=',
|
|
|
filterable: true,
|
|
|
radio: true,
|
|
|
clickClose: true,
|
|
|
initValue: [resType],
|
|
|
toolbar: {
|
|
|
show: true,
|
|
|
list: ['CLEAR']
|
|
|
},
|
|
|
tree: {
|
|
|
show: true,
|
|
|
showFolderIcon: true,
|
|
|
showLine: true,
|
|
|
strict: false,
|
|
|
indent: 20
|
|
|
},
|
|
|
model: {
|
|
|
label: {
|
|
|
type: 'text'
|
|
|
}
|
|
|
},
|
|
|
height: 'auto',
|
|
|
data: resTypeTree,
|
|
|
on: function (data) {
|
|
|
if(data.isAdd){
|
|
|
if (data.arr.length != 0) {
|
|
|
resType = data.arr[0].value;
|
|
|
} else {
|
|
|
resType = '';
|
|
|
}
|
|
|
reloadTable();
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
//回车搜索
|
|
|
$('#activewarningkw, input[name="durationVal"]').keydown(function (e) {
|
|
|
if (e.keyCode === 13) {
|
|
|
reloadTable();
|
|
|
}
|
|
|
});
|
|
|
//选择框搜索事件
|
|
|
bindSelectEvent();
|
|
|
initDate();
|
|
|
|
|
|
function initToolBarClickEvent() {
|
|
|
//告警消除
|
|
|
$("#clearBtn").unbind('click').on('click', function () {
|
|
|
if ($.inArray('app:alarm:clear', checkList) == -1) {
|
|
|
layer.msg('暂无权限!', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
var ids = [];
|
|
|
var data = table.checkStatus('activewarningTable').data;
|
|
|
if (data.length == 0) {
|
|
|
layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
|
|
|
return;
|
|
|
}
|
|
|
//选中的告警ID放到集合中
|
|
|
$.each(data, function (i, obj) {
|
|
|
ids.push(obj.id)
|
|
|
});
|
|
|
//获取以往告警消除意见
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/clear/reason',
|
|
|
type: "get",
|
|
|
data:{
|
|
|
alarmId: ids.toString()
|
|
|
},
|
|
|
done:function (data) {
|
|
|
var clearReson = "暂无参考处理方案,请输入处理方案";
|
|
|
var hisReason = "";
|
|
|
var reasonlist = data.reason;
|
|
|
if(reasonlist && reasonlist.length > 0){
|
|
|
hisReason = "参考方案:\n";
|
|
|
$.each(reasonlist,function (i,v) {
|
|
|
var idx = i + 1;
|
|
|
hisReason += idx +":"+v +"\n";
|
|
|
});
|
|
|
}
|
|
|
|
|
|
layer.prompt({id: "alarms_clear_id", title: '告警消除', area: ['400px'], formType: 2,value: hisReason}, function (text, index) {
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/clear'
|
|
|
, type: "post"
|
|
|
, data: {
|
|
|
ids: ids.toString(),
|
|
|
reason: text,
|
|
|
access_token: accessToken,
|
|
|
noticeFlag: $('input[name="noticeFlag"]:checked').val()
|
|
|
}
|
|
|
, done: function (res) {
|
|
|
//如果消除成功,关闭弹出框然后重新加载页面
|
|
|
if (res.success) {
|
|
|
layer.close(index);
|
|
|
layer.msg('告警已消除!', {icon: 1, time: 2000});
|
|
|
reloadTable();
|
|
|
} else {
|
|
|
layer.msg('告警消除失败,请与管理员联系!', {icon: 7, time: 3000});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
|
|
|
$("#alarms_clear_id").find('textarea.layui-layer-input').attr("placeholder", clearReson);
|
|
|
$("#alarms_clear_id").append('<div style="padding-top: 15px;"><span>是否通知:</span> ' +
|
|
|
'<input type="radio" name="noticeFlag" value="true" title="是" > 是' +
|
|
|
'<input type="radio" name="noticeFlag" value="false" title="否" checked="" style="margin-left: 20px;"> 否</div> ');
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
//告警关闭
|
|
|
$("#closeBtn").unbind('click').on("click", function () {
|
|
|
if ($.inArray('app:alarm:close', checkList) == -1) {
|
|
|
layer.msg('暂无权限!', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
var ids = [];
|
|
|
var data = table.checkStatus('activewarningTable').data;
|
|
|
var alarmStatus = true;
|
|
|
if (data.length == 0) {
|
|
|
layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
|
|
|
return;
|
|
|
}
|
|
|
//选中的告警ID放到集合中
|
|
|
$.each(data, function (i, obj) {
|
|
|
var status = JSON.stringify(obj.alarmStatus);
|
|
|
if (status && status == '1') {
|
|
|
alarmStatus = false;
|
|
|
}
|
|
|
ids.push(obj.id)
|
|
|
});
|
|
|
if (!alarmStatus) {
|
|
|
layer.msg('已关闭的告警不可重复关闭!', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
layer.prompt({
|
|
|
id: "alarms_cloes_id",
|
|
|
formType: 2,
|
|
|
title: '告警关闭',
|
|
|
area: ['400px']
|
|
|
},
|
|
|
function (value, index) {
|
|
|
if (value === "") {
|
|
|
layer.msg('请填写关闭意见', {icon: 7, time: 3000});
|
|
|
}
|
|
|
if ($('#closeDuration').val() === "") {
|
|
|
layer.msg('请填写关闭时长', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/close'
|
|
|
, type: "post"
|
|
|
, data: {
|
|
|
ids: ids.toString(),
|
|
|
reason: value,
|
|
|
duration: $('#closeDuration').val() * 60,
|
|
|
closeType: $('input[name="closeType"]:checked').val(),
|
|
|
noticeFlag: $('input[name="noticeFlag"]:checked').val(),
|
|
|
kpiAllFlag: $('input[name="kpiAllFlag"]:checked').val(),
|
|
|
access_token: accessToken
|
|
|
}
|
|
|
, done: function (res) {
|
|
|
if (res.success) {
|
|
|
layer.close(index);
|
|
|
layer.msg('关闭成功', {icon: 1, time: 2000}, function () {
|
|
|
reloadTable();
|
|
|
});
|
|
|
} else {
|
|
|
layer.msg('告警关闭失败,请与管理员联系!', {icon: 7, time: 3000});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
$("#alarms_cloes_id").find('textarea.layui-layer-input').attr("placeholder", "请输入关闭意见(必填)");// /[^(\d||/.)]/g,''
|
|
|
$("#alarms_cloes_id").append('<br/>' +
|
|
|
'<input type="number" id="closeDuration" class="layui-input" min="0" oninput="if(value.length>5)value=value.slice(0,5)" onkeyup="value=value.replace(/(\\d*\\.\\d).*/,\'$1\')" placeholder="输入关闭时长,单位小时(必填)"/>');
|
|
|
|
|
|
$("#alarms_cloes_id").append('<br/><div style="line-height: 38px;"><span>关闭类型:</span> ' +
|
|
|
'<input type="radio" name="closeType" value="0" title="关闭告警" checked=""> 关闭告警' +
|
|
|
'<input type="radio" name="closeType" value="1" title="关闭通知" style="margin-left: 20px;"> 关闭通知</div> ');
|
|
|
|
|
|
$("#alarms_cloes_id").append('<div style="line-height: 38px;"><span>是否关闭该指标所有告警/通知:</span> ' +
|
|
|
'<input type="radio" name="kpiAllFlag" value="true" title="是"> 是' +
|
|
|
'<input type="radio" name="kpiAllFlag" value="false" title="否" checked="" style="margin-left: 20px;"> 否</div> ');
|
|
|
|
|
|
$("#alarms_cloes_id").append('<div style="line-height: 38px;"><span>是否通知:</span> ' +
|
|
|
'<input type="radio" name="noticeFlag" value="true" title="是"> 是' +
|
|
|
'<input type="radio" name="noticeFlag" value="false" title="否" checked="" style="margin-left: 20px;"> 否</div> ');
|
|
|
});
|
|
|
//告警确认
|
|
|
$("#confirmBtn").unbind('click').on("click", function () {
|
|
|
if ($.inArray('app:alarm:confirm', checkList) == -1) {
|
|
|
layer.msg('暂无权限!', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
var ids = [];
|
|
|
var data = table.checkStatus('activewarningTable').data;
|
|
|
if (data.length == 0) {
|
|
|
layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
|
|
|
return;
|
|
|
}
|
|
|
$.each(data, function (i, obj) {
|
|
|
ids.push(obj.id)
|
|
|
});
|
|
|
layer.prompt({
|
|
|
id: "alarms_confirm_id",
|
|
|
formType: 2,
|
|
|
title: '告警确认',
|
|
|
area: ['400px']
|
|
|
},
|
|
|
function (value, index) {
|
|
|
if (value === "") {
|
|
|
layer.msg('请填确认意见', {icon: 7, time: 3000});
|
|
|
}
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/confirm'
|
|
|
, type: "post"
|
|
|
, data: {
|
|
|
ids: ids.toString(),
|
|
|
reason: value,
|
|
|
level: $('input[name="confrimlevel"]:checked').val(),
|
|
|
access_token: accessToken
|
|
|
}
|
|
|
, done: function (res) {
|
|
|
if (res.success) {
|
|
|
layer.close(index);
|
|
|
layer.msg('告警确认成功', {icon: 1, time: 2000}, function () {
|
|
|
reloadTable();
|
|
|
});
|
|
|
} else {
|
|
|
layer.msg('告警确认失败,请与管理员联系!', {icon: 7, time: 3000});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
$("#alarms_confirm_id").find('textarea.layui-layer-input').attr("placeholder", "请输入意见(必填)");
|
|
|
$("#alarms_confirm_id").append('<br/> ' +
|
|
|
'<input type="radio" name="confrimlevel" value="0" title="紧急" checked=""> 紧急' +
|
|
|
'<input type="radio" name="confrimlevel" value="1" title="非常紧急" style="margin-left: 20px;"> 非常紧急' +
|
|
|
'<input type="radio" name="confrimlevel" value="2" title="不紧急" style="margin-left: 20px;"> 不紧急');
|
|
|
});
|
|
|
//告警恢复
|
|
|
$("#resumeBtn").unbind('click').on("click", function () {
|
|
|
if ($.inArray('app:alarm:resume', checkList) == -1) {
|
|
|
layer.msg('暂无权限!', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
var ids = [];
|
|
|
var closeIds = [];
|
|
|
var data = table.checkStatus('activewarningTable').data;
|
|
|
var resumeStatus = true;
|
|
|
if (data.length == 0) {
|
|
|
layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
|
|
|
return;
|
|
|
}
|
|
|
var msg = "";
|
|
|
//选中的告警ID放到集合中
|
|
|
$.each(data, function (i, obj) {
|
|
|
var alarmStatus = JSON.stringify(obj.alarmStatus);
|
|
|
//已关闭的告警才可以恢复,告警状态,0告警,1关闭
|
|
|
if (alarmStatus && alarmStatus == '0') {
|
|
|
resumeStatus = false;
|
|
|
msg = '只能恢复已关闭状态的告警,请重新选择!';
|
|
|
}
|
|
|
ids.push(obj.id);
|
|
|
closeIds.push(obj.closeId);
|
|
|
});
|
|
|
if (!resumeStatus) {
|
|
|
layer.msg(msg, {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
layer.prompt({title: '恢复说明(必填)', formType: 2}, function (text, index) {
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/resume'
|
|
|
, type: "post"
|
|
|
, data: {
|
|
|
ids: ids.toString(),
|
|
|
reason: text,
|
|
|
closeId: closeIds.toString(),
|
|
|
resumeType: '0',//0告警关闭,1历史告警
|
|
|
access_token: accessToken
|
|
|
}
|
|
|
, done: function (res) {
|
|
|
//如果消除成功,关闭弹出框然后重新加载页面
|
|
|
if (res.success) {
|
|
|
layer.close(index);
|
|
|
layer.msg('告警已恢复!', {icon: 1, time: 3000}, function () {
|
|
|
reloadTable();
|
|
|
});
|
|
|
} else {
|
|
|
layer.msg('告警恢复失败,请与管理员联系!', {icon: 7, time: 3000});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
})
|
|
|
});
|
|
|
//导出
|
|
|
$("#exportAarmBtn").unbind('click').on("click", function () {
|
|
|
if ($.inArray('app:alarm:export', checkList) == -1) {
|
|
|
layer.msg('暂无权限!', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
var data = table.checkStatus('activewarningTable').data;
|
|
|
if (data.length == 0) {
|
|
|
//确认提示框
|
|
|
layer.confirm('当前没选择告警,将全量导出数据,请确认', {
|
|
|
btn: ['确定', '取消'] //按钮
|
|
|
}, function () {
|
|
|
var url = common.domainName + '/api-web/home/alarm/exportExcel?access_token=' + accessToken;
|
|
|
window.open(url);
|
|
|
layer.closeAll();
|
|
|
});
|
|
|
} else {
|
|
|
var ids = [];
|
|
|
//讲选中的告警ID放到集合中
|
|
|
$.each(data, function (i, obj) {
|
|
|
ids.push(obj.id);
|
|
|
});
|
|
|
ids = ids.toString();
|
|
|
var url = common.domainName + '/api-web/home/alarm/exportExcel?alarmIds=' + ids + "&access_token=" + accessToken;
|
|
|
window.open(url)
|
|
|
}
|
|
|
});
|
|
|
//发送通知
|
|
|
$("#sendNoticeBtn").unbind('click').on("click", function () {
|
|
|
if ($.inArray('app:alarm:sendnotice', checkList) == -1) {
|
|
|
layer.msg('暂无权限!', {icon: 7, time: 3000});
|
|
|
return;
|
|
|
}
|
|
|
var ids = [];
|
|
|
var resIds = [];
|
|
|
var data = table.checkStatus('activewarningTable').data;
|
|
|
if (data.length == 0) {
|
|
|
layer.msg('请最少选择一项数据', {icon: 7, time: 2000});
|
|
|
return;
|
|
|
}
|
|
|
if (data.length > 1) {
|
|
|
layer.msg('请最多选择一项数据', {icon: 7, time: 2000});
|
|
|
return;
|
|
|
}
|
|
|
//将选中的告警ID放到集合中
|
|
|
$.each(data, function (i, obj) {
|
|
|
ids.push(obj.id);
|
|
|
resIds.push(obj.resId);
|
|
|
});
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/subscribe/user/' + resIds.toString()
|
|
|
, done: function (res) {
|
|
|
if (res.data && res.data.length > 0) {
|
|
|
var username = '';
|
|
|
var begin = '<div style="padding: 0 5px 0 5px;"><table class="layui-table"><thead>' +
|
|
|
'<tr><th></th><th>名称</th><th>电话</th><th>邮箱</th></tr></thead><tbody>';
|
|
|
var end = '</tbody></table></div>';
|
|
|
$.each(res.data, function (i, v) {
|
|
|
username += '<tr><td><input class="userName" type="checkbox" data-name="' + v.username + '" checked></td><td>' + v.nickname + '</td><td>' + v.phone + '</td><td>' + v.email + '</td></tr>';
|
|
|
});
|
|
|
//获取告警通知接收人
|
|
|
var reciveUsers = begin + username + end;
|
|
|
layer.open({
|
|
|
type: 1
|
|
|
, title: "通知接收人"
|
|
|
, shade: 0.8
|
|
|
, area: ['600px', '390px']
|
|
|
, id: 'lay_users' //设定一个id,防止重复弹出
|
|
|
, content: reciveUsers
|
|
|
, btn: ['发送', '关闭']
|
|
|
, yes: function () {
|
|
|
var names = [];
|
|
|
$("input[class='userName']:checked").each(function(i){
|
|
|
names.push($(this).attr("data-name"));
|
|
|
});
|
|
|
if(names.length<1){
|
|
|
layer.msg('请最少选择一个用户', {icon: 7, time: 2000});
|
|
|
return;
|
|
|
}
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/sendnotice'
|
|
|
, type: "post"
|
|
|
, data: {
|
|
|
ids: ids.toString(),
|
|
|
names:names.toString(),
|
|
|
access_token: accessToken
|
|
|
}
|
|
|
, done: function (res) {
|
|
|
layer.closeAll();
|
|
|
if (res.success) {
|
|
|
layer.msg('发送成功', {icon: 1, time: 2000});
|
|
|
} else {
|
|
|
layer.msg('发送失败,稍后再试', {icon: 7, time: 2000});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
} else {
|
|
|
layer.msg('未获取到接收所选通知的用户!', {icon: 7, time: 2000});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
//告警处理及时率
|
|
|
getAlarmCount();
|
|
|
|
|
|
var activeAlarmTable;
|
|
|
//获取配置的列
|
|
|
common.getTableCols({
|
|
|
domId: 'activewarningTable',
|
|
|
moduleId: 'activewarning',
|
|
|
resType: ''
|
|
|
},function (retCols) {
|
|
|
var cols = [
|
|
|
{type: 'checkbox', fixed: 'left'}
|
|
|
, {
|
|
|
field: 'alarmLevel', title: '级别', align: 'center', width: 120, sort: true,
|
|
|
templet: `
|
|
|
<div>
|
|
|
{{# if (d.alarmLevel == 3) {
|
|
|
}} <span class="layui-table-warn" style="width: 100%;">严重</span> {{#
|
|
|
} else if (d.alarmLevel == 2) {
|
|
|
}} <span class="layui-table-close" style="width: 100%;">重要</span> {{#
|
|
|
} else if (d.alarmLevel == 1) {
|
|
|
}} <span class="layui-table-normal" style="width: 100%;">一般</span> {{#
|
|
|
} }}
|
|
|
</div>
|
|
|
`
|
|
|
}
|
|
|
, {
|
|
|
field: 'alarmNo', title: '告警编号', align: 'center', width: 140, sort: true,
|
|
|
}
|
|
|
, {
|
|
|
field: 'resName', title: '资源名称', width: 230, sort: true,
|
|
|
templet:`
|
|
|
<div>
|
|
|
{{# if (d.confirmStatus == 0 || d.confirmStatus == null) { }}
|
|
|
<i lay-tips="新的告警未确认,告警确认后消失!" class="shake iconfont" style="color: red;font-size: 28px;"></i>
|
|
|
{{# } }}
|
|
|
<span data-resid="{{d.resId}}" data-restype="{{d.resType}}" data-warn-zymc="{{d.id}}" data-ip="{{d.ip}}"
|
|
|
data-resname="{{d.resName}}" data-pingenable="{{d.pingEnable}}" class="layui-table-link">{{d.resName}}</span>
|
|
|
<a class="layui-icon layui-icon-picture reslist-view-topo hide" data-resid="{{d.resId}}" style="color: #FEB61E; font-size: 14px; margin-left: 10px;" lay-tips="查看资源拓扑"></a>
|
|
|
</div>
|
|
|
`
|
|
|
}
|
|
|
, {
|
|
|
field: 'kpiName', title: '指标名称', align: 'center', width: 120, sort: true,
|
|
|
templet: `
|
|
|
<div>
|
|
|
{{#
|
|
|
var kpiName = d.kpiName == 'TYPE'?'ERRPT':d.kpiName;
|
|
|
if (d.kpiIdent != 1) {
|
|
|
if(d.isWarning != 1) {
|
|
|
}} <div>{{kpiName}}</div> {{#
|
|
|
} else { }}
|
|
|
<div><span data-ident="{{d.kpiIdent}}" data-trend="{{d.isTrend}}" data-warning="{{d.isWarning}}" data-resid="{{d.resId}}" data-flag="{{d.flag}}" data-kpi="{{d.kpiId}}" data-warn-zbmc="{{d.id}}" data-name="{{kpiName}}" class="layui-table-link">{{kpiName}}</span></div>
|
|
|
{{# }
|
|
|
} else { }}
|
|
|
<div><span data-ident="{{d.kpiIdent}}" data-trend="{{d.isTrend}}" data-warning="{{d.isWarning}}" data-resid="{{d.resId}}" data-flag="{{d.flag}}" data-kpi="{{d.kpiId}}" data-warn-zbmc="{{d.id}}" data-name="{{kpiName}}" class="layui-table-link">{{kpiName}}</span></div>
|
|
|
{{# }
|
|
|
}}
|
|
|
</div>`
|
|
|
}
|
|
|
, {field: 'alarmContent', title: '告警内容', align: 'center', width: 500}
|
|
|
, {
|
|
|
field: 'alarmResource', title: '告警来源', align: 'center', minWidth: 120, templet: `<div>
|
|
|
{{# if (d.alarmResource == 1) { }}
|
|
|
<div>华为告警</div>
|
|
|
{{# } else { }}
|
|
|
<div>监控系统</div>
|
|
|
{{# } }}
|
|
|
</div>`
|
|
|
}
|
|
|
, {field: 'updateTime', title: '告警时间', align: 'center', minWidth: 180, sort: true}
|
|
|
, {field: 'alarmTime', title: '首次告警时间', align: 'center', minWidth: 180, sort: true}
|
|
|
, {field: 'durationStr', title: '持续时间', align: 'center', width: 190}
|
|
|
, {field: 'alarmRepeatCnt', title: '告警次数', align: 'center', width: 180}
|
|
|
, {field: 'nickName', title: '通知人', align: 'center', width: 180}
|
|
|
, {field: 'adminName', title: '负责人', align: 'center', width: 180}
|
|
|
, {field: 'noticeTime', title: '通知时间', align: 'center', width: 180, hide: true}
|
|
|
, {
|
|
|
title: '操作', align: 'center', minWidth: 100,
|
|
|
templet: '<div><span data-warn-view="{{d.id}}" class="layui-table-link">查看</span> <span data-warn-path="{{d.id}}" class="layui-table-link">轨迹</span></div>'
|
|
|
}
|
|
|
];
|
|
|
|
|
|
if (retCols) {
|
|
|
cols = retCols;
|
|
|
}
|
|
|
|
|
|
//渲染表格
|
|
|
activeAlarmTable = table.render({
|
|
|
elem: '#activewarningTable'
|
|
|
, url: domainName + '/api-web/home/alarm/alarmListPage'
|
|
|
, id: 'activewarningTable'
|
|
|
, toolbar: '#activeAlarmtoolbar' //开启头部工具栏,并为其绑定左侧模板
|
|
|
, defaultToolbar: ['filter']
|
|
|
, where: {
|
|
|
access_token: accessToken,
|
|
|
kpiName: $("#activewarningkw").val(),
|
|
|
busId: bizId,
|
|
|
resId: resId,
|
|
|
kpiId: kpiId,
|
|
|
alarmStatus: $("#alarmStatusSearchBox").val(),
|
|
|
alarmLevel: alarmLevel,
|
|
|
confirmStatus: $("#alarmConfirmSearchBox").val(),
|
|
|
beginTime: $("#activewarningStartdate").val(),
|
|
|
endTime: $("#activewarningEnddate").val(),
|
|
|
sortKey: sortKey,
|
|
|
alarmKpi: $("#alarmKpiSearchBox").val(),
|
|
|
durationVal: $('#inline-condition-duration input[name="durationVal"]').val(),
|
|
|
durationUnit: $('#inline-condition-duration select[name="durationUnit"]').val(),
|
|
|
netFlag: netFlag,
|
|
|
resType:resType
|
|
|
}
|
|
|
, height: 'full-245'
|
|
|
, cellMinWidth: 80
|
|
|
, page: {
|
|
|
layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
|
|
|
, theme: '#1E9FFF'
|
|
|
}
|
|
|
, even: true
|
|
|
, drag: {toolbar: false}
|
|
|
, cols: [cols],
|
|
|
done: function (res, curr, count) {
|
|
|
soulTable.render(this)
|
|
|
var groupurl = domainName + '/api-web/home/alarm/countAlarmNumByAlarmLevel?alarmTimeDay=' + todayStr + '&access_token=' + accessToken;
|
|
|
$.ajax({
|
|
|
url: groupurl,
|
|
|
type: 'get',
|
|
|
data: {
|
|
|
access_token: accessToken,
|
|
|
kpiName: $("#activewarningkw").val(),
|
|
|
busId: bizId,
|
|
|
resId: resId,
|
|
|
kpiId: kpiId,
|
|
|
alarmStatus: $("#alarmStatusSearchBox").val(),
|
|
|
alarmLevel: alarmLevel,
|
|
|
confirmStatus: $("#alarmConfirmSearchBox").val(),
|
|
|
beginTime: $("#activewarningStartdate").val(),
|
|
|
endTime: $("#activewarningEnddate").val(),
|
|
|
sortKey: sortKey,
|
|
|
alarmKpi: $("#alarmKpiSearchBox").val(),
|
|
|
durationVal: $('#inline-condition-duration input[name="durationVal"]').val(),
|
|
|
durationUnit: $('#inline-condition-duration select[name="durationUnit"]').val(),
|
|
|
netFlag: netFlag,
|
|
|
resType:resType
|
|
|
},
|
|
|
success: function (res) {
|
|
|
var map = res.map;
|
|
|
if (map) {
|
|
|
layui.use('laytpl', function () {
|
|
|
var laytpl = layui.laytpl;
|
|
|
var getTpl = document.getElementById("alarm-count-id-tpl").innerHTML;
|
|
|
laytpl(getTpl).render(map, function (html) {
|
|
|
$('#alarm-count-id').html(html);
|
|
|
});
|
|
|
//告警升级量 悬浮提示
|
|
|
var alarmUpRate, alarmDealRate;
|
|
|
$("#alarm_level_up_area_id").hover(function () {
|
|
|
alarmUpRate = layer.tips("活动告警中升级的告警总量及占比",
|
|
|
'#alarm_level_up_area_id', {tips: [1]});
|
|
|
}, function () {
|
|
|
layer.close(alarmUpRate);
|
|
|
});
|
|
|
//告警处理及时率
|
|
|
$("#alarm_deal_rate_area_id").hover(function () {
|
|
|
alarmDealRate = layer.tips("活动告警中及时处理的告警量占比",
|
|
|
'#alarm_deal_rate_area_id', {tips: [1]});
|
|
|
}, function () {
|
|
|
layer.close(alarmDealRate);
|
|
|
});
|
|
|
|
|
|
$('[data-warn-zymc]').unbind('click').on('click', function () {
|
|
|
//先去查找资源有没有权限
|
|
|
|
|
|
var resId = $(this).data("resid");
|
|
|
var resType = $(this).data("restype");
|
|
|
var ip = $(this).data("ip") ? $(this).data("ip") : "";
|
|
|
var resName = $(this).data("resname");
|
|
|
var pingEnable = $(this).data("pingenable"); //获取pingEnable的值 joke add 20200619
|
|
|
var resTypeName = '';
|
|
|
var adminName = '';
|
|
|
var manageIp = '';
|
|
|
var collProtocol = '';
|
|
|
var sign='false';
|
|
|
$.ajax({
|
|
|
url: common.domainName + "/api-web/home/resource/findById?resId="+resId + '&access_token='+ accessToken,
|
|
|
async: false,
|
|
|
type:'get',
|
|
|
success: function (res) {
|
|
|
sign=res.str;
|
|
|
var data = res.object;
|
|
|
resType = data.resType;
|
|
|
adminName = data.adminName;
|
|
|
manageIp = data.manageIp;
|
|
|
collProtocol = data.collProtocol;
|
|
|
resTypeName = data.resTypeName;
|
|
|
}
|
|
|
})
|
|
|
if(sign=='false'){
|
|
|
layer.msg('当前用户暂无此资源权限!', {icon: 7, time: 3000});
|
|
|
return false;
|
|
|
}
|
|
|
let title = resName;
|
|
|
if (title && title !== '') {
|
|
|
title += '|';
|
|
|
}
|
|
|
if (resTypeName && resType !== 'HOST_X86SERVER') {
|
|
|
title += resTypeName + '|';
|
|
|
}
|
|
|
if (ip) {
|
|
|
if (resType === 'HOST_X86SERVER') {
|
|
|
if (collProtocol && (collProtocol.split(",").length > 1 || collProtocol === 'SSH')) {
|
|
|
title += '应用IP-' + ip + '|';
|
|
|
}
|
|
|
} else {
|
|
|
title += ip + '|';
|
|
|
}
|
|
|
}
|
|
|
if (resType === 'HOST_X86SERVER' && collProtocol && collProtocol.indexOf('SNMP') !== -1 ) {
|
|
|
if (manageIp) {
|
|
|
title += '管理IP-' + manageIp + '|';
|
|
|
}
|
|
|
}
|
|
|
if (adminName) {
|
|
|
title += adminName + '|';
|
|
|
}
|
|
|
if (title.length > 0) {
|
|
|
title = title.substr(0, title.length - 1);
|
|
|
}
|
|
|
if (pingEnable == '2') { //如果pingEnable为2,则进入ping状态详情页面
|
|
|
commonDetail.openNewWin('template/detail/pingIndex', title, {'resId': resId}, false);
|
|
|
} else { //否则进入监控详情页面
|
|
|
commonDetail.openDetail(resId, resType, title);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
//指标名称点击事件
|
|
|
$('[data-warn-zbmc]').unbind("click").on('click', function () {
|
|
|
var name = $(this).data("name");
|
|
|
var params = {
|
|
|
resId: $(this).data("resid"),
|
|
|
kpiId: $(this).data("kpi"),
|
|
|
flag: $(this).data("flag"),
|
|
|
name: name,
|
|
|
warning: $(this).data("warning"),
|
|
|
ident: $(this).data("ident"),
|
|
|
trend: $(this).data("trend")
|
|
|
};
|
|
|
common.openLineChart(name, params);
|
|
|
});
|
|
|
|
|
|
//告警操作日志
|
|
|
$('[data-warn-view]').unbind('click').on('click', function () {
|
|
|
admin.req({
|
|
|
url: common.domainName + '/api-web/home/alarm/info'
|
|
|
, data: {
|
|
|
alarmId: $(this).data('warn-view'),
|
|
|
access_token: accessToken
|
|
|
}
|
|
|
}).done(function (res) {
|
|
|
laytpl($('#warnViewWinTpl').html()).render(res.obj, function (html) {
|
|
|
layer.open({
|
|
|
area: '750px',
|
|
|
title: ['告警操作信息', 'font-size:18px;'],
|
|
|
type: 1,
|
|
|
content: html
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
|
|
|
//告警轨迹
|
|
|
$('[data-warn-path]').unbind('click').on('click', function () {
|
|
|
var id = $(this).attr('data-warn-path');
|
|
|
var view = layui.view;
|
|
|
var params = {
|
|
|
"warnId": id
|
|
|
};
|
|
|
view('commonViewModel').render("template/detail/warn_gj").then(function (res) {
|
|
|
layer.open({
|
|
|
title: ['告警轨迹', 'font-size:18px;'],
|
|
|
type: 1,
|
|
|
area: ['900px', '650px'],
|
|
|
content: laytpl(res.body).render(JSON.stringify(params))
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
|
|
|
});
|
|
|
//点击严重重要一般统计告警
|
|
|
$("#alarm-count-id").find(".warn-count-item").unbind('click').on("click", function () {
|
|
|
var alarmLevel = $(this).attr("alarm-level");
|
|
|
if (alarmLevel != '' && alarmLevel != null && alarmLevel != undefined) {
|
|
|
$("#alarmLevelSearchBox").val(alarmLevel)
|
|
|
layui.form.render('select');
|
|
|
reloadTable();
|
|
|
} else {
|
|
|
$("#alarmLevelSearchBox").val("");
|
|
|
layui.form.render('select');
|
|
|
if (alarmLevel === '') {
|
|
|
reloadTable();
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
initToolBarClickEvent();
|
|
|
//表格排序监听 joke add 20200408
|
|
|
table.on('sort(activewarningTable)', function (obj) {
|
|
|
//有些时候,你可能需要根据当前排序的字段,重新向服务端发送请求,从而实现服务端排序,如:
|
|
|
if (obj.type != null) {
|
|
|
sortKey = obj.field + ' ' + obj.type;
|
|
|
} else {
|
|
|
sortKey = '';
|
|
|
}
|
|
|
reloadTable('sort');
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
|
|
|
//触发拖动列事件,参数为保存按钮的id
|
|
|
common.dragCols("activewarning_cols_save");
|
|
|
|
|
|
//保存列顺序
|
|
|
$("#activewarning_cols_save").unbind("click").on("click", function () {
|
|
|
var params = {
|
|
|
domId: 'activewarningTable',
|
|
|
moduleId: 'activewarning',
|
|
|
resType: '',
|
|
|
cols: JSON.stringify(activeAlarmTable.config.cols)
|
|
|
}
|
|
|
common.saveTableCols(params);
|
|
|
});
|
|
|
resTopo();
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
|
|
|
//绑定下拉搜索事件
|
|
|
function bindSelectEvent() {
|
|
|
//选择业务搜索
|
|
|
form.on('select(bisTypeSearch)', function (data) {
|
|
|
bizId = data.value;
|
|
|
reloadTable();
|
|
|
});
|
|
|
//选择业务搜索
|
|
|
form.on('select(alarmKpiSearch)', function (data) {
|
|
|
reloadTable();
|
|
|
});
|
|
|
// 告警状态
|
|
|
form.on('select(alarmStatusSearch)', function (data) {
|
|
|
reloadTable();
|
|
|
});
|
|
|
//告警级别
|
|
|
form.on('select(alarmLevelSearch)', function (data) {
|
|
|
reloadTable();
|
|
|
});
|
|
|
// 告警确认
|
|
|
form.on('select(alarmConfirmSearch)', function (data) {
|
|
|
reloadTable();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
$("#todayOrAllBtn").unbind().on("click",function () {
|
|
|
var $that = $(this);
|
|
|
var str = $(this).text();
|
|
|
if(str.indexOf("今日") > -1){
|
|
|
$that.text("全部告警")
|
|
|
todayStr = common.getToday('day');
|
|
|
}else{
|
|
|
todayStr = ''
|
|
|
$that.text("今日告警")
|
|
|
}
|
|
|
reloadTable();
|
|
|
})
|
|
|
|
|
|
|
|
|
//刷新表格
|
|
|
function reloadTable(type) {
|
|
|
if (type != 'sort'){
|
|
|
sortKey = '';
|
|
|
}
|
|
|
activeAlarmTable.reload({
|
|
|
page: {
|
|
|
curr: 1
|
|
|
}
|
|
|
,where: {
|
|
|
access_token: accessToken,
|
|
|
kpiName: $("#activewarningkw").val(),
|
|
|
busId: bizId,
|
|
|
resId: resId,
|
|
|
kpiId: kpiId,
|
|
|
alarmStatus: $("#alarmStatusSearchBox").val(),
|
|
|
alarmLevel: $("#alarmLevelSearchBox").val(),
|
|
|
confirmStatus: $("#alarmConfirmSearchBox").val(),
|
|
|
beginTime: $("#activewarningStartdate").val(),
|
|
|
endTime: $("#activewarningEnddate").val(),
|
|
|
sortKey: sortKey,
|
|
|
alarmKpi: $("#alarmKpiSearchBox").val(),
|
|
|
durationVal: $('#inline-condition-duration input[name="durationVal"]').val(),
|
|
|
durationUnit: $('#inline-condition-duration select[name="durationUnit"]').val(),
|
|
|
alarmTimeDay:todayStr,
|
|
|
resType:resType
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
//获取告警统计信息
|
|
|
function getAlarmCount() {
|
|
|
admin.req({
|
|
|
url: common.domainName + "/api-web/home/alarm/countByAlarmLevel"
|
|
|
, type: "get"
|
|
|
, done: function (data) {
|
|
|
var alarms = data.data;
|
|
|
if (data.code == 0) {
|
|
|
$.each(alarms, function (i, v) {
|
|
|
if (v.alarmLevel == 5) {//及时率
|
|
|
$("#alarm_dealRate").html(v.alarmNum + "%");
|
|
|
}
|
|
|
});
|
|
|
} else {
|
|
|
console.error("接口请求失败")
|
|
|
console.log(data.msg);
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
form.render(null, 'activewarning-form');
|
|
|
//60秒倒计时
|
|
|
(function () {
|
|
|
var autoBtn = $('#activewarningAutoFlush');
|
|
|
var timer = null;
|
|
|
|
|
|
function autoFlush(target) {
|
|
|
var el = target.find('span');
|
|
|
var checked = target.find('input').prop('checked');
|
|
|
localStorage.setItem('alarm_auto__flush', checked);
|
|
|
function fn() {
|
|
|
var second = el.data('second');
|
|
|
var checked = target.find('input').prop('checked');
|
|
|
if (!checked) {
|
|
|
return;
|
|
|
}
|
|
|
--second;
|
|
|
el.data('second', second);
|
|
|
el.html(second + '秒');
|
|
|
|
|
|
timer = setTimeout(fn, 1000);
|
|
|
if (second <= 0) {
|
|
|
clearTimeout(timer);
|
|
|
reloadTable()
|
|
|
$(el).data('second', 60);
|
|
|
$(el).text("60秒");
|
|
|
fn();
|
|
|
}
|
|
|
}
|
|
|
if (checked) {
|
|
|
timer = setTimeout(fn, 1000);
|
|
|
} else {
|
|
|
clearTimeout(timer);
|
|
|
}
|
|
|
}
|
|
|
form.on("checkbox(warnActiveAutoFlush)",function (data) {
|
|
|
autoFlush(autoBtn);
|
|
|
})
|
|
|
/*autoBtn.change(function () {
|
|
|
autoFlush(autoBtn);
|
|
|
});*/
|
|
|
var auto = localStorage.getItem('alarm_auto__flush')
|
|
|
auto = auto ? auto : false;
|
|
|
autoBtn.find('input').prop('checked', auto);
|
|
|
|
|
|
autoFlush(autoBtn);
|
|
|
|
|
|
admin.on('hash(*)', function (router) {
|
|
|
if (router.href === '/activewarning') {
|
|
|
autoFlush(autoBtn);
|
|
|
} else {
|
|
|
clearTimeout(timer);
|
|
|
}
|
|
|
});
|
|
|
})();
|
|
|
|
|
|
function resTopo() {
|
|
|
|
|
|
//绑定鼠标移入移出事件
|
|
|
$('table tr').hover(function (obj) {
|
|
|
$(obj.currentTarget).find('.reslist-view-topo').removeClass('hide');
|
|
|
}, function (obj) {
|
|
|
$(obj.currentTarget).find('.reslist-view-topo').addClass('hide');
|
|
|
})
|
|
|
|
|
|
// 加入/移出收藏夹
|
|
|
$('a.reslist-view-topo').unbind('click').on('click', function () {
|
|
|
common.viewResTopo($(this).data('resid'));
|
|
|
});
|
|
|
|
|
|
}
|
|
|
});
|
|
|
}); |
|
|
\ No newline at end of file |
...
|
...
|
|