yangliu 3 месяцев назад
Родитель
Сommit
4e662ebd32
29 измененных файлов с 537 добавлено и 225 удалено
  1. BIN
      RadarTimeSeriesService.java
  2. 47 0
      device-service-application/src/main/java/com/hfln/device/application/service/PoseAnalysisService.java
  3. 266 0
      device-service-application/src/main/java/com/hfln/device/application/service/impl/PoseAnalysisServiceImpl.java
  4. 72 0
      device-service-common/src/main/java/com/hfln/device/common/constant/AlarmEventConstants.java
  5. 6 33
      device-service-common/src/main/java/com/hfln/device/common/dto/data/device/DeviceDTO.java
  6. 6 7
      device-service-common/src/main/java/com/hfln/device/common/dto/data/event/EventListDTO.java
  7. 5 6
      device-service-common/src/main/java/com/hfln/device/common/dto/data/home/HomeInfoDTO.java
  8. 3 6
      device-service-common/src/main/java/com/hfln/device/common/dto/data/user/UserDto.java
  9. 15 18
      device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceBandingParams.java
  10. 3 6
      device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceListParams.java
  11. 4 6
      device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceLocationParams.java
  12. 3 6
      device-service-common/src/main/java/com/hfln/device/common/request/event/EventListParams.java
  13. 4 6
      device-service-common/src/main/java/com/hfln/device/common/request/user/LoginBySmsCodeParams.java
  14. 3 6
      device-service-common/src/main/java/com/hfln/device/common/request/user/UserLoginParams.java
  15. 5 8
      device-service-common/src/main/java/com/hfln/device/common/request/user/UserSignupParams.java
  16. 3 6
      device-service-common/src/main/java/com/hfln/device/common/request/user/UserUpdatePasswordParams.java
  17. 6 7
      device-service-common/src/main/java/com/hfln/device/common/vo/PageRecord.java
  18. 2 3
      device-service-common/src/main/java/com/hfln/device/common/vo/PageVo.java
  19. 1 1
      device-service-domain/src/main/java/com/hfln/device/domain/service/impl/PoseAnalysisServiceImpl.java
  20. 1 0
      device-service-domain/src/test/java/com/hfln/device/domain/entity/DevicePointCloudBasicTest.java
  21. 1 0
      device-service-domain/src/test/java/com/hfln/device/domain/entity/PointCloudAlgorithmDemo.java
  22. 15 1
      device-service-server/pom.xml
  23. 0 83
      device-service-server/src/main/resources/application.yml
  24. 15 6
      device-service-server/src/main/resources/bootstrap-dev.yml
  25. 2 0
      device-service-server/src/main/resources/bootstrap-local.yml
  26. 2 0
      device-service-server/src/main/resources/bootstrap-prod.yml
  27. 27 6
      device-service-server/src/main/resources/bootstrap-test.yml
  28. 4 2
      device-service-server/src/main/resources/bootstrap.yml
  29. 16 2
      pom.xml

BIN
RadarTimeSeriesService.java


+ 47 - 0
device-service-application/src/main/java/com/hfln/device/application/service/PoseAnalysisService.java

@@ -0,0 +1,47 @@
+package com.hfln.device.application.service;
+
+import com.hfln.device.domain.entity.Device;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 姿态分析服务接口
+ * 对应Python版本的post_process.py线程功能
+ */
+public interface PoseAnalysisService {
+    
+    /**
+     * 启动姿态分析后台线程
+     * 对应Python版本的post_process_ex()线程函数
+     */
+    void startPoseAnalysisThread();
+    
+    /**
+     * 停止姿态分析后台线程
+     */
+    void stopPoseAnalysisThread();
+    
+    /**
+     * 处理点云数据获取姿态
+     * 对应Python版本的deal_post_data方法
+     * @param rawPoints 原始点云数据
+     * @return 处理后的点云数据
+     */
+    Map<String, Object> dealPostData(List<List<Float>> rawPoints);
+    
+    /**
+     * 检查姿态类型
+     * 对应Python版本的check_pose方法
+     * @param predictedClass 预测的类别
+     * @return 姿态类型
+     */
+    int checkPose(int predictedClass);
+    
+    /**
+     * 根据响应信息确定姿态
+     * 对应Python版本的check_pose_ex方法
+     * @param response HTTP响应
+     * @return 姿态类型
+     */
+    int checkPoseFromResponse(Map<String, Object> response);
+} 

+ 266 - 0
device-service-application/src/main/java/com/hfln/device/application/service/impl/PoseAnalysisServiceImpl.java

@@ -0,0 +1,266 @@
+package com.hfln.device.application.service.impl;
+
+import com.hfln.device.domain.service.DeviceManagerService;
+import com.hfln.device.application.service.PoseAnalysisService;
+import com.hfln.device.domain.constant.DeviceConstants;
+import com.hfln.device.domain.entity.Device;
+import com.hfln.device.domain.gateway.MqttGateway;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * 姿态分析服务实现
+ * 对应Python版本的post_process.py线程功能
+ */
+@Service
+@Slf4j
+public class PoseAnalysisServiceImpl implements PoseAnalysisService {
+
+    @Autowired
+    DeviceManagerService deviceManagerService;
+    
+    @Autowired
+    MqttGateway mqttGateway;
+    
+    @Autowired
+    RestTemplate restTemplate;
+    
+    @Value("${pose.analysis.server.url:http://43.137.10.199:5000/predict}")
+    String poseAnalysisServerUrl;
+    
+    @Value("${pose.analysis.model.type:LIBO}")
+    String modelType;
+    
+    @Value("${pose.analysis.pose.class:POSE_CLASS_4}")
+    String poseClass;
+    
+    Thread poseAnalysisThread;
+    final AtomicBoolean running = new AtomicBoolean(false);
+    
+    // 统计信息
+    int count = 0;
+    double totalInterval = 0;
+    double averageInterval = 0;
+
+    @PostConstruct
+    public void init() {
+        startPoseAnalysisThread();
+    }
+
+    @PreDestroy
+    public void destroy() {
+        stopPoseAnalysisThread();
+    }
+
+    @Override
+    public void startPoseAnalysisThread() {
+        if (running.get()) {
+            return;
+        }
+        
+        running.set(true);
+        poseAnalysisThread = new Thread(this::poseAnalysisProcess, "PoseAnalysisThread");
+        poseAnalysisThread.setDaemon(true);
+        poseAnalysisThread.start();
+        
+        log.info("姿态分析后台线程已启动 - 对应Python版本的post_process_ex线程");
+    }
+
+    @Override
+    public void stopPoseAnalysisThread() {
+        running.set(false);
+        if (poseAnalysisThread != null) {
+            poseAnalysisThread.interrupt();
+        }
+        log.info("姿态分析后台线程已停止");
+    }
+
+    /**
+     * 姿态分析处理主循环
+     * 对应Python版本的post_process_ex()函数
+     */
+    private void poseAnalysisProcess() {
+        log.info("开始姿态分析处理循环");
+        
+        while (running.get() && !Thread.currentThread().isInterrupted()) {
+            try {
+                Thread.sleep(100); // 对应Python版本的time.sleep(0.1)
+                
+                // 分别处理每个设备积累的点云数据
+                Device device = null;
+                List<List<Float>> cloudPoints = null;
+                String deviceId = null;
+                
+                // 对应Python: for dev_id, device in g_dev_map.items():
+                Collection<Device> deviceCollection = deviceManagerService.getAllDevicesFromCache();
+                for (Device dev : deviceCollection) {
+                    cloudPoints = dev.getMaxLenCloudPoints();
+                    // 对应Python: if (cloud_points == None or len(cloud_points) <= 20): continue
+                    if (cloudPoints == null || cloudPoints.size() <= 20) {
+                        continue;
+                    }
+                    device = dev;
+                    deviceId = dev.getDevId();
+                    break; // 对应Python的break
+                }
+                
+                if (device == null || cloudPoints == null) {
+                    continue;
+                }
+                
+                int rawPointsLen = cloudPoints.size();
+                
+                try {
+                    // 处理点云数据
+                    Map<String, Object> postData = dealPostData(cloudPoints);
+                    
+                    // 向姿态算法服务发起请求
+                    long reqTimestamp = System.currentTimeMillis();
+                    Map<String, Object> response = restTemplate.postForObject(poseAnalysisServerUrl, postData, Map.class);
+                    double interval = (System.currentTimeMillis() - reqTimestamp) / 1000.0;
+                    
+                    if (response == null) {
+                        log.debug("post error: invalid response, response is null, [{}]", deviceId);
+                        continue;
+                    }
+                    
+                    // 检查姿态结果
+                    int pose = checkPoseFromResponse(response);
+                    
+                    // 计算耗时统计
+                    count++;
+                    totalInterval += interval;
+                    averageInterval = totalInterval / count;
+                    
+                    // 更新目标实时姿态
+                    device.updatePose(pose);
+                    List<Integer> realtimePose = device.getRealtimePose();
+                    
+                    String poseText = getPoseText(realtimePose.get(0));
+                    String currentPoseText = getPoseText(pose);
+                    String logText = String.format("姿态:%s (%s) \t[%d]\t[%.3f  %.3f]\t[%s]", 
+                        poseText, currentPoseText, rawPointsLen, interval, averageInterval, deviceId);
+                    log.info(logText);
+                    
+                    // 若姿态为躺,上报跌倒事件
+                    long now = System.currentTimeMillis();
+                    if (device.getAlarmAck() || 
+                        (device.getLastReportFallTime() != null && 
+                         now - device.getLastReportFallTime() < device.getAlarmInterval())) {
+                        continue;
+                    }
+                    
+                    if (realtimePose.isEmpty() || realtimePose.get(0) != 0) { // POSE_0 = 0 (躺)
+                        continue;
+                    }
+                    
+                    // 获取目标追踪数据并发送跌倒事件
+                    List<List<Float>> targets = getTrackerTargets(cloudPoints);
+                    String event = "fall_detected";
+                    mqttGateway.sendEventMessage(deviceId, cloudPoints, realtimePose.get(0), targets, event);
+                    device.setLastFallTime("fall_detected", now);
+                    
+                    log.debug("算法检测跌倒事件: 摔, dev_id:{}", deviceId);
+                    
+                } catch (Exception e) {
+                    log.error("处理设备{}的姿态分析时发生错误", deviceId, e);
+                }
+                
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                break;
+            } catch (Exception e) {
+                log.error("姿态分析处理循环发生错误", e);
+            }
+        }
+        
+        log.info("姿态分析处理循环结束");
+    }
+
+    @Override
+    public Map<String, Object> dealPostData(List<List<Float>> rawPoints) {
+        // 对应Python: RawPoints = [sublist[0:3] for sublist in RawPoints]
+        List<List<Float>> processedPoints = new ArrayList<>();
+        for (List<Float> point : rawPoints) {
+            if (point.size() >= 3) {
+                processedPoints.add(Arrays.asList(point.get(0), point.get(1), point.get(2)));
+            }
+        }
+        
+        Map<String, Object> pointCloudData = new HashMap<>();
+        
+        if ("LIBO".equals(modelType)) {
+            // 李博模型
+            pointCloudData.put("point_cloud", processedPoints);
+        } else if ("ANDA".equals(modelType)) {
+            // 安大模型
+            pointCloudData.put("ID", "JSON_DATA");
+            Map<String, Object> payload = new HashMap<>();
+            payload.put("raw_points", processedPoints);
+            pointCloudData.put("Payload", payload);
+            pointCloudData.put("Type", "POINT");
+        }
+        
+        return pointCloudData;
+    }
+
+    @Override
+    public int checkPose(int predictedClass) {
+        if ("LIBO".equals(modelType)) {
+            if ("POSE_CLASS_3".equals(poseClass)) {
+                if (predictedClass == 2) {
+                    return 4; // POSE_4
+                } else {
+                    return predictedClass;
+                }
+            } else if ("POSE_CLASS_4".equals(poseClass) || "POSE_CLASS_5".equals(poseClass)) {
+                return predictedClass;
+            }
+        } else if ("ANDA".equals(modelType)) {
+            return predictedClass;
+        }
+        
+        return predictedClass;
+    }
+
+    @Override
+    public int checkPoseFromResponse(Map<String, Object> response) {
+        Object predictedClassObj = response.get("predicted_class");
+        if (predictedClassObj instanceof Number) {
+            int predictedClass = ((Number) predictedClassObj).intValue();
+            return checkPose(predictedClass);
+        }
+        return DeviceConstants.PoseEnum.POSE_INVALID.getCode();
+    }
+    
+    /**
+     * 获取目标追踪数据
+     * 对应Python版本的get_tracker_targets方法
+     */
+    private List<List<Float>> getTrackerTargets(List<List<Float>> cloudPoints) {
+        // 简化实现,实际应该调用点云处理服务
+        return new ArrayList<>();
+    }
+    
+    /**
+     * 获取姿态文本描述
+     */
+    private String getPoseText(int pose) {
+        switch (pose) {
+            case 0: return "躺";
+            case 1: return "坐";
+            case 2: return "蹲";
+            case 3: return "弯腰";
+            case 4: return "站";
+            default: return "无效";
+        }
+    }
+} 

+ 72 - 0
device-service-common/src/main/java/com/hfln/device/common/constant/AlarmEventConstants.java

@@ -0,0 +1,72 @@
+package com.hfln.device.common.constant;
+
+/**
+ * 告警事件常量类
+ * 对应Python版本的事件编号系统
+ */
+public class AlarmEventConstants {
+    
+    /**
+     * 设备级别的一般滞留告警 (对应Python版本event=4)
+     */
+    public static final int EVENT_DEVICE_RETENTION = 4;
+    
+    /**
+     * 告警计划级别的厕所滞留告警 (对应Python版本event=5)
+     */
+    public static final int EVENT_TOILET_RETENTION = 5;
+    
+    /**
+     * 跌倒事件告警
+     */
+    public static final int EVENT_FALL = 1;
+    
+    /**
+     * 离开事件告警
+     */
+    public static final int EVENT_LEAVE = 2;
+    
+    /**
+     * 进入事件告警
+     */
+    public static final int EVENT_ENTER = 3;
+    
+    // 告警类型描述
+    
+    /**
+     * 设备级别的一般滞留告警描述 (对应Python版本desc="alarm_retention")
+     */
+    public static final String DESC_DEVICE_RETENTION = "alarm_retention";
+    
+    /**
+     * 告警计划级别的厕所滞留告警描述 (对应Python版本desc="alarm_toilet_retention")
+     */
+    public static final String DESC_TOILET_RETENTION = "alarm_toilet_retention";
+    
+    /**
+     * 跌倒事件告警描述
+     */
+    public static final String DESC_FALL = "alarm_fall";
+    
+    /**
+     * 离开事件告警描述
+     */
+    public static final String DESC_LEAVE = "alarm_leave";
+    
+    /**
+     * 进入事件告警描述
+     */
+    public static final String DESC_ENTER = "alarm_enter";
+    
+    // 告警表名
+    
+    /**
+     * 告警事件表名
+     */
+    public static final String TABLE_ALARM_EVENT = "alarm_event";
+    
+    /**
+     * 停留时间表名
+     */
+    public static final String TABLE_STAY_TIME = "stay_time";
+} 

+ 6 - 33
device-service-common/src/main/java/com/hfln/device/common/dto/data/device/DeviceDTO.java

@@ -1,7 +1,6 @@
 package com.hfln.device.common.dto.data.device;
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -14,175 +13,149 @@ public class DeviceDTO extends BaseVO {
     /**
      * 主键ID
      */
-    @ApiModelProperty("主键ID")
     private Long devInfoId;
 
     /**
      * 设备ID
      */
-    @ApiModelProperty("设备ID")
     private String devId;
 
     /**
      * 用户openid
      */
-    @ApiModelProperty("用户Id")
     private Long userId;
 
     /**
      * 设备名称
      */
-    @ApiModelProperty("设备名称")
     private String devName;
 
     /**
      * 设备类型
      */
-    @ApiModelProperty("设备类型")
     private String devType;
 
     /**
      * 在线状态:0-离线,1-在线
      */
-    @ApiModelProperty("在线状态:0-离线,1-在线")
     private Integer online;
 
     /**
      * 设备报警:0-正常,1-报警
      */
-    @ApiModelProperty("设备报警:0-正常,1-报警")
     private Integer devWarn;
 
     /**
      * 软件版本号
      */
-    @ApiModelProperty("软件版本号")
     private String software;
 
     /**
      * 硬件版本号
      */
-    @ApiModelProperty("硬件版本号")
     private String hardware;
 
     /**
      * wifi名称
      */
-    @ApiModelProperty("wifi名称")
     private String wifiName;
 
     /**
      * wifi密码
      */
-    @ApiModelProperty(" wifi密码")
     private String wifiPassword;
 
     /**
      * ip地址
      */
-    @ApiModelProperty("ip地址")
     private String ip;
 
     /**
      * 安装方式:Wall-墙装,Ceiling-顶装
      */
-    @ApiModelProperty("安装方式:Wall-墙装,Ceiling-顶装")
     private String mountPlain;
 
     /**
      * 跟踪区域起始X坐标
      */
-    @ApiModelProperty("跟踪区域起始X坐标")
     private BigDecimal startX;
 
     /**
      * 跟踪区域起始Y坐标
      */
-    @ApiModelProperty("跟踪区域起始Y坐标")
     private BigDecimal startY;
 
     /**
      * 跟踪区域起始Z坐标
      */
-    @ApiModelProperty("跟踪区域起始Z坐标")
     private BigDecimal startZ;
 
     /**
      * 跟踪区域结束X坐标
      */
-    @ApiModelProperty("跟踪区域结束X坐标")
     private BigDecimal stopX;
 
     /**
      * 跟踪区域结束Y坐标
      */
-    @ApiModelProperty("跟踪区域结束Y坐标")
     private BigDecimal stopY;
 
     /**
      * 跟踪区域结束Z坐标
      */
-    @ApiModelProperty("跟踪区域结束Z坐标")
     private BigDecimal stopZ;
 
     /**
      * 安装高度
      */
-    @ApiModelProperty("安装高度")
     private BigDecimal height;
 
     /**
      * 房间长度
      */
-    @ApiModelProperty("房间长度")
     private BigDecimal length;
 
     /**
      * 房间宽度
      */
-    @ApiModelProperty("房间宽度")
     private BigDecimal width;
 
     /**
      * target数组
      */
-    @ApiModelProperty("target数组")
     private Object targetPoints;
 
     /**
      * 接收target时间
      */
-    @ApiModelProperty("接收target时间")
     private LocalDateTime signalTime;
 
     /**
      * 北向夹角
      */
-    @ApiModelProperty("北向夹角")
     private BigDecimal northAngle;
 
     /**
      * 安装坐标x
      */
-    @ApiModelProperty("安装坐标x")
     private BigDecimal x;
 
     /**
      * 安装坐标y
      */
-    @ApiModelProperty("安装坐标y")
+    //@ApiModelProperty("安装坐标y")
     private BigDecimal y;
 
     /**
      * 指示灯开关:0-关闭,1-开启
      */
-    @ApiModelProperty("指示灯开关:0-关闭,1-开启")
+    //@ApiModelProperty("指示灯开关:0-关闭,1-开启")
     private Integer statusLight;
 
     /**
      * 创建人
      */
-    @ApiModelProperty("创建人")
+    //@ApiModelProperty("创建人")
     private String createId;
 
 
@@ -190,19 +163,19 @@ public class DeviceDTO extends BaseVO {
      * 修改人
      */
 
-    @ApiModelProperty("修改人")
+    //@ApiModelProperty("修改人")
     private String updateId;
 
     /**
      * 创建时间
      */
-    @ApiModelProperty("创建时间")
+    //@ApiModelProperty("创建时间")
     private LocalDateTime createTime;
 
     /**
      * 更新时间
      */
-    @ApiModelProperty("更新时间")
+    //@ApiModelProperty("更新时间")
     private LocalDateTime updateTime;
 
 

+ 6 - 7
device-service-common/src/main/java/com/hfln/device/common/dto/data/event/EventListDTO.java

@@ -1,7 +1,6 @@
 package com.hfln.device.common.dto.data.event;
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -11,37 +10,37 @@ public class EventListDTO extends BaseVO {
     /**
      * 主键ID
      */
-    @ApiModelProperty("事件主键")
+    //@ApiModelProperty("事件主键")
     private Long eventListId;
 
     /**
      * 设备ID
      */
-    @ApiModelProperty("设备Id")
+    //@ApiModelProperty("设备Id")
     private String devId;
 
     /**
      * 姿态
      */
-    @ApiModelProperty("姿态")
+    //@ApiModelProperty("姿态")
     private Integer pose;
 
     /**
      * target数组
      */
-    @ApiModelProperty("target数组")
+    //@ApiModelProperty("target数组")
     private String targetPoints;
 
     /**
      * 事件类型
      */
-    @ApiModelProperty("事件类型")
+    //@ApiModelProperty("事件类型")
     private Integer event;
 
     /**
      * 是否处理:0-未处理,1-已处理
      */
-    @ApiModelProperty("是否处理:0-未处理,1-已处理")
+    //@ApiModelProperty("是否处理:0-未处理,1-已处理")
     private Integer isHandle;
 
 }

+ 5 - 6
device-service-common/src/main/java/com/hfln/device/common/dto/data/home/HomeInfoDTO.java

@@ -2,7 +2,6 @@ package com.hfln.device.common.dto.data.home;
 
 import com.hfln.device.common.dto.data.device.DeviceDTO;
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -13,22 +12,22 @@ import java.util.List;
 public class HomeInfoDTO extends BaseVO {
 
 
-    @ApiModelProperty("轮播图片")
+    //@ApiModelProperty("轮播图片")
     private String carouselImage;
 
-    @ApiModelProperty("设备列表")
+    //@ApiModelProperty("设备列表")
     private List<DeviceDTO> deviceList;
 
-    @ApiModelProperty("群组数量")
+    //@ApiModelProperty("群组数量")
     private Integer groupNum;
 
-    @ApiModelProperty("分享数量")
+    //@ApiModelProperty("分享数量")
     private Integer shareNum;
 
     /**
      * 家庭名称
      */
-    @ApiModelProperty("家庭名称")
+    //@ApiModelProperty("家庭名称")
     private String homeName;
 
 }

+ 3 - 6
device-service-common/src/main/java/com/hfln/device/common/dto/data/user/UserDto.java

@@ -2,21 +2,18 @@ package com.hfln.device.common.dto.data.user;
 
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 @EqualsAndHashCode(callSuper = true)
-@ApiModel(description = "鐢ㄦ埛鐧诲綍杩斿洖瀵硅薄")
 @Data
 public class UserDto extends BaseVO {
 
-    @ApiModelProperty("鐢ㄦ埛Id")
+    //@ApiModelProperty("鐢ㄦ埛Id")
     private Long UserId;
-    @ApiModelProperty("鎵嬫満鍙风爜")
+    //@ApiModelProperty("鎵嬫満鍙风爜")
     private String phone;
-    @ApiModelProperty("寰俊OpenId")
+    //@ApiModelProperty("寰俊OpenId")
     private String openid;
 }
 

+ 15 - 18
device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceBandingParams.java

@@ -1,8 +1,6 @@
 package com.hfln.device.common.request.device;
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -11,55 +9,54 @@ import java.math.BigDecimal;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "设备绑定")
 public class DeviceBandingParams extends BaseVO {
 
     @NotEmpty(message = "设备Id不能为空")
-    @ApiModelProperty(value = "设备ID",required = true)
+    ////@ApiModelProperty(value = "设备ID",required = true)
     private String devId;
 
     @NotEmpty(message = "用户Id不能为空")
-    @ApiModelProperty("用户Id")
+    //@ApiModelProperty("用户Id")
     private Long userId;
 
-    @ApiModelProperty("设备名称")
+    //@ApiModelProperty("设备名称")
     private String devName;
 
-    @ApiModelProperty("房间长度")
+    //@ApiModelProperty("房间长度")
     private BigDecimal length;
 
-    @ApiModelProperty("房间宽度")
+    //@ApiModelProperty("房间宽度")
     private BigDecimal width;
 
-    @ApiModelProperty("房间高度")
+    //@ApiModelProperty("房间高度")
     private BigDecimal height;
 
-    @ApiModelProperty(value = "北向夹角")
+    //@ApiModelProperty(value = "北向夹角")
     private BigDecimal northAngle;
 
 
-    @ApiModelProperty(value = "安装方式")
+    //@ApiModelProperty(value = "安装方式")
     private String mountPlain;
 
-    @ApiModelProperty(value = "安装坐标x开始")
+    //@ApiModelProperty(value = "安装坐标x开始")
     private BigDecimal xStart;
-    @ApiModelProperty(value = "安装坐标x结束")
+    //@ApiModelProperty(value = "安装坐标x结束")
     private BigDecimal xEnd;
 
 
-    @ApiModelProperty(value = "安装坐标y开始")
+    //@ApiModelProperty(value = "安装坐标y开始")
     private BigDecimal yStart;
-    @ApiModelProperty(value = "安装坐标y结束")
+    //@ApiModelProperty(value = "安装坐标y结束")
     private BigDecimal yEnd;
 
 
-    @ApiModelProperty(value = "安装坐标z开始")
+    //@ApiModelProperty(value = "安装坐标z开始")
     private BigDecimal zStart;
-    @ApiModelProperty(value = "安装坐标z结束")
+    //@ApiModelProperty(value = "安装坐标z结束")
     private BigDecimal zEnd;
 
 
-    @ApiModelProperty(value = "指示灯开关")
+    //@ApiModelProperty(value = "指示灯开关")
     private int statusLight;
 
 

+ 3 - 6
device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceListParams.java

@@ -1,8 +1,6 @@
 package com.hfln.device.common.request.device;
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -10,17 +8,16 @@ import javax.validation.constraints.NotEmpty;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "设备列表查询")
 public class DeviceListParams extends BaseVO {
 
     @NotEmpty(message = "用户Id不能为空!")
-    @ApiModelProperty(value = "用户Id",required = true)
+    //@ApiModelProperty(value = "用户Id",required = true)
     private Long userId;
 
-    @ApiModelProperty(value = "关键词")
+    //@ApiModelProperty(value = "关键词")
     private String keyWord;
 
-    @ApiModelProperty(value = "状态 0:在线  1:离线  2:报警")
+    //@ApiModelProperty(value = "状态 0:在线  1:离线  2:报警")
     private Integer status;
 
 

+ 4 - 6
device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceLocationParams.java

@@ -1,8 +1,7 @@
 package com.hfln.device.common.request.device;
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -11,18 +10,17 @@ import java.math.BigDecimal;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "设备为止更新")
 public class DeviceLocationParams extends BaseVO {
 
 
 
     @NotEmpty(message = "设备Id不能为空!")
-    @ApiModelProperty(value = "设备表Id",required = true)
+   //@ApiModelProperty(value = "设备表Id",required = true)
     private String deviceId;
 
-    @ApiModelProperty(value = "X坐标")
+   //@ApiModelProperty(value = "X坐标")
     private BigDecimal xValue;
 
-    @ApiModelProperty(value = "Y坐标")
+   //@ApiModelProperty(value = "Y坐标")
     private Long yValue;
 }

+ 3 - 6
device-service-common/src/main/java/com/hfln/device/common/request/event/EventListParams.java

@@ -1,8 +1,6 @@
 package com.hfln.device.common.request.event;
 
 import com.hfln.device.common.vo.PageVo;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -11,17 +9,16 @@ import java.util.Date;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "事件列表查询")
 public class EventListParams extends PageVo {
 
     @NotEmpty(message = "设备ID不能为空!")
-    @ApiModelProperty(value = "设备ID",required = true)
+   //@ApiModelProperty(value = "设备ID",required = true)
     private String deviceId;
 
-    @ApiModelProperty(value = "开始时间",required = true)
+   //@ApiModelProperty(value = "开始时间",required = true)
     private Date startTime;
 
-    @ApiModelProperty(value = "结束时间",required = true)
+   //@ApiModelProperty(value = "结束时间",required = true)
     private Date endTime;
 
 }

+ 4 - 6
device-service-common/src/main/java/com/hfln/device/common/request/user/LoginBySmsCodeParams.java

@@ -2,8 +2,7 @@ package com.hfln.device.common.request.user;
 
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -11,25 +10,24 @@ import javax.validation.constraints.NotEmpty;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "鐢ㄦ埛鐧诲綍鍙傛暟")
 public class LoginBySmsCodeParams extends BaseVO {
 
     @NotEmpty(message = "鐢ㄦ埛鍚嶄笉鑳戒负绌?")
-    @ApiModelProperty("用户名")
+   //@ApiModelProperty("用户名")
     private String userName;
 
     /**
      * 手机号
      */
     @NotEmpty(message = "手机号不能为空")
-    @ApiModelProperty("手机号")
+   //@ApiModelProperty("手机号")
     private String phone;
 
     /**
      * 短信验证码
      */
     @NotEmpty(message = "短信验证码不能为空")
-    @ApiModelProperty("短信验证码")
+   //@ApiModelProperty("短信验证码")
     private String smsCode;
 
 

+ 3 - 6
device-service-common/src/main/java/com/hfln/device/common/request/user/UserLoginParams.java

@@ -2,8 +2,6 @@ package com.hfln.device.common.request.user;
 
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -11,21 +9,20 @@ import javax.validation.constraints.NotEmpty;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "用户登录参数")
 public class UserLoginParams extends BaseVO {
 
     @NotEmpty(message = "用户名不能为空")
-    @ApiModelProperty(value = "用户名",required = true)
+   //@ApiModelProperty(value = "用户名",required = true)
     private String userName;
 
     @NotEmpty(message = "密码不能为空!")
-    @ApiModelProperty(value = "密码",required = true)
+   //@ApiModelProperty(value = "密码",required = true)
     private String password;
 
     /**
      * 手机号
      */
-    @ApiModelProperty("手机号")
+   //@ApiModelProperty("手机号")
     private String phone;
 
 }

+ 5 - 8
device-service-common/src/main/java/com/hfln/device/common/request/user/UserSignupParams.java

@@ -2,8 +2,6 @@ package com.hfln.device.common.request.user;
 
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -11,27 +9,26 @@ import javax.validation.constraints.NotEmpty;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "小程序用户注册入参")
 public class UserSignupParams extends BaseVO {
 
     @NotEmpty(message = "用户名不能为空")
-    @ApiModelProperty("用户名")
+   //@ApiModelProperty("用户名")
     private String username;
 
     @NotEmpty(message = "密码不能为空")
-    @ApiModelProperty("密码")
+   //@ApiModelProperty("密码")
     private String password;
 
     @NotEmpty(message = "手机号不能为空")
-    @ApiModelProperty("手机号")
+   //@ApiModelProperty("手机号")
     private String phone;
 
     @NotEmpty(message = "验证码不能为空")
-    @ApiModelProperty("验证码")
+   //@ApiModelProperty("验证码")
     private String code;
 
     @NotEmpty(message = "openId不能为空!")
-    @ApiModelProperty("小程序openId")
+   //@ApiModelProperty("小程序openId")
     private String openId;
 
 }

+ 3 - 6
device-service-common/src/main/java/com/hfln/device/common/request/user/UserUpdatePasswordParams.java

@@ -1,8 +1,6 @@
 package com.hfln.device.common.request.user;
 
 import com.hfln.device.common.vo.BaseVO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -10,22 +8,21 @@ import javax.validation.constraints.NotEmpty;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(description = "用户修改密码")
 public class UserUpdatePasswordParams extends BaseVO {
 
     @NotEmpty(message = "用户Id不能为空!")
-    @ApiModelProperty("用户ID")
+   //@ApiModelProperty("用户ID")
     private Long userId;
 
     /**
      * 新密码
      */
     @NotEmpty(message = "新密码不能为空")
-    @ApiModelProperty("新密码")
+   //@ApiModelProperty("新密码")
     private String newPassword;
 
     @NotEmpty(message = "密码不能为空!")
-    @ApiModelProperty("密码")
+   //@ApiModelProperty("密码")
     private String oldPassword;
 }
 

+ 6 - 7
device-service-common/src/main/java/com/hfln/device/common/vo/PageRecord.java

@@ -1,6 +1,5 @@
 package com.hfln.device.common.vo;
 
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -12,21 +11,21 @@ import java.util.List;
 @Data
 public class PageRecord<T> extends BaseVO {
 
-    @ApiModelProperty(value = "数据列表", required = true)
+    //@ApiModelProperty(value = "数据列表", required = true)
     private List<T> rows = new ArrayList<T>();
 
-    @ApiModelProperty(value = "总条数", required = true)
+    //@ApiModelProperty(value = "总条数", required = true)
     private Long total;
 
-    @ApiModelProperty(value = "当前页码", required = true)
+    //@ApiModelProperty(value = "当前页码", required = true)
     private Integer pageNum;
 
-    @ApiModelProperty(value = "页面大小", required = true)
+    //@ApiModelProperty(value = "页面大小", required = true)
     private Integer pageSize;
 
-    @ApiModelProperty(value = "当前页码", required = true)
+    //@ApiModelProperty(value = "当前页码", required = true)
     private Boolean outTotalPageNum = false;
 
-    @ApiModelProperty(value = "总页数", required = true)
+    //@ApiModelProperty(value = "总页数", required = true)
     private Integer totalPageNum;
 }

+ 2 - 3
device-service-common/src/main/java/com/hfln/device/common/vo/PageVo.java

@@ -1,6 +1,5 @@
 package com.hfln.device.common.vo;
 
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -8,9 +7,9 @@ import lombok.EqualsAndHashCode;
 @Data
 public class PageVo extends BaseVO{
 
-    @ApiModelProperty(value = "当前页码",required = true)
+    //@ApiModelProperty(value = "当前页码",required = true)
     private Integer pageNo;
 
-    @ApiModelProperty(value = "页面大小",required = true)
+    //@ApiModelProperty(value = "页面大小",required = true)
     private Integer pageSize;
 }

+ 1 - 1
device-service-domain/src/main/java/com/hfln/device/domain/service/impl/PoseAnalysisServiceImpl.java

@@ -16,7 +16,7 @@ import java.util.stream.Collectors;
 /**
  * 姿态分析服务实现类
  */
-@Service
+@Service("domainPoseAnalysisService")
 @Slf4j
 public class PoseAnalysisServiceImpl implements PoseAnalysisService {
 

+ 1 - 0
device-service-domain/src/test/java/com/hfln/device/domain/entity/DevicePointCloudBasicTest.java

@@ -0,0 +1 @@
+ 

+ 1 - 0
device-service-domain/src/test/java/com/hfln/device/domain/entity/PointCloudAlgorithmDemo.java

@@ -0,0 +1 @@
+ 

+ 15 - 1
device-service-server/pom.xml

@@ -43,7 +43,21 @@
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+        </dependency>
+        <!-- Logging -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <scope>runtime</scope>
+        </dependency>
 
         <dependency>
             <groupId>com.alibaba</groupId>

+ 0 - 83
device-service-server/src/main/resources/application.yml

@@ -1,83 +0,0 @@
-#spring:
-#  application:
-#    name: device-service
-#  # 数据库配置
-#  datasource:
-#    type: com.zaxxer.hikari.HikariDataSource
-#    driver-class-name: com.mysql.cj.jdbc.Driver
-#    url: jdbc:mysql://localhost:3306/hfln_device?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
-#    username: root
-#    password: 123456
-#    hikari:
-#      minimum-idle: 5
-#      maximum-pool-size: 20
-#      auto-commit: true
-#      idle-timeout: 30000
-#      pool-name: HikariCP
-#      max-lifetime: 1800000
-#      connection-timeout: 30000
-#      connection-test-query: SELECT 1
-#  redis:
-#    host: localhost
-#    port: 6379
-#    password:
-#    database: 0
-#  jackson:
-#    date-format: yyyy-MM-dd HH:mm:ss
-#    time-zone: GMT+8
-#
-## MQTT配置
-#mqtt:
-#  broker:
-#    url: tcp://localhost:1883
-#  client:
-#    id: hfln-device-service
-#  username: admin
-#  password: public
-#  topics: hfln/device/#
-#  qos: 1
-#  completion:
-#    timeout: 5000
-#
-## 告警配置
-#alarm:
-#  retention-time: 60
-#  retention-keep-time: 30
-#  retention-alarm-time: 180
-#
-## MyBatis配置
-#mybatis:
-#  mapper-locations: classpath:mapper/*.xml
-#  type-aliases-package: com.hfln.device.infrastructure.po
-#  configuration:
-#    map-underscore-to-camel-case: true
-#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-#
-## 日志配置
-#logging:
-#  level:
-#    root: info
-#    com.hfln: debug
-#  file:
-#    name: logs/device-service.log
-#    max-size: 10MB
-#    max-history: 30
-#
-## 服务器配置
-#server:
-#  port: 8080
-#  servlet:
-#    context-path: /device-service
-#
-## 设备配置
-#device:
-#  check-interval: 30
-#  offline-timeout: 180
-#  # 设备保活超时时间(毫秒)
-#  keepalive-timeout: 60000
-#  # 设备告警确认超时时间(毫秒)
-#  alarm-ack-timeout: 300000
-#  # 设备停留时间阈值(毫秒)
-#  stay-time-threshold: 600000
-#  # 设备滞留时间阈值(毫秒)
-#  retention-time-threshold: 1800000

+ 15 - 6
device-service-server/src/main/resources/bootstrap-dev.yml

@@ -1,15 +1,24 @@
 spring:
+  config:
+    import: "optional:nacos:device-service-dev.yaml"
+  main:
+    allow-circular-references: true
   cloud:
     nacos:
-      discovery:
+      config:
+        import-check:
+          enabled: false
         server-addr: 8.130.28.21:8848
         group: DEFAULT_GROUP
         namespace: dev
-      config:
+        file-extension: yaml
+        data-id: device-service-dev.yaml
+        prefix: device-service
+      discovery:
         server-addr: 8.130.28.21:8848
         group: DEFAULT_GROUP
         namespace: dev
-        file-extension: yaml
+        service: device-service
   redis:
     host: 8.130.28.21
     port: 6379
@@ -35,17 +44,18 @@ spring:
       stat-view-servlet:
         login-username: druid
         login-password: druid
+
 lnxx:
   knife4j:
     doc:
       basePackage: com.hfln.device.application.controller
       title: DEVICE-SERVICE-SERVER
       description: 设备服务
-# 微信小程序
+  # 微信小程序
   wechat:
     appid: wx60b2cd643b46d5eb
     secret: 15ebd7bed7b73d806eba2944f4e07592
-# 短信验证码相关
+  # 短信验证码相关
   sms:
     tencent:
       secretId: AKID40jFYdUCqMqFUXO2SecOvKYYKsGRP9rT
@@ -63,7 +73,6 @@ mqtt:
   username: admin
   password: public
 
-
 # 设备配置
 device:
   keepalive:

+ 2 - 0
device-service-server/src/main/resources/bootstrap-local.yml

@@ -1,4 +1,6 @@
 spring:
+  config:
+    import: "optional:nacos:"
   cloud:
     nacos:
       discovery:

+ 2 - 0
device-service-server/src/main/resources/bootstrap-prod.yml

@@ -1,4 +1,6 @@
 spring:
+  config:
+    import: "optional:nacos:"
   cloud:
     nacos:
       discovery:

+ 27 - 6
device-service-server/src/main/resources/bootstrap-test.yml

@@ -1,15 +1,17 @@
 spring:
   cloud:
     nacos:
-      discovery:
+      config:
+        import-check:
+          enabled: false
         server-addr: 8.130.28.21:8848
         group: DEFAULT_GROUP
         namespace: test
-      config:
+        file-extension: yaml
+      discovery:
         server-addr: 8.130.28.21:8848
         group: DEFAULT_GROUP
         namespace: test
-        file-extension: yaml
   redis:
     # 地址
     host: 8.130.28.21
@@ -48,9 +50,9 @@ spring:
 lnxx:
   knife4j:
     doc:
-      basePackage: com.hfln.portal.application.controller
-      title: PORTAL-SERVICE-SERVER
-      description: 业务服务
+      basePackage: com.hfln.device.application.controller
+      title: DEVICE-SERVICE-SERVER
+      description: 设备服务
   # 微信小程序
   wechat:
     appid: wx60b2cd643b46d5eb
@@ -66,6 +68,25 @@ lnxx:
       region: ap-guangzhou
       sdkAppId: 1400966707
 
+mqtt:
+  broker: tcp://8.130.28.21:1883
+  client:
+    id: hfln-device-service-${random.uuid}
+  username: admin
+  password: public
+
+# 设备配置
+device:
+  keepalive:
+    timeout: 90000  # 设备保活超时时间,单位毫秒
+  alarm:
+    ack:
+      timeout: 300000  # 设备告警确认超时时间,单位毫秒
+    retention:
+      time: 60  # 滞留时间阈值,单位秒
+      keep-time: 30  # 滞留持续时间,单位秒
+      alarm-time: 180  # 滞留告警时间,单位秒
+
 sa-token:
   # token 名称(同时也是 cookie 名称)
   token-name: token

+ 4 - 2
device-service-server/src/main/resources/bootstrap.yml

@@ -1,11 +1,13 @@
 server:
   port: 8092
 spring:
+  main:
+    allow-circular-references: true
   mvc:
     pathmatch:
       matching-strategy: ant_path_matcher
   profiles:
-    active: dev
+    active: test
   application:
     name: device-service-server
 
@@ -29,4 +31,4 @@ mybatis-plus:
     db-config:
       logic-delete-field: del_flag
       logic-delete-value: 1
-      logic-not-delete-value: 0
+      logic-not-delete-value: 0 

+ 16 - 2
pom.xml

@@ -19,11 +19,13 @@
         <java.version>1.8</java.version>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
+        <logback.version>1.2.11</logback.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
         <baomidou.version>3.5.2</baomidou.version>
-        <spring-cloud.version>Hoxton.SR12</spring-cloud.version> <!-- Update Spring Cloud version -->
+        <spring-boot.version>2.6.14</spring-boot.version>
+        <spring-cloud.version>2021.0.5</spring-cloud.version>
+        <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
     </properties>
 
     <modules>
@@ -160,6 +162,18 @@
                 <version>8.0.31</version>
             </dependency>
 
+
+            <!-- Logging -->
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-classic</artifactId>
+                <version>${logback.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-core</artifactId>
+                <version>${logback.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>