企业信息和智能监控

parent 89246caf
......@@ -16,4 +16,10 @@
<mysqlPwd>qaz123456</mysqlPwd>
<dataBase>unicarbon_platform</dataBase> -->
</mysqldb>
<compInfo>
<history>22年</history>
<employee>200+</employee>
<technical>80+</technical>
<area>16000㎡</area>
</compInfo>
</config>
import { selectOneDataByParam, selectDataListByParam, selectPaginatedDataWithOrder } from "../data/findData";
import { TABLENAME } from "../config/dbEnum";
import { getMySqlMs } from "../tools/systemTools";
import { systemConfig } from "../config/serverConfig";
import { BizError } from "../util/bizError";
import { ERRORENUM } from "../config/errorEnum";
import { addData } from "../data/addData";
import { updateManyData } from "../data/updateData";
import { region } from "tencentcloud-sdk-nodejs";
/**
......@@ -198,9 +200,9 @@ export async function getRunAnalysis() {
let yesterdayEnergy = await getTotalEnergy(energyDeviceIds, yesterdayStart, yesterdayEnd);
let currentMonthEnergy = await getTotalEnergy(energyDeviceIds, currentMonthStart, new Date());
let previousMonthEnergy = await getTotalEnergy(energyDeviceIds, lastMonthStart, lastMonthEnd);
let dailyYearOnYear = yesterdayEnergy === 0 ? '0%' : `${(((todayEnergy - yesterdayEnergy) / yesterdayEnergy) * 100).toFixed(2)}%`;
let monthlyYearOnYear = previousMonthEnergy === 0 ? '0%' : `${(((currentMonthEnergy - previousMonthEnergy) / previousMonthEnergy) * 100).toFixed(2)}%`;
// %
let dailyYearOnYear = yesterdayEnergy === 0 ? 0 : (((todayEnergy - yesterdayEnergy) / yesterdayEnergy) * 100).toFixed(2);
let monthlyYearOnYear = previousMonthEnergy === 0 ? 0 : (((currentMonthEnergy - previousMonthEnergy) / previousMonthEnergy) * 100).toFixed(2);
// 3. 用电趋势:过去24小时(按小时)、过去7天、过去30天、过去一年(按月)
let now = new Date();
......@@ -357,11 +359,11 @@ export async function getRunAnalysis() {
return {
energyManagement: {
todayElectricity: `${todayEnergy.toFixed(0)}kwh`,
yesterdayElectricity: `${yesterdayEnergy.toFixed(0)}kwh`,
todayElectricity: todayEnergy.toFixed(0),
yesterdayElectricity: yesterdayEnergy.toFixed(0),
dailyYearOnYear,
currentMonthElectricity: `${currentMonthEnergy.toFixed(0)}kwh`,
previousMonthElectricity: `${previousMonthEnergy.toFixed(0)}kwh`,
currentMonthElectricity: currentMonthEnergy.toFixed(0),
previousMonthElectricity: previousMonthEnergy.toFixed(0),
monthlyYearOnYear
},
electricityTrend: {
......@@ -771,6 +773,129 @@ function isOnline(receivedTime: string | undefined): boolean {
return diffMinutes <= 30;
}
/**
* 获取智能监控数据
* @returns 设备在线状态、空气质量监测、设备监测详情
*/
export async function getSmartMonitor() {
// 设备运行基础数据
let allDevices = await selectDataListByParam(TABLENAME.设备表, {}, ["device_type", "device_id"]);
let totalDevices = allDevices.data.length;
let runningDevices = totalDevices;
let faultRecords = await selectDataListByParam(
TABLENAME.设备故障表,
{ status: { "%ne%": 2 } },
["device_id"]
);
let faultDeviceIds = new Set(faultRecords.data.map((r: any) => r.device_id));
let faultDevices = faultDeviceIds.size;
let normalRate = totalDevices === 0 ? '100%' : (((totalDevices - faultDevices) / totalDevices) * 100).toFixed(2) + '%';
// 智能监测情况、故障原因分析和运维处置状态(模拟数据,待接入真实告警表)
let monitorStatus = {
level1: 5,
level2: 10,
level3: 15,
dataList: [{
regionKey: 1,
regionName: "多功能商务包厢",
fault: 20
}, {
regionKey: 2,
regionName: "多功能商务包厢卫生间",
fault: 35
}]
};
let faultReason = [
{ reason: "设备老化", count: 20 },
{ reason: "环境因素", count: 15 },
{ reason: "操作失误", count: 10 },
{ reason: "软件问题", count: 5 }
];
let faultList = [
{ riskContent: "空调压缩机异常", alertTime: "26/02/01", regionKey: 1, regionName: "多功能商务包厢", deviceId: "ac_01", status: "已解决" },
{ riskContent: "温度传感器离线", alertTime: "26/02/01", regionKey: 1, regionName: "多功能商务包厢", deviceId: "temp_sensor_01", status: "已响应" },
{ riskContent: "湿度超标", alertTime: "26/02/02", regionKey: 2, regionName: "多功能商务包厢卫生间", deviceId: "humidity_sensor_01", status: "未处理" }
];
let processStatus = {
processing: 1, // 处理中
pending: 1, // 待处理
processed: 1, // 已处理
dataList: faultList
};
// 环境监测
let nowTime = new Date();
let airQualityDevices = await selectDataListByParam(TABLENAME.设备表, { device_type: "空气质量传感" }, ["device_id"]);
let airDeviceIds = airQualityDevices.data.map(d => d.device_id);
let qualityIndex = 300;
let co2Trend = [];
let currentCo2 = '21ppm';
let currentTemperature = '21℃';
let temperatureTrend = [];
let currentHumidity = '47%';
let humidityTrend = [];
let currentPm25 = '21μg/m³';
let pm25Trend = [];
let co2TrendDetail = [];
if (airDeviceIds.length) {
let latestAir = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": airDeviceIds },
"%orderDesc%": "received_time",
"%limit%": 1
}, ["data"]);
if (latestAir.data.length) {
let airData = parseDeviceData(latestAir.data[0].data);
currentTemperature = `${airData?.temperature ?? 21}`;
currentHumidity = `${airData?.humidity ?? 47}%`;
currentPm25 = `${airData?.pm25 ?? 21}μg/m³`;
currentCo2 = `${airData?.co2 ?? 400}ppm`;
qualityIndex = 500 - (airData?.pm25 ?? 0);
}
// 过去24小时趋势
let last24h = new Date(nowTime.getTime() - 24*3600000);
let airHistory = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": airDeviceIds },
received_time: { "%gte%": last24h.toISOString().slice(0,19).replace('T',' ') }
}, ["data", "received_time"]);
let hourlyData = new Map();
for (let rec of airHistory.data) {
let d = new Date(rec.received_time);
let hourKey = `${d.getHours()}`;
let data = parseDeviceData(rec.data);
if (!hourlyData.has(hourKey)) {
hourlyData.set(hourKey, { temp: data?.temperature, hum: data?.humidity, pm: data?.pm25, co2: data?.co2 });
}
}
for (let i = 0; i < 24; i++) {
let key = `${i}`;
let val = hourlyData.get(key);
temperatureTrend.push({ time: `${i}:00`, value: val?.temp?.toString() ?? '21' });
humidityTrend.push({ time: `${i}:00`, value: val?.hum?.toString() ?? '47' });
pm25Trend.push({ time: `${i}:00`, value: val?.pm?.toString() ?? '21' });
let co2Val = val?.co2 ?? 400;
co2TrendDetail.push({ time: `${i}:00`, value: (co2Val / 100).toFixed(1) });
co2Trend.push({ time: `${i}`, value: co2Val.toString() });
}
}
return {
summaryData: {
runningDevices,
normalRate,
faultDevices
},
monitorStatus,
faultReason,
processStatus,
temperatureTrend,
humidityTrend,
pm25Trend,
co2Trend
};
}
/**
* 获取智能监控弹窗数据
......@@ -938,6 +1063,19 @@ export async function getSmartMonitorPop(regionKey: string) {
};
}
/**
* 获取企业信息
* @returns
*/
export async function getCompanyInfo() {
// Implementation for fetching company information
return {
history: systemConfig.compInfo.history,
employee: systemConfig.compInfo.employee,
technical: systemConfig.compInfo.technical,
area: systemConfig.compInfo.area
};
}
/**
* 获取所有区域列表(供前端下拉选择)
......
......@@ -37,6 +37,17 @@ export async function initConfig() {
}
}
// 企业信息配置
if (configInfo.config.compInfo) {
let compInfo = configInfo.config.compInfo[0];
systemConfig.compInfo = {
employee: compInfo.employee ? compInfo.employee[0] : "",
history: compInfo.history ? compInfo.history[0] : "",
technical: compInfo.technical ? compInfo.technical[0] : "",
area: compInfo.area ? compInfo.area[0] : ""
};
}
} catch(err) {
console.log('ERROR => 服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确');
console.log(err);
......
......@@ -15,5 +15,10 @@ export class ServerConfig {
pwd:string,
dataBase:string,
}
compInfo:{
history:string,
employee:string,
technical:string,
area:string,
}
}
\ No newline at end of file
......@@ -22,8 +22,14 @@ export function setRouter(httpServer) {
/**运行分析-弹窗 */
httpServer.post('/api/zc/run/analysis/pop', asyncHandler(getRunAnalysisPop));
/** 智能监控 */
httpServer.post('/api/zc/smart/monitor', asyncHandler(getSmartMonitor));
/** 智能监控-弹窗 */
httpServer.post('/api/zc/smart/monitor/pop', asyncHandler(getSmartMonitorPop));
/** 企业信息 */
httpServer.post('/api/zc/company/info', asyncHandler(getCompanyInfo));
}
......@@ -86,6 +92,14 @@ async function deviceFaultPush(req, res) {
res.success(result);
}
/**
* 智能监控
*/
async function getSmartMonitor(req, res) {
const { } = req.body;
const result = await deviceBiz.getSmartMonitor();
res.success(result);
}
/**
* 智能监控-弹窗
......@@ -98,6 +112,15 @@ async function getSmartMonitorPop(req, res) {
res.success(result);
}
/**
* 企业信息
*/
async function getCompanyInfo(req, res) {
const { } = req.body;
const result = await deviceBiz.getCompanyInfo();
res.success(result);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment