|
|
@ -7,27 +7,27 @@ module.exports = function (app, opts) { |
|
|
|
const { database: anxinyun } = clickHouse.anxinyun.opts.config |
|
|
|
const alarmHandleStatistics = app.fs.scheduleInit( |
|
|
|
{ |
|
|
|
interval: '0 58 9 * * *', |
|
|
|
interval: '0 48 1 ? * MON',//0 48 1 ? * MON 每周一凌晨1点48开始执行
|
|
|
|
// immediate: true,
|
|
|
|
//proRun: true,
|
|
|
|
proRun: true, |
|
|
|
}, |
|
|
|
async () => { |
|
|
|
try { |
|
|
|
let anxinStruc = await getAxyStructs() |
|
|
|
let pomsProject = await pomsProjectRange() |
|
|
|
if (anxinStruc.length) { |
|
|
|
let dataAlarms = await getDataAlarms(anxinStruc);//数据告警
|
|
|
|
let { dataSum, dataMaps } = await getDataAlarms(anxinStruc);//数据告警
|
|
|
|
let appAlarms = await getAppAlarms(pomsProject);//应用告警
|
|
|
|
let videoAlarms = await getVideoAlarms(anxinStruc);//视频告警
|
|
|
|
|
|
|
|
|
|
|
|
let time = moment().format() |
|
|
|
//算全局
|
|
|
|
let dataArrToSave = [] |
|
|
|
let dataMap = calculate(dataAlarms, appAlarms, videoAlarms) |
|
|
|
let sum = dataAlarms.length + appAlarms.length + videoAlarms.length; |
|
|
|
//let dataArrToSave = []
|
|
|
|
let dataMap = calculate(dataMaps, appAlarms, videoAlarms) |
|
|
|
let sum = dataSum + appAlarms.length + videoAlarms.length; |
|
|
|
if (sum) { |
|
|
|
dataArrToSave.push({ |
|
|
|
let data = { |
|
|
|
time: time, |
|
|
|
projectCorrelationId: null,//全局
|
|
|
|
day1: parseFloat((100 * dataMap.day1 / sum).toFixed(2)), |
|
|
@ -36,32 +36,60 @@ module.exports = function (app, opts) { |
|
|
|
day15: parseFloat((100 * dataMap.day15 / sum).toFixed(2)), |
|
|
|
day30: parseFloat((100 * dataMap.day30 / sum).toFixed(2)), |
|
|
|
day30m: parseFloat((100 * dataMap.day30m / sum).toFixed(2)), |
|
|
|
}) |
|
|
|
} |
|
|
|
await models.AlarmHandleStatistics.create(data) |
|
|
|
} |
|
|
|
|
|
|
|
//算单个项目
|
|
|
|
pomsProject.map(p => { |
|
|
|
pomsProject.map(async p => { |
|
|
|
let pid = p.id; |
|
|
|
let pDataAlarms = dataAlarms.filter(da => da.pomsProject.indexOf(pid) != -1) |
|
|
|
let pAppAlarms = appAlarms.filter(aa => aa.app.projectCorrelations.map(ap => ap.id).indexOf(pid) != -1) |
|
|
|
let pVideoAlarms = videoAlarms.filter(va => va.pomsProject.indexOf(pid) != -1) |
|
|
|
|
|
|
|
let pDataMap = calculate(pDataAlarms, pAppAlarms, pVideoAlarms) |
|
|
|
let sm = pDataAlarms.length + pAppAlarms.length + pVideoAlarms.length; |
|
|
|
if (sm) { |
|
|
|
dataArrToSave.push({ |
|
|
|
time: time, |
|
|
|
projectCorrelationId: pid,//单个项目
|
|
|
|
day1: parseFloat((100 * pDataMap.day1 / sum).toFixed(2)), |
|
|
|
day3: parseFloat((100 * pDataMap.day3 / sum).toFixed(2)), |
|
|
|
day7: parseFloat((100 * pDataMap.day7 / sum).toFixed(2)), |
|
|
|
day15: parseFloat((100 * pDataMap.day15 / sum).toFixed(2)), |
|
|
|
day30: parseFloat((100 * pDataMap.day30 / sum).toFixed(2)), |
|
|
|
day30m: parseFloat((100 * pDataMap.day30m / sum).toFixed(2)), |
|
|
|
}) |
|
|
|
//let pid = 11
|
|
|
|
let pAnxinStruc = await getAxyStructs(pid) |
|
|
|
let pPomsProject = await pomsProjectRange(pid) |
|
|
|
if (pAnxinStruc.length) { |
|
|
|
let { dataSum, dataMaps } = await getDataAlarms(pAnxinStruc);//数据告警
|
|
|
|
let pAppAlarms = await getAppAlarms(pPomsProject);//应用告警
|
|
|
|
let pVideoAlarms = await getVideoAlarms(pAnxinStruc);//视频告警
|
|
|
|
let pDataMap = calculate(dataMaps, pAppAlarms, pVideoAlarms) |
|
|
|
let sm = dataSum + pAppAlarms.length + pVideoAlarms.length; |
|
|
|
if (sm) { |
|
|
|
let data = { |
|
|
|
time: time, |
|
|
|
projectCorrelationId: pid,//单个项目
|
|
|
|
day1: parseFloat((100 * pDataMap.day1 / sm).toFixed(2)), |
|
|
|
day3: parseFloat((100 * pDataMap.day3 / sm).toFixed(2)), |
|
|
|
day7: parseFloat((100 * pDataMap.day7 / sm).toFixed(2)), |
|
|
|
day15: parseFloat((100 * pDataMap.day15 / sm).toFixed(2)), |
|
|
|
day30: parseFloat((100 * pDataMap.day30 / sm).toFixed(2)), |
|
|
|
day30m: parseFloat((100 * pDataMap.day30m / sm).toFixed(2)), |
|
|
|
} |
|
|
|
await models.AlarmHandleStatistics.create(data) |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
await models.AlarmHandleStatistics.bulkCreate(dataArrToSave) |
|
|
|
//算单个项目
|
|
|
|
// pomsProject.map(p => {
|
|
|
|
// let pid = p.id;
|
|
|
|
// let pDataAlarms = dataAlarms.filter(da => da.pomsProject.indexOf(pid) != -1)
|
|
|
|
// let pAppAlarms = appAlarms.filter(aa => aa.app.projectCorrelations.map(ap => ap.id).indexOf(pid) != -1)
|
|
|
|
// let pVideoAlarms = videoAlarms.filter(va => va.pomsProject.indexOf(pid) != -1)
|
|
|
|
|
|
|
|
// let pDataMap = calculate(pDataAlarms, pAppAlarms, pVideoAlarms)
|
|
|
|
// let sm = pDataAlarms.length + pAppAlarms.length + pVideoAlarms.length;
|
|
|
|
// if (sm) {
|
|
|
|
// dataArrToSave.push({
|
|
|
|
// time: time,
|
|
|
|
// projectCorrelationId: pid,//单个项目
|
|
|
|
// day1: parseFloat((100 * pDataMap.day1 / sum).toFixed(2)),
|
|
|
|
// day3: parseFloat((100 * pDataMap.day3 / sum).toFixed(2)),
|
|
|
|
// day7: parseFloat((100 * pDataMap.day7 / sum).toFixed(2)),
|
|
|
|
// day15: parseFloat((100 * pDataMap.day15 / sum).toFixed(2)),
|
|
|
|
// day30: parseFloat((100 * pDataMap.day30 / sum).toFixed(2)),
|
|
|
|
// day30m: parseFloat((100 * pDataMap.day30m / sum).toFixed(2)),
|
|
|
|
// })
|
|
|
|
// }
|
|
|
|
// })
|
|
|
|
//await models.AlarmHandleStatistics.bulkCreate(dataArrToSave)
|
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error(error); |
|
|
@ -69,33 +97,34 @@ module.exports = function (app, opts) { |
|
|
|
} |
|
|
|
) |
|
|
|
|
|
|
|
function calculate(dataAlarms, appAlarms, videoAlarms) { |
|
|
|
function calculate(dataMaps, appAlarms, videoAlarms) { |
|
|
|
try { |
|
|
|
let { day1, day3, day7, day15, day30, day30m } = dataMaps; |
|
|
|
//算全局
|
|
|
|
let dataMap = { |
|
|
|
day1: 0,//当日处理
|
|
|
|
day3: 0,//3日内
|
|
|
|
day7: 0,//7日内
|
|
|
|
day15: 0,//15日内
|
|
|
|
day30: 0,//30日内
|
|
|
|
day30m: 0//超过30日
|
|
|
|
day1: day1[0].count,//当日处理
|
|
|
|
day3: day3[0].count,//3日内
|
|
|
|
day7: day7[0].count,//7日内
|
|
|
|
day15: day15[0].count,//15日内
|
|
|
|
day30: day30[0].count,//30日内
|
|
|
|
day30m: day30m[0].count//超过30日
|
|
|
|
} |
|
|
|
dataAlarms.filter(d => d.State > 3).map(da => { |
|
|
|
let range = moment(da.confirmTime).diff(moment(da.StartTime), 'day') |
|
|
|
if (range <= 1) { |
|
|
|
dataMap.day1++ |
|
|
|
} else if (range > 1 && range <= 3) { |
|
|
|
dataMap.day3++ |
|
|
|
} else if (range > 3 && range <= 7) { |
|
|
|
dataMap.day7++ |
|
|
|
} else if (range > 7 && range <= 15) { |
|
|
|
dataMap.day15++ |
|
|
|
} else if (range > 15 && range <= 30) { |
|
|
|
dataMap.day30++ |
|
|
|
} else if (range > 30) { |
|
|
|
dataMap.day30m++ |
|
|
|
} |
|
|
|
}) |
|
|
|
// dataAlarms.filter(d => d.State > 3).map(da => {
|
|
|
|
// let range = moment(da.confirmTime).diff(moment(da.StartTime), 'day')
|
|
|
|
// if (range <= 1) {
|
|
|
|
// dataMap.day1++
|
|
|
|
// } else if (range > 1 && range <= 3) {
|
|
|
|
// dataMap.day3++
|
|
|
|
// } else if (range > 3 && range <= 7) {
|
|
|
|
// dataMap.day7++
|
|
|
|
// } else if (range > 7 && range <= 15) {
|
|
|
|
// dataMap.day15++
|
|
|
|
// } else if (range > 15 && range <= 30) {
|
|
|
|
// dataMap.day30++
|
|
|
|
// } else if (range > 30) {
|
|
|
|
// dataMap.day30m++
|
|
|
|
// }
|
|
|
|
// })
|
|
|
|
appAlarms.filter(d => d.confirmTime).map(da => { |
|
|
|
let range = moment(da.confirmTime).diff(moment(da.createTime), 'day') |
|
|
|
if (range < 1) { |
|
|
@ -134,6 +163,17 @@ module.exports = function (app, opts) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function getStr(alarmQueryOptionStr, paramStr) { |
|
|
|
return ` |
|
|
|
select count(AlarmId) count from |
|
|
|
(SELECT |
|
|
|
alarms.AlarmId AS AlarmId, |
|
|
|
alarms.State AS State, |
|
|
|
alarms.StructureId AS StructureId, |
|
|
|
StartTime, EndTime |
|
|
|
${alarmQueryOptionStr}) where State>3 and ${paramStr}` |
|
|
|
} |
|
|
|
|
|
|
|
async function getDataAlarms(anxinStruc) { |
|
|
|
try { |
|
|
|
const anxinStrucIds = anxinStruc.map(a => a.strucId) |
|
|
@ -151,42 +191,61 @@ module.exports = function (app, opts) { |
|
|
|
console.log('开始查数据-数据-数据类告警---' + moment().format('YYYY-MM-DD HH:mm:ss')) |
|
|
|
|
|
|
|
const alarmRes = await clickHouse.dataAlarm.query(` |
|
|
|
SELECT |
|
|
|
select count(AlarmId) count from |
|
|
|
(SELECT |
|
|
|
alarms.AlarmId AS AlarmId, |
|
|
|
alarms.State AS State, |
|
|
|
alarms.StructureId AS StructureId, |
|
|
|
StartTime, EndTime |
|
|
|
${alarmQueryOptionStr}`).toPromise();
|
|
|
|
|
|
|
|
console.log('数据-数据-数据告警查询结束---' + moment().format('YYYY-MM-DD HH:mm:ss') + `---一共${alarmRes.length}条`) |
|
|
|
|
|
|
|
const confirmedAlarm = alarmRes.filter(ar => ar.State && ar.State > 2).map(ar => "'" + ar.AlarmId + "'"); |
|
|
|
const confirmedAlarmDetailMax = confirmedAlarm.length ? |
|
|
|
await clickHouse.dataAlarm.query(` |
|
|
|
SELECT |
|
|
|
max(Time) AS Time, AlarmId |
|
|
|
FROM |
|
|
|
alarm_details |
|
|
|
WHERE |
|
|
|
AlarmId IN (${confirmedAlarm.join(',')}) |
|
|
|
GROUP BY AlarmId |
|
|
|
`).toPromise() : [];
|
|
|
|
|
|
|
|
alarmRes.forEach(ar => { |
|
|
|
ar.pomsProject = ( |
|
|
|
anxinStruc.find(as => as.strucId == ar.StructureId) || |
|
|
|
{ |
|
|
|
pomsProject: [ |
|
|
|
// TODO: 开发临时添加
|
|
|
|
] |
|
|
|
} |
|
|
|
).pomsProject.map(p => p.id) |
|
|
|
${alarmQueryOptionStr})`).toPromise();
|
|
|
|
|
|
|
|
// 最新告警详情 - 确认信息
|
|
|
|
let corConfirmedData = (confirmedAlarmDetailMax.find(cdm => cdm.AlarmId == ar.AlarmId) || {}); |
|
|
|
ar.confirmTime = corConfirmedData.Time || ar.EndTime |
|
|
|
}) |
|
|
|
return alarmRes; |
|
|
|
let day1Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)<=1'); |
|
|
|
let day1 = await clickHouse.dataAlarm.query(day1Str).toPromise(); |
|
|
|
|
|
|
|
let day3Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>1 and Date(EndTime) - Date(StartTime)<=3'); |
|
|
|
let day3 = await clickHouse.dataAlarm.query(day3Str).toPromise(); |
|
|
|
|
|
|
|
let day7Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>3 and Date(EndTime) - Date(StartTime)<=7'); |
|
|
|
let day7 = await clickHouse.dataAlarm.query(day7Str).toPromise(); |
|
|
|
|
|
|
|
let day15Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>7 and Date(EndTime) - Date(StartTime)<=15'); |
|
|
|
let day15 = await clickHouse.dataAlarm.query(day15Str).toPromise(); |
|
|
|
|
|
|
|
let day30Str = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>15 and Date(EndTime) - Date(StartTime)<=30'); |
|
|
|
let day30 = await clickHouse.dataAlarm.query(day30Str).toPromise(); |
|
|
|
|
|
|
|
let day30mStr = getStr(alarmQueryOptionStr, 'Date(EndTime) - Date(StartTime)>30'); |
|
|
|
let day30m = await clickHouse.dataAlarm.query(day30mStr).toPromise(); |
|
|
|
|
|
|
|
// console.log('数据-数据-数据告警查询结束---' + moment().format('YYYY-MM-DD HH:mm:ss') + `---一共${alarmRes.length}条`)
|
|
|
|
|
|
|
|
// const confirmedAlarm = alarmRes.filter(ar => ar.State && ar.State > 2).map(ar => "'" + ar.AlarmId + "'");
|
|
|
|
// const confirmedAlarmDetailMax = confirmedAlarm.length ?
|
|
|
|
// await clickHouse.dataAlarm.query(`
|
|
|
|
// SELECT
|
|
|
|
// max(Time) AS Time, AlarmId
|
|
|
|
// FROM
|
|
|
|
// alarm_details
|
|
|
|
// WHERE
|
|
|
|
// AlarmId IN (${confirmedAlarm.join(',')})
|
|
|
|
// GROUP BY AlarmId
|
|
|
|
// `).toPromise() : [];
|
|
|
|
|
|
|
|
// alarmRes.forEach(ar => {
|
|
|
|
// ar.pomsProject = (
|
|
|
|
// anxinStruc.find(as => as.strucId == ar.StructureId) ||
|
|
|
|
// {
|
|
|
|
// pomsProject: [
|
|
|
|
// // TODO: 开发临时添加
|
|
|
|
// ]
|
|
|
|
// }
|
|
|
|
// ).pomsProject.map(p => p.id)
|
|
|
|
|
|
|
|
// // 最新告警详情 - 确认信息
|
|
|
|
// let corConfirmedData = (confirmedAlarmDetailMax.find(cdm => cdm.AlarmId == ar.AlarmId) || {});
|
|
|
|
// ar.confirmTime = corConfirmedData.Time || ar.EndTime
|
|
|
|
// })
|
|
|
|
return { dataSum: alarmRes[0].count, dataMaps: { day1, day3, day7, day15, day30, day30m } }; |
|
|
|
} catch (error) { |
|
|
|
console.error(error); |
|
|
|
} |
|
|
@ -318,9 +377,9 @@ module.exports = function (app, opts) { |
|
|
|
console.error(error); |
|
|
|
} |
|
|
|
} |
|
|
|
async function pomsProjectRange() { |
|
|
|
async function pomsProjectRange(pepProjectId) { |
|
|
|
try { |
|
|
|
const { pepProjectRes, bindRes } = await pomsWithPepRangeParams() |
|
|
|
const { pepProjectRes, bindRes } = await pomsWithPepRangeParams(pepProjectId) |
|
|
|
let pomsProject = [] |
|
|
|
for (let b of bindRes) { |
|
|
|
if (b.pepProjectId) { |
|
|
@ -341,9 +400,18 @@ module.exports = function (app, opts) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
async function pomsWithPepRangeParams() { |
|
|
|
async function pomsWithPepRangeParams(pepProjectId) { |
|
|
|
try { |
|
|
|
const bindRes = await models.ProjectCorrelation.findAll({ where: { del: false } }); |
|
|
|
let findOption = { |
|
|
|
where: { |
|
|
|
del: false |
|
|
|
} |
|
|
|
} |
|
|
|
if (pepProjectId) { |
|
|
|
// 有 特定的项目id 就按此查询
|
|
|
|
findOption.where.id = pepProjectId |
|
|
|
} |
|
|
|
const bindRes = await models.ProjectCorrelation.findAll(findOption); |
|
|
|
// 获取不重复的 项企项目id
|
|
|
|
let pepProjectIds = [] |
|
|
|
for (let b of bindRes) { |
|
|
@ -379,9 +447,9 @@ module.exports = function (app, opts) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
async function getAxyStructs() { |
|
|
|
async function getAxyStructs(pepProjectId) { |
|
|
|
try { |
|
|
|
const { pepProjectRes, bindRes } = await pomsWithPepRangeParams() |
|
|
|
const { pepProjectRes, bindRes } = await pomsWithPepRangeParams(pepProjectId) |
|
|
|
// 获取不重复的 安心云项目 id
|
|
|
|
const anxinProjectIds = [ |
|
|
|
...(bindRes).reduce( |
|
|
|