diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/DeviceInstanceEntity.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/DeviceInstanceEntity.java index d64d6672..72c915f5 100644 --- a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/DeviceInstanceEntity.java +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/DeviceInstanceEntity.java @@ -7,7 +7,9 @@ import org.hswebframework.ezorm.rdb.mapping.annotation.*; import org.hswebframework.web.api.crud.entity.GenericEntity; import org.hswebframework.web.api.crud.entity.RecordCreationEntity; import org.hswebframework.web.crud.generator.Generators; +import org.hswebframework.web.dict.EnumDict; import org.hswebframework.web.validator.CreateGroup; +import org.jetlinks.community.device.enums.DeviceFeature; import org.jetlinks.core.device.DeviceConfigKey; import org.jetlinks.core.device.DeviceInfo; import org.jetlinks.community.device.enums.DeviceState; @@ -22,6 +24,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import java.sql.JDBCType; import java.util.Map; +import java.util.stream.Stream; @Getter @Setter @@ -124,6 +127,14 @@ public class DeviceInstanceEntity extends GenericEntity implements Recor @Schema(description = "父级设备ID") private String parentId; + //拓展特性,比如是否为子设备独立状态管理。 + @Column + @ColumnType(javaType = Long.class, jdbcType = JDBCType.BIGINT) + @EnumCodec(toMask = true) + @Schema(description = "设备特性") + @DefaultValue("0") + private DeviceFeature[] features; + public DeviceInfo toDeviceInfo() { DeviceInfo info = org.jetlinks.core.device.DeviceInfo .builder() @@ -134,6 +145,10 @@ public class DeviceInstanceEntity extends GenericEntity implements Recor info.addConfig("deviceName", name); info.addConfig("productName", productName); info.addConfig("orgId", orgId); + + if (hasFeature(DeviceFeature.selfManageState)) { + info.addConfig(DeviceConfigKey.selfManageState, true); + } if (!CollectionUtils.isEmpty(configuration)) { info.addConfigs(configuration); } @@ -142,4 +157,22 @@ public class DeviceInstanceEntity extends GenericEntity implements Recor } return info; } + + public void addFeature(DeviceFeature... features) { + if (this.features == null) { + this.features = features; + } + if (features.length > 0) { + this.features = Stream + .concat(Stream.of(this.features), Stream.of(features)) + .toArray(DeviceFeature[]::new); + } + } + + public boolean hasFeature(DeviceFeature feature) { + if (this.features == null) { + return false; + } + return EnumDict.in(feature, DeviceFeature.values()); + } } diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/enums/DeviceFeature.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/enums/DeviceFeature.java new file mode 100644 index 00000000..7baacad9 --- /dev/null +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/enums/DeviceFeature.java @@ -0,0 +1,22 @@ +package org.jetlinks.community.device.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.hswebframework.web.dict.Dict; +import org.hswebframework.web.dict.EnumDict; + +@Dict("device-feature") +@Getter +@AllArgsConstructor +public enum DeviceFeature implements EnumDict { + selfManageState("子设备自己管理状态") + + + ; + private final String text; + + @Override + public String getValue() { + return name(); + } +} diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceMessageBusinessHandler.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceMessageBusinessHandler.java index bc634730..0d3f7141 100644 --- a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceMessageBusinessHandler.java +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceMessageBusinessHandler.java @@ -2,6 +2,7 @@ package org.jetlinks.community.device.service; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.MapUtils; import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository; import org.jetlinks.core.device.DeviceConfigKey; import org.jetlinks.core.device.DeviceOperator; @@ -86,6 +87,16 @@ public class DeviceMessageBusinessHandler { public Mono autoRegisterDevice(DeviceRegisterMessage message) { return registry .getDevice(message.getDeviceId()) + .flatMap(device -> { + @SuppressWarnings("all") + Map config = message.getHeader("configuration").map(Map.class::cast).orElse(null); + if (MapUtils.isNotEmpty(config)) { + return device + .setConfigs(config) + .thenReturn(device); + } + return Mono.just(device); + }) .switchIfEmpty(Mono.defer(() -> { //自动注册 return doAutoRegister(message); @@ -152,6 +163,15 @@ public class DeviceMessageBusinessHandler { return Mono.empty(); } + @Subscribe("/device/*/*/unregister") + @Transactional(propagation = Propagation.NEVER) + public Mono unRegisterDevice(DeviceUnRegisterMessage message) { + //注销设备 + return deviceService + .unregisterDevice(message.getDeviceId()) + .then(); + } + @Subscribe("/device/*/*/message/tags/update") public Mono updateDeviceTag(UpdateTagMessage message) { Map tags = message.getTags(); diff --git a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalDeviceInstanceService.java b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalDeviceInstanceService.java index d000efe6..1e4c127f 100644 --- a/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalDeviceInstanceService.java +++ b/jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalDeviceInstanceService.java @@ -6,10 +6,12 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository; import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult; +import org.hswebframework.ezorm.rdb.operator.dml.Terms; import org.hswebframework.web.crud.service.GenericReactiveCrudService; import org.hswebframework.web.exception.BusinessException; import org.hswebframework.web.id.IDGenerator; import org.jetlinks.community.device.entity.*; +import org.jetlinks.community.device.enums.DeviceFeature; import org.jetlinks.community.device.enums.DeviceState; import org.jetlinks.community.device.response.DeviceDeployResult; import org.jetlinks.community.device.response.DeviceDetail; @@ -350,6 +352,11 @@ public class LocalDeviceInstanceService extends GenericReactiveCrudService