Bladeren bron

更新最新位置信息存储位置

yangxiaokun 4 jaren geleden
bovenliggende
commit
59a788ddb3

+ 1 - 1
src/main/java/com/zy/bms/common/Constant.java

@@ -9,7 +9,7 @@ public class Constant {
     /**
      * redis key前缀
      */
-    public static final String REDIS_PREFIX_LOCATION = "device:location:";//数据上传位置信息前缀
+    public static final String REDIS_LOCATION = "bms:device:location";//数据上传位置信息前缀
     public static final String REDIS_TOKEN_PREFIX = "user:token:";//PC管理员登录token 前缀
 
     /**

+ 1 - 1
src/main/java/com/zy/bms/model/MqttMsgDto.java → src/main/java/com/zy/bms/common/dto/MqttMsgDto.java

@@ -1,4 +1,4 @@
-package com.zy.bms.model;
+package com.zy.bms.common.dto;
 
 import com.alibaba.fastjson.JSON;
 import com.zy.bms.common.Constant;

+ 9 - 11
src/main/java/com/zy/bms/common/redis/DeviceManager.java → src/main/java/com/zy/bms/common/redis/DeviceLatestLocationManager.java

@@ -4,32 +4,30 @@ import com.alibaba.fastjson.JSON;
 import com.zy.bms.common.Constant;
 import com.zy.bms.model.DeviceLocation;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.util.concurrent.TimeUnit;
 
 /**
- * 设备信息,存放在缓存中的数据
+ * 设备最新的位置信息,存储在Redis缓存中
+ * 弃用
  *
  * @author yang xiao kun
  * create on 2021/2/8
  */
-@Component
-public class DeviceManager {
+//@Component
+@Deprecated
+public class DeviceLatestLocationManager {
 
     @Resource
     private RedisTemplate<String, String> redisTemplate;
 
     /**
      * 将最新位置信息保存至redis中
-     * 24小时过期
      *
      * @param entity 位置信息
      */
     public void saveLocation(DeviceLocation entity) {
-        redisTemplate.opsForValue()
-                .set(Constant.REDIS_PREFIX_LOCATION + entity.getDeviceId(), JSON.toJSONString(entity), 24, TimeUnit.HOURS);
+        redisTemplate.boundHashOps(Constant.REDIS_LOCATION).put(entity.getDeviceId(), JSON.toJSONString(entity));
     }
 
     /**
@@ -38,8 +36,8 @@ public class DeviceManager {
      * @param deviceId 设备ID
      */
     public DeviceLocation getLocation(String deviceId) {
-        String json = redisTemplate.opsForValue().get(Constant.REDIS_PREFIX_LOCATION + deviceId);
-        if (json == null || json.equals("")) return null;
-        return JSON.parseObject(json, DeviceLocation.class);
+        Object json = redisTemplate.boundHashOps(Constant.REDIS_LOCATION).get(deviceId);
+        if (json == null) return null;
+        return JSON.parseObject(json.toString(), DeviceLocation.class);
     }
 }

+ 79 - 0
src/main/java/com/zy/bms/common/vo/DeviceWithLocationVo.java

@@ -0,0 +1,79 @@
+package com.zy.bms.common.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 设备信息Vo 包含设备信息,位置信息
+ *
+ * @author yang xiao kun
+ * create on 2021/5/12
+ */
+@Data
+public class DeviceWithLocationVo {
+    /**
+     * 设备随机码
+     */
+    private String deviceNum;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 电量
+     */
+    private Integer batteryNum;
+
+    /**
+     * 信号强度
+     */
+    private Integer signalNum;
+
+    /**
+     * 0:无法定位,1:北斗定位,2:基站定位,3:GPS定位
+     */
+    private Integer mode;
+
+    /**
+     * 经度
+     */
+    private String lon;
+
+    /**
+     * 纬度
+     */
+    private String lat;
+
+    /**
+     * 经度(gcj)
+     */
+    private String lonGcj;
+
+    /**
+     * 纬度(gcj)
+     */
+    private String latGcj;
+
+    /**
+     * 格式化的地理位置
+     */
+    private String site;
+
+    /**
+     * 速度
+     */
+    private String speed;
+
+    /**
+     * 收星颗数
+     */
+    private Integer num;
+
+    /**
+     * 数据上传时间
+     */
+    private LocalDateTime uploadTime;
+}

+ 4 - 4
src/main/java/com/zy/bms/config/mqtt/MqttCallbackHandler.java

@@ -2,9 +2,9 @@ package com.zy.bms.config.mqtt;
 
 import com.alibaba.fastjson.JSON;
 import com.zy.bms.common.Constant;
+import com.zy.bms.common.dto.MqttMsgDto;
 import com.zy.bms.common.exception.ApiRuntimeException;
 import com.zy.bms.model.*;
-import com.zy.bms.common.redis.DeviceManager;
 import com.zy.bms.service.*;
 import com.zy.bms.utils.*;
 import com.zy.bms.utils.CoordTransformUtil;
@@ -35,7 +35,7 @@ public class MqttCallbackHandler {
     @Resource
     private DeviceLocationService deviceLocationService;
     @Resource
-    private DeviceManager deviceRedisService;
+    private LatestLocationService latestLocationService;
     @Resource
     private WebSocketServer webSocketServer;
     @Resource
@@ -99,8 +99,8 @@ public class MqttCallbackHandler {
         location.setSite(GaoDeApiUtil.regeo(location.getLonGcj(), location.getLatGcj()));
         // 保存位置信息--历史记录
         deviceLocationService.save(location);
-        // 将最新位置信息保存至redis中
-        deviceRedisService.saveLocation(location);
+        // 保存最新的位置信息
+        latestLocationService.saveLatestLocation(location);
     }
 
     /**

+ 3 - 3
src/main/java/com/zy/bms/controller/pc/PcLocationController.java

@@ -1,7 +1,7 @@
 package com.zy.bms.controller.pc;
 
 import com.zy.bms.common.ServerResponse;
-import com.zy.bms.service.DeviceService;
+import com.zy.bms.service.LatestLocationService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -19,13 +19,13 @@ import javax.annotation.Resource;
 public class PcLocationController {
 
     @Resource
-    private DeviceService deviceService;
+    private LatestLocationService latestLocationService;
 
     /**
      * 获取所有设备的最新定位信息
      */
     @GetMapping("getLatestLocation.do")
     public ServerResponse getLatestLocation() {
-        return ServerResponse.createBySuccess(deviceService.getLatestLocation());
+        return ServerResponse.createBySuccess(latestLocationService.getLatestLocation());
     }
 }

+ 0 - 5
src/main/java/com/zy/bms/mapper/DeviceLocationMapper.java

@@ -19,11 +19,6 @@ import java.util.List;
 @Repository
 public interface DeviceLocationMapper extends BaseMapper<DeviceLocation> {
 
-    /**
-     * 查询数据库中最新的定位信息
-     */
-    DeviceLocation getLatestLocation(String deviceId);
-
     /**
      * 查看设备历史轨迹
      *

+ 0 - 8
src/main/java/com/zy/bms/mapper/DeviceMapper.java

@@ -8,8 +8,6 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
-import java.util.List;
-
 /**
  * @author chenyi
  * Create on 2020/4/10
@@ -27,12 +25,6 @@ public interface DeviceMapper extends BaseMapper<Device> {
      */
     IPage<Device> getListPage(IPage<Device> page, @Param("io") DeviceIO io);
 
-    /**
-     * 后台
-     * 获取数据库中所有设备的 clientId
-     */
-    List<String> getClientIdList();
-
     /**
      * 更新设备名称
      *

+ 25 - 0
src/main/java/com/zy/bms/mapper/LatestLocationMapper.java

@@ -0,0 +1,25 @@
+package com.zy.bms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.bms.common.vo.DeviceWithLocationVo;
+import com.zy.bms.model.LatestLocation;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 设备最新位置信息
+ *
+ * @author chenyi
+ * Create on 2020/4/10
+ */
+@Mapper
+@Repository
+public interface LatestLocationMapper extends BaseMapper<LatestLocation> {
+
+    /**
+     * 获取所有设备最新的位置信息
+     */
+    List<DeviceWithLocationVo> getLatestLocation();
+}

+ 84 - 0
src/main/java/com/zy/bms/model/LatestLocation.java

@@ -0,0 +1,84 @@
+package com.zy.bms.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 设备最新的定位
+ */
+@Data
+@TableName("latest_location")
+public class LatestLocation {
+
+
+    @TableId
+    private Integer id;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 电量
+     */
+    private Integer batteryNum;
+
+    /**
+     * 信号强度
+     */
+    private Integer signalNum;
+
+    /**
+     * 0:无法定位,1:北斗定位,2:基站定位,3:GPS定位
+     */
+    private Integer mode;
+
+    /**
+     * 经度
+     */
+    private String lon;
+
+    /**
+     * 纬度
+     */
+    private String lat;
+
+    /**
+     * 经度(gcj)
+     */
+    private String lonGcj;
+
+    /**
+     * 纬度(gcj)
+     */
+    private String latGcj;
+
+    /**
+     * 格式化的地理位置
+     */
+    private String site;
+
+    /**
+     * 速度
+     */
+    private String speed;
+
+    /**
+     * 收星颗数
+     */
+    private Integer num;
+
+    /**
+     * 数据上传时间
+     */
+    private LocalDateTime uploadTime;
+
+    /**
+     * 最新的修改时间
+     */
+    private LocalDateTime modifyTime;
+}

+ 7 - 9
src/main/java/com/zy/bms/service/DeviceLocationService.java

@@ -1,11 +1,12 @@
 package com.zy.bms.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zy.bms.common.io.wechat.DeviceHistoryIO;
 import com.zy.bms.common.vo.LocationHistoryVo;
 import com.zy.bms.mapper.DeviceLocationMapper;
 import com.zy.bms.model.DeviceLocation;
-import com.zy.bms.common.redis.DeviceManager;
+import com.zy.bms.model.LatestLocation;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -21,20 +22,17 @@ import java.util.List;
 public class DeviceLocationService extends ServiceImpl<DeviceLocationMapper, DeviceLocation> {
 
     @Resource
-    private DeviceManager redisDeviceManager;
+    private LatestLocationService latestLocationService;
 
     /**
      * 获取设备的最新位置信息
-     * (优先查询redis缓存,再查询数据库)
      *
      * @param deviceId 设备ID
      */
-    public DeviceLocation getLocation(String deviceId) {
-        DeviceLocation result = redisDeviceManager.getLocation(deviceId);
-        if (result == null) {
-            result = baseMapper.getLatestLocation(deviceId);
-        }
-        return result;
+    public LatestLocation getLocation(String deviceId) {
+        QueryWrapper<LatestLocation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("deviceId", deviceId);
+        return latestLocationService.getOne(queryWrapper);
     }
 
     /**

+ 0 - 23
src/main/java/com/zy/bms/service/DeviceService.java

@@ -7,14 +7,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zy.bms.common.io.pc.DeviceIO;
 import com.zy.bms.mapper.DeviceMapper;
 import com.zy.bms.model.Device;
-import com.zy.bms.model.DeviceLocation;
-import com.zy.bms.common.redis.DeviceManager;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.Resource;
-import java.util.LinkedList;
-import java.util.List;
-
 
 /**
  * 设备信息相关
@@ -25,23 +19,6 @@ import java.util.List;
 @Service
 public class DeviceService extends ServiceImpl<DeviceMapper, Device> {
 
-    @Resource
-    private DeviceManager redisService;
-
-    /**
-     * 后台
-     * 获取所有设备的最新定位信息
-     */
-    public List<DeviceLocation> getLatestLocation() {
-        List<String> clientIds = baseMapper.getClientIdList();
-        List<DeviceLocation> result = new LinkedList<>();
-        for (String clientId : clientIds) {
-            DeviceLocation item = redisService.getLocation(clientId);
-            if (item != null) result.add(item);
-        }
-        return result;
-    }
-
     /**
      * 后台
      * 分页查询设备列表

+ 39 - 0
src/main/java/com/zy/bms/service/LatestLocationService.java

@@ -0,0 +1,39 @@
+package com.zy.bms.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.common.vo.DeviceWithLocationVo;
+import com.zy.bms.mapper.LatestLocationMapper;
+import com.zy.bms.model.DeviceLocation;
+import com.zy.bms.model.LatestLocation;
+import com.zy.bms.utils.BeanUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 设备位置信息相关
+ *
+ * @author chenyi
+ * Create on 2020/4/10
+ */
+@Service
+public class LatestLocationService extends ServiceImpl<LatestLocationMapper, LatestLocation> {
+
+    /**
+     * 存储最新的位置信息
+     */
+    public void saveLatestLocation(DeviceLocation location) {
+        QueryWrapper<LatestLocation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("deviceId", location.getDeviceId());
+        LatestLocation entity = BeanUtil.cast(location, LatestLocation.class);
+        saveOrUpdate(entity, queryWrapper);
+    }
+
+    /**
+     * 获取所有设备最新的位置信息
+     */
+    public List<DeviceWithLocationVo> getLatestLocation() {
+        return baseMapper.getLatestLocation();
+    }
+}

+ 1 - 1
src/main/java/com/zy/bms/service/MqttLogService.java

@@ -7,7 +7,7 @@ import com.zy.bms.common.Constant;
 import com.zy.bms.common.io.pc.MqttLogsIO;
 import com.zy.bms.mapper.MqttLogMapper;
 import com.zy.bms.model.MqttLog;
-import com.zy.bms.model.MqttMsgDto;
+import com.zy.bms.common.dto.MqttMsgDto;
 import org.springframework.stereotype.Service;
 
 /**

+ 0 - 2
src/main/java/com/zy/bms/service/RelationService.java

@@ -2,11 +2,9 @@ package com.zy.bms.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zy.bms.common.io.wechat.UserDeviceRelationIO;
 import com.zy.bms.mapper.UserDeviceRelationMapper;
 import com.zy.bms.model.UserDeviceRelation;
 import com.zy.bms.common.vo.DeviceRelationVo;
-import com.zy.bms.utils.BeanUtil;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;

+ 1 - 1
src/main/java/com/zy/bms/service/SetToDeviceService.java

@@ -3,7 +3,7 @@ package com.zy.bms.service;
 import com.zy.bms.common.Constant;
 import com.zy.bms.config.mqtt.MqttGateway;
 import com.zy.bms.model.Device;
-import com.zy.bms.model.MqttMsgDto;
+import com.zy.bms.common.dto.MqttMsgDto;
 import com.zy.bms.common.io.wechat.*;
 import com.zy.bms.websocket.WebSocketServer;
 import org.springframework.stereotype.Component;

+ 0 - 10
src/main/resources/mapper/DeviceLocationMapping.xml

@@ -4,16 +4,6 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zy.bms.mapper.DeviceLocationMapper">
 
-    <select id="getLatestLocation" resultType="com.zy.bms.model.DeviceLocation">
-        SELECT
-            *
-        FROM
-            zy_location
-        WHERE
-            deviceId = #{deviceId}
-        ORDER BY uploadTime DESC LIMIT 1
-    </select>
-
     <select id="getHistory" resultType="com.zy.bms.common.vo.LocationHistoryVo">
         SELECT
             deviceId,

+ 0 - 6
src/main/resources/mapper/DeviceMapping.xml

@@ -20,12 +20,6 @@
         ORDER BY createTime DESC
     </select>
 
-    <select id="getClientIdList" resultType="java.lang.String">
-        SELECT clientId
-        FROM zy_device
-        WHERE status = 1
-    </select>
-
     <update id="updateName">
         UPDATE
             zy_device

+ 15 - 0
src/main/resources/mapper/LatestLocationMapping.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.bms.mapper.LatestLocationMapper">
+
+    <select id="getLatestLocation" resultType="com.zy.bms.common.vo.DeviceWithLocationVo">
+        SELECT
+            t1.num AS deviceNum,
+            t2.*
+        FROM
+        zy_device t1
+        LEFT JOIN latest_location t2 ON t1.deviceId = t2.deviceId
+    </select>
+</mapper>