You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
4.8 KiB
110 lines
4.8 KiB
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; |
|
} |
|
}
|
|
|