2023-07-10 16:12:45 基本完成策略下发执行设备调控逻辑,根据终端上传结果来反馈给前端页面展示!

master
魔神煜修罗皇 2 years ago
parent 6e2245538d
commit 880c395e97
  1. 6
      psdc-admin/src/main/resources/application-dev.yml
  2. 10
      psdc-admin/src/main/resources/application-prod.yml
  3. 16
      psdc-business/src/main/java/com/psdc/mqtt/MyMQTTCallback.java
  4. 186
      psdc-business/src/main/java/com/psdc/mqtt/savedata/ControlResultSave.java
  5. 85
      psdc-business/src/main/java/com/psdc/mqtt/savedata/DataAndPowerSave.java
  6. 25
      psdc-business/src/main/java/com/psdc/service/impl/PsdcDeviceServiceImpl.java
  7. 16
      psdc-web/src/main/java/com/psdc/controller/control/ManualController.java
  8. 7
      psdc-web/src/main/java/com/psdc/controller/evaluate/PsdcStrategyLogController.java

@ -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

@ -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

@ -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();

@ -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戴仕崑
* @Projectpsdc
* @FilenameControlReaSave
* @Slogan 致敬大师致敬未来的你
* @Date2023/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<PsdcScene> 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<PsdcSceneRes> 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<PsdcThermometerDataRes> 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;
}
}

@ -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<PsdcScene> 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<PsdcSceneRes> 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<PsdcSceneRes> 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<PsdcThermometerDataRes> 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);
// }
}

@ -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<JSONObject> sceneControlCommand = jsonObject.getList("sceneControlCommand", JSONObject.class);
JSONObject map = sceneControlCommand.get(0);
Integer deviceId = map.getInteger("deviceId");
List<HashMap> 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]++;

@ -134,21 +134,7 @@ public class ManualController extends BaseController {
@PreAuthorize("@ss.hasPermi('control:manual:temperature')")
@PostMapping("/senceControl")
public AjaxResult senceControl(@RequestBody List<JSONObject> jsonObjectList){
Integer count = psdcDeviceService.sceneControl(jsonObjectList);
/* for (JSONObject jsonObject:jsonObjectList) {
Integer deviceId = jsonObject.getInteger("deviceId");
List<HashMap> 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("策略正在执行中,请耐心等待,感谢配合!");
}

@ -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;
}
}
Loading…
Cancel
Save