|
@@ -1,9 +1,10 @@
|
|
|
package vip.xiaonuo.coldchain.core.bean.influxdb;
|
|
|
|
|
|
+import com.fasterxml.jackson.annotation.JsonFormat;
|
|
|
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
|
|
import com.github.jfcloud.influxdb.model.JfcloudInFluxEntity;
|
|
|
import com.influxdb.annotations.Column;
|
|
|
import com.influxdb.annotations.Measurement;
|
|
|
-import com.influxdb.query.FluxRecord;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.Data;
|
|
|
import lombok.EqualsAndHashCode;
|
|
@@ -11,11 +12,8 @@ import lombok.NoArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants;
|
|
|
import vip.xiaonuo.coldchain.core.service.dataprocess.model.PowerEnum;
|
|
|
-
|
|
|
-import java.lang.reflect.Field;
|
|
|
-import java.time.Instant;
|
|
|
-import java.time.LocalDate;
|
|
|
-import java.util.Date;
|
|
|
+import vip.xiaonuo.coldchain.modular.app.param.DoubleNullToDashSerializer;
|
|
|
+import vip.xiaonuo.coldchain.modular.app.param.FloatNullToDashSerializer;
|
|
|
|
|
|
/**
|
|
|
* SensorData类,用于表示传感器数据,继承自JfcloudInFluxEntity。
|
|
@@ -28,17 +26,24 @@ import java.util.Date;
|
|
|
@Measurement(name = JfcloudColdChainConstants.INFLUXDB_DEFAULT_MEASUREMENT_NAME)
|
|
|
@Slf4j
|
|
|
public class SensorData extends JfcloudInFluxEntity {
|
|
|
-
|
|
|
@Column(name = "temperature")
|
|
|
+ @JsonSerialize(using = FloatNullToDashSerializer.class) // 使用自定义序列化器
|
|
|
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
|
|
|
private Float temperature;
|
|
|
|
|
|
@Column(name = "humidity")
|
|
|
+ @JsonSerialize(using = FloatNullToDashSerializer.class) // 使用自定义序列化器
|
|
|
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
|
|
|
private Float humidity;
|
|
|
|
|
|
@Column(name = "co2")
|
|
|
+ @JsonSerialize(using = FloatNullToDashSerializer.class) // 使用自定义序列化器
|
|
|
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
|
|
|
private Float co2;
|
|
|
|
|
|
@Column(name = "battery", tag = true)
|
|
|
+ @JsonSerialize(using = FloatNullToDashSerializer.class) // 使用自定义序列化器
|
|
|
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
|
|
|
private Float battery;
|
|
|
|
|
|
@Column(name = "plugInStatus", tag = true)
|
|
@@ -48,9 +53,13 @@ public class SensorData extends JfcloudInFluxEntity {
|
|
|
private String location;
|
|
|
|
|
|
@Column(name = "longitude", tag = true)
|
|
|
+ @JsonSerialize(using = DoubleNullToDashSerializer.class) // 使用自定义序列化器
|
|
|
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
|
|
|
private Double lng;
|
|
|
|
|
|
@Column(name = "latitude", tag = true)
|
|
|
+ @JsonSerialize(using = DoubleNullToDashSerializer.class) // 使用自定义序列化器
|
|
|
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
|
|
|
private Double lat;
|
|
|
|
|
|
@Column(name = "device_id", tag = true)
|
|
@@ -65,159 +74,159 @@ public class SensorData extends JfcloudInFluxEntity {
|
|
|
@Column(name = "create_time", tag = true)
|
|
|
private String createTime;
|
|
|
|
|
|
- /**
|
|
|
- * 使用反射和FluxRecord动态映射字段值到SensorData对象
|
|
|
- *
|
|
|
- * @param record FluxRecord数据记录
|
|
|
- * @return 映射后的SensorData对象
|
|
|
- */
|
|
|
- public static SensorData mapToSensorData(FluxRecord record) {
|
|
|
- SensorData sensorData = new SensorData();
|
|
|
- try {
|
|
|
- // 获取SensorData类的所有字段
|
|
|
- Field[] fields = SensorData.class.getDeclaredFields();
|
|
|
- for (Field field : fields) {
|
|
|
- field.setAccessible(true); // 设置字段可访问
|
|
|
- // 如果字段没有@Column注解,则跳过
|
|
|
- if (field.getAnnotation(Column.class) == null) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- String fieldName = field.getName(); // 获取字段名
|
|
|
- Object value = record.getValueByKey(fieldName); // 从FluxRecord中根据字段名获取值
|
|
|
- if (value == null) {
|
|
|
- continue; // 如果FluxRecord中没有该字段的值,则跳过
|
|
|
- }
|
|
|
-
|
|
|
- // 根据字段类型进行相应的值转换
|
|
|
- if (field.getType().equals(String.class)) {
|
|
|
- field.set(sensorData, value.toString());
|
|
|
- } else if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
|
|
|
- field.set(sensorData, convertToInteger(value));
|
|
|
- } else if (field.getType().equals(Float.class) || field.getType().equals(float.class)) {
|
|
|
- field.set(sensorData, convertToFloat(value));
|
|
|
- } else if (field.getType().equals(Double.class) || field.getType().equals(double.class)) {
|
|
|
- field.set(sensorData, convertToDouble(value));
|
|
|
- } else if (field.getType().equals(Instant.class)) {
|
|
|
- field.set(sensorData, convertToInstant(value));
|
|
|
- } else if (field.getType().equals(Date.class)) {
|
|
|
- field.set(sensorData, convertToDate(value));
|
|
|
- } else if (field.getType().equals(LocalDate.class)) {
|
|
|
- field.set(sensorData, convertToLocalDate(value));
|
|
|
- } else {
|
|
|
- log.warn("无法处理字段类型: " + field.getName() + ",字段值: " + value);
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("从FluxRecord映射到SensorData时出错", e);
|
|
|
- }
|
|
|
- return sensorData;
|
|
|
- }
|
|
|
-
|
|
|
- // 类型转换方法
|
|
|
-
|
|
|
- /**
|
|
|
- * 将值转换为Integer类型
|
|
|
- *
|
|
|
- * @param value 要转换的值
|
|
|
- * @return 转换后的Integer值
|
|
|
- */
|
|
|
- private static Integer convertToInteger(Object value) {
|
|
|
- try {
|
|
|
- return (value instanceof Integer) ? (Integer) value : Integer.valueOf(value.toString());
|
|
|
- } catch (NumberFormatException e) {
|
|
|
- log.error("将值转换为Integer时出错: " + value, e);
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 将值转换为Float类型
|
|
|
- *
|
|
|
- * @param value 要转换的值
|
|
|
- * @return 转换后的Float值
|
|
|
- */
|
|
|
- private static Float convertToFloat(Object value) {
|
|
|
- try {
|
|
|
- if (value instanceof Double) {
|
|
|
- return ((Double) value).floatValue(); // 将Double 转换为Float
|
|
|
- }
|
|
|
- return (value instanceof Float) ? (Float) value : Float.valueOf(value.toString());
|
|
|
- } catch (NumberFormatException e) {
|
|
|
- log.error("将值转换为Float时出错: " + value, e);
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 将值转换为Double类型
|
|
|
- *
|
|
|
- * @param value 要转换的值
|
|
|
- * @return 转换后的Double值
|
|
|
- */
|
|
|
- private static Double convertToDouble(Object value) {
|
|
|
- try {
|
|
|
- return (value instanceof Double) ? (Double) value : Double.valueOf(value.toString());
|
|
|
- } catch (NumberFormatException e) {
|
|
|
- log.error("将值转换为Double时出错: " + value, e);
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 将值转换为Instant类型
|
|
|
- *
|
|
|
- * @param value 要转换的值
|
|
|
- * @return 转换后的Instant值
|
|
|
- */
|
|
|
- private static Instant convertToInstant(Object value) {
|
|
|
- try {
|
|
|
- return (value instanceof Instant) ? (Instant) value : Instant.parse(value.toString());
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("将值转换为Instant时出错: " + value, e);
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 将值转换为Date类型
|
|
|
- *
|
|
|
- * @param value 要转换的值
|
|
|
- * @return 转换后的Date值
|
|
|
- */
|
|
|
- private static Date convertToDate(Object value) {
|
|
|
- try {
|
|
|
- if (value instanceof Instant) {
|
|
|
- return Date.from((Instant) value);
|
|
|
- } else if (value instanceof String) {
|
|
|
- return Date.from(Instant.parse((String) value));
|
|
|
- } else {
|
|
|
- return (Date) value;
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("将值转换为Date时出错: " + value, e);
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 将值转换为LocalDate类型
|
|
|
- *
|
|
|
- * @param value 要转换的值
|
|
|
- * @return 转换后的LocalDate值
|
|
|
- */
|
|
|
- private static LocalDate convertToLocalDate(Object value) {
|
|
|
- try {
|
|
|
- if (value instanceof Instant) {
|
|
|
- return ((Instant) value).atZone(java.time.ZoneId.systemDefault()).toLocalDate();
|
|
|
- } else if (value instanceof String) {
|
|
|
- return LocalDate.parse((String) value);
|
|
|
- } else {
|
|
|
- return (LocalDate) value;
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("将值转换为LocalDate时出错: " + value, e);
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
+// /**
|
|
|
+// * 使用反射和FluxRecord动态映射字段值到SensorData对象
|
|
|
+// *
|
|
|
+// * @param record FluxRecord数据记录
|
|
|
+// * @return 映射后的SensorData对象
|
|
|
+// */
|
|
|
+// public static SensorData mapToSensorData(FluxRecord record) {
|
|
|
+// SensorData sensorData = new SensorData();
|
|
|
+// try {
|
|
|
+// // 获取SensorData类的所有字段
|
|
|
+// Field[] fields = SensorData.class.getDeclaredFields();
|
|
|
+// for (Field field : fields) {
|
|
|
+// field.setAccessible(true); // 设置字段可访问
|
|
|
+// // 如果字段没有@Column注解,则跳过
|
|
|
+// if (field.getAnnotation(Column.class) == null) {
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+//
|
|
|
+// String fieldName = field.getName(); // 获取字段名
|
|
|
+// Object value = record.getValueByKey(fieldName); // 从FluxRecord中根据字段名获取值
|
|
|
+// if (value == null) {
|
|
|
+// continue; // 如果FluxRecord中没有该字段的值,则跳过
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 根据字段类型进行相应的值转换
|
|
|
+// if (field.getType().equals(String.class)) {
|
|
|
+// field.set(sensorData, value.toString());
|
|
|
+// } else if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
|
|
|
+// field.set(sensorData, convertToInteger(value));
|
|
|
+// } else if (field.getType().equals(Float.class) || field.getType().equals(float.class)) {
|
|
|
+// field.set(sensorData, convertToFloat(value));
|
|
|
+// } else if (field.getType().equals(Double.class) || field.getType().equals(double.class)) {
|
|
|
+// field.set(sensorData, convertToDouble(value));
|
|
|
+// } else if (field.getType().equals(Instant.class)) {
|
|
|
+// field.set(sensorData, convertToInstant(value));
|
|
|
+// } else if (field.getType().equals(Date.class)) {
|
|
|
+// field.set(sensorData, convertToDate(value));
|
|
|
+// } else if (field.getType().equals(LocalDate.class)) {
|
|
|
+// field.set(sensorData, convertToLocalDate(value));
|
|
|
+// } else {
|
|
|
+// log.warn("无法处理字段类型: " + field.getName() + ",字段值: " + value);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// } catch (Exception e) {
|
|
|
+// log.error("从FluxRecord映射到SensorData时出错", e);
|
|
|
+// }
|
|
|
+// return sensorData;
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 类型转换方法
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将值转换为Integer类型
|
|
|
+// *
|
|
|
+// * @param value 要转换的值
|
|
|
+// * @return 转换后的Integer值
|
|
|
+// */
|
|
|
+// private static Integer convertToInteger(Object value) {
|
|
|
+// try {
|
|
|
+// return (value instanceof Integer) ? (Integer) value : Integer.valueOf(value.toString());
|
|
|
+// } catch (NumberFormatException e) {
|
|
|
+// log.error("将值转换为Integer时出错: " + value, e);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将值转换为Float类型
|
|
|
+// *
|
|
|
+// * @param value 要转换的值
|
|
|
+// * @return 转换后的Float值
|
|
|
+// */
|
|
|
+// private static Float convertToFloat(Object value) {
|
|
|
+// try {
|
|
|
+// if (value instanceof Double) {
|
|
|
+// return ((Double) value).floatValue(); // 将Double 转换为Float
|
|
|
+// }
|
|
|
+// return (value instanceof Float) ? (Float) value : Float.valueOf(value.toString());
|
|
|
+// } catch (NumberFormatException e) {
|
|
|
+// log.error("将值转换为Float时出错: " + value, e);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将值转换为Double类型
|
|
|
+// *
|
|
|
+// * @param value 要转换的值
|
|
|
+// * @return 转换后的Double值
|
|
|
+// */
|
|
|
+// private static Double convertToDouble(Object value) {
|
|
|
+// try {
|
|
|
+// return (value instanceof Double) ? (Double) value : Double.valueOf(value.toString());
|
|
|
+// } catch (NumberFormatException e) {
|
|
|
+// log.error("将值转换为Double时出错: " + value, e);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将值转换为Instant类型
|
|
|
+// *
|
|
|
+// * @param value 要转换的值
|
|
|
+// * @return 转换后的Instant值
|
|
|
+// */
|
|
|
+// private static Instant convertToInstant(Object value) {
|
|
|
+// try {
|
|
|
+// return (value instanceof Instant) ? (Instant) value : Instant.parse(value.toString());
|
|
|
+// } catch (Exception e) {
|
|
|
+// log.error("将值转换为Instant时出错: " + value, e);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将值转换为Date类型
|
|
|
+// *
|
|
|
+// * @param value 要转换的值
|
|
|
+// * @return 转换后的Date值
|
|
|
+// */
|
|
|
+// private static Date convertToDate(Object value) {
|
|
|
+// try {
|
|
|
+// if (value instanceof Instant) {
|
|
|
+// return Date.from((Instant) value);
|
|
|
+// } else if (value instanceof String) {
|
|
|
+// return Date.from(Instant.parse((String) value));
|
|
|
+// } else {
|
|
|
+// return (Date) value;
|
|
|
+// }
|
|
|
+// } catch (Exception e) {
|
|
|
+// log.error("将值转换为Date时出错: " + value, e);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将值转换为LocalDate类型
|
|
|
+// *
|
|
|
+// * @param value 要转换的值
|
|
|
+// * @return 转换后的LocalDate值
|
|
|
+// */
|
|
|
+// private static LocalDate convertToLocalDate(Object value) {
|
|
|
+// try {
|
|
|
+// if (value instanceof Instant) {
|
|
|
+// return ((Instant) value).atZone(java.time.ZoneId.systemDefault()).toLocalDate();
|
|
|
+// } else if (value instanceof String) {
|
|
|
+// return LocalDate.parse((String) value);
|
|
|
+// } else {
|
|
|
+// return (LocalDate) value;
|
|
|
+// }
|
|
|
+// } catch (Exception e) {
|
|
|
+// log.error("将值转换为LocalDate时出错: " + value, e);
|
|
|
+// return null;
|
|
|
+// }
|
|
|
+// }
|
|
|
}
|