明树Git Lab

Commit 8efc7461 authored by zengfanpei's avatar zengfanpei

土壤墒情设备分为两种设备分别上传数据,在大屏展示处需要合并数据方便前端展示,以土壤温湿度氮磷钾为基准,将最近的ph电导率合并上去。

parent a52fcf71
...@@ -5,16 +5,16 @@ ...@@ -5,16 +5,16 @@
"storagePath": "/uploadfiles" "storagePath": "/uploadfiles"
}, },
"device": { "device": {
"secretKey": "EB29BBD58E06997E", "secretKey": "D2EC290246423D1B",
"getDeviceList": "http://open.sennor.net:8088/device/getDeviceList", "getDeviceList": "http://open.sennor.net:8088/device/getDeviceList",
"getDeviceInfo": "http://open.sennor.net:8088/device/getDeviceInfo", "getDeviceInfo": "http://open.sennor.net:8088/device/getDeviceInfo",
"upDeviceInfo": "http://open.sennor.net:8088/device/upDeviceInfo", "upDeviceInfo": "http://open.sennor.net:8088/device/upDeviceInfo",
"fileBaseUrl": "http://insect.sennor.net:1881/openFile/", "fileBaseUrl": "http://insect.sennor.net:1881/openFile/",
"token": "24a2232a85bd4ce7a846c460ff3b34c2", "token": "6d0ec1b703dd4fd7a8a4a6688ca5be29",
"userName": "cqwangfeng1", "userName": "ZJLTNY",
"password": "b5be656a7060dd3525027d6763c33ca0", "password": "43ae65275c05eda28a825bfa9eaf34e0",
"getAllDevice": "http://open.sennor.net:1881/getAllDevice", "getAllDevice": "http://open.sennor.net:1881/getAllDevice",
"getInsectNewCollectionResult": "http://open.sennor.net:1881/getInsectNewCollectionResult", "getInsectNewCollectionResult": "http://open.sennor.net:1881/getInsectNewCollectionResult",
"uploadCameraPhoto": "http://open.sennor.net:1881/uploadCameraPhoto", "uploadCameraPhoto": "http://open.sennor.net:1881/uploadCameraPhoto",
......
{ {
"tokenEx": 86400, "tokenEx": 86400,
"dbURI": "", "dbURI": "mongodb://root:letian2024.@119.29.111.186:27017/letian?authSource=admin",
"file": { "file": {
"storagePath": "public/avatar" "storagePath": "/mnt/vdb1/uploadfiles"
}, },
"device": { "device": {
"secretKey": "EB29BBD58E06997E", "secretKey": "D2EC290246423D1B",
"getDeviceList": "http://open.sennor.net:8088/device/getDeviceList", "getDeviceList": "http://open.sennor.net:8088/device/getDeviceList",
"getDeviceInfo": "http://open.sennor.net:8088/device/getDeviceInfo", "getDeviceInfo": "http://open.sennor.net:8088/device/getDeviceInfo",
"upDeviceInfo": "http://open.sennor.net:8088/device/upDeviceInfo", "upDeviceInfo": "http://open.sennor.net:8088/device/upDeviceInfo",
"fileBaseUrl": "http://insect.sennor.net:1881/openFile/", "fileBaseUrl": "http://insect.sennor.net:1881/openFile/",
"token": "24a2232a85bd4ce7a846c460ff3b34c2", "token": "6d0ec1b703dd4fd7a8a4a6688ca5be29",
"userName": "cqwangfeng1", "userName": "ZJLTNY",
"password": "b5be656a7060dd3525027d6763c33ca0", "password": "43ae65275c05eda28a825bfa9eaf34e0",
"getAllDevice": "http://open.sennor.net:1881/getAllDevice", "getAllDevice": "http://open.sennor.net:1881/getAllDevice",
"getInsectNewCollectionResult": "http://open.sennor.net:1881/getInsectNewCollectionResult", "getInsectNewCollectionResult": "http://open.sennor.net:1881/getInsectNewCollectionResult",
"uploadCameraPhoto": "http://open.sennor.net:1881/uploadCameraPhoto", "uploadCameraPhoto": "http://open.sennor.net:1881/uploadCameraPhoto",
...@@ -25,11 +25,17 @@ ...@@ -25,11 +25,17 @@
"2": "气象站", "2": "气象站",
"3": "全景相机", "3": "全景相机",
"4": "细节相机" "4": "细节相机"
},
"typeCount": {
"1": 100,
"2": 100,
"3": 100,
"4": 100
} }
}, },
"cron": { "cron": {
"getDeviceList": false, "getDeviceList": false,
"getAllDevice": false, "getAllDevice": false,
"collectDeviceInfo": false "collectDeviceInfo": true
} }
} }
\ No newline at end of file
...@@ -39,11 +39,29 @@ async function list(req, res, next) { ...@@ -39,11 +39,29 @@ async function list(req, res, next) {
search.deviceNumber = {$in: devNums} search.deviceNumber = {$in: devNums}
} }
} }
search.deviceHQType = req.body.deviceHQType || 1;
let page = req.body.page || 1; let page = req.body.page || 1;
let pageSize = req.body.pageSize || 10; let pageSize = req.body.pageSize || 10;
let skip = (page - 1) * pageSize; let skip = (page - 1) * pageSize;
let count = await collectSMCModule.count(search); let count = await collectSMCModule.count(search);
let data = await collectSMCModule.findList(search, { skip, limit: pageSize }); 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 }); res.sendData({ list: data, count });
} catch (error) { } catch (error) {
next(error); next(error);
......
...@@ -35,10 +35,12 @@ async function getSMCChangeTrend(req, res, next) { ...@@ -35,10 +35,12 @@ async function getSMCChangeTrend(req, res, next) {
} }
} }
console.log(JSON.stringify(search)) console.log(JSON.stringify(search))
// 1. 处理土壤温湿度氮磷钾
let aggr = [ let aggr = [
{ {
$match: { $match: {
...search ...search,
deviceHQType: 1
} }
}, },
{ {
...@@ -49,14 +51,59 @@ async function getSMCChangeTrend(req, res, next) { ...@@ -49,14 +51,59 @@ async function getSMCChangeTrend(req, res, next) {
nitrogen: { $avg: "$nitrogen" }, nitrogen: { $avg: "$nitrogen" },
phosphorus: { $avg: "$phosphorus" }, phosphorus: { $avg: "$phosphorus" },
potassium: { $avg: "$potassium" }, potassium: { $avg: "$potassium" },
soilPH: { $avg: "$soilPH" }, // soilPH: { $avg: "$soilPH" },
} }
}, },
{ $sort: { _id: 1 } } { $sort: { _id: 1 } }
]; ];
let ret = await DB.CollectSMC.aggregate(aggr); 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) { } catch (error) {
next(error); next(error);
} }
......
...@@ -53,82 +53,7 @@ async function getAllDevice() { ...@@ -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 的信息 * 采集上述设备 3 的信息
*/ */
...@@ -219,10 +144,10 @@ async function collectDeviceInfo4({ deviceHQType }) { ...@@ -219,10 +144,10 @@ async function collectDeviceInfo4({ deviceHQType }) {
/**-------------数据处理---------------- */ /**-------------数据处理---------------- */
// colInfo是一个硬件设备的一条信息 // colInfo是一个硬件设备的一条信息
async function handleCJData(colInfo) { async function handleCJData(colInfo, deviceHQType) {
let handleData = {}; let handleData = {}, attrExistMap = {};
//1. 先获取到attr配置 //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 types = colInfo.type.split('/');
let data = colInfo.data.split('|'); let data = colInfo.data.split('|');
for (let i = 0; i < types.length; i++) { for (let i = 0; i < types.length; i++) {
...@@ -234,12 +159,23 @@ async function handleCJData(colInfo) { ...@@ -234,12 +159,23 @@ async function handleCJData(colInfo) {
handleData[attr.dbKey] = data[i].trim(); handleData[attr.dbKey] = data[i].trim();
} else { } else {
const dataArr = data[i].trim().split(' '); const dataArr = data[i].trim().split(' ');
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] = Number(String(dataArr[0]).trim());
}
handleData[`${attr.dbKey}Unit`] = String(dataArr[1]).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; return handleData;
} }
...@@ -300,8 +236,6 @@ async function handleDeviceThreshold(obj) { ...@@ -300,8 +236,6 @@ async function handleDeviceThreshold(obj) {
module.exports = { module.exports = {
getDeviceList, getDeviceList,
getAllDevice, getAllDevice,
collectDeviceInfo1,
collectDeviceInfo2,
collectDeviceInfo3, collectDeviceInfo3,
collectDeviceInfo4, collectDeviceInfo4,
} }
\ No newline at end of file
...@@ -2,6 +2,8 @@ const nodeCron = require('node-cron'); ...@@ -2,6 +2,8 @@ const nodeCron = require('node-cron');
const config = require('../config'); const config = require('../config');
const deviceCron = require('./deviceCron'); const deviceCron = require('./deviceCron');
//土壤
const smcCron = require('./smcCron');
/** /**
根据config cron 配置 定时处理 根据config cron 配置 定时处理
...@@ -16,11 +18,13 @@ const deviceCron = require('./deviceCron'); ...@@ -16,11 +18,13 @@ const deviceCron = require('./deviceCron');
# * * * * * * # * * * * * *
*/ */
const cron = () => { const cron = () => {
/*-----------------------------采集设备信息-------------------------------------*/
// 1 土壤温湿度、土壤氮磷钾, 2 土壤ph、土壤电导率, 3 气象站 // 1 土壤温湿度、土壤氮磷钾, 2 土壤ph、土壤电导率, 3 气象站
if (sysConfig && sysConfig.cron && sysConfig.cron.getDeviceList) { if (sysConfig && sysConfig.cron && sysConfig.cron.getDeviceList) {
console.log("getDeviceList:", new Date()); console.log("getDeviceList:", new Date());
// 每天10点30分 处理 1 30 10 * * * // 每天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(); await deviceCron.getDeviceList();
}, { timezone: "Asia/Shanghai" }); }, { timezone: "Asia/Shanghai" });
} }
...@@ -29,30 +33,33 @@ const cron = () => { ...@@ -29,30 +33,33 @@ const cron = () => {
if (sysConfig && sysConfig.cron && sysConfig.cron.getAllDevice) { if (sysConfig && sysConfig.cron && sysConfig.cron.getAllDevice) {
console.log("getAllDevice:", new Date()); 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(); await deviceCron.getAllDevice();
}, { timezone: "Asia/Shanghai" }); }, { timezone: "Asia/Shanghai" });
} }
/*-----------------------------采集设备信息-------------------------------------*/ /*-----------------------------采集数据信息-------------------------------------*/
// 获取设备上述设备 1 采集信息 以数据库表里面的设备为准备 // 土壤温湿度、氮磷钾 deviceHQType 1
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) { if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// console.log("collectDeviceInfo1:", new Date()); console.log("collectDeviceInfo1:", new Date());
// // 每10分钟 // 每10分钟
// new nodeCron.schedule('0 */3 * * * *', async () => { new nodeCron.schedule('0 */3 * * * *', async () => {
// await deviceCron.collectDeviceInfo1({ deviceHQType: 1 }); await smcCron.collectDeviceInfo1({ deviceHQType: 1 });
// }, { timezone: "Asia/Shanghai" }); }, { timezone: "Asia/Shanghai" });
// } }
// // 获取设备上述设备 2 采集信息
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) { // 土壤ph土壤电导率 deviceHQType 2
// console.log("collectDeviceInfo2:", new Date()); 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 采集信息 // // 获取设备上述设备 3 采集信息
// if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) { // if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
// console.log("collectDeviceInfo3:", new Date()); // console.log("collectDeviceInfo3:", new Date());
...@@ -62,13 +69,13 @@ const cron = () => { ...@@ -62,13 +69,13 @@ const cron = () => {
// }, { timezone: "Asia/Shanghai" }); // }, { timezone: "Asia/Shanghai" });
// } // }
// // 获取设备上述设备 4 采集信息 // // 获取设备上述设备 4 采集信息
if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) { // if (sysConfig && sysConfig.cron && sysConfig.cron.collectDeviceInfo) {
console.log("collectDeviceInfo4:", new Date()); // console.log("collectDeviceInfo4:", new Date());
new nodeCron.schedule('* */3 * * * *', async () => { // new nodeCron.schedule('* */3 * * * *', async () => {
await deviceCron.collectDeviceInfo4({ deviceHQType: 4 }); // await deviceCron.collectDeviceInfo4({ deviceHQType: 4 });
}, { timezone: "Asia/Shanghai" }); // }, { timezone: "Asia/Shanghai" });
} // }
} }
......
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
...@@ -20,6 +20,10 @@ const collectAttributeSchema = new Schema({ ...@@ -20,6 +20,10 @@ const collectAttributeSchema = new Schema({
type: String, type: String,
comment: "名称 如: 湿度" comment: "名称 如: 湿度"
}, },
deviceHQType: {
type: Number,
comment: "用来获取数据的设备类型-(接口文档): 1.土壤温湿度、土壤氮磷钾, 2土壤ph、土壤电导率, 3 气象站, 4虫情",
},
enable: { enable: {
......
...@@ -101,7 +101,7 @@ const deviceSchema = new Schema({ ...@@ -101,7 +101,7 @@ const deviceSchema = new Schema({
}, },
deviceDPType: { deviceDPType: {
type: Number, type: Number,
comment: "用来大屏展示的数据类型-(大屏图): 1 采集点 2 气象站 3 全景相机 4 细节相机" comment: "用来大屏展示的数据类型-(大屏图): 1 采集点 2 气象站 3 全景相机 4 细节相机" // 显示数据是写死的 假的
}, },
......
...@@ -110,7 +110,10 @@ const soilMoistureContentSchema = new Schema({ ...@@ -110,7 +110,10 @@ const soilMoistureContentSchema = new Schema({
comment: "版本号", comment: "版本号",
}, },
deviceHQType: {
type: Number,
comment: "用来获取数据的设备类型-(接口文档): 1.土壤温湿度氮磷钾, 2土壤ph电导率, 3 气象站, 4虫情",
},
creatTime: { creatTime: {
......
...@@ -18,7 +18,7 @@ async function findList(search, options) { ...@@ -18,7 +18,7 @@ async function findList(search, options) {
if(!(_.isNumber(options.skip) && _.isNumber(options.limit))) { if(!(_.isNumber(options.skip) && _.isNumber(options.limit))) {
return []; 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();
} }
// 总量 // 总量
......
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