Browse Source

1、接入正帝热泵相关逻辑处理

dev
3067418132@qq.com 4 weeks ago
parent
commit
1b0c93202a
  1. 10
      user-service/src/main/java/com/mh/user/controller/TestController.java
  2. 193
      user-service/src/main/java/com/mh/user/job/StartOrStopHotpumpJob.java
  3. 1
      user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java
  4. 34
      user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java
  5. 32
      user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java
  6. 2
      user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java
  7. 6
      user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java
  8. 4
      user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java
  9. 18
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java
  10. 2
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  11. 9
      user-service/src/main/java/com/mh/user/service/DeviceInstallService.java
  12. 10
      user-service/src/main/java/com/mh/user/service/NowDataService.java
  13. 4
      user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java
  14. 8
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  15. 11
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  16. 29
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  17. 2
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java
  18. 19
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java
  19. 2
      user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java
  20. 2
      user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java
  21. 17
      user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java
  22. 9
      user-service/src/main/java/com/mh/user/tcp/TcpSingle.java
  23. 48
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  24. 312
      user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java
  25. 29
      user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java
  26. 2
      user-service/src/main/resources/application.yml
  27. 9
      user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java
  28. 1
      user-service/src/test/java/com/mh/user/chart/ChartTest.java

10
user-service/src/main/java/com/mh/user/controller/TestController.java

@ -2,24 +2,16 @@ package com.mh.user.controller;
import com.mh.common.utils.DateTimeUtils; import com.mh.common.utils.DateTimeUtils;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.dynamic.datasource.DataSourceContextHolder;
import com.mh.user.dynamic.datasource.DataSourceObject;
import com.mh.user.entity.DBEntity;
import com.mh.user.manage.QuartzManager; import com.mh.user.manage.QuartzManager;
import com.mh.user.mapper.NowDataMapper;
import com.mh.user.serialport.SerialTool; import com.mh.user.serialport.SerialTool;
import com.mh.user.service.NowDataService; import com.mh.user.service.NowDataService;
import com.mh.user.service.SysUserService; import com.mh.user.service.SysUserService;
import com.mh.user.utils.*; import com.mh.user.utils.*;
import org.quartz.SchedulerException; import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import purejavacomm.CommPort;
import purejavacomm.CommPortIdentifier;
import purejavacomm.PortInUseException; import purejavacomm.PortInUseException;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -84,7 +76,7 @@ public class TestController {
// analysis.analysisPressureOrder485("150304400F1ABE00E1","","","22"); // analysis.analysisPressureOrder485("150304400F1ABE00E1","","","22");
// analysis.analysisStateOrder485("6874100000000068810358F3395C16","","","41"); // analysis.analysisStateOrder485("6874100000000068810358F3395C16","","","41");
// analysis.analysisTempOrder485("020304013000010900","","","23"); // analysis.analysisTempOrder485("020304013000010900","","","23");
nowDataService.saveNowHistoryData("3","热泵","运行","runState","62"); // nowDataService.saveNowHistoryData("3","热泵","运行","runState","62", deviceInstallEntity.getDataCom());
// nowDataService.updateRunState("70","2","离线"); // nowDataService.updateRunState("70","2","离线");

193
user-service/src/main/java/com/mh/user/job/StartOrStopHotpumpJob.java

@ -0,0 +1,193 @@
package com.mh.user.job;
import com.alibaba.fastjson2.JSONObject;
import com.mh.common.http.HttpResult;
import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.model.SerialPortModel;
import com.mh.user.service.CollectionParamsManageService;
import com.mh.user.service.DeviceControlService;
import com.mh.user.utils.ExchangeStringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 定时开关机热泵
* @date 2026-06-04 13:45:02
*/
@Slf4j
@Component
public class StartOrStopHotpumpJob {
private final CollectionParamsManageService collectionParamsManageService;
private final DeviceControlService deviceControlService;
public StartOrStopHotpumpJob(CollectionParamsManageService collectionParamsManageService, DeviceControlService deviceControlService) {
this.collectionParamsManageService = collectionParamsManageService;
this.deviceControlService = deviceControlService;
}
@Scheduled(cron = "0 0/1 * * * ?")
public void startOrStopHotpump() {
log.info("定时开关机热泵开始");
// 查询定时时间
List<CollectionParamsManageEntity> paramsManageEntities = collectionParamsManageService.selectAllCPMList();
// 过滤获取paramTypeGroupId为3的数据
List<CollectionParamsManageEntity> filterList = paramsManageEntities.stream().filter(entity -> entity.getParamTypeGroupId() == 3).collect(Collectors.toList());
// 再根据device_install_id进行分组
Map<Long, List<CollectionParamsManageEntity>> listMap = filterList.stream().collect(Collectors.groupingBy(CollectionParamsManageEntity::getDeviceInstallId));
for (Map.Entry<Long, List<CollectionParamsManageEntity>> entry : listMap.entrySet()) {
List<CollectionParamsManageEntity> value = entry.getValue();
// 查看是否启动定时,register_addr = START_TIME1的cur_value值是否等于1,
CollectionParamsManageEntity startTime1 = value.stream().filter(entity -> entity.getRegisterAddr().equals("START_TIME1")).findFirst().orElse(null);
if (startTime1 != null && startTime1.getCurValue().intValue() == 1) {
// 同时查看对应的设备是否是开机状态,同时判断curTime是否是今天,如果是开机状态则不执行定时开关机
CollectionParamsManageEntity entity1 = paramsManageEntities.stream().filter(entity -> entity.getDeviceInstallId().equals(entry.getKey()))
.filter(entity -> entity.getRegisterAddr().equals("B000"))
.filter(entity -> entity.getCurTime() != null)
.filter(entity -> entity.getCurValue().intValue() == 1).findFirst().orElse(null);
// 判断设备状态更新时间是否是今天
boolean isTodayUpdate = false;
if (entity1 != null && entity1.getCurTime() != null) {
Date curTime = entity1.getCurTime();
LocalDate updateDate = curTime.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate();
java.time.LocalDate today = java.time.LocalDate.now();
isTodayUpdate = updateDate.equals(today);
log.info("设备{}的状态更新时间: {}, 是否是今天: {}", entry.getKey(), curTime, isTodayUpdate);
}
// 如果设备已开机且状态是今天更新的,则不执行定时开关机
if (entity1 != null && entity1.getCurValue().intValue() == 1 && isTodayUpdate) {
log.info("设备{}已开机且状态为今天更新,不执行定时开关机", entry.getKey());
} else {
// value过滤,开始查看当前时间是否是定时时间,register_name分别是
//OPEN_HOUR_TIME1:开始小时
//OPEN_MIN_TIME1:开始分钟
//CLOSE_HOUR_TIME1:结束小时
//CLOSE_MIN_TIME1:结束分钟
// 这几个查询出来在拼接成时间范围,然后判断当前时间是否在范围内,如果在范围内则执行定时开关机
// 获取定时开关机参数
CollectionParamsManageEntity openHour = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("OPEN_HOUR_TIME1"))
.findFirst().orElse(null);
CollectionParamsManageEntity openMin = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("OPEN_MIN_TIME1"))
.findFirst().orElse(null);
CollectionParamsManageEntity closeHour = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("CLOSE_HOUR_TIME1"))
.findFirst().orElse(null);
CollectionParamsManageEntity closeMin = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("CLOSE_MIN_TIME1"))
.findFirst().orElse(null);
// 检查所有定时参数是否都存在
if (openHour != null && openMin != null && closeHour != null && closeMin != null) {
// 获取当前时间
java.time.LocalDateTime now = java.time.LocalDateTime.now();
int currentHour = now.getHour();
int currentMinute = now.getMinute();
int currentTime = currentHour * 100 + currentMinute; // 格式化为 HHmm
// 计算开始时间和结束时间
int startTime = openHour.getCurValue().intValue() * 100 + openMin.getCurValue().intValue();
int endTime = closeHour.getCurValue().intValue() * 100 + closeMin.getCurValue().intValue();
log.info("设备{}的定时时间 - 当前: {}, 开始: {}, 结束: {}", entry.getKey(), currentTime, startTime, endTime);
// 判断当前时间是否在定时范围内
boolean isInTimeRange = false;
if (startTime <= endTime) {
// 正常情况:开始时间 <= 结束时间
isInTimeRange = currentTime >= startTime && currentTime <= endTime;
} else {
// 跨天情况:开始时间 > 结束时间(如 22:00 ~ 06:00)
isInTimeRange = currentTime >= startTime || currentTime <= endTime;
}
if (isInTimeRange) {
// 在时间范围内,执行开机操作
log.info("设备{}在定时范围内,执行开机操作", entry.getKey());
executeHotPumpControl(entry.getKey(), paramsManageEntities, "1");
} else {
// 不在时间范围内,执行关机操作
log.info("设备{}不在定时范围内,执行关机操作", entry.getKey());
executeHotPumpControl(entry.getKey(), paramsManageEntities, "0");
}
} else {
log.warn("设备{}的定时参数不完整", entry.getKey());
}
}
}
}
log.info("定时开关机热泵结束");
}
/**
* 执行热泵开关机控制
* @param deviceInstallId 设备安装ID
* @param params 参数列表
* @param command 命令1-开机0-关机
*/
private void executeHotPumpControl(Long deviceInstallId, List<CollectionParamsManageEntity> params, String command) {
try {
// 获取设备信息
CollectionParamsManageEntity deviceInfo = params.stream()
.filter(entity -> entity.getDeviceInstallId().equals(deviceInstallId))
.filter(entity -> entity.getRegisterAddr().equals("B000"))
.findFirst().orElse(null);
if (deviceInfo == null) {
log.error("未找到设备{}的开关机寄存器信息", deviceInstallId);
return;
}
// 检查当前状态,如果已经是目标状态则不执行
if (deviceInfo.getCurValue() != null && deviceInfo.getCurValue().intValue() == Integer.parseInt(command)) {
log.info("设备{}已是目标状态{},无需操作", deviceInstallId, command);
return;
}
// 构建串口通信参数
SerialPortModel serialPortModel = new SerialPortModel();
serialPortModel.setCpmId(String.valueOf(deviceInfo.getId()));
serialPortModel.setDataValue(command);
serialPortModel.setParam("");
// 调用设备控制服务执行开关机
List<SerialPortModel> paramList = new ArrayList<>();
paramList.add(serialPortModel);
try {
Constant.WEB_FLAG = true; //单抄,暂时停止采集
Thread.sleep(1000);
String rtData = deviceControlService.readOrWriteDevice(paramList, Constant.WRITE);
if (ExchangeStringUtil.getJSONType(rtData)) {
// Map map = JSONObject.parseObject(rtData);
log.info("设备{}{}成功", deviceInstallId, "1".equals(command) ? "开机" : "关机");
} else {
log.error("设备{}{}失败,结果: {}", deviceInstallId, "1".equals(command) ? "开机" : "关机", rtData);
}
} catch (Exception e) {
Constant.WEB_FLAG = false; //单抄,恢复采集
} finally {
Constant.WEB_FLAG = false; //单抄,恢复采集
}
} catch (Exception e) {
log.error("执行设备{}开关机控制异常", deviceInstallId, e);
}
}
}

1
user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java

@ -323,6 +323,7 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
@Result(column = "other_name", property = "otherName"), @Result(column = "other_name", property = "otherName"),
@Result(column = "grade", property = "grade"), @Result(column = "grade", property = "grade"),
@Result(column = "param_type_id", property = "paramTypeId"), @Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "param_type_group_id", property = "paramTypeGroupId"),
@Result(column = "collection_type", property = "collectionType"), @Result(column = "collection_type", property = "collectionType"),
@Result(column = "quality", property = "quality"), @Result(column = "quality", property = "quality"),
@Result(column = "building_id", property = "buildingId") @Result(column = "building_id", property = "buildingId")

34
user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java

@ -156,16 +156,30 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("isOnline") String isOnline); @Param("isOnline") String isOnline);
// 修改设备在线情况,离线。 // 修改设备在线情况,离线。
@Update("update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") @Update("<script>" +
"update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} "+
"<if test='dataCom != null and dataCom != \"\"'>" +
" and data_com=#{dataCom}" +
"</if>" +
"</script>")
void updateNotOnline(@Param("deviceAddr") String deviceAddr, void updateNotOnline(@Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType, @Param("deviceType") String deviceType,
@Param("buildingId") String buildingId, @Param("buildingId") String buildingId,
@Param("isOnline") String isOnline); @Param("isOnline") String isOnline,
@Param("dataCom") String dataCom);
//根据通讯地址和设备类型查询对应的设备信息 //根据通讯地址和设备类型查询对应的设备信息
@ResultMap("rs") @ResultMap("rs")
@Select("select top 1 * from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") @Select("<script>" +
DeviceInstallEntity selectDevice(@Param("deviceAddr") String deviceAddr,@Param("deviceType") String deviceType,@Param("buildingId") String buildingId); "select top 1 * from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} "+
"<if test='dataCom != null and dataCom != \"\"'>" +
" and data_com=#{dataCom}" +
"</if>" +
"</script>")
DeviceInstallEntity selectDevice(@Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType,
@Param("buildingId") String buildingId,
@Param("dataCom") String dataCom);
//查询通讯编号是否存在 //查询通讯编号是否存在
@Select("select count(*) from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_name = #{buildingName} ") @Select("select count(*) from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_name = #{buildingName} ")
@ -315,8 +329,16 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("id") Long id); @Param("id") Long id);
//查询最后一次采集时间 //查询最后一次采集时间
@Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}") @Select("<script>"+
String selectLastDate(@Param("deviceType") String deviceType,@Param("deviceAddr") String deviceAddr,@Param("buildingId") String buildingId); "select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId} "+
"<if test='dataCom != null and dataCom != \"\"'>" +
" and data_com=#{dataCom}" +
"</if>" +
"</script>")
String selectLastDate(@Param("deviceType") String deviceType,
@Param("deviceAddr") String deviceAddr,
@Param("buildingId") String buildingId,
@Param("dataCom") String dataCom);
//判断某栋楼是否有热泵设备 //判断某栋楼是否有热泵设备
@Select("select count(*) from device_install where device_type='热泵' and building_id=#{buildingId} ") @Select("select count(*) from device_install where device_type='热泵' and building_id=#{buildingId} ")

32
user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java

@ -32,6 +32,7 @@ public interface NowDataMapper {
" <if test='tankId!=null and tankId != \"\"'> , tank_id = #{tankId} </if>" + " <if test='tankId!=null and tankId != \"\"'> , tank_id = #{tankId} </if>" +
" <if test='tankName!=null and tankName != \"\"'> , tank_name = #{tankName} </if>" + " <if test='tankName!=null and tankName != \"\"'> , tank_name = #{tankName} </if>" +
" where building_id = #{buildingId} and pump_id = #{pumpId} " + " where building_id = #{buildingId} and pump_id = #{pumpId} " +
" <if test='pumpName!=null and pumpName != \"\"'> and pump_name = #{pumpName} </if>" +
"</script>") "</script>")
void updateNowData(NowDataEntity nowDataEntity); void updateNowData(NowDataEntity nowDataEntity);
@ -190,13 +191,19 @@ public interface NowDataMapper {
int buildWaterLevelCount(@Param("curDate") String curDate); int buildWaterLevelCount(@Param("curDate") String curDate);
//判断实时表有没有记录(热泵) //判断实时表有没有记录(热泵)
@Select("select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") @Select("<script>"+
int selectNowDataCount(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); "select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId} "+
"<if test='pumpName != null and pumpName != \"\"'>" +
" and pump_name=#{pumpName}" +
"</if>" +
"</script>")
int selectNowDataCount(@Param("buildingId") String buildingId, @Param("pumpId") String pumpId,
@Param("pumpName") String pumpName);
//查询实时表记录(热泵) //查询实时表记录(热泵)
@ResultMap(value = "rs") @ResultMap(value = "rs")
@Select("select * from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") @Select("select top 1 * from now_data where building_id=#{buildingId} and pump_id=#{pumpId} and pump_name = #{pumpName}")
NowDataEntity selectNowData(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); NowDataEntity selectNowData(@Param("buildingId") String buildingId, @Param("pumpId") String pumpId, @Param("pumpName") String deviceName);
//判断实时表有没有记录(非热泵) //判断实时表有没有记录(非热泵)
@Select("select count(*) from now_data where building_id=#{buildingId} ") @Select("select count(*) from now_data where building_id=#{buildingId} ")
@ -257,9 +264,12 @@ public interface NowDataMapper {
int selectStateCount(@Param("buildingId") String buildingId); int selectStateCount(@Param("buildingId") String buildingId);
//求热泵状态运行 //求热泵状态运行
@Select("select run_state from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") @Select("select run_state from now_data where building_id=#{buildingId} and pump_id=#{pumpId} ")
String selectState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); String selectState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId);
@Select("select top 1 run_state from now_data where building_id=#{buildingId} and pump_id=#{pumpId} and pump_name = #{pumpName} ")
String selectStateByPumpName(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId, @Param("pumpName") String pumpName);
//更新设置水位值 //更新设置水位值
@Update("update now_data set level_set=#{levelSet},cur_date=getDate() where building_id=#{buildingId}") @Update("update now_data set level_set=#{levelSet},cur_date=getDate() where building_id=#{buildingId}")
void upLevelSet(@Param("buildingId") String buildingId,@Param("levelSet") String levelSet); void upLevelSet(@Param("buildingId") String buildingId,@Param("levelSet") String levelSet);
@ -355,8 +365,16 @@ public interface NowDataMapper {
@Param("dataStr") String dataStr); @Param("dataStr") String dataStr);
//在没有接收到返回值前设置监控界面热泵是否离线 //在没有接收到返回值前设置监控界面热泵是否离线
@Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}") @Update("<script>" +
void updateRunState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId,@Param("strState") String strState); "update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId} " +
"<if test='pumpName!=null and pumpName!=\"\"'>" +
" and pump_name=#{pumpName} " +
"</if>" +
"</script>")
void updateRunState(@Param("buildingId") String buildingId,
@Param("pumpId") String pumpId,
@Param("strState") String strState,
@Param("pumpName") String pumpName);
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
@Select("exec pro_pumpMinutes #{buildingId,jdbcType=VARCHAR,mode=IN}, #{pumpId,jdbcType=VARCHAR,mode=IN},#{runState,jdbcType=VARCHAR,mode=IN}") @Select("exec pro_pumpMinutes #{buildingId,jdbcType=VARCHAR,mode=IN}, #{pumpId,jdbcType=VARCHAR,mode=IN},#{runState,jdbcType=VARCHAR,mode=IN}")

2
user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java

@ -61,7 +61,7 @@ public class HeartBeatServerHandler extends IdleStateHandler {
String receiveStr = ExchangeStringUtil.bytesToHexString(msg); String receiveStr = ExchangeStringUtil.bytesToHexString(msg);
// 判断当前报文是否是登录报文 // 判断当前报文是否是登录报文
if (receiveStr != null && receiveStr.startsWith("2400")) { if (receiveStr != null && receiveStr.startsWith("2400")) {
if (receiveStr.length() != 8) { if (receiveStr.length() != 8 && receiveStr.length() != 10) {
super.channelRead(ctx, msg); super.channelRead(ctx, msg);
return; return;
} }

6
user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java

@ -35,6 +35,12 @@ public class LoginRequestHandler extends ChannelInboundHandlerAdapter {
super.channelRead(ctx, msg); super.channelRead(ctx, msg);
return; return;
} }
// 两个特殊的心跳包
if (receiveStr.startsWith("2400600100") || receiveStr.startsWith("2400600101")) {
receiveStr = receiveStr.substring(0, 10);
} else {
receiveStr = receiveStr.substring(0, 8);
}
// 判断当前报文是否是心跳包上线: 869530073040186 // 判断当前报文是否是心跳包上线: 869530073040186
log.info("接收到的心跳报文 <== {}", receiveStr); log.info("接收到的心跳报文 <== {}", receiveStr);
// 通过对应的心跳包码进行判断,然后更新网关在线情况 // 通过对应的心跳包码进行判断,然后更新网关在线情况

4
user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java

@ -120,7 +120,7 @@ public class SendAndReceiveByCom {
if (bytes == null) { if (bytes == null) {
SerialTool.closePort(serialPort); SerialTool.closePort(serialPort);
log.info("串口{}没有数据返回!{}", serialPort.getName(), i); log.info("串口{}没有数据返回!{}", serialPort.getName(), i);
SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService); SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, comName);
} }
// 处理返回来的数据报文 // 处理返回来的数据报文
dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, device, null); dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, device, null);
@ -189,7 +189,7 @@ public class SendAndReceiveByCom {
if (deviceType.equals("热泵")) { if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr); String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据 if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态
} }
} }
// 解析返回来的数据 // 解析返回来的数据

18
user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java

@ -11,8 +11,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import purejavacomm.SerialPort; import purejavacomm.SerialPort;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -115,10 +113,10 @@ public class SerialPortSendReceive2 {
if (bytes == null) { if (bytes == null) {
SerialTool.closePort(serialPort); SerialTool.closePort(serialPort);
log.info("串口" + serialPort.getName() + "没有数据返回!" + i); log.info("串口" + serialPort.getName() + "没有数据返回!" + i);
SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService); SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, comName);
} }
// 处理返回来的数据报文 // 处理返回来的数据报文
dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes); dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, comName);
try { try {
SerialTool.closePort(serialPort); SerialTool.closePort(serialPort);
log.info("关闭串口==" + serialPort.getName()); log.info("关闭串口==" + serialPort.getName());
@ -133,6 +131,7 @@ public class SerialPortSendReceive2 {
/** /**
* 处理返回来的数据 * 处理返回来的数据
*
* @param dateStr * @param dateStr
* @param serialPort * @param serialPort
* @param i * @param i
@ -143,6 +142,7 @@ public class SerialPortSendReceive2 {
* @param buildingId * @param buildingId
* @param buildingName * @param buildingName
* @param bytes * @param bytes
* @param comName
* @throws InterruptedException * @throws InterruptedException
*/ */
private void dealReceiveData(String dateStr, private void dealReceiveData(String dateStr,
@ -153,7 +153,7 @@ public class SerialPortSendReceive2 {
String registerAddr, String registerAddr,
String brand, String brand,
String buildingId, String buildingId,
String buildingName, byte[] bytes) { String buildingName, byte[] bytes, String comName) {
try { try {
String receiveStr = ""; String receiveStr = "";
receiveStr = ExchangeStringUtil.parseByte2HexStr(bytes); receiveStr = ExchangeStringUtil.parseByte2HexStr(bytes);
@ -177,11 +177,11 @@ public class SerialPortSendReceive2 {
if (deviceType.equals("热泵")) { if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr); String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据 if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态
} }
} }
// 解析返回来的数据 // 解析返回来的数据
analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName); analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName, comName);
} catch (Exception e) { } catch (Exception e) {
log.error("楼栋:" + buildingName + "设备类型:" + deviceType + "保存数据库失败!" + i,e); log.error("楼栋:" + buildingName + "设备类型:" + deviceType + "保存数据库失败!" + i,e);
} }
@ -195,7 +195,7 @@ public class SerialPortSendReceive2 {
String dataStr, String dataStr,
AnalysisReceiveOrder485 analysisReceiveOrder485, AnalysisReceiveOrder485 analysisReceiveOrder485,
NowDataService nowDataService, NowDataService nowDataService,
String buildingName) { String buildingName, String comName) {
if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
analysisReceiveOrder485.analysisMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName); analysisReceiveOrder485.analysisMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { } else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
@ -203,7 +203,7 @@ public class SerialPortSendReceive2 {
} else if (deviceType.equals("压变")) { } else if (deviceType.equals("压变")) {
analysisReceiveOrder485.analysisPressureOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName); analysisReceiveOrder485.analysisPressureOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵")) { } else if (deviceType.equals("热泵")) {
analysisReceiveOrder485.analysisPumpOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName); analysisReceiveOrder485.analysisPumpOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName, comName);
} else if (deviceType.equals("温控")) { } else if (deviceType.equals("温控")) {
analysisReceiveOrder485.analysisTempOrder485(dataStr, registerAddr, brand, buildingId, buildingName); analysisReceiveOrder485.analysisTempOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("时控")) { } else if (deviceType.equals("时控")) {

2
user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java

@ -140,7 +140,7 @@ public class SerialPortSingle2 {
if (deviceType.equals("热泵")) { if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr); String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据 if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态
} }
} }
// try { // try {

9
user-service/src/main/java/com/mh/user/service/DeviceInstallService.java

@ -1,12 +1,7 @@
package com.mh.user.service; package com.mh.user.service;
import com.mh.user.entity.*; import com.mh.user.entity.*;
import com.mh.user.mapper.provider.DeviceInstallProvider;
import com.mh.user.model.DeviceModel; import com.mh.user.model.DeviceModel;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.Update;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -84,7 +79,7 @@ public interface DeviceInstallService {
void updateOnline(String deviceAddr,String deviceType,String buildingId,String isOnline); void updateOnline(String deviceAddr,String deviceType,String buildingId,String isOnline);
// 修改设备离线状态 // 修改设备离线状态
void updateNotOnline(String deviceAddr,String deviceType,String buildingId,String isOnline); void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline, String dataCom);
//根据通讯地址和设备类型查询对应的设备信息 //根据通讯地址和设备类型查询对应的设备信息
DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId); DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId);
@ -156,7 +151,7 @@ public interface DeviceInstallService {
void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue, Long id); void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue, Long id);
//查询最后一次采集时间 //查询最后一次采集时间
String selectLastDate(String deviceType,String deviceAddr,String buildingId); String selectLastDate(String deviceType, String deviceAddr, String buildingId, String dataCom);
//判断某栋楼是否有热泵设备 //判断某栋楼是否有热泵设备
int judgePump(String buildingId); int judgePump(String buildingId);

10
user-service/src/main/java/com/mh/user/service/NowDataService.java

@ -4,8 +4,6 @@ import com.mh.user.annotation.SysLogger;
import com.mh.user.entity.*; import com.mh.user.entity.*;
import com.mh.user.model.MultiControlModel; import com.mh.user.model.MultiControlModel;
import com.mh.user.model.WaterLevelModel; import com.mh.user.model.WaterLevelModel;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -16,13 +14,13 @@ public interface NowDataService {
void saveNowData(NowDataEntity nowDataEntity); void saveNowData(NowDataEntity nowDataEntity);
//保存热泵相关数据 //保存热泵相关数据
void saveNowHistoryData(String pumpId,String deviceType,String strData,String dataType,String buildingId); void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom);
//非热泵保存数据 //非热泵保存数据
void saveNowHistoryData2(String deviceAddr,String deviceType,String strData,String dataType,String buildingId); void saveNowHistoryData2(String deviceAddr,String deviceType,String strData,String dataType,String buildingId);
//非热泵温度变送器相关数据 //非热泵温度变送器相关数据
void saveNowHistoryData3(String pumpId,String deviceType,String strData,String dataType,String buildingId); void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId, String deviceName);
//修改监控界面实时信息 //修改监控界面实时信息
void updateNowData(NowDataEntity nowDataEntity); void updateNowData(NowDataEntity nowDataEntity);
@ -115,7 +113,7 @@ public interface NowDataService {
void proWaterLevel(String curDate,String buildingID, String deviceAddr); void proWaterLevel(String curDate,String buildingID, String deviceAddr);
//在没有接收到返回值前设置监控界面热泵是否离线 //在没有接收到返回值前设置监控界面热泵是否离线
void updateRunState(String buildingId,String pumpId,String strState, String buildingName); void updateRunState(String buildingId, String pumpId, String strState, String buildingName, String dataCom);
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
void proPumpMinutes(String buildingId,String pumpId,String runState); void proPumpMinutes(String buildingId,String pumpId,String runState);
@ -162,5 +160,7 @@ public interface NowDataService {
void updateMultiNowData(NowDataEntity nowDataEntity); void updateMultiNowData(NowDataEntity nowDataEntity);
void proWaterPressure(String dateStr, String buildingId, String buildingName, String registerAddr, String otherName, String dataStr); void proWaterPressure(String dateStr, String buildingId, String buildingName, String registerAddr, String otherName, String dataStr);
String selectStateByPumpName(String buildingId, String deviceAddr, String deviceName);
} }

4
user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java

@ -71,7 +71,7 @@ public class DataResultServiceImpl implements DataResultService {
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice( DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(
dataResultEntity.getDeviceAddr(), dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(), dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId()); dataResultEntity.getBuildingId(), null);
if (deviceInstallEntity == null) { if (deviceInstallEntity == null) {
logger.warn("saveDataResult: deviceInstallEntity is null for addr={}, type={}, building={}", logger.warn("saveDataResult: deviceInstallEntity is null for addr={}, type={}, building={}",
@ -150,7 +150,7 @@ public class DataResultServiceImpl implements DataResultService {
DeviceInstallEntity latestDeviceInstall = deviceInstallMapper.selectDevice( DeviceInstallEntity latestDeviceInstall = deviceInstallMapper.selectDevice(
dataResultEntity.getDeviceAddr(), dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(), dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId()); dataResultEntity.getBuildingId(), null);
if (latestDeviceInstall != null) { if (latestDeviceInstall != null) {
DataResultEntity existingData = dataResultMapper.selectDataResult( DataResultEntity existingData = dataResultMapper.selectDataResult(

8
user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java

@ -232,6 +232,11 @@ public class DeviceControlServiceImpl implements DeviceControlService {
if (Constant.WRITE.equals(type)) { if (Constant.WRITE.equals(type)) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
log.info("写入设备返回值==>{}", rtData); log.info("写入设备返回值==>{}", rtData);
// 如果是热泵在发送读取指令
if (!StringUtils.isBlank(brand) && Constant.BRAND_ZHENG_DI.equals(brand)) {
deviceCodeParam.setFunCode("03");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
}
// 如果是瑞星泵,需要在发送启动指令 // 如果是瑞星泵,需要在发送启动指令
if (!StringUtils.isBlank(brand) && brand.equals("瑞星") if (!StringUtils.isBlank(brand) && brand.equals("瑞星")
&& (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2")) && (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2"))
@ -789,6 +794,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
} else if ("海尔2".equals(deviceCodeParam.getBrand())) { } else if ("海尔2".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setFunCode("04"); //功能码读数据 deviceCodeParam.setFunCode("04"); //功能码读数据
deviceCodeParam.setRegisterAddr(ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex("1302"), 4)); deviceCodeParam.setRegisterAddr(ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex("1302"), 4));
} else if (Constant.BRAND_ZHENG_DI.equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr(deviceCodeParam.getRegisterAddr()); //功能码写数据
} else { } else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
} }
@ -814,6 +821,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); //功能码写数据 deviceCodeParam.setFunCode("06"); //功能码写数据
} else if (Constant.BRAND_ZHENG_DI.equals(deviceCodeParam.getBrand())) { } else if (Constant.BRAND_ZHENG_DI.equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setFunCode("06"); //功能码写数据 deviceCodeParam.setFunCode("06"); //功能码写数据
return rtData;
} else { } else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
deviceCodeParam.setFunCode("06"); //功能码写数据 deviceCodeParam.setFunCode("06"); //功能码写数据

11
user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java

@ -20,7 +20,6 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
@Slf4j @Slf4j
@ -370,14 +369,14 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
} }
@Override @Override
public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline) { public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline, String dataCom) {
deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline); deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline, dataCom);
} }
//根据通讯地址和设备类型查询对应的设备信息 //根据通讯地址和设备类型查询对应的设备信息
@Override @Override
public DeviceInstallEntity selectDevice(String deviceAddr, String deviceType, String buildingId) { public DeviceInstallEntity selectDevice(String deviceAddr, String deviceType, String buildingId) {
return deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId); return deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId, null);
} }
@Override @Override
@ -519,8 +518,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
} }
@Override @Override
public String selectLastDate(String deviceType, String deviceAddr, String buildingId) { public String selectLastDate(String deviceType, String deviceAddr, String buildingId, String dataCom) {
return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId); return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId, dataCom);
} }
@Override @Override

29
user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java

@ -139,7 +139,7 @@ public class NowDataServiceImpl implements NowDataService {
//保存热泵采集数据 //保存热泵采集数据
@Override @Override
public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId) { public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(); Date date = new Date();
String strDate = sdf1.format(date); String strDate = sdf1.format(date);
@ -157,7 +157,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setIsFault(strData); data.setIsFault(strData);
} }
//从安装表获取设备信息 //从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId); DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId, dataCom);
//获取对应水箱信息 //获取对应水箱信息
DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId); DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId);
if (tank != null) { if (tank != null) {
@ -166,7 +166,7 @@ public class NowDataServiceImpl implements NowDataService {
} }
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName = buildingService.queryBuildingName(buildingId);
//判断实时表是否有记录 //判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录
if (r1 == 0) { if (r1 == 0) {
data.setPumpId(pumpId); //通讯地址 data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
@ -174,7 +174,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} else { } else {
NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId); NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId, deviceInstallEntity.getDeviceName());
if (data1 != null) { if (data1 != null) {
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")) { //温度设定
data1.setTempSet(strData); data1.setTempSet(strData);
@ -248,7 +248,7 @@ public class NowDataServiceImpl implements NowDataService {
break; break;
} }
//从安装表获取设备信息 //从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId); // DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId, dataCom);
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName = buildingService.queryBuildingName(buildingId);
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
// 获取项目名称 // 获取项目名称
@ -336,7 +336,7 @@ public class NowDataServiceImpl implements NowDataService {
//非热泵温度变送器、状态检测相关数据 //非热泵温度变送器、状态检测相关数据
@Override @Override
public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId) { public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId, String deviceName) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(); Date date = new Date();
String strDate = sdf1.format(date); String strDate = sdf1.format(date);
@ -359,7 +359,7 @@ public class NowDataServiceImpl implements NowDataService {
} }
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName = buildingService.queryBuildingName(buildingId);
//判断实时表是否有记录 //判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceName);//判断now_data表是否存在记录
if (r1 == 0) { if (r1 == 0) {
data.setPumpId(pumpId); //热泵编号 data.setPumpId(pumpId); //热泵编号
String pumpName = "热泵" + pumpId; String pumpName = "热泵" + pumpId;
@ -368,7 +368,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} else { } else {
NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId); NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId, deviceName);
if (data1 != null) { if (data1 != null) {
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")) { //温度设定
data1.setTempSet(strData); data1.setTempSet(strData);
@ -655,6 +655,11 @@ public class NowDataServiceImpl implements NowDataService {
return nowDataMapper.selectState(buildingId, pumpId); return nowDataMapper.selectState(buildingId, pumpId);
} }
@Override
public String selectStateByPumpName(String buildingId, String pumpId, String pumpName) {
return nowDataMapper.selectStateByPumpName(buildingId, pumpId, pumpName);
}
@Override @Override
public void upLevelSet(String buildingId, String levelSet) { public void upLevelSet(String buildingId, String levelSet) {
nowDataMapper.upLevelSet(buildingId, levelSet); nowDataMapper.upLevelSet(buildingId, levelSet);
@ -762,10 +767,10 @@ public class NowDataServiceImpl implements NowDataService {
} }
@Override @Override
public void updateRunState(String buildingId, String pumpId, String strState, String buildingName) { public void updateRunState(String buildingId, String pumpId, String strState, String buildingName, String dataCom) {
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId); DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId, dataCom);
NowDataEntity data = new NowDataEntity(); NowDataEntity data = new NowDataEntity();
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录
if (r1 == 0) { if (r1 == 0) {
data.setPumpId(pumpId); //通讯地址 data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
@ -774,7 +779,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setRunState(strState); data.setRunState(strState);
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} }
nowDataMapper.updateRunState(buildingId, pumpId, strState); nowDataMapper.updateRunState(buildingId, pumpId, strState, deviceInstallEntity.getDeviceName());
} }
@Override @Override

2
user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java

@ -229,7 +229,7 @@ public class HeatPumpStatusStrategy implements DeviceStrategy {
addr = entry.getKey(); //获取Key值作为热泵ID addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue(); runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) { if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, deviceCodeParamEntity.getDeviceName());
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);

19
user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java

@ -7,10 +7,7 @@ import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.NowPublicDataEntity; import com.mh.user.entity.NowPublicDataEntity;
import com.mh.user.service.*; import com.mh.user.service.*;
import com.mh.user.utils.ExchangeStringUtil; import com.mh.user.utils.*;
import com.mh.user.utils.SpringBeanUtil;
import com.mh.user.utils.XK814ModbusParamReadUtil;
import com.mh.user.utils.XK814ModbusParamWriteUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -220,7 +217,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
} }
} else if (Constant.BRAND_ZHENG_DI.equals(brand)) { } else if (Constant.BRAND_ZHENG_DI.equals(brand)) {
if (StringUtils.isBlank(funCode) || funCode.equals("03")) { if (StringUtils.isBlank(funCode) || funCode.equals("03")) {
str = str + funCode + registerAddr + "0002"; str = str + funCode + registerAddr + "0001";
} else if ("06".equals(funCode)) { } else if ("06".equals(funCode)) {
str = XK814ModbusParamWriteUtil.buildWriteSingleRegisterMessage(Integer.parseInt(deviceAddr), registerAddr, dataValue); str = XK814ModbusParamWriteUtil.buildWriteSingleRegisterMessage(Integer.parseInt(deviceAddr), registerAddr, dataValue);
return str.toUpperCase(); return str.toUpperCase();
@ -294,7 +291,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
rtData = getZhengDi(dateStr, registerAddr, buildingId, buildingName, checkStr, sValue, addr, dataType, deviceCodeParamEntity); rtData = getZhengDi(dateStr, registerAddr, buildingId, buildingName, checkStr, sValue, addr, dataType, deviceCodeParamEntity);
} }
if (!StringUtils.isBlank(rtData)) { if (!StringUtils.isBlank(rtData)) {
nowDataService.saveNowHistoryData(addr, "热泵", rtData, dataType.toString(), buildingId); nowDataService.saveNowHistoryData(addr, "热泵", rtData, dataType.toString(), buildingId, deviceCodeParamEntity.getDataCom());
log.info("时间: " + dateStr + "热泵ID:" + addr + ",数据: " + rtData + ",保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + "热泵ID:" + addr + ",数据: " + rtData + ",保存数据库成功!楼栋名称:" + buildingName);
} }
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化
@ -314,6 +311,10 @@ public class HeatPumpStrategy implements DeviceStrategy {
// 根据字节数计算寄存器数量(每个寄存器2字节) // 根据字节数计算寄存器数量(每个寄存器2字节)
int registerCount = byteCount / 2; int registerCount = byteCount / 2;
if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;
}
// 遍历所有寄存器数据 // 遍历所有寄存器数据
for (int i = 0; i < registerCount; i++) { for (int i = 0; i < registerCount; i++) {
// 提取寄存器值(每4个字符代表一个寄存器) // 提取寄存器值(每4个字符代表一个寄存器)
@ -323,8 +324,8 @@ public class HeatPumpStrategy implements DeviceStrategy {
// 计算寄存器地址 // 计算寄存器地址
String regAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4).toUpperCase(); String regAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4).toUpperCase();
// 使用 XK814ModbusParserUtil 解析 // 使用 XK814ModbusParamReadIntoDBUtil 解析
Object parsedValue = XK814ModbusParamReadUtil.parse(regAddr, value); Object parsedValue = XK814ModbusParamReadIntoDBUtil.parse(regAddr, value);
if (parsedValue != null) { if (parsedValue != null) {
log.info("正帝热泵解析 - 地址: {}, 原始值: {}, 解析结果: {}", regAddr, value, parsedValue); log.info("正帝热泵解析 - 地址: {}, 原始值: {}, 解析结果: {}", regAddr, value, parsedValue);
@ -943,7 +944,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
return null; return null;
} }
if (!StringUtils.isBlank(sValue)) { if (!StringUtils.isBlank(sValue)) {
nowDataService.saveNowHistoryData(deviceInstallEntity.getDeviceAddr(), "热泵", sValue, dataType.toString(), deviceInstallEntity.getBuildingId()); nowDataService.saveNowHistoryData(deviceInstallEntity.getDeviceAddr(), "热泵", sValue, dataType.toString(), deviceInstallEntity.getBuildingId(), deviceInstallEntity.getDataCom());
log.info("时间: " + dateStr + "热泵ID:" + deviceInstallEntity.getDeviceAddr() + ",数据: " + dataStr + ",保存数据库成功!楼栋名称:" + deviceInstallEntity.getBuildingName()); log.info("时间: " + dateStr + "热泵ID:" + deviceInstallEntity.getDeviceAddr() + ",数据: " + dataStr + ",保存数据库成功!楼栋名称:" + deviceInstallEntity.getBuildingName());
} }
return sValue; return sValue;

2
user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java

@ -103,7 +103,7 @@ public class TempTransStrategy implements DeviceStrategy {
addr = entry.getKey(); addr = entry.getKey();
data = entry.getValue(); data = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) { if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, deviceCodeParamEntity.getDeviceName());
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
} }
} }

2
user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java

@ -359,7 +359,7 @@ public class WaterLevelSwitchStrategy implements DeviceStrategy {
addr = entry.getKey(); //获取Key值作为热泵ID addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue(); runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) { if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null);
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);

17
user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java

@ -61,6 +61,7 @@ public class SendAndReceiveByTcp {
String brand = deviceManageEntityList.get(i).getBrand();//品牌 String brand = deviceManageEntityList.get(i).getBrand();//品牌
String buildingId = deviceManageEntityList.get(i).getBuildingId(); String buildingId = deviceManageEntityList.get(i).getBuildingId();
String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称 String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称
String dataCom = deviceManageEntityList.get(i).getDataCom();
// 创建设备报文 // 创建设备报文
Device device = DeviceFactory.createDevice(deviceType); Device device = DeviceFactory.createDevice(deviceType);
DeviceStrategy strategy = DeviceStrategyFactory.createStrategy(deviceType); DeviceStrategy strategy = DeviceStrategyFactory.createStrategy(deviceType);
@ -110,7 +111,7 @@ public class SendAndReceiveByTcp {
String dateStr = DateUtil.dateToString(date1, "yyyy-MM-dd HH:mm:ss"); String dateStr = DateUtil.dateToString(date1, "yyyy-MM-dd HH:mm:ss");
if (StringUtils.isBlank(receiveMsg)) { if (StringUtils.isBlank(receiveMsg)) {
log.info("TCP客户端:{},没有数据返回!{}", keyVal, i); log.info("TCP客户端:{},没有数据返回!{}", keyVal, i);
printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService); printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, dataCom);
continue; continue;
} }
// 处理返回来的数据报文 // 处理返回来的数据报文
@ -128,17 +129,17 @@ public class SendAndReceiveByTcp {
} }
} }
public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService) { public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService, String dataCom) {
log.info("----------------{}离线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName); log.info("----------------{}离线,设备号:{},所属楼栋:{},端口号:{}----------------", deviceType, deviceAddr, buildingName, dataCom);
String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId); String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId, dataCom);
if (time1 == null) { if (time1 == null) {
time1 = dateStr; time1 = dateStr;
} }
int d = ExchangeStringUtil.compareCopyTime(time1, dateStr); int d = ExchangeStringUtil.compareCopyTime(time1, dateStr);
if (d == 1) { if (d == 1) {
deviceInstallService.updateNotOnline(deviceAddr, deviceType, buildingId, "离线"); //所有设备离线 deviceInstallService.updateNotOnline(deviceAddr, deviceType, buildingId, "离线", dataCom); //所有设备离线
if (deviceType.equals("热泵")) { if (deviceType.equals("热泵")) {
nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName, dataCom); //监控界面状态表热泵在线状态
} }
} }
return; return;
@ -187,9 +188,9 @@ public class SendAndReceiveByTcp {
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
log.info("----------------{}在线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName); log.info("----------------{}在线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName);
if (deviceType.equals("热泵")) { if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr); String strState = nowDataService.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName());
if (strState != null && strState.equals("离线")) { //采集到数据 if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态
} }
} }
// 解析返回来的数据 // 解析返回来的数据

9
user-service/src/main/java/com/mh/user/tcp/TcpSingle.java

@ -8,7 +8,6 @@ import com.mh.user.factory.Device;
import com.mh.user.factory.DeviceFactory; import com.mh.user.factory.DeviceFactory;
import com.mh.user.netty.session.ServerSession; import com.mh.user.netty.session.ServerSession;
import com.mh.user.netty.session.SessionMap; import com.mh.user.netty.session.SessionMap;
import com.mh.user.serialport.SerialTool;
import com.mh.user.service.BuildingService; import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceInstallService; import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService; import com.mh.user.service.NowDataService;
@ -17,16 +16,12 @@ import com.mh.user.strategy.DeviceStrategyFactory;
import com.mh.user.utils.*; import com.mh.user.utils.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import purejavacomm.SerialPort;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import static com.mh.user.tcp.SendAndReceiveByTcp.printLog;
/** /**
* @author nxr * @author nxr
* @title * @title
@ -107,9 +102,9 @@ public class TcpSingle {
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
log.info("{}在线,设备号:{},所属楼栋:{}", deviceType, deviceAddr, buildingName); log.info("{}在线,设备号:{},所属楼栋:{}", deviceType, deviceAddr, buildingName);
if (deviceType.equals("热泵")) { if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr); String strState = nowDataService.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName());
if (strState != null && strState.equals("离线")) { //采集到数据 if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态
} }
} }
rtData = device.analysisReceiveData(DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"), rtData = device.analysisReceiveData(DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"),

48
user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java

@ -263,7 +263,7 @@ public class AnalysisReceiveOrder485 {
} }
// 热泵 // 热泵
public void analysisPumpOrder485(final String dateStr,final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { public void analysisPumpOrder485(final String dateStr, final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName, String comName) {
String checkStr = receiveData.substring(0, receiveData.length() - 4);//检验报文 String checkStr = receiveData.substring(0, receiveData.length() - 4);//检验报文
String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码
String sValue = null; String sValue = null;
@ -294,7 +294,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue); nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName); log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) { } else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) {
//0642设定温度,0007水箱水温 //0642设定温度,0007水箱水温
@ -321,7 +321,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) { } else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("热泵ID:" + addr + ",数据:" + sValue + ",保存数据库成功!楼栋名称:" + buildingName); log.info("热泵ID:" + addr + ",数据:" + sValue + ",保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态 } else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态
dataType = "isFault"; dataType = "isFault";
@ -334,7 +334,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障"; sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵"); deviceInstallService.updateDeviceFault("1", addr, "热泵");
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName); log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName);
} }
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
@ -366,7 +366,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue); nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) { } else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) {
//0003设定温度,0064水箱水温 //0003设定温度,0064水箱水温
@ -394,7 +394,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) { } else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("热泵ID: " + addr + ",数据: " + sValue + ",保存数据库成功!楼栋编号:" + buildingId); log.info("热泵ID: " + addr + ",数据: " + sValue + ",保存数据库成功!楼栋编号:" + buildingId);
} else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态 } else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态
dataType = "isFault"; dataType = "isFault";
@ -405,7 +405,7 @@ public class AnalysisReceiveOrder485 {
} else if (sData.substring(7, 8).equalsIgnoreCase("1")) { } else if (sData.substring(7, 8).equalsIgnoreCase("1")) {
sValue = "有故障"; sValue = "有故障";
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} }
} else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) { } else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
@ -424,7 +424,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue); nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) { } else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) {
//000A设定温度,0046水箱水温 //000A设定温度,0046水箱水温
@ -453,7 +453,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) { } else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态 } else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态
dataType = "isFault"; dataType = "isFault";
@ -466,7 +466,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障"; sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵"); deviceInstallService.updateDeviceFault("1", addr, "热泵");
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0028") } else if (registerAddr.equalsIgnoreCase("0028")
|| registerAddr.equalsIgnoreCase("002C") || registerAddr.equalsIgnoreCase("002C")
@ -486,7 +486,7 @@ public class AnalysisReceiveOrder485 {
log.info("----------------保存楼栋时间点温度变化值!----------------"); log.info("----------------保存楼栋时间点温度变化值!----------------");
} }
public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) { public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName, String comName) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(); Date date = new Date();
String dateStr = sdf1.format(date); String dateStr = sdf1.format(date);
@ -519,7 +519,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue); nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) { } else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) {
//0642设定温度,0007水箱水温 //0642设定温度,0007水箱水温
@ -540,7 +540,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) { } else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态 } else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态
dataType = "isFault"; dataType = "isFault";
@ -553,7 +553,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障"; sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵"); deviceInstallService.updateDeviceFault("1", addr, "热泵");
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0656") } else if (registerAddr.equalsIgnoreCase("0656")
|| registerAddr.equalsIgnoreCase("065A") || registerAddr.equalsIgnoreCase("065A")
@ -593,7 +593,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue); nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) { } else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) {
//0003设定温度,0064水箱水温 //0003设定温度,0064水箱水温
@ -614,7 +614,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) { } else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态 } else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态
dataType = "isFault"; dataType = "isFault";
@ -625,7 +625,7 @@ public class AnalysisReceiveOrder485 {
} else if (sData.substring(7, 8).equalsIgnoreCase("1")) { } else if (sData.substring(7, 8).equalsIgnoreCase("1")) {
sValue = "有故障"; sValue = "有故障";
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0656") } else if (registerAddr.equalsIgnoreCase("0656")
|| registerAddr.equalsIgnoreCase("065A") || registerAddr.equalsIgnoreCase("065A")
@ -652,7 +652,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue); nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) { } else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) {
//000A设定温度,0046水箱水温 //000A设定温度,0046水箱水温
@ -674,7 +674,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) { } else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态 } else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态
dataType = "isFault"; dataType = "isFault";
@ -687,7 +687,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障"; sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵"); deviceInstallService.updateDeviceFault("1", addr, "热泵");
} }
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0028") } else if (registerAddr.equalsIgnoreCase("0028")
|| registerAddr.equalsIgnoreCase("002C") || registerAddr.equalsIgnoreCase("002C")
@ -748,7 +748,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey(); addr = entry.getKey();
data = entry.getValue(); data = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) { if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, null);
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
} }
} }
@ -803,7 +803,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey(); addr = entry.getKey();
data = entry.getValue(); data = entry.getValue();
if (addr != null && Integer.valueOf(addr) <= count) { if (addr != null && Integer.valueOf(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, null);
nowDataService.proWaterTemp(dateStr, buildingId, addr);//保存时间点温度 nowDataService.proWaterTemp(dateStr, buildingId, addr);//保存时间点温度
} }
} }
@ -1388,7 +1388,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey(); //获取Key值作为热泵ID addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue(); runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) { if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null);
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);
@ -1542,7 +1542,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey(); //获取Key值作为热泵ID addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue(); runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) { if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null);
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);
} }

312
user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java

@ -0,0 +1,312 @@
package com.mh.user.utils;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 正帝热泵协议解析保存到数据库的值
* @date 2026-05-25 17:15:42
*/
public class XK814ModbusParamReadIntoDBUtil {
/**
* XK814 冷热水机 Modbus 协议 V1.0 解析器第三张表
* 地址范围A000 ~ B009, AFFF
*/
// ==================== 地址常量(字符串格式)====================
public static final String ADDR_DISPLAY_WATER_TEMP = "A000"; // 40960
public static final String ADDR_TANK_TEMP = "A001"; // 40961
public static final String ADDR_OUTLET_TEMP = "A002"; // 40962
public static final String ADDR_INLET_TEMP = "A003"; // 40963
public static final String ADDR_AMBIENT_TEMP = "A004"; // 40964
public static final String ADDR_COIL1_TEMP = "A005"; // 40965
public static final String ADDR_SUCTION1_TEMP = "A006"; // 40966
public static final String ADDR_EXHAUST1_TEMP = "A007"; // 40967
public static final String ADDR_VALVE_AFTER1_OR_RETURN = "A008"; // 40968
public static final String ADDR_RESERVED_A009 = "A009";
public static final String ADDR_RESERVED_A00A = "A00A";
public static final String ADDR_MAIN_EXP_VALVE1_OPEN = "A00B"; // 40971
public static final String ADDR_AUX_EXP_VALVE1_OPEN = "A00C"; // 40972
public static final String ADDR_COMP1_CURRENT = "A00D"; // 40973
public static final String ADDR_COIL2_TEMP = "A00E"; // 40974
public static final String ADDR_SUCTION2_TEMP = "A00F"; // 40975
public static final String ADDR_EXHAUST2_TEMP = "A010"; // 40976
public static final String ADDR_VALVE_AFTER2_TEMP = "A011"; // 40977
public static final String ADDR_RESERVED_A012 = "A012";
public static final String ADDR_RESERVED_A013 = "A013";
public static final String ADDR_MAIN_EXP_VALVE2_OPEN = "A014"; // 40980
public static final String ADDR_AUX_EXP_VALVE2_OPEN = "A015"; // 40981
public static final String ADDR_COMP2_CURRENT = "A016"; // 40982
public static final String ADDR_RECOVERABLE_FAULT = "A017"; // 40983
public static final String ADDR_UNRECOVERABLE_FAULT = "A018"; // 40984
public static final String ADDR_VERSION_INFO = "A019"; // 40985
public static final String ADDR_INPUT_SWITCH_STATUS = "A01A"; // 40986
public static final String ADDR_WATER_LEVEL_SWITCH = "A01B"; // 40987
public static final String ADDR_OUTPUT1_STATUS = "A01C"; // 40988
public static final String ADDR_OUTPUT2_STATUS = "A01D"; // 40989
public static final String ADDR_OUTPUT3_STATUS = "A01E"; // 40990
public static final String ADDR_DIP_SWITCH = "A01F"; // 40991
public static final String ADDR_MAINBOARD_TYPE = "A020"; // 40992
public static final String ADDR_CONSTANT_TEMP_SET = "AFFF"; // 45055
public static final String ADDR_ON_OFF = "B000"; // 45056
public static final String ADDR_COOL_SET_TEMP = "B001"; // 45057
public static final String ADDR_HEAT_SET_TEMP = "B002"; // 45058
public static final String ADDR_MODE = "B003"; // 45059
public static final String ADDR_HOT_WATER_SET_TEMP = "B004"; // 45060
public static final String ADDR_FORCE_ELECTRIC_HEAT = "B005"; // 45061
public static final String ADDR_FORCE_DEFROST = "B006"; // 45062
public static final String ADDR_RESERVED_B007 = "B007";
public static final String ADDR_RETURN_VALVE_TIMER = "B008"; // 45064
public static final String ADDR_SUPPLY_VALVE_TIMER = "B009"; // 45065
// ==================== 解析器映射表 ====================
private static final Map<String, Function<Integer, Object>> PARSERS = new HashMap<>();
// ==================== 编码器映射表(写操作) ====================
private static final Map<String, Function<Object, Integer>> ENCODERS = new HashMap<>();
static {
// ---------- TEMP1 类型(无符号byte,低8位有效)----------
// 公式:温度 = (raw - 64) / 2,raw=1 表示传感器故障/未接
Function<Integer, Object> temp1Parser = v -> parseTemp1(v & 0xFF);
Function<Object, Integer> temp1Encoder = val -> encodeTemp1((Double) val);
// ---------- TEMP2 类型(无符号byte,低8位有效)----------
// 公式:温度 = raw - 32,raw=1 表示传感器故障/未接
Function<Integer, Object> temp2Parser = v -> parseTemp2(v & 0xFF);
Function<Object, Integer> temp2Encoder = val -> encodeTemp2((Integer) val);
// ---------- DIGI1 类型(无符号byte,低8位有效)----------
Function<Integer, Object> digi1Parser = v -> v & 0xFF;
Function<Object, Integer> digi1Encoder = val -> ((Number) val).intValue() & 0xFF ;
// ---------- DIG2 类型(16位无符号整型)----------
Function<Integer, Object> dig2Parser = v -> v & 0xFFFF;
Function<Object, Integer> dig2Encoder = val -> ((Number) val).intValue() & 0xFFFF;
// 地址配置(解析器 + 编码器)
// 温度读取地址(只读)
String[] temp1Addrs = {ADDR_DISPLAY_WATER_TEMP, ADDR_TANK_TEMP, ADDR_OUTLET_TEMP,
ADDR_INLET_TEMP, ADDR_AMBIENT_TEMP, ADDR_COIL1_TEMP, ADDR_SUCTION1_TEMP,
ADDR_VALVE_AFTER1_OR_RETURN, ADDR_COIL2_TEMP, ADDR_SUCTION2_TEMP,
ADDR_VALVE_AFTER2_TEMP};
for (String addr : temp1Addrs) {
PARSERS.put(addr, temp1Parser);
// 这些是只读地址,不设置编码器
}
// TEMP2 只读
String[] temp2Addrs = {ADDR_EXHAUST1_TEMP, ADDR_EXHAUST2_TEMP};
for (String addr : temp2Addrs) {
PARSERS.put(addr, temp2Parser);
}
// DIG2 只读
String[] dig2Addrs = {ADDR_MAIN_EXP_VALVE1_OPEN, ADDR_AUX_EXP_VALVE1_OPEN,
ADDR_MAIN_EXP_VALVE2_OPEN, ADDR_AUX_EXP_VALVE2_OPEN};
for (String addr : dig2Addrs) {
PARSERS.put(addr, dig2Parser);
}
// DIGI1 只读
String[] digi1Addrs = {ADDR_COMP1_CURRENT, ADDR_COMP2_CURRENT,
ADDR_RECOVERABLE_FAULT, ADDR_UNRECOVERABLE_FAULT};
for (String addr : digi1Addrs) {
PARSERS.put(addr, digi1Parser);
}
// 版本号(特殊解析)
PARSERS.put(ADDR_VERSION_INFO, XK814ModbusParamReadIntoDBUtil::parseVersion);
// 位域状态
PARSERS.put(ADDR_INPUT_SWITCH_STATUS, XK814ModbusParamReadIntoDBUtil::parseInputSwitchStatus);
PARSERS.put(ADDR_WATER_LEVEL_SWITCH, XK814ModbusParamReadIntoDBUtil::parseWaterLevelSwitch);
PARSERS.put(ADDR_OUTPUT1_STATUS, XK814ModbusParamReadIntoDBUtil::parseOutput1Status);
PARSERS.put(ADDR_OUTPUT2_STATUS, XK814ModbusParamReadIntoDBUtil::parseOutput2Status);
PARSERS.put(ADDR_OUTPUT3_STATUS, XK814ModbusParamReadIntoDBUtil::parseOutput3Status);
PARSERS.put(ADDR_DIP_SWITCH, XK814ModbusParamReadIntoDBUtil::parseDipSwitch);
PARSERS.put(ADDR_MAINBOARD_TYPE, XK814ModbusParamReadIntoDBUtil::parseMainboardType);
// ========== 可读写地址 ==========
// AFFFH 恒温设置温度 (TEMP2)
PARSERS.put(ADDR_CONSTANT_TEMP_SET, temp2Parser);
ENCODERS.put(ADDR_CONSTANT_TEMP_SET, temp2Encoder);
// B000H 开关机 (0关机,1开机)
PARSERS.put(ADDR_ON_OFF, v -> (v & 0xFF) == 0 ? "0" : "1");
ENCODERS.put(ADDR_ON_OFF, val -> (val.equals("开机") ? 1 : 0) & 0xFF);
// B001H 制冷设置温度 (TEMP2)
PARSERS.put(ADDR_COOL_SET_TEMP, temp2Parser);
ENCODERS.put(ADDR_COOL_SET_TEMP, temp2Encoder);
// B002H 制热设置温度 (TEMP2)
PARSERS.put(ADDR_HEAT_SET_TEMP, temp2Parser);
ENCODERS.put(ADDR_HEAT_SET_TEMP, temp2Encoder);
// B003H 运行模式 (0制热,1制冷,2恒温)
PARSERS.put(ADDR_MODE, v -> {
int mode = v & 0xFF;
switch (mode) {
case 0:
return "0";
case 1:
return "1";
case 2:
return "2";
default:
return "99";
}
});
ENCODERS.put(ADDR_MODE, val -> {
String mode = (String) val;
switch (mode) {
case "制热":
return 0;
case "制冷":
return 1;
case "恒温":
return 2;
default:
throw new IllegalArgumentException("无效模式: " + mode);
}
});
// B004H 热水设置温度 (TEMP2)
PARSERS.put(ADDR_HOT_WATER_SET_TEMP, temp2Parser);
ENCODERS.put(ADDR_HOT_WATER_SET_TEMP, temp2Encoder);
// B005H 强制电加热
PARSERS.put(ADDR_FORCE_ELECTRIC_HEAT, v -> (v & 0xFF) == 0 ? "0" : "1");
ENCODERS.put(ADDR_FORCE_ELECTRIC_HEAT, val -> val.equals("开启强制") ? 1 : 0);
// B006H 强制除霜
PARSERS.put(ADDR_FORCE_DEFROST, v -> (v & 0xFF) == 0 ? "0" : "1");
ENCODERS.put(ADDR_FORCE_DEFROST, val -> val.equals("开启强制") ? 1 : 0);
// B008H 回水阀定时开关 (bit0)
PARSERS.put(ADDR_RETURN_VALVE_TIMER, v -> ((v & 01) == 0) ? "0" : "1");
ENCODERS.put(ADDR_RETURN_VALVE_TIMER, val -> (val.equals("开启") ? 1 : 0) & 01);
// B009H 供水阀定时开关 (bit0)
PARSERS.put(ADDR_SUPPLY_VALVE_TIMER, v -> ((v & 01) == 0) ? "0" : "1");
ENCODERS.put(ADDR_SUPPLY_VALVE_TIMER, val -> (val.equals("开启") ? 1 : 0) & 01);
}
/**
* 解析寄存器值
*
* @param address 寄存器地址字符串格式 "A000"
* @param value 寄存器原始值0~65535
* @return 解析后的物理值若地址未定义则返回 null
*/
public static Object parse(String address, int value) {
Function<Integer, Object> parser = PARSERS.get(address);
if (parser == null) {
return null;
}
return parser.apply(value);
}
/**
* 将物理值编码为寄存器值用于写操作
*
* @param address 寄存器地址字符串格式 "A000"
* @param physicalValue 物理值类型需与协议匹配
* @return 要写入寄存器的整数值若地址不支持写或类型错误则抛出异常
*/
public static int encode(String address, Object physicalValue) {
Function<Object, Integer> encoder = ENCODERS.get(address);
if (encoder == null) {
throw new UnsupportedOperationException("地址 " + address + " 不支持写操作");
}
return encoder.apply(physicalValue);
}
// ==================== 私有解析/编码辅助方法 ====================
// TEMP1 解析:温度 = (raw - 64)/2,raw=1 表示故障
private static Double parseTemp1(int raw) {
if (raw == 1) return 1.0; // 传感器故障或未接
return (raw - 64) / 2.0;
}
// TEMP1 编码:给定温度(Double),返回 raw 值
private static int encodeTemp1(Double temp) {
if (temp == null) return 1; // 故障时写入1?协议未明确写故障,一般写有效值
int raw = (int) Math.round(temp * 2 + 64);
// 限制范围 0~255,但协议中有效温度对应 raw 范围 4~? 不做严格限制
return Math.min(255, Math.max(0, raw));
}
// TEMP2 解析:温度 = raw - 32,raw=1 表示故障
private static Integer parseTemp2(int raw) {
if (raw == 1) return 1;
return raw - 32;
}
// TEMP2 编码
private static int encodeTemp2(Integer temp) {
if (temp == null) return 1;
int raw = temp + 32;
return Math.min(255, Math.max(0, raw));
}
// 版本号解析:高8位类别版本,低8位主板版本
private static String parseVersion(int value) {
return String.valueOf(value);
}
// A01AH 输入开关状态
private static String parseInputSwitchStatus(int value) {
return String.valueOf(value);
}
// A01BH 水位开关状态
private static String parseWaterLevelSwitch(int value) {
return String.valueOf(value);
}
// A01CH 输出1状态
private static String parseOutput1Status(int value) {
return String.valueOf(value);
}
// A01DH 输出2状态
private static String parseOutput2Status(int value) {
return String.valueOf(value);
}
// A01EH 输出3状态
private static String parseOutput3Status(int value) {
return String.valueOf(value);
}
// A01FH 机组信息
private static String parseDipSwitch(int value) {
return String.valueOf(value);
}
// A020H 主板类别
private static String parseMainboardType(int value) {
return String.valueOf(value);
}
// ==================== 测试示例 ====================
public static void main(String[] args) {
// 示例:解析 A000H 显示水温,原始值 110 -> 温度 (110-64)/2 = 23℃
System.out.println("显示水温: " + parse(ADDR_DISPLAY_WATER_TEMP, 110) + "℃");
System.out.println(ADDR_DISPLAY_WATER_TEMP);
// 示例:解析 A007H 排气1温度,原始值 33 -> 33-32=1℃
System.out.println("排气1温度: " + parse(ADDR_EXHAUST1_TEMP, 33) + "℃");
// 示例:解析 B003H 运行模式,原始值 1 -> 制冷
System.out.println("运行模式: " + parse("A01D", 1));
// 编码示例:写恒温设置温度 25℃
int encoded = encode(ADDR_CONSTANT_TEMP_SET, 25); // 25+32=57
System.out.println("恒温设置温度 25℃ 编码为: " + encoded);
// 写开关机:开机
encoded = encode(ADDR_ON_OFF, "开机");
System.out.println("开机编码: " + encoded);
// 测试字符串地址传入
System.out.println("\n--- 测试字符串地址 ---");
System.out.println("显示水温: " + parse("A000", 110) + "℃");
System.out.println("运行模式: " + parse("B003", 1));
}
}

29
user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java

@ -78,6 +78,7 @@ public class XK814ModbusParamWriteUtil {
* @param value 物理值类型需与地址匹配参考协议 * @param value 物理值类型需与地址匹配参考协议
* @return 完整的 RTU 报文字节数组包含 CRC * @return 完整的 RTU 报文字节数组包含 CRC
*/ */
// ... existing code ...
public static String buildWriteSingleRegisterMessage(int slaveId, String address, Object value) { public static String buildWriteSingleRegisterMessage(int slaveId, String address, Object value) {
// 获取编码器 // 获取编码器
String addrUpper = address.toUpperCase(); String addrUpper = address.toUpperCase();
@ -89,26 +90,28 @@ public class XK814ModbusParamWriteUtil {
int regValue = encoder.apply(value); int regValue = encoder.apply(value);
// 地址字符串转整数 // 地址字符串转整数
int regAddr = Integer.parseInt(addrUpper, 16); int regAddr = Integer.parseInt(addrUpper, 16);
// 构建报文(不含 CRC) // 构建报文(不含 CRC)- 只包含地址和值,共4字节
byte[] pdu = new byte[6]; byte[] frameWithoutCRC = new byte[4];
pdu[0] = (byte) (regAddr >> 8); // 地址高字节 frameWithoutCRC[0] = (byte) (regAddr >> 8); // 地址高字节
pdu[1] = (byte) (regAddr & 0xFF); // 地址低字节 frameWithoutCRC[1] = (byte) (regAddr & 0xFF); // 地址低字节
pdu[2] = (byte) (regValue >> 8); // 值高字节 frameWithoutCRC[2] = (byte) (regValue >> 8); // 值高字节
pdu[3] = (byte) (regValue & 0xFF);// 值低字节 frameWithoutCRC[3] = (byte) (regValue & 0xFF);// 值低字节
// 添加从机地址和功能码 // 添加从机地址和功能码
byte[] frameWithoutCRC = new byte[1 + 1 + 6]; byte[] fullFrameWithoutCRC = new byte[1 + 1 + 4];
frameWithoutCRC[0] = (byte) slaveId; fullFrameWithoutCRC[0] = (byte) slaveId;
frameWithoutCRC[1] = 0x06; // 功能码 fullFrameWithoutCRC[1] = 0x06; // 功能码
System.arraycopy(pdu, 0, frameWithoutCRC, 2, 6); System.arraycopy(frameWithoutCRC, 0, fullFrameWithoutCRC, 2, 4);
// 计算 CRC16 // 计算 CRC16
int crc = calculateCRC(frameWithoutCRC, 0, frameWithoutCRC.length); int crc = calculateCRC(fullFrameWithoutCRC, 0, fullFrameWithoutCRC.length);
// 完整报文 // 完整报文
byte[] fullFrame = new byte[frameWithoutCRC.length + 2]; byte[] fullFrame = new byte[fullFrameWithoutCRC.length + 2];
System.arraycopy(frameWithoutCRC, 0, fullFrame, 0, frameWithoutCRC.length); System.arraycopy(fullFrameWithoutCRC, 0, fullFrame, 0, fullFrameWithoutCRC.length);
fullFrame[fullFrame.length - 2] = (byte) (crc & 0xFF); fullFrame[fullFrame.length - 2] = (byte) (crc & 0xFF);
fullFrame[fullFrame.length - 1] = (byte) ((crc >> 8) & 0xFF); fullFrame[fullFrame.length - 1] = (byte) ((crc >> 8) & 0xFF);
return toHexString(fullFrame); return toHexString(fullFrame);
} }
// ... existing code ...
/** /**
* 重载地址使用整数形式 * 重载地址使用整数形式

2
user-service/src/main/resources/application.yml

@ -1,6 +1,6 @@
spring: spring:
profiles: profiles:
active: dev active: prod
mvc: mvc:
pathmatch: pathmatch:
matching-strategy: ant_path_matcher matching-strategy: ant_path_matcher

9
user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java

@ -3,6 +3,7 @@ package com.mh.user;
import com.mh.user.entity.DeviceManageEntity; import com.mh.user.entity.DeviceManageEntity;
import com.mh.user.entity.GaugeEntity; import com.mh.user.entity.GaugeEntity;
import com.mh.user.job.DealDataJob; import com.mh.user.job.DealDataJob;
import com.mh.user.job.StartOrStopHotpumpJob;
import com.mh.user.serialport.SerialPortThread; import com.mh.user.serialport.SerialPortThread;
import com.mh.user.service.DeviceManageService; import com.mh.user.service.DeviceManageService;
import com.mh.user.service.GaugeService; import com.mh.user.service.GaugeService;
@ -27,6 +28,14 @@ class UserServiceApplicationTests {
void contextLoads() { void contextLoads() {
} }
@Autowired
private StartOrStopHotpumpJob startOrStopHotpumpJob;
@Test
public void testStartOrStopHotpump() {
startOrStopHotpumpJob.startOrStopHotpump();
}
@Test @Test
public void encode() { public void encode() {
String s = PasswordUtils.encode("123456", "87e03afa1f0122531f729c9a7453f475"); String s = PasswordUtils.encode("123456", "87e03afa1f0122531f729c9a7453f475");

1
user-service/src/test/java/com/mh/user/chart/ChartTest.java

@ -9,6 +9,7 @@ package com.mh.user.chart;
*/ */
public class ChartTest { public class ChartTest {
public static void main(String[] args) { public static void main(String[] args) {
String[] split = "03_0003_1_14_2_主楼-1号热泵温度设置".split("_");
System.out.println(extracted()); System.out.println(extracted());
} }

Loading…
Cancel
Save