Ver código fonte

add 地图区域管理

18339543638 4 anos atrás
pai
commit
f18394c2cd

+ 7 - 2
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/geo/GeoProperty.java

@@ -1,5 +1,6 @@
 package org.jetlinks.community.device.entity.geo;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -12,12 +13,12 @@ import javax.persistence.Column;
 import javax.persistence.Index;
 import javax.persistence.Table;
 import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
 import java.sql.JDBCType;
 import java.util.*;
 @JsonSerialize
 @Table(name = "dev_geo_property",indexes = {
-    @Index(name = "deviceUnique",columnList = "object_id,object_type,from")
+    @Index(name = "deviceUnique",columnList = "object_id,object_type,from"),
+    @Index(name = "fromUnique",columnList = "from_id")
 })
 @Data
 public  class GeoProperty extends GenericEntity<String> {
@@ -30,6 +31,10 @@ public  class GeoProperty extends GenericEntity<String> {
     @Schema(description = "对象id")
     private String objectId;
 
+    @Column
+    @JsonIgnore
+    private String fromId;
+
     @Column
     @NotBlank(message = "对象类型不能为空", groups = CreateGroup.class)
     @Schema(description = "对象类型")

+ 21 - 5
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceTagsService.java

@@ -6,7 +6,7 @@ import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult;
 import org.hswebframework.web.crud.service.GenericReactiveCrudService;
 import org.jetlinks.community.device.entity.DeviceTagEntity;
 import org.jetlinks.community.device.entity.geo.GeoProperty;
-import org.jetlinks.core.device.DeviceRegistry;
+import org.jetlinks.community.device.entity.geo.Geometry;
 import org.jetlinks.core.metadata.types.GeoType;
 import org.reactivestreams.Publisher;
 import org.springframework.stereotype.Service;
@@ -33,9 +33,15 @@ public class DeviceTagsService  extends GenericReactiveCrudService<DeviceTagEnti
             .doOnNext(entity->{
                 if (judgementGeo(entity)) {
                     GeoProperty geoProperty = new GeoProperty();
+                    Geometry geometry = new Geometry();
+                    String[] split = entity.getValue().split(",");
+                    geometry.getCoordinates().add(split[0]);
+                    geometry.getCoordinates().add(split[1]);
+                    geometry.setType(GeoType.ID);
                     instanceService.findById(entity.getDeviceId())
                         .flatMap(device->{
                             geoProperty.setFrom("tag");
+                            geoProperty.setFromId(entity.getId());
                             geoProperty.setObjectId(device.getId());
                             geoProperty.setObjectType("device");
                             geoProperty.setDeviceName(device.getName());
@@ -44,14 +50,24 @@ public class DeviceTagsService  extends GenericReactiveCrudService<DeviceTagEnti
                         .doOnNext(product->{
                             geoProperty.setProductName(product.getName());
                             geoProperty.setProductId(product.getId());
+                            geoProperty.setGeometry(geometry);
                         })
                         .subscribe(ignore->{
                             propertyRepository.createQuery()
                                 .where(GeoProperty::getFrom,"tag")
-                                .where(GeoProperty::getObjectType,"device")
-                                .where(GeoProperty::getObjectId,geoProperty.getObjectId())
+                                .where(GeoProperty::getFromId,entity.getId())
                                 .count()
-                                .flatMap(count->count==0?propertyRepository.save(geoProperty):Mono.empty())
+                                .flatMap(count->{
+                                    if(count==0){
+                                        return propertyRepository.save(geoProperty);
+                                    }else {
+                                        return propertyRepository.createUpdate()
+                                            .where(GeoProperty::getFrom,"tag")
+                                            .where(GeoProperty::getFromId,entity.getId())
+                                            .set(GeoProperty::getGeometry,geometry)
+                                            .execute();
+                                    }
+                                })
                                 .subscribe();
                         });
                 }
@@ -60,7 +76,7 @@ public class DeviceTagsService  extends GenericReactiveCrudService<DeviceTagEnti
     }
 
     //判断是否为设备坐标标签
-    private boolean judgementGeo(DeviceTagEntity entity){
+    public boolean judgementGeo(DeviceTagEntity entity){
         return GeoType.ID.equals(entity.getType())&&"coordinate".equals(entity.getKey());
     }
 }

+ 21 - 6
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java

@@ -23,6 +23,7 @@ import org.hswebframework.web.exception.NotFoundException;
 import org.hswebframework.web.exception.ValidationException;
 import org.hswebframework.web.id.IDGenerator;
 import org.jetlinks.community.device.entity.*;
+import org.jetlinks.community.device.entity.geo.GeoProperty;
 import org.jetlinks.community.device.enums.DeviceState;
 import org.jetlinks.community.device.response.DeviceDeployResult;
 import org.jetlinks.community.device.response.DeviceDetail;
@@ -96,6 +97,8 @@ public class DeviceInstanceController implements
     private final DeviceConfigMetadataManager metadataManager;
 
     private final DeviceTagsService tagsService;
+
+    private final ReactiveRepository<GeoProperty, String> propertyRepository;
     @SuppressWarnings("all")
     public DeviceInstanceController(LocalDeviceInstanceService service,
                                     DeviceRegistry registry,
@@ -104,7 +107,8 @@ public class DeviceInstanceController implements
                                     ReactiveRepository<DeviceTagEntity, String> tagRepository,
                                     DeviceDataService deviceDataService,
                                     DeviceConfigMetadataManager metadataManager,
-                                    DeviceTagsService tagsService) {
+                                    DeviceTagsService tagsService,
+                                    ReactiveRepository<GeoProperty, String> propertyRepository) {
         this.service = service;
         this.registry = registry;
         this.productService = productService;
@@ -113,6 +117,7 @@ public class DeviceInstanceController implements
         this.deviceDataService = deviceDataService;
         this.metadataManager = metadataManager;
         this.tagsService=tagsService;
+        this.propertyRepository=propertyRepository;
     }
 
 
@@ -327,11 +332,20 @@ public class DeviceInstanceController implements
     @Operation(summary = "删除设备标签")
     public Mono<Void> deleteDeviceTag(@PathVariable @Parameter(description = "设备ID") String deviceId,
                                       @PathVariable @Parameter(description = "标签ID") String tagId) {
-        return tagRepository.createDelete()
-            .where(DeviceTagEntity::getDeviceId, deviceId)
-            .and(DeviceTagEntity::getId, tagId)
-            .execute()
-            .then();
+        return tagRepository.findById(tagId)
+            .doOnNext(ignore->
+                tagRepository.createDelete()
+                    .where(DeviceTagEntity::getDeviceId, deviceId)
+                    .and(DeviceTagEntity::getId, tagId)
+                    .execute()
+                    .subscribe()
+            ).filter(tagsService::judgementGeo)
+            .map(tag->
+                propertyRepository
+                    .createDelete()
+                    .where(GeoProperty::getFromId,tagId)
+                    .execute()
+            ).then();
     }
 
     /**
@@ -420,6 +434,7 @@ public class DeviceInstanceController implements
                 tag.tryValidate();
             })
             .as(tagsService::save)
+            .onErrorMap(DuplicateKeyException.class, err -> new BusinessException("标签不可重复添加", err))
             .thenMany(getDeviceTags(deviceId));
     }
 

+ 21 - 20
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/GeoController.java

@@ -24,9 +24,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
+import reactor.util.function.Tuple2;
 
 import javax.validation.constraints.NotBlank;
 import java.util.List;
+import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -49,43 +51,42 @@ public class GeoController  implements ReactiveServiceCrudController<GeoProperty
 
 
     @PostMapping("/_search/geo.json")
-    public Flux<?> search(@RequestBody GeoRequestParam param){
+    public Mono<?> search(@RequestBody GeoRequestParam param){
         return geoService.queryPager(param.getFilter())
             .map(PagerResult::getData)
             .zipWith(Mono.just(new GeoPayload()))
-            .flux()
-            .map(tp2-> {
-                //区域管理
-                GeoPayload geoPayload =tp2.getT2();
-                return Flux.fromStream(tp2.getT1().stream())
-                    .flatMap(property->{
-                        GeoEntity geoEntity = new GeoEntity();
-                        geoEntity.with(property);
-                        if (null == property.getGeometry()) {
-                            return tagsService.createQuery()
+            .doOnNext(tuple2->{
+                GeoPayload payload = tuple2.getT2();
+                List<GeoProperty> properties = tuple2.getT1();
+                properties.forEach(property -> {
+                    Mono.zip(Mono.just(property),Mono.just(new GeoEntity()))
+                        .filter(tp2->tp2.getT1().getGeometry()==null)
+                        .doOnNext(tp2->
+                            tagsService.createQuery()
                                 .where(DeviceTagEntity::getDeviceId, property.getObjectId())
                                 .where(DeviceTagEntity::getKey, "coordinate")
                                 .where(DeviceTagEntity::getType, GeoType.ID)
                                 .fetchOne()
                                 .switchIfEmpty(Mono.just(new DeviceTagEntity()))
-                                .doOnNext(tag -> {
+                                .subscribe(tag -> {
                                     if (!StrUtil.isEmpty(tag.getId())) {
                                         Geometry geometry = new Geometry();
                                         String[] split = tag.getValue().split(",");
                                         geometry.getCoordinates().add(split[0]);
                                         geometry.getCoordinates().add(split[1]);
                                         geometry.setType(GeoType.ID);
-                                        geoEntity.setGeometry(geometry);
+                                        tp2.getT1().setGeometry(geometry);
                                     }
-                                    geoPayload.getFeatures().add(geoEntity);
                                 })
-                                .map(ignore->tp2.getT2());
-                        }
-                        return Flux.just(tp2.getT2());
-                    });
+                        )
+                        .subscribe(tp2->{
+                            tp2.getT2().with(tp2.getT1());
+                            payload.getFeatures().add(tp2.getT2());
+                        });
+                });
             })
-            .flatMap(Function.identity());
-    };
+            .map(Tuple2::getT2);
+    }
 
     /**
      * 区域管理新增