Forráskód Böngészése

add 地理位置范围查询

18339543638 4 éve
szülő
commit
47328804f9
14 módosított fájl, 130 hozzáadás és 479 törlés
  1. 0 11
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/DeviceTagEntity.java
  2. 61 0
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/GeoRegionEntity.java
  3. 0 28
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/geo/GeoEntity.java
  4. 0 117
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/geo/GeoProperty.java
  5. 0 23
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/geo/Geometry.java
  6. 0 1
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/response/DeviceDetail.java
  7. 0 25
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceMessageBusinessHandler.java
  8. 0 111
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceTagsService.java
  9. 0 32
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalGeoPropertyService.java
  10. 48 0
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalGeoRegionService.java
  11. 0 31
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/data/GeoData.java
  12. 0 4
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java
  13. 21 77
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/GeoController.java
  14. 0 19
      jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/request/GeoPayload.java

+ 0 - 11
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/DeviceTagEntity.java

@@ -12,8 +12,6 @@ import org.hswebframework.web.api.crud.entity.GenericEntity;
 import org.hswebframework.web.crud.annotation.EnableEntityEvent;
 import org.hswebframework.web.crud.generator.Generators;
 import org.hswebframework.web.validator.CreateGroup;
-import org.jetlinks.community.device.entity.geo.GeoProperty;
-import org.jetlinks.community.device.entity.geo.Geometry;
 import org.jetlinks.core.metadata.Converter;
 import org.jetlinks.core.metadata.DataType;
 import org.jetlinks.core.metadata.PropertyMetadata;
@@ -121,13 +119,4 @@ public class DeviceTagEntity extends GenericEntity<String> {
         return DigestUtils.md5Hex(deviceId + ":" + key);
     }
 
-    public static DeviceTagEntity of(GeoProperty geoProperty){
-        DeviceTagEntity tag = new DeviceTagEntity();
-        Geometry geometry = geoProperty.getGeometry();
-        tag.setKey("coordinate");
-        tag.setValue(geometry.getCoordinates().get(0)+","+geometry.getCoordinates().get(1));
-        tag.setDeviceId(geoProperty.getObjectId());
-        tag.setName("地理位置");
-        return tag;
-    }
 }

+ 61 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/GeoRegionEntity.java

@@ -0,0 +1,61 @@
+package org.jetlinks.community.device.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType;
+import org.hswebframework.ezorm.rdb.mapping.annotation.JsonCodec;
+import org.hswebframework.web.api.crud.entity.GenericEntity;
+import org.hswebframework.web.api.crud.entity.GenericTreeSortSupportEntity;
+
+import javax.persistence.Column;
+import javax.persistence.Table;
+import javax.validation.constraints.NotBlank;
+import java.sql.JDBCType;
+import java.util.*;
+@JsonSerialize
+@Table(name = "dev_geo_region")
+@Data
+@EqualsAndHashCode(callSuper = false)
+public  class GeoRegionEntity extends  GenericTreeSortSupportEntity<String> {
+    @Column
+    @Schema(description = "属性名称")
+    private String name;
+
+    @Column
+    @ColumnType(jdbcType = JDBCType.CLOB)
+    @JsonCodec
+    private List<String> acroutes;
+
+    @Column
+    private String adcode;
+
+    @Column
+    @ColumnType(jdbcType = JDBCType.CLOB)
+    @JsonCodec
+    private List<String > center;
+
+    @Column
+    @ColumnType(jdbcType = JDBCType.CLOB)
+    @JsonCodec
+    private List<String> centroid;
+
+    @Column
+    private int childrenNum;
+
+    @Column
+    private String parentId;
+
+    @Column
+    @NotBlank(message = "请绘制坐标区域")
+    private String region;
+
+    //子菜单
+    private List<GeoRegionEntity> children;
+
+    @Override
+    public List<GeoRegionEntity> getChildren() {
+        return children;
+    }
+}

+ 0 - 28
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/geo/GeoEntity.java

@@ -1,28 +0,0 @@
-package org.jetlinks.community.device.entity.geo;
-
-import lombok.Data;
-import java.io.Serializable;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName GeoFeature.java
- * @Description TODO
- * @createTime 2021年09月27日 10:54:00
- */
-@Data
-public class GeoEntity  implements Serializable{
-
-
-    private String type;
-
-    private Geometry geometry;
-
-    private GeoProperty properties;
-
-    public GeoEntity with(GeoProperty properties){
-        this.properties=properties;
-        this.geometry=properties.getGeometry();
-        return this;
-    }
-}

+ 0 - 117
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/geo/GeoProperty.java

@@ -1,117 +0,0 @@
-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;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType;
-import org.hswebframework.ezorm.rdb.mapping.annotation.JsonCodec;
-import org.hswebframework.web.api.crud.entity.GenericEntity;
-import org.hswebframework.web.validator.CreateGroup;
-import org.jetlinks.community.device.entity.DeviceInstanceEntity;
-import org.jetlinks.community.device.entity.DeviceTagEntity;
-import reactor.util.function.Tuple2;
-import javax.persistence.Column;
-import javax.persistence.Index;
-import javax.persistence.Table;
-import javax.validation.constraints.NotBlank;
-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 = "fromUnique",columnList = "from_id")
-})
-@Data
-@EqualsAndHashCode(callSuper = false)
-public  class GeoProperty extends GenericEntity<String> {
-    @Column
-    @Schema(description = "属性名称")
-    private String name;
-
-    @Column
-    @NotBlank(message = "对象id不能为空", groups = CreateGroup.class)
-    @Schema(description = "对象id")
-    private String objectId;
-
-    @Column
-    @JsonIgnore
-    private String fromId;
-
-    @Column
-    @NotBlank(message = "对象类型不能为空", groups = CreateGroup.class)
-    @Schema(description = "对象类型")
-    private String objectType;
-
-    @Column
-    @ColumnType(jdbcType = JDBCType.CLOB)
-    @JsonCodec
-    private List<String > acroutes;
-
-    @Column
-    private String adcode;
-
-    @Column
-    @ColumnType(jdbcType = JDBCType.CLOB)
-    @JsonCodec
-    private List<String > center;
-
-    @Column
-    @ColumnType(jdbcType = JDBCType.CLOB)
-    @JsonCodec
-    private List<String > centroid;
-
-    @Column
-    private int childrenNum;
-
-    @ColumnType(jdbcType = JDBCType.CLOB)
-    @JsonCodec
-    private Map<String,Object> parent;
-
-    @Column
-    private String parentId;
-
-    @Column
-    private String deviceName;
-
-    @Column
-    private String from;
-
-    @Column
-    private String productId;
-
-    @Column
-    private String productName;
-
-    @Column
-    @JsonIgnoreProperties(allowSetters = true)
-    @JsonCodec
-    @ColumnType(jdbcType = JDBCType.CLOB)
-    @Schema(description = "地图信息")
-    private Geometry geometry;
-
-    public static GeoProperty of(DeviceTagEntity tag, DeviceInstanceEntity device){
-        GeoProperty geoProperty = new GeoProperty();
-        Geometry geometry = new Geometry();
-        String[] split = tag.getValue().split(",");
-//        geometry.getCoordinates().add(split[0]);
-//        geometry.getCoordinates().add(split[1]);
-        geometry.setType("Point");
-        geoProperty.setId(tag.getId());
-//        geoProperty.setFrom("tag");
-//        geoProperty.setFromId(tag.getId());
-        geoProperty.setObjectId(tag.getDeviceId());
-        geoProperty.setObjectType("device");
-        geoProperty.setDeviceName(device.getName());
-        geoProperty.setProductName(device.getProductName());
-        geoProperty.setProductId(device.getProductId());
-        geoProperty.setGeometry(geometry);
-        return geoProperty;
-    }
-
-    public static GeoProperty of(Tuple2<DeviceTagEntity,DeviceInstanceEntity> tp2){
-        return of(tp2.getT1(),tp2.getT2());
-    }
-}

+ 0 - 23
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/entity/geo/Geometry.java

@@ -1,23 +0,0 @@
-package org.jetlinks.community.device.entity.geo;
-
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import lombok.Data;
-import org.jetlinks.core.metadata.types.GeoPoint;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName Geometry.java
- * @Description TODO
- * @createTime 2021年09月27日 15:52:00
- */
-@Data
-@JsonSerialize
-public class Geometry {
-    private String type;
-    private List<List<List<Double>>> coordinates=new ArrayList<>();
-}

+ 0 - 1
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/response/DeviceDetail.java

@@ -7,7 +7,6 @@ import org.apache.commons.collections4.MapUtils;
 import org.jetlinks.community.device.entity.DeviceInstanceEntity;
 import org.jetlinks.community.device.entity.DeviceProductEntity;
 import org.jetlinks.community.device.entity.DeviceTagEntity;
-import org.jetlinks.community.device.entity.geo.Geometry;
 import org.jetlinks.community.device.enums.DeviceState;
 import org.jetlinks.community.device.enums.DeviceType;
 import org.jetlinks.core.Values;

+ 0 - 25
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceMessageBusinessHandler.java

@@ -48,8 +48,6 @@ public class DeviceMessageBusinessHandler {
 
     private final EventBus eventBus;
 
-    private final DeviceTagsService tagsService;
-
     private Mono<DeviceOperator> doAutoRegister(DeviceRegisterMessage message) {
         //自动注册
         return Mono
@@ -187,29 +185,6 @@ public class DeviceMessageBusinessHandler {
             .then();
     }
 
-    @Subscribe("/device/*/*/message/tags/update")
-    public Mono<Void> updateDeviceTag(UpdateTagMessage message) {
-        Map<String, Object> tags = message.getTags();
-        String deviceId = message.getDeviceId();
-        List<DeviceTagEntity> tagList = new ArrayList<>();
-        tags.forEach((key,value)->{
-            DeviceTagEntity deviceTagEntity = new DeviceTagEntity();
-            deviceTagEntity.setKey(key);
-            deviceTagEntity.setValue(String.valueOf(value));
-            deviceTagEntity.setDeviceId(deviceId);
-            deviceTagEntity.setCreateTime(new Date());
-            if("coordinate".equals(key)){
-                deviceTagEntity.setType(GeoType.ID);
-            }
-            tagList.add(deviceTagEntity);
-        });
-        return Flux.fromStream(tagList.stream())
-            .map(Flux::just)
-            .flatMap(Function.identity())
-            .doOnNext(tag->tag.setAutoUpdate(true))
-            .flatMap(tagsService::saveOrUpdate).then();
-    }
-
     @Subscribe("/device/*/*/metadata/derived")
     public Mono<Void> updateMetadata(DerivedMetadataMessage message) {
         if (message.isAll()) {

+ 0 - 111
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/DeviceTagsService.java

@@ -1,111 +0,0 @@
-package org.jetlinks.community.device.service;
-
-import lombok.AllArgsConstructor;
-import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
-import org.hswebframework.web.crud.service.GenericReactiveCrudService;
-import org.hswebframework.web.exception.BusinessException;
-import org.jetlinks.community.device.configuration.GeoIndexProvider;
-import org.jetlinks.community.device.entity.DeviceTagEntity;
-import org.jetlinks.community.device.entity.geo.GeoProperty;
-import org.jetlinks.community.device.entity.geo.Geometry;
-import org.jetlinks.community.elastic.search.service.ElasticSearchService;
-import org.jetlinks.core.metadata.types.GeoType;
-import org.springframework.stereotype.Service;
-import reactor.core.Disposable;
-import reactor.core.publisher.Mono;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName DeviceTagsService.java
- * @Description TODO
- * @createTime 2021年09月29日 10:55:00
- */
-@Service
-@AllArgsConstructor
-public class DeviceTagsService  extends GenericReactiveCrudService<DeviceTagEntity, String> {
-
-    private final LocalDeviceInstanceService instanceService;
-    private final LocalDeviceProductService productService;
-    private final ReactiveRepository<GeoProperty, String> propertyRepository;
-    private final ElasticSearchService elasticSearchService;
-    public Mono<Void> saveOrUpdate(DeviceTagEntity entity) {
-        return
-            //先判断是否存在
-            this.createQuery()
-                .where(DeviceTagEntity::getKey,entity.getKey())
-                .where(DeviceTagEntity::getDeviceId,entity.getDeviceId())
-                .count()
-                .flatMap(count->{
-                    if(count==0){
-                        return getRepository()
-                            .save(entity)
-                            .doOnNext(ignore->updateTagGeo(entity))
-                            .then();
-                    }
-                    else if(!entity.isAutoUpdate()){
-                        //存在且不能自动更新
-                        throw new BusinessException(String.format("标签[%s]已存在",entity.getKey()));
-                    }else {
-                        return this.createUpdate()
-                            .where(DeviceTagEntity::getKey,entity.getKey())
-                            .where(DeviceTagEntity::getDeviceId,entity.getDeviceId())
-                            .set(DeviceTagEntity::getValue,entity.getValue())
-                            .execute()
-                            .doOnNext(ignore->updateTagGeo(entity))
-                            .then();
-                    }
-                })
-                .then();
-    }
-
-    //判断是否为设备坐标标签
-    public boolean judgementGeo(DeviceTagEntity entity){
-        return GeoType.ID.equals(entity.getType())&&"coordinate".equals(entity.getKey());
-    }
-
-    public Disposable updateTagGeo(DeviceTagEntity 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("Point");
-        return instanceService.findById(entity.getDeviceId())
-            .flatMap(device->{
-                geoProperty.setFrom("tag");
-                geoProperty.setFromId(entity.getId());
-                geoProperty.setObjectId(device.getId());
-                geoProperty.setObjectType("device");
-                geoProperty.setDeviceName(device.getName());
-                return productService.findById(device.getProductId());
-            })
-            .doOnNext(product->{
-                geoProperty.setProductName(product.getName());
-                geoProperty.setProductId(product.getId());
-                geoProperty.setGeometry(geometry);
-            })
-            .subscribe(ignore0->{
-                propertyRepository.createQuery()
-                    .where(GeoProperty::getFrom,"tag")
-                    .where(GeoProperty::getFromId,entity.getId())
-                    .count()
-                    .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();
-            });
-    }
-
-    public Mono<Void> updateESTagGeo(DeviceTagEntity entity){
-        return elasticSearchService.save(GeoIndexProvider.GEO.getIndex(),Mono.just(entity));
-    }
-}

+ 0 - 32
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalGeoPropertyService.java

@@ -1,32 +0,0 @@
-package org.jetlinks.community.device.service;
-
-import org.hswebframework.web.crud.service.GenericReactiveCrudService;
-import org.jetlinks.community.device.entity.geo.GeoProperty;
-import org.springframework.stereotype.Service;
-import reactor.core.publisher.Mono;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName LocalGeoService.java
- * @Description TODO
- * @createTime 2021年09月27日 11:20:00
- */
-@Service
-public class LocalGeoPropertyService extends GenericReactiveCrudService<GeoProperty, String> {
-
-    /**
-     * 更新子节点数量
-     * @param id
-     * @return
-     */
-    public Mono<Void> updateChildrenNum(String id){
-        return  Mono.just(id)
-            .zipWith(Mono.defer(()->this.createQuery().where(GeoProperty::getParentId,id).count()))
-            .map(tp2->
-                this.createUpdate()
-                    .where(GeoProperty::getId,id)
-                    .set(GeoProperty::getChildrenNum,tp2.getT2()))
-            .then();
-    }
-}

+ 48 - 0
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/LocalGeoRegionService.java

@@ -0,0 +1,48 @@
+package org.jetlinks.community.device.service;
+
+import org.hswebframework.web.crud.service.GenericReactiveTreeSupportCrudService;
+import org.hswebframework.web.id.IDGenerator;
+import org.jetlinks.community.device.entity.GeoRegionEntity;
+import org.springframework.stereotype.Service;
+import reactor.core.publisher.Mono;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName LocalGeoService.java
+ * @Description TODO
+ * @createTime 2021年09月27日 11:20:00
+ */
+@Service
+public class LocalGeoRegionService extends GenericReactiveTreeSupportCrudService<GeoRegionEntity, String> {
+
+    /**
+     * 更新子节点数量
+     * @param parentId
+     * @return
+     */
+    public Mono<Void> updateChildrenNum(String parentId){
+        return  Mono.just(parentId)
+            .zipWith(Mono.defer(()->this.createQuery().where(GeoRegionEntity::getParentId,parentId).count()))
+            .map(tp2->
+                this.createUpdate()
+                    .where(GeoRegionEntity::getId,parentId)
+                    .set(GeoRegionEntity::getChildrenNum,tp2.getT2()))
+            .then();
+    }
+
+    @Override
+    public IDGenerator<String> getIDGenerator() {
+        return IDGenerator.UUID;
+    }
+
+    @Override
+    public void setChildren(GeoRegionEntity entity, List<GeoRegionEntity> children) {
+       entity.setChildren( Optional.ofNullable(entity.getChildren()).orElse(new ArrayList<>()));
+       entity.getChildren().addAll(children);
+    }
+}

+ 0 - 31
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/service/data/GeoData.java

@@ -1,31 +0,0 @@
-package org.jetlinks.community.device.service.data;
-
-import cn.hutool.json.JSONUtil;
-import lombok.Data;
-import org.jetlinks.community.device.entity.geo.Geometry;
-import org.jetlinks.community.device.entity.geo.GeoProperty;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName GeoData.java
- * @Description TODO
- * @createTime 2021年09月27日 16:09:00
- */
-@Data
-public class GeoData {
-
-    private String type;
-
-    private Geometry geometry;
-
-    private GeoProperty properties;
-
-    public void setGeometry(String geometry) {
-        this.geometry = JSONUtil.toBean(geometry,Geometry.class);
-    }
-
-    public void setProperties(String properties) {
-        this.properties = JSONUtil.toBean(properties, GeoProperty.class);
-    }
-}

+ 0 - 4
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/DeviceInstanceController.java

@@ -27,7 +27,6 @@ import org.hswebframework.web.id.IDGenerator;
 import org.jetlinks.community.device.configuration.GeoIndexProvider;
 import org.jetlinks.community.device.dto.DeviceGeoDto;
 import org.jetlinks.community.device.entity.*;
-import org.jetlinks.community.device.entity.geo.Geometry;
 import org.jetlinks.community.device.enums.DeviceState;
 import org.jetlinks.community.device.response.DeviceDeployResult;
 import org.jetlinks.community.device.response.DeviceDetail;
@@ -100,7 +99,6 @@ public class DeviceInstanceController implements
 
     private final DeviceConfigMetadataManager metadataManager;
 
-    private final DeviceTagsService tagsService;
 
     private final LocalDeviceInstanceService instanceService;
 
@@ -113,7 +111,6 @@ public class DeviceInstanceController implements
                                     ReactiveRepository<DeviceTagEntity, String> tagRepository,
                                     DeviceDataService deviceDataService,
                                     DeviceConfigMetadataManager metadataManager,
-                                    DeviceTagsService tagsService,
                                     LocalDeviceInstanceService instanceService,
                                     ElasticSearchService elasticSearchService) {
         this.service = service;
@@ -123,7 +120,6 @@ public class DeviceInstanceController implements
         this.tagRepository = tagRepository;
         this.deviceDataService = deviceDataService;
         this.metadataManager = metadataManager;
-        this.tagsService=tagsService;
         this.instanceService=instanceService;
         this.elasticSearchService=elasticSearchService;
     }

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

@@ -1,39 +1,17 @@
 package org.jetlinks.community.device.web;
 
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
 import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
-import org.hibernate.validator.constraints.Length;
-import org.hswebframework.web.api.crud.entity.PagerResult;
-import org.hswebframework.web.api.crud.entity.QueryParamEntity;
 import org.hswebframework.web.authorization.annotation.Authorize;
 import org.hswebframework.web.authorization.annotation.Resource;
-import org.hswebframework.web.authorization.annotation.SaveAction;
-import org.hswebframework.web.crud.service.ReactiveCrudService;
-import org.hswebframework.web.crud.web.reactive.ReactiveServiceCrudController;
-import org.jetlinks.community.device.entity.DeviceTagEntity;
-import org.jetlinks.community.device.entity.geo.GeoEntity;
-import org.jetlinks.community.device.entity.geo.GeoProperty;
-import org.jetlinks.community.device.entity.geo.Geometry;
-import org.jetlinks.community.device.service.DeviceTagsService;
-import org.jetlinks.community.device.service.LocalDeviceInstanceService;
-import org.jetlinks.community.device.service.LocalGeoPropertyService;
-import org.jetlinks.community.device.web.request.GeoPayload;
-import org.jetlinks.community.device.web.request.GeoRequestParam;
-import org.jetlinks.core.metadata.types.GeoType;
+import org.hswebframework.web.crud.service.ReactiveTreeSortEntityService;
+import org.hswebframework.web.crud.web.reactive.ReactiveTreeServiceQueryController;
+import org.jetlinks.community.device.entity.GeoRegionEntity;
+import org.jetlinks.community.device.service.LocalGeoRegionService;
 import org.springframework.web.bind.annotation.*;
 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;
 
 /**
  * @author lifang
@@ -43,67 +21,33 @@ import java.util.stream.Collectors;
  * @createTime 2021年09月22日 14:35:00
  */
 @RestController
-@RequestMapping("/geo/object")
+@RequestMapping("/geo/region")
 @Authorize
-@Resource(id = "geo-manager", name = "地理位置管理")
-@Tag(name = "地理位置管理")
+@Resource(id = "geo-region", name = "地理区域管理")
+@Tag(name = "地理区域管理")
 @AllArgsConstructor
-public class GeoController  implements ReactiveServiceCrudController<GeoProperty, String> {
-    private final LocalGeoPropertyService geoService;
-    private final LocalDeviceInstanceService instanceService;
-
-
-    @PostMapping("/_search/geo.json")
-    public Mono<?> search(@RequestBody GeoRequestParam param){
-        return geoService.queryPager(param.getQuery())
-            .map(PagerResult::getData)
-            .zipWith(Mono.just(new GeoPayload()))
-            .doOnNext(tp2->{
-                List<GeoProperty> properties = tp2.getT1();
-                if(CollectionUtil.isNotEmpty(properties)){
-                    tp2.getT2().setFeatures(properties.stream().map(geoProperty -> {
-                        GeoEntity geoEntity = new GeoEntity();
-                        geoEntity.setGeometry(geoProperty.getGeometry());
-                        geoEntity.setProperties(geoProperty);
-                        return geoEntity;
-                    }).collect(Collectors.toList()));
-                }
-            })
-            .map(Tuple2::getT2);
-    }
+public class GeoController  implements ReactiveTreeServiceQueryController<GeoRegionEntity, String> {
+    private final LocalGeoRegionService geoService;
 
     /**
-     * 区域管理新增
-     * @param publisher
+     * 区域管理新增或新增
+     * @param region
      * @return
      */
-    @PostMapping("/geo.json")
-    public Mono<Void> save(@RequestBody GeoPayload publisher){
-        return Mono.just(publisher.getFeatures())
-            .flatMap(features->{
-                features.forEach(geo-> geo.getProperties().setGeometry(geo.getGeometry()));
-                List<GeoProperty> collect = features.stream().map(GeoEntity::getProperties).collect(Collectors.toList());
-                return geoService
-                    .insertBatch(Mono.just(collect))
-                    .map(ignore->
-                        Flux.fromStream(collect.stream())
-                            .filter(geoProperty -> StrUtil.isNotEmpty(geoProperty.getParentId()))
-                            .map(GeoProperty::getParentId)
-                            .collect(Collectors.toSet())
-                            .doOnNext(ids->ids.forEach(geoService::updateChildrenNum))
-                    );
-            }).then();
+    @PatchMapping("")
+    public Mono<Void> save(@RequestBody GeoRegionEntity region){
+        return geoService.findById(region.getId())
+            .defaultIfEmpty(new GeoRegionEntity())
+            .zipWith(geoService.save(Mono.just(region)))
+            .flatMap(tp2->
+                Mono.just(tp2.getT1().getParentId()).flatMap(geoService::updateChildrenNum))
+            .thenReturn(Mono.just(region.getParentId()).flatMap(geoService::updateChildrenNum))
+            .then();
     }
 
 
-
-    @Override
-    public Mono<PagerResult<GeoProperty>> queryPager(QueryParamEntity query) {
-        return null;
-    }
-
     @Override
-    public ReactiveCrudService<GeoProperty, String> getService() {
+    public ReactiveTreeSortEntityService<GeoRegionEntity, String> getService() {
         return geoService;
     }
 }

+ 0 - 19
jetlinks-manager/device-manager/src/main/java/org/jetlinks/community/device/web/request/GeoPayload.java

@@ -1,19 +0,0 @@
-package org.jetlinks.community.device.web.request;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Data;
-import org.jetlinks.community.device.entity.geo.GeoEntity;
-import java.util.*;
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName GeoPayload.java
- * @Description TODO
- * @createTime 2021年09月27日 13:48:00
- */
-@Data
-public class GeoPayload {
-    @JsonIgnoreProperties(allowSetters = true)
-    private String type;
-    private List<GeoEntity> features=new LinkedList<>();
-}