iot-server/bnhz-adapter/src/main/java/com/bnhz/adapter/util/ThingsModelUtils.java

226 lines
9.8 KiB
Java

package com.bnhz.adapter.util;
import com.alibaba.fastjson.JSONObject;
import com.bnhz.common.constant.BnhzConstant;
import com.bnhz.common.core.thingsModel.ThingsModelSimpleItem;
import com.bnhz.common.core.thingsModel.ThingsModelValuesInput;
import com.bnhz.common.utils.DateUtils;
import com.bnhz.common.utils.reflect.ReflectUtils;
import com.bnhz.iot.domain.ThingsModel;
import com.bnhz.iot.model.ThingsModelItem.Datatype;
import com.bnhz.mq.model.ReportDataBo;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author Leo
* @date 2024/6/28 11:33
*/
public class ThingsModelUtils {
public static List<ThingsModel> toPropertyThingsModel(Map<String, ReflectUtils.FieldInfo> allFields, Long productId, String productName) {
//移除基础字段
allFields.remove("id");
allFields.remove("createTime");
allFields.remove("updateTime");
return allFields.entrySet().stream()
.filter(entry -> {
ReflectUtils.FieldInfo value = entry.getValue();
//只处理有备注的的属性
return !ObjectUtils.isEmpty(value.getComment());
})
.map(entry -> {
ThingsModel thingsModel = new ThingsModel();
thingsModel.setIdentifier(entry.getKey());
ReflectUtils.FieldInfo value = entry.getValue();
String name = value.getType().getName();
thingsModel.setDatatype(toDataType(name));
thingsModel.setProductId(productId);
thingsModel.setProductName(productName);
thingsModel.setType(BnhzConstant.ModelType.PROPERTY);
thingsModel.setModelName(value.getComment());
thingsModel.setIsChart(0);
thingsModel.setIsMonitor(0);
thingsModel.setIsHistory(1);
thingsModel.setIsReadonly(0);
thingsModel.setSpecs(toSpec(thingsModel.getDatatype(), value.getLength()));
thingsModel.setTenantId(1L);
thingsModel.setTenantName("System");
return thingsModel;
}).collect(Collectors.toList());
}
public static ThingsModel toEventThingsModel(Map<String, ReflectUtils.FieldInfo> allFields, Long productId, String productName, String modelName, String identifier) {
ThingsModel thingsModel = new ThingsModel();
thingsModel.setIdentifier(identifier);
thingsModel.setModelName(modelName);
thingsModel.setProductId(productId);
thingsModel.setProductName(productName);
thingsModel.setType(BnhzConstant.ModelType.EVENT);
thingsModel.setIsChart(0);
thingsModel.setIsMonitor(0);
thingsModel.setIsHistory(1);
thingsModel.setIsReadonly(0);
thingsModel.setTenantId(1L);
thingsModel.setDatatype(BnhzConstant.DataType.TYPE_OBJECT);
List<com.bnhz.iot.model.ThingsModelItem.ThingsModel> thingsModels = allFields.entrySet()
.stream()
.filter(entry -> {
ReflectUtils.FieldInfo value = entry.getValue();
//只处理有备注的的属性
return !ObjectUtils.isEmpty(value.getComment());
})
.map(entry -> {
com.bnhz.iot.model.ThingsModelItem.ThingsModel thingsModelInner = new com.bnhz.iot.model.ThingsModelItem.ThingsModel();
thingsModelInner.setId(identifier + "_" + entry.getKey());
ReflectUtils.FieldInfo value = entry.getValue();
String name = value.getType().getName();
String dataType = toDataType(name);
thingsModelInner.setDatatype(genDatatype(dataType, value.getLength()));
thingsModelInner.setType(BnhzConstant.ModelType.PROPERTY);
thingsModelInner.setName(value.getComment());
thingsModelInner.setIsChart(0);
thingsModelInner.setIsMonitor(0);
thingsModelInner.setIsHistory(1);
thingsModelInner.setIsReadonly(0);
return thingsModelInner;
}).collect(Collectors.toList());
Datatype datatype = new Datatype();
datatype.setType("object");
datatype.setParams(thingsModels);
thingsModel.setSpecs(JSONObject.toJSONString(datatype));
return thingsModel;
}
public static ReportDataBo toPropertyReportDataBo(Map<String, ReflectUtils.FieldInfo> allFields, Long productId, String serialNumber) {
ReportDataBo reportDataBo = new ReportDataBo();
reportDataBo.setProductId(productId);
reportDataBo.setSerialNumber(serialNumber);
reportDataBo.setType(BnhzConstant.ModelType.PROPERTY);
List<ThingsModelSimpleItem> thingsModelSimpleItemList = toThingsModelSimpleItemList(allFields);
reportDataBo.setDataList(thingsModelSimpleItemList);
ThingsModelValuesInput thingsModelValuesInput = new ThingsModelValuesInput();
thingsModelValuesInput.setDataTime(LocalDateTime.now());
thingsModelValuesInput.setType(BnhzConstant.ModelType.PROPERTY);
thingsModelValuesInput.setThingsModelValueRemarkItem(thingsModelSimpleItemList);
reportDataBo.setValuesInput(thingsModelValuesInput);
reportDataBo.setRuleEngine(true);
return reportDataBo;
}
public static ReportDataBo toEventReportDataBo(Map<String, ReflectUtils.FieldInfo> allFields
, Long productId
, String serialNumber
, Long modelId
, LocalDateTime dateTime
, Long deviceId
, String topic
, Long batchNo) {
ReportDataBo reportDataBo = new ReportDataBo();
reportDataBo.setProductId(productId);
reportDataBo.setSerialNumber(serialNumber);
reportDataBo.setType(BnhzConstant.ModelType.EVENT);
List<ThingsModelSimpleItem> thingsModelSimpleItemList = toThingsModelSimpleItemList(allFields);
reportDataBo.setDataList(thingsModelSimpleItemList);
//reportDataBo.setMessage(JSONObject.toJSONString(thingsModelSimpleItemList));
ThingsModelValuesInput thingsModelValuesInput = new ThingsModelValuesInput();
thingsModelValuesInput.setModelId(modelId);
thingsModelValuesInput.setProductId(productId);
thingsModelValuesInput.setDeviceId(deviceId);
thingsModelValuesInput.setDeviceNumber(serialNumber);
if (ObjectUtils.isEmpty(dateTime)) {
thingsModelValuesInput.setDataTime(LocalDateTime.now());
} else {
thingsModelValuesInput.setDataTime(dateTime);
}
thingsModelValuesInput.setType(BnhzConstant.ModelType.EVENT);
thingsModelValuesInput.setThingsModelValueRemarkItem(thingsModelSimpleItemList);
thingsModelValuesInput.setTopic(topic);
thingsModelValuesInput.setBatchNo(batchNo);
reportDataBo.setValuesInput(thingsModelValuesInput);
reportDataBo.setRuleEngine(true);
return reportDataBo;
}
private static List<ThingsModelSimpleItem> toThingsModelSimpleItemList(Map<String, ReflectUtils.FieldInfo> allFields) {
Date now = new Date();
return allFields.entrySet()
.stream()
.filter(entry -> {
ReflectUtils.FieldInfo value = entry.getValue();
//只处理有备注的的属性
return !ObjectUtils.isEmpty(value.getComment());
})
.map(entry -> {
ThingsModelSimpleItem thingsModelSimpleItem = new ThingsModelSimpleItem();
thingsModelSimpleItem.setId(entry.getKey());
Object value = entry.getValue().getValue();
if (value instanceof Date) {
thingsModelSimpleItem.setValue(DateUtils.dateTimeYYYYMDHMS((Date) value));
} else if (value instanceof LocalDateTime) {
thingsModelSimpleItem.setValue(DateUtils.toDateTimeStr((LocalDateTime) value));
} else {
thingsModelSimpleItem.setValue(ObjectUtils.isEmpty(value) ? null : String.valueOf(value));
}
thingsModelSimpleItem.setTs(now);
return thingsModelSimpleItem;
}).collect(Collectors.toList());
}
private static String toDataType(String typeName) {
switch (typeName) {
case "java.lang.String":
return "string";
case "java.math.BigDecimal":
return "decimal";
case "java.lang.Integer":
case "int":
return "integer";
case "java.util.Date":
return "date";
case "boolean":
return "bool";
}
return "string";
}
private static String toSpec(String dataTypeStr, int length) {
return JSONObject.toJSONString(genDatatype(dataTypeStr, length));
}
private static Datatype genDatatype(String dataTypeStr, int length) {
Datatype dataType = new Datatype();
dataType.setType(dataTypeStr);
if ("integer".equals(dataTypeStr) || "decimal".equals(dataTypeStr)) {
dataType.setMin(new BigDecimal(1));
dataType.setMax(new BigDecimal(1000));
}
if ("string".equals(dataTypeStr)) {
if (length > 0) {
dataType.setMaxLength(length);
} else {
dataType.setMaxLength(60);
}
}
return dataType;
}
}