const moment = require('moment'); async function getStructures(ctx) { try { const { models } = ctx.fs.dc; const { clickHouse } = ctx.app.fs const { pomsProjectId } = ctx.query let bindRes = [] //选择全局就是查询所有项目下的结构物,有选择项目就只查询对应项目的结构物 if (pomsProjectId) { bindRes = await models.ProjectCorrelation.findAll({ where: { id: { $in: pomsProjectId.split(',') } } }) } else { bindRes = await models.ProjectCorrelation.findAll() } let anxinProjectIds = new Set() for (let b of bindRes) { if (b.anxinProjectId.length) { for (let aid of b.anxinProjectId) { anxinProjectIds.add(aid) } } } let undelStrucRes = [] if (bindRes) { undelStrucRes = anxinProjectIds.size ? await clickHouse.anxinyun.query( ` SELECT t_structure.id AS strucId, t_structure.name AS strucName 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) AND t_structure.external_platform is not null ORDER BY strucId ` ).toPromise() : [] } // undelStrucRes.push({ strucId: 4036, strucName: '象山港大桥' }) // undelStrucRes.push({ strucId: 1, strucName: '象山港大' }) ctx.status = 200; ctx.body = undelStrucRes } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: error`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined } } } async function getFactors(ctx) { try { const { models } = ctx.fs.dc; const { clickHouse } = ctx.app.fs const { structId, cacl } = ctx.query let list = [] if (cacl) { const factorList = await clickHouse.alarmLocal.query(`select distinct SafetyFactorTypeId, SafetyFactorTypeName from sensors where PlatformStructureId =${structId}`).toPromise() let fList = factorList.map(m => m.SafetyFactorTypeId) list = await clickHouse.alarmLocal.query(`select distinct FactorID, Name,Items,ItemNames from factors where FactorID in (${[...fList, -1].join(',')})`).toPromise() } else { list = await clickHouse.alarmLocal.query(`select distinct SafetyFactorTypeId, SafetyFactorTypeName from sensors where PlatformStructureId =${structId}`).toPromise() } ctx.body = list ctx.status = 200 } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: error`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined } } } //查询设备 async function getSensors(ctx) { try { const { models } = ctx.fs.dc; const { clickHouse } = ctx.app.fs const { structId, SafetyFactorTypeId } = ctx.query const list = await clickHouse.alarmLocal.query(` select distinct SensorId,SensorLocationDescription,Project from sensors where PlatformStructureId =${structId} and SafetyFactorTypeId=${SafetyFactorTypeId}`).toPromise() ctx.body = list ctx.status = 200 } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: error`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined } } } //根据设备id和监测因素id查询监测数据 async function getMonitorData(ctx) { try { const { clickHouse } = ctx.app.fs const { factorId, sensorId, startTime, endTime } = ctx.query const factorsList = await clickHouse.alarmLocal.query(`SELECT FactorID,Items,ItemNames,ItemUnits FROM factors WHERE FactorID=${factorId} `).toPromise() || [] const dataArray = sensorId.split(',') const transformedArray = dataArray.map(item => { return item.replace('-',':')+'' }) const id=`(${transformedArray.map(id => `'${id}'`).join(',')})` const monitorData = await clickHouse.alarmLocal.query(`SELECT SensorId,CollectTime,Values FROM themes WHERE SensorId in ${id} AND CollectTime >= toDate('${startTime}') AND CollectTime <= toDate('${endTime}') `).toPromise() || [] const sensor = await clickHouse.alarmLocal.query(`SELECT distinct ID, SensorId,SensorLocationDescription FROM sensors WHERE ID in ${id}`).toPromise() //监测项 let items = {} if (factorsList && factorsList.length > 0) { //因素解释 let factors = [] //因素名词 let factorNames = [] factorsList.map(item => { factors = item.ItemNames.split(',') factorNames = item.Items.split(',') factors.map(child => { factorNames.map(p => { items[p] = { name: child, unit: item.ItemUnits } }) }) }) } //设备数据+数据 let sensors = [] let data=[] if(sensor&&monitorData&&sensor.length && monitorData.length){ sensor.map(item=>{ const filterData=monitorData.filter(p=>p.SensorId==item.ID) filterData.map(data=>{ const values = {} Object.keys(items).forEach(key => { const index = Object.keys(items).indexOf(key) values[key] = data.Values[index] }) sensors.push({ values, time: moment(data.CollectTime).format('YYYY-MM-DD HH:mm:ss') }) }) data.push({id:item.ID,name:item.SensorLocationDescription,data:sensors}) }) } ctx.body = { items, sensors: data } ctx.status = 200 } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: error`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined } } } module.exports = { getStructures, getFactors, getSensors, getMonitorData }