Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Q
qingdaoMuseumPlatform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
node_server
qingdaoMuseumPlatform
Commits
ae21dd9b
Commit
ae21dd9b
authored
Jun 10, 2026
by
PC-20251223ZVQQ\Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
运行分析时间查询修正
parent
eea98c25
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
52 additions
and
42 deletions
+52
-42
dataIntegration.ts
src/biz/dataIntegration.ts
+4
-4
running.ts
src/biz/running.ts
+48
-38
No files found.
src/biz/dataIntegration.ts
View file @
ae21dd9b
...
...
@@ -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
:
'
弱
'
,
};
/**
...
...
src/biz/running.ts
View file @
ae21dd9b
...
...
@@ -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;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment