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 toPropertyThingsModel(Map 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 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 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 allFields, Long productId, String serialNumber) { ReportDataBo reportDataBo = new ReportDataBo(); reportDataBo.setProductId(productId); reportDataBo.setSerialNumber(serialNumber); reportDataBo.setType(BnhzConstant.ModelType.PROPERTY); List 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 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 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 toThingsModelSimpleItemList(Map 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; } }