Browse Source

1、netty控制热泵设置;

2、天气温度历史记录接口;
3、修复主页数据;
4、加减载时间改成分钟;
dev_mz
25604 2 weeks ago
parent
commit
e457861976
  1. 6
      mh-admin/src/main/java/com/mh/web/controller/monitor/CoolingSystemMonitorController.java
  2. 63
      mh-common/src/main/java/com/mh/common/core/domain/dto/WeatherDataDTO.java
  3. 24
      mh-common/src/main/java/com/mh/common/utils/WeatherUtil.java
  4. 48
      mh-framework/src/main/java/com/mh/framework/netty/EchoServerHandler.java
  5. 8
      mh-framework/src/main/java/com/mh/framework/netty/NettyServiceImpl.java
  6. 14
      mh-system/src/main/java/com/mh/system/mapper/WeatherDataMapper.java
  7. 3
      mh-system/src/main/java/com/mh/system/service/device/ICoolingSystemMonitorService.java
  8. 29
      mh-system/src/main/java/com/mh/system/service/device/impl/CoolingSystemMonitorServiceImpl.java
  9. 4
      mh-system/src/main/java/com/mh/system/service/operation/impl/OperationDeviceServiceImpl.java
  10. 47
      mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java
  11. 14
      mh-system/src/main/java/com/mh/system/service/policy/impl/PolicyManageServiceImpl.java

6
mh-admin/src/main/java/com/mh/web/controller/monitor/CoolingSystemMonitorController.java

@ -111,4 +111,10 @@ public class CoolingSystemMonitorController extends BaseController {
return AjaxResult.success(iCoolingSystemMonitorService.getSystemMode(systemType, paramType));
}
@GetMapping("/getWeatherTemp")
public TableDataInfo getWeatherTemp(@RequestParam(name = "startTime") String startTime, @RequestParam(name = "endTime") String endTime){
startPage();
return getDataTable(iCoolingSystemMonitorService.getWeatherTemp(startTime, endTime));
}
}

63
mh-common/src/main/java/com/mh/common/core/domain/dto/WeatherDataDTO.java

@ -0,0 +1,63 @@
package com.mh.common.core.domain.dto;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 天气温度历史记录查询
* @date 2025-06-16 11:21:48
*/
@Data
public class WeatherDataDTO {
/**
* 时间
*/
private String weatherDate;
/**
* 日期和星期
*/
private String dateAndWeek;
/**
* 最高温度
*/
private String maxTemp;
/**
* 最低温度
*/
private String minTemp;
/**
* 天气
*/
private String weatherConditions;
/**
* 风向
*/
private String windDirection;
/**
* 风速
*/
private String windPower;
@Override
public String toString() {
return new ToStringBuilder(this)
.append("weatherDate", weatherDate)
.append("dateAndWeek", dateAndWeek)
.append("maxTemp", maxTemp)
.append("minTemp", minTemp)
.append("weatherConditions", weatherConditions)
.append("windDirection", windDirection)
.append("windPower", windPower)
.toString();
}
}

24
mh-common/src/main/java/com/mh/common/utils/WeatherUtil.java

@ -2,6 +2,9 @@ package com.mh.common.utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* @author LJF
@ -16,6 +19,27 @@ public class WeatherUtil {
private static final double A = 17.27;
private static final double B = 237.7;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
/**
* 根据日期字符串yyyy-MM-dd获取星期几中文
*/
public static String getWeek(String dateStr) {
LocalDate date = LocalDate.parse(dateStr, DATE_FORMATTER);
DayOfWeek dayOfWeek = date.getDayOfWeek();
switch (dayOfWeek) {
case MONDAY: return "星期一";
case TUESDAY: return "星期二";
case WEDNESDAY: return "星期三";
case THURSDAY: return "星期四";
case FRIDAY: return "星期五";
case SATURDAY: return "星期六";
case SUNDAY: return "星期日";
default: return "未知";
}
}
public double E(double t) {
// 饱和水汽压:E(t)=611.2exp(17.67t/(243.5+t))
return 611.2 * Math.exp(17.67 * t / (243.5 + t));

48
mh-framework/src/main/java/com/mh/framework/netty/EchoServerHandler.java

@ -171,15 +171,26 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter {
log.info("热泵读取接收===>{},长度:{},是否存在order_send_read: {}", receiveStr, receiveStr.length(), redisCache.hasKey("order_send_read"));
if (redisCache.hasKey("order_send_read")) {
log.error("order_send_read存在,接收到指令是{}", receiveStr);
CollectionParamsManage collectionParamsManage = new CollectionParamsManage();
collectionParamsManage.setDataType(2);
collectionParamsManage.setParamType("14");
Object orderSend = redisCache.getCacheObject("order_send_read");
String orderSendStr = String.valueOf(orderSend);
String substring = orderSendStr.substring(0, 2);
collectionParamsManage.setOtherName(ExchangeStringUtil.hexToDec(substring) + "号热泵温度设置");
analysisReceiveData(receiveStr, collectionParamsManage);
redisCache.deleteObject("order_send_read");
if (redisCache.hasKey("order_send_register")) {
Object orderSendRegister = redisCache.getCacheObject("order_send_register");
String orderSendRegisterStr = String.valueOf(orderSendRegister);
// 根据_进行数据转换成数组
// redisCache.setCacheObject("order_send_register",
// collectionParamsManage.getMtCode() + "_"
// + collectionParamsManage.getRegisterAddr() + "_"
// + collectionParamsManage.getRegisterSize() + "_"
// + collectionParamsManage.getParamType() + "_"
// + collectionParamsManage.getDataType() + "_"
// + collectionParamsManage.getOtherName()
// );
String[] split = orderSendRegisterStr.split("_");
CollectionParamsManage collectionParamsManage = new CollectionParamsManage();
collectionParamsManage.setDataType(Integer.valueOf(split[4]));
collectionParamsManage.setParamType(split[3]);
collectionParamsManage.setOtherName(split[5]);
analysisReceiveData(receiveStr, collectionParamsManage);
redisCache.deleteObject("order_send_read");
}
} else {
nextSendOrder(ctx);
}
@ -203,6 +214,23 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter {
// 判断是否有指令发送
Object orderSend = redisCache.getCacheObject("order_send");
String orderSendStr = String.valueOf(orderSend);
String orderSendRegisterStr = "";
if (redisCache.hasKey("order_send_register")) {
Object orderSendRegister = redisCache.getCacheObject("order_send_register");
orderSendRegisterStr = String.valueOf(orderSendRegister);
// 根据_进行数据转换成数组
// redisCache.setCacheObject("order_send_register",
// collectionParamsManage.getMtCode() + "_"
// + collectionParamsManage.getRegisterAddr() + "_"
// + collectionParamsManage.getRegisterSize() + "_"
// + collectionParamsManage.getRegisterSize() + "_"
// + collectionParamsManage.getDataType()
// );
String[] split = orderSendRegisterStr.split("_");
orderSendRegisterStr = split[1];
} else {
orderSendRegisterStr = orderSendStr.substring(4, 8);
}
// // 发送读取热泵设置温度
// String controlCode = ModbusUtils.createReadOrder(orderSendStr.substring(0, 2),
// "03",
@ -212,7 +240,7 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter {
if (receiveStr.contains(orderSendStr)) {
String readOrder = ModbusUtils.createReadOrder(orderSendStr.substring(0, 2),
"03",
"0003",
orderSendRegisterStr,
"1");
// 初始化发送指令
// NettyTools.initReceiveMsg("order_wait_read");

8
mh-framework/src/main/java/com/mh/framework/netty/NettyServiceImpl.java

@ -95,6 +95,14 @@ public class NettyServiceImpl implements INettyService {
NettyTools.initReceiveMsg("order_wait");
// 设置缓存,方便在netty中判断发送的指令
redisCache.setCacheObject("order_send", controlCode, 10, TimeUnit.SECONDS);
redisCache.setCacheObject("order_send_register",
collectionParamsManage.getMtCode() + "_"
+ collectionParamsManage.getRegisterAddr() + "_"
+ collectionParamsManage.getRegisterSize() + "_"
+ collectionParamsManage.getParamType() + "_"
+ collectionParamsManage.getDataType() + "_"
+ collectionParamsManage.getOtherName()
);
Thread.sleep(500);
// 发送控制指令
serverSession.getChannel().writeAndFlush(ModbusUtils.createByteBuf(controlCode));

14
mh-system/src/main/java/com/mh/system/mapper/WeatherDataMapper.java

@ -1,10 +1,14 @@
package com.mh.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mh.common.core.domain.dto.WeatherDataDTO;
import com.mh.common.core.domain.entity.WeatherData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author LJF
* @version 1.0
@ -17,4 +21,14 @@ public interface WeatherDataMapper extends BaseMapper<WeatherData> {
@Select("select * from weather_data where report_time::date = #{date}::date order by report_time desc limit 1")
WeatherData selectWeatherDataByDate(@Param("date") String date);
@Select("select " +
" * " +
"from " +
" vw_weather_daily_summary " +
"where " +
" weather_date between date(#{startTime}) and date(#{endTime}) " +
"order by " +
" weather_date ")
List<WeatherDataDTO> getWeatherTemp(@Param("startTime") String startTime, @Param("endTime") String endTime);
}

3
mh-system/src/main/java/com/mh/system/service/device/ICoolingSystemMonitorService.java

@ -4,6 +4,7 @@ import com.mh.common.core.domain.dto.SysPerformanceDTO;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -36,4 +37,6 @@ public interface ICoolingSystemMonitorService {
CollectionParamsManage getOneKeyButton(String systemType, String paramType);
HashMap<String, Object> getSystemMode(String systemType, String paramType);
List<?> getWeatherTemp(String startTime, String endTime);
}

29
mh-system/src/main/java/com/mh/system/service/device/impl/CoolingSystemMonitorServiceImpl.java

@ -2,11 +2,13 @@ package com.mh.system.service.device.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mh.common.core.domain.dto.SysPerformanceDTO;
import com.mh.common.core.domain.dto.WeatherDataDTO;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.SysParams;
import com.mh.common.core.domain.entity.WeatherData;
import com.mh.common.core.domain.vo.DeviceOperateMonitorVO;
import com.mh.common.utils.DateUtils;
import com.mh.common.utils.StringUtils;
import com.mh.common.utils.WeatherUtil;
import com.mh.system.mapper.SysParamsMapper;
import com.mh.system.mapper.WeatherDataMapper;
@ -18,6 +20,9 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
/**
@ -43,6 +48,30 @@ public class CoolingSystemMonitorServiceImpl implements ICoolingSystemMonitorSer
this.collectionParamsManageMapper = collectionParamsManageMapper;
}
@Override
public List<?> getWeatherTemp(String startTime, String endTime) {
if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {
return List.of();
}
// 获取startTime 第一天,endTime 最后一天
// 截取年月部分,构造当月第一天
LocalDate startMonth = LocalDate.parse(startTime.substring(0, 7) + "-01", DateTimeFormatter.ISO_LOCAL_DATE);
// 获取该月的最后一天
LocalDate endMonth = startMonth.with(TemporalAdjusters.lastDayOfMonth());
// 格式化为字符串格式 yyyy-MM-dd
String startTime1 = startMonth.format(DateTimeFormatter.ISO_LOCAL_DATE);
String endTime1 = endMonth.format(DateTimeFormatter.ISO_LOCAL_DATE);
// 获取天气数据
List<WeatherDataDTO> weatherTemp = weatherDataMapper.getWeatherTemp(startTime1, endTime1);
// 根据查询出来的值,里面的weather_date,判断今天星期几,然后重新赋值给dateAndWeek,格式是weather_date + 星期几
for (WeatherDataDTO weatherDataDTO : weatherTemp) {
weatherDataDTO.setDateAndWeek(weatherDataDTO.getWeatherDate() + " " + WeatherUtil.getWeek(weatherDataDTO.getWeatherDate()));
weatherDataDTO.setWindDirection(weatherDataDTO.getWindDirection() + "风 " + weatherDataDTO.getWindPower() + "级");
}
return weatherTemp;
}
@Override
public HashMap<String, Object> getSystemMode(String systemType, String paramType) {
HashMap<String, Object> result = new HashMap<>();

4
mh-system/src/main/java/com/mh/system/service/operation/impl/OperationDeviceServiceImpl.java

@ -107,6 +107,10 @@ public class OperationDeviceServiceImpl implements IOperationDeviceService {
PolicyManage policyManage = policyManageMapper.selectOntByCpmId(changeValue.getId());
if (null != policyManage) {
message = String.valueOf(new BigDecimal(message).multiply(BigDecimal.valueOf(Math.pow(10, policyManage.getDigits()))).intValue());
// 判断是否存在加减载时间,存在加减载时间还需要在乘以60
if (policyManage.getFunPolicyType().equals("1") && (policyManage.getPointName().contains("加载") || policyManage.getPointName().contains("减载"))) {
message = String.valueOf(new BigDecimal(message).multiply(BigDecimal.valueOf(60)).intValue());
}
}
}
// 发送报文

47
mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java

@ -55,7 +55,7 @@ public class ProOverviewServiceImpl implements IProOverviewService {
case 0:
// 查询冷源系统的EER
// 查询实时功率
List<CollectionParamsManage> realEleParams = queryCollectionParams("16", "0", 140, "15");
List<CollectionParamsManage> realEleParams = queryCollectionParams("16", "0", 140, "15", true);
BigDecimal realEle = null;
if (realEleParams != null && !realEleParams.isEmpty()) {
realEle = realEleParams.stream()
@ -64,7 +64,7 @@ public class ProOverviewServiceImpl implements IProOverviewService {
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
// 查询冷源系统的产冷量
List<CollectionParamsManage> realColdParams = queryCollectionParams("17", "0", 140, "15");
List<CollectionParamsManage> realColdParams = queryCollectionParams("17", "0", 140, "15", true);
BigDecimal realCold = null;
if (realColdParams != null && !realColdParams.isEmpty()) {
// realColdParams stream流得出cur_value总和
@ -91,28 +91,39 @@ public class ProOverviewServiceImpl implements IProOverviewService {
case 1:
// 热泵生活热水系统
// 查询供回水温度
List<CollectionParamsManage> realInAndOutTempParams = queryCollectionParams("12", "1", 140, null);
List<CollectionParamsManage> realInAndOutTempParams = queryCollectionParams("12", "1", 140, null, true);
BigDecimal avgInTemp = new BigDecimal("0.00");
BigDecimal avgOutTemp = new BigDecimal("0.00");
if (null != realInAndOutTempParams && !realInAndOutTempParams.isEmpty()) {
// 查询供水温度的平均值
avgOutTemp = realInAndOutTempParams.stream()
List<BigDecimal> filteredValues = realInAndOutTempParams.stream()
.filter(param -> param != null
&& param.getOtherName() != null
&& param.getOtherName().contains("供水"))
.map(CollectionParamsManage::getCurValue)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(new BigDecimal(realInAndOutTempParams.size()), 2, BigDecimal.ROUND_HALF_UP);
.toList();
BigDecimal sum = filteredValues.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
avgOutTemp = filteredValues.isEmpty() ? BigDecimal.ZERO :
sum.divide(BigDecimal.valueOf(filteredValues.size()), 2, BigDecimal.ROUND_HALF_UP);
// 查询回水温度的平均值
avgInTemp = realInAndOutTempParams.stream()
List<BigDecimal> filteredValues1 = realInAndOutTempParams.stream()
.filter(param -> param != null
&& param.getOtherName() != null
&& param.getOtherName().contains("回水"))
.map(CollectionParamsManage::getCurValue)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(new BigDecimal(realInAndOutTempParams.size()), 2, BigDecimal.ROUND_HALF_UP);
.toList();
BigDecimal sum1 = filteredValues1.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
avgInTemp = filteredValues1.isEmpty() ? BigDecimal.ZERO :
sum1.divide(BigDecimal.valueOf(filteredValues1.size()), 2, BigDecimal.ROUND_HALF_UP);
}
ColumnFilter inTempColumn = new ColumnFilter("回水平均温度", avgInTemp.toString());
ColumnFilter outTempColumn = new ColumnFilter("供水平均温度", avgOutTemp.toString());
@ -124,7 +135,7 @@ public class ProOverviewServiceImpl implements IProOverviewService {
case 2:
// 空调风柜系统
// 查询风柜运行状态
List<CollectionParamsManage> windCabinetRunParams = queryCollectionParams("1", "2", 140, null);
List<CollectionParamsManage> windCabinetRunParams = queryCollectionParams("1", "2", 140, null, true);
if (windCabinetRunParams != null && !windCabinetRunParams.isEmpty()) {
// 查询风柜正在运行设备,判断cur_value=1的
long runCount = windCabinetRunParams.stream().filter(param -> param != null
@ -144,7 +155,7 @@ public class ProOverviewServiceImpl implements IProOverviewService {
break;
case 4:
// 室内温度监测系统
List<CollectionParamsManage> tempParams = queryCollectionParams("12", "4", 140, null);
List<CollectionParamsManage> tempParams = queryCollectionParams("12", "4", 140, null, true);
// stream流判断时间cur_time是否是今天,如果是今天则判断在线,不是则判断离线
if (tempParams != null && !tempParams.isEmpty()) {
long onlineCount = tempParams.stream()
@ -189,7 +200,7 @@ public class ProOverviewServiceImpl implements IProOverviewService {
for (SysDictData sysDictData : sysTypeData) {
String sysType = sysDictData.getDictValue();
// 查询采集参数
List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40, null);
List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40, null, false);
// 合并数据
if (collectionParamsManages != null && !collectionParamsManages.isEmpty()) {
List<ColumnFilter> columnFilters = overviewMapper.energyAnalysis(collectionParamsManages);
@ -203,11 +214,17 @@ public class ProOverviewServiceImpl implements IProOverviewService {
return result.isEmpty() ? List.of() : result;
}
private List<CollectionParamsManage> queryCollectionParams(String paramType, String sysType, int grade, String terminalDeviceType) {
private List<CollectionParamsManage> queryCollectionParams(String paramType, String sysType, int grade, String terminalDeviceType, boolean isNow) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
LocalDate today = LocalDate.now();
String todayStr = today.toString(); // 格式为 'YYYY-MM-DD'
queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType)
.eq("grade", grade);
if (isNow) {
queryWrapper.apply("DATE(cur_time) = DATE({0})", todayStr);
}
if (terminalDeviceType != null && !terminalDeviceType.isEmpty()) {
queryWrapper.eq("terminal_device_type", terminalDeviceType);
@ -225,6 +242,10 @@ public class ProOverviewServiceImpl implements IProOverviewService {
queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType)
.eq("grade", grade);
if (isNow) {
queryWrapper.apply("DATE(cur_time) = DATE({0})", todayStr);
}
if (terminalDeviceType != null && !terminalDeviceType.isEmpty()) {
queryWrapper.eq("terminal_device_type", terminalDeviceType);
}

14
mh-system/src/main/java/com/mh/system/service/policy/impl/PolicyManageServiceImpl.java

@ -10,6 +10,7 @@ import com.mh.system.service.policy.IPolicyManageService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@ -103,10 +104,15 @@ public class PolicyManageServiceImpl implements IPolicyManageService {
// 处理每个PolicyManage对象的curValue字段
.peek(policy -> {
// 自动开关机时间,反馈是ms,页面是s,所以除以1000
// if (funPolicyType.equals("2")) {
policy.setCurValue(BigDecimal.valueOf((policy.getCurValue() == null ? new BigDecimal("0") : policy.getCurValue())
.divide(new BigDecimal((int) Math.pow(10, policy.getDigits()))).intValue())); // 除以1000并保留整数
// }
if (funPolicyType.equals("2")) {
policy.setCurValue(BigDecimal.valueOf((policy.getCurValue() == null ? new BigDecimal("0") : policy.getCurValue())
.divide(new BigDecimal((int) Math.pow(10, policy.getDigits())), 0, RoundingMode.HALF_UP).intValue())); // 除以1000并保留整数
} else if (funPolicyType.equals("1") && (policy.getPointName().contains("加载")
|| policy.getPointName().contains("减载"))) {
// 减载时间,反馈是ms,页面是min,所以除以1000 * 60
policy.setCurValue(BigDecimal.valueOf((policy.getCurValue() == null ? new BigDecimal("0") : policy.getCurValue())
.divide(new BigDecimal((int) Math.pow(10, policy.getDigits())).multiply(new BigDecimal("60")), 0, RoundingMode.HALF_UP).intValue()));
}
// 判断系统启动模式值是多少,如果是1:一键启动,如果是2:定时启动
if (policy.getPolicyType().equals("5") && policy.getFunPolicyType().equals("1")) {
// 查询当前系统启动模式值

Loading…
Cancel
Save