Compare commits

..

No commits in common. '2cedf6c143d5f1b5c2b5bf0c5c2867dc225345bc' and 'ab9cd2915f21a222906c6dc37dc9927f034ca5b2' have entirely different histories.

  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. 40
      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. 6
      user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java
  7. 8
      user-service/src/main/java/com/mh/user/model/MultiControlModel.java
  8. 2
      user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java
  9. 6
      user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java
  10. 4
      user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java
  11. 18
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java
  12. 2
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  13. 11
      user-service/src/main/java/com/mh/user/service/DeviceInstallService.java
  14. 10
      user-service/src/main/java/com/mh/user/service/NowDataService.java
  15. 1
      user-service/src/main/java/com/mh/user/service/PumpSetService.java
  16. 4
      user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java
  17. 8
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  18. 16
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  19. 56
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  20. 5
      user-service/src/main/java/com/mh/user/service/impl/PumpSetServiceImpl.java
  21. 2
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java
  22. 65
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java
  23. 2
      user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java
  24. 2
      user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java
  25. 17
      user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java
  26. 9
      user-service/src/main/java/com/mh/user/tcp/TcpSingle.java
  27. 48
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  28. 312
      user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java
  29. 29
      user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java
  30. 2
      user-service/src/main/resources/application.yml
  31. 9
      user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java
  32. 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,16 +2,24 @@ 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;
@ -76,7 +84,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", deviceInstallEntity.getDataCom()); nowDataService.saveNowHistoryData("3","热泵","运行","runState","62");
// nowDataService.updateRunState("70","2","离线"); // nowDataService.updateRunState("70","2","离线");

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

@ -1,193 +0,0 @@
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,7 +323,6 @@ 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")

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

@ -156,30 +156,16 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("isOnline") String isOnline); @Param("isOnline") String isOnline);
// 修改设备在线情况,离线。 // 修改设备在线情况,离线。
@Update("<script>" + @Update("update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}")
"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("<script>" + @Select("select top 1 * from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}")
"select top 1 * from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} "+ DeviceInstallEntity selectDevice(@Param("deviceAddr") String deviceAddr,@Param("deviceType") String deviceType,@Param("buildingId") String 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} ")
@ -329,16 +315,8 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("id") Long id); @Param("id") Long id);
//查询最后一次采集时间 //查询最后一次采集时间
@Select("<script>"+ @Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}")
"select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId} "+ String selectLastDate(@Param("deviceType") String deviceType,@Param("deviceAddr") String deviceAddr,@Param("buildingId") String 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} ")
@ -389,10 +367,4 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
" and brand = #{brand} " + " and brand = #{brand} " +
" and device_addr = #{deviceAddr} ") " and device_addr = #{deviceAddr} ")
Integer selectDeviceByParam(String buildingId, String dataCom, String deviceType, String brand, String deviceAddr); Integer selectDeviceByParam(String buildingId, String dataCom, String deviceType, String brand, String deviceAddr);
@Update("update device_install set is_fault=#{isFault} where device_addr=#{deviceAddr} and device_type=#{deviceType} and device_name=#{deviceName}")
void updateDeviceFaultAndDeviceName(@Param("isFault") String number,
@Param("deviceAddr") String addr,
@Param("deviceType") String deviceType,
@Param("deviceName") String deviceName);
} }

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

@ -32,7 +32,6 @@ 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);
@ -191,19 +190,13 @@ public interface NowDataMapper {
int buildWaterLevelCount(@Param("curDate") String curDate); int buildWaterLevelCount(@Param("curDate") String curDate);
//判断实时表有没有记录(热泵) //判断实时表有没有记录(热泵)
@Select("<script>"+ @Select("select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId}")
"select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId} "+ int selectNowDataCount(@Param("buildingId") String buildingId,@Param("pumpId") String 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 top 1 * from now_data where building_id=#{buildingId} and pump_id=#{pumpId} and pump_name = #{pumpName}") @Select("select * from now_data where building_id=#{buildingId} and pump_id=#{pumpId}")
NowDataEntity selectNowData(@Param("buildingId") String buildingId, @Param("pumpId") String pumpId, @Param("pumpName") String deviceName); NowDataEntity selectNowData(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId);
//判断实时表有没有记录(非热泵) //判断实时表有没有记录(非热泵)
@Select("select count(*) from now_data where building_id=#{buildingId} ") @Select("select count(*) from now_data where building_id=#{buildingId} ")
@ -264,12 +257,9 @@ 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);
@ -365,16 +355,8 @@ public interface NowDataMapper {
@Param("dataStr") String dataStr); @Param("dataStr") String dataStr);
//在没有接收到返回值前设置监控界面热泵是否离线 //在没有接收到返回值前设置监控界面热泵是否离线
@Update("<script>" + @Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}")
"update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId} " + void updateRunState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId,@Param("strState") String strState);
"<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}")

6
user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java

@ -56,10 +56,4 @@ public interface PumpSetMapper {
@ResultMap("rs") @ResultMap("rs")
@Select("select * from Pump_Set where building_id='001'") @Select("select * from Pump_Set where building_id='001'")
PumpSetEntity queryHandTime(); PumpSetEntity queryHandTime();
@Update("update pump_set set temp_set= #{tempSet} where building_id = #{buildingId} and pump_id= #{pumpId} and pump_name=#{pumpName}")
void updatePumpSetTempAndPumpName(@Param("tempSet") String string,
@Param("buildingId") String buildingId,
@Param("pumpId") String addr,
@Param("pumpName") String deviceName);
} }

8
user-service/src/main/java/com/mh/user/model/MultiControlModel.java

@ -34,14 +34,6 @@ public class MultiControlModel {
private int gwRunState; // 网关运行状态 标志位(连接状态) 0:正常;1:不在线;2:异常 private int gwRunState; // 网关运行状态 标志位(连接状态) 0:正常;1:不在线;2:异常
private String pumpName; //水泵名称
private String pumpId; //水泵编号
private String tempSet; //温度设置
private String waterTemp; //当前温度
private String waterLevel; //水位
private String isFault; //是否故障
private String pumpRunState; //运行状态
@Override @Override
public String toString() { public String toString() {
return new StringJoiner(", ", MultiControlModel.class.getSimpleName() + "[", "]") return new StringJoiner(", ", MultiControlModel.class.getSimpleName() + "[", "]")

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 && receiveStr.length() != 10) { if (receiveStr.length() != 8) {
super.channelRead(ctx, msg); super.channelRead(ctx, msg);
return; return;
} }

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

@ -35,12 +35,6 @@ 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, comName); SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService);
} }
// 处理返回来的数据报文 // 处理返回来的数据报文
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, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
} }
} }
// 解析返回来的数据 // 解析返回来的数据

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

@ -11,6 +11,8 @@ 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;
@ -113,10 +115,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, comName); SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService);
} }
// 处理返回来的数据报文 // 处理返回来的数据报文
dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, comName); dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes);
try { try {
SerialTool.closePort(serialPort); SerialTool.closePort(serialPort);
log.info("关闭串口==" + serialPort.getName()); log.info("关闭串口==" + serialPort.getName());
@ -131,7 +133,6 @@ public class SerialPortSendReceive2 {
/** /**
* 处理返回来的数据 * 处理返回来的数据
*
* @param dateStr * @param dateStr
* @param serialPort * @param serialPort
* @param i * @param i
@ -142,7 +143,6 @@ 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 comName) { String buildingName, byte[] bytes) {
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, comName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
} }
} }
// 解析返回来的数据 // 解析返回来的数据
analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName, comName); analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName);
} 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 comName) { String buildingName) {
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, comName); analysisReceiveOrder485.analysisPumpOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName);
} 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, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
} }
} }
// try { // try {

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

@ -1,7 +1,12 @@
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;
@ -79,7 +84,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, String dataCom); void updateNotOnline(String deviceAddr,String deviceType,String buildingId,String isOnline);
//根据通讯地址和设备类型查询对应的设备信息 //根据通讯地址和设备类型查询对应的设备信息
DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId); DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId);
@ -151,7 +156,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 dataCom); String selectLastDate(String deviceType,String deviceAddr,String buildingId);
//判断某栋楼是否有热泵设备 //判断某栋楼是否有热泵设备
int judgePump(String buildingId); int judgePump(String buildingId);
@ -188,6 +193,4 @@ public interface DeviceInstallService {
int queryPumpCount(String buildingId); int queryPumpCount(String buildingId);
Integer selectDeviceByOtherParams(DeviceCodeParamEntity deviceCodeParamEntity); Integer selectDeviceByOtherParams(DeviceCodeParamEntity deviceCodeParamEntity);
void updateDeviceFaultAndDeviceName(String number, String addr, String deviceType, String deviceName);
} }

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

@ -4,6 +4,8 @@ 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;
@ -14,13 +16,13 @@ public interface NowDataService {
void saveNowData(NowDataEntity nowDataEntity); void saveNowData(NowDataEntity nowDataEntity);
//保存热泵相关数据 //保存热泵相关数据
void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom); void saveNowHistoryData(String pumpId,String deviceType,String strData,String dataType,String buildingId);
//非热泵保存数据 //非热泵保存数据
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, String deviceName); void saveNowHistoryData3(String pumpId,String deviceType,String strData,String dataType,String buildingId);
//修改监控界面实时信息 //修改监控界面实时信息
void updateNowData(NowDataEntity nowDataEntity); void updateNowData(NowDataEntity nowDataEntity);
@ -113,7 +115,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, String dataCom); void updateRunState(String buildingId,String pumpId,String strState, String buildingName);
//计算热泵运行时间,按分钟 //计算热泵运行时间,按分钟
void proPumpMinutes(String buildingId,String pumpId,String runState); void proPumpMinutes(String buildingId,String pumpId,String runState);
@ -160,7 +162,5 @@ 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);
} }

1
user-service/src/main/java/com/mh/user/service/PumpSetService.java

@ -12,5 +12,4 @@ public interface PumpSetService {
PumpSetEntity queryHandTime(); PumpSetEntity queryHandTime();
void updatePumpSetTempAndPumpName(String string, String buildingId, String addr, 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(), null); dataResultEntity.getBuildingId());
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(), null); dataResultEntity.getBuildingId());
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,11 +232,6 @@ 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"))
@ -794,8 +789,6 @@ 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"); //寄存器地址
} }
@ -821,7 +814,6 @@ 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"); //功能码写数据

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

@ -20,6 +20,7 @@ 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
@ -369,14 +370,14 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
} }
@Override @Override
public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline, String dataCom) { public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline) {
deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline, dataCom); deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline);
} }
//根据通讯地址和设备类型查询对应的设备信息 //根据通讯地址和设备类型查询对应的设备信息
@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, null); return deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId);
} }
@Override @Override
@ -486,11 +487,6 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
deviceInstallMapper.updateDeviceFault(isFault, deviceAddr, deviceType); deviceInstallMapper.updateDeviceFault(isFault, deviceAddr, deviceType);
} }
@Override
public void updateDeviceFaultAndDeviceName(String number, String addr, String deviceType, String deviceName) {
deviceInstallMapper.updateDeviceFaultAndDeviceName(number, addr, deviceType, deviceName);
}
//查询设备品牌 //查询设备品牌
@Override @Override
public String selectBrand(String buildingId, String deviceAddr) { public String selectBrand(String buildingId, String deviceAddr) {
@ -523,8 +519,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
} }
@Override @Override
public String selectLastDate(String deviceType, String deviceAddr, String buildingId, String dataCom) { public String selectLastDate(String deviceType, String deviceAddr, String buildingId) {
return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId, dataCom); return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId);
} }
@Override @Override

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

@ -14,7 +14,6 @@ import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService; import com.mh.user.service.NowDataService;
import com.mh.user.utils.DateUtil; import com.mh.user.utils.DateUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -107,7 +106,6 @@ public class NowDataServiceImpl implements NowDataService {
break; break;
} }
} }
// 在判断网关在线情况 // 在判断网关在线情况
List<DeviceInstallEntity> devices = deviceInstallMapper.selectOfflineDevice(buildingId, "多路控制"); List<DeviceInstallEntity> devices = deviceInstallMapper.selectOfflineDevice(buildingId, "多路控制");
if (!devices.isEmpty()) { if (!devices.isEmpty()) {
@ -115,30 +113,7 @@ public class NowDataServiceImpl implements NowDataService {
int online = gatewayManageMapper.queryGatewayByDataCom(deviceInstallEntity.getDataCom()); int online = gatewayManageMapper.queryGatewayByDataCom(deviceInstallEntity.getDataCom());
multiControlModel.setGwRunState(online); multiControlModel.setGwRunState(online);
} }
result.add(multiControlModel);
// 在进行遍历,获取包含热泵的对应数据
list.stream().filter(nowDataEntity -> nowDataEntity.getPumpName().contains("热泵")).forEach(
nowDataEntity -> {
MultiControlModel multiControlModel1 = new MultiControlModel();
BeanUtils.copyProperties(nowDataEntity, multiControlModel1);
multiControlModel1.setBuildingId(buildingId);
multiControlModel1.setBuildingName(list.get(0).getBuildingName());
multiControlModel1.setPumpName(nowDataEntity.getPumpName());
multiControlModel1.setPumpId(nowDataEntity.getPumpId());
multiControlModel1.setTempSet(nowDataEntity.getTempSet());
multiControlModel1.setWaterTemp(nowDataEntity.getWaterTemp());
multiControlModel1.setIsFault(nowDataEntity.getIsFault()); // Fixed method name
multiControlModel1.setPumpRunState(nowDataEntity.getRunState()); // Fixed method name
if (!StringUtils.isBlank(nowDataEntity.getWaterLevel())) {
multiControlModel1.setWaterLevel(nowDataEntity.getWaterLevel());
}
result.add(multiControlModel1); // Add to result list
}
);
// result再根据热泵名称的数字进行排序
result.sort(Comparator.comparingInt(multiControlModel1 ->
Integer.parseInt(multiControlModel1.getPumpName().replaceAll("[^0-9]", ""))
));
return result; return result;
} }
@ -164,7 +139,7 @@ public class NowDataServiceImpl implements NowDataService {
//保存热泵采集数据 //保存热泵采集数据
@Override @Override
public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom) { public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId) {
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);
@ -182,7 +157,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setIsFault(strData); data.setIsFault(strData);
} }
//从安装表获取设备信息 //从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId, dataCom); DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId);
//获取对应水箱信息 //获取对应水箱信息
DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId); DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId);
if (tank != null) { if (tank != null) {
@ -191,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, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId);//判断now_data表是否存在记录
if (r1 == 0) { if (r1 == 0) {
data.setPumpId(pumpId); //通讯地址 data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
@ -199,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, deviceInstallEntity.getDeviceName()); NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId);
if (data1 != null) { if (data1 != null) {
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")) { //温度设定
data1.setTempSet(strData); data1.setTempSet(strData);
@ -273,7 +248,7 @@ public class NowDataServiceImpl implements NowDataService {
break; break;
} }
//从安装表获取设备信息 //从安装表获取设备信息
// DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId, dataCom); DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId);
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName = buildingService.queryBuildingName(buildingId);
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
// 获取项目名称 // 获取项目名称
@ -361,7 +336,7 @@ public class NowDataServiceImpl implements NowDataService {
//非热泵温度变送器、状态检测相关数据 //非热泵温度变送器、状态检测相关数据
@Override @Override
public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId, String deviceName) { public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId) {
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);
@ -384,7 +359,7 @@ public class NowDataServiceImpl implements NowDataService {
} }
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName = buildingService.queryBuildingName(buildingId);
//判断实时表是否有记录 //判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceName);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录
if (r1 == 0) { if (r1 == 0) {
data.setPumpId(pumpId); //热泵编号 data.setPumpId(pumpId); //热泵编号
String pumpName = "热泵" + pumpId; String pumpName = "热泵" + pumpId;
@ -393,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, deviceName); NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId);
if (data1 != null) { if (data1 != null) {
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")) { //温度设定
data1.setTempSet(strData); data1.setTempSet(strData);
@ -680,11 +655,6 @@ 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);
@ -792,10 +762,10 @@ public class NowDataServiceImpl implements NowDataService {
} }
@Override @Override
public void updateRunState(String buildingId, String pumpId, String strState, String buildingName, String dataCom) { public void updateRunState(String buildingId, String pumpId, String strState, String buildingName) {
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId, dataCom); DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId);
NowDataEntity data = new NowDataEntity(); NowDataEntity data = new NowDataEntity();
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录
if (r1 == 0) { if (r1 == 0) {
data.setPumpId(pumpId); //通讯地址 data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
@ -804,7 +774,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setRunState(strState); data.setRunState(strState);
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} }
nowDataMapper.updateRunState(buildingId, pumpId, strState, deviceInstallEntity.getDeviceName()); nowDataMapper.updateRunState(buildingId, pumpId, strState);
} }
@Override @Override

5
user-service/src/main/java/com/mh/user/service/impl/PumpSetServiceImpl.java

@ -29,11 +29,6 @@ public class PumpSetServiceImpl implements PumpSetService {
pumpSetMapper.updatePumpSetTemp(tempSet,buildingId,pumpId); pumpSetMapper.updatePumpSetTemp(tempSet,buildingId,pumpId);
} }
@Override
public void updatePumpSetTempAndPumpName(String string, String buildingId, String addr, String deviceName) {
pumpSetMapper.updatePumpSetTempAndPumpName(string,buildingId,addr,deviceName);
}
@Override @Override
public PumpSetEntity queryPumpSet(String pumpId, String buildingId) { public PumpSetEntity queryPumpSet(String pumpId, String buildingId) {
return pumpSetMapper.queryPumpSet(pumpId,buildingId); return pumpSetMapper.queryPumpSet(pumpId,buildingId);

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, deviceCodeParamEntity.getDeviceName()); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
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);

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

@ -7,7 +7,10 @@ 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.*; import com.mh.user.utils.ExchangeStringUtil;
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;
@ -217,7 +220,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 + "0001"; str = str + funCode + registerAddr + "0002";
} 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();
@ -291,7 +294,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, deviceCodeParamEntity.getDataCom()); nowDataService.saveNowHistoryData(addr, "热泵", rtData, dataType.toString(), buildingId);
log.info("时间: " + dateStr + "热泵ID:" + addr + ",数据: " + rtData + ",保存数据库成功!楼栋名称:" + buildingName); log.info("时间: " + dateStr + "热泵ID:" + addr + ",数据: " + rtData + ",保存数据库成功!楼栋名称:" + buildingName);
} }
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化
@ -310,11 +313,7 @@ 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个字符代表一个寄存器)
@ -324,14 +323,14 @@ public class HeatPumpStrategy implements DeviceStrategy {
// 计算寄存器地址 // 计算寄存器地址
String regAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4).toUpperCase(); String regAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4).toUpperCase();
// 使用 XK814ModbusParamReadIntoDBUtil 解析 // 使用 XK814ModbusParserUtil 解析
Object parsedValue = XK814ModbusParamReadIntoDBUtil.parse(regAddr, value); Object parsedValue = XK814ModbusParamReadUtil.parse(regAddr, value);
if (parsedValue != null) { if (parsedValue != null) {
log.info("正帝热泵解析 - 地址: {}, 原始值: {}, 解析结果: {}", regAddr, value, parsedValue); log.info("正帝热泵解析 - 地址: {}, 原始值: {}, 解析结果: {}", regAddr, value, parsedValue);
// 根据不同的寄存器地址处理不同的业务逻辑 // 根据不同的寄存器地址处理不同的业务逻辑
processZhengDiData(regAddr, parsedValue, value, buildingId, buildingName, addr, dataType, deviceCodeParamEntity.getDeviceName()); processZhengDiData(regAddr, parsedValue, value, buildingId, buildingName, addr, dataType);
sValue = String.valueOf(parsedValue); sValue = String.valueOf(parsedValue);
// 这里根据com口、deviceType、brand、deviceAddr、buildingId查询对应deviceInstall的ID值 // 这里根据com口、deviceType、brand、deviceAddr、buildingId查询对应deviceInstall的ID值
Integer deviceInstallId = deviceInstallService.selectDeviceByOtherParams(deviceCodeParamEntity); Integer deviceInstallId = deviceInstallService.selectDeviceByOtherParams(deviceCodeParamEntity);
@ -352,9 +351,9 @@ public class HeatPumpStrategy implements DeviceStrategy {
/** /**
* 处理正帝热泵解析后的数据 * 处理正帝热泵解析后的数据
*/ */
private void processZhengDiData(String regAddr, Object parsedValue, int rawValue, private void processZhengDiData(String regAddr, Object parsedValue, int rawValue,
String buildingId, String buildingName, String addr, String buildingId, String buildingName, String addr,
StringBuffer dataType, String deviceName) { StringBuffer dataType) {
try { try {
// 温度相关数据 // 温度相关数据
if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_DISPLAY_WATER_TEMP) || if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_DISPLAY_WATER_TEMP) ||
@ -363,32 +362,14 @@ public class HeatPumpStrategy implements DeviceStrategy {
dataType.setLength(0); dataType.setLength(0);
dataType.append("waterTemp"); dataType.append("waterTemp");
String tempStr = parsedValue.toString(); String tempStr = parsedValue.toString();
String avgTemp = nowDataService.selectAve(buildingId);
// 保存公共数据
NowPublicDataEntity publicData = new NowPublicDataEntity(); NowPublicDataEntity publicData = new NowPublicDataEntity();
publicData.setBuildingId(buildingId); publicData.setBuildingId(buildingId);
publicData.setUseWaterTemp(avgTemp); publicData.setSingleTemp(tempStr);
publicData.setBackWaterTemp(avgTemp);
String pumpId = nowDataService.selectMinPumpId(buildingId);
// 如果是华夏,则取新增得字段标识为热泵ID
String name = dealDataService.customName();
if (name.contains(Constant.CUSTOM_NAME_HUAXIA)) {
pumpId = deviceInstallService.selectSinglePumpId(buildingId, addr);
}
log.info("---------------addr:" + addr + ",pumpId:" + pumpId + " ---------------");
if (addr.equals(pumpId)) { //取ID最小的热泵为单箱温度
publicData.setSingleTemp(tempStr);
log.info("---------------单箱温度:" + tempStr + "---------------");
}
nowPublicDataService.saveNowHistoryPublicData(publicData); nowPublicDataService.saveNowHistoryPublicData(publicData);
log.info("楼栋名称:" + buildingName + ",热泵编号:" + addr);
// // 保存公共数据 log.info("楼栋名称:{}, 热泵编号:{}, 水箱温度:{}", buildingName, addr, tempStr);
// NowPublicDataEntity publicData = new NowPublicDataEntity();
// publicData.setBuildingId(buildingId);
// publicData.setSingleTemp(tempStr);
// nowPublicDataService.saveNowHistoryPublicData(publicData);
//
// log.info("楼栋名称:{}, 热泵编号:{}, 水箱温度:{}", buildingName, addr, tempStr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_OUTLET_TEMP)) { } else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_OUTLET_TEMP)) {
// 出水温度 // 出水温度
@ -412,25 +393,25 @@ public class HeatPumpStrategy implements DeviceStrategy {
// 制冷设置温度 // 制冷设置温度
dataType.setLength(0); dataType.setLength(0);
dataType.append("coolSetTemp"); dataType.append("coolSetTemp");
//pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr); pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_HEAT_SET_TEMP)) { } else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_HEAT_SET_TEMP)) {
// 制热设置温度 // 制热设置温度
dataType.setLength(0); dataType.setLength(0);
dataType.append("heatSetTemp"); dataType.append("heatSetTemp");
//pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr); pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_HOT_WATER_SET_TEMP)) { } else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_HOT_WATER_SET_TEMP)) {
// 热水设置温度 // 热水设置温度
dataType.setLength(0); dataType.setLength(0);
dataType.append("hotWaterSetTemp"); dataType.append("hotWaterSetTemp");
pumpSetService.updatePumpSetTempAndPumpName(parsedValue.toString(), buildingId, addr, deviceName); pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_CONSTANT_TEMP_SET)) { } else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_CONSTANT_TEMP_SET)) {
// 恒温设置温度 // 恒温设置温度
dataType.setLength(0); dataType.setLength(0);
dataType.append("constantTempSet"); dataType.append("constantTempSet");
// pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr); pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_MODE)) { } else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_MODE)) {
// 运行模式 // 运行模式
@ -454,7 +435,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
dataType.append("isFault"); dataType.append("isFault");
String faultStatus = (rawValue == 0) ? "无故障" : "有故障"; String faultStatus = (rawValue == 0) ? "无故障" : "有故障";
deviceInstallService.updateDeviceFaultAndDeviceName((rawValue == 0) ? "0" : "1", addr, "热泵", deviceName); deviceInstallService.updateDeviceFault((rawValue == 0) ? "0" : "1", addr, "热泵");
log.info("楼栋名称:{}, 热泵编号:{}, 故障状态:{}", buildingName, addr, faultStatus); log.info("楼栋名称:{}, 热泵编号:{}, 故障状态:{}", buildingName, addr, faultStatus);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_INPUT_SWITCH_STATUS)) { } else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_INPUT_SWITCH_STATUS)) {
@ -962,7 +943,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(), deviceInstallEntity.getDataCom()); nowDataService.saveNowHistoryData(deviceInstallEntity.getDeviceAddr(), "热泵", sValue, dataType.toString(), deviceInstallEntity.getBuildingId());
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, deviceCodeParamEntity.getDeviceName()); nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId);
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, null); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
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,7 +61,6 @@ 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);
@ -111,7 +110,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, dataCom); printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService);
continue; continue;
} }
// 处理返回来的数据报文 // 处理返回来的数据报文
@ -129,17 +128,17 @@ public class SendAndReceiveByTcp {
} }
} }
public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService, String dataCom) { public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService) {
log.info("----------------{}离线,设备号:{},所属楼栋:{},端口号:{}----------------", deviceType, deviceAddr, buildingName, dataCom); log.info("----------------{}离线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName);
String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId, dataCom); String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId);
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, "离线", dataCom); //所有设备离线 deviceInstallService.updateNotOnline(deviceAddr, deviceType, buildingId, "离线"); //所有设备离线
if (deviceType.equals("热泵")) { if (deviceType.equals("热泵")) {
nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName, dataCom); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName); //监控界面状态表热泵在线状态
} }
} }
return; return;
@ -188,9 +187,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.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName()); String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据 if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
} }
} }
// 解析返回来的数据 // 解析返回来的数据

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

@ -8,6 +8,7 @@ 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;
@ -16,12 +17,16 @@ 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
@ -102,9 +107,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.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName()); String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据 if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
} }
} }
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, String comName) { public void analysisPumpOrder485(final String dateStr,final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) {
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, String comName) { public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) {
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, comName); nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
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, null); nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId);
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, null); nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId);
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, null); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
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, null); nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
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

@ -1,312 +0,0 @@
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,7 +78,6 @@ 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();
@ -90,28 +89,26 @@ 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)- 只包含地址和值,共4字节 // 构建报文(不含 CRC)
byte[] frameWithoutCRC = new byte[4]; byte[] pdu = new byte[6];
frameWithoutCRC[0] = (byte) (regAddr >> 8); // 地址高字节 pdu[0] = (byte) (regAddr >> 8); // 地址高字节
frameWithoutCRC[1] = (byte) (regAddr & 0xFF); // 地址低字节 pdu[1] = (byte) (regAddr & 0xFF); // 地址低字节
frameWithoutCRC[2] = (byte) (regValue >> 8); // 值高字节 pdu[2] = (byte) (regValue >> 8); // 值高字节
frameWithoutCRC[3] = (byte) (regValue & 0xFF);// 值低字节 pdu[3] = (byte) (regValue & 0xFF);// 值低字节
// 添加从机地址和功能码 // 添加从机地址和功能码
byte[] fullFrameWithoutCRC = new byte[1 + 1 + 4]; byte[] frameWithoutCRC = new byte[1 + 1 + 6];
fullFrameWithoutCRC[0] = (byte) slaveId; frameWithoutCRC[0] = (byte) slaveId;
fullFrameWithoutCRC[1] = 0x06; // 功能码 frameWithoutCRC[1] = 0x06; // 功能码
System.arraycopy(frameWithoutCRC, 0, fullFrameWithoutCRC, 2, 4); System.arraycopy(pdu, 0, frameWithoutCRC, 2, 6);
// 计算 CRC16 // 计算 CRC16
int crc = calculateCRC(fullFrameWithoutCRC, 0, fullFrameWithoutCRC.length); int crc = calculateCRC(frameWithoutCRC, 0, frameWithoutCRC.length);
// 完整报文 // 完整报文
byte[] fullFrame = new byte[fullFrameWithoutCRC.length + 2]; byte[] fullFrame = new byte[frameWithoutCRC.length + 2];
System.arraycopy(fullFrameWithoutCRC, 0, fullFrame, 0, fullFrameWithoutCRC.length); System.arraycopy(frameWithoutCRC, 0, fullFrame, 0, frameWithoutCRC.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: prod active: dev
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,7 +3,6 @@ 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;
@ -28,14 +27,6 @@ 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,7 +9,6 @@ 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