diff --git a/psdc-admin/src/main/resources/application-dev.yml b/psdc-admin/src/main/resources/application-dev.yml index f6dbe4a..2d2b49a 100644 --- a/psdc-admin/src/main/resources/application-dev.yml +++ b/psdc-admin/src/main/resources/application-dev.yml @@ -138,12 +138,12 @@ mqtt: #QOS等级 0, 1, 2 qos: 1 #客户端id 必须唯一 - clientId: psdc-dev1234 + clientId: psdcDev123 #连接超时,默认30000 timeOut: 10 #心跳间隔时间,默认3000 keepAlive: 200 #主题 - dataTopic: /hwj1/dntd/datas/report/dataTimingReport + dataTopic: /hwj1/dntd/datas/report/dataTimingReporta1 controlTopic: /hwj1/dntd/request/action/command - controlResponseTopic: /hwj1/dntd/response/action/command + controlResponseTopic: /hwj1/dntd/request/action/command/result diff --git a/psdc-admin/src/main/resources/application-prod.yml b/psdc-admin/src/main/resources/application-prod.yml index 9e6d263..206c483 100644 --- a/psdc-admin/src/main/resources/application-prod.yml +++ b/psdc-admin/src/main/resources/application-prod.yml @@ -54,9 +54,9 @@ spring: # 数据库驱动 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://127.0.0.1:3308/psdc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true + url: jdbc:mysql://127.0.0.1:3306/psdc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true username: root - password: root + password: 123456 messages: # 国际化资源文件路径 basename: i18n/messages @@ -131,14 +131,14 @@ xss: #MQTT配置 mqtt: #MQTT服务端地址,端口默认为1883,如果有多个,用逗号隔开,如tcp://127.0.0.1:1883,tcp://192.168.60.133:1883 - url: tcp://39.105.213.67:1883 + url: tcp://127.0.0.1:1883 #用户名 密码 username: 1669792462840@UserName password: abc12321cba #QOS等级 0, 1, 2 qos: 1 #客户端id 必须唯一 - clientId: psdc@system + clientId: psdc@System2 #连接超时,默认30000 timeOut: 10 #心跳间隔时间,默认3000 @@ -146,4 +146,4 @@ mqtt: #主题 dataTopic: /hwj1/dntd/datas/report/dataTimingReport controlTopic: /hwj1/dntd/request/action/command - controlResponseTopic: /hwj1/dntd/response/action/command + controlResponseTopic: /hwj1/dntd/request/action/command/result diff --git a/psdc-business/src/main/java/com/psdc/mqtt/MyMQTTCallback.java b/psdc-business/src/main/java/com/psdc/mqtt/MyMQTTCallback.java index 290a5eb..8523751 100644 --- a/psdc-business/src/main/java/com/psdc/mqtt/MyMQTTCallback.java +++ b/psdc-business/src/main/java/com/psdc/mqtt/MyMQTTCallback.java @@ -2,6 +2,7 @@ package com.psdc.mqtt; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.psdc.mqtt.savedata.ControlResultSave; import com.psdc.mqtt.savedata.DataAndPowerSave; import com.psdc.utils.spring.SpringUtils; import lombok.extern.slf4j.Slf4j; @@ -69,11 +70,24 @@ public class MyMQTTCallback implements MqttCallback { public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { log.info("接收消息主题 : {},接收消息内容 : {}", topic, new String(mqttMessage.getPayload())); + //切割主题 + String[] split = topic.split("/"); + String str = split[split.length - 1]; + // 设备实时数据,设备历史数据,设备,电站,用户功率数据 DataAndPowerSave dataAndPowerSaveBean = SpringUtils.getBean(DataAndPowerSave.class); + ControlResultSave controlResultSave = SpringUtils.getBean(ControlResultSave.class); JSONObject jsonObject = JSON.parseObject(new String(mqttMessage.getPayload())); try { - dataAndPowerSaveBean.saveDevRtData(jsonObject); + if ("dataTimingReport".equals(str)){ + log.info("实时数据,开始入库!"); + // 更新实时数据,历史数据 + dataAndPowerSaveBean.saveDevRtData(jsonObject); + } else if ("result".equals(str)) { + log.info("控制结果数据,开始入库!"); + controlResultSave.saveDevRtData(jsonObject); + } + } catch (Exception e){ e.printStackTrace(); diff --git a/psdc-business/src/main/java/com/psdc/mqtt/savedata/ControlResultSave.java b/psdc-business/src/main/java/com/psdc/mqtt/savedata/ControlResultSave.java new file mode 100644 index 0000000..46e85b9 --- /dev/null +++ b/psdc-business/src/main/java/com/psdc/mqtt/savedata/ControlResultSave.java @@ -0,0 +1,186 @@ +package com.psdc.mqtt.savedata; + +import com.alibaba.fastjson2.JSONObject; +import com.psdc.entity.PsdcScene; +import com.psdc.entity.PsdcStrategyLog; +import com.psdc.entity.res.AppInfoRes; +import com.psdc.entity.res.PsdcSceneRes; +import com.psdc.entity.res.PsdcThermometerDataRes; +import com.psdc.mapper.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author:戴仕崑 + * @Project:psdc + * @Filename:ControlReaSave + * @Slogan 致敬大师,致敬未来的你 + * @Date:2023/7/10 9:53 + * @Version 1.0 + */ +@Slf4j +@Component +public class ControlResultSave { + + @Resource + PsdcStrategyLogMapper psdcStrategyLogMapper; + @Resource + PsdcDeviceMapper deviceMapper; + @Resource + PsdcSceneMapper psdcSceneMapper; + @Resource + PsdcThermometerRtdataMapper thermometerRtDataMapper; + + + public Boolean saveDevRtData(JSONObject jsonObject){ + + Integer deviceId = jsonObject.getInteger("deviceId"); + String timestamp = jsonObject.getString("timestamp"); + Integer sceneCode = jsonObject.getInteger("sceneCode"); + Integer statusCode = jsonObject.getInteger("statusCode"); + + + // 时间处理 + String date1 = timestamp.split("T")[0]; + String time1 = timestamp.split("T")[1]; + int hour = Integer.parseInt(time1.substring(0, 8).split(":")[0]); + String upDateTime = date1 + " " + time1.substring(0, 8); + + // 查看是否有正在执行的策略 + PsdcStrategyLog strategyLog = psdcStrategyLogMapper.selMyRunLog(2); + + if (null != strategyLog) { + String[] split = strategyLog.getRunSceneCodes().split(","); + Long runCode = Long.parseLong(split[split.length - 1]); // 正在进行步骤 + String[] split2 = strategyLog.getAllSceneCodes().split(","); + Boolean b1 = false; + Boolean b2 = false; + List list = psdcSceneMapper.queryBySceneCode(Math.toIntExact(runCode)); + if (String.valueOf(deviceId).equals(String.valueOf(list.get(0).getDeviceId()))) { + + + Double[] s = getInTemp(date1 + " " + hour, "温度传感器", deviceId); + if (split2.length == split.length) { + for (PsdcScene psc : list) { + if (String.valueOf(sceneCode).equals(String.valueOf(psc.getSceneCode()))){ + b1 = isOk(statusCode); + } + if (!b1) { + break; + } + } + String runSta = strategyLog.getStrategyRunRes() + statusCode; + psdcStrategyLogMapper.updateRunRes(strategyLog.getId(), upDateTime, 1, null, runSta, s[0], s[1]); + + synchronized (AppInfoRes.class) { + AppInfoRes.class.notify(); + } + } else { + Integer nextCode = Integer.valueOf(split2[split.length]); + List list2 = psdcSceneMapper.queryScenes2(Long.valueOf(nextCode)); + for (PsdcScene psc : list) { + if (String.valueOf(sceneCode).equals(String.valueOf(psc.getSceneCode()))){ + b1 = isOk(statusCode); + } + if (!b1) { + break; + } + } + for (PsdcSceneRes psc : list2) { + b2 = isOk2(psc.getIsJudge(), psc.getJudgeDevice(), psc.getJudgeElement(), psc.getJudgeData(), date1); + if (!b2) { + break; + } + } + + String runSta = strategyLog.getStrategyRunRes() + statusCode + ","; + if (runSta.indexOf("null") >= 0) { + runSta = runSta.substring(4); + } + + if (b1) { + psdcStrategyLogMapper.updateRunRes(strategyLog.getId(), null, null, null, runSta, null, null); + if (b2){ + synchronized (AppInfoRes.class) { + AppInfoRes.class.notify(); + } + } + } else { + psdcStrategyLogMapper.updateRunRes(strategyLog.getId(), upDateTime, 1, null, runSta, s[0], s[1]); + synchronized (AppInfoRes.class) { + AppInfoRes.class.notify(); + } + } + } + } + } + + return true; + } + + private Boolean isOk(Integer statusCode) { + switch (statusCode){ + case 1: + return true; + default: + return false; + } + } + + private Boolean isOk2(Integer isJudge, Integer judgeDevice, String judgeElement, String judgeData, String today) { + switch (isJudge) { + case 2: + return true; + case 1: + if (null != thermometerRtDataMapper.queryById(judgeDevice, today)) { + PsdcThermometerDataRes query = thermometerRtDataMapper.queryById(judgeDevice, today); + switch (judgeElement) { + case "thermometer_value": + if (query.getThermometerValue() >= Double.parseDouble(judgeData)) ; + return true; + case "thermometer_value_in": + if (query.getThermometerValueIn() >= Double.parseDouble(judgeData)) ; + return true; + case "thermometer_value_out": + if (query.getThermometerValueOut() >= Double.parseDouble(judgeData)) ; + return true; + } + } + default: + return false; + } + } + + public Double[] getInTemp(String dateTime, String s, Integer deviceId) { + return getDoubles(dateTime, s, deviceId, deviceMapper, thermometerRtDataMapper); + } + + static Double[] getDoubles(String dateTime, String s, Integer deviceId, PsdcDeviceMapper deviceMapper, PsdcThermometerRtdataMapper thermometerRtDataMapper) { + Integer userId = deviceMapper.queryById(deviceId).getUserId(); + List dataResList = thermometerRtDataMapper.selWenDu(Long.valueOf(userId), s, dateTime); + Double[] ary = new Double[2]; + Double houseInTemp = 0.0; // 实验室内平均温度 + int countIn = 0; + Double houseOutTemp = 0.0; // 实验室外平均温度 + int countOut = 0; + if (dataResList.size() > 0 && null != dataResList) { + for (PsdcThermometerDataRes dsc : dataResList) { + if (dsc.getInstallAddress().contains("室内")) { + houseInTemp = houseInTemp + dsc.getThermometerValue(); + countIn = countIn + 1; + } + if (dsc.getInstallAddress().contains("室外")) { + houseOutTemp = houseOutTemp + dsc.getThermometerValue(); + countOut = countOut + 1; + } + + } + } + ary[0] = houseInTemp / countIn; + ary[1] = houseOutTemp / countOut; + return ary; + } +} diff --git a/psdc-business/src/main/java/com/psdc/mqtt/savedata/DataAndPowerSave.java b/psdc-business/src/main/java/com/psdc/mqtt/savedata/DataAndPowerSave.java index 8b8c62c..d7a1a41 100644 --- a/psdc-business/src/main/java/com/psdc/mqtt/savedata/DataAndPowerSave.java +++ b/psdc-business/src/main/java/com/psdc/mqtt/savedata/DataAndPowerSave.java @@ -7,13 +7,11 @@ import com.psdc.entity.res.PsdcSceneRes; import com.psdc.entity.res.PsdcThermometerDataRes; import com.psdc.entity.vo.DeviceStatusVo; import com.psdc.mapper.*; -import com.psdc.utils.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.text.SimpleDateFormat; -import java.util.Date; import java.util.List; /** @@ -160,56 +158,21 @@ public class DataAndPowerSave { deviceMapper.upDevStatus(devStatus(devStatus), deviceId); - // 查看是否有正在执行的策略 PsdcStrategyLog strategyLog = psdcStrategyLogMapper.selMyRunLog(2); if (null != strategyLog) { - String[] split = strategyLog.getRunSceneCodes().split(","); - Long runCode = Long.parseLong(split[split.length - 1]); // 正在进行步骤 - String[] split2 = strategyLog.getAllSceneCodes().split(","); - Boolean b1 = false; Boolean b2 = false; - List list = psdcSceneMapper.queryBySceneCode(Math.toIntExact(runCode)); - if (String.valueOf(deviceId).equals(String.valueOf(list.get(0).getDeviceId()))) { - if (split2.length == split.length) { - for (PsdcScene psc : list) { - b1 = isOk(psc.getSceneKey(), psc.getSceneValue(), devStatus, NowTemp, InTemp, OutTemp); - if (!b1) { - break; - } - } - if (b1){ - String runSta = strategyLog.getStrategyRunRes() + "1"; - Double[] s = getInTemp(date1 + " " + hour, "温度传感器", deviceId); - psdcStrategyLogMapper.updateRunRes(strategyLog.getId(), upDateTime, 1, null, runSta, s[0], s[1]); - - synchronized (AppInfoRes.class) { - AppInfoRes.class.notify(); - } - } - } else { - Integer nextCode = Integer.valueOf(split2[split.length]); - List list2 = psdcSceneMapper.queryScenes2(Long.valueOf(nextCode)); - for (PsdcScene psc : list) { - b1 = isOk(psc.getSceneKey(), psc.getSceneValue(), devStatus, NowTemp, InTemp, OutTemp); - if (!b1) { - break; - } - } - for (PsdcSceneRes psc : list2) { - b2 = isOk2(psc.getIsJudge(), psc.getJudgeDevice(), psc.getJudgeElement(), psc.getJudgeData(), date1); - if (!b2) { - break; - } - } - - if (b1 && b2) { - String runSta = strategyLog.getStrategyRunRes() + "1" + ","; - if (runSta.indexOf("null") >= 0) { - runSta = runSta.substring(4); - } - psdcStrategyLogMapper.updateRunRes(strategyLog.getId(), null, null, null, runSta, null, null); + String[] runCodes = strategyLog.getRunSceneCodes().split(","); + String[] resList = strategyLog.getStrategyRunRes().split(","); + if (runCodes.length == resList.length){ + String[] split2 = strategyLog.getAllSceneCodes().split(","); + Integer nextCode = Integer.valueOf(split2[runCodes.length]); + List list2 = psdcSceneMapper.queryScenes2(Long.valueOf(nextCode)); + PsdcSceneRes psc = list2.get(0); + if (String.valueOf(deviceId).equals(String.valueOf(psc.getJudgeDevice()))){ + b2 = isOk2(psc.getIsJudge(), psc.getJudgeDevice(), psc.getJudgeElement(), psc.getJudgeData(), date1); + if (b2) { synchronized (AppInfoRes.class) { AppInfoRes.class.notify(); } @@ -289,30 +252,8 @@ public class DataAndPowerSave { } } - public Double[] getInTemp(String dateTime, String s, Integer deviceId) { - Integer userId = deviceMapper.queryById(deviceId).getUserId(); - List dataResList = thermometerRtDataMapper.selWenDu(Long.valueOf(userId), s, dateTime); - Double[] ary = new Double[2]; - Double houseInTemp = 0.0; // 实验室内平均温度 - int countIn = 0; - Double houseOutTemp = 0.0; // 实验室外平均温度 - int countOut = 0; - if (dataResList.size() > 0 && null != dataResList) { - for (PsdcThermometerDataRes dsc : dataResList) { - if (dsc.getInstallAddress().contains("室内")) { - houseInTemp = houseInTemp + dsc.getThermometerValue(); - countIn = countIn + 1; - } - if (dsc.getInstallAddress().contains("室外")) { - houseOutTemp = houseOutTemp + dsc.getThermometerValue(); - countOut = countOut + 1; - } - - } - } - ary[0] = houseInTemp / countIn; - ary[1] = houseOutTemp / countOut; - return ary; - } +// public Double[] getInTemp(String dateTime, String s, Integer deviceId) { +// return getDoubles(dateTime, s, deviceId, deviceMapper, thermometerRtDataMapper); +// } } diff --git a/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java b/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java index 7b96c45..bc3edc9 100644 --- a/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java +++ b/psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java @@ -332,8 +332,15 @@ public class PsdcDeviceServiceImpl implements IPsdcDeviceService { String controlContext = ControlKeyEnum.getControlContext(controlKey); // TODO 发送MQTT指令 - // MyMQTTClient myMQTTClient = new MyMQTTClient(); - // myMQTTClient.publish(jsonObject.toJSONString(), "/hwj1/dntd/request/action/command", 2, false); + MyMQTTClient myMQTTClient = new MyMQTTClient(); + // 封装控制策略Json + JSONObject jsonObject = new JSONObject(); + jsonObject.put("mid",MID); + jsonObject.put("timestamp",sdf2.format(new Date())); + jsonObject.put("deviceId",deviceId); + jsonObject.put("data",data); + MID = MID + 1; + myMQTTClient.publish(jsonObject.toJSONString(), "/hwj1/dntd/request/action/command", 2, false); // psdcControlLogMapper.insert(new PsdcControlLog(deviceId,psdcDevice.getDeviceName(),psdcDevice.getDeviceSn(),controlContext,controlValue,controlMethod,2,"控制成功",controlBy)); // psdcControlLogMapper.insert(new PsdcControlLog(deviceId,psdcDevice.getDeviceName(),psdcDevice.getDeviceSn(),controlContext,controlValue,controlMethod,3,"等待终端响应超时",controlBy)); // 发送成功 @@ -420,19 +427,27 @@ public class PsdcDeviceServiceImpl implements IPsdcDeviceService { for (JSONObject jsonObject : jsonObjectList) { Integer sceneCode = jsonObject.getInteger("sceneCode"); PsdcStrategyLog newLog = psdcStrategyLogMapper.selNewLog(code); - // System.out.println("你好 (1) 世界: " + newLog); + + if (null != newLog.getStrategyRunRes()){ + String s = newLog.getStrategyRunRes().substring(newLog.getStrategyRunRes().lastIndexOf(",")-1); + if (!s.equals("1,")){ + break; + } + } + + System.out.println("你好 (1) 世界: " + newLog); List sceneControlCommand = jsonObject.getList("sceneControlCommand", JSONObject.class); JSONObject map = sceneControlCommand.get(0); Integer deviceId = map.getInteger("deviceId"); List data = map.getList("data", HashMap.class); int i = 0; i = setTemperature(deviceId, sceneCode, data, userName, 1); - // System.out.println("你好 (2) 世界: " + sceneCode); + System.out.println("你好 (2) 世界: " + sceneCode); String sCode = newLog.getRunSceneCodes() + sceneCode + ","; if (sCode.indexOf("null") >= 0){ sCode = sCode.substring(4); } - // System.out.println("你好 (3) 世界: " + sCode); + System.out.println("你好 (3) 世界: " + sCode); psdcStrategyLogMapper.updateRunRes(newLog.getId(), null, null, sCode, null, null, null); if (i > 0) { count[0]++; diff --git a/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java b/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java index 5fd6680..5e1c68e 100644 --- a/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java +++ b/psdc-web/src/main/java/com/psdc/controller/control/ManualController.java @@ -134,21 +134,7 @@ public class ManualController extends BaseController { @PreAuthorize("@ss.hasPermi('control:manual:temperature')") @PostMapping("/senceControl") public AjaxResult senceControl(@RequestBody List jsonObjectList){ - Integer count = psdcDeviceService.sceneControl(jsonObjectList); -/* for (JSONObject jsonObject:jsonObjectList) { - Integer deviceId = jsonObject.getInteger("deviceId"); - List data = jsonObject.getList("data", HashMap.class); - int i = psdcDeviceService.setTemperature(deviceId, data, SecurityUtils.getUsername(),1); - if (i > 0){ - count++; - } - }*/ -// if (count.equals(jsonObjectList.size())) { -// return AjaxResult.success("控制成功"); -// } else { -// log.info("控制设备失败。返回数据库实际插入数据:{}",count); -// return AjaxResult.error("策略控制执行失败,请联系管理员"); -// } + psdcDeviceService.sceneControl(jsonObjectList); return AjaxResult.success("策略正在执行中,请耐心等待,感谢配合!"); } diff --git a/psdc-web/src/main/java/com/psdc/controller/evaluate/PsdcStrategyLogController.java b/psdc-web/src/main/java/com/psdc/controller/evaluate/PsdcStrategyLogController.java index 736e9e9..ebf2b85 100644 --- a/psdc-web/src/main/java/com/psdc/controller/evaluate/PsdcStrategyLogController.java +++ b/psdc-web/src/main/java/com/psdc/controller/evaluate/PsdcStrategyLogController.java @@ -33,7 +33,12 @@ public class PsdcStrategyLogController{ @PostMapping("/{strategyRes}") public AjaxResult getMyStrategyLog(@RequestParam("strategyCode") Long strategyCode ){ String s = psdcStrategyLogService.selMyNewLog(strategyCode).getStrategyRunRes(); - AjaxResult ajaxResult = new AjaxResult(200, "查询成功", s); + AjaxResult ajaxResult ; + if (null != s){ + ajaxResult = new AjaxResult(200, "查询成功", s.split(",")); + } else { + ajaxResult = new AjaxResult(200, "策略正在执行中,请耐心等待,谢谢配合!"); + } return ajaxResult; } } \ No newline at end of file