明树Git Lab
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
L
letian_backend
Project
Project
Details
Activity
Releases
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
zengfanpei
letian_backend
Commits
8efc7461
Commit
8efc7461
authored
Oct 16, 2024
by
zengfanpei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
土壤墒情设备分为两种设备分别上传数据,在大屏展示处需要合并数据方便前端展示,以土壤温湿度氮磷钾为基准,将最近的ph电导率合并上去。
parent
a52fcf71
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
300 additions
and
123 deletions
+300
-123
dev.json
config/dev.json
+4
-4
local.json
config/local.json
+14
-8
collectSMCController.js
controller/collectSMCController.js
+18
-0
statisticsController.js
controller/statisticsController.js
+50
-3
deviceCron.js
cron/deviceCron.js
+15
-81
index.js
cron/index.js
+31
-24
smcCron.js
cron/smcCron.js
+158
-0
collectAttribute.js
db/models/collectAttribute.js
+4
-0
collectDevice.js
db/models/collectDevice.js
+1
-1
collectSMC.js
db/models/collectSMC.js
+4
-1
collectSMCModule.js
module/collectSMCModule.js
+1
-1
No files found.
config/dev.json
View file @
8efc7461
...
...
@@ -5,16 +5,16 @@
"storagePath"
:
"/uploadfiles"
},
"device"
:
{
"secretKey"
:
"
EB29BBD58E06997E
"
,
"secretKey"
:
"
D2EC290246423D1B
"
,
"getDeviceList"
:
"http://open.sennor.net:8088/device/getDeviceList"
,
"getDeviceInfo"
:
"http://open.sennor.net:8088/device/getDeviceInfo"
,
"upDeviceInfo"
:
"http://open.sennor.net:8088/device/upDeviceInfo"
,
"fileBaseUrl"
:
"http://insect.sennor.net:1881/openFile/"
,
"token"
:
"
24a2232a85bd4ce7a846c460ff3b34c2
"
,
"userName"
:
"
cqwangfeng1
"
,
"password"
:
"
b5be656a7060dd3525027d6763c33ca0"
,
"token"
:
"
6d0ec1b703dd4fd7a8a4a6688ca5be29
"
,
"userName"
:
"
ZJLTNY
"
,
"password"
:
"
43ae65275c05eda28a825bfa9eaf34e0"
,
"getAllDevice"
:
"http://open.sennor.net:1881/getAllDevice"
,
"getInsectNewCollectionResult"
:
"http://open.sennor.net:1881/getInsectNewCollectionResult"
,
"uploadCameraPhoto"
:
"http://open.sennor.net:1881/uploadCameraPhoto"
,
...
...
config/local.json
View file @
8efc7461
{
"tokenEx"
:
86400
,
"dbURI"
:
""
,
"dbURI"
:
"
mongodb://root:letian2024.@119.29.111.186:27017/letian?authSource=admin
"
,
"file"
:
{
"storagePath"
:
"
public/avatar
"
"storagePath"
:
"
/mnt/vdb1/uploadfiles
"
},
"device"
:
{
"secretKey"
:
"
EB29BBD58E06997E
"
,
"secretKey"
:
"
D2EC290246423D1B
"
,
"getDeviceList"
:
"http://open.sennor.net:8088/device/getDeviceList"
,
"getDeviceInfo"
:
"http://open.sennor.net:8088/device/getDeviceInfo"
,
"upDeviceInfo"
:
"http://open.sennor.net:8088/device/upDeviceInfo"
,
"fileBaseUrl"
:
"http://insect.sennor.net:1881/openFile/"
,
"token"
:
"
24a2232a85bd4ce7a846c460ff3b34c2
"
,
"userName"
:
"
cqwangfeng1
"
,
"password"
:
"
b5be656a7060dd3525027d6763c33ca0"
,
"token"
:
"
6d0ec1b703dd4fd7a8a4a6688ca5be29
"
,
"userName"
:
"
ZJLTNY
"
,
"password"
:
"
43ae65275c05eda28a825bfa9eaf34e0"
,
"getAllDevice"
:
"http://open.sennor.net:1881/getAllDevice"
,
"getInsectNewCollectionResult"
:
"http://open.sennor.net:1881/getInsectNewCollectionResult"
,
"uploadCameraPhoto"
:
"http://open.sennor.net:1881/uploadCameraPhoto"
,
"getPreventionToInsectName"
:
"http://open.sennor.net:1881/getPreventionToInsectName"
,
"typeName"
:
{
"1"
:
"采集点"
,
"2"
:
"气象站"
,
"3"
:
"全景相机"
,
"4"
:
"细节相机"
},
"typeCount"
:
{
"1"
:
100
,
"2"
:
100
,
"3"
:
100
,
"4"
:
100
}
},
"cron"
:
{
"getDeviceList"
:
false
,
"getAllDevice"
:
false
,
"collectDeviceInfo"
:
fals
e
"collectDeviceInfo"
:
tru
e
}
}
\ No newline at end of file
controller/collectSMCController.js
View file @
8efc7461
...
...
@@ -39,11 +39,29 @@ async function list(req, res, next) {
search
.
deviceNumber
=
{
$in
:
devNums
}
}
}
search
.
deviceHQType
=
req
.
body
.
deviceHQType
||
1
;
let
page
=
req
.
body
.
page
||
1
;
let
pageSize
=
req
.
body
.
pageSize
||
10
;
let
skip
=
(
page
-
1
)
*
pageSize
;
let
count
=
await
collectSMCModule
.
count
(
search
);
let
data
=
await
collectSMCModule
.
findList
(
search
,
{
skip
,
limit
:
pageSize
});
if
(
search
.
deviceHQType
==
1
)
{
// 这段是为了大屏 把 ph电导率 和 温湿度氮磷钾 合并起来
search
.
deviceHQType
=
2
;
delete
search
.
deviceNumber
;
let
phData
=
await
collectSMCModule
.
findList
(
search
,
{
skip
,
limit
:
pageSize
});
let
dataArr
=
[];
data
=
_
.
reverse
(
data
);
phData
=
_
.
reverse
(
phData
);
for
(
let
index
=
0
;
index
<
data
.
length
;
index
++
)
{
const
element
=
data
[
index
];
let
o
=
_
.
pick
(
phData
[
index
]
||
{},
[
'soilConductivity'
,
'soilConductivityUnit'
,
'soilPH'
,
'soilPHUnit'
])
dataArr
.
push
({
...
o
,
...
element
,
})
}
data
=
_
.
reverse
(
dataArr
);
}
res
.
sendData
({
list
:
data
,
count
});
}
catch
(
error
)
{
next
(
error
);
...
...
controller/statisticsController.js
View file @
8efc7461
...
...
@@ -35,10 +35,12 @@ async function getSMCChangeTrend(req, res, next) {
}
}
console
.
log
(
JSON
.
stringify
(
search
))
// 1. 处理土壤温湿度氮磷钾
let
aggr
=
[
{
$match
:
{
...
search
...
search
,
deviceHQType
:
1
}
},
{
...
...
@@ -49,14 +51,59 @@ async function getSMCChangeTrend(req, res, next) {
nitrogen
:
{
$avg
:
"$nitrogen"
},
phosphorus
:
{
$avg
:
"$phosphorus"
},
potassium
:
{
$avg
:
"$potassium"
},
soilPH
:
{
$avg
:
"$soilPH"
},
//
soilPH: { $avg: "$soilPH" },
}
},
{
$sort
:
{
_id
:
1
}
}
];
let
ret
=
await
DB
.
CollectSMC
.
aggregate
(
aggr
);
res
.
sendData
(
ret
);
// 2. 处理电导率ph
delete
search
.
deviceNumber
;
let
aggr2
=
[
{
$match
:
{
...
search
,
deviceHQType
:
2
}
},
{
$group
:
{
_id
:
{
$dateToString
:
{
format
:
"%Y-%m-%d"
,
date
:
"$time"
}
},
// 将时间戳转换为日期字符串
// soilTemperature: { $avg: "$soilTemperature" },
// soilMoisture: { $avg: "$soilMoisture" },
// nitrogen: { $avg: "$nitrogen" },
// phosphorus: { $avg: "$phosphorus" },
// potassium: { $avg: "$potassium" },
soilPH
:
{
$avg
:
"$soilPH"
},
soilConductivity
:
{
$avg
:
"$soilConductivity"
},
}
},
{
$sort
:
{
_id
:
1
}
}
];
let
ret2
=
await
DB
.
CollectSMC
.
aggregate
(
aggr2
);
// 3. 处理数据合并
let
phMap
=
{};
for
(
let
index
=
0
;
index
<
ret2
.
length
;
index
++
)
{
const
element
=
ret2
[
index
];
phMap
[
element
.
_id
]
=
element
;
}
let
returnData
=
[];
for
(
let
index
=
0
;
index
<
ret
.
length
;
index
++
)
{
let
element
=
ret
[
index
];
if
(
phMap
[
element
.
_id
])
{
element
=
{
...
element
,
...
phMap
[
element
.
_id
]
}
}
returnData
.
push
(
element
);
}
res
.
sendData
(
returnData
);
}
catch
(
error
)
{
next
(
error
);
}
...
...
cron/deviceCron.js
View file @
8efc7461
...
...
@@ -53,82 +53,7 @@ async function getAllDevice() {
}
/* -------------------------------------------有诸多不确定因素,暂时分开,后续 请求日志需要分别按照不同设备种类区分类型------------------------------------------------------------------ */
/**
* 采集上述设备 1 的信息
*/
async
function
collectDeviceInfo1
({
deviceHQType
})
{
if
(
!
deviceHQType
)
{
return
;
}
const
url
=
sysConfig
.
device
.
getDeviceInfo
;
const
secretKey
=
sysConfig
.
device
.
secretKey
;
// 查询有效状态、类型的设备信息
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
deviceHQType
||
1
,
deviceHQState
:
1
,
deviceNumber
:
{
$exists
:
true
}
},
[
'deviceNumber'
,
'deviceHQType'
,
'name'
]);
for
(
let
index
=
0
;
index
<
devices
.
length
;
index
++
)
{
const
dev
=
devices
[
index
];
const
result
=
await
httpRequest
({
url
,
method
:
"GET"
,
params
:
{
secretKey
,
deviceNumber
:
dev
.
deviceNumber
}
});
if
(
result
&&
result
.
data
&&
result
.
data
.
state
==
"success"
)
{
let
colInfo
=
result
.
data
.
data
;
if
(
colInfo
&&
colInfo
.
deviceNumber
)
{
// 1. 处理 type 和 data
let
handleData
=
await
handleCJData
(
colInfo
);
let
obj
=
{
...
colInfo
,
...
handleData
};
obj
.
name
=
obj
.
name
||
dev
.
name
;
console
.
log
(
obj
,
"=========================="
)
// 2. 入库
await
collectSMCModule
.
insertHQData
(
obj
);
// 3. 处理阈值报警通知
handleDeviceThreshold
(
obj
);
// 4. 处理设备在线状态
handleDeviceOnLine
({
deviceNumber
:
obj
.
deviceNumber
,
online
:
obj
.
onLineState
});
//onLineState 1在线0离线
}
else
{
//出错
}
}
}
}
/**
* 采集上述设备 2 的信息
*/
async
function
collectDeviceInfo2
({
deviceHQType
})
{
const
url
=
sysConfig
.
device
.
getDeviceInfo
;
const
secretKey
=
sysConfig
.
device
.
secretKey
;
// 查询有效状态、类型的设备信息
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
deviceHQType
||
2
,
deviceHQState
:
1
,
deviceNumber
:
{
$exists
:
true
}
},
[
'deviceNumber'
,
'deviceHQType'
,
'name'
]);
for
(
let
index
=
0
;
index
<
devices
.
length
;
index
++
)
{
const
dev
=
devices
[
index
];
const
result
=
await
httpRequest
({
url
,
method
:
"GET"
,
params
:
{
secretKey
,
deviceNumber
:
dev
.
deviceNumber
}
});
if
(
result
&&
result
.
data
&&
result
.
data
.
state
==
"success"
)
{
let
colInfo
=
result
.
data
.
data
;
if
(
colInfo
&&
colInfo
.
deviceNumber
)
{
// 1. 处理 type 和 data
let
handleData
=
await
handleCJData
(
colInfo
);
let
obj
=
{
...
colInfo
,
...
handleData
};
obj
.
name
=
obj
.
name
||
dev
.
name
;
await
collectSMCModule
.
insertHQData
(
obj
);
// 处理设备在线状态
}
else
{
//出错
}
}
}
}
/**
* 采集上述设备 3 的信息
*/
...
...
@@ -219,10 +144,10 @@ async function collectDeviceInfo4({ deviceHQType }) {
/**-------------数据处理---------------- */
// colInfo是一个硬件设备的一条信息
async
function
handleCJData
(
colInfo
)
{
let
handleData
=
{};
async
function
handleCJData
(
colInfo
,
deviceHQType
)
{
let
handleData
=
{}
,
attrExistMap
=
{}
;
//1. 先获取到attr配置
let
attrs
=
await
DB
.
CollectAttribute
.
find
({
del
:
0
,
enable
:
true
});
let
attrs
=
await
DB
.
CollectAttribute
.
find
({
del
:
0
,
enable
:
true
,
deviceHQType
});
let
types
=
colInfo
.
type
.
split
(
'/'
);
let
data
=
colInfo
.
data
.
split
(
'|'
);
for
(
let
i
=
0
;
i
<
types
.
length
;
i
++
)
{
...
...
@@ -234,12 +159,23 @@ async function handleCJData(colInfo) {
handleData
[
attr
.
dbKey
]
=
data
[
i
].
trim
();
}
else
{
const
dataArr
=
data
[
i
].
trim
().
split
(
' '
);
handleData
[
attr
.
dbKey
]
=
Number
(
String
(
dataArr
[
0
]).
trim
());
if
(
attrExistMap
[
attr
.
dbKey
])
{
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
=
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
||
[];
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
push
(
Number
(
String
(
dataArr
[
0
]).
trim
()));
}
else
{
handleData
[
attr
.
dbKey
]
=
Number
(
String
(
dataArr
[
0
]).
trim
());
}
handleData
[
`
${
attr
.
dbKey
}
Unit`
]
=
String
(
dataArr
[
1
]).
trim
();
}
}
}
}
for
(
let
index
=
0
;
index
<
attrs
.
length
;
index
++
)
{
const
attr
=
attrs
[
index
];
if
(
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
&&
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
length
)
{
handleData
[
attr
.
dbKey
]
=
(
_
.
sum
(
handleData
[
`
${
attr
.
dbKey
}
Arr`
])
/
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
length
).
toFixed
(
2
)
}
}
return
handleData
;
}
...
...
@@ -300,8 +236,6 @@ async function handleDeviceThreshold(obj) {
module
.
exports
=
{
getDeviceList
,
getAllDevice
,
collectDeviceInfo1
,
collectDeviceInfo2
,
collectDeviceInfo3
,
collectDeviceInfo4
,
}
\ No newline at end of file
cron/index.js
View file @
8efc7461
...
...
@@ -2,6 +2,8 @@ const nodeCron = require('node-cron');
const
config
=
require
(
'../config'
);
const
deviceCron
=
require
(
'./deviceCron'
);
//土壤
const
smcCron
=
require
(
'./smcCron'
);
/**
根据config cron 配置 定时处理
...
...
@@ -16,11 +18,13 @@ const deviceCron = require('./deviceCron');
# * * * * * *
*/
const
cron
=
()
=>
{
/*-----------------------------采集设备信息-------------------------------------*/
// 1 土壤温湿度、土壤氮磷钾, 2 土壤ph、土壤电导率, 3 气象站
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
getDeviceList
)
{
console
.
log
(
"getDeviceList:"
,
new
Date
());
// 每天10点30分 处理 1 30 10 * * *
new
nodeCron
.
schedule
(
'1 30 10 * * *'
,
async
()
=>
{
// new nodeCron.schedule('1 30 10 * * *', async () => {
new
nodeCron
.
schedule
(
'1 * * * * *'
,
async
()
=>
{
await
deviceCron
.
getDeviceList
();
},
{
timezone
:
"Asia/Shanghai"
});
}
...
...
@@ -29,30 +33,33 @@ const cron = () => {
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
getAllDevice
)
{
console
.
log
(
"getAllDevice:"
,
new
Date
());
new
nodeCron
.
schedule
(
'1 30 10 * * *'
,
async
()
=>
{
// new nodeCron.schedule('1 30 10 * * *', async () => {
new
nodeCron
.
schedule
(
'1 * * * * *'
,
async
()
=>
{
await
deviceCron
.
getAllDevice
();
},
{
timezone
:
"Asia/Shanghai"
});
}
/*-----------------------------采集
设备
信息-------------------------------------*/
/*-----------------------------采集
数据
信息-------------------------------------*/
// 获取设备上述设备 1 采集信息 以数据库表里面的设备为准备
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// console.log("collectDeviceInfo1:", new Date());
// // 每10分钟
// new nodeCron.schedule('0 */3 * * * *', async () => {
// await deviceCron.collectDeviceInfo1({ deviceHQType: 1 });
// }, { timezone: "Asia/Shanghai" });
// }
// // 获取设备上述设备 2 采集信息
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// console.log("collectDeviceInfo2:", new Date());
// 土壤温湿度、氮磷钾 deviceHQType 1
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
collectDeviceInfo
)
{
console
.
log
(
"collectDeviceInfo1:"
,
new
Date
());
// 每10分钟
new
nodeCron
.
schedule
(
'0 */3 * * * *'
,
async
()
=>
{
await
smcCron
.
collectDeviceInfo1
({
deviceHQType
:
1
});
},
{
timezone
:
"Asia/Shanghai"
});
}
// 土壤ph土壤电导率 deviceHQType 2
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
collectDeviceInfo
)
{
console
.
log
(
"collectDeviceInfo2:"
,
new
Date
());
new
nodeCron
.
schedule
(
'0 */3 * * * *'
,
async
()
=>
{
await
smcCron
.
collectDeviceInfo1
({
deviceHQType
:
2
});
},
{
timezone
:
"Asia/Shanghai"
});
}
// new nodeCron.schedule('* */3 * * * *', async () => {
// await deviceCron.collectDeviceInfo2({ deviceHQType: 2 });
// }, { timezone: "Asia/Shanghai" });
// }
// // 获取设备上述设备 3 采集信息
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// console.log("collectDeviceInfo3:", new Date());
...
...
@@ -62,13 +69,13 @@ const cron = () => {
// }, { timezone: "Asia/Shanghai" });
// }
// // 获取设备上述设备 4 采集信息
if
(
sysConfig
&&
sysConfig
.
cron
&&
sysConfig
.
cron
.
collectDeviceInfo
)
{
console
.
log
(
"collectDeviceInfo4:"
,
new
Date
());
//
if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
//
console.log("collectDeviceInfo4:", new Date());
new
nodeCron
.
schedule
(
'* */3 * * * *'
,
async
()
=>
{
await
deviceCron
.
collectDeviceInfo4
({
deviceHQType
:
4
});
},
{
timezone
:
"Asia/Shanghai"
});
}
//
new nodeCron.schedule('* */3 * * * *', async () => {
//
await deviceCron.collectDeviceInfo4({ deviceHQType: 4 });
//
}, { timezone: "Asia/Shanghai" });
//
}
}
...
...
cron/smcCron.js
0 → 100644
View file @
8efc7461
const
httpRequest
=
require
(
'../utils/httpRequest'
);
const
deviceModule
=
require
(
'../module/deviceModule'
);
// 土壤
const
collectSMCModule
=
require
(
'../module/collectSMCModule'
);
const
_
=
require
(
'lodash'
);
/* -------------------------------------------有诸多不确定因素,暂时分开,后续 请求日志需要分别按照不同设备种类区分类型------------------------------------------------------------------ */
/**
* 采集上述设备 1 的信息
*/
async
function
collectDeviceInfo1
({
deviceHQType
})
{
if
(
!
deviceHQType
)
{
return
;
}
const
url
=
sysConfig
.
device
.
getDeviceInfo
;
const
secretKey
=
sysConfig
.
device
.
secretKey
;
// 查询有效状态、类型的设备信息
const
devices
=
await
deviceModule
.
findAll
({
deviceHQType
:
deviceHQType
,
deviceHQState
:
1
,
deviceNumber
:
{
$exists
:
true
}
},
[
'deviceNumber'
,
'deviceHQType'
,
'name'
]);
for
(
let
index
=
0
;
index
<
devices
.
length
;
index
++
)
{
const
dev
=
devices
[
index
];
const
result
=
await
httpRequest
({
url
,
method
:
"GET"
,
params
:
{
secretKey
,
deviceNumber
:
dev
.
deviceNumber
}
});
if
(
result
&&
result
.
data
&&
result
.
data
.
state
==
"success"
)
{
let
colInfo
=
result
.
data
.
data
;
if
(
colInfo
&&
colInfo
.
deviceNumber
)
{
// 1. 处理 type 和 data
let
handleData
=
await
handleCJData
(
colInfo
,
deviceHQType
);
let
obj
=
{
...
colInfo
,
...
handleData
,
deviceHQType
};
obj
.
name
=
dev
.
name
||
obj
.
name
;
console
.
log
(
obj
,
"=========================="
)
// 2. 入库
await
collectSMCModule
.
insertHQData
(
obj
);
// 3. 处理阈值报警通知
// handleDeviceThreshold(obj);
// 4. 处理设备在线状态
handleDeviceOnLine
({
deviceNumber
:
obj
.
deviceNumber
,
online
:
obj
.
onLineState
});
//onLineState 1在线0离线
}
else
{
//出错
// handleDeviceOnLine({deviceNumber: obj.deviceNumber, online: 0}); //onLineState 1在线0离线
}
}
else
{
handleDeviceOnLine
({
deviceNumber
:
dev
.
deviceNumber
,
online
:
0
});
//onLineState 1在线0离线
}
}
}
/**-------------数据处理---------------- */
// colInfo是一个硬件设备的一条信息
async
function
handleCJData
(
colInfo
,
deviceHQType
)
{
let
handleData
=
{},
attrExistMap
=
{};
//1. 先获取到attr配置
let
attrs
=
await
DB
.
CollectAttribute
.
find
({
del
:
0
,
enable
:
true
,
deviceHQType
});
console
.
log
(
attrs
)
let
types
=
colInfo
.
type
.
split
(
'/'
);
let
data
=
colInfo
.
data
.
split
(
'|'
);
for
(
let
i
=
0
;
i
<
types
.
length
;
i
++
)
{
const
col
=
types
[
i
];
for
(
let
j
=
0
;
j
<
attrs
.
length
;
j
++
)
{
const
attr
=
attrs
[
j
];
if
(
col
.
includes
(
attr
.
deviceKey
))
{
if
([
'errorCode'
,
'version'
].
includes
(
attr
.
dbKey
))
{
handleData
[
attr
.
dbKey
]
=
data
[
i
].
trim
();
}
else
{
const
dataArr
=
data
[
i
].
trim
().
split
(
' '
);
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
=
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
||
[];
if
(
attrExistMap
[
attr
.
dbKey
])
{
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
push
(
Number
(
String
(
dataArr
[
0
]).
trim
()));
}
else
{
handleData
[
attr
.
dbKey
]
=
Number
(
String
(
dataArr
[
0
]).
trim
());
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
push
(
Number
(
String
(
dataArr
[
0
]).
trim
()));
attrExistMap
[
attr
.
dbKey
]
=
1
;
}
handleData
[
`
${
attr
.
dbKey
}
Unit`
]
=
String
(
dataArr
[
1
]).
trim
();
}
}
}
}
console
.
log
(
handleData
,
"======1"
)
for
(
let
index
=
0
;
index
<
attrs
.
length
;
index
++
)
{
const
attr
=
attrs
[
index
];
if
(
handleData
[
`
${
attr
.
dbKey
}
Arr`
]
&&
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
length
)
{
handleData
[
attr
.
dbKey
]
=
(
_
.
sum
(
handleData
[
`
${
attr
.
dbKey
}
Arr`
])
/
handleData
[
`
${
attr
.
dbKey
}
Arr`
].
length
).
toFixed
(
2
)
}
}
return
handleData
;
}
async
function
handleDeviceOnLine
({
deviceNumber
,
online
})
{
// 虫情 online = 0;//在线状态 0false/1true
// 土壤 onLineState 1在线0离线
if
(
!
deviceNumber
)
{
return
;
}
//该方式待定
let
key
=
`device_online`
;
if
(
online
==
0
)
{
await
ioRedis
.
hdel
(
key
,
deviceNumber
);
}
else
{
let
obj
=
{};
obj
[
deviceNumber
]
=
1
;
await
ioRedis
.
hset
(
key
,
obj
)
}
}
async
function
handleDeviceThreshold
(
obj
)
{
let
ths
=
await
DB
.
CollectThreshold
.
find
({
del
:
0
,
enable
:
true
,
deviceNumber
:
obj
.
deviceNumber
}).
populate
({
path
:
"attrId"
}).
lean
().
exec
();
let
exceeds
=
[];
for
(
let
i
=
0
;
i
<
ths
.
length
;
i
++
)
{
const
element
=
ths
[
i
];
// console.log(element, "====", obj[element.dbKey], _.isNumber(obj[element.dbKey]), _.gt(obj[element.dbKey], element.max), _.isNumber(element.max))
if
(
_
.
isNumber
(
obj
[
element
.
dbKey
]))
{
if
(
_
.
isNumber
(
element
.
max
)
&&
_
.
gt
(
obj
[
element
.
dbKey
],
element
.
max
))
{
// 采集值 > 最大设置值
// exceeds.push({...element, collectValue: obj[element.dbKey], deviceNumber: obj.deviceNumber});
exceeds
.
push
(
`设备
${
obj
.
deviceNumber
}
, 采集值:
${
obj
[
element
.
dbKey
]}
, 最大阈值:
${
element
.
max
}
`
);
}
if
(
_
.
isNumber
(
element
.
min
)
&&
_
.
lt
(
obj
[
element
.
dbKey
],
element
.
min
))
{
// exceeds.push({...element, collectValue: obj[element.dbKey], deviceNumber: obj.deviceNumber});
exceeds
.
push
(
`设备
${
obj
.
deviceNumber
}
, 采集值:
${
obj
[
element
.
dbKey
]}
, 最小阈值:
${
element
.
min
}
`
);
}
}
}
console
.
log
(
exceeds
);
// 处理通知模板
if
(
exceeds
.
length
)
{
await
DB
.
Notice
.
create
({
sendUser
:
"66d6c4099f8480c6db53ce13"
,
receiveUser
:
"66d6c4099f8480c6db53ce13"
,
content
:
exceeds
.
join
(
"
\
\n
"
),
});
}
}
/**-------------数据处理---------------- */
// collectDeviceInfo1({deviceHQType:1});
// getDeviceList()
module
.
exports
=
{
collectDeviceInfo1
,
}
\ No newline at end of file
db/models/collectAttribute.js
View file @
8efc7461
...
...
@@ -20,6 +20,10 @@ const collectAttributeSchema = new Schema({
type
:
String
,
comment
:
"名称 如: 湿度"
},
deviceHQType
:
{
type
:
Number
,
comment
:
"用来获取数据的设备类型-(接口文档): 1.土壤温湿度、土壤氮磷钾, 2土壤ph、土壤电导率, 3 气象站, 4虫情"
,
},
enable
:
{
...
...
db/models/collectDevice.js
View file @
8efc7461
...
...
@@ -101,7 +101,7 @@ const deviceSchema = new Schema({
},
deviceDPType
:
{
type
:
Number
,
comment
:
"用来大屏展示的数据类型-(大屏图): 1 采集点 2 气象站 3 全景相机 4 细节相机"
comment
:
"用来大屏展示的数据类型-(大屏图): 1 采集点 2 气象站 3 全景相机 4 细节相机"
// 显示数据是写死的 假的
},
...
...
db/models/collectSMC.js
View file @
8efc7461
...
...
@@ -110,7 +110,10 @@ const soilMoistureContentSchema = new Schema({
comment
:
"版本号"
,
},
deviceHQType
:
{
type
:
Number
,
comment
:
"用来获取数据的设备类型-(接口文档): 1.土壤温湿度氮磷钾, 2土壤ph电导率, 3 气象站, 4虫情"
,
},
creatTime
:
{
...
...
module/collectSMCModule.js
View file @
8efc7461
...
...
@@ -18,7 +18,7 @@ async function findList(search, options) {
if
(
!
(
_
.
isNumber
(
options
.
skip
)
&&
_
.
isNumber
(
options
.
limit
)))
{
return
[];
}
return
DB
.
CollectSMC
.
find
(
search
).
skip
(
options
.
skip
).
limit
(
options
.
limit
).
sort
({
time
:
-
1
});
return
DB
.
CollectSMC
.
find
(
search
).
skip
(
options
.
skip
).
limit
(
options
.
limit
).
sort
({
time
:
-
1
})
.
lean
().
exec
()
;
}
// 总量
...
...
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