package com.mh.user.strategy; import com.mh.user.constants.Constant; import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.service.*; import com.mh.user.utils.ExchangeStringUtil; import com.mh.user.utils.SpringBeanUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import java.text.DecimalFormat; /** * @author LJF * @version 1.0 * @project CHWS * @description 压力变送器策略 * @date 2024-03-18 09:51:17 */ @Slf4j public class PressureTransStrategy implements DeviceStrategy { // 调用service ApplicationContext context = SpringBeanUtil.getApplicationContext(); NowDataService nowDataService = context.getBean(NowDataService.class); DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); BuildingService buildingService = context.getBean(BuildingService.class); private static class SingletonHolder { private static final PressureTransStrategy INSTANCE = new PressureTransStrategy(); } private PressureTransStrategy() { // 防止外部直接实例化 } public static PressureTransStrategy getInstance() { return PressureTransStrategy.SingletonHolder.INSTANCE; } @Override public String createOrders(DeviceCodeParamEntity deviceCodeParamEntity) { String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); String brand = deviceCodeParamEntity.getBrand(); String str = ""; if (deviceAddr != null && deviceAddr.length() > 0) { try { str = ExchangeStringUtil.decToHex(deviceAddr); //十进制转为十六进制 str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 if (Constant.BRAND_AU_SUN.equals(brand)) { str = str + "0300040001"; // 新款压力变送器 } else if (Constant.BRAND_RU_YI.equals(brand)) { str = str + "0300040001"; } else { str = str + "0300000002"; // 压力变送器(新的协议) } String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; } catch (Exception e) { log.info("生成压变指令出错!" + str, e); } } return str.toUpperCase(); } @Override public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr) { String result = "fail"; String checkStr = dataStr.substring(0, dataStr.length() - 4);// 检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码 if (!checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { log.info("压变报文检验失败: " + dataStr); return result; } String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 double wtHeight = 0.0; if (brand == null || brand.equals("")) { float fdata = ExchangeStringUtil.hexToSingle(checkStr.substring(6, 14));//十六进制转浮点型 wtHeight = fdata * 1.02; //通过压力求水高 } else if (Constant.BRAND_AU_SUN.equals(brand) || Constant.BRAND_RU_YI.equals(brand)) { data = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10));//十六进制转整形 wtHeight = Double.parseDouble(data) / 100 * 0.102; //通过压力求水高 } Double tankHeight = buildingService.queryTankHeight(buildingId);//水箱高,从数据库获取 if (tankHeight == null) { tankHeight = 2.0; } Double wtLevel = wtHeight / tankHeight * 100; //水箱水位 log.info("------水箱水高:" + wtLevel + "------"); if (wtLevel <= 0) { wtLevel = 0.0; } else if (wtLevel >= 100) { wtLevel = 100.0; } DecimalFormat df = new DecimalFormat("0.0"); String strWtLevel = df.format(wtLevel); // 更新device_install数据 deviceInstallService.updateLastValueByOther(addr, strWtLevel, "压变", buildingId); nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId); log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); nowDataService.proWaterLevel(dateStr, buildingId, addr); //楼栋水位 log.info("------保存每栋楼小时水位情况" + dateStr + "------"); result = strWtLevel; } return result; } }