diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/message/DefaultDeviceDataManager.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/message/DefaultDeviceDataManager.java index 8d13921d..b0a324b2 100644 --- a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/message/DefaultDeviceDataManager.java +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/message/DefaultDeviceDataManager.java @@ -37,7 +37,8 @@ import java.util.function.Function; * @author zhouhao * @since 1.9 */ -@Component +//@Component + @Deprecated @AllArgsConstructor public class DefaultDeviceDataManager implements DeviceDataManager { diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/message/ThingDeviceDataManager.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/message/ThingDeviceDataManager.java new file mode 100644 index 00000000..e4ef0e60 --- /dev/null +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/message/ThingDeviceDataManager.java @@ -0,0 +1,115 @@ +package org.jetlinks.community.device.message; + +import lombok.AllArgsConstructor; +import lombok.Generated; +import lombok.Getter; +import lombok.NonNull; +import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository; +import org.jetlinks.core.device.DeviceOperator; +import org.jetlinks.core.device.DeviceRegistry; +import org.jetlinks.core.device.DeviceThingType; +import org.jetlinks.core.message.DeviceDataManager; +import org.jetlinks.core.metadata.Converter; +import org.jetlinks.core.metadata.PropertyMetadata; +import org.jetlinks.core.things.ThingProperty; +import org.jetlinks.core.things.ThingsDataManager; +import org.jetlinks.community.device.entity.DeviceTagEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Component +@AllArgsConstructor +public class ThingDeviceDataManager implements DeviceDataManager { + + private final DeviceRegistry registry; + private final ThingsDataManager thingsDataManager; + private final ReactiveRepository tagRepository; + + @Override + public Mono getLastProperty(@NonNull String deviceId, @NonNull String propertyId) { + return getLastProperty(deviceId, propertyId, System.currentTimeMillis()); + } + + @Override + public Mono getLastProperty(@NonNull String deviceId, @NonNull String propertyId, long baseTime) { + return thingsDataManager + .getLastProperty(DeviceThingType.device, deviceId, propertyId, baseTime) + .map(PropertyValueInfo::of); + } + + @Override + public Mono getFirstProperty(@NonNull String deviceId, @NonNull String propertyId) { + return thingsDataManager + .getFirstProperty(DeviceThingType.device, deviceId, propertyId) + .map(PropertyValueInfo::of); + } + + @Override + public Mono getLastPropertyTime(@NonNull String deviceId, long baseTime) { + return thingsDataManager + .getLastPropertyTime(DeviceThingType.device, deviceId, baseTime); + } + + @Override + public Mono getFirstPropertyTime(@NonNull String deviceId) { + return thingsDataManager + .getFirstPropertyTime(DeviceThingType.device, deviceId); + } + + @Override + public Flux getTags(@NonNull String deviceId, String... tagIdList) { + Assert.hasText(deviceId, "deviceId must not be empty"); + + return registry + .getDevice(deviceId) + .flatMap(DeviceOperator::getMetadata) + .flatMapMany(metadata -> tagRepository + .createQuery() + .where(DeviceTagEntity::getDeviceId, deviceId) + .when(tagIdList != null && tagIdList.length > 0, q -> q.in(DeviceTagEntity::getKey, (Object[]) tagIdList)) + .fetch() + .map(tag -> TagValueInfo.of(tag.getKey(), tag.getValue(), metadata.getTagOrNull(tag.getKey())))); + } + + @Getter + public static class TagValueInfo implements TagValue { + @Generated + private String tagId; + @Generated + private Object value; + + public static TagValueInfo of(String id, String value, PropertyMetadata metadata) { + TagValueInfo tagValue = new TagValueInfo(); + tagValue.tagId = id; + + if (metadata != null && metadata.getValueType() instanceof Converter) { + tagValue.value = ((Converter) metadata.getValueType()).convert(value); + } else { + tagValue.value = value; + } + return tagValue; + } + } + + @AllArgsConstructor(staticName = "of") + static class PropertyValueInfo implements PropertyValue { + private final ThingProperty property; + + @Override + public long getTimestamp() { + return property.getTimestamp(); + } + + @Override + public Object getValue() { + return property.getValue(); + } + + @Override + public String getState() { + return property.getState(); + } + } +}