运行分析时间查询修正

parent eea98c25
......@@ -161,7 +161,7 @@ export async function region() {
const AC_CONTROL_PARAMS = {
power: ["on", "off"],
mode: ["制冷", "制热", "送风", "除湿"],
fanSpeed: ["自动", "低", "中", "高"],
fanSpeed: ["自动", "弱", "强", "超强"],
setTemp: "16~30",
roomTemp: "-20~50",
maxTemp: "20~40",
......@@ -313,9 +313,9 @@ const WORK_MODE_MAP: Record<number, string> = {
/** 风速映射:1=高风 2=中风 4=低风 */
const FAN_SPEED_MAP: Record<number, string> = {
1: '',
2: '',
4: '',
1: '超强',
2: '',
4: '',
};
/**
......
......@@ -8,6 +8,15 @@ import { getRegionList } from "./region";
import { startSchedule, stopSchedule } from "../config/schedule";
/**
* 将 Date 对象格式化为本地时间字符串 'YYYY-MM-DD HH:mm:ss'
* 替代 toISOString() 避免 UTC 时区偏移问题
*/
function formatLocalTime(date: Date): string {
const pad = (n: number) => String(n).padStart(2, '0');
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
}
/**
* 智能管控-运行分析
* @param regionGroup 区域组(可选),如“A馆”,如果提供则返回该类型下所有区域的分析数据
* @param regionType 区域类型(可选),如“1F”,如果提供则返回该区域的分析数据
......@@ -48,9 +57,9 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
if (deviceIds.length === 0) return 0;
let records = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": deviceIds },
received_time: { "%gte%": startTime.toISOString().slice(0,19).replace('T',' '), "%lte%": endTime.toISOString().slice(0,19).replace('T',' ') },
"%orderAsc%": "received_time"
}, ["device_id", "data", "received_time"]);
device_time: { "%gte%": formatLocalTime(startTime), "%lte%": formatLocalTime(endTime) },
"%orderAsc%": "device_time"
}, ["device_id", "data", "device_time"]);
let total = 0;
let deviceEnergyMap = new Map();
......@@ -101,13 +110,13 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
monthlyYearOnYear
};
resultAny.electricityTrend = {
last24HoursMax: 0,
last24HoursMax: Math.max(0, ...hourlyEnergy.map((item: any) => Number(item.value))),
last24Hours: hourlyEnergy,
last7DaysMax: 0,
last7DaysMax: Math.max(0, ...dailyEnergy7.map((item: any) => Number(item.value))),
last7Days: dailyEnergy7,
last30DaysMax: 0,
last30DaysMax: Math.max(0, ...dailyEnergy30.map((item: any) => Number(item.value))),
last30Days: dailyEnergy30,
lastYearMax: 0,
lastYearMax: Math.max(0, ...monthlyEnergyYear.map((item: any) => Number(item.value))),
lastYear: monthlyEnergyYear
};
......@@ -133,7 +142,7 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
// 最新数据
let latestAir = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": airDeviceIds },
"%orderDesc%": "received_time",
"%orderDesc%": "device_time",
"%limit%": 1
}, ["data"]);
if (latestAir.data.length) {
......@@ -148,11 +157,11 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
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"]);
device_time: { "%gte%": formatLocalTime(last24h) }
}, ["data", "device_time"]);
let hourlyData = new Map();
for (let rec of airHistory.data) {
let d = new Date(rec.received_time);
let d = new Date(rec.device_time);
let hourKey = `${d.getHours()}`;
let data = rec.data;
if (!hourlyData.has(hourKey)) {
......@@ -245,9 +254,9 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
if (customerDeviceIds) {
let customerDeviceDatas = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": customerDeviceIds },
received_time: { "%gte%": todayStart.toISOString().slice(0,19).replace('T',' '), "%lte%": todayEnd.toISOString().slice(0,19).replace('T',' ') },
"%orderAsc%": "received_time"
}, ["device_id", "data", "received_time"]);
device_time: { "%gte%": formatLocalTime(todayStart), "%lte%": formatLocalTime(todayEnd) },
"%orderAsc%": "device_time"
}, ["device_id", "data", "device_time"]);
// 统计区域类型的客流量
for (let rec of customerDeviceDatas.data) {
......@@ -288,12 +297,12 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
// 获取过去24小时客流量数据
let customerDeviceDatas = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": customerDeviceIds },
received_time: { "%gte%": last24hStart.toISOString().slice(0,19).replace('T',' '), "%lte%": nowTime.toISOString().slice(0,19).replace('T',' ') },
"%orderAsc%": "received_time"
}, ["device_id", "data", "received_time"]);
device_time: { "%gte%": formatLocalTime(last24hStart), "%lte%": formatLocalTime(nowTime) },
"%orderAsc%": "device_time"
}, ["device_id", "data", "device_time"]);
let hourlyCustomerMap = new Map();
for (let rec of customerDeviceDatas.data) {
let d = new Date(rec.received_time);
let d = new Date(rec.device_time);
let hourKey = `${d.getHours()}`;
let data = rec.data;
let customerNum = data.presence === '进' ? 1 : 0;
......@@ -346,12 +355,12 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
let last24h = new Date(nowTime.getTime() - 24 * 3600000);
let acHistory = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": acDeviceIds },
received_time: { "%gte%": last24h.toISOString().slice(0, 19).replace('T', ' ') }
}, ["device_id", "data", "received_time"]);
device_time: { "%gte%": formatLocalTime(last24h) }
}, ["device_id", "data", "device_time"]);
// 2.2.2 按小时统计在线设备数和总设备数
let hourlyData = new Map();
for (let rec of acHistory.data) {
let d = new Date(rec.received_time);
let d = new Date(rec.device_time);
let hourKey = `${d.getHours()}`;
let data = rec.data;
console.log(data);
......@@ -378,10 +387,10 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
let deviceLatestMap = new Map();
for (let devId of acDeviceIds) {
let rec = await selectDataListByParam(TABLENAME.设备数据表,
{ device_id: devId, "%orderDesc%": "received_time", "%limit%": 1 },
["received_time"]);
{ device_id: devId, "%orderDesc%": "device_time", "%limit%": 1 },
["device_time"]);
if (rec.data.length) {
let lastTime = new Date(rec.data[0].received_time);
let lastTime = new Date(rec.data[0].device_time);
let diffMinutes = (nowTime.getTime() - lastTime.getTime()) / 60000;
deviceLatestMap.set(devId, { lastTime, isOnline: diffMinutes <= 30 });
} else {
......@@ -427,13 +436,13 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
if (fanDeviceIds.length) {
let fanDeviceDatas = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": fanDeviceIds },
received_time: { "%gte%": last24hStart.toISOString().slice(0, 19).replace('T', ' '), "%lte%": nowTime.toISOString().slice(0, 19).replace('T', ' ') },
"%orderAsc%": "received_time"
}, ["device_id", "data", "received_time"]);
device_time: { "%gte%": formatLocalTime(last24hStart), "%lte%": formatLocalTime(nowTime) },
"%orderAsc%": "device_time"
}, ["device_id", "data", "device_time"]);
// 3.2.1 按小时统计新风送风量(换气次数=送风量/房间体积)
let hourlyData = new Map(); // {key: 00:00, ly: 0, ry: 0 }
for (let rec of fanDeviceDatas.data) {
let d = new Date(rec.received_time);
let d = new Date(rec.device_time);
let hourKey = `${d.getHours()}`;
let data = rec.data;
if (!hourlyData.has(hourKey)) {
......@@ -581,8 +590,8 @@ export async function getAcRunningPop(regionKey: number, deviceId: string) {
// 获取设备最新数据
let deviceData = await selectDataListByParam(
TABLENAME.设备数据表,
{ device_id: deviceId, "%orderDesc%": "received_time", "%limit%": 1 },
["data", "received_time"]
{ device_id: deviceId, "%orderDesc%": "device_time", "%limit%": 1 },
["data", "device_time"]
);
return {
deviceInfo: devices.data[0].control_params,
......@@ -635,9 +644,9 @@ async function getEnergyTrend(deviceIds: string[], startTime: Date, endTime: Dat
if (deviceIds.length === 0) return [];
let records = await selectDataListByParam(TABLENAME.设备数据表, {
device_id: { "%in%": deviceIds },
received_time: { "%gte%": startTime.toISOString().slice(0,19).replace('T',' '), "%lte%": endTime.toISOString().slice(0,19).replace('T',' ') },
"%orderAsc%": "received_time"
}, ["device_id", "data", "received_time"]);
device_time: { "%gte%": formatLocalTime(startTime), "%lte%": formatLocalTime(endTime) },
"%orderAsc%": "device_time"
}, ["device_id", "data", "device_time"]);
let intervalMap = new Map(); // key: 时间字符串, value: { deviceMin, deviceMax }
for (let rec of records.data) {
......@@ -645,13 +654,14 @@ async function getEnergyTrend(deviceIds: string[], startTime: Date, endTime: Dat
let energy = data.energy ?? data.total_energy;
if (energy === undefined) continue;
let intervalKey: string;
let d = new Date(rec.received_time);
let d = new Date(rec.device_time);
const pad = (n: number) => String(n).padStart(2, '0');
if (granularity === 'hour') {
intervalKey = `${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()} ${d.getHours()}`;
intervalKey = `${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} ${pad(d.getHours())}`;
} else if (granularity === 'day') {
intervalKey = `${d.getFullYear()}/${d.getMonth()+1}/${d.getDate()}`;
intervalKey = `${d.getFullYear()}/${pad(d.getMonth()+1)}/${pad(d.getDate())}`;
} else {
intervalKey = `${d.getFullYear()}-${d.getMonth()+1}`;
intervalKey = `${d.getFullYear()}-${pad(d.getMonth()+1)}`;
}
if (!intervalMap.has(intervalKey)) {
intervalMap.set(intervalKey, { deviceMin: new Map(), deviceMax: new Map() });
......@@ -676,7 +686,7 @@ async function getEnergyTrend(deviceIds: string[], startTime: Date, endTime: Dat
}
result.push({ key, value: total.toFixed(0) });
}
result.sort((a,b) => a.key.localeCompare(b.key));
result.sort((a, b) => a.key.localeCompare(b.key));
return 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