Просмотр исходного кода

新增 首页获取设备列表接口

zhaiyifei 10 месяцев назад
Родитель
Сommit
1d9516a6fd

+ 9 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/controller/IotHomeController.java

@@ -2,6 +2,7 @@ package com.yunfeiyun.agmp.iotm.web.controller;
 
 import com.yunfeiyun.agmp.common.core.controller.BaseController;
 import com.yunfeiyun.agmp.common.core.domain.AjaxResult;
+import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotHomeDeviceListReqVo;
 import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotHomeTypeStatResVo;
 import com.yunfeiyun.agmp.iotm.web.service.IIotHomeService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,4 +41,12 @@ public class IotHomeController extends BaseController
     public AjaxResult deviceStatusStat() {
         return success(iotHomeService.getDeviceStatusStat());
     }
+
+    /**
+     * 查询设备统计
+     */
+    @GetMapping("/device/list")
+    public AjaxResult deviceList(IotHomeDeviceListReqVo reqVo) {
+        return success(iotHomeService.getDeviceList(reqVo));
+    }
 }

+ 37 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/domain/reqvo/IotHomeDeviceListReqVo.java

@@ -0,0 +1,37 @@
+package com.yunfeiyun.agmp.iotm.web.domain.reqvo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class IotHomeDeviceListReqVo {
+
+    /**
+     * 设备标识
+     */
+    private String devBid;
+
+    /** 设备编码 名称 合二为一 支持模糊搜索 */
+    private String devQuery;
+
+    /**
+     * 设备型号业务标识
+     */
+    private String[] devtypeBids;
+
+    /**
+     * 经度
+     */
+    private BigDecimal lng;
+
+    /**
+     * 纬度
+     */
+    private BigDecimal lat;
+
+    /**
+     * 距离范围 单位米
+     */
+    private Integer distance;
+}

+ 30 - 0
src/main/java/com/yunfeiyun/agmp/iotm/web/domain/resvo/IotHomeDeviceListResVo.java

@@ -0,0 +1,30 @@
+package com.yunfeiyun.agmp.iotm.web.domain.resvo;
+
+import lombok.Data;
+
+@Data
+public class IotHomeDeviceListResVo {
+
+    /**
+     * 设备标识
+     */
+    private String devBid;
+
+    /** 设备名称 */
+    private String devName;
+
+    /**
+     * 设备型号业务标识
+     */
+    private String devtypeBid;
+
+    /**
+     * 经度
+     */
+    private String lng;
+
+    /**
+     * 纬度
+     */
+    private String lat;
+}

+ 3 - 3
src/main/java/com/yunfeiyun/agmp/iotm/web/service/IIotHomeService.java

@@ -1,7 +1,7 @@
 package com.yunfeiyun.agmp.iotm.web.service;
 
-import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotDeviceListStatReqVo;
-import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotDeviceListStatResVo;
+import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotHomeDeviceListReqVo;
+import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotHomeDeviceListResVo;
 import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotHomeDeviceStatResVo;
 import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotHomeTypeStatResVo;
 
@@ -12,5 +12,5 @@ public interface IIotHomeService {
 
     public IotHomeDeviceStatResVo getDeviceStatusStat();
 
-    public List<IotDeviceListStatResVo> getDeviceListStat(IotDeviceListStatReqVo reqVo);
+    public List<IotHomeDeviceListResVo> getDeviceList(IotHomeDeviceListReqVo reqVo);
 }

+ 65 - 29
src/main/java/com/yunfeiyun/agmp/iotm/web/service/impl/IotHomeServiceImpl.java

@@ -2,24 +2,32 @@ package com.yunfeiyun.agmp.iotm.web.service.impl;
 
 import com.yunfeiyun.agmp.common.utils.SecurityUtils;
 import com.yunfeiyun.agmp.iot.common.domain.IotDevice;
+import com.yunfeiyun.agmp.iot.common.domain.IotDeviceGeoLocation;
 import com.yunfeiyun.agmp.iot.common.service.MongoService;
 import com.yunfeiyun.agmp.iot.common.util.BigDecimalUtil;
-import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotDeviceListStatReqVo;
-import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotDeviceListStatResVo;
+import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotDeviceListReqVo;
+import com.yunfeiyun.agmp.iotm.web.domain.reqvo.IotHomeDeviceListReqVo;
+import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotDeviceListResVo;
+import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotHomeDeviceListResVo;
 import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotHomeDeviceStatResVo;
 import com.yunfeiyun.agmp.iotm.web.domain.resvo.IotHomeTypeStatResVo;
 import com.yunfeiyun.agmp.iotm.web.service.IIotDeviceService;
 import com.yunfeiyun.agmp.iotm.web.service.IIotHomeService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.aggregation.Aggregation;
-import org.springframework.data.mongodb.core.aggregation.MatchOperation;
+import org.springframework.data.mongodb.core.aggregation.GeoNearOperation;
 import org.springframework.data.mongodb.core.aggregation.ProjectionOperation;
+import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.NearQuery;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.List;
+import java.util.*;
 
+@Slf4j
 @Service
 public class IotHomeServiceImpl implements IIotHomeService {
 
@@ -42,40 +50,68 @@ public class IotHomeServiceImpl implements IIotHomeService {
     }
 
     @Override
-    public List<IotDeviceListStatResVo> getDeviceListStat(IotDeviceListStatReqVo reqVo) {
+    public List<IotHomeDeviceListResVo> getDeviceList(IotHomeDeviceListReqVo reqVo) {
         String tid = SecurityUtils.getTid();
-        BigDecimal devLng = reqVo.getDevLng();
-        BigDecimal devLat = reqVo.getDevLat();
+        String devQery = reqVo.getDevBid();
+        BigDecimal devLng = reqVo.getLng();
+        BigDecimal devLat = reqVo.getLat();
+        String[] devtypeBids = reqVo.getDevtypeBids();
+        List<String> devtypeBidList = new ArrayList<>();
+        if(devtypeBids != null) {
+            devtypeBidList = Arrays.asList(devtypeBids);
+        }
+        Integer distance = reqVo.getDistance();
+
+        IotDeviceListReqVo req = new IotDeviceListReqVo();
+        req.setTid(tid);
+        req.setDevQuery(devQery);
+        req.setDevtypeBidList(devtypeBidList);
+
+        List<IotDeviceListResVo> iotDeviceList = iIotDeviceService.selectIotDeviceListByType(req);
+        Map<String, IotDeviceListResVo> deviceMap = new HashMap<>();
+        for(IotDeviceListResVo item : iotDeviceList) {
+            deviceMap.put(item.getDevBid(), item);
+        }
+
         double lng = 0;
         double lat = 0;
         if(devLng != null && devLat != null) {
-            lng = BigDecimalUtil.format(lng).doubleValue();
-            lat = BigDecimalUtil.format(lat).doubleValue();
+            lng = BigDecimalUtil.format(devLng).doubleValue();
+            lat = BigDecimalUtil.format(devLat).doubleValue();
         }
-
         Criteria criteria = new Criteria()
                 .and("tid").is(tid);
-        MatchOperation matchOperation = Aggregation.match(criteria);
+        if(!devtypeBidList.isEmpty()) {
+            criteria = criteria.and("devtypeBid").in(devtypeBidList);
+        }
+        GeoJsonPoint centerPoint = new GeoJsonPoint(lng, lat);
+        NearQuery nearQuery = NearQuery.near(centerPoint).query(new Query(criteria)).distanceMultiplier(6378137);
+        if(distance != null) {
+            nearQuery = nearQuery.maxDistance(distance);
+        }
+        GeoNearOperation geoNearOperation = Aggregation.geoNear(nearQuery, "distance");
 
         ProjectionOperation projectionOperationResult = Aggregation.project("_id")
-                .and("_id").as("devtypeBid")
-                .and("count").as("count");
+                .and("devBid").as("devBid")
+                .and("devtypeBid").as("devtypeBid")
+                .and("distance").as("distance")
+                .andExpression("{$arrayElemAt: {'$devGeoLocation.coordinates', 0}}").as("lng")
+                .andExpression("{$arrayElemAt: {'$devGeoLocation.coordinates', 1}}").as("lat");
 
-//        Aggregation aggregation = Aggregation.newAggregation(
-//                matchOperation,
-//                groupOperation,
-//                projectionOperationResult
-//        );
-//        List<IotIndexDevicetypeCountResVo> dataList = mongoService.aggregate(IotDeviceGeoLocation.class, aggregation, IotIndexDevicetypeCountResVo.class);
-//        for(IotIndexDevicetypeCountResVo item : dataList) {
-//            String devtypeBid = item.getDevtypeBid();
-//            TosDevicetype devicetype = devicetypeMap.get(devtypeBid);
-//            if (devicetype != null) {
-//                item.setDevtypeName(devicetype.getDevtypeName());
-//                item.setDevtypePreview(devicetype.getDevtypePreview());
-//            }
-//        }
-
-        return null;
+        Aggregation aggregation = Aggregation.newAggregation(
+                geoNearOperation,
+                projectionOperationResult
+        );
+        List<IotHomeDeviceListResVo> dataList = mongoService.aggregate(IotDeviceGeoLocation.class, aggregation, IotHomeDeviceListResVo.class);
+        List<IotHomeDeviceListResVo> resultList = new ArrayList<>();
+        for(IotHomeDeviceListResVo item : dataList) {
+            IotDevice deviceInfo = deviceMap.get(item.getDevBid());
+            if(deviceInfo == null){
+                continue;
+            }
+            item.setDevName(deviceInfo.getDevName());
+            resultList.add(item);
+        }
+        return resultList;
     }
 }