From dffc0470dfbd966cfe5bc137dff6e61859095ea5 Mon Sep 17 00:00:00 2001 From: litao Date: Tue, 23 Aug 2022 13:29:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab-service/lab-iot/pom.xml | 14 + .../springblade/iot/config/ModbusReader.java | 118 +++- .../iot/controller/SensorAlertController.java | 36 ++ .../iot/controller/SensorController.java | 512 +++++++++++++++++- .../controller/SensorHistoryController.java | 90 +++ .../iot/mapper/SensorAlertMapper.java | 16 + .../iot/mapper/SensorHistoryMapper.java | 16 + .../iot/service/ISensorAlertService.java | 14 + .../iot/service/ISensorHistoryService.java | 14 + .../service/impl/SensorAlertServiceImpl.java | 24 + .../impl/SensorHistoryServiceImpl.java | 25 + .../springblade/iot/utils/ReadModBusUtil.java | 11 +- 12 files changed, 864 insertions(+), 26 deletions(-) create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorHistoryController.java create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorAlertMapper.java create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorHistoryMapper.java create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorAlertService.java create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorHistoryService.java create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorAlertServiceImpl.java create mode 100644 lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorHistoryServiceImpl.java diff --git a/lab-service/lab-iot/pom.xml b/lab-service/lab-iot/pom.xml index b68b1e0..0e02c2e 100644 --- a/lab-service/lab-iot/pom.xml +++ b/lab-service/lab-iot/pom.xml @@ -38,6 +38,20 @@ lab-iot-api ${bladex.project.version} + + + com.infiniteautomation + modbus4j + 3.0.3 + + + + org.springblade + lab-system-api + 2.8.1.RELEASE + compile + + diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java index 99acbd9..779773f 100644 --- a/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/config/ModbusReader.java @@ -1,35 +1,117 @@ package org.springblade.iot.config; +import com.alibaba.fastjson.JSONObject; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.exception.ModbusInitException; +import lombok.AllArgsConstructor; +import org.springblade.core.cache.utils.CacheUtil; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorAlert; +import org.springblade.iot.entry.SensorHistory; +import org.springblade.iot.service.ISensorAlertService; +import org.springblade.iot.service.ISensorHistoryService; +import org.springblade.iot.service.ISensorService; import org.springblade.iot.utils.ReadModBusUtil; +import org.springblade.system.feign.ISysClient; +import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.springblade.core.cache.constant.CacheConstant.BIZ_CACHE; @Component -public class ModbusReader { +@AllArgsConstructor +public class ModbusReader implements CommandLineRunner { + + private final ISensorService sensorService; + + private final ISensorHistoryService historyService; + + private final ISysClient sysClient; + + private final ISensorAlertService sensorAlertService; /** * 项目启动读取传感器数据 相关逻辑 */ - @PostConstruct - private void readModBusSensor() throws Exception { - // 1.获取tcp协议的主机(上位机) - ModbusMaster master = ReadModBusUtil.getTcpMaster("192.168.1.217", 502, 1); - // 2.初始化 - try { - master.init(); - while (0 == 0) { - // 3.读取保持寄存器数据 - ReadModBusUtil.readHoldingRegistersTest(master, 1, 0, 10); - Thread.sleep(1000L); + @Override + public void run(String... args) throws Exception { + // 获取所有设备 + List list = sensorService.list(); + int count = 1; + // 系统启动先清空下Redis + for (Sensor sensor : list) { + CacheUtil.evict(BIZ_CACHE, "sensor:id", sensor.getId()); + } + // TODO 端口和从机id后期加到数据库 + while (true) { + List tempList = new ArrayList<>(); + List alerts = new ArrayList<>(); + for (Sensor sensor : list) { + // 1.获取tcp协议的主机(上位机) + ModbusMaster master = ReadModBusUtil.getTcpMaster(sensor.getIp(), 502, 1); + // 2.初始化 + try { + master.init(); + // 3.读取保持寄存器数据 + List floats = ReadModBusUtil.readHoldingRegistersTest(master, 1, sensor.getStartIndex(), sensor.getDataLength()); + if (floats.get(0) != null) { + sensor.setCurrData(String.valueOf(floats.get(0))); + } +// System.out.println(sensor.getIp() + ":" + sensor.getSignalName() + ":" + floats); + // 加入缓存 + String tempStr = CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId(), () -> JSONObject.toJSONString(sensor)); + System.out.println("tempStr" + tempStr); + Sensor result = JSONObject.parseObject(tempStr, Sensor.class); + System.out.println("result" + result); + + String str = (String) CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId()); + System.out.println("str" + str); + Sensor result1 = JSONObject.parseObject(str, Sensor.class); + System.out.println("result" + result1); + + SensorHistory resultHistory = new SensorHistory(); + BeanUtil.copy(result, resultHistory); + resultHistory.setId(null); + resultHistory.setCreateTime(new Date()); + tempList.add(resultHistory); +// System.out.println("resultHistory:" + resultHistory); + // 报警信息 + if (sensor.getWarningValue() != null && + !"".equals(sensor.getWarningValue()) && + floats.get(0) > Float.parseFloat(sensor.getWarningValue())) { + SensorAlert sensorAlert = new SensorAlert(); + BeanUtil.copy(sensor, sensorAlert); + sensorAlert.setId(null); + sensorAlert.setCreateTime(new Date()); + sensorAlert.setType("1"); + alerts.add(sensorAlert); + } + } catch (ModbusInitException e) { + e.printStackTrace(); + } finally { + // TODO 挪到外边 + // 销毁连接 + master.destroy(); + } + } + String data = sysClient.getParamValue("storagef_requency").getData(); +// System.out.println("count" + count); + if (count >= Integer.parseInt(data)) { +// System.out.println("tempList:" + tempList); + historyService.saveBatch(tempList); + sensorAlertService.saveBatch(alerts); + tempList.clear(); + alerts.clear(); + count = 0; + } else { + count++; } - } catch (ModbusInitException e) { - e.printStackTrace(); - } finally { - // 销毁连接 - master.destroy(); + Thread.sleep(1000L); } } } diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java new file mode 100644 index 0000000..456fc00 --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorAlertController.java @@ -0,0 +1,36 @@ + +package org.springblade.iot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.annotations.Api; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.tool.api.R; +import org.springblade.iot.entry.SensorAlert; +import org.springblade.iot.service.ISensorAlertService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author swj + * @since 2022年8月17日16:35:34 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/sensorAlert") +@Api(value = "", tags = "") +public class SensorAlertController extends BladeController { + + private final ISensorAlertService sensorAlertService; + + /** + * 仪器设备异常报警 + */ + @GetMapping("/abnormal") + public R> abnormal() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SensorAlert::getIsRead, 0); + return R.data(sensorAlertService.list(wrapper)); + } +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java index 89f0af5..fa1aca6 100644 --- a/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorController.java @@ -1,6 +1,7 @@ package org.springblade.iot.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; @@ -9,20 +10,26 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorHistory; +import org.springblade.iot.service.ISensorHistoryService; import org.springblade.iot.service.ISensorService; import org.springframework.web.bind.annotation.*; -import java.util.Date; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +import static org.springblade.core.cache.constant.CacheConstant.BIZ_CACHE; /** - * 物品申领表 控制器 - * * @author swj * @since 2022年8月17日16:35:34 */ @@ -34,6 +41,8 @@ public class SensorController extends BladeController { private final ISensorService service; + private final ISensorHistoryService sensorHistoryService; + /** * 分页 */ @@ -80,9 +89,500 @@ public class SensorController extends BladeController { /** * 根据id获取对应的Sensor */ - @GetMapping("/getSensor") + @GetMapping("/getDetail") public Sensor getReagent(String id) { - Sensor sensor = service.getById(id); - return sensor; + return service.getById(id); + } + + /** + * 今日实验室温度变化趋势 + */ + @GetMapping("/temperature") + public R> temperature(String roomNumber) throws ParseException { + Map map = new HashMap<>(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String format = df.format(new Date()); + Date parse0 = df2.parse(format + " 00:00:00"); + Date parse2 = df2.parse(format + " 02:00:00"); + Date parse4 = df2.parse(format + " 04:00:00"); + Date parse6 = df2.parse(format + " 06:00:00"); + Date parse8 = df2.parse(format + " 08:00:00"); + Date parse10 = df2.parse(format + " 10:00:00"); + Date parse12 = df2.parse(format + " 12:00:00"); + Date parse14 = df2.parse(format + " 14:00:00"); + Date parse16 = df2.parse(format + " 16:00:00"); + Date parse18 = df2.parse(format + " 18:00:00"); + Date parse20 = df2.parse(format + " 20:00:00"); + Date parse22 = df2.parse(format + " 22:00:00"); + Date parse24 = df2.parse(format + " 23:59:59"); + DecimalFormat decimalFormat = new DecimalFormat("#0.0"); + List time = new ArrayList<>(); + List temperatures = new ArrayList<>(); + List humiditys = new ArrayList<>(); + // 0点到2点的平均温度值 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse0, parse2); + List histories2 = sensorHistoryService.list(wrapper); + if (histories2 != null && histories2.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories2) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories2.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("2a"); + + // 2点到4点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse2, parse4); + List histories4 = sensorHistoryService.list(wrapper); + if (histories4 != null && histories4.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories4) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories4.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("4a"); + + // 4点到6点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse4, parse6); + List histories6 = sensorHistoryService.list(wrapper); + if (histories6 != null && histories6.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories6) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories6.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("6a"); + + // 6点到8点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse6, parse8); + List histories8 = sensorHistoryService.list(wrapper); + if (histories8 != null && histories8.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories8) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories8.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("8a"); + + // 8点到10点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse8, parse10); + List histories10 = sensorHistoryService.list(wrapper); + if (histories10 != null && histories10.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories10) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories10.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("10a"); + + // 10点到12点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse10, parse12); + List histories12 = sensorHistoryService.list(wrapper); + if (histories12 != null && histories12.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories12) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories12.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("12a"); + + // 12点到14点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse12, parse14); + List histories14 = sensorHistoryService.list(wrapper); + if (histories14 != null && histories14.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories14) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories14.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("2p"); + + // 14点到16点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse14, parse16); + List histories16 = sensorHistoryService.list(wrapper); + if (histories16 != null && histories16.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories16) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories16.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("4p"); + + // 16点到18点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse16, parse18); + List histories18 = sensorHistoryService.list(wrapper); + if (histories18 != null && histories18.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories18) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories18.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("6p"); + + // 18点到20点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse18, parse20); + List histories20 = sensorHistoryService.list(wrapper); + if (histories20 != null && histories20.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories20) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories20.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("8p"); + + // 20点到22点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse20, parse22); + List histories22 = sensorHistoryService.list(wrapper); + if (histories22 != null && histories22.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories22) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories22.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("10p"); + + // 22点到24点的平均温度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "温度"); + wrapper.between(SensorHistory::getCreateTime, parse22, parse24); + List histories24 = sensorHistoryService.list(wrapper); + if (histories24 != null && histories24.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories24) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories24.size()); + temperatures.add(format1); + } else { + temperatures.add("0"); + } + time.add("12p"); + + // 0点到2点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse0, parse2); + List histories1 = sensorHistoryService.list(wrapper); + if (histories1 != null && histories1.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories1) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories1.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 2点到4点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse2, parse4); + List histories3 = sensorHistoryService.list(wrapper); + if (histories3 != null && histories3.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories3) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories3.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 4点到6点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse4, parse6); + List histories5 = sensorHistoryService.list(wrapper); + if (histories5 != null && histories5.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories5) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories5.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 6点到8点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse6, parse8); + List histories7 = sensorHistoryService.list(wrapper); + if (histories7 != null && histories7.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories7) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories7.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 8点到10点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse8, parse10); + List histories9 = sensorHistoryService.list(wrapper); + if (histories9 != null && histories9.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories9) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories9.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 10点到12点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse10, parse12); + List histories11 = sensorHistoryService.list(wrapper); + if (histories11 != null && histories11.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories11) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories11.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 12点到14点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse12, parse14); + List histories13 = sensorHistoryService.list(wrapper); + if (histories13 != null && histories13.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories13) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories13.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 14点到16点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse14, parse16); + List histories15 = sensorHistoryService.list(wrapper); + if (histories15 != null && histories15.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories15) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories15.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 16点到18点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse16, parse18); + List histories17 = sensorHistoryService.list(wrapper); + if (histories17 != null && histories17.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories17) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories17.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 18点到20点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse18, parse20); + List histories19 = sensorHistoryService.list(wrapper); + if (histories19 != null && histories19.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories19) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories19.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 20点到22点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse20, parse22); + List histories21 = sensorHistoryService.list(wrapper); + if (histories21 != null && histories21.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories21) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories21.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + + // 22点到24点的平均湿度值 + wrapper.clear(); + wrapper.eq(SensorHistory::getRoomNumber, roomNumber); + wrapper.eq(SensorHistory::getType, "湿度"); + wrapper.between(SensorHistory::getCreateTime, parse22, parse24); + List histories23 = sensorHistoryService.list(wrapper); + if (histories23 != null && histories23.size() > 0) { + double temperature = 0; + for (SensorHistory history : histories23) { + temperature += Double.parseDouble(history.getCurrData()); + } + String format1 = decimalFormat.format(temperature / histories23.size()); + humiditys.add(format1); + } else { + humiditys.add("0"); + } + map.put("time", time); + map.put("temperatures", temperatures); + map.put("humiditys", humiditys); + return R.data(map); + } + + + /** + * 今日实验室湿度变化趋势 + */ +// @GetMapping("/humidity") +// public R> humidity(String roomNumber) throws ParseException {} + + + /** + * 右上角实验室实时数据 + */ + @GetMapping("/realTime") + public R> realTime(String roomNumber) { + Map map = new HashMap<>(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Sensor::getRoomNumber, roomNumber); + List sensors = service.list(wrapper); + System.out.println("sensors" + sensors); + if (sensors != null && sensors.size() > 0) { + for (Sensor sensor : sensors) { + System.out.println("sensor.getId()" + sensor.getId()); + String str = (String) CacheUtil.get(BIZ_CACHE, "sensor:id", sensor.getId()); + System.out.println("str:" + str); + Sensor result = JSONObject.parseObject(str, Sensor.class); + System.out.println("result" + result); + System.out.println("result.getType()" + result.getType()); + if ("温度".equals(result.getType())) { + map.put("temperature", result.getCurrData()); + } + if ("湿度".equals(result.getType())) { + map.put("humidity", result.getCurrData()); + } + if ("压差".equals(result.getType())) { + map.put("pressure", result.getCurrData()); + } + } + } + return R.data(map); } + } diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorHistoryController.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorHistoryController.java new file mode 100644 index 0000000..7111661 --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/controller/SensorHistoryController.java @@ -0,0 +1,90 @@ + +package org.springblade.iot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorHistory; +import org.springblade.iot.service.ISensorHistoryService; +import org.springblade.iot.service.ISensorService; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; + +/** + * + * + * @author swj + * @since 2022年8月17日16:35:34 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/sensorHistory") +@Api(value = "", tags = "") +public class SensorHistoryController extends BladeController { + + private final ISensorHistoryService service; + + /** + * 分页 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 2) + public R list(SensorHistory entry, Query query) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByDesc(SensorHistory::getCreateTime); + IPage page = service.page(Condition.getPage(query), wrapper); + return R.data(page); + } + + /** + * 更改 + */ + @PostMapping("/update") + @ApiOperation(value = "更改", notes = "更改") + public R update(@RequestBody SensorHistory entry) { + return R.data(service.updateById(entry)); + } + + /** + * 新增 + */ + @PostMapping("/insert") + @ApiOperation(value = "新增", notes = "新增") + public R insert(@RequestBody SensorHistory entry) { + entry.setCreateTime(new Date()); + entry.setUpdateTime(new Date()); + entry.setCreateUser(AuthUtil.getUserId()); + entry.setUpdateUser(AuthUtil.getUserId()); + return R.data(service.save(entry)); + } + + /** + * 删除 + */ + @PostMapping("/deleteByIds") + @ApiOperation(value = "逻辑删除", notes = "传入ids") + public R deleteByIds(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { + return R.status(service.deleteLogic(Func.toLongList(ids))); + } + + /** + * 根据id获取对应的Sensor + */ + @GetMapping("/getDetail") + public SensorHistory getReagent(String id) { + SensorHistory sensor = service.getById(id); + return sensor; + } +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorAlertMapper.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorAlertMapper.java new file mode 100644 index 0000000..1bd67ff --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorAlertMapper.java @@ -0,0 +1,16 @@ + +package org.springblade.iot.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorAlert; + +/** + * + * + * @author swj + * @since 2022年8月17日16:37:29 + */ +public interface SensorAlertMapper extends BaseMapper { + +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorHistoryMapper.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorHistoryMapper.java new file mode 100644 index 0000000..9cc9656 --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/mapper/SensorHistoryMapper.java @@ -0,0 +1,16 @@ + +package org.springblade.iot.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorHistory; + +/** + * + * + * @author swj + * @since 2022年8月17日16:37:29 + */ +public interface SensorHistoryMapper extends BaseMapper { + +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorAlertService.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorAlertService.java new file mode 100644 index 0000000..7b95c43 --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorAlertService.java @@ -0,0 +1,14 @@ + +package org.springblade.iot.service; + + +import org.springblade.core.mp.base.BaseService; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorAlert; + +/** + * @author swj + * @since 2022年8月17日16:39:35 + */ +public interface ISensorAlertService extends BaseService { +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorHistoryService.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorHistoryService.java new file mode 100644 index 0000000..d813ba2 --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/ISensorHistoryService.java @@ -0,0 +1,14 @@ + +package org.springblade.iot.service; + + +import org.springblade.core.mp.base.BaseService; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorHistory; + +/** + * @author swj + * @since 2022年8月17日16:39:35 + */ +public interface ISensorHistoryService extends BaseService { +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorAlertServiceImpl.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorAlertServiceImpl.java new file mode 100644 index 0000000..7a612c3 --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorAlertServiceImpl.java @@ -0,0 +1,24 @@ + +package org.springblade.iot.service.impl; + + +import lombok.AllArgsConstructor; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorAlert; +import org.springblade.iot.mapper.SensorAlertMapper; +import org.springblade.iot.mapper.SensorMapper; +import org.springblade.iot.service.ISensorAlertService; +import org.springblade.iot.service.ISensorService; +import org.springframework.stereotype.Service; + + +/** + * @author swj + * @since 2022年8月17日16:39:58 + */ +@Service +@AllArgsConstructor +public class SensorAlertServiceImpl extends BaseServiceImpl implements ISensorAlertService { + +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorHistoryServiceImpl.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorHistoryServiceImpl.java new file mode 100644 index 0000000..c253f5f --- /dev/null +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/service/impl/SensorHistoryServiceImpl.java @@ -0,0 +1,25 @@ + +package org.springblade.iot.service.impl; + + +import lombok.AllArgsConstructor; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.iot.entry.Sensor; +import org.springblade.iot.entry.SensorHistory; +import org.springblade.iot.mapper.SensorHistoryMapper; +import org.springblade.iot.mapper.SensorMapper; +import org.springblade.iot.service.ISensorHistoryService; +import org.springblade.iot.service.ISensorService; +import org.springframework.stereotype.Service; + + +/** + * @author swj + * @since 2022年8月17日16:39:58 + */ +@Service +@AllArgsConstructor +public class SensorHistoryServiceImpl extends BaseServiceImpl implements ISensorHistoryService { + + private final SensorMapper sensorMapper; +} diff --git a/lab-service/lab-iot/src/main/java/org/springblade/iot/utils/ReadModBusUtil.java b/lab-service/lab-iot/src/main/java/org/springblade/iot/utils/ReadModBusUtil.java index 041b6a1..5a81e44 100644 --- a/lab-service/lab-iot/src/main/java/org/springblade/iot/utils/ReadModBusUtil.java +++ b/lab-service/lab-iot/src/main/java/org/springblade/iot/utils/ReadModBusUtil.java @@ -7,10 +7,16 @@ import com.serotonin.modbus4j.exception.ModbusTransportException; import com.serotonin.modbus4j.ip.IpParameters; import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest; import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse; +import org.springblade.core.cache.utils.CacheUtil; +import org.springblade.core.tool.api.R; +import org.springblade.iot.entry.Sensor; import java.util.ArrayList; import java.util.List; +import static org.springblade.core.cache.constant.CacheConstant.BIZ_CACHE; +import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; + /** * @author swj */ @@ -47,7 +53,7 @@ public class ReadModBusUtil { * @param start 起始地址的偏移量 * @param len 待读寄存器的个数 */ - public static void readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) { + public static List readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) { try { ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, start, len); ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request); @@ -56,11 +62,12 @@ public class ReadModBusUtil { } else { byte[] data = response.getData(); List floats = byteArrayToFloatList(data); - System.out.println("floats:" + floats); + return floats; } } catch (ModbusTransportException e) { e.printStackTrace(); } + return null; } /**