运维服务中台
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.
 
 
 
 
 

193 lines
7.0 KiB

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
}