38 changed files with 461 additions and 66 deletions
@ -0,0 +1,43 @@
|
||||
package com.mh.user.factory; |
||||
|
||||
import com.mh.user.entity.DeviceCodeParamEntity; |
||||
import com.mh.user.strategy.DeviceStrategy; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project CHWS |
||||
* @description 多路控制控制 |
||||
* @date 2024-03-18 16:53:35 |
||||
*/ |
||||
public class MultiControl implements Device { |
||||
|
||||
private DeviceStrategy strategy; |
||||
|
||||
private static class SingletonHolder { |
||||
private static final MultiControl INSTANCE = new MultiControl(); |
||||
} |
||||
|
||||
private MultiControl() { |
||||
// 防止外部直接实例化
|
||||
} |
||||
|
||||
public static MultiControl getInstance() { |
||||
return MultiControl.SingletonHolder.INSTANCE; |
||||
} |
||||
|
||||
@Override |
||||
public void setStrategy(DeviceStrategy strategy) { |
||||
this.strategy = strategy; |
||||
} |
||||
|
||||
@Override |
||||
public String createOrders(DeviceCodeParamEntity deviceCodeParamEntity) { |
||||
return strategy.createOrders(deviceCodeParamEntity); |
||||
} |
||||
|
||||
@Override |
||||
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { |
||||
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); |
||||
} |
||||
} |
||||
@ -0,0 +1,333 @@
|
||||
package com.mh.user.strategy; |
||||
|
||||
import com.mh.common.utils.StringUtils; |
||||
import com.mh.user.constants.Constant; |
||||
import com.mh.user.entity.DeviceCodeParamEntity; |
||||
import com.mh.user.entity.DeviceInstallEntity; |
||||
import com.mh.user.entity.NowPublicDataEntity; |
||||
import com.mh.user.entity.SysParamEntity; |
||||
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.util.Map; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project CHWS |
||||
* @description 多路控制策略 |
||||
* @date 2024-03-18 09:51:17 |
||||
*/ |
||||
@Slf4j |
||||
public class MultiControlStrategy implements DeviceStrategy { |
||||
|
||||
|
||||
// 调用service
|
||||
ApplicationContext context = SpringBeanUtil.getApplicationContext(); |
||||
NowDataService nowDataService = context.getBean(NowDataService.class); |
||||
|
||||
NowPublicDataService nowPublicDataService = context.getBean(NowPublicDataService.class); |
||||
|
||||
SysParamService sysParamService = context.getBean(SysParamService.class); |
||||
|
||||
BuildingService buildingService = context.getBean(BuildingService.class); |
||||
|
||||
DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); |
||||
|
||||
private static class SingletonHolder { |
||||
private static final MultiControlStrategy INSTANCE = new MultiControlStrategy(); |
||||
} |
||||
|
||||
private MultiControlStrategy() { |
||||
// 防止外部直接实例化
|
||||
} |
||||
|
||||
public static MultiControlStrategy getInstance() { |
||||
return MultiControlStrategy.SingletonHolder.INSTANCE; |
||||
} |
||||
|
||||
@Override |
||||
public String createOrders(DeviceCodeParamEntity deviceCodeParamEntity) { |
||||
String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); |
||||
String brand = deviceCodeParamEntity.getBrand(); |
||||
String funCode = deviceCodeParamEntity.getFunCode(); |
||||
String registerAddr = deviceCodeParamEntity.getRegisterAddr(); |
||||
|
||||
// 设备参数
|
||||
String param = deviceCodeParamEntity.getParam(); |
||||
|
||||
// 设备值
|
||||
String dataValue = deviceCodeParamEntity.getDataValue(); |
||||
|
||||
String str = ""; |
||||
if (deviceAddr != null && !deviceAddr.isEmpty()) { |
||||
try { |
||||
if (Constant.BRAND_YUAN_XIANG.equals(brand)) { |
||||
str = ExchangeStringUtil.decToHex(deviceAddr); |
||||
str = ExchangeStringUtil.addZeroForNum(str, 2); |
||||
if (StringUtils.isBlank(funCode) || funCode.equals("03")) {//读
|
||||
funCode = "03"; |
||||
if (!StringUtils.isBlank(param)) { |
||||
switch (param) { |
||||
case "DO_ALL": |
||||
registerAddr = "00180008"; |
||||
break; |
||||
case "DO1": |
||||
registerAddr = "00180001"; |
||||
break; |
||||
case "DO2": |
||||
registerAddr = "00190001"; |
||||
break; |
||||
case "DO3": |
||||
registerAddr = "001A0001"; |
||||
break; |
||||
case "DO4": |
||||
registerAddr = "001B0001"; |
||||
break; |
||||
case "DO5": |
||||
registerAddr = "001C0001"; |
||||
break; |
||||
case "DO6": |
||||
registerAddr = "001D0001"; |
||||
break; |
||||
case "DO7": |
||||
registerAddr = "001E0001"; |
||||
break; |
||||
case "DO8": |
||||
registerAddr = "001F0001"; |
||||
break; |
||||
case "DI_ALL": |
||||
registerAddr = "00100008"; |
||||
break; |
||||
case "DI1": |
||||
registerAddr = "00100001"; |
||||
break; |
||||
case "DI2": |
||||
registerAddr = "00110001"; |
||||
break; |
||||
case "DI3": |
||||
registerAddr = "00120001"; |
||||
break; |
||||
case "DI4": |
||||
registerAddr = "00130001"; |
||||
break; |
||||
case "DI5": |
||||
registerAddr = "00140001"; |
||||
break; |
||||
case "DI6": |
||||
registerAddr = "00150001"; |
||||
break; |
||||
case "DI7": |
||||
registerAddr = "00160001"; |
||||
break; |
||||
case "DI8": |
||||
registerAddr = "00170001"; |
||||
break; |
||||
} |
||||
} |
||||
str = str + funCode + registerAddr; |
||||
} else if (funCode.equals("06")) { // 写
|
||||
if (!StringUtils.isBlank(param) && !StringUtils.isBlank(dataValue) && dataValue.equals("1")) { |
||||
switch (param) { |
||||
case "DO_ALL": |
||||
registerAddr = "10001800081000010001000100010001000100010001"; //全开
|
||||
break; |
||||
case "DO1": |
||||
registerAddr = "0600180001"; |
||||
break; |
||||
case "DO2": |
||||
registerAddr = "0600190001"; |
||||
break; |
||||
case "DO3": |
||||
registerAddr = "06001A0001"; |
||||
break; |
||||
case "DO4": |
||||
registerAddr = "06001B0001"; |
||||
break; |
||||
case "DO5": |
||||
registerAddr = "06001C0001"; |
||||
break; |
||||
case "DO6": |
||||
registerAddr = "06001D0001"; |
||||
break; |
||||
case "DO7": |
||||
registerAddr = "06001E0001"; |
||||
break; |
||||
case "DO8": |
||||
registerAddr = "06001F0001"; |
||||
break; |
||||
} |
||||
|
||||
} else if (!StringUtils.isBlank(param) && !StringUtils.isBlank(dataValue) && dataValue.equals("0")) { |
||||
switch (param) { |
||||
case "DO_ALL": |
||||
registerAddr = "10001800081000000000000000000000000000000000"; //全开
|
||||
break; |
||||
case "DO1": |
||||
registerAddr = "0600180000"; |
||||
break; |
||||
case "DO2": |
||||
registerAddr = "0600190000"; |
||||
break; |
||||
case "DO3": |
||||
registerAddr = "06001A0000"; |
||||
break; |
||||
case "DO4": |
||||
registerAddr = "06001B0000"; |
||||
break; |
||||
case "DO5": |
||||
registerAddr = "06001C0000"; |
||||
break; |
||||
case "DO6": |
||||
registerAddr = "06001D0000"; |
||||
break; |
||||
case "DO7": |
||||
registerAddr = "06001E0000"; |
||||
break; |
||||
case "DO8": |
||||
registerAddr = "06001F0000"; |
||||
break; |
||||
} |
||||
} |
||||
str = str + registerAddr; //示例:010600180001
|
||||
} |
||||
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
|
||||
str = str + checkWord; |
||||
} |
||||
} catch (Exception e) { |
||||
log.error("生成多路控制指令出错!{}", str, e); |
||||
} |
||||
} |
||||
return str.toUpperCase(); |
||||
} |
||||
|
||||
@Override |
||||
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { |
||||
SysParamEntity sysParamEntity = sysParamService.selectSysParam(); |
||||
String customName = sysParamEntity.getCustomName(); |
||||
return analysisRelayOrder485(dateStr, dataStr, registerAddr, brand, buildingId, buildingName, customName, deviceCodeParamEntity); |
||||
} |
||||
|
||||
// 多路控制,长度42,128
|
||||
public String analysisRelayOrder485(final String dateStr, |
||||
final String receiveData, |
||||
final String registerAddr, |
||||
final String brand, |
||||
String buildingId, |
||||
String buildingName, |
||||
String customName, |
||||
DeviceCodeParamEntity deviceCodeParamEntity) { |
||||
String l1 = ""; |
||||
String l2 = ""; |
||||
String l3 = ""; |
||||
String l4 = ""; |
||||
String l5 = ""; |
||||
String l6 = ""; |
||||
String l7 = ""; |
||||
String l8 = ""; |
||||
String waterLevelSet = ""; |
||||
String addr = ""; |
||||
String param = deviceCodeParamEntity.getParam(); |
||||
if (Constant.BRAND_YUAN_XIANG.equals(brand)) { |
||||
String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文
|
||||
String checkWord = ExchangeStringUtil.getStrCRC16(checkStr); |
||||
if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { |
||||
addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址
|
||||
if (checkStr.startsWith("03", 2)) { |
||||
// 根据请求的param参数进行数据截取
|
||||
switch (param) { |
||||
case "DI_ALL": |
||||
case "DO_ALL": |
||||
l1 = checkStr.substring(6, 10); |
||||
l2 = checkStr.substring(10, 14); |
||||
l3 = checkStr.substring(14, 18); |
||||
l4 = checkStr.substring(18, 22); |
||||
l5 = checkStr.substring(22, 26); |
||||
l6 = checkStr.substring(26, 30); |
||||
l7 = checkStr.substring(30, 34); |
||||
l8 = checkStr.substring(34, 38); |
||||
break; |
||||
case "DI1": |
||||
case "DI2": |
||||
case "DI3": |
||||
case "DI4": |
||||
case "DI5": |
||||
case "DI6": |
||||
case "DI7": |
||||
case "DI8": |
||||
case "DO1": |
||||
case "DO2": |
||||
case "DO3": |
||||
case "DO4": |
||||
case "DO5": |
||||
case "DO6": |
||||
case "DO7": |
||||
case "DO8": |
||||
l1 = checkStr.substring(6, 10); |
||||
break; |
||||
} |
||||
if (!param.contains("ALL")) { |
||||
return l1; |
||||
} else { |
||||
return l1 + l2 + l3 + l4 + l5 + l6 + l7 + l8; |
||||
} |
||||
} else if (checkStr.startsWith("06", 2) || checkStr.startsWith("04", 2) || checkStr.startsWith("10", 2)) { |
||||
log.info("时间:{},多路控制地址:{},DO操作成功! ", dateStr, addr); |
||||
return Constant.SUCCESS; |
||||
} |
||||
} else { |
||||
log.info("多路控制报文检验失败: {}", receiveData); |
||||
} |
||||
if (registerAddr != null && !registerAddr.isEmpty()) { |
||||
if (param.contains("ALL")) { |
||||
NowPublicDataEntity publicData = new NowPublicDataEntity(); |
||||
publicData.setBuildingId(buildingId); |
||||
if (customName.contains(Constant.CUSTOM_NAME_ZBSD)) { |
||||
if (l1.equals("0001") || l2.equals("0001")) { //2,3路,0001表示有输入,0000表示无输入
|
||||
publicData.setUseWater("运行"); //供水
|
||||
} else { |
||||
publicData.setUseWater("不运行"); |
||||
} |
||||
log.info("-----------------供水状态:{}--{}-----------------", l1, l2); |
||||
// 补水(抽水)
|
||||
if (l5.equals("0001") || l6.equals("0001")) { |
||||
publicData.setUpWater("运行");//回水
|
||||
} else { |
||||
publicData.setUpWater("不运行"); |
||||
} |
||||
log.info("-----------------补水状态:{}--{}-----------------", l5, l6); |
||||
} |
||||
nowPublicDataService.saveNowHistoryPublicData(publicData); |
||||
log.info("地址:{},供回补水状态保存数据库成功!楼栋ID:{},名称:{}", addr, buildingId, buildingName); |
||||
// 更新now_data表中对应的供水、回水、补水状态
|
||||
DeviceInstallEntity deviceInstallEntity = deviceInstallService.selectDevice(addr, "多路控制", buildingId); |
||||
if (deviceInstallEntity != null |
||||
&& !StringUtils.isBlank(deviceInstallEntity.getDeviceName())) { |
||||
if (deviceInstallEntity.getDeviceName().contains("低")) { |
||||
log.info("更新now_data表中低区对应的供水、回水、补水状态,楼栋ID:{},供水状态:{},回水状态:{},补水状态:{}", buildingId, publicData.getUseWater(), publicData.getBackWater(), publicData.getUpWater()); |
||||
nowDataService.updateNowDataByPumpName("低", buildingId, publicData.getUseWater(), publicData.getBackWater(), publicData.getUpWater()); |
||||
} else if (deviceInstallEntity.getDeviceName().contains("高")) { |
||||
log.info("更新now_data表中高区对应的供水、回水、补水状态,楼栋ID:{},供水状态:{},回水状态:{},补水状态:{}", buildingId, publicData.getUseWater(), publicData.getBackWater(), publicData.getUpWater()); |
||||
nowDataService.updateNowDataByPumpName("高", buildingId, publicData.getUseWater(), publicData.getBackWater(), publicData.getUpWater()); |
||||
} else { |
||||
nowDataService.updateNowDataByPumpName(null, buildingId, publicData.getUseWater(), publicData.getBackWater(), publicData.getUpWater()); |
||||
} |
||||
// 判断今天的记录是否存在多个补水,供水,回水状态值
|
||||
Map<String, Object> states = nowDataService.selectTopOneState(buildingId); |
||||
if (states != null && !states.isEmpty()) { |
||||
publicData.setUpWater(String.valueOf(states.get("up_water_state"))); |
||||
publicData.setUseWater(String.valueOf(states.get("use_water_state"))); |
||||
publicData.setBackWater(String.valueOf(states.get("back_water_state"))); |
||||
} |
||||
nowDataService.updateNowPublicData(publicData); |
||||
} |
||||
} |
||||
} |
||||
return Constant.FAIL; |
||||
} |
||||
return l1; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue