226 lines
9.8 KiB
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;
|
|
}
|
|
|
|
|
|
}
|