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 { 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 } = 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) ) ) { let dataAlarmOption = [] let dataAlarmGroupOption = [] let dataAlarms = [] // 判断推送策略 let pointTime = moment().subtract(interval, 'minute').format('YYYY-MM-DD HH:mm:ss') if (c.tactics.includes('immediately')) { dataAlarmOption.push(`StartTime >= '${pointTime}'`); } else if (c.tactics.includes('continue')) { dataAlarmOption.push(`StartTime <= '${pointTime}'`); } else if (c.tactics.includes('abnormal_rate')) { dataAlarmOption.push(`StartTime <= '${pointTime}'`); if (c.alarmType.includes('data_outages') || c.alarmType.includes('data_exception')) { // 查了设备异常率 去安心云查当前项目下的设备数量 // TODO 等郑兴同步以太数据再查 const deviceCount = 9999 // await clickHouse.anxinyun.query(` // SELECT count(*) FROM // `).toPromise() } if (c.alarmType.includes('video_exception')) { // 查了视频异常 去安心云查 接入的 萤石 设备数量 const cameraCount = await clickHouse.anxinyun.query(` SELECT count(*) FROM `).toPromise() } } // 判断告警数据范围 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')) { } if (c.alarmType.includes('app_exception')) { } if (c.alarmType.includes('device_exception')) { dataAlarmGroupOption.push(4) dataAlarmGroupOption.push(5) } // dataAlarmGroupOption.length ? 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, } }