From 86465dbc8c104f6b3db621c2446c9fe2690106b1 Mon Sep 17 00:00:00 2001 From: wuqun Date: Wed, 2 Nov 2022 09:28:11 +0800 Subject: [PATCH] =?UTF-8?q?(*)=E5=91=8A=E8=AD=A6=E5=8F=91=E7=8E=B0?= =?UTF-8?q?=E5=92=8C=E7=A1=AE=E8=AE=A4=E6=8E=A8=E9=80=81=E5=88=B0=E5=89=8D?= =?UTF-8?q?=E7=AB=AF,=20=E6=96=B9=E6=B3=95=E5=86=99=E5=88=B0utils=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/controllers/alarm/alarmConfirmLog.js | 105 +---------------- api/app/lib/controllers/alarm/app.js | 6 +- api/app/lib/controllers/alarm/video.js | 6 +- api/app/lib/service/kafka.js | 8 +- api/app/lib/utils/alarmHandle.js | 109 ++++++++++++++++++ 5 files changed, 122 insertions(+), 112 deletions(-) create mode 100644 api/app/lib/utils/alarmHandle.js diff --git a/api/app/lib/controllers/alarm/alarmConfirmLog.js b/api/app/lib/controllers/alarm/alarmConfirmLog.js index 11cfd5b..1e67018 100644 --- a/api/app/lib/controllers/alarm/alarmConfirmLog.js +++ b/api/app/lib/controllers/alarm/alarmConfirmLog.js @@ -5,7 +5,7 @@ const moment = require('moment') async function alarmConfirmLog(ctx, confirmPost, content) { try { const { models } = ctx.fs.dc; - const { clickHouse } = ctx.app.fs; + const { utils: { sendConfirmToWeb } } = ctx.app.fs //存日志 let logDatas = []; confirmPost.map(cp => { @@ -35,7 +35,7 @@ async function alarmConfirmLog(ctx, confirmPost, content) { //消息推送到前端 if (logDatas.length) { - await sendConfirmToWeb(ctx.app, models, clickHouse, logDatas, false); + await sendConfirmToWeb(logDatas, false); } } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); @@ -46,105 +46,6 @@ async function alarmConfirmLog(ctx, confirmPost, content) { } } -let constAlarmGroups = { - 1: '数据中断', - 2: '数据异常', - 3: '策略命中', - 4: '设备异常', - 5: '设备异常', - 'video': '视频异常', - 'app': '应用异常' -} -async function sendAppearToWeb(app, models, clickHouse, datas, ttype) { - try { - //告警类型 - let alarmGroup = null - - //项目信息 - let { projects, pepProjects } = await getProjectsInfo(models, clickHouse, datas); - - //数据类区分alarmGroup - if (ttype == 'data') { - let alarm_group = await clickHouse.anxinyun.query( - `SELECT alarm_group FROM t_alarm_code WHERE code='${datas[0].alarmInfo.alarmTypeCode}'`).toPromise(); - - alarmGroup = alarm_group.length ? constAlarmGroups[alarm_group[0].alarm_group] : null - } else { - alarmGroup = constAlarmGroups[ttype] - } - - let sendData = [] - datas.map(ld => { - let pepPId = projects.find(p => p.id == ld.projectCorrelationId).pepProjectId; - sendData.push({ - projectCorrelationId: ld.projectCorrelationId, - project: projects.find(p => p.id == ld.projectCorrelationId).name || pepProjects.find(pp => pp.id == pepPId).project_name,//前者为自定义项目名称 - source: ld.alarmInfo.sourceName, - type: ld.type, - time: ld.time, - alarmGroup//告警类型 - }) - }) - app.socket.emit('alarmSendSocket', { type: 'alarmAppear', sendData }) - } catch (err) { - console.log(`告警(发现)推送失败, error: ${err}`); - } -} - -async function getProjectsInfo(models, clickHouse, logDatas) { - try { - let pIds = logDatas.map(l => l.projectCorrelationId);//所有的项目的id - let projects = await models.ProjectCorrelation.findAll({ - where: { id: { $in: pIds } }, - attributes: ['id', 'name', 'pepProjectId'] - }); - - let pepPojectIds = new Set(); - for (let p of projects) { - pepPojectIds.add(p.pepProjectId); - } - - let pepProjects = pepPojectIds.size ? await clickHouse.projectManage.query(` - SELECT id, project_name FROM t_pim_project WHERE id IN (${[...pepPojectIds]})`).toPromise() : []; - - return { projects, pepProjects }; - } catch (err) { - console.log(`获取项目信息失败, error: ${err}`); - } -} -async function sendConfirmToWeb(app, models, clickHouse, logDatas, isAuto) { - try { - //用户信息 - let userName = null - if (!isAuto) { - let userPepRes = await clickHouse.pepEmis.query( - `SELECT DISTINCT user.id AS id, "user"."name" AS name FROM user WHERE user.id=${logDatas[0].pepUserId}`).toPromise(); - userName = userPepRes.length ? userPepRes[0].name : null - } - - //项目信息 - let { projects, pepProjects } = await getProjectsInfo(models, clickHouse, logDatas); - let sendData = [] - logDatas.map(ld => { - let pepPId = projects.find(p => p.id == ld.projectCorrelationId).pepProjectId; - sendData.push({ - user: userName, - projectCorrelationId: ld.projectCorrelationId, - project: projects.find(p => p.id == ld.projectCorrelationId).name || pepProjects.find(pp => pp.id == pepPId).project_name,//前者为自定义项目名称 - source: ld.alarmInfo.source, - type: ld.alarmInfo.type, - time: ld.confirmTime, - isAuto//是否为自动恢复,自动恢复时user为null - }) - }) - app.socket.emit('alarmSendSocket', { type: 'alarmConfirm', sendData })//小飞(处理人) 确认并关闭了A项目(项目) DTU设备(告警源) 状态异常(异常类型)的问题 - } catch (err) { - console.log(`告警(确认)推送失败, error: ${err}`); - } -} - module.exports = { - alarmConfirmLog, - sendAppearToWeb,//推送告警发现 - sendConfirmToWeb//推送告警确认 + alarmConfirmLog }; \ No newline at end of file diff --git a/api/app/lib/controllers/alarm/app.js b/api/app/lib/controllers/alarm/app.js index 89a5896..54b9b9e 100644 --- a/api/app/lib/controllers/alarm/app.js +++ b/api/app/lib/controllers/alarm/app.js @@ -1,7 +1,7 @@ 'use strict'; const moment = require('moment') -const { alarmConfirmLog, sendAppearToWeb } = require('./alarmConfirmLog'); +const { alarmConfirmLog } = require('./alarmConfirmLog'); async function inspection(ctx) { // 巡查 try { @@ -143,7 +143,7 @@ async function notedInspection(ctx) { async function apiError(ctx) { try { - const { clickHouse } = ctx.app.fs + const { utils: { sendAppearToWeb } } = ctx.app.fs const models = ctx.fs.dc.models; const { projectAppId, alarmContent, router, statusCode, screenshot = '', type } = ctx.request.body const now = moment().format() @@ -237,7 +237,7 @@ async function apiError(ctx) { //消息推送到前端 - await sendAppearToWeb(ctx.app, models, clickHouse, [data], 'app'); + await sendAppearToWeb([data], 'app'); } } diff --git a/api/app/lib/controllers/alarm/video.js b/api/app/lib/controllers/alarm/video.js index 8fd296b..a7084a1 100644 --- a/api/app/lib/controllers/alarm/video.js +++ b/api/app/lib/controllers/alarm/video.js @@ -1,6 +1,6 @@ 'use strict'; const moment = require('moment') -const { alarmConfirmLog, sendAppearToWeb } = require('./alarmConfirmLog'); +const { alarmConfirmLog } = require('./alarmConfirmLog'); async function deviceType(ctx) { try { const { models } = ctx.fs.dc; @@ -288,7 +288,7 @@ async function alarmAdded(ctx) { try { const { models } = ctx.fs.dc; const { clickHouse } = ctx.app.fs - const { utils: { anxinStrucIdRange } } = ctx.app.fs + const { utils: { anxinStrucIdRange, sendAppearToWeb } } = ctx.app.fs let anxinStruc = await anxinStrucIdRange({ ctx }) const { serial_no, channel_no, create_time, description, status_id } = ctx.request.body; @@ -321,7 +321,7 @@ async function alarmAdded(ctx) { //消息推送到前端 if (datas.length) { - await sendAppearToWeb(ctx.app, models, clickHouse, datas, 'video'); + await sendAppearToWeb(datas, 'video'); } } ctx.status = 200; diff --git a/api/app/lib/service/kafka.js b/api/app/lib/service/kafka.js index 3e2d7e2..5c4cb9a 100644 --- a/api/app/lib/service/kafka.js +++ b/api/app/lib/service/kafka.js @@ -1,7 +1,6 @@ 'use strict'; const moment = require('moment'); const Kafka = require('kafka-node'); -const { sendAppearToWeb, sendConfirmToWeb } = require('../controllers/alarm/alarmConfirmLog') module.exports = async function factory(app, opts) { try { const client = new Kafka.KafkaClient({ kafkaHost: opts.kafka.rootURL, fromOffset: true }); @@ -49,6 +48,7 @@ module.exports = async function factory(app, opts) { let consumer = new Kafka.ConsumerGroup(Object.assign({}, { groupId: 'yunwei-platform-api', fromOffset: 'latest' }, { kafkaHost: opts.kafka.rootURL }), ['anxinyun_alarm']) consumer.on('message', async function (message) { let msg = JSON.parse(message.value) + console.log('kafka consumer----------接收到消息'); await savePullAlarm(msg); }) // let offset = new Kafka.Offset(client); @@ -90,7 +90,7 @@ module.exports = async function factory(app, opts) { //保存告警[发现] async function savePullAlarm(msg) { - const { clickHouse } = app.fs + const { clickHouse, utils: { sendAppearToWeb, sendConfirmToWeb } } = app.fs try { let { messageMode, structureId, sourceName, alarmTypeCode, alarmCode, content, time } = msg; let structsAche = await getStructsAche(); @@ -126,7 +126,7 @@ module.exports = async function factory(app, opts) { //消息推送到前端 if (datas.length) { - await sendAppearToWeb(app, models, clickHouse, datas, 'data'); + await sendAppearToWeb(datas, 'data'); } @@ -154,7 +154,7 @@ module.exports = async function factory(app, opts) { //消息推送到前端 if (datas.length) { - await sendConfirmToWeb(app, models, clickHouse, datas, true); + await sendConfirmToWeb(datas, true); } } } diff --git a/api/app/lib/utils/alarmHandle.js b/api/app/lib/utils/alarmHandle.js new file mode 100644 index 0000000..43c311c --- /dev/null +++ b/api/app/lib/utils/alarmHandle.js @@ -0,0 +1,109 @@ +'use strict'; + +module.exports = function (app, opts) { + const { models } = app.fs.dc + const { clickHouse } = app.fs + + let constAlarmGroups = { + 1: '数据中断', + 2: '数据异常', + 3: '策略命中', + 4: '设备异常', + 5: '设备异常', + 'video': '视频异常', + 'app': '应用异常' + } + async function sendAppearToWeb(datas, ttype) { + try { + //告警类型 + let alarmGroup = null + + //项目信息 + let { projects, pepProjects } = await getProjectsInfo(datas); + + //数据类区分alarmGroup + if (ttype == 'data') { + let alarm_group = await clickHouse.anxinyun.query( + `SELECT alarm_group FROM t_alarm_code WHERE code='${datas[0].alarmInfo.alarmTypeCode}'`).toPromise(); + + alarmGroup = alarm_group.length ? constAlarmGroups[alarm_group[0].alarm_group] : null + } else { + alarmGroup = constAlarmGroups[ttype] + } + + let sendData = [] + datas.map(ld => { + let pepPId = projects.find(p => p.id == ld.projectCorrelationId).pepProjectId; + sendData.push({ + projectCorrelationId: ld.projectCorrelationId, + project: projects.find(p => p.id == ld.projectCorrelationId).name || pepProjects.find(pp => pp.id == pepPId).project_name,//前者为自定义项目名称 + source: ld.alarmInfo.sourceName, + type: ld.type, + time: ld.time, + alarmGroup//告警类型 + }) + }) + app.socket.emit('alarmSendSocket', { type: 'alarmAppear', sendData }) + } catch (err) { + console.log(`告警(发现)推送失败, error: ${err}`); + } + } + + async function sendConfirmToWeb(logDatas, isAuto) { + try { + //用户信息 + let userName = null + if (!isAuto) { + let userPepRes = await clickHouse.pepEmis.query( + `SELECT DISTINCT user.id AS id, "user"."name" AS name FROM user WHERE user.id=${logDatas[0].pepUserId}`).toPromise(); + userName = userPepRes.length ? userPepRes[0].name : null + } + + //项目信息 + let { projects, pepProjects } = await getProjectsInfo(logDatas); + let sendData = [] + logDatas.map(ld => { + let pepPId = projects.find(p => p.id == ld.projectCorrelationId).pepProjectId; + sendData.push({ + user: userName, + projectCorrelationId: ld.projectCorrelationId, + project: projects.find(p => p.id == ld.projectCorrelationId).name || pepProjects.find(pp => pp.id == pepPId).project_name,//前者为自定义项目名称 + source: ld.alarmInfo.source, + type: ld.alarmInfo.type, + time: ld.confirmTime, + isAuto//是否为自动恢复,自动恢复时user为null + }) + }) + app.socket.emit('alarmSendSocket', { type: 'alarmConfirm', sendData })//小飞(处理人) 确认并关闭了A项目(项目) DTU设备(告警源) 状态异常(异常类型)的问题 + } catch (err) { + console.log(`告警(确认)推送失败, error: ${err}`); + } + } + + async function getProjectsInfo(datas) { + try { + let pIds = datas.map(l => l.projectCorrelationId);//所有的项目的id + let projects = await models.ProjectCorrelation.findAll({ + where: { id: { $in: pIds } }, + attributes: ['id', 'name', 'pepProjectId'] + }); + + let pepPojectIds = new Set(); + for (let p of projects) { + pepPojectIds.add(p.pepProjectId); + } + + let pepProjects = pepPojectIds.size ? await clickHouse.projectManage.query(` + SELECT id, project_name FROM t_pim_project WHERE id IN (${[...pepPojectIds]})`).toPromise() : []; + + return { projects, pepProjects }; + } catch (err) { + console.log(`获取项目信息失败, error: ${err}`); + } + } + + return { + sendAppearToWeb,//推送告警发现 + sendConfirmToWeb//推送告警确认 + } +} \ No newline at end of file