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
7e865780
Commit
7e865780
authored
Sep 04, 2026
by
PC-20251223ZVQQ\Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
联动设置/故障分级/二合一
parent
437999e3
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
211 additions
and
37 deletions
+211
-37
dataIntegration.ts
src/biz/dataIntegration.ts
+12
-5
device.ts
src/biz/device.ts
+22
-10
deviceFault.ts
src/biz/deviceFault.ts
+34
-3
deviceLinkage.ts
src/biz/deviceLinkage.ts
+36
-2
feiyiClient.ts
src/biz/feiyiClient.ts
+6
-5
mqttClient.ts
src/biz/mqttClient.ts
+2
-0
running.ts
src/biz/running.ts
+51
-5
mysqlTableConfig.ts
src/config/mysqlTableConfig.ts
+21
-0
main.ts
src/main.ts
+1
-1
admin.ts
src/routers/admin.ts
+26
-6
No files found.
src/biz/dataIntegration.ts
View file @
7e865780
...
@@ -541,8 +541,8 @@ const FAN_SPEED_MAP: Record<number, string> = {
...
@@ -541,8 +541,8 @@ const FAN_SPEED_MAP: Record<number, string> = {
export
async
function
deviceData
()
{
export
async
function
deviceData
()
{
console
.
log
(
'[设备数据集成] 开始执行...'
);
console
.
log
(
'[设备数据集成] 开始执行...'
);
try
{
try
{
await
integrateAcDeviceData
();
await
integrateAcDeviceData
();
// 空调设备
await
integrateMeterDeviceData
();
await
integrateMeterDeviceData
();
// 电表设备
// 电费数据集成:拉取当天房间电费日使用详情,按 deviceTime 去重后写入 device_expansion
// 电费数据集成:拉取当天房间电费日使用详情,按 deviceTime 去重后写入 device_expansion
await
saveRoomExpensesToExpansion
(
getTodayDateStr
(),
'电能监测'
);
await
saveRoomExpensesToExpansion
(
getTodayDateStr
(),
'电能监测'
);
console
.
log
(
'[设备数据集成] 完成'
);
console
.
log
(
'[设备数据集成] 完成'
);
...
@@ -795,9 +795,10 @@ export async function alertWorkData() {
...
@@ -795,9 +795,10 @@ export async function alertWorkData() {
return
;
return
;
}
}
const
todayDate
=
getTodayDateStr
();
try
{
try
{
// 1. 拉取最近 100 条故障记录(不再限制当天)
// 1. 拉取最近 100 条故障记录(不再限制当天)
const
result
=
await
getIndoorUnitAlarmErrorHis
({
page
:
1
,
limit
:
100
});
const
result
=
await
getIndoorUnitAlarmErrorHis
({
page
:
1
,
limit
:
100
,
occurrenceTime
:
todayDate
});
const
rows
:
any
[]
=
result
?.
rows
||
[];
const
rows
:
any
[]
=
result
?.
rows
||
[];
console
.
log
(
`[预警工单集成] 获取
${
rows
.
length
}
条故障记录`
);
console
.
log
(
`[预警工单集成] 获取
${
rows
.
length
}
条故障记录`
);
...
@@ -831,7 +832,7 @@ export async function alertWorkData() {
...
@@ -831,7 +832,7 @@ export async function alertWorkData() {
// 4. 收集所有故障码,批量查询故障详情(缓存去重)
// 4. 收集所有故障码,批量查询故障详情(缓存去重)
const
alarmCodes
=
[...
new
Set
(
rows
.
map
((
r
:
any
)
=>
r
.
alarmCode
).
filter
(
Boolean
))]
as
string
[];
const
alarmCodes
=
[...
new
Set
(
rows
.
map
((
r
:
any
)
=>
r
.
alarmCode
).
filter
(
Boolean
))]
as
string
[];
const
faultInfoMap
=
new
Map
<
string
,
{
errorInfo
:
string
;
scheme
:
string
|
null
}
>
();
const
faultInfoMap
=
new
Map
<
string
,
{
errorInfo
:
string
;
scheme
:
string
|
null
;
faultLevel
:
string
}
>
();
if
(
alarmCodes
.
length
>
0
)
{
if
(
alarmCodes
.
length
>
0
)
{
console
.
log
(
`[预警工单集成] 查询
${
alarmCodes
.
length
}
个不同故障码的详情...`
);
console
.
log
(
`[预警工单集成] 查询
${
alarmCodes
.
length
}
个不同故障码的详情...`
);
const
infoResults
=
await
Promise
.
all
(
const
infoResults
=
await
Promise
.
all
(
...
@@ -867,6 +868,12 @@ export async function alertWorkData() {
...
@@ -867,6 +868,12 @@ export async function alertWorkData() {
&&
faultInfo
.
errorInfo
!==
r
.
alarmCode
&&
faultInfo
.
errorInfo
!==
r
.
alarmCode
&&
faultInfo
.
errorInfo
!==
'查询失败'
;
&&
faultInfo
.
errorInfo
!==
'查询失败'
;
const
errorMsg
=
faultFound
?
faultInfo
.
errorInfo
:
'未找到主内机'
;
const
errorMsg
=
faultFound
?
faultInfo
.
errorInfo
:
'未找到主内机'
;
// faultLevel → 工单 level:故障=1级、警示=2级、提示=3级;未设置/未查到时默认 2级
const
faultLevel
=
faultInfo
?
faultInfo
.
faultLevel
||
''
:
''
;
let
level
=
2
;
if
(
faultLevel
===
'故障'
)
level
=
1
;
else
if
(
faultLevel
===
'警示'
)
level
=
2
;
else
if
(
faultLevel
===
'提示'
)
level
=
3
;
toInsert
.
push
({
toInsert
.
push
({
device_id
:
deviceId
,
device_id
:
deviceId
,
...
@@ -875,7 +882,7 @@ export async function alertWorkData() {
...
@@ -875,7 +882,7 @@ export async function alertWorkData() {
fault_description
:
errorMsg
,
fault_description
:
errorMsg
,
fault_origin_id
:
r
.
indoorUnitAlarmId
,
fault_origin_id
:
r
.
indoorUnitAlarmId
,
occurred_time
:
r
.
deviceTime
?
new
Date
(
r
.
deviceTime
)
:
new
Date
(),
occurred_time
:
r
.
deviceTime
?
new
Date
(
r
.
deviceTime
)
:
new
Date
(),
level
:
2
,
level
,
status
:
0
,
status
:
0
,
});
});
}
}
...
...
src/biz/device.ts
View file @
7e865780
...
@@ -921,20 +921,32 @@ export async function getDeviceEnergyList(regionGroup?: string, regionType?: str
...
@@ -921,20 +921,32 @@ export async function getDeviceEnergyList(regionGroup?: string, regionType?: str
}
}
}
}
// 5. 组装返回(仅返回有能耗数据的区域)
// 5. 组装返回(仅返回有能耗数据的区域,昨日/今日分离为两条记录)
const
dataList
=
Object
.
keys
(
agg
)
const
dataList
:
any
[]
=
[];
Object
.
keys
(
agg
)
.
map
((
rkStr
)
=>
Number
(
rkStr
))
.
map
((
rkStr
)
=>
Number
(
rkStr
))
.
filter
((
rk
)
=>
regionMap
[
rk
])
.
filter
((
rk
)
=>
regionMap
[
rk
])
.
map
((
rk
)
=>
{
.
sort
((
a
,
b
)
=>
a
-
b
)
.
forEach
((
rk
)
=>
{
const
region
=
regionMap
[
rk
];
const
region
=
regionMap
[
rk
];
return
{
const
regionName
=
[
region
.
groups
,
region
.
type
,
region
.
name
].
filter
(
Boolean
).
join
(
'_'
);
const
yesterdayEnergy
=
Math
.
round
(
agg
[
rk
].
yesterdayEnergy
*
100
)
/
100
;
const
todayEnergy
=
Math
.
round
(
agg
[
rk
].
todayEnergy
*
100
)
/
100
;
// 昨日记录
dataList
.
push
({
series
:
'昨日'
,
regionKey
:
rk
,
regionKey
:
rk
,
regionName
:
[
region
.
groups
,
region
.
type
,
region
.
name
].
filter
(
Boolean
).
join
(
'_'
),
regionName
,
yesterdayEnergy
:
Math
.
round
(
agg
[
rk
].
yesterdayEnergy
*
100
)
/
100
,
yesterdayEnergy
todayEnergy
:
Math
.
round
(
agg
[
rk
].
todayEnergy
*
100
)
/
100
});
};
// 今日记录
})
dataList
.
push
({
.
sort
((
a
,
b
)
=>
a
.
regionKey
-
b
.
regionKey
);
series
:
'今日'
,
regionKey
:
rk
,
regionName
,
todayEnergy
});
});
return
{
total
:
dataList
.
length
,
dataList
};
return
{
total
:
dataList
.
length
,
dataList
};
}
}
...
...
src/biz/deviceFault.ts
View file @
7e865780
import
{
selectPaginatedDataWithOrder
}
from
"../data/findData"
;
import
{
selectPaginatedDataWithOrder
,
selectDataListByParam
}
from
"../data/findData"
;
import
{
TABLENAME
}
from
"../config/dbEnum"
;
import
{
TABLENAME
}
from
"../config/dbEnum"
;
/** 故障等级映射 */
/** 故障等级映射 */
...
@@ -60,10 +60,41 @@ export async function getDeviceFaultList(params: AlertWorkOrderQueryParams) {
...
@@ -60,10 +60,41 @@ export async function getDeviceFaultList(params: AlertWorkOrderQueryParams) {
[[
"created_at"
,
"DESC"
]],
[[
"created_at"
,
"DESC"
]],
);
);
// 通过设备编号查询所属区域,拼接 regionName(groups_type_name)
const
rows
=
(
result
.
data
as
any
[])
||
[];
const
deviceIds
=
[...
new
Set
(
rows
.
map
((
item
:
any
)
=>
item
.
device_id
).
filter
(
Boolean
))];
const
deviceRegionNameMap
:
{
[
deviceId
:
string
]:
string
}
=
{};
if
(
deviceIds
.
length
>
0
)
{
const
deviceResult
=
await
selectDataListByParam
(
TABLENAME
.
设备表
,
{
device_id
:
{
"%in%"
:
deviceIds
}
},
[
"device_id"
,
"region_key"
]
);
const
regionKeys
=
[...
new
Set
((
deviceResult
.
data
||
[]).
map
((
d
:
any
)
=>
d
.
region_key
).
filter
(
Boolean
))];
const
regionMap
:
{
[
id
:
number
]:
any
}
=
{};
if
(
regionKeys
.
length
>
0
)
{
const
regionResult
=
await
selectDataListByParam
(
TABLENAME
.
区域表
,
{
id
:
{
"%in%"
:
regionKeys
}
},
[
"id"
,
"groups"
,
"type"
,
"name"
]
);
(
regionResult
.
data
||
[]).
forEach
((
r
:
any
)
=>
{
regionMap
[
r
.
id
]
=
r
;
});
}
(
deviceResult
.
data
||
[]).
forEach
((
d
:
any
)
=>
{
const
region
=
regionMap
[
d
.
region_key
];
deviceRegionNameMap
[
d
.
device_id
]
=
region
?
[
region
.
groups
,
region
.
type
,
region
.
name
].
filter
(
Boolean
).
join
(
'_'
)
:
''
;
});
}
// 映射中文名
// 映射中文名
const
list
=
(
result
.
data
as
any
[])
.
map
((
item
:
any
)
=>
({
const
list
=
rows
.
map
((
item
:
any
)
=>
({
id
:
item
.
id
,
id
:
item
.
id
,
device_id
:
item
.
device_id
||
''
,
device_id
:
item
.
device_id
||
''
,
regionName
:
deviceRegionNameMap
[
item
.
device_id
]
||
''
,
fault_type
:
item
.
fault_type
||
''
,
fault_type
:
item
.
fault_type
||
''
,
fault_code
:
item
.
fault_code
||
''
,
fault_code
:
item
.
fault_code
||
''
,
fault_description
:
item
.
fault_description
||
''
,
fault_description
:
item
.
fault_description
||
''
,
...
@@ -74,7 +105,7 @@ export async function getDeviceFaultList(params: AlertWorkOrderQueryParams) {
...
@@ -74,7 +105,7 @@ export async function getDeviceFaultList(params: AlertWorkOrderQueryParams) {
status
:
item
.
status
,
status
:
item
.
status
,
statusName
:
statusMap
[
item
.
status
]
||
'未知'
,
statusName
:
statusMap
[
item
.
status
]
||
'未知'
,
order_address
:
''
,
// 预留:工单地址,todo
order_address
:
''
,
// 预留:工单地址,todo
order_send
:
'on'
,
// 预留:工单推送,默认 on,todo
order_send
:
item
.
level
===
1
?
'on'
:
'off'
,
// 工单推送:一级推送 on,其他 off
}));
}));
return
{
return
{
...
...
src/biz/deviceLinkage.ts
View file @
7e865780
...
@@ -68,7 +68,9 @@ export async function getLinkageList(params: {
...
@@ -68,7 +68,9 @@ export async function getLinkageList(params: {
TABLENAME
.
设备联动调节表
,
TABLENAME
.
设备联动调节表
,
queryParam
,
queryParam
,
[
"id"
,
"device_id"
,
"linkage_type"
,
"threshold_max"
,
"threshold_min"
,
"threshold_mid"
,
[
"id"
,
"device_id"
,
"linkage_type"
,
"threshold_max"
,
"threshold_min"
,
"threshold_mid"
,
"setting_max"
,
"setting_min"
,
"setting_mid"
,
"divide_method"
,
"begin_validity"
,
"end_validity"
,
"created_at"
,
"updated_at"
],
"setting_max"
,
"setting_min"
,
"setting_mid"
,
"fan_speed_max"
,
"fan_speed_mid"
,
"fan_speed_min"
,
"is_use"
,
"divide_method"
,
"begin_validity"
,
"end_validity"
,
"created_at"
,
"updated_at"
],
pageNumber
,
pageNumber
,
pageSize
,
pageSize
,
[[
"id"
,
"DESC"
]],
[[
"id"
,
"DESC"
]],
...
@@ -101,6 +103,10 @@ export async function getLinkageList(params: {
...
@@ -101,6 +103,10 @@ export async function getLinkageList(params: {
settingMax
:
item
.
setting_max
??
''
,
settingMax
:
item
.
setting_max
??
''
,
settingMin
:
item
.
setting_min
??
''
,
settingMin
:
item
.
setting_min
??
''
,
settingMid
:
item
.
setting_mid
??
''
,
settingMid
:
item
.
setting_mid
??
''
,
fanSpeedMax
:
item
.
fan_speed_max
??
''
,
fanSpeedMid
:
item
.
fan_speed_mid
??
''
,
fanSpeedMin
:
item
.
fan_speed_min
??
''
,
isUse
:
item
.
is_use
??
'on'
,
divideMethod
:
item
.
divide_method
||
''
,
divideMethod
:
item
.
divide_method
||
''
,
beginValidity
:
item
.
begin_validity
beginValidity
:
item
.
begin_validity
?
(
typeof
item
.
begin_validity
===
"string"
?
item
.
begin_validity
:
formatLocalTime
(
new
Date
(
item
.
begin_validity
)))
?
(
typeof
item
.
begin_validity
===
"string"
?
item
.
begin_validity
:
formatLocalTime
(
new
Date
(
item
.
begin_validity
)))
...
@@ -134,7 +140,9 @@ export async function getLinkageDetail(id: number): Promise<any> {
...
@@ -134,7 +140,9 @@ export async function getLinkageDetail(id: number): Promise<any> {
TABLENAME
.
设备联动调节表
,
TABLENAME
.
设备联动调节表
,
{
id
},
{
id
},
[
"id"
,
"device_id"
,
"linkage_type"
,
"threshold_max"
,
"threshold_min"
,
"threshold_mid"
,
[
"id"
,
"device_id"
,
"linkage_type"
,
"threshold_max"
,
"threshold_min"
,
"threshold_mid"
,
"setting_max"
,
"setting_min"
,
"setting_mid"
,
"divide_method"
,
"begin_validity"
,
"end_validity"
,
"created_at"
,
"updated_at"
]
"setting_max"
,
"setting_min"
,
"setting_mid"
,
"fan_speed_max"
,
"fan_speed_mid"
,
"fan_speed_min"
,
"is_use"
,
"divide_method"
,
"begin_validity"
,
"end_validity"
,
"created_at"
,
"updated_at"
]
);
);
const
rows
:
any
[]
=
res
.
data
||
[];
const
rows
:
any
[]
=
res
.
data
||
[];
if
(
rows
.
length
===
0
)
{
if
(
rows
.
length
===
0
)
{
...
@@ -167,6 +175,10 @@ export async function getLinkageDetail(id: number): Promise<any> {
...
@@ -167,6 +175,10 @@ export async function getLinkageDetail(id: number): Promise<any> {
settingMax
:
item
.
setting_max
??
''
,
settingMax
:
item
.
setting_max
??
''
,
settingMin
:
item
.
setting_min
??
''
,
settingMin
:
item
.
setting_min
??
''
,
settingMid
:
item
.
setting_mid
??
''
,
settingMid
:
item
.
setting_mid
??
''
,
fanSpeedMax
:
item
.
fan_speed_max
??
''
,
fanSpeedMid
:
item
.
fan_speed_mid
??
''
,
fanSpeedMin
:
item
.
fan_speed_min
??
''
,
isUse
:
item
.
is_use
??
'on'
,
divideMethod
:
item
.
divide_method
||
''
,
divideMethod
:
item
.
divide_method
||
''
,
beginValidity
:
item
.
begin_validity
beginValidity
:
item
.
begin_validity
?
(
typeof
item
.
begin_validity
===
"string"
?
item
.
begin_validity
:
formatLocalTime
(
new
Date
(
item
.
begin_validity
)))
?
(
typeof
item
.
begin_validity
===
"string"
?
item
.
begin_validity
:
formatLocalTime
(
new
Date
(
item
.
begin_validity
)))
...
@@ -200,6 +212,9 @@ export async function addLinkage(params: {
...
@@ -200,6 +212,9 @@ export async function addLinkage(params: {
settingMax
?:
string
;
settingMax
?:
string
;
settingMin
?:
string
;
settingMin
?:
string
;
settingMid
?:
string
;
settingMid
?:
string
;
fanSpeedMax
?:
string
;
fanSpeedMid
?:
string
;
fanSpeedMin
?:
string
;
divideMethod
?:
string
;
divideMethod
?:
string
;
beginValidity
?:
string
;
beginValidity
?:
string
;
endValidity
?:
string
;
endValidity
?:
string
;
...
@@ -228,6 +243,10 @@ export async function addLinkage(params: {
...
@@ -228,6 +243,10 @@ export async function addLinkage(params: {
setting_max
:
params
.
settingMax
??
null
,
setting_max
:
params
.
settingMax
??
null
,
setting_min
:
params
.
settingMin
??
null
,
setting_min
:
params
.
settingMin
??
null
,
setting_mid
:
params
.
settingMid
??
null
,
setting_mid
:
params
.
settingMid
??
null
,
fan_speed_max
:
params
.
fanSpeedMax
??
null
,
fan_speed_mid
:
params
.
fanSpeedMid
??
null
,
fan_speed_min
:
params
.
fanSpeedMin
??
null
,
is_use
:
'on'
,
// 新增默认启用
divide_method
:
params
.
divideMethod
??
null
,
divide_method
:
params
.
divideMethod
??
null
,
begin_validity
:
params
.
beginValidity
||
null
,
begin_validity
:
params
.
beginValidity
||
null
,
end_validity
:
params
.
endValidity
||
null
,
end_validity
:
params
.
endValidity
||
null
,
...
@@ -253,6 +272,9 @@ export async function batchAddLinkage(params: {
...
@@ -253,6 +272,9 @@ export async function batchAddLinkage(params: {
settingMax
?:
string
;
settingMax
?:
string
;
settingMin
?:
string
;
settingMin
?:
string
;
settingMid
?:
string
;
settingMid
?:
string
;
fanSpeedMax
?:
string
;
fanSpeedMid
?:
string
;
fanSpeedMin
?:
string
;
divideMethod
?:
string
;
divideMethod
?:
string
;
beginValidity
?:
string
;
beginValidity
?:
string
;
endValidity
?:
string
;
endValidity
?:
string
;
...
@@ -291,6 +313,10 @@ export async function batchAddLinkage(params: {
...
@@ -291,6 +313,10 @@ export async function batchAddLinkage(params: {
setting_max
:
params
.
settingMax
??
null
,
setting_max
:
params
.
settingMax
??
null
,
setting_min
:
params
.
settingMin
??
null
,
setting_min
:
params
.
settingMin
??
null
,
setting_mid
:
params
.
settingMid
??
null
,
setting_mid
:
params
.
settingMid
??
null
,
fan_speed_max
:
params
.
fanSpeedMax
??
null
,
fan_speed_mid
:
params
.
fanSpeedMid
??
null
,
fan_speed_min
:
params
.
fanSpeedMin
??
null
,
is_use
:
'on'
,
// 新增默认启用
divide_method
:
params
.
divideMethod
??
null
,
divide_method
:
params
.
divideMethod
??
null
,
begin_validity
:
params
.
beginValidity
||
null
,
begin_validity
:
params
.
beginValidity
||
null
,
end_validity
:
params
.
endValidity
||
null
,
end_validity
:
params
.
endValidity
||
null
,
...
@@ -317,6 +343,10 @@ export async function editLinkage(params: {
...
@@ -317,6 +343,10 @@ export async function editLinkage(params: {
settingMax
?:
string
;
settingMax
?:
string
;
settingMin
?:
string
;
settingMin
?:
string
;
settingMid
?:
string
;
settingMid
?:
string
;
fanSpeedMax
?:
string
;
fanSpeedMid
?:
string
;
fanSpeedMin
?:
string
;
isUse
?:
string
;
divideMethod
?:
string
;
divideMethod
?:
string
;
beginValidity
?:
string
;
beginValidity
?:
string
;
endValidity
?:
string
;
endValidity
?:
string
;
...
@@ -340,6 +370,10 @@ export async function editLinkage(params: {
...
@@ -340,6 +370,10 @@ export async function editLinkage(params: {
if
(
params
.
settingMax
!==
undefined
)
dbEdits
.
setting_max
=
params
.
settingMax
;
if
(
params
.
settingMax
!==
undefined
)
dbEdits
.
setting_max
=
params
.
settingMax
;
if
(
params
.
settingMin
!==
undefined
)
dbEdits
.
setting_min
=
params
.
settingMin
;
if
(
params
.
settingMin
!==
undefined
)
dbEdits
.
setting_min
=
params
.
settingMin
;
if
(
params
.
settingMid
!==
undefined
)
dbEdits
.
setting_mid
=
params
.
settingMid
;
if
(
params
.
settingMid
!==
undefined
)
dbEdits
.
setting_mid
=
params
.
settingMid
;
if
(
params
.
fanSpeedMax
!==
undefined
)
dbEdits
.
fan_speed_max
=
params
.
fanSpeedMax
;
if
(
params
.
fanSpeedMid
!==
undefined
)
dbEdits
.
fan_speed_mid
=
params
.
fanSpeedMid
;
if
(
params
.
fanSpeedMin
!==
undefined
)
dbEdits
.
fan_speed_min
=
params
.
fanSpeedMin
;
if
(
params
.
isUse
!==
undefined
)
dbEdits
.
is_use
=
params
.
isUse
;
if
(
params
.
divideMethod
!==
undefined
)
dbEdits
.
divide_method
=
params
.
divideMethod
;
if
(
params
.
divideMethod
!==
undefined
)
dbEdits
.
divide_method
=
params
.
divideMethod
;
if
(
params
.
beginValidity
!==
undefined
)
dbEdits
.
begin_validity
=
params
.
beginValidity
||
null
;
if
(
params
.
beginValidity
!==
undefined
)
dbEdits
.
begin_validity
=
params
.
beginValidity
||
null
;
if
(
params
.
endValidity
!==
undefined
)
dbEdits
.
end_validity
=
params
.
endValidity
||
null
;
if
(
params
.
endValidity
!==
undefined
)
dbEdits
.
end_validity
=
params
.
endValidity
||
null
;
...
...
src/biz/feiyiClient.ts
View file @
7e865780
...
@@ -578,9 +578,9 @@ export async function getIndoorUnitAlarmErrorHis(params: any): Promise<any> {
...
@@ -578,9 +578,9 @@ export async function getIndoorUnitAlarmErrorHis(params: any): Promise<any> {
* 接口文档:空调故障码对接服务与解析流程.pdf
* 接口文档:空调故障码对接服务与解析流程.pdf
* @param brandCode 品牌编码,如 "1"=日立
* @param brandCode 品牌编码,如 "1"=日立
* @param errorCode 错误编码,如 "LOST"
* @param errorCode 错误编码,如 "LOST"
* @returns { errorInfo: string, scheme: string | null
} 故障信息描述、解决方案
* @returns { errorInfo: string, scheme: string | null
, faultLevel: string } 故障信息描述、解决方案、故障等级(故障/警示/提示,未设置返回空字符串)
*/
*/
export
async
function
getFaultCodeInfo
(
brandCode
:
string
,
errorCode
:
string
):
Promise
<
{
errorInfo
:
string
;
scheme
:
string
|
null
}
>
{
export
async
function
getFaultCodeInfo
(
brandCode
:
string
,
errorCode
:
string
):
Promise
<
{
errorInfo
:
string
;
scheme
:
string
|
null
;
faultLevel
:
string
}
>
{
const
url
=
'https://errorcode.feiyikj.cn/prod-api/feiyi/app/errorCode/info'
;
const
url
=
'https://errorcode.feiyikj.cn/prod-api/feiyi/app/errorCode/info'
;
const
query
=
{
brandCode
,
errorCode
};
const
query
=
{
brandCode
,
errorCode
};
let
result
:
any
;
let
result
:
any
;
...
@@ -588,20 +588,21 @@ export async function getFaultCodeInfo(brandCode: string, errorCode: string): Pr
...
@@ -588,20 +588,21 @@ export async function getFaultCodeInfo(brandCode: string, errorCode: string): Pr
result
=
await
get
(
url
,
query
);
result
=
await
get
(
url
,
query
);
}
catch
(
err
)
{
}
catch
(
err
)
{
console
.
error
(
`[故障码查询] 请求失败 brandCode=
${
brandCode
}
errorCode=
${
errorCode
}
:`
,
err
);
console
.
error
(
`[故障码查询] 请求失败 brandCode=
${
brandCode
}
errorCode=
${
errorCode
}
:`
,
err
);
return
{
errorInfo
:
'查询失败'
,
scheme
:
null
};
return
{
errorInfo
:
'查询失败'
,
scheme
:
null
,
faultLevel
:
''
};
}
}
if
(
!
result
||
result
.
code
!==
200
)
{
if
(
!
result
||
result
.
code
!==
200
)
{
console
.
error
(
`[故障码查询] 接口返回异常 brandCode=
${
brandCode
}
errorCode=
${
errorCode
}
:`
,
result
);
console
.
error
(
`[故障码查询] 接口返回异常 brandCode=
${
brandCode
}
errorCode=
${
errorCode
}
:`
,
result
);
return
{
errorInfo
:
'查询失败'
,
scheme
:
null
};
return
{
errorInfo
:
'查询失败'
,
scheme
:
null
,
faultLevel
:
''
};
}
}
const
data
=
result
.
data
||
[];
const
data
=
result
.
data
||
[];
if
(
data
.
length
===
0
)
{
if
(
data
.
length
===
0
)
{
console
.
warn
(
`[故障码查询] 未查到故障码信息 brandCode=
${
brandCode
}
errorCode=
${
errorCode
}
`
);
console
.
warn
(
`[故障码查询] 未查到故障码信息 brandCode=
${
brandCode
}
errorCode=
${
errorCode
}
`
);
return
{
errorInfo
:
errorCode
,
scheme
:
null
};
return
{
errorInfo
:
errorCode
,
scheme
:
null
,
faultLevel
:
''
};
}
}
return
{
return
{
errorInfo
:
data
[
0
].
errorInfo
||
errorCode
,
errorInfo
:
data
[
0
].
errorInfo
||
errorCode
,
scheme
:
data
[
0
].
scheme
||
null
,
scheme
:
data
[
0
].
scheme
||
null
,
faultLevel
:
data
[
0
].
faultLevel
||
''
,
};
};
}
}
...
...
src/biz/mqttClient.ts
View file @
7e865780
...
@@ -25,6 +25,8 @@ import { systemConfig } from "../config/serverConfig";
...
@@ -25,6 +25,8 @@ import { systemConfig } from "../config/serverConfig";
* "temperature": 22.5,
* "temperature": 22.5,
* "tvoc": 1.56
* "tvoc": 1.56
* }
* }
*
* 消息示例2:{"applicationID":1,"battery":100,"cellularIP":"0.0.0.0","devEUI":"24e12472506d8c79","deviceName":"cgq14","gatewayTime":"2026-09-03T09:41:18+08:00","humidity":51,"temperature":22.7}
*/
*/
export
async
function
processDeviceData
(
message
)
{
export
async
function
processDeviceData
(
message
)
{
const
requestTime
=
new
Date
();
const
requestTime
=
new
Date
();
...
...
src/biz/running.ts
View file @
7e865780
...
@@ -499,7 +499,7 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
...
@@ -499,7 +499,7 @@ export async function getRunAnalysis(regionGroup: string, regionType: string) {
device_id
:
f
.
device_id
||
''
,
device_id
:
f
.
device_id
||
''
,
faultCode
:
f
.
fault_code
||
''
,
faultCode
:
f
.
fault_code
||
''
,
order_address
:
deviceOrderAddressMap
.
get
(
deviceRegionKeyMap
.
get
(
f
.
device_id
)?.
toString
())
||
''
,
order_address
:
deviceOrderAddressMap
.
get
(
deviceRegionKeyMap
.
get
(
f
.
device_id
)?.
toString
())
||
''
,
order_send
:
'on'
,
// TODO: 后续需要实现工单推送的实际逻辑
order_send
:
f
.
level
===
1
?
'on'
:
'off'
,
// 工单推送:一级推送 on,其他 off
}));
}));
// } else {
// } else {
// alertWorkOrders = sortedFaults.map((f: any) => ({
// alertWorkOrders = sortedFaults.map((f: any) => ({
...
@@ -934,7 +934,7 @@ export async function getAcRunningPop(regionKey: number, deviceId: string) {
...
@@ -934,7 +934,7 @@ export async function getAcRunningPop(regionKey: number, deviceId: string) {
let
deviceType
=
devices
?.
data
[
0
].
device_type
;
let
deviceType
=
devices
?.
data
[
0
].
device_type
;
if
(
deviceType
!==
"环境监测"
)
{
if
(
deviceType
!==
"环境监测"
&&
deviceType
!==
"温湿监测"
)
{
// 通过飞奕内机列表获取实时设备数据
// 通过飞奕内机列表获取实时设备数据
let
detailData
=
await
getIndoorUnitStatus
(
deviceId
);
let
detailData
=
await
getIndoorUnitStatus
(
deviceId
);
detailData
.
fanSpeed
=
detailData
&&
detailData
.
fanSpeed
?
acDeviceKeyMap
[
detailData
.
fanSpeed
]
:
2
;
detailData
.
fanSpeed
=
detailData
&&
detailData
.
fanSpeed
?
acDeviceKeyMap
[
detailData
.
fanSpeed
]
:
2
;
...
@@ -1147,14 +1147,19 @@ async function findEffectiveLinkage(deviceId: string, deviceType: string): Promi
...
@@ -1147,14 +1147,19 @@ async function findEffectiveLinkage(deviceId: string, deviceType: string): Promi
const
res
=
await
selectDataListByParam
(
const
res
=
await
selectDataListByParam
(
TABLENAME
.
设备联动调节表
,
TABLENAME
.
设备联动调节表
,
{
device_id
:
deviceId
},
{
device_id
:
deviceId
},
[
"id"
,
"device_id"
,
"linkage_type"
,
"threshold_max"
,
"threshold_min"
,
"begin_validity"
,
"end_validity"
]
[
"id"
,
"device_id"
,
"linkage_type"
,
"threshold_max"
,
"threshold_min"
,
"threshold_mid"
,
"setting_max"
,
"setting_min"
,
"setting_mid"
,
"fan_speed_max"
,
"fan_speed_mid"
,
"fan_speed_min"
,
"is_use"
,
"begin_validity"
,
"end_validity"
]
);
);
const
rows
:
any
[]
=
res
.
data
||
[];
const
rows
:
any
[]
=
res
.
data
||
[];
if
(
rows
.
length
===
0
)
return
null
;
if
(
rows
.
length
===
0
)
return
null
;
const
now
=
new
Date
();
const
now
=
new
Date
();
// 过滤有效期
内
的配置
// 过滤有效期
+ 启用(is_use=on)
的配置
const
valid
=
rows
.
filter
((
r
:
any
)
=>
{
const
valid
=
rows
.
filter
((
r
:
any
)
=>
{
if
(
r
.
is_use
===
'off'
)
return
false
;
const
begin
=
r
.
begin_validity
?
new
Date
(
r
.
begin_validity
)
:
null
;
const
begin
=
r
.
begin_validity
?
new
Date
(
r
.
begin_validity
)
:
null
;
const
end
=
r
.
end_validity
?
new
Date
(
r
.
end_validity
)
:
null
;
const
end
=
r
.
end_validity
?
new
Date
(
r
.
end_validity
)
:
null
;
if
(
begin
&&
begin
>
now
)
return
false
;
if
(
begin
&&
begin
>
now
)
return
false
;
...
@@ -1299,7 +1304,48 @@ console.log(`若是空调设备,判断联动是否开启 ${acDevices.data.leng
...
@@ -1299,7 +1304,48 @@ console.log(`若是空调设备,判断联动是否开启 ${acDevices.data.leng
console
.
log
(
`空调联动设备按日程过滤后
${
acDevices
.
data
.
length
}
台参与控制`
);
console
.
log
(
`空调联动设备按日程过滤后
${
acDevices
.
data
.
length
}
台参与控制`
);
}
}
if
(
acDevices
.
data
.
length
>
0
)
{
if
(
acDevices
.
data
.
length
>
0
)
{
const
{
tempSet
,
fanSpeed
,
onOff
}
=
calcAcTempSet
(
temperature
,
season
);
// ===== 自动联动温度计算:写死三段式改为查询联动表(device_linkage) =====
// 注释原写死调用(保留 calcAcTempSet 作为无配置兜底,不删除)
// const { tempSet, fanSpeed, onOff } = calcAcTempSet(temperature, season);
let
tempSet
:
number
,
fanSpeed
:
number
,
onOff
:
number
;
let
linkageConf
:
any
=
null
;
// 遍历本区域空调,取第一台存在有效联动配置的设备(按 制冷/制热 类型匹配当前季节)
for
(
const
ac
of
acDevices
.
data
)
{
linkageConf
=
await
findEffectiveLinkage
(
ac
.
device_id
,
'空调'
);
if
(
linkageConf
)
break
;
}
if
(
linkageConf
&&
Number
.
isFinite
(
Number
(
linkageConf
.
threshold_max
))
&&
Number
.
isFinite
(
Number
(
linkageConf
.
threshold_min
))
&&
Number
.
isFinite
(
Number
(
linkageConf
.
setting_max
))
&&
Number
.
isFinite
(
Number
(
linkageConf
.
setting_min
))
&&
Number
.
isFinite
(
Number
(
linkageConf
.
setting_mid
)))
{
const
tMax
=
Number
(
linkageConf
.
threshold_max
);
const
tMin
=
Number
(
linkageConf
.
threshold_min
);
const
sMax
=
Number
(
linkageConf
.
setting_max
);
const
sMin
=
Number
(
linkageConf
.
setting_min
);
const
sMid
=
Number
(
linkageConf
.
setting_mid
);
// 风速档位:1 高风 2 中风 4 低风(联动表未配置时兜底 2 中风)
const
fMax
=
Number
.
isFinite
(
Number
(
linkageConf
.
fan_speed_max
))
?
Number
(
linkageConf
.
fan_speed_max
)
:
2
;
const
fMid
=
Number
.
isFinite
(
Number
(
linkageConf
.
fan_speed_mid
))
?
Number
(
linkageConf
.
fan_speed_mid
)
:
2
;
const
fMin
=
Number
.
isFinite
(
Number
(
linkageConf
.
fan_speed_min
))
?
Number
(
linkageConf
.
fan_speed_min
)
:
2
;
// 制冷(夏季):temperature >= threshold_max → setting_max + fan_speed_max;中间 → setting_mid + fan_speed_mid;< threshold_min → setting_min + fan_speed_min
// 制热(冬季):temperature > threshold_max → setting_max + fan_speed_max;中间 → setting_mid + fan_speed_mid;<= threshold_min → setting_min + fan_speed_min
if
(
season
===
'summer'
)
{
if
(
temperature
>=
tMax
)
{
tempSet
=
sMax
;
fanSpeed
=
fMax
;
}
else
if
(
temperature
<
tMin
)
{
tempSet
=
sMin
;
fanSpeed
=
fMin
;
}
else
{
tempSet
=
sMid
;
fanSpeed
=
fMid
;
}
}
else
{
if
(
temperature
>
tMax
)
{
tempSet
=
sMax
;
fanSpeed
=
fMax
;
}
else
if
(
temperature
<=
tMin
)
{
tempSet
=
sMin
;
fanSpeed
=
fMin
;
}
else
{
tempSet
=
sMid
;
fanSpeed
=
fMid
;
}
}
onOff
=
1
;
// 默认开机
console
.
log
(
`空调联动使用联动表配置: device=
${
linkageConf
.
device_id
}
, type=
${
linkageConf
.
linkage_type
}
, 室温
${
temperature
}
℃ → 设定
${
tempSet
}
℃ 风速
${
fanSpeed
}
`
);
}
else
{
// 无有效联动配置,回退原写死三段式
const
fallback
=
calcAcTempSet
(
temperature
,
season
);
tempSet
=
fallback
.
tempSet
;
fanSpeed
=
fallback
.
fanSpeed
;
onOff
=
fallback
.
onOff
;
}
const
workMode
=
season
===
'summer'
?
1
:
2
;
// 1制冷 2制热
const
workMode
=
season
===
'summer'
?
1
:
2
;
// 1制冷 2制热
const
modeName
=
season
===
'summer'
?
'制冷'
:
'制热'
;
const
modeName
=
season
===
'summer'
?
'制冷'
:
'制热'
;
...
...
src/config/mysqlTableConfig.ts
View file @
7e865780
...
@@ -601,6 +601,27 @@ export const TablesConfig = [
...
@@ -601,6 +601,27 @@ export const TablesConfig = [
allowNull
:
true
,
allowNull
:
true
,
comment
:
'中间设置:处于阈值区间内的设定值'
comment
:
'中间设置:处于阈值区间内的设定值'
},
},
fan_speed_max
:
{
type
:
DataTypes
.
STRING
(
20
),
allowNull
:
true
,
comment
:
'上限风速:高于阈值上限时的风速档位'
},
fan_speed_mid
:
{
type
:
DataTypes
.
STRING
(
20
),
allowNull
:
true
,
comment
:
'中间风速:处于阈值区间内的风速档位'
},
fan_speed_min
:
{
type
:
DataTypes
.
STRING
(
20
),
allowNull
:
true
,
comment
:
'下限风速:低于阈值下限时的风速档位'
},
is_use
:
{
type
:
DataTypes
.
STRING
(
20
),
allowNull
:
true
,
defaultValue
:
'on'
,
comment
:
'是否启用:on启用/off停用'
},
divide_method
:
{
divide_method
:
{
type
:
DataTypes
.
STRING
(
50
),
type
:
DataTypes
.
STRING
(
50
),
allowNull
:
true
,
allowNull
:
true
,
...
...
src/main.ts
View file @
7e865780
...
@@ -19,7 +19,7 @@ async function lanuch() {
...
@@ -19,7 +19,7 @@ async function lanuch() {
/**创建http服务 */
/**创建http服务 */
httpServer
.
createServer
(
systemConfig
.
port
);
httpServer
.
createServer
(
systemConfig
.
port
);
/**启动MQTT订阅服务 */
/**启动MQTT订阅服务 */
//
await mqttSrv.startMqttClient();
await
mqttSrv
.
startMqttClient
();
/**启动定时任务 */
/**启动定时任务 */
startSchedule
();
startSchedule
();
/**启动预警工单定时任务(10分钟) */
/**启动预警工单定时任务(10分钟) */
...
...
src/routers/admin.ts
View file @
7e865780
...
@@ -553,12 +553,15 @@ async function addLinkage(req, res) {
...
@@ -553,12 +553,15 @@ async function addLinkage(req, res) {
settingMax
:
'String'
,
settingMax
:
'String'
,
settingMin
:
'String'
,
settingMin
:
'String'
,
settingMid
:
'String'
,
settingMid
:
'String'
,
fanSpeedMax
:
'String'
,
fanSpeedMid
:
'String'
,
fanSpeedMin
:
'String'
,
divideMethod
:
'String'
,
divideMethod
:
'String'
,
beginValidity
:
'Date'
,
beginValidity
:
'Date'
,
endValidity
:
'Date'
,
endValidity
:
'Date'
,
};
};
const
NotMustHaveKeys
=
[
"thresholdMax"
,
"thresholdMin"
,
"thresholdMid"
,
"settingMax"
,
"settingMin"
,
"settingMid"
,
"divideMethod"
,
"beginValidity"
,
"endValidity"
];
const
NotMustHaveKeys
=
[
"thresholdMax"
,
"thresholdMin"
,
"thresholdMid"
,
"settingMax"
,
"settingMin"
,
"settingMid"
,
"
fanSpeedMax"
,
"fanSpeedMid"
,
"fanSpeedMin"
,
"
divideMethod"
,
"beginValidity"
,
"endValidity"
];
let
{
deviceId
,
linkageType
,
thresholdMax
,
thresholdMin
,
thresholdMid
,
settingMax
,
settingMin
,
settingMid
,
divideMethod
,
beginValidity
,
endValidity
}
=
let
{
deviceId
,
linkageType
,
thresholdMax
,
thresholdMin
,
thresholdMid
,
settingMax
,
settingMin
,
settingMid
,
fanSpeedMax
,
fanSpeedMid
,
fanSpeedMin
,
divideMethod
,
beginValidity
,
endValidity
}
=
eccReqParamater
(
reqConf
,
req
.
body
,
NotMustHaveKeys
);
eccReqParamater
(
reqConf
,
req
.
body
,
NotMustHaveKeys
);
if
(
!
deviceId
||
!
linkageType
)
{
if
(
!
deviceId
||
!
linkageType
)
{
res
.
error
(
"缺少必填参数:deviceId, linkageType"
);
res
.
error
(
"缺少必填参数:deviceId, linkageType"
);
...
@@ -573,6 +576,9 @@ async function addLinkage(req, res) {
...
@@ -573,6 +576,9 @@ async function addLinkage(req, res) {
settingMax
:
settingMax
??
undefined
,
settingMax
:
settingMax
??
undefined
,
settingMin
:
settingMin
??
undefined
,
settingMin
:
settingMin
??
undefined
,
settingMid
:
settingMid
??
undefined
,
settingMid
:
settingMid
??
undefined
,
fanSpeedMax
:
fanSpeedMax
??
undefined
,
fanSpeedMid
:
fanSpeedMid
??
undefined
,
fanSpeedMin
:
fanSpeedMin
??
undefined
,
divideMethod
:
divideMethod
??
undefined
,
divideMethod
:
divideMethod
??
undefined
,
beginValidity
:
beginValidity
??
undefined
,
beginValidity
:
beginValidity
??
undefined
,
endValidity
:
endValidity
??
undefined
,
endValidity
:
endValidity
??
undefined
,
...
@@ -596,12 +602,15 @@ async function batchAddLinkage(req, res) {
...
@@ -596,12 +602,15 @@ async function batchAddLinkage(req, res) {
settingMax
:
'String'
,
settingMax
:
'String'
,
settingMin
:
'String'
,
settingMin
:
'String'
,
settingMid
:
'String'
,
settingMid
:
'String'
,
fanSpeedMax
:
'String'
,
fanSpeedMid
:
'String'
,
fanSpeedMin
:
'String'
,
divideMethod
:
'String'
,
divideMethod
:
'String'
,
beginValidity
:
'Date'
,
beginValidity
:
'Date'
,
endValidity
:
'Date'
,
endValidity
:
'Date'
,
};
};
const
NotMustHaveKeys
=
[
"thresholdMax"
,
"thresholdMin"
,
"thresholdMid"
,
"settingMax"
,
"settingMin"
,
"settingMid"
,
"divideMethod"
,
"beginValidity"
,
"endValidity"
];
const
NotMustHaveKeys
=
[
"thresholdMax"
,
"thresholdMin"
,
"thresholdMid"
,
"settingMax"
,
"settingMin"
,
"settingMid"
,
"
fanSpeedMax"
,
"fanSpeedMid"
,
"fanSpeedMin"
,
"
divideMethod"
,
"beginValidity"
,
"endValidity"
];
let
{
deviceIds
,
linkageType
,
thresholdMax
,
thresholdMin
,
thresholdMid
,
settingMax
,
settingMin
,
settingMid
,
divideMethod
,
beginValidity
,
endValidity
}
=
let
{
deviceIds
,
linkageType
,
thresholdMax
,
thresholdMin
,
thresholdMid
,
settingMax
,
settingMin
,
settingMid
,
fanSpeedMax
,
fanSpeedMid
,
fanSpeedMin
,
divideMethod
,
beginValidity
,
endValidity
}
=
eccReqParamater
(
reqConf
,
req
.
body
,
NotMustHaveKeys
);
eccReqParamater
(
reqConf
,
req
.
body
,
NotMustHaveKeys
);
if
(
!
deviceIds
||
!
Array
.
isArray
(
deviceIds
)
||
deviceIds
.
length
===
0
||
!
linkageType
)
{
if
(
!
deviceIds
||
!
Array
.
isArray
(
deviceIds
)
||
deviceIds
.
length
===
0
||
!
linkageType
)
{
res
.
error
(
"缺少必填参数:deviceIds, linkageType"
);
res
.
error
(
"缺少必填参数:deviceIds, linkageType"
);
...
@@ -616,6 +625,9 @@ async function batchAddLinkage(req, res) {
...
@@ -616,6 +625,9 @@ async function batchAddLinkage(req, res) {
settingMax
:
settingMax
??
undefined
,
settingMax
:
settingMax
??
undefined
,
settingMin
:
settingMin
??
undefined
,
settingMin
:
settingMin
??
undefined
,
settingMid
:
settingMid
??
undefined
,
settingMid
:
settingMid
??
undefined
,
fanSpeedMax
:
fanSpeedMax
??
undefined
,
fanSpeedMid
:
fanSpeedMid
??
undefined
,
fanSpeedMin
:
fanSpeedMin
??
undefined
,
divideMethod
:
divideMethod
??
undefined
,
divideMethod
:
divideMethod
??
undefined
,
beginValidity
:
beginValidity
??
undefined
,
beginValidity
:
beginValidity
??
undefined
,
endValidity
:
endValidity
??
undefined
,
endValidity
:
endValidity
??
undefined
,
...
@@ -639,12 +651,16 @@ async function editLinkage(req, res) {
...
@@ -639,12 +651,16 @@ async function editLinkage(req, res) {
settingMax
:
'String'
,
settingMax
:
'String'
,
settingMin
:
'String'
,
settingMin
:
'String'
,
settingMid
:
'String'
,
settingMid
:
'String'
,
fanSpeedMax
:
'String'
,
fanSpeedMid
:
'String'
,
fanSpeedMin
:
'String'
,
isUse
:
'String'
,
divideMethod
:
'String'
,
divideMethod
:
'String'
,
beginValidity
:
'Date'
,
beginValidity
:
'Date'
,
endValidity
:
'Date'
,
endValidity
:
'Date'
,
};
};
const
NotMustHaveKeys
=
[
"deviceId"
,
"linkageType"
,
"thresholdMax"
,
"thresholdMin"
,
"thresholdMid"
,
"settingMax"
,
"settingMin"
,
"settingMid"
,
"divideMethod"
,
"beginValidity"
,
"endValidity"
];
const
NotMustHaveKeys
=
[
"deviceId"
,
"linkageType"
,
"thresholdMax"
,
"thresholdMin"
,
"thresholdMid"
,
"settingMax"
,
"settingMin"
,
"settingMid"
,
"
fanSpeedMax"
,
"fanSpeedMid"
,
"fanSpeedMin"
,
"isUse"
,
"
divideMethod"
,
"beginValidity"
,
"endValidity"
];
let
{
id
,
deviceId
,
linkageType
,
thresholdMax
,
thresholdMin
,
thresholdMid
,
settingMax
,
settingMin
,
settingMid
,
divideMethod
,
beginValidity
,
endValidity
}
=
eccReqParamater
(
reqConf
,
req
.
body
,
NotMustHaveKeys
);
let
{
id
,
deviceId
,
linkageType
,
thresholdMax
,
thresholdMin
,
thresholdMid
,
settingMax
,
settingMin
,
settingMid
,
fanSpeedMax
,
fanSpeedMid
,
fanSpeedMin
,
isUse
,
divideMethod
,
beginValidity
,
endValidity
}
=
eccReqParamater
(
reqConf
,
req
.
body
,
NotMustHaveKeys
);
if
(
!
id
)
{
if
(
!
id
)
{
res
.
error
(
"缺少必填参数:id"
);
res
.
error
(
"缺少必填参数:id"
);
return
;
return
;
...
@@ -659,6 +675,10 @@ async function editLinkage(req, res) {
...
@@ -659,6 +675,10 @@ async function editLinkage(req, res) {
settingMax
:
settingMax
??
undefined
,
settingMax
:
settingMax
??
undefined
,
settingMin
:
settingMin
??
undefined
,
settingMin
:
settingMin
??
undefined
,
settingMid
:
settingMid
??
undefined
,
settingMid
:
settingMid
??
undefined
,
fanSpeedMax
:
fanSpeedMax
??
undefined
,
fanSpeedMid
:
fanSpeedMid
??
undefined
,
fanSpeedMin
:
fanSpeedMin
??
undefined
,
isUse
:
isUse
??
undefined
,
divideMethod
:
divideMethod
??
undefined
,
divideMethod
:
divideMethod
??
undefined
,
beginValidity
:
beginValidity
??
undefined
,
beginValidity
:
beginValidity
??
undefined
,
endValidity
:
endValidity
??
undefined
,
endValidity
:
endValidity
??
undefined
,
...
...
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