|
@ -1,5 +1,6 @@ |
|
|
|
|
|
|
|
|
const moment = require('moment'); |
|
|
const moment = require('moment') |
|
|
|
|
|
const fs = require('fs') |
|
|
|
|
|
|
|
|
async function getStructures(ctx) { |
|
|
async function getStructures(ctx) { |
|
|
try { |
|
|
try { |
|
@ -120,18 +121,19 @@ async function getSensors(ctx) { |
|
|
} |
|
|
} |
|
|
//根据设备id和监测因素id查询监测数据
|
|
|
//根据设备id和监测因素id查询监测数据
|
|
|
async function getMonitorData(ctx) { |
|
|
async function getMonitorData(ctx) { |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
const { clickHouse } = ctx.app.fs |
|
|
const { clickHouse } = ctx.app.fs |
|
|
const { factorId, sensorId, startTime, endTime } = ctx.query |
|
|
const { factorId, sensorId, startTime, endTime,toExport } = ctx.query |
|
|
const projectId=sensorId.split('-')[0] |
|
|
const projectId = sensorId.split('-')[0] |
|
|
const factorsList = await clickHouse.alarmLocal.query(`SELECT FactorID,Items,ItemNames,ItemUnits FROM factors
|
|
|
const factorsList = await clickHouse.alarmLocal.query(`SELECT FactorID,Items,ItemNames,ItemUnits FROM factors
|
|
|
WHERE FactorID=${factorId} AND Project='${projectId}' |
|
|
WHERE FactorID=${factorId} AND Project='${projectId}' |
|
|
`).toPromise() || []
|
|
|
`).toPromise() || []
|
|
|
const dataArray = sensorId.split(',') |
|
|
const dataArray = sensorId.split(',') |
|
|
const transformedArray = dataArray.map(item => { |
|
|
const transformedArray = dataArray.map(item => { |
|
|
return item.replace('-',':')+'' |
|
|
return item.replace('-', ':') + '' |
|
|
}) |
|
|
}) |
|
|
const id=`(${transformedArray.map(id => `'${id}'`).join(',')})` |
|
|
const id = `(${transformedArray.map(id => `'${id}'`).join(',')})` |
|
|
const monitorData = await clickHouse.alarmLocal.query(`SELECT distinct SensorId,CollectTime,Values FROM themes
|
|
|
const monitorData = await clickHouse.alarmLocal.query(`SELECT distinct SensorId,CollectTime,Values FROM themes
|
|
|
WHERE SensorId in ${id} |
|
|
WHERE SensorId in ${id} |
|
|
AND CollectTime >= toDate('${startTime}') |
|
|
AND CollectTime >= toDate('${startTime}') |
|
@ -146,46 +148,103 @@ async function getMonitorData(ctx) { |
|
|
//因素名词
|
|
|
//因素名词
|
|
|
let factorNames = [] |
|
|
let factorNames = [] |
|
|
//单位
|
|
|
//单位
|
|
|
let c=[] |
|
|
let c = [] |
|
|
factorsList.map(item => { |
|
|
factorsList.map(item => { |
|
|
factors = item.ItemNames.split(',') |
|
|
factors = item.ItemNames.split(',') |
|
|
factorNames = item.Items.split(',') |
|
|
factorNames = item.Items.split(',') |
|
|
c = item.ItemUnits.split(',') |
|
|
c = item.ItemUnits.split(',') |
|
|
factorNames.map((child,index)=> { |
|
|
factorNames.map((child, index) => { |
|
|
items[factorNames[index]] = { name:factors[index] , unit:c[index] } |
|
|
items[factorNames[index]] = { name: factors[index], unit: c[index] } |
|
|
}) |
|
|
}) |
|
|
}) |
|
|
}) |
|
|
} |
|
|
} |
|
|
//设备数据+数据
|
|
|
//设备数据+数据
|
|
|
let sensors = [] |
|
|
let sensors = [] |
|
|
let data=[] |
|
|
let data = [] |
|
|
if(sensor&&monitorData&&sensor.length && monitorData.length){ |
|
|
if (sensor && monitorData && sensor.length && monitorData.length) { |
|
|
sensor.forEach((item) => { |
|
|
sensor.forEach((item) => { |
|
|
// 过滤与当前传感器相关的数据
|
|
|
// 过滤与当前传感器相关的数据
|
|
|
const sensorDataArray = monitorData.filter((d) => d.SensorId == item.ID) |
|
|
const sensorDataArray = monitorData.filter((d) => d.SensorId == item.ID) |
|
|
// 构建最终的传感器数据结构
|
|
|
// 构建最终的传感器数据结构
|
|
|
const sensorDataItem = { |
|
|
const sensorDataItem = { |
|
|
id: item.ID, |
|
|
id: item.ID, |
|
|
name: item.SensorLocationDescription, |
|
|
name: item.SensorLocationDescription, |
|
|
data: sensorDataArray.map((d) => { |
|
|
data: sensorDataArray.map((d) => { |
|
|
// 根据 item 对象进行映射
|
|
|
// 根据 item 对象进行映射
|
|
|
const values = {}; |
|
|
const values = {}; |
|
|
itemKeys = Object.keys(items) |
|
|
itemKeys = Object.keys(items) |
|
|
itemKeys.forEach((key, index) => { |
|
|
itemKeys.forEach((key, index) => { |
|
|
values[key] = d.Values[index]; |
|
|
values[key] = d.Values[index]; |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
return { |
|
|
return { |
|
|
time: d.CollectTime, |
|
|
time: d.CollectTime, |
|
|
values: values |
|
|
values: values |
|
|
}; |
|
|
}; |
|
|
}) |
|
|
}) |
|
|
}; |
|
|
}; |
|
|
data.push(sensorDataItem) |
|
|
data.push(sensorDataItem) |
|
|
}) |
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
//导出相关
|
|
|
|
|
|
|
|
|
|
|
|
if (toExport) { |
|
|
|
|
|
let arr=items |
|
|
|
|
|
let columns = [] |
|
|
|
|
|
columns.push({ |
|
|
|
|
|
title: '设备位置', |
|
|
|
|
|
dataIndex: 'position', |
|
|
|
|
|
key: 'position', |
|
|
|
|
|
}); |
|
|
|
|
|
for (let index in arr) { |
|
|
|
|
|
columns.push({ |
|
|
|
|
|
title: arr[index].name + '(' + arr[index].unit + ')', |
|
|
|
|
|
dataIndex: index, |
|
|
|
|
|
sorter: (a, b) => b[index] - a[index], |
|
|
|
|
|
key: index, |
|
|
|
|
|
}) |
|
|
|
|
|
}; |
|
|
|
|
|
columns.push({ |
|
|
|
|
|
title: '采集时间', |
|
|
|
|
|
dataIndex: 'acqTime', |
|
|
|
|
|
sorter: (a, b) => b['realTime'] - a['realTime'], |
|
|
|
|
|
key: 'acqTime', |
|
|
|
|
|
}); |
|
|
|
|
|
//设备
|
|
|
|
|
|
let data1 = [] |
|
|
|
|
|
let themeStations = data |
|
|
|
|
|
for (let i = 0; i < themeStations.length; i++) { |
|
|
|
|
|
for (let k = 0; k < themeStations[i].data.length; k++) { |
|
|
|
|
|
let cdataT = {} |
|
|
|
|
|
let startT = ""; |
|
|
|
|
|
let endT = ""; |
|
|
|
|
|
let dataTS = themeStations[i].data[k]; |
|
|
|
|
|
cdataT.key = `station-${themeStations[i].id}-${k}`; |
|
|
|
|
|
cdataT.position = themeStations[i].name; |
|
|
|
|
|
cdataT.acqTime = moment(dataTS.time).format('YYYY-MM-DD HH:mm:ss'); |
|
|
|
|
|
cdataT.realTime = moment(dataTS.time).valueOf(); |
|
|
|
|
|
if (startT == "") { |
|
|
|
|
|
startT = dataTS.time; |
|
|
|
|
|
endT = dataTS.time; |
|
|
|
|
|
} else { |
|
|
|
|
|
if (moment(startT) >= moment(dataTS.time)) |
|
|
|
|
|
startT = dataTS.time; |
|
|
|
|
|
if (moment(endT) <= moment(dataTS.time)) |
|
|
|
|
|
endT = dataTS.time; |
|
|
|
|
|
} |
|
|
|
|
|
//动态列的值
|
|
|
|
|
|
for (let themeItem in arr) { |
|
|
|
|
|
cdataT[themeItem] = dataTS.values[themeItem]; |
|
|
|
|
|
} |
|
|
|
|
|
data1.push(cdataT) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
await exportMaterialEnterList(ctx, data1, columns) |
|
|
} |
|
|
} |
|
|
|
|
|
if(!toExport){ |
|
|
ctx.body = { items, sensors: data } |
|
|
ctx.body = { items, sensors: data } |
|
|
ctx.status = 200 |
|
|
ctx.status = 200 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} catch (error) { |
|
|
} catch (error) { |
|
|
ctx.fs.logger.error(`path: ${ctx.path}, error: error`); |
|
|
ctx.fs.logger.error(`path: ${ctx.path}, error: error`); |
|
@ -196,11 +255,67 @@ async function getMonitorData(ctx) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function exportMaterialEnterList(ctx, data, columns) { |
|
|
|
|
|
try { |
|
|
|
|
|
let header = [] |
|
|
|
|
|
columns.forEach(item => { |
|
|
|
|
|
header.push({ title: item.title, key: item.key }) |
|
|
|
|
|
}) |
|
|
|
|
|
const { utils: { simpleExcelDown } } = ctx.app.fs |
|
|
|
|
|
// let exportData = []
|
|
|
|
|
|
// let item={}
|
|
|
|
|
|
// console.log(dataList[0].dataValues)
|
|
|
|
|
|
let siteName = '数据监控' |
|
|
|
|
|
// for (let item of data) {
|
|
|
|
|
|
// for(let child of item){
|
|
|
|
|
|
// if(child!=key){
|
|
|
|
|
|
// item[child]=
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// // item.outTime = moment(item.outTime).format('YYYY-MM-DD HH:mm:ss');
|
|
|
|
|
|
// // item.branchId = item.siteProcessBranch && item.siteProcessBranch.name ? item.siteProcessBranch.name : '-'
|
|
|
|
|
|
// // item.subItemId = item.siteProcessSubItem && item.siteProcessSubItem.name ? item.siteProcessSubItem.name : '-'
|
|
|
|
|
|
// // item.type = item.materialItem && item.materialItem.name ? item.materialItem.name : '-'
|
|
|
|
|
|
// // item.name = item.materialItem && item.materialItem.name ? item.materialItem.name : '-'
|
|
|
|
|
|
// // item.model = item.materialItem && item.materialItem.model ? item.materialItem.model : '-'
|
|
|
|
|
|
// // item.unit = item.materialItem && item.materialItem.unit ? item.materialItem.unit : '-'
|
|
|
|
|
|
// // item.providerId = item.materialProvider && item.materialProvider.name ? item.materialProvider.name : '-'
|
|
|
|
|
|
// // item.status = (item.status || item.status == 0) && data[item.status]
|
|
|
|
|
|
// exportData.push(item)
|
|
|
|
|
|
// }
|
|
|
|
|
|
const fileName = `${siteName}` + '.xls' |
|
|
|
|
|
console.log('x11111111',data,fileName,header) |
|
|
|
|
|
const filePath = await simpleExcelDown({ data: data, header, fileName: fileName, needIndexCell: false }) |
|
|
|
|
|
const fileData = fs.readFileSync(filePath) |
|
|
|
|
|
ctx.status = 200 |
|
|
|
|
|
ctx.set('Content-Type', 'application/x-xls') |
|
|
|
|
|
ctx.set('Content-disposition', 'attachment; filename=' + encodeURI(fileName)) |
|
|
|
|
|
ctx.body = fileData |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`) |
|
|
|
|
|
ctx.status = 400 |
|
|
|
|
|
ctx.body = { |
|
|
|
|
|
message: typeof error == 'string' ? error : undefined |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function exportFile(ctx) { |
|
|
|
|
|
try { |
|
|
|
|
|
const { data, columns } = ctx.query |
|
|
|
|
|
await exportMaterialEnterList(ctx, data, columns) |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`) |
|
|
|
|
|
ctx.status = 400 |
|
|
|
|
|
ctx.body = { |
|
|
|
|
|
message: typeof error == 'string' ? error : undefined |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = { |
|
|
module.exports = { |
|
|
getStructures, getFactors, getSensors, getMonitorData |
|
|
getStructures, getFactors, getSensors, getMonitorData, exportFile |
|
|
} |
|
|
} |