diff --git a/user-service/src/main/java/com/mh/user/controller/TestController.java b/user-service/src/main/java/com/mh/user/controller/TestController.java index a0289ce..8b9bdde 100644 --- a/user-service/src/main/java/com/mh/user/controller/TestController.java +++ b/user-service/src/main/java/com/mh/user/controller/TestController.java @@ -2,24 +2,16 @@ package com.mh.user.controller; import com.mh.common.utils.DateTimeUtils; import com.mh.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.mapper.NowDataMapper; import com.mh.user.serialport.SerialTool; import com.mh.user.service.NowDataService; import com.mh.user.service.SysUserService; import com.mh.user.utils.*; import org.quartz.SchedulerException; 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.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import purejavacomm.CommPort; -import purejavacomm.CommPortIdentifier; import purejavacomm.PortInUseException; import javax.annotation.Resource; @@ -84,7 +76,7 @@ public class TestController { // analysis.analysisPressureOrder485("150304400F1ABE00E1","","","22"); // analysis.analysisStateOrder485("6874100000000068810358F3395C16","","","41"); // analysis.analysisTempOrder485("020304013000010900","","","23"); - nowDataService.saveNowHistoryData("3","热泵","运行","runState","62"); +// nowDataService.saveNowHistoryData("3","热泵","运行","runState","62", deviceInstallEntity.getDataCom()); // nowDataService.updateRunState("70","2","离线"); diff --git a/user-service/src/main/java/com/mh/user/job/StartOrStopHotpumpJob.java b/user-service/src/main/java/com/mh/user/job/StartOrStopHotpumpJob.java new file mode 100644 index 0000000..5a61a09 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/job/StartOrStopHotpumpJob.java @@ -0,0 +1,193 @@ +package com.mh.user.job; + +import com.alibaba.fastjson2.JSONObject; +import com.mh.common.http.HttpResult; +import com.mh.user.constants.Constant; +import com.mh.user.entity.CollectionParamsManageEntity; +import com.mh.user.model.SerialPortModel; +import com.mh.user.service.CollectionParamsManageService; +import com.mh.user.service.DeviceControlService; +import com.mh.user.utils.ExchangeStringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author LJF + * @version 1.0 + * @project CHWS + * @description 定时开关机热泵 + * @date 2026-06-04 13:45:02 + */ +@Slf4j +@Component +public class StartOrStopHotpumpJob { + + private final CollectionParamsManageService collectionParamsManageService; + + private final DeviceControlService deviceControlService; + + public StartOrStopHotpumpJob(CollectionParamsManageService collectionParamsManageService, DeviceControlService deviceControlService) { + this.collectionParamsManageService = collectionParamsManageService; + this.deviceControlService = deviceControlService; + } + + @Scheduled(cron = "0 0/1 * * * ?") + public void startOrStopHotpump() { + log.info("定时开关机热泵开始"); + // 查询定时时间 + List paramsManageEntities = collectionParamsManageService.selectAllCPMList(); + // 过滤获取paramTypeGroupId为3的数据 + List filterList = paramsManageEntities.stream().filter(entity -> entity.getParamTypeGroupId() == 3).collect(Collectors.toList()); + // 再根据device_install_id进行分组 + Map> listMap = filterList.stream().collect(Collectors.groupingBy(CollectionParamsManageEntity::getDeviceInstallId)); + for (Map.Entry> entry : listMap.entrySet()) { + List 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 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 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); + } + } +} diff --git a/user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java b/user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java index d7269f9..d7648d5 100644 --- a/user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java +++ b/user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java @@ -323,6 +323,7 @@ public interface CollectionParamsManageMapper extends BaseMapper { @Param("isOnline") String isOnline); // 修改设备在线情况,离线。 - @Update("update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}") + @Update("") void updateNotOnline(@Param("deviceAddr") String deviceAddr, @Param("deviceType") String deviceType, @Param("buildingId") String buildingId, - @Param("isOnline") String isOnline); + @Param("isOnline") String isOnline, + @Param("dataCom") String dataCom); //根据通讯地址和设备类型查询对应的设备信息 @ResultMap("rs") - @Select("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); + @Select("") + 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} ") @@ -315,8 +329,16 @@ public interface DeviceInstallMapper extends BaseMapper { @Param("id") Long id); //查询最后一次采集时间 - @Select("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); + @Select("") + 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} ") diff --git a/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java b/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java index 93e3cd5..86abbf9 100644 --- a/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java +++ b/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java @@ -32,6 +32,7 @@ public interface NowDataMapper { " , tank_id = #{tankId} " + " , tank_name = #{tankName} " + " where building_id = #{buildingId} and pump_id = #{pumpId} " + + " and pump_name = #{pumpName} " + "") void updateNowData(NowDataEntity nowDataEntity); @@ -190,13 +191,19 @@ public interface NowDataMapper { int buildWaterLevelCount(@Param("curDate") String curDate); //判断实时表有没有记录(热泵) - @Select("select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") - int selectNowDataCount(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + @Select("") + int selectNowDataCount(@Param("buildingId") String buildingId, @Param("pumpId") String pumpId, + @Param("pumpName") String pumpName); //查询实时表记录(热泵) @ResultMap(value = "rs") - @Select("select * from now_data where building_id=#{buildingId} and pump_id=#{pumpId}") - NowDataEntity selectNowData(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); + @Select("select top 1 * from now_data where building_id=#{buildingId} and pump_id=#{pumpId} and pump_name = #{pumpName}") + NowDataEntity selectNowData(@Param("buildingId") String buildingId, @Param("pumpId") String pumpId, @Param("pumpName") String deviceName); //判断实时表有没有记录(非热泵) @Select("select count(*) from now_data where building_id=#{buildingId} ") @@ -257,9 +264,12 @@ public interface NowDataMapper { 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); + @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}") void upLevelSet(@Param("buildingId") String buildingId,@Param("levelSet") String levelSet); @@ -355,8 +365,16 @@ public interface NowDataMapper { @Param("dataStr") String dataStr); //在没有接收到返回值前设置监控界面热泵是否离线 - @Update("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); + @Update("") + 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}") diff --git a/user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java b/user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java index 5e872c2..650d115 100644 --- a/user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java +++ b/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); // 判断当前报文是否是登录报文 if (receiveStr != null && receiveStr.startsWith("2400")) { - if (receiveStr.length() != 8) { + if (receiveStr.length() != 8 && receiveStr.length() != 10) { super.channelRead(ctx, msg); return; } diff --git a/user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java b/user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java index 920e71d..0a917a6 100644 --- a/user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java +++ b/user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java @@ -35,6 +35,12 @@ public class LoginRequestHandler extends ChannelInboundHandlerAdapter { super.channelRead(ctx, msg); return; } + // 两个特殊的心跳包 + if (receiveStr.startsWith("2400600100") || receiveStr.startsWith("2400600101")) { + receiveStr = receiveStr.substring(0, 10); + } else { + receiveStr = receiveStr.substring(0, 8); + } // 判断当前报文是否是心跳包上线: 869530073040186 log.info("接收到的心跳报文 <== {}", receiveStr); // 通过对应的心跳包码进行判断,然后更新网关在线情况 diff --git a/user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java b/user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java index 406b675..1d0c805 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java +++ b/user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java @@ -120,7 +120,7 @@ public class SendAndReceiveByCom { if (bytes == null) { SerialTool.closePort(serialPort); log.info("串口{}没有数据返回!{}", serialPort.getName(), i); - SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService); + SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, comName); } // 处理返回来的数据报文 dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, device, null); @@ -189,7 +189,7 @@ public class SendAndReceiveByCom { if (deviceType.equals("热泵")) { String strState = nowDataService.selectState(buildingId, deviceAddr); if (strState != null && strState.equals("离线")) { //采集到数据 - nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 + nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态 } } // 解析返回来的数据 diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java index 3e28d28..0762113 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java @@ -11,8 +11,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import purejavacomm.SerialPort; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -115,10 +113,10 @@ public class SerialPortSendReceive2 { if (bytes == null) { SerialTool.closePort(serialPort); log.info("串口" + serialPort.getName() + "没有数据返回!" + i); - SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService); + SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, comName); } // 处理返回来的数据报文 - dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes); + dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, comName); try { SerialTool.closePort(serialPort); log.info("关闭串口==" + serialPort.getName()); @@ -133,6 +131,7 @@ public class SerialPortSendReceive2 { /** * 处理返回来的数据 + * * @param dateStr * @param serialPort * @param i @@ -143,6 +142,7 @@ public class SerialPortSendReceive2 { * @param buildingId * @param buildingName * @param bytes + * @param comName * @throws InterruptedException */ private void dealReceiveData(String dateStr, @@ -153,7 +153,7 @@ public class SerialPortSendReceive2 { String registerAddr, String brand, String buildingId, - String buildingName, byte[] bytes) { + String buildingName, byte[] bytes, String comName) { try { String receiveStr = ""; receiveStr = ExchangeStringUtil.parseByte2HexStr(bytes); @@ -177,11 +177,11 @@ public class SerialPortSendReceive2 { if (deviceType.equals("热泵")) { String strState = nowDataService.selectState(buildingId, deviceAddr); if (strState != null && strState.equals("离线")) { //采集到数据 - nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 + nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态 } } // 解析返回来的数据 - analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName); + analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName, comName); } catch (Exception e) { log.error("楼栋:" + buildingName + "设备类型:" + deviceType + "保存数据库失败!" + i,e); } @@ -195,7 +195,7 @@ public class SerialPortSendReceive2 { String dataStr, AnalysisReceiveOrder485 analysisReceiveOrder485, NowDataService nowDataService, - String buildingName) { + String buildingName, String comName) { if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { analysisReceiveOrder485.analysisMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName); } else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { @@ -203,7 +203,7 @@ public class SerialPortSendReceive2 { } else if (deviceType.equals("压变")) { analysisReceiveOrder485.analysisPressureOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName); } else if (deviceType.equals("热泵")) { - analysisReceiveOrder485.analysisPumpOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName); + analysisReceiveOrder485.analysisPumpOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName, comName); } else if (deviceType.equals("温控")) { analysisReceiveOrder485.analysisTempOrder485(dataStr, registerAddr, brand, buildingId, buildingName); } else if (deviceType.equals("时控")) { diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java index dfc3e77..df46e2a 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java @@ -140,7 +140,7 @@ public class SerialPortSingle2 { if (deviceType.equals("热泵")) { String strState = nowDataService.selectState(buildingId, deviceAddr); if (strState != null && strState.equals("离线")) { //采集到数据 - nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 + nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态 } } // try { diff --git a/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java index 0536751..ab271d2 100644 --- a/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java +++ b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java @@ -1,12 +1,7 @@ package com.mh.user.service; import com.mh.user.entity.*; -import com.mh.user.mapper.provider.DeviceInstallProvider; 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.List; @@ -84,7 +79,7 @@ public interface DeviceInstallService { void updateOnline(String deviceAddr,String deviceType,String buildingId,String isOnline); // 修改设备离线状态 - void updateNotOnline(String deviceAddr,String deviceType,String buildingId,String isOnline); + void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline, String dataCom); //根据通讯地址和设备类型查询对应的设备信息 DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId); @@ -156,7 +151,7 @@ public interface DeviceInstallService { void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue, Long id); //查询最后一次采集时间 - String selectLastDate(String deviceType,String deviceAddr,String buildingId); + String selectLastDate(String deviceType, String deviceAddr, String buildingId, String dataCom); //判断某栋楼是否有热泵设备 int judgePump(String buildingId); diff --git a/user-service/src/main/java/com/mh/user/service/NowDataService.java b/user-service/src/main/java/com/mh/user/service/NowDataService.java index e62768e..3a18563 100644 --- a/user-service/src/main/java/com/mh/user/service/NowDataService.java +++ b/user-service/src/main/java/com/mh/user/service/NowDataService.java @@ -4,8 +4,6 @@ import com.mh.user.annotation.SysLogger; import com.mh.user.entity.*; import com.mh.user.model.MultiControlModel; 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.Map; @@ -16,13 +14,13 @@ public interface NowDataService { void saveNowData(NowDataEntity nowDataEntity); //保存热泵相关数据 - void saveNowHistoryData(String pumpId,String deviceType,String strData,String dataType,String buildingId); + void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom); //非热泵保存数据 void saveNowHistoryData2(String deviceAddr,String deviceType,String strData,String dataType,String buildingId); //非热泵温度变送器相关数据 - void saveNowHistoryData3(String pumpId,String deviceType,String strData,String dataType,String buildingId); + void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId, String deviceName); //修改监控界面实时信息 void updateNowData(NowDataEntity nowDataEntity); @@ -115,7 +113,7 @@ public interface NowDataService { void proWaterLevel(String curDate,String buildingID, String deviceAddr); //在没有接收到返回值前设置监控界面热泵是否离线 - void updateRunState(String buildingId,String pumpId,String strState, String buildingName); + void updateRunState(String buildingId, String pumpId, String strState, String buildingName, String dataCom); //计算热泵运行时间,按分钟 void proPumpMinutes(String buildingId,String pumpId,String runState); @@ -162,5 +160,7 @@ public interface NowDataService { void updateMultiNowData(NowDataEntity nowDataEntity); void proWaterPressure(String dateStr, String buildingId, String buildingName, String registerAddr, String otherName, String dataStr); + + String selectStateByPumpName(String buildingId, String deviceAddr, String deviceName); } diff --git a/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java index 1f2989e..135fbf0 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java +++ b/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( dataResultEntity.getDeviceAddr(), dataResultEntity.getDeviceType(), - dataResultEntity.getBuildingId()); + dataResultEntity.getBuildingId(), null); if (deviceInstallEntity == null) { logger.warn("saveDataResult: deviceInstallEntity is null for addr={}, type={}, building={}", @@ -150,7 +150,7 @@ public class DataResultServiceImpl implements DataResultService { DeviceInstallEntity latestDeviceInstall = deviceInstallMapper.selectDevice( dataResultEntity.getDeviceAddr(), dataResultEntity.getDeviceType(), - dataResultEntity.getBuildingId()); + dataResultEntity.getBuildingId(), null); if (latestDeviceInstall != null) { DataResultEntity existingData = dataResultMapper.selectDataResult( diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java index 07ed3d6..e0a10ab 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java @@ -232,6 +232,11 @@ public class DeviceControlServiceImpl implements DeviceControlService { if (Constant.WRITE.equals(type)) { rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 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("瑞星") && (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2")) @@ -789,6 +794,8 @@ public class DeviceControlServiceImpl implements DeviceControlService { } else if ("海尔2".equals(deviceCodeParam.getBrand())) { deviceCodeParam.setFunCode("04"); //功能码读数据 deviceCodeParam.setRegisterAddr(ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex("1302"), 4)); + } else if (Constant.BRAND_ZHENG_DI.equals(deviceCodeParam.getBrand())) { + deviceCodeParam.setRegisterAddr(deviceCodeParam.getRegisterAddr()); //功能码写数据 } else { deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 } @@ -814,6 +821,7 @@ public class DeviceControlServiceImpl implements DeviceControlService { deviceCodeParam.setFunCode("06"); //功能码写数据 } else if (Constant.BRAND_ZHENG_DI.equals(deviceCodeParam.getBrand())) { deviceCodeParam.setFunCode("06"); //功能码写数据 + return rtData; } else { deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 deviceCodeParam.setFunCode("06"); //功能码写数据 diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java index c2a1ef6..31f6e5a 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java @@ -20,7 +20,6 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.math.BigDecimal; import java.util.*; @Slf4j @@ -370,14 +369,14 @@ public class DeviceInstallServiceImpl implements DeviceInstallService { } @Override - public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline) { - deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline); + public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline, String dataCom) { + deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline, dataCom); } //根据通讯地址和设备类型查询对应的设备信息 @Override public DeviceInstallEntity selectDevice(String deviceAddr, String deviceType, String buildingId) { - return deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId); + return deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId, null); } @Override @@ -519,8 +518,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService { } @Override - public String selectLastDate(String deviceType, String deviceAddr, String buildingId) { - return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId); + public String selectLastDate(String deviceType, String deviceAddr, String buildingId, String dataCom) { + return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId, dataCom); } @Override diff --git a/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java index d1295ed..63b8548 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java @@ -139,7 +139,7 @@ public class NowDataServiceImpl implements NowDataService { //保存热泵采集数据 @Override - public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId) { + public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom) { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String strDate = sdf1.format(date); @@ -157,7 +157,7 @@ public class NowDataServiceImpl implements NowDataService { data.setIsFault(strData); } //从安装表获取设备信息 - DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId); + DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId, dataCom); //获取对应水箱信息 DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId); if (tank != null) { @@ -166,7 +166,7 @@ public class NowDataServiceImpl implements NowDataService { } String buildingName = buildingService.queryBuildingName(buildingId); //判断实时表是否有记录 - int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId);//判断now_data表是否存在记录 + int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录 if (r1 == 0) { data.setPumpId(pumpId); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 @@ -174,7 +174,7 @@ public class NowDataServiceImpl implements NowDataService { data.setBuildingName(buildingName); nowDataMapper.saveNowData(data); } else { - NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId); + NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId, deviceInstallEntity.getDeviceName()); if (data1 != null) { if (dataType.equals("tempSet")) { //温度设定 data1.setTempSet(strData); @@ -248,7 +248,7 @@ public class NowDataServiceImpl implements NowDataService { break; } //从安装表获取设备信息 - DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId); +// DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId, dataCom); String buildingName = buildingService.queryBuildingName(buildingId); data.setBuildingName(buildingName); // 获取项目名称 @@ -336,7 +336,7 @@ public class NowDataServiceImpl implements NowDataService { //非热泵温度变送器、状态检测相关数据 @Override - public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId) { + public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId, String deviceName) { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String strDate = sdf1.format(date); @@ -359,7 +359,7 @@ public class NowDataServiceImpl implements NowDataService { } String buildingName = buildingService.queryBuildingName(buildingId); //判断实时表是否有记录 - int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录 + int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceName);//判断now_data表是否存在记录 if (r1 == 0) { data.setPumpId(pumpId); //热泵编号 String pumpName = "热泵" + pumpId; @@ -368,7 +368,7 @@ public class NowDataServiceImpl implements NowDataService { data.setBuildingName(buildingName); nowDataMapper.saveNowData(data); } else { - NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId); + NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId, deviceName); if (data1 != null) { if (dataType.equals("tempSet")) { //温度设定 data1.setTempSet(strData); @@ -655,6 +655,11 @@ public class NowDataServiceImpl implements NowDataService { return nowDataMapper.selectState(buildingId, pumpId); } + @Override + public String selectStateByPumpName(String buildingId, String pumpId, String pumpName) { + return nowDataMapper.selectStateByPumpName(buildingId, pumpId, pumpName); + } + @Override public void upLevelSet(String buildingId, String levelSet) { nowDataMapper.upLevelSet(buildingId, levelSet); @@ -762,10 +767,10 @@ public class NowDataServiceImpl implements NowDataService { } @Override - public void updateRunState(String buildingId, String pumpId, String strState, String buildingName) { - DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId); + public void updateRunState(String buildingId, String pumpId, String strState, String buildingName, String dataCom) { + DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId, dataCom); NowDataEntity data = new NowDataEntity(); - int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录 + int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录 if (r1 == 0) { data.setPumpId(pumpId); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 @@ -774,7 +779,7 @@ public class NowDataServiceImpl implements NowDataService { data.setRunState(strState); nowDataMapper.saveNowData(data); } - nowDataMapper.updateRunState(buildingId, pumpId, strState); + nowDataMapper.updateRunState(buildingId, pumpId, strState, deviceInstallEntity.getDeviceName()); } @Override diff --git a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java b/user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java index 53a59ca..9ac8a92 100644 --- a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java +++ b/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 runState = entry.getValue(); if (addr != null && Integer.parseInt(addr) <= count) { - nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); + nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, deviceCodeParamEntity.getDeviceName()); nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); diff --git a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java b/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java index 0aa1a5f..67f8c3b 100644 --- a/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java +++ b/user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java @@ -7,10 +7,7 @@ import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.NowPublicDataEntity; import com.mh.user.service.*; -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 com.mh.user.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; @@ -220,7 +217,7 @@ public class HeatPumpStrategy implements DeviceStrategy { } } else if (Constant.BRAND_ZHENG_DI.equals(brand)) { if (StringUtils.isBlank(funCode) || funCode.equals("03")) { - str = str + funCode + registerAddr + "0002"; + str = str + funCode + registerAddr + "0001"; } else if ("06".equals(funCode)) { str = XK814ModbusParamWriteUtil.buildWriteSingleRegisterMessage(Integer.parseInt(deviceAddr), registerAddr, dataValue); return str.toUpperCase(); @@ -294,7 +291,7 @@ public class HeatPumpStrategy implements DeviceStrategy { rtData = getZhengDi(dateStr, registerAddr, buildingId, buildingName, checkStr, sValue, addr, dataType, deviceCodeParamEntity); } if (!StringUtils.isBlank(rtData)) { - nowDataService.saveNowHistoryData(addr, "热泵", rtData, dataType.toString(), buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", rtData, dataType.toString(), buildingId, deviceCodeParamEntity.getDataCom()); log.info("时间: " + dateStr + "热泵ID:" + addr + ",数据: " + rtData + ",保存数据库成功!楼栋名称:" + buildingName); } nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化 @@ -313,7 +310,11 @@ public class HeatPumpStrategy implements DeviceStrategy { // 根据字节数计算寄存器数量(每个寄存器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++) { // 提取寄存器值(每4个字符代表一个寄存器) @@ -323,8 +324,8 @@ public class HeatPumpStrategy implements DeviceStrategy { // 计算寄存器地址 String regAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4).toUpperCase(); - // 使用 XK814ModbusParserUtil 解析 - Object parsedValue = XK814ModbusParamReadUtil.parse(regAddr, value); + // 使用 XK814ModbusParamReadIntoDBUtil 解析 + Object parsedValue = XK814ModbusParamReadIntoDBUtil.parse(regAddr, value); if (parsedValue != null) { log.info("正帝热泵解析 - 地址: {}, 原始值: {}, 解析结果: {}", regAddr, value, parsedValue); @@ -943,7 +944,7 @@ public class HeatPumpStrategy implements DeviceStrategy { return null; } if (!StringUtils.isBlank(sValue)) { - nowDataService.saveNowHistoryData(deviceInstallEntity.getDeviceAddr(), "热泵", sValue, dataType.toString(), deviceInstallEntity.getBuildingId()); + nowDataService.saveNowHistoryData(deviceInstallEntity.getDeviceAddr(), "热泵", sValue, dataType.toString(), deviceInstallEntity.getBuildingId(), deviceInstallEntity.getDataCom()); log.info("时间: " + dateStr + "热泵ID:" + deviceInstallEntity.getDeviceAddr() + ",数据: " + dataStr + ",保存数据库成功!楼栋名称:" + deviceInstallEntity.getBuildingName()); } return sValue; diff --git a/user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java b/user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java index 8170333..e12a766 100644 --- a/user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java +++ b/user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java @@ -103,7 +103,7 @@ public class TempTransStrategy implements DeviceStrategy { addr = entry.getKey(); data = entry.getValue(); if (addr != null && Integer.parseInt(addr) <= count) { - nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); + nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, deviceCodeParamEntity.getDeviceName()); nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 } } diff --git a/user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java b/user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java index 92ffdd1..7d4e435 100644 --- a/user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java +++ b/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 runState = entry.getValue(); if (addr != null && Integer.parseInt(addr) <= count) { - nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); + nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null); nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); diff --git a/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java b/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java index 326373e..8f40bf2 100644 --- a/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java +++ b/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java @@ -61,6 +61,7 @@ public class SendAndReceiveByTcp { String brand = deviceManageEntityList.get(i).getBrand();//品牌 String buildingId = deviceManageEntityList.get(i).getBuildingId(); String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称 + String dataCom = deviceManageEntityList.get(i).getDataCom(); // 创建设备报文 Device device = DeviceFactory.createDevice(deviceType); DeviceStrategy strategy = DeviceStrategyFactory.createStrategy(deviceType); @@ -110,7 +111,7 @@ public class SendAndReceiveByTcp { String dateStr = DateUtil.dateToString(date1, "yyyy-MM-dd HH:mm:ss"); if (StringUtils.isBlank(receiveMsg)) { log.info("TCP客户端:{},没有数据返回!{}", keyVal, i); - printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService); + printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, dataCom); continue; } // 处理返回来的数据报文 @@ -128,17 +129,17 @@ public class SendAndReceiveByTcp { } } - public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService) { - log.info("----------------{}离线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName); - String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId); + public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService, String dataCom) { + log.info("----------------{}离线,设备号:{},所属楼栋:{},端口号:{}----------------", deviceType, deviceAddr, buildingName, dataCom); + String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId, dataCom); if (time1 == null) { time1 = dateStr; } int d = ExchangeStringUtil.compareCopyTime(time1, dateStr); if (d == 1) { - deviceInstallService.updateNotOnline(deviceAddr, deviceType, buildingId, "离线"); //所有设备离线 + deviceInstallService.updateNotOnline(deviceAddr, deviceType, buildingId, "离线", dataCom); //所有设备离线 if (deviceType.equals("热泵")) { - nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName); //监控界面状态表热泵在线状态 + nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName, dataCom); //监控界面状态表热泵在线状态 } } return; @@ -187,9 +188,9 @@ public class SendAndReceiveByTcp { deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 log.info("----------------{}在线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName); if (deviceType.equals("热泵")) { - String strState = nowDataService.selectState(buildingId, deviceAddr); + String strState = nowDataService.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName()); if (strState != null && strState.equals("离线")) { //采集到数据 - nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 + nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态 } } // 解析返回来的数据 diff --git a/user-service/src/main/java/com/mh/user/tcp/TcpSingle.java b/user-service/src/main/java/com/mh/user/tcp/TcpSingle.java index b195c39..6b3585e 100644 --- a/user-service/src/main/java/com/mh/user/tcp/TcpSingle.java +++ b/user-service/src/main/java/com/mh/user/tcp/TcpSingle.java @@ -8,7 +8,6 @@ import com.mh.user.factory.Device; import com.mh.user.factory.DeviceFactory; import com.mh.user.netty.session.ServerSession; import com.mh.user.netty.session.SessionMap; -import com.mh.user.serialport.SerialTool; import com.mh.user.service.BuildingService; import com.mh.user.service.DeviceInstallService; import com.mh.user.service.NowDataService; @@ -17,16 +16,12 @@ import com.mh.user.strategy.DeviceStrategyFactory; import com.mh.user.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; -import purejavacomm.SerialPort; -import java.io.IOException; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import static com.mh.user.tcp.SendAndReceiveByTcp.printLog; - /** * @author nxr * @title : @@ -107,9 +102,9 @@ public class TcpSingle { deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 log.info("{}在线,设备号:{},所属楼栋:{}", deviceType, deviceAddr, buildingName); if (deviceType.equals("热泵")) { - String strState = nowDataService.selectState(buildingId, deviceAddr); + String strState = nowDataService.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName()); if (strState != null && strState.equals("离线")) { //采集到数据 - nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 + nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态 } } rtData = device.analysisReceiveData(DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"), diff --git a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java index ab645e2..317b530 100644 --- a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java +++ b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java @@ -263,7 +263,7 @@ public class AnalysisReceiveOrder485 { } // 热泵 - public void analysisPumpOrder485(final String dateStr,final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) { + public void analysisPumpOrder485(final String dateStr, final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName, String comName) { String checkStr = receiveData.substring(0, receiveData.length() - 4);//检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码 String sValue = null; @@ -294,7 +294,7 @@ public class AnalysisReceiveOrder485 { //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) { //0642设定温度,0007水箱水温 @@ -321,7 +321,7 @@ public class AnalysisReceiveOrder485 { } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("热泵ID:" + addr + ",数据:" + sValue + ",保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态 dataType = "isFault"; @@ -334,7 +334,7 @@ public class AnalysisReceiveOrder485 { sValue = "有故障"; deviceInstallService.updateDeviceFault("1", addr, "热泵"); } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName); } } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { @@ -366,7 +366,7 @@ public class AnalysisReceiveOrder485 { //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) { //0003设定温度,0064水箱水温 @@ -394,7 +394,7 @@ public class AnalysisReceiveOrder485 { } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("热泵ID: " + addr + ",数据: " + sValue + ",保存数据库成功!楼栋编号:" + buildingId); } else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态 dataType = "isFault"; @@ -405,7 +405,7 @@ public class AnalysisReceiveOrder485 { } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { sValue = "有故障"; } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } } else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) { @@ -424,7 +424,7 @@ public class AnalysisReceiveOrder485 { //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) { //000A设定温度,0046水箱水温 @@ -453,7 +453,7 @@ public class AnalysisReceiveOrder485 { } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态 dataType = "isFault"; @@ -466,7 +466,7 @@ public class AnalysisReceiveOrder485 { sValue = "有故障"; deviceInstallService.updateDeviceFault("1", addr, "热泵"); } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0028") || registerAddr.equalsIgnoreCase("002C") @@ -486,7 +486,7 @@ public class AnalysisReceiveOrder485 { log.info("----------------保存楼栋时间点温度变化值!----------------"); } - public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) { + public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName, String comName) { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf1.format(date); @@ -519,7 +519,7 @@ public class AnalysisReceiveOrder485 { //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) { //0642设定温度,0007水箱水温 @@ -540,7 +540,7 @@ public class AnalysisReceiveOrder485 { } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态 dataType = "isFault"; @@ -553,7 +553,7 @@ public class AnalysisReceiveOrder485 { sValue = "有故障"; deviceInstallService.updateDeviceFault("1", addr, "热泵"); } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") @@ -593,7 +593,7 @@ public class AnalysisReceiveOrder485 { //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) { //0003设定温度,0064水箱水温 @@ -614,7 +614,7 @@ public class AnalysisReceiveOrder485 { } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态 dataType = "isFault"; @@ -625,7 +625,7 @@ public class AnalysisReceiveOrder485 { } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { sValue = "有故障"; } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") @@ -652,7 +652,7 @@ public class AnalysisReceiveOrder485 { //计算热泵运行时间,按分钟 nowDataService.proPumpMinutes(buildingId, addr, sValue); log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) { //000A设定温度,0046水箱水温 @@ -674,7 +674,7 @@ public class AnalysisReceiveOrder485 { } else if (dataType.equals("tempSet")) { pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态 dataType = "isFault"; @@ -687,7 +687,7 @@ public class AnalysisReceiveOrder485 { sValue = "有故障"; deviceInstallService.updateDeviceFault("1", addr, "热泵"); } - nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName); log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); } else if (registerAddr.equalsIgnoreCase("0028") || registerAddr.equalsIgnoreCase("002C") @@ -748,7 +748,7 @@ public class AnalysisReceiveOrder485 { addr = entry.getKey(); data = entry.getValue(); if (addr != null && Integer.parseInt(addr) <= count) { - nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); + nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, null); nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 } } @@ -803,7 +803,7 @@ public class AnalysisReceiveOrder485 { addr = entry.getKey(); data = entry.getValue(); if (addr != null && Integer.valueOf(addr) <= count) { - nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId); + nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, null); nowDataService.proWaterTemp(dateStr, buildingId, addr);//保存时间点温度 } } @@ -1388,7 +1388,7 @@ public class AnalysisReceiveOrder485 { addr = entry.getKey(); //获取Key值作为热泵ID runState = entry.getValue(); if (addr != null && Integer.parseInt(addr) <= count) { - nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); + nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null); nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度 log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); @@ -1542,7 +1542,7 @@ public class AnalysisReceiveOrder485 { addr = entry.getKey(); //获取Key值作为热泵ID runState = entry.getValue(); if (addr != null && Integer.parseInt(addr) <= count) { - nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId); + nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null); nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长 log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState); } diff --git a/user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java b/user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java new file mode 100644 index 0000000..780f3e0 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java @@ -0,0 +1,312 @@ +package com.mh.user.utils; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +/** + * @author LJF + * @version 1.0 + * @project CHWS + * @description 正帝热泵协议解析保存到数据库的值 + * @date 2026-05-25 17:15:42 + */ +public class XK814ModbusParamReadIntoDBUtil { + /** + * XK814 冷热水机 Modbus 协议 V1.0 解析器(第三张表) + * 地址范围:A000 ~ B009, AFFF + */ + // ==================== 地址常量(字符串格式)==================== + public static final String ADDR_DISPLAY_WATER_TEMP = "A000"; // 40960 + public static final String ADDR_TANK_TEMP = "A001"; // 40961 + public static final String ADDR_OUTLET_TEMP = "A002"; // 40962 + public static final String ADDR_INLET_TEMP = "A003"; // 40963 + public static final String ADDR_AMBIENT_TEMP = "A004"; // 40964 + public static final String ADDR_COIL1_TEMP = "A005"; // 40965 + public static final String ADDR_SUCTION1_TEMP = "A006"; // 40966 + public static final String ADDR_EXHAUST1_TEMP = "A007"; // 40967 + public static final String ADDR_VALVE_AFTER1_OR_RETURN = "A008"; // 40968 + public static final String ADDR_RESERVED_A009 = "A009"; + public static final String ADDR_RESERVED_A00A = "A00A"; + public static final String ADDR_MAIN_EXP_VALVE1_OPEN = "A00B"; // 40971 + public static final String ADDR_AUX_EXP_VALVE1_OPEN = "A00C"; // 40972 + public static final String ADDR_COMP1_CURRENT = "A00D"; // 40973 + public static final String ADDR_COIL2_TEMP = "A00E"; // 40974 + public static final String ADDR_SUCTION2_TEMP = "A00F"; // 40975 + public static final String ADDR_EXHAUST2_TEMP = "A010"; // 40976 + public static final String ADDR_VALVE_AFTER2_TEMP = "A011"; // 40977 + public static final String ADDR_RESERVED_A012 = "A012"; + public static final String ADDR_RESERVED_A013 = "A013"; + public static final String ADDR_MAIN_EXP_VALVE2_OPEN = "A014"; // 40980 + public static final String ADDR_AUX_EXP_VALVE2_OPEN = "A015"; // 40981 + public static final String ADDR_COMP2_CURRENT = "A016"; // 40982 + public static final String ADDR_RECOVERABLE_FAULT = "A017"; // 40983 + public static final String ADDR_UNRECOVERABLE_FAULT = "A018"; // 40984 + public static final String ADDR_VERSION_INFO = "A019"; // 40985 + public static final String ADDR_INPUT_SWITCH_STATUS = "A01A"; // 40986 + public static final String ADDR_WATER_LEVEL_SWITCH = "A01B"; // 40987 + public static final String ADDR_OUTPUT1_STATUS = "A01C"; // 40988 + public static final String ADDR_OUTPUT2_STATUS = "A01D"; // 40989 + public static final String ADDR_OUTPUT3_STATUS = "A01E"; // 40990 + public static final String ADDR_DIP_SWITCH = "A01F"; // 40991 + public static final String ADDR_MAINBOARD_TYPE = "A020"; // 40992 + public static final String ADDR_CONSTANT_TEMP_SET = "AFFF"; // 45055 + public static final String ADDR_ON_OFF = "B000"; // 45056 + public static final String ADDR_COOL_SET_TEMP = "B001"; // 45057 + public static final String ADDR_HEAT_SET_TEMP = "B002"; // 45058 + public static final String ADDR_MODE = "B003"; // 45059 + public static final String ADDR_HOT_WATER_SET_TEMP = "B004"; // 45060 + public static final String ADDR_FORCE_ELECTRIC_HEAT = "B005"; // 45061 + public static final String ADDR_FORCE_DEFROST = "B006"; // 45062 + public static final String ADDR_RESERVED_B007 = "B007"; + public static final String ADDR_RETURN_VALVE_TIMER = "B008"; // 45064 + public static final String ADDR_SUPPLY_VALVE_TIMER = "B009"; // 45065 + + // ==================== 解析器映射表 ==================== + private static final Map> PARSERS = new HashMap<>(); + + // ==================== 编码器映射表(写操作) ==================== + private static final Map> ENCODERS = new HashMap<>(); + + static { + // ---------- TEMP1 类型(无符号byte,低8位有效)---------- + // 公式:温度 = (raw - 64) / 2,raw=1 表示传感器故障/未接 + Function temp1Parser = v -> parseTemp1(v & 0xFF); + Function temp1Encoder = val -> encodeTemp1((Double) val); + + // ---------- TEMP2 类型(无符号byte,低8位有效)---------- + // 公式:温度 = raw - 32,raw=1 表示传感器故障/未接 + Function temp2Parser = v -> parseTemp2(v & 0xFF); + Function temp2Encoder = val -> encodeTemp2((Integer) val); + + // ---------- DIGI1 类型(无符号byte,低8位有效)---------- + Function digi1Parser = v -> v & 0xFF; + Function digi1Encoder = val -> ((Number) val).intValue() & 0xFF ; + + // ---------- DIG2 类型(16位无符号整型)---------- + Function dig2Parser = v -> v & 0xFFFF; + Function 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 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 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)); + } + +} diff --git a/user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java b/user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java index dcc2208..439a7cd 100644 --- a/user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java +++ b/user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java @@ -78,6 +78,7 @@ public class XK814ModbusParamWriteUtil { * @param value 物理值(类型需与地址匹配,参考协议) * @return 完整的 RTU 报文(字节数组),包含 CRC */ + // ... existing code ... public static String buildWriteSingleRegisterMessage(int slaveId, String address, Object value) { // 获取编码器 String addrUpper = address.toUpperCase(); @@ -89,26 +90,28 @@ public class XK814ModbusParamWriteUtil { int regValue = encoder.apply(value); // 地址字符串转整数 int regAddr = Integer.parseInt(addrUpper, 16); - // 构建报文(不含 CRC) - byte[] pdu = new byte[6]; - pdu[0] = (byte) (regAddr >> 8); // 地址高字节 - pdu[1] = (byte) (regAddr & 0xFF); // 地址低字节 - pdu[2] = (byte) (regValue >> 8); // 值高字节 - pdu[3] = (byte) (regValue & 0xFF);// 值低字节 + // 构建报文(不含 CRC)- 只包含地址和值,共4字节 + byte[] frameWithoutCRC = new byte[4]; + frameWithoutCRC[0] = (byte) (regAddr >> 8); // 地址高字节 + frameWithoutCRC[1] = (byte) (regAddr & 0xFF); // 地址低字节 + frameWithoutCRC[2] = (byte) (regValue >> 8); // 值高字节 + frameWithoutCRC[3] = (byte) (regValue & 0xFF);// 值低字节 // 添加从机地址和功能码 - byte[] frameWithoutCRC = new byte[1 + 1 + 6]; - frameWithoutCRC[0] = (byte) slaveId; - frameWithoutCRC[1] = 0x06; // 功能码 - System.arraycopy(pdu, 0, frameWithoutCRC, 2, 6); + byte[] fullFrameWithoutCRC = new byte[1 + 1 + 4]; + fullFrameWithoutCRC[0] = (byte) slaveId; + fullFrameWithoutCRC[1] = 0x06; // 功能码 + System.arraycopy(frameWithoutCRC, 0, fullFrameWithoutCRC, 2, 4); // 计算 CRC16 - int crc = calculateCRC(frameWithoutCRC, 0, frameWithoutCRC.length); + int crc = calculateCRC(fullFrameWithoutCRC, 0, fullFrameWithoutCRC.length); // 完整报文 - byte[] fullFrame = new byte[frameWithoutCRC.length + 2]; - System.arraycopy(frameWithoutCRC, 0, fullFrame, 0, frameWithoutCRC.length); + byte[] fullFrame = new byte[fullFrameWithoutCRC.length + 2]; + System.arraycopy(fullFrameWithoutCRC, 0, fullFrame, 0, fullFrameWithoutCRC.length); fullFrame[fullFrame.length - 2] = (byte) (crc & 0xFF); fullFrame[fullFrame.length - 1] = (byte) ((crc >> 8) & 0xFF); return toHexString(fullFrame); } +// ... existing code ... + /** * 重载:地址使用整数形式 diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 5f109b8..081dc84 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: dev + active: prod mvc: pathmatch: matching-strategy: ant_path_matcher diff --git a/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java index 343df81..fce5ba5 100644 --- a/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java +++ b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java @@ -3,6 +3,7 @@ package com.mh.user; import com.mh.user.entity.DeviceManageEntity; import com.mh.user.entity.GaugeEntity; import com.mh.user.job.DealDataJob; +import com.mh.user.job.StartOrStopHotpumpJob; import com.mh.user.serialport.SerialPortThread; import com.mh.user.service.DeviceManageService; import com.mh.user.service.GaugeService; @@ -27,6 +28,14 @@ class UserServiceApplicationTests { void contextLoads() { } + @Autowired + private StartOrStopHotpumpJob startOrStopHotpumpJob; + + @Test + public void testStartOrStopHotpump() { + startOrStopHotpumpJob.startOrStopHotpump(); + } + @Test public void encode() { String s = PasswordUtils.encode("123456", "87e03afa1f0122531f729c9a7453f475"); diff --git a/user-service/src/test/java/com/mh/user/chart/ChartTest.java b/user-service/src/test/java/com/mh/user/chart/ChartTest.java index b366aa3..0b3f4a3 100644 --- a/user-service/src/test/java/com/mh/user/chart/ChartTest.java +++ b/user-service/src/test/java/com/mh/user/chart/ChartTest.java @@ -9,6 +9,7 @@ package com.mh.user.chart; */ public class ChartTest { public static void main(String[] args) { + String[] split = "03_0003_1_14_2_主楼-1号热泵温度设置".split("_"); System.out.println(extracted()); }