You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
16 KiB
317 lines
16 KiB
const moment = require('moment')
|
|
|
|
module.exports = function (app, opts) {
|
|
const alarmsPush = app.fs.scheduleInit(
|
|
{
|
|
interval: '12 */1 * * * *',
|
|
immediate: true, // dev
|
|
proRun: true,
|
|
},
|
|
async () => {
|
|
try {
|
|
const { models, ORM: sequelize } = app.fs.dc
|
|
const { clickHouse } = app.fs
|
|
const { database: anxinyun } = clickHouse.anxinyun.opts.config
|
|
const { pushBySms, pushByEmail } = app.fs.utils
|
|
const curMinOfYear = moment().diff(moment().startOf('year'), 'minutes')
|
|
const configListRes = await models.AlarmPushConfig.findAll({
|
|
where: {
|
|
del: false
|
|
},
|
|
include: [{
|
|
model: models.ProjectCorrelation,
|
|
where: {
|
|
del: false
|
|
},
|
|
required: true
|
|
}]
|
|
})
|
|
let pepProjectIds = new Set()
|
|
for (let { dataValues: c } of configListRes) {
|
|
if (c.projectCorrelation.pepProjectId) {
|
|
pepProjectIds.add(c.projectCorrelation.pepProjectId)
|
|
}
|
|
}
|
|
const pepProjectRes = pepProjectIds.size ?
|
|
await clickHouse.projectManage.query(
|
|
`
|
|
SELECT
|
|
t_pim_project.id AS id,
|
|
t_pim_project.project_name AS project_name,
|
|
t_pim_project.isdelete AS isdelete,
|
|
t_pim_project_construction.construction_status_id AS construction_status_id,
|
|
t_pim_project_state.construction_status AS construction_status
|
|
FROM t_pim_project
|
|
LEFT JOIN t_pim_project_construction
|
|
ON t_pim_project.id = t_pim_project_construction.project_id
|
|
LEFT JOIN t_pim_project_state
|
|
ON t_pim_project_construction.construction_status_id = t_pim_project_state.id
|
|
WHERE id IN (${[...pepProjectIds].join(',')})
|
|
`
|
|
).toPromise() :
|
|
[]
|
|
|
|
for (let { dataValues: c } of configListRes) {
|
|
if (c.tacticsParams && c.tactics) {
|
|
const { projectCorrelation, strucId } = c
|
|
const { interval, deviceProportion } = c.tacticsParams
|
|
|
|
if (
|
|
curMinOfYear % interval == 0
|
|
) {
|
|
const corPepProject = projectCorrelation.pepProjectId ?
|
|
pepProjectRes.find(p => p.id == projectCorrelation.pepProjectId)
|
|
: null
|
|
if (
|
|
!projectCorrelation.pepProjectId
|
|
|| (
|
|
corPepProject
|
|
&& c.timeType.some(ct => ct == corPepProject.construction_status_id)
|
|
)
|
|
) {
|
|
// TODO 查当前 poms 下的结构物 并把不包含的去掉
|
|
|
|
const strucListRes = strucId.length ? await clickHouse.anxinyun.query(`
|
|
SELECT id, iota_thing_id, name
|
|
FROM t_structure
|
|
WHERE id IN (${strucId.join(',')})
|
|
`).toPromise() : []
|
|
|
|
let dataAlarmOption = []
|
|
let dataAlarmGroupOption = []
|
|
let dataAlarms = []
|
|
|
|
let videoAlarms = []
|
|
|
|
let deviceCount = 0
|
|
let cameraCount = 0
|
|
// 判断推送策略
|
|
let pointTime = moment().subtract(interval, 'minute').format('YYYY-MM-DD HH:mm:ss')
|
|
if (c.tactics == 'immediately') {
|
|
dataAlarmOption.push(`StartTime >= '${pointTime}'`);
|
|
} else if (c.tactics == 'continue') {
|
|
dataAlarmOption.push(`StartTime <= '${pointTime}'`);
|
|
} else if (c.tactics == 'abnormal_rate') {
|
|
dataAlarmOption.push(`StartTime <= '${pointTime}'`);
|
|
if (c.alarmType.includes('data_outages') || c.alarmType.includes('data_exception')) {
|
|
// 查了设备异常率 去安心云查当前项目下的设备数量
|
|
// TODO 等同步以太数据再查
|
|
deviceCount = 9999
|
|
// await clickHouse.anxinyun.query(`
|
|
// SELECT count(*) FROM
|
|
// `).toPromise()
|
|
}
|
|
if (c.alarmType.includes('video_exception')) {
|
|
// 查了视频异常 去安心云查 接入的 萤石 设备数量
|
|
cameraCount = strucId.length ?
|
|
(await clickHouse.anxinyun.query(`
|
|
SELECT count(*) AS count FROM t_video_ipc
|
|
WHERE structure IN (${strucId.join(',')})
|
|
`).toPromise())[0].count
|
|
: 0
|
|
}
|
|
}
|
|
|
|
// 判断告警数据范围
|
|
if (c.alarmType.includes('data_outages')) {
|
|
dataAlarmGroupOption.push(1)
|
|
}
|
|
if (c.alarmType.includes('data_exception')) {
|
|
dataAlarmGroupOption.push(2)
|
|
}
|
|
if (c.alarmType.includes('strategy_hit')) {
|
|
dataAlarmGroupOption.push(3)
|
|
}
|
|
if (c.alarmType.includes('video_exception')) {
|
|
videoAlarms = strucId.length ? await clickHouse.vcmp.query(
|
|
`
|
|
SELECT
|
|
cameraAlarm.cameraId AS cameraId,
|
|
cameraAlarm.cameraName AS cameraName,
|
|
cameraAlarm.cameraSerialNo AS cameraSerialNo,
|
|
cameraAlarm.cameraChannelNo AS cameraChannelNo,
|
|
cameraAlarm.alarmId AS alarmId,
|
|
cameraAlarm.createTime AS createTime,
|
|
cameraAlarm.confirmContent AS confirmContent,
|
|
cameraAlarm.confirmTime AS confirmTime,
|
|
cameraAlarm.autoRestore AS autoRestore,
|
|
camera_status_resolve.id AS resolveId,
|
|
camera_status.describe AS statusDescribe,
|
|
camera_status_resolve.resolve AS resolve,
|
|
"gbCamera".online AS cameraOnline,
|
|
anxinIpc.t_video_ipc.name AS anxinIpcPosition,
|
|
anxinStation.id AS anxinStationId,
|
|
anxinStation.name AS anxinStationName,
|
|
anxinStruc.name AS strucName,
|
|
anxinStruc.id AS strucId
|
|
FROM (
|
|
SELECT
|
|
camera.id AS cameraId,
|
|
camera.gb_id AS gbId,
|
|
camera.name AS cameraName,
|
|
camera_status_alarm.id AS alarmId,
|
|
camera_status_alarm.create_time AS createTime,
|
|
camera_status_alarm.status_id AS statusId,
|
|
camera_status_alarm.serial_no AS cameraSerialNo,
|
|
camera_status_alarm.channel_no AS cameraChannelNo,
|
|
camera_status_alarm.confirm AS confirmContent,
|
|
${'camera_status_alarm.auto_restore AS autoRestore,'}
|
|
camera_status_alarm.confirm_time AS confirmTime
|
|
FROM camera_status_alarm
|
|
INNER JOIN ${anxinyun}.t_video_ipc
|
|
ON toString(${anxinyun}.t_video_ipc.channel_no) = camera_status_alarm.channel_no
|
|
AND ${anxinyun}.t_video_ipc.serial_no = camera_status_alarm.serial_no
|
|
AND ${anxinyun}.t_video_ipc.structure IN (${strucId.join(',')})
|
|
INNER JOIN camera
|
|
ON camera.serial_no = camera_status_alarm.serial_no
|
|
AND camera.channel_no = camera_status_alarm.channel_no
|
|
WHERE
|
|
camera.delete = false
|
|
AND camera.recycle_time is null
|
|
) AS cameraAlarm
|
|
LEFT JOIN camera_status
|
|
ON cameraAlarm.platform = camera_status.platform
|
|
AND cameraAlarm.statusId = camera_status.id
|
|
LEFT JOIN camera_status_resolve
|
|
ON camera_status_resolve.status_id = camera_status.id
|
|
LEFT JOIN "gbCamera"
|
|
ON "gbCamera".id = cameraAlarm.gbId
|
|
|
|
LEFT JOIN ${anxinyun}.t_video_ipc AS anxinIpc
|
|
ON toString(anxinIpc.channel_no) = cameraAlarm.cameraChannelNo
|
|
AND anxinIpc.serial_no = cameraAlarm.cameraSerialNo
|
|
LEFT JOIN ${anxinyun}.t_structure AS anxinStruc
|
|
ON anxinStruc.id = anxinIpc.structure
|
|
AND anxinStruc.id IN (${strucId.join(',')})
|
|
LEFT JOIN ${anxinyun}.t_video_ipc_station AS anxinIpcStation
|
|
ON anxinIpcStation.ipc = anxinIpc.id
|
|
LEFT JOIN ${anxinyun}.t_sensor AS anxinStation
|
|
ON anxinStation.id = anxinIpcStation.station
|
|
`
|
|
).toPromise() : []
|
|
|
|
let returnD = []
|
|
let positionD = {}
|
|
// 每个设备一个告警
|
|
for (let a of videoAlarms) {
|
|
if (positionD[a.cameraId]) {
|
|
let curD = returnD[positionD[a.cameraId].positionReturnD]
|
|
if (a.resolveId && !curD.resolve.some(r => r.id == a.resolveId)) {
|
|
curD.resolve.push({
|
|
id: a.resolveId,
|
|
resolve: a.resolve
|
|
})
|
|
}
|
|
if (a.strucId && !curD.struc.some(s => s.id == a.strucId)) {
|
|
curD.struc.push({
|
|
id: a.strucId,
|
|
projectId: a.projectId,
|
|
name: a.strucName
|
|
})
|
|
}
|
|
if (a.anxinStationId && !curD.station.some(s => s.id == a.anxinStationId)) {
|
|
curD.station.push({
|
|
id: a.anxinStationId,
|
|
name: a.anxinStationName,
|
|
position: a.anxinIpcPosition
|
|
})
|
|
}
|
|
} else {
|
|
let d = {
|
|
cameraId: a.cameraId,
|
|
cameraName: a.cameraName,
|
|
camerOnline: a.cameraOnline,
|
|
cameraSerialNo: a.cameraSerialNo,
|
|
cameraChannelNo: a.cameraChannelNo,
|
|
autoRestore: a.autoRestore,
|
|
createTime: a.createTime,
|
|
updateTime: a.updateTime,
|
|
platform: a.platform,
|
|
statusDescribe: a.statusDescribe,
|
|
alarmId: a.alarmId,
|
|
confirmContent: a.confirmContent,
|
|
confirmTime: a.confirmTime,
|
|
|
|
venderId: a.venderId,
|
|
venderName: a.venderName,
|
|
cameraKindId: a.cameraKindId,
|
|
|
|
resolve: [],
|
|
struc: [],
|
|
station: []
|
|
}
|
|
|
|
// pep 项目
|
|
// d.pomsProject = (
|
|
// anxinStruc.find(as => as.strucId == a.strucId) ||
|
|
// {
|
|
// pomsProject: [
|
|
|
|
// ]
|
|
// }
|
|
// ).pomsProject
|
|
|
|
if (a.resolveId) {
|
|
d.resolve.push({
|
|
id: a.resolveId,
|
|
resolve: a.resolve
|
|
})
|
|
}
|
|
if (a.strucId) {
|
|
d.struc.push({
|
|
id: a.strucId,
|
|
projectId: a.projectId,
|
|
name: a.strucName
|
|
})
|
|
}
|
|
if (a.anxinStationId) {
|
|
d.station.push({
|
|
id: a.anxinStationId,
|
|
name: a.anxinStationName,
|
|
position: a.anxinIpcPosition
|
|
})
|
|
}
|
|
returnD.push(d)
|
|
positionD[a.cameraId] = {
|
|
positionReturnD: returnD.length - 1
|
|
}
|
|
}
|
|
}
|
|
let p = 1
|
|
}
|
|
if (c.alarmType.includes('app_exception')) {
|
|
|
|
}
|
|
if (c.alarmType.includes('device_exception')) {
|
|
dataAlarmGroupOption.push(4)
|
|
dataAlarmGroupOption.push(5)
|
|
}
|
|
//
|
|
if (dataAlarmGroupOption.length) {
|
|
dataAlarmGroupOption.push(-1)
|
|
dataAlarmOption.push(`AlarmGroup IN (${dataAlarmGroupOption.join(',')})`)
|
|
dataAlarms = await clickHouse.dataAlarm.query(`
|
|
SELECT * FROM alarms
|
|
WHERE
|
|
State NOT IN (3, 4)
|
|
${dataAlarmOption.length ? ' AND ' + dataAlarmOption.join(' AND ') : ''}
|
|
`).toPromise()
|
|
console.log(dataAlarms);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
)
|
|
|
|
return {
|
|
alarmsPush,
|
|
}
|
|
}
|