Browse Source

1、mqtt数据处理修复;

2、控制热泵温度设置添加;
dev
25604 2 days ago
parent
commit
32bebfb286
  1. 49
      user-service/src/main/java/com/mh/user/config/MyJacksonConfig.java
  2. 2
      user-service/src/main/java/com/mh/user/dto/HotWaterControlListVO.java
  3. 4
      user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java
  4. 12
      user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java
  5. 5
      user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java
  6. 2
      user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java
  7. 34
      user-service/src/main/java/com/mh/user/model/MyBigDecimalDeserializer.java
  8. 12
      user-service/src/main/java/com/mh/user/model/SanShiFengDatas.java
  9. 19
      user-service/src/main/java/com/mh/user/model/SanShiFengReceiver.java
  10. 33
      user-service/src/main/java/com/mh/user/model/SanShiFengStrDatas.java
  11. 2
      user-service/src/main/java/com/mh/user/service/DeviceInstallService.java
  12. 17
      user-service/src/main/java/com/mh/user/service/impl/CollectionParamsManageServiceImpl.java
  13. 30
      user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java
  14. 15
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  15. 4
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  16. 10
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttInboundConfig.java
  17. 48
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/EventsServiceImpl.java
  18. 21
      user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java
  19. 4
      user-service/src/main/java/com/mh/user/strategy/SystemParamsStrategy.java
  20. 13
      user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java
  21. 2
      user-service/src/main/resources/application.yml

49
user-service/src/main/java/com/mh/user/config/MyJacksonConfig.java

@ -0,0 +1,49 @@
package com.mh.user.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.mh.user.model.MyBigDecimalDeserializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.math.BigDecimal;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 避免使用科学计数算法
* @date 2026-01-07 14:37:11
*/
@Configuration
public class MyJacksonConfig {
@Bean("customObjectMapper")
public ObjectMapper customObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 注册 JavaTimeModule
mapper.registerModule(new JavaTimeModule());
// 启用 BigDecimal 作为普通格式输出(避免科学计数法)
mapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
// 注册自定义反序列化器
SimpleModule module = new SimpleModule();
module.addDeserializer(BigDecimal.class, new MyBigDecimalDeserializer());
mapper.registerModule(module);
// 启用 BigDecimal 处理浮点数
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
return mapper;
}
}

2
user-service/src/main/java/com/mh/user/dto/HotWaterControlListVO.java

@ -44,6 +44,8 @@ public class HotWaterControlListVO {
private int ctOrderNum; private int ctOrderNum;
private int digits;
public BigDecimal getCurValue() { public BigDecimal getCurValue() {
return curValue; return curValue;
} }

4
user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java

@ -161,9 +161,10 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
" di.id as device_id, " + " di.id as device_id, " +
" di.device_name, " + " di.device_name, " +
" cpm.other_name, " + " cpm.other_name, " +
" cpm.cur_value, " + " COALESCE(cpm.cur_value, 0) as cur_value, " +
" cpm.cur_time, " + " cpm.cur_time, " +
" cpm.param_type_id, " + " cpm.param_type_id, " +
" cpm.digits, " +
" ct.order_num AS ct_order_num, " + " ct.order_num AS ct_order_num, " +
" di.order_num AS dl_order_num " + " di.order_num AS dl_order_num " +
"FROM " + "FROM " +
@ -186,6 +187,7 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
@Result(column = "cur_value", property = "curValue"), @Result(column = "cur_value", property = "curValue"),
@Result(column = "cur_time", property = "curTime"), @Result(column = "cur_time", property = "curTime"),
@Result(column = "param_type_id", property = "paramTypeId"), @Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "digits", property = "digits"),
@Result(column = "ct_order_num", property = "ctOrderNum"), @Result(column = "ct_order_num", property = "ctOrderNum"),
@Result(column = "dl_order_num", property = "dlOrderNum") @Result(column = "dl_order_num", property = "dlOrderNum")
}) })

12
user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java

@ -24,7 +24,7 @@ public interface DataResultMapper {
" <if test='curValue!=null'> , cur_value = #{curValue} </if>" + " <if test='curValue!=null'> , cur_value = #{curValue} </if>" +
" <if test='ratio!=null'> , ratio = #{ratio} </if>" + " <if test='ratio!=null'> , ratio = #{ratio} </if>" +
" <if test='calcValue!=null'> , calc_value = #{calcValue} </if>" + " <if test='calcValue!=null'> , calc_value = #{calcValue} </if>" +
" where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType}" + " where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id = #{buildingId}" +
"</script>") "</script>")
void updateDataResult(DataResultEntity dataResultEntity); void updateDataResult(DataResultEntity dataResultEntity);
@ -60,16 +60,18 @@ public interface DataResultMapper {
//查询单条记录 //查询单条记录
@ResultMap("rs") @ResultMap("rs")
@Select("select * from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} ") @Select("select top 1 * from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id = #{buildingId} ")
DataResultEntity selectDataResult(@Param("curDate") String curDate, DataResultEntity selectDataResult(@Param("curDate") String curDate,
@Param("deviceAddr") String deviceAddr, @Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType); @Param("deviceType") String deviceType,
@Param("buildingId") String buildingId);
//查询是否存在记录 //查询是否存在记录
@Select("select count(*) from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} ") @Select("select count(*) from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id = #{buildingId} ")
// @Select("select count(*) from data_result") // @Select("select count(*) from data_result")
int selectDataResultCount(@Param("curDate") String curDate, int selectDataResultCount(@Param("curDate") String curDate,
@Param("deviceAddr") String deviceAddr, @Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType); @Param("deviceType") String deviceType,
@Param("buildingId") String buildingId);
} }

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

@ -305,11 +305,12 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("buildingId") String buildingId); @Param("buildingId") String buildingId);
//更新基表初始值 //更新基表初始值
@Update("update device_install set init_value=#{initValue} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} ") @Update("update device_install set init_value=#{initValue} where id = #{id} ")
void updateInitValue(@Param("deviceAddr") String deviceAddr, void updateInitValue(@Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType, @Param("deviceType") String deviceType,
@Param("buildingId") String buildingId, @Param("buildingId") String buildingId,
@Param("initValue") String initValue); @Param("initValue") String initValue,
@Param("id") Long id);
//查询最后一次采集时间 //查询最后一次采集时间
@Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}") @Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}")

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

@ -213,7 +213,7 @@ public interface NowDataMapper {
//查询历史表记录(热泵) //查询历史表记录(热泵)
@ResultMap(value = "rs") @ResultMap(value = "rs")
@Select("select * from history_data where cur_date=#{curDate} and building_id=#{buildingId} and pump_id=#{pumpId}") @Select("select top 1 * from history_data where cur_date=#{curDate} and building_id=#{buildingId} and pump_id=#{pumpId} ")
NowDataEntity selectHistoryData(@Param("curDate") String curDate,@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); NowDataEntity selectHistoryData(@Param("curDate") String curDate,@Param("buildingId") String buildingId,@Param("pumpId") String pumpId);
//判断历史表有没有记录(非热泵) //判断历史表有没有记录(非热泵)

34
user-service/src/main/java/com/mh/user/model/MyBigDecimalDeserializer.java

@ -0,0 +1,34 @@
package com.mh.user.model;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.math.BigDecimal;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 格式化
* @date 2026-01-07 14:20:36
*/
public class MyBigDecimalDeserializer extends JsonDeserializer<BigDecimal> {
@Override
public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
if (value == null || value.trim().isEmpty()) {
return BigDecimal.ZERO;
}
try {
// 直接使用字符串构造BigDecimal,能正确处理科学计数法
return new BigDecimal(value);
} catch (NumberFormatException e) {
// 如果转换失败,返回0
return BigDecimal.ZERO;
}
}
}

12
user-service/src/main/java/com/mh/user/model/SanShiFengDatas.java

@ -1,7 +1,11 @@
package com.mh.user.model; package com.mh.user.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
/** /**
* @author LJF * @author LJF
* @version 1.0 * @version 1.0
@ -10,7 +14,7 @@ import lombok.Data;
* @date 2025-01-22 14:47:25 * @date 2025-01-22 14:47:25
*/ */
@Data @Data
public class SanShiFengDatas<T extends String> { public class SanShiFengDatas {
/** /**
* 对应研华的标签值 * 对应研华的标签值
@ -20,8 +24,10 @@ public class SanShiFengDatas<T extends String> {
/** /**
* 上报值 * 上报值
*/ */
private T value; // 使用自定义反序列化器处理科学计数法
@JsonDeserialize(using = MyBigDecimalDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING) // 以字符串形式输出,避免科学计数法
private BigDecimal value;
// /** // /**
// * 质量值 // * 质量值
// */ // */

19
user-service/src/main/java/com/mh/user/model/SanShiFengReceiver.java

@ -10,11 +10,10 @@ import java.util.List;
* @author LJF * @author LJF
* @version 1.0 * @version 1.0
* @project EEMCS * @project EEMCS
* @description 研华网关发送接收数据 * @description 三石峰网关发送接收数据
* @date 2025-01-22 14:43:15 * @date 2025-01-22 14:43:15
*/ */
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SanShiFengReceiver<T> { public class SanShiFengReceiver<T> {
/** /**
@ -33,13 +32,13 @@ public class SanShiFengReceiver<T> {
private String time; private String time;
// 确保在 getDatas() 方法中正确处理泛型类型 // // 确保在 getDatas() 方法中正确处理泛型类型
public List<SanShiFengDatas> getDatas() { // public List<SanShiFengStrDatas> getDatas() {
// 如果是从 JSON 反序列化,使用 TypeReference // // 如果是从 JSON 反序列化,使用 TypeReference
if (this.datas != null) { // if (this.datas != null) {
return (List<SanShiFengDatas>) this.datas; // return (List<SanShiFengStrDatas>) this.datas;
} // }
return Collections.emptyList(); // return Collections.emptyList();
} // }
} }

33
user-service/src/main/java/com/mh/user/model/SanShiFengStrDatas.java

@ -0,0 +1,33 @@
package com.mh.user.model;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 三石峰数据体
* @date 2025-01-22 14:47:25
*/
@Data
public class SanShiFengStrDatas {
/**
* 对应研华的标签值
*/
private String name;
/**
* 上报值
*/
// 使用自定义反序列化器处理科学计数法
private String value;
// /**
// * 质量值
// */
// private T quality;
}

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

@ -156,7 +156,7 @@ public interface DeviceInstallService {
void deletePump(String deviceAddr,String deviceType,String buildingId); void deletePump(String deviceAddr,String deviceType,String buildingId);
//更新基表初始值 //更新基表初始值
void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue); 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);

17
user-service/src/main/java/com/mh/user/service/impl/CollectionParamsManageServiceImpl.java

@ -10,6 +10,7 @@ import com.mh.user.service.CollectionParamsManageService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -293,6 +294,10 @@ public class CollectionParamsManageServiceImpl implements CollectionParamsManage
hotPumpVo.setStop(item.getCurValue().toString()); hotPumpVo.setStop(item.getCurValue().toString());
hotPumpVo.setStopId(item.getCpmId()); hotPumpVo.setStopId(item.getCpmId());
break; break;
case "7":
// 温度设定
hotPumpVo.setSetTemp(item.getCurValue());
hotPumpVo.setSetTempId(item.getCpmId());
default: default:
break; break;
} }
@ -695,6 +700,18 @@ public class CollectionParamsManageServiceImpl implements CollectionParamsManage
case "13": case "13":
case "14": case "14":
// 水电表读数 // 水电表读数
// 获取保留小数位
// 获取保留小数位
int digits = item.getDigits();
// 10的n次方
BigDecimal power = BigDecimal.ONE.scaleByPowerOfTen(digits);
BigDecimal originalValue = item.getCurValue();
// 将数值按指定小数位数格式化
BigDecimal formattedValue = originalValue.divide(power, 2, RoundingMode.HALF_UP);
item.setCurValue(formattedValue);
meterVo.setTotalReading(item.getCurValue()); meterVo.setTotalReading(item.getCurValue());
meterVo.setTotalReadingId(item.getCpmId()); meterVo.setTotalReadingId(item.getCpmId());
meterVo.setCurrentTime(item.getCurTime()); meterVo.setCurrentTime(item.getCurTime());

30
user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java

@ -33,9 +33,11 @@ public class DataResultServiceImpl implements DataResultService {
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.000"); private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.000");
private static final SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override @Override
public void saveDataResult(DataResultEntity dataResultEntity) { public void saveDataResult(DataResultEntity dataResultEntity) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
double lastValue=0; double lastValue=0;
double calcValue=0; double calcValue=0;
double initValue=0; double initValue=0;
@ -53,7 +55,10 @@ public class DataResultServiceImpl implements DataResultService {
dataResultEntity.setCurDate(formattedDate); dataResultEntity.setCurDate(formattedDate);
//从安装表获取设备信息 //从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType(),dataResultEntity.getBuildingId()); DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId());
double ratio=deviceInstallEntity.getRatio(); //倍率 double ratio=deviceInstallEntity.getRatio(); //倍率
initValue=deviceInstallEntity.getInitValue(); initValue=deviceInstallEntity.getInitValue();
dayValue=deviceInstallEntity.getDayValue(); dayValue=deviceInstallEntity.getDayValue();
@ -69,15 +74,21 @@ public class DataResultServiceImpl implements DataResultService {
} }
dayValue=100; dayValue=100;
} }
int r = dataResultMapper.selectDataResultCount(sdf1.format(dataResultEntity.getCurDate()), int r = dataResultMapper.selectDataResultCount(
dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType()); sdf1.format(dataResultEntity.getCurDate()),
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId());
if (r==0){//插入记录 if (r==0){//插入记录
// 获取上一个抄表记录curValue,curDate // 获取上一个抄表记录curValue,curDate
// dataResultEntity.getCurDate()减去5分钟, // dataResultEntity.getCurDate()减去5分钟,
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(dataResultEntity.getCurDate()); calendar.setTime(dataResultEntity.getCurDate());
calendar.add(Calendar.MINUTE, -5); calendar.add(Calendar.MINUTE, -5);
DataResultEntity lastData = dataResultMapper.selectDataResult(sdf1.format(calendar.getTime()),dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType()); DataResultEntity lastData = dataResultMapper.selectDataResult(sdf1.format(calendar.getTime()),
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId());
DataResultEntity data=new DataResultEntity(); DataResultEntity data=new DataResultEntity();
data.setDeviceAddr(dataResultEntity.getDeviceAddr()); //通讯地址 data.setDeviceAddr(dataResultEntity.getDeviceAddr()); //通讯地址
data.setDeviceType(dataResultEntity.getDeviceType()); //设备类型 data.setDeviceType(dataResultEntity.getDeviceType()); //设备类型
@ -123,7 +134,10 @@ public class DataResultServiceImpl implements DataResultService {
} }
}else {//修改记录的curValue、calcValue }else {//修改记录的curValue、calcValue
DataResultEntity data2=dataResultMapper.selectDataResult(sdf1.format(dataResultEntity.getCurDate()),dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType()); DataResultEntity data2=dataResultMapper.selectDataResult(sdf1.format(dataResultEntity.getCurDate()),
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId());
lastValue=data2.getLastValue(); //安装基表上次读数 lastValue=data2.getLastValue(); //安装基表上次读数
calcValue=dataResultEntity.getCurValue()-lastValue; //计算用量 calcValue=dataResultEntity.getCurValue()-lastValue; //计算用量
String curDate=sdf1.format(dataResultEntity.getCurDate()); String curDate=sdf1.format(dataResultEntity.getCurDate());
@ -156,7 +170,9 @@ public class DataResultServiceImpl implements DataResultService {
} }
if(initValue==0){//第一次采集的时候 if(initValue==0){//第一次采集的时候
deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date); deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date);
deviceInstallMapper.updateInitValue(dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType(),dataResultEntity.getBuildingId(),String.valueOf(curValue)); deviceInstallMapper.updateInitValue(dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId(),String.valueOf(dataResultEntity.getCurValue()), deviceInstallEntity.getId());
} }
}catch (Exception e){ }catch (Exception e){
//e.printStackTrace(); //e.printStackTrace();

15
user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java

@ -6,10 +6,7 @@ import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.entity.*; import com.mh.user.entity.*;
import com.mh.user.mapper.CollectionParamsManageMapper; import com.mh.user.mapper.CollectionParamsManageMapper;
import com.mh.user.model.DeviceModel; import com.mh.user.model.*;
import com.mh.user.model.SanShiFengDatas;
import com.mh.user.model.SanShiFengReceiver;
import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSingle2; import com.mh.user.serialport.SerialPortSingle2;
import com.mh.user.service.*; import com.mh.user.service.*;
import com.mh.user.utils.DateUtil; import com.mh.user.utils.DateUtil;
@ -72,9 +69,9 @@ public class DeviceControlServiceImpl implements DeviceControlService {
@Override @Override
public String operationDevice(SerialPortModel params) { public String operationDevice(SerialPortModel params) {
// 拼接发送的报文 // 拼接发送的报文
SanShiFengReceiver<SanShiFengDatas> sendData = new SanShiFengReceiver<>(); SanShiFengReceiver<SanShiFengStrDatas> sendData = new SanShiFengReceiver<>();
try { try {
List<SanShiFengDatas> advantechDatas = getAdvantechDatas(params); List<SanShiFengStrDatas> advantechDatas = getAdvantechDatas(params);
if (null == advantechDatas) { if (null == advantechDatas) {
return Constant.FAIL; return Constant.FAIL;
} }
@ -90,8 +87,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
return JSONObject.toJSONString(sendData); return JSONObject.toJSONString(sendData);
} }
public List<SanShiFengDatas> getAdvantechDatas(SerialPortModel params) { public List<SanShiFengStrDatas> getAdvantechDatas(SerialPortModel params) {
List<SanShiFengDatas> advantechDatas = new ArrayList<>(); List<SanShiFengStrDatas> advantechDatas = new ArrayList<>();
String dataValue = params.getDataValue(); String dataValue = params.getDataValue();
// 获取报文类型 // 获取报文类型
// 获取报文其他信息 // 获取报文其他信息
@ -104,7 +101,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
return null; return null;
} }
// 发送报文 // 发送报文
SanShiFengDatas data = new SanShiFengDatas(); SanShiFengStrDatas data = new SanShiFengStrDatas();
data.setName(otherName); data.setName(otherName);
data.setValue(dataValue); data.setValue(dataValue);
advantechDatas.add(data); advantechDatas.add(data);

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

@ -444,8 +444,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
} }
@Override @Override
public void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue) { public void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue, Long id) {
deviceInstallMapper.updateInitValue(deviceAddr, deviceType, buildingId, initValue); deviceInstallMapper.updateInitValue(deviceAddr, deviceType, buildingId, initValue, id);
} }
@Override @Override

10
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttInboundConfig.java

@ -99,11 +99,11 @@ public class MqttInboundConfig {
@ServiceActivator(inputChannel = ChannelName.DEFAULT_BOUND) @ServiceActivator(inputChannel = ChannelName.DEFAULT_BOUND)
public MessageHandler handler() { public MessageHandler handler() {
return message -> { return message -> {
// log.info("The default channel does not handle messages." + log.info("The default channel does not handle messages." +
// "\nTopic: {}" + "\nTopic: {}" +
// "\nPayload: {}", "\nPayload: {}",
// message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC), message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC),
// message.getPayload()); message.getPayload());
}; };
} }

48
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/EventsServiceImpl.java

@ -1,6 +1,7 @@
package com.mh.user.service.mqtt.service.impl; package com.mh.user.service.mqtt.service.impl;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
import com.mh.user.constants.ChannelName; import com.mh.user.constants.ChannelName;
@ -20,6 +21,7 @@ import com.mh.user.strategy.DeviceStrategyFactory;
import io.netty.util.CharsetUtil; import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -42,6 +44,7 @@ import java.util.Objects;
public class EventsServiceImpl implements IEventsService { public class EventsServiceImpl implements IEventsService {
@Autowired @Autowired
@Qualifier("customObjectMapper")
private ObjectMapper mapper; private ObjectMapper mapper;
@Autowired @Autowired
@ -86,8 +89,9 @@ public class EventsServiceImpl implements IEventsService {
private void handleInboundData(byte[] receiver,String topic, String logMessage) { private void handleInboundData(byte[] receiver,String topic, String logMessage) {
try { try {
SanShiFengReceiver datas = new SanShiFengReceiver(); // 使用 TypeReference 确保泛型信息被保留
datas = mapper.readValue(receiver, SanShiFengReceiver.class); SanShiFengReceiver<SanShiFengDatas> datas = mapper.readValue(receiver,
new TypeReference<SanShiFengReceiver<SanShiFengDatas>>() {});
log.info("主题:{},类型:{}: ,数据:{}", topic, logMessage, datas.toString()); log.info("主题:{},类型:{}: ,数据:{}", topic, logMessage, datas.toString());
// 开始遍历 数据 // 开始遍历 数据
String sn = datas.getSn(); String sn = datas.getSn();
@ -108,7 +112,15 @@ public class EventsServiceImpl implements IEventsService {
log.warn("数据列表为空,SN: {}", sn); log.warn("数据列表为空,SN: {}", sn);
return; return;
} }
// 并行处理数据列表,避免阻塞 // 先批量更新collectionParam
rawDataList.parallelStream().forEach(rawData -> {
try {
processDataUpdateCpmItem(rawData, sn, plcName, projectName, time, buildingId);
} catch (Exception e) {
log.error("处理单个数据项失败: {}", rawData, e);
}
});
// 并行处理数据列表,主线程等待处理完
rawDataList.parallelStream().forEach(rawData -> { rawDataList.parallelStream().forEach(rawData -> {
try { try {
processDataItem(rawData, sn, plcName, projectName, time, buildingId); processDataItem(rawData, sn, plcName, projectName, time, buildingId);
@ -121,7 +133,7 @@ public class EventsServiceImpl implements IEventsService {
} }
} }
private void processDataItem(Object rawData, String sn, String plcName, String projectName, String time, String buildingId) { private void processDataUpdateCpmItem(Object rawData, String sn, String plcName, String projectName, String time, String buildingId) {
// 安全地转换对象 // 安全地转换对象
SanShiFengDatas data = convertDataItem(rawData); SanShiFengDatas data = convertDataItem(rawData);
if (data == null) { if (data == null) {
@ -129,7 +141,7 @@ public class EventsServiceImpl implements IEventsService {
return; return;
} }
// 不使用消息队列,查询属于哪种设备类型,然后通过策略进行数据解析 // 不使用消息队列,查询属于哪种设备类型,然后通过策略进行数据解析
log.info("设备SN:{},PLC名称:{},项目名称:{},时间:{},数据:{}", sn, plcName, projectName, time, data.toString()); // log.info("设备SN:{},PLC名称:{},项目名称:{},时间:{},数据:{}", sn, plcName, projectName, time, data.toString());
// 获取点位参数名称 // 获取点位参数名称
String name = data.getName(); String name = data.getName();
// 获取点位值 // 获取点位值
@ -141,6 +153,28 @@ public class EventsServiceImpl implements IEventsService {
} }
// 直接更新collectionParamManage参数值 // 直接更新collectionParamManage参数值
collectionParamManageService.updateCPMByOtherName(name, value, time, buildingId); collectionParamManageService.updateCPMByOtherName(name, value, time, buildingId);
}
private void processDataItem(Object rawData, String sn, String plcName, String projectName, String time, String buildingId) {
// 安全地转换对象
SanShiFengDatas data = convertDataItem(rawData);
if (data == null) {
log.warn("数据转换失败,跳过处理");
return;
}
// 不使用消息队列,查询属于哪种设备类型,然后通过策略进行数据解析
// log.info("设备SN:{},PLC名称:{},项目名称:{},时间:{},数据:{}", sn, plcName, projectName, time, data.toString());
// 获取点位参数名称
String name = data.getName();
// 获取点位值
BigDecimal value = new BigDecimal(0);
try {
value = new BigDecimal(String.valueOf(data.getValue()));
} catch (Exception e) {
value = BigDecimal.ZERO;
}
// 直接更新collectionParamManage参数值
//collectionParamManageService.updateCPMByOtherName(name, value, time, buildingId);
// 查询device_install表,走之前的逻辑 // 查询device_install表,走之前的逻辑
CollectionParamsManageEntity collectionParamsManageEntity = collectionParamManageService.selectDeviceInstallByOtherName(name, buildingId); CollectionParamsManageEntity collectionParamsManageEntity = collectionParamManageService.selectDeviceInstallByOtherName(name, buildingId);
if (null != collectionParamsManageEntity && collectionParamsManageEntity.getDeviceInstallId() != null) { if (null != collectionParamsManageEntity && collectionParamsManageEntity.getDeviceInstallId() != null) {
@ -152,7 +186,7 @@ public class EventsServiceImpl implements IEventsService {
DeviceStrategy strategy = DeviceStrategyFactory.createStrategy(deviceType); DeviceStrategy strategy = DeviceStrategyFactory.createStrategy(deviceType);
if (strategy != null) { if (strategy != null) {
device.setStrategy(strategy); device.setStrategy(strategy);
device.analysisMQTTReceiveData(time, deviceInstallEntity.getDeviceAddr(), String.valueOf(value), Constant.READ, deviceInstallEntity, collectionParamsManageEntity); device.analysisMQTTReceiveData(time, deviceInstallEntity.getDeviceAddr(), value.toPlainString(), Constant.READ, deviceInstallEntity, collectionParamsManageEntity);
} }
} }
} }
@ -177,7 +211,7 @@ public class EventsServiceImpl implements IEventsService {
} catch (Exception e) { } catch (Exception e) {
log.error("数据转换异常", e); log.error("数据转换异常", e);
data.setName(getJsonValueAsString(rawData, "name")); data.setName(getJsonValueAsString(rawData, "name"));
data.setValue("-1"); data.setValue(new BigDecimal("-1"));
} }
return data; return data;
} }

21
user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java

@ -12,6 +12,8 @@ import com.mh.user.utils.SpringBeanUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date; import java.util.Date;
/** /**
@ -158,14 +160,29 @@ public class EleMeterStrategy implements DeviceStrategy {
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity,
CollectionParamsManageEntity collectionParamsManageEntity) { CollectionParamsManageEntity collectionParamsManageEntity) {
String data = Constant.FAIL; String data = Constant.FAIL;
if (Integer.parseInt(dataStr) < 0) { if ((new BigDecimal(dataStr)).compareTo(new BigDecimal(0)) < 0) {
return data; return data;
} }
log.info("电表表号:{},电表读数:{}", deviceInstallEntity.getDeviceAddr(), dataStr);
// 考虑dataStr是否走大数或者走小数 // 考虑dataStr是否走大数或者走小数
// 获取保留的小数位
Integer digits = collectionParamsManageEntity.getDigits();
Integer grade = collectionParamsManageEntity.getGrade();
if (grade != 40) {
return data;
}
// dataStr保留小数位
// 10的n次方
BigDecimal power = BigDecimal.ONE.scaleByPowerOfTen(digits);
// dataStr判断是否是科学表示法,是则转换为普通表示法
dataStr = ExchangeStringUtil.isScientificNotation(dataStr);
BigDecimal originalValue = new BigDecimal(dataStr);
// 将数值按指定小数位数格式化
dataStr = originalValue.divide(power, 2, RoundingMode.HALF_UP).toString();
if (Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()>1000 || Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()<0) { if (Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()>1000 || Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()<0) {
dataStr = String.valueOf(deviceInstallEntity.getLastValue()); dataStr = String.valueOf(deviceInstallEntity.getLastValue());
} }
log.info("电表表号:{},电表读数:{}", deviceInstallEntity.getDeviceAddr(), dataStr);
try { try {
DataResultEntity dataResultEntity = new DataResultEntity(); DataResultEntity dataResultEntity = new DataResultEntity();
dataResultEntity.setDeviceAddr(deviceInstallEntity.getDeviceAddr());//通讯编号 dataResultEntity.setDeviceAddr(deviceInstallEntity.getDeviceAddr());//通讯编号

4
user-service/src/main/java/com/mh/user/strategy/SystemParamsStrategy.java

@ -13,6 +13,8 @@ import com.mh.user.utils.SpringBeanUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import java.math.BigDecimal;
/** /**
* @author LJF * @author LJF
* @version 1.0 * @version 1.0
@ -61,7 +63,7 @@ public class SystemParamsStrategy implements DeviceStrategy {
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity,
CollectionParamsManageEntity collectionParamsManageEntity) { CollectionParamsManageEntity collectionParamsManageEntity) {
String result = Constant.FAIL; String result = Constant.FAIL;
if (Integer.parseInt(dataStr) < 0) { if ((new BigDecimal(dataStr)).compareTo(new BigDecimal(0)) < 0) {
log.info("系统参数报文检验失败: " + dataStr); log.info("系统参数报文检验失败: " + dataStr);
return result; return result;
} }

13
user-service/src/main/java/com/mh/user/utils/ExchangeStringUtil.java

@ -6,6 +6,7 @@ import io.netty.buffer.Unpooled;
//import io.netty.buffer.ByteBuf; //import io.netty.buffer.ByteBuf;
//import io.netty.channel.ChannelHandlerContext; //import io.netty.channel.ChannelHandlerContext;
import java.io.*; import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
@ -1275,4 +1276,16 @@ public class ExchangeStringUtil {
} }
/**
* 判断是否为科学计数法如果是则返回非科学计数法
* @param dataStr
* @return
*/
public static String isScientificNotation(String dataStr) {
if (dataStr.contains("E")) {
BigDecimal bigDecimal = new BigDecimal(dataStr);
return bigDecimal.toPlainString();
}
return dataStr;
}
} }

2
user-service/src/main/resources/application.yml

@ -1,6 +1,6 @@
spring: spring:
profiles: profiles:
active: dev active: prod
mvc: mvc:
pathmatch: pathmatch:
matching-strategy: ant_path_matcher matching-strategy: ant_path_matcher

Loading…
Cancel
Save