diff --git a/api/app/lib/controllers/project/group.js b/api/app/lib/controllers/project/group.js index d2717ab..d358602 100644 --- a/api/app/lib/controllers/project/group.js +++ b/api/app/lib/controllers/project/group.js @@ -108,6 +108,7 @@ async function groupStatistic (ctx) { const { models } = ctx.fs.dc; const { userId } = ctx.fs.api const { clickHouse } = ctx.app.fs + const { utils: { judgeSuper, anxinStrucIdRange } } = ctx.app.fs const sequelize = ctx.fs.dc.orm const progectGroupList = await models.ProjectGroup.findAll({ @@ -140,18 +141,46 @@ async function groupStatistic (ctx) { } let anxinProjectIdArr = Array.from(anxinProjectIds) - // 统计安心云项目下的结构物id - const strucIdRes = await clickHouse.anxinyun.query( + // 统计安心云项目下的结构物 + const strucRes = anxinProjectIdArr.length ? await clickHouse.anxinyun.query( ` - SELECT * - FROM t_project_structure - WHERE project IN (${[...anxinProjectIdArr].join(',')}, -1) - ` - ).toPromise() + SELECT + t_project.id AS projectId, + t_structure.id AS strucId, + t_structure.name AS strucName, + project_state + FROM + t_project + LEFT JOIN + t_project_structure + ON t_project_structure.project = t_project.id + LEFT JOIN + t_project_structuregroup + ON t_project_structuregroup.project = t_project.id + LEFT JOIN + t_structuregroup_structure + ON t_structuregroup_structure.structuregroup = t_project_structuregroup.structuregroup + LEFT JOIN + t_project_construction + ON t_project_construction.project = t_project.id + LEFT JOIN + t_structure_site + ON t_structure_site.siteid = t_project_construction.construction + RIGHT JOIN + t_structure + ON t_structure.id = t_project_structure.structure + OR t_structure.id = t_structuregroup_structure.structure + OR t_structure.id = t_structure_site.structid + WHERE + project_state != -1 + AND + t_project.id IN (${anxinProjectIdArr.join(',')},-1) + ` + ).toPromise() : [] let strucIds = new Set() - for (let struc of strucIdRes) { - strucIds.add(struc.structure) + for (let struc of strucRes) { + strucIds.add(struc.strucId) } let strucIdArr = Array.from(strucIds) @@ -175,7 +204,7 @@ async function groupStatistic (ctx) { for (let pg of progectGroupList) { let strucCount = 0 let maxOffLineTime = 0 - let todayAlarms=0 + let todayAlarms = 0 let anxinProjectCount = groupProjectRes.reduce((count, gp) => { if (pg.pomsProjectIds.some(id => gp.id == id)) { // 如果 pg 分组信息 存储的 pomsProjectIds 运维项目id 和 真正的 groupProjectRes 运维项目id 相等 @@ -183,16 +212,16 @@ async function groupStatistic (ctx) { count += gp.anxinProjectId.length // let strucIdArr_ = - strucIdRes.filter(s => gp.anxinProjectId.includes(s.project)) + strucRes.filter(s => gp.anxinProjectId.includes(s.projectId)) strucCount += strucIdArr_.length //所有结构物的告警 - const ss=alarmRes.filter(p=>strucIdArr_.some(q=>q.structure==p.StructureId)) - todayAlarms= ss.reduce((p,c)=>{ - return p+c.alarmCount - },0) + const ss = alarmRes.filter(p => strucIdArr_.some(q => q.structure == p.StructureId)) + todayAlarms = ss.reduce((p, c) => { + return p + c.alarmCount + }, 0) // for (let { dataValues: off } of deviceOffTimeRes) { - if (strucIdArr_.some((s) => s.structure == off.structure)) { + if (strucIdArr_.some((s) => s.strucId == off.structure)) { if (off.offline > maxOffLineTime) { maxOffLineTime = off.offline } @@ -243,25 +272,49 @@ async function groupStatisticOnline (ctx) { anxinProjectIds.add(pid) } - const strucIdRes = await clickHouse.anxinyun.query( - ` - SELECT * - FROM t_project_structure - WHERE project IN (${[...anxinProjectIds].join(',')}, -1) + // 统计安心云项目下的结构物 + const strucRes = anxinProjectIds.length ? await clickHouse.anxinyun.query( ` - ).toPromise() + SELECT + t_project.id AS projectId, + t_structure.id AS id, + t_structure.name AS name, + project_state + FROM + t_project + LEFT JOIN + t_project_structure + ON t_project_structure.project = t_project.id + LEFT JOIN + t_project_structuregroup + ON t_project_structuregroup.project = t_project.id + LEFT JOIN + t_structuregroup_structure + ON t_structuregroup_structure.structuregroup = t_project_structuregroup.structuregroup + LEFT JOIN + t_project_construction + ON t_project_construction.project = t_project.id + LEFT JOIN + t_structure_site + ON t_structure_site.siteid = t_project_construction.construction + RIGHT JOIN + t_structure + ON t_structure.id = t_project_structure.structure + OR t_structure.id = t_structuregroup_structure.structure + OR t_structure.id = t_structure_site.structid + WHERE + project_state != -1 + AND + t_project.id IN (${anxinProjectIds.join(',')},-1) + ` + ).toPromise() : [] + let strucIds = new Set() - for (let struc of strucIdRes) { - strucIds.add(struc.structure) + for (let struc of strucRes) { + strucIds.add(struc.id) } let strucIdArr = Array.from(strucIds) - const strucRes = strucIdArr.length ? await clickHouse.anxinyun.query( - ` - SELECT name, id FROM t_structure WHERE id IN (${[...strucIdArr].join(',')}); - ` - ).toPromise() : [] - // 查中断时间 const maxOfflineTimeRes = strucIdArr.length ? await models.StructureOff.findAll({ where: { @@ -272,8 +325,6 @@ async function groupStatisticOnline (ctx) { // 查在线率 const strucOnlineClient = ctx.app.fs.esclient.strucOnline - console.log('es参数,', strucOnlineClient.config) - console.log('strucIdArr', strucIdArr) const onlineRes = await strucOnlineClient.search({ index: strucOnlineClient.config.index, @@ -309,7 +360,6 @@ async function groupStatisticOnline (ctx) { "size": 10000 } }) - console.log('es数据,', onlineRes.hits.hits.length, onlineRes.hits.hits) for (let struc of strucRes) { let curOnline = @@ -362,27 +412,50 @@ async function groupStatisticAlarm (ctx) { anxinProjectIds.add(pid) } - const strucIdRes = anxinProjectIds.size ? await clickHouse.anxinyun.query( - ` - SELECT * - FROM t_project_structure - WHERE project IN (${[...anxinProjectIds].join(',')}, -1) + // 统计安心云项目下的结构物 + const strucRes = anxinProjectIds.length ? await clickHouse.anxinyun.query( ` + SELECT + t_project.id AS projectId, + t_structure.id AS id, + t_structure.name AS name, + project_state + FROM + t_project + LEFT JOIN + t_project_structure + ON t_project_structure.project = t_project.id + LEFT JOIN + t_project_structuregroup + ON t_project_structuregroup.project = t_project.id + LEFT JOIN + t_structuregroup_structure + ON t_structuregroup_structure.structuregroup = t_project_structuregroup.structuregroup + LEFT JOIN + t_project_construction + ON t_project_construction.project = t_project.id + LEFT JOIN + t_structure_site + ON t_structure_site.siteid = t_project_construction.construction + RIGHT JOIN + t_structure + ON t_structure.id = t_project_structure.structure + OR t_structure.id = t_structuregroup_structure.structure + OR t_structure.id = t_structure_site.structid + WHERE + project_state != -1 + AND + t_project.id IN (${anxinProjectIds.join(',')},-1) + ` ).toPromise() : [] + let strucIds = new Set() - for (let struc of strucIdRes) { - strucIds.add(struc.structure) + for (let struc of strucRes) { + strucIds.add(struc.id) } let strucIdArr = Array.from(strucIds) - const strucRes = strucIdArr.length ? await clickHouse.anxinyun.query( - ` - SELECT name, id FROM t_structure WHERE id IN (${[...strucIdArr].join(',')}); - ` - ).toPromise() : [] - // 查一周内超阈值告警的个数 - // strucIdArr = [1] const alarmRes = strucIdArr.length ? await clickHouse.dataAlarm.query( ` SELECT StructureId,count(StructureId) AS alarmCount diff --git a/api/app/lib/schedule/alarms_push.js b/api/app/lib/schedule/alarms_push.js index 33870a0..d901773 100644 --- a/api/app/lib/schedule/alarms_push.js +++ b/api/app/lib/schedule/alarms_push.js @@ -1134,68 +1134,65 @@ module.exports = function (app, opts) { //查询结构物的监测因素 const factorData = await clickHouse.anxinyun.query( ` - SELECT - t_structure_factor.structure AS structureId, - t_factor.name AS name, - t_factor.id AS id - FROM - t_structure_factor - LEFT JOIN t_factor - ON t_factor.id = t_structure_factor.factor - WHERE - t_structure_factor.structure IN (${[...dataAlarmG1StructureId]}) - + SELECT + t_structure_factor.structure AS structureId, + t_factor.name AS name, + t_factor.id AS id + FROM + t_structure_factor + LEFT JOIN t_factor + ON t_factor.id = t_structure_factor.factor + WHERE + t_structure_factor.structure IN (${[...dataAlarmG1StructureId]}) ` ).toPromise() || [] let factorId = factorData.map(f => f.id) - //查询结构物对应的设备 + //查询结构物对应的测点 const equipment = await clickHouse.anxinyun.query( ` - SELECT - t_sensor.id AS id, - t_sensor.name AS name, - t_sensor.structure AS structureId, - t_sensor.factor AS factorId, - t_device_sensor.iota_device_id AS iotaDeviceId - FROM - t_sensor - LEFT JOIN t_device_sensor - ON t_device_sensor.sensor = t_sensor.id - WHERE - t_sensor.structure IN (${[...dataAlarmG1StructureId]}) - AND - t_sensor.factor IN (${factorId.join(',')}) + SELECT + t_sensor.id AS id, + t_sensor.name AS name, + t_sensor.structure AS structureId, + t_sensor.factor AS factorId, + t_device_sensor.iota_device_id AS iotaDeviceId + FROM + t_sensor + LEFT JOIN t_device_sensor + ON t_device_sensor.sensor = t_sensor.id + WHERE + t_sensor.structure IN (${[...dataAlarmG1StructureId]}) + AND + t_sensor.factor IN (${factorId.join(',')}) ` ).toPromise() || [] const alarmDatas = await clickHouse.dataAlarm.query( ` - SELECT + SELECT alarms.AlarmId AS alarmId, alarms.State AS state, alarms.AlarmGroup AS alarmGroup, alarms.SourceId AS sourceId, alarms.StartTime AS StartTime, alarms.SourceName AS SourceName, - alarms.AlarmCode AS AlarmCode - FROM + alarms.AlarmCode AS AlarmCode, + alarms.SourceTypeId AS SourceTypeId + FROM alarms - WHERE - alarms.StructureId In (${[...dataAlarmG1StructureId]}) - AND - alarms.AlarmGroup = 1 - AND - alarms.State < 3 + WHERE + alarms.StructureId In (${[...dataAlarmG1StructureId]}) + AND + alarms.AlarmGroup = 1 + AND + alarms.State < 3 ` ).toPromise() || [] - // console.log('当前结构物下所有告警', alarmDatas); - // console.log('监测因素', factorData); - // console.log('结构物对应的设备', equipment); - + // 为设备分配自己产生的告警数据 equipment.map(f => { f.alarmDatas = [] alarmDatas.map(r => { @@ -1204,6 +1201,8 @@ module.exports = function (app, opts) { } }) }) + + // 为监测因素分配绑定的设备 factorData.map(v => { v.devices = [] equipment.map(f => { @@ -1212,14 +1211,16 @@ module.exports = function (app, opts) { } }) if (strucMap[v.structureId]) { + // 并为 strucMap 补充 factor 监测因素信息 strucMap[v.structureId].factor.push({ ...v }) } }) - let projectList = [] for (let key in strucMap) { if (strucMap[key].factor.length > 0) { + // 如果有监测因素信息 + // 存结构物信息至 projectList projectList.push(strucMap[key]) } } @@ -1228,6 +1229,8 @@ module.exports = function (app, opts) { pepProject_name.map(s => { s.projects = [] projectList.map(f => { + // 匹配 pepProject_name 中的项目 + // 匹配到则向 projects 中插入 f 也就是结构物信息 + 项目的id if (s.anxinProjectId.includes(f.projectId)) { s.projects.push(f) } @@ -1274,6 +1277,7 @@ module.exports = function (app, opts) { delete c.alarmDatas } }) + // 进一步筛选了有告警的设备 f.devices = f.devices.filter(b => b.alarmDatas && b.alarmDatas.length > 0) } else { delete f.devices @@ -1384,10 +1388,7 @@ module.exports = function (app, opts) { } else { for (let [index, a] of alarmData.entries()) { - alarmContent += packageTableData({ data: a, titleArr: alarmTitleArr }) - - if (a[keyOfStartTime] && moment(a[keyOfStartTime]).isBetween(newAddStartTime, newAddEndTime)) { newAddCount++ } @@ -1395,7 +1396,6 @@ module.exports = function (app, opts) { accumulate = alarmData.length } - tableTitlePrefix += titlePrefix != '数据异常&视频异常' ? c.tactics == 'abnormal_rate' ?