소스 검색

feat: 更换git仓库

yangliu 4 달 전
커밋
93131749fd
100개의 변경된 파일4274개의 추가작업 그리고 0개의 파일을 삭제
  1. 38 0
      .gitignore
  2. 22 0
      Dockerfile
  3. 116 0
      Jenkinsfile
  4. 72 0
      device-service-application/pom.xml
  5. 38 0
      device-service-application/src/main/java/com/hfln/device/application/controller/TestController.java
  6. 76 0
      device-service-application/src/main/java/com/hfln/device/application/controller/wap/DeviceController.java
  7. 45 0
      device-service-application/src/main/java/com/hfln/device/application/controller/wap/EventController.java
  8. 32 0
      device-service-application/src/main/java/com/hfln/device/application/controller/wap/HomeController.java
  9. 121 0
      device-service-application/src/main/java/com/hfln/device/application/controller/wap/UserController.java
  10. 14 0
      device-service-application/src/main/java/com/hfln/device/application/controller/web/Test.java
  11. 27 0
      device-service-application/src/main/java/com/hfln/device/application/facade/DingFacadeImpl.java
  12. 6 0
      device-service-application/src/test/java/com/hfln/device/app/CustomerConvertorTest.java
  13. 11 0
      device-service-application/src/test/java/com/hfln/device/app/CustomerValidatorTest.java
  14. 52 0
      device-service-client-starter/pom.xml
  15. 59 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/config/FeignConfig.java
  16. 28 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/fallback/DingFacadeFeignFallbackFactory.java
  17. 81 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/fallback/StationFacadeFeignFallbackFactory.java
  18. 185 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/fallback/UserFacadeFeignFallbackFactory.java
  19. 11 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/DingFacadeFeign.java
  20. 10 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/LogLoginFacadeFegin.java
  21. 15 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/TokenFacadeFeign.java
  22. 17 0
      device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/UserFacadeFeign.java
  23. 64 0
      device-service-common/pom.xml
  24. 42 0
      device-service-common/src/main/java/com/hfln/device/common/constant/mqtt/topic/MqttTopics.java
  25. 11 0
      device-service-common/src/main/java/com/hfln/device/common/constant/mqtt/topic/TopicConstants.java
  26. 18 0
      device-service-common/src/main/java/com/hfln/device/common/constant/redis/RedisCacheConstant.java
  27. 17 0
      device-service-common/src/main/java/com/hfln/device/common/dto/data/CustomerDTO.java
  28. 209 0
      device-service-common/src/main/java/com/hfln/device/common/dto/data/device/DeviceDTO.java
  29. 47 0
      device-service-common/src/main/java/com/hfln/device/common/dto/data/event/EventListDTO.java
  30. 29 0
      device-service-common/src/main/java/com/hfln/device/common/dto/data/home/HomeInfoDTO.java
  31. 21 0
      device-service-common/src/main/java/com/hfln/device/common/dto/data/user/UserDto.java
  32. 21 0
      device-service-common/src/main/java/com/hfln/device/common/dto/event/CustomerCreatedEvent.java
  33. 11 0
      device-service-common/src/main/java/com/hfln/device/common/dto/event/DomainEventConstant.java
  34. 13 0
      device-service-common/src/main/java/com/hfln/device/common/request/TestRequest.java
  35. 66 0
      device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceBandingParams.java
  36. 28 0
      device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceListParams.java
  37. 28 0
      device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceLocationParams.java
  38. 27 0
      device-service-common/src/main/java/com/hfln/device/common/request/event/EventListParams.java
  39. 26 0
      device-service-common/src/main/java/com/hfln/device/common/request/user/LoginBySmsCodeParams.java
  40. 26 0
      device-service-common/src/main/java/com/hfln/device/common/request/user/UserLoginParams.java
  41. 33 0
      device-service-common/src/main/java/com/hfln/device/common/request/user/UserSignupParams.java
  42. 27 0
      device-service-common/src/main/java/com/hfln/device/common/request/user/UserUpdatePasswordParams.java
  43. 7 0
      device-service-common/src/main/java/com/hfln/device/common/vo/BaseVO.java
  44. 32 0
      device-service-common/src/main/java/com/hfln/device/common/vo/PageRecord.java
  45. 16 0
      device-service-common/src/main/java/com/hfln/device/common/vo/PageVo.java
  46. 59 0
      device-service-domain/pom.xml
  47. 14 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/CompanyType.java
  48. 9 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/Credit.java
  49. 36 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/Customer.java
  50. 14 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/CustomerType.java
  51. 12 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/SourceType.java
  52. 6 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/domainservice/CreditChecker.java
  53. 118 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/util/MsgClient.java
  54. 16 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/util/PasswordUtil.java
  55. 49 0
      device-service-domain/src/main/java/com/hfln/device/domain/customer/util/UpdateWrapperBuilder.java
  56. 101 0
      device-service-domain/src/main/java/com/hfln/device/domain/entity/MenuEntity.java
  57. 147 0
      device-service-domain/src/main/java/com/hfln/device/domain/event/MqttHandler.java
  58. 84 0
      device-service-domain/src/main/java/com/hfln/device/domain/exception/ErrorEnum.java
  59. 21 0
      device-service-domain/src/main/java/com/hfln/device/domain/exception/ErrorEnumInterface.java
  60. 35 0
      device-service-domain/src/main/java/com/hfln/device/domain/gateway/DeviceGateway.java
  61. 35 0
      device-service-domain/src/main/java/com/hfln/device/domain/gateway/UserGateway.java
  62. 15 0
      device-service-domain/src/main/java/com/hfln/device/domain/gateway/sms/SmsGateway.java
  63. 9 0
      device-service-domain/src/test/java/com/hfln/device/domain/CustomerEntityTest.java
  64. 87 0
      device-service-infrastructure/pom.xml
  65. 5 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/DiamondConfig.java
  66. 108 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/GlobalExceptionHandler.java
  67. 38 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/MybatisPlusConfig.java
  68. 76 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/MybatisPlusMetaObjectHandler.java
  69. 24 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/ObjectInjectConfig.java
  70. 291 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/gateway/impl/DeviceGatewayImpl.java
  71. 208 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/gateway/impl/UserGatewayImpl.java
  72. 65 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/gateway/impl/sms/SmsGatewayImpl.java
  73. 15 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/ClientUserMapper.java
  74. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevGroupMapper.java
  75. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevInfoMapper.java
  76. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevRoomMapper.java
  77. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevShareMapper.java
  78. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevTargetMapper.java
  79. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/EventListMapper.java
  80. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/GroupDevMapMapper.java
  81. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/GroupFloorplanMapper.java
  82. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/GroupShareMapper.java
  83. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/RecordPlanMapper.java
  84. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/RecordPlanTimeMapper.java
  85. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/StatInfoMapper.java
  86. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/StayTimeMapper.java
  87. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblMenuMapper.java
  88. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblOprLogMapper.java
  89. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblOrgMapper.java
  90. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblParameterMapper.java
  91. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblRoleMapper.java
  92. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblUserRoleMapper.java
  93. 12 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblWxpaycertMapper.java
  94. 9 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/UserInfoMapper.java
  95. 5 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/order/OrderGatewayImpl.java
  96. 58 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/BasePO.java
  97. 63 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevGroup.java
  98. 221 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevInfo.java
  99. 53 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevRelation.java
  100. 33 0
      device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevRoom.java

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.class
+*.log
+*.jar
+mvnw
+mvnw.cmd
+.mvn
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 22 - 0
Dockerfile

@@ -0,0 +1,22 @@
+FROM openjdk:8-jre-alpine
+
+WORKDIR /app
+
+COPY device-service-server/target/device-service-boot.jar app.jar
+
+ENV TZ=Asia/Shanghai
+
+ARG spring_profiles_active=dev
+ENV SPRING_PROFILES_ACTIVE=${spring_profiles_active}
+
+EXPOSE 8092
+
+ENTRYPOINT ["java", \
+    "-Xms512m", \
+    "-Xmx512m", \
+    "-XX:+UseContainerSupport", \
+    "-XX:+UseG1GC", \
+    "-Dfile.encoding=UTF-8", \
+    "-Djava.security.egd=file:/dev/./urandom", \
+    "-jar", "app.jar", \
+    "--spring.profiles.active=${SPRING_PROFILES_ACTIVE}"]

+ 116 - 0
Jenkinsfile

@@ -0,0 +1,116 @@
+pipeline {
+    agent any
+
+    parameters {
+        choice(name: 'env', choices: ['dev', 'test', 'prod'], description: '部署环境(dev/test/prod)')
+        string(name: 'NAMESPACE', defaultValue: 'hfln-dev', description: 'Kubernetes 命名空间')
+    }
+
+    environment {
+        PROJECT_NAME       = 'device-service'
+        MODULE_NAME        = 'device-service-server'
+        MAVEN_HOME         = '/opt/apache-maven-3.8.8/bin'
+        HARBOR_HOST        = '8.130.28.21:81'
+        KUBECONFIG_PATH    = '/root/.kube/config'
+        SPRING_PROFILES_ACTIVE = "${params.env}"
+    }
+
+    stages {
+        stage('🧬 设置环境变量') {
+            steps {
+                script {
+                    if (params.env == 'prod') {
+                        env.HARBOR_PROJECT = 'prod'
+                    } else if (params.env == 'test') {
+                        env.HARBOR_PROJECT = 'test'
+                    } else {
+                        env.HARBOR_PROJECT = 'dev'
+                    }
+
+                    echo ">>> 使用环境:${params.env},HARBOR 项目:${env.HARBOR_PROJECT},K8S 命名空间:${params.NAMESPACE}"
+                }
+            }
+        }
+
+        stage('🧬 拉取 Git 代码') {
+            steps {
+                script {
+                    echo ">>> 拉取代码中..."
+                    checkout scm
+                    echo ">>> 代码拉取完成 ✅"
+                }
+            }
+        }
+
+        stage('📦 Maven 构建项目') {
+            steps {
+                script {
+                    echo ">>> 开始构建模块:${MODULE_NAME}"
+                    sh "${MAVEN_HOME}/mvn clean package -DskipTests -pl ${MODULE_NAME} -am"
+                    echo ">>> 构建完成 ✅"
+                }
+            }
+        }
+
+        stage('🐳 构建 & 推送 Docker 镜像') {
+            steps {
+                script {
+                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
+                    echo ">>> 构建 Docker 镜像: ${imageTag}"
+
+                    sh """
+                        docker login -u admin -p Hfln@1024 ${HARBOR_HOST}
+                        docker build --build-arg spring_profiles_active=${params.env} -t ${imageTag} .
+                        docker push ${imageTag}
+                        docker rmi ${imageTag}
+                    """
+                    echo ">>> Docker 镜像构建并推送完成 ✅"
+                }
+            }
+        }
+
+        stage('🚀 部署到 Kubernetes') {
+            steps {
+                script {
+                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
+
+                    echo ">>> 正在部署:${PROJECT_NAME} 到命名空间:${params.NAMESPACE}"
+
+                    sh """
+                        export KUBECONFIG=${KUBECONFIG_PATH}
+                        kubectl set image deployment/${PROJECT_NAME} ${PROJECT_NAME}=${imageTag} -n ${params.NAMESPACE}
+                    """
+                    echo ">>> 部署完成 ✅"
+                }
+            }
+        }
+    }
+
+    post {
+        success {
+            echo "✅ 构建 & 部署成功 🎉"
+
+            script {
+                echo "🧹 开始清理旧镜像(只保留最新 3 个)"
+                sh """
+                    docker images --format "{{.Repository}}:{{.Tag}} {{.CreatedAt}}" | \
+                    grep "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:" | \
+                    sort -rk2 | \
+                    tail -n +4 | \
+                    awk '{print \$1}' | \
+                    xargs -r docker rmi
+                """
+                echo "🧹 旧镜像清理完成 ✅"
+            }
+        }
+
+        failure {
+            echo "❌ 构建或部署失败,请检查日志!"
+        }
+
+        always {
+            echo "🧼 清理工作区..."
+            cleanWs()
+        }
+    }
+}

+ 72 - 0
device-service-application/pom.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.hfln.device</groupId>
+        <artifactId>hfln-device-service</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>device-service-application</artifactId>
+    <packaging>jar</packaging>
+    <name>device-service-application</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.hfln.device</groupId>
+            <artifactId>device-service-client-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.hfln.device</groupId>
+            <artifactId>device-service-infrastructure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>hfln-framework-dto</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.hfln.device</groupId>
+            <artifactId>device-service-domain</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>hfln-framework-exception</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>hfln-framework-catchlog-starter</artifactId>
+        </dependency>
+        <!-- JSR 303 Validation -->
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.el</groupId>
+            <artifactId>javax.el-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.web</groupId>
+            <artifactId>javax.el</artifactId>
+        </dependency>
+        <!-- JSR 303 Validation End-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <configuration>
+                        <skip>true</skip>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>

+ 38 - 0
device-service-application/src/main/java/com/hfln/device/application/controller/TestController.java

@@ -0,0 +1,38 @@
+package com.hfln.device.application.controller;
+
+
+import cn.hfln.emqx.annotation.MqttListener;
+import cn.hfln.emqx.publisher.MqttPublisher;
+import cn.hfln.framework.catchlog.CatchAndLog;
+import cn.hfln.framework.dto.ApiResult;
+import com.hfln.device.infrastructure.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Slf4j
+@CatchAndLog
+public class TestController {
+    
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private MqttPublisher mqttPublisher;
+
+    @GetMapping("/demo")
+    public ApiResult<Boolean> get() {
+        String topic = "my/1/topic";
+
+        mqttPublisher.send(topic,"asdasdsada");
+
+        return ApiResult.success(userService.checkOpenId("123456"));
+    }
+
+
+
+
+}

+ 76 - 0
device-service-application/src/main/java/com/hfln/device/application/controller/wap/DeviceController.java

@@ -0,0 +1,76 @@
+//package com.hfln.device.application.controller.wap;
+//
+//import cn.hfln.framework.catchlog.CatchAndLog;
+//import cn.hfln.framework.dto.ApiResult;
+//import com.hfln.device.common.dto.data.device.DeviceDTO;
+//import com.hfln.device.common.request.device.DeviceBandingParams;
+//import com.hfln.device.common.request.device.DeviceListParams;
+//import com.hfln.device.common.request.device.DeviceLocationParams;
+//import com.hfln.device.domain.gateway.DeviceGateway;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.*;
+//
+//import javax.validation.Valid;
+//import java.util.List;
+//
+//@RestController
+//@CatchAndLog
+//@Api(tags = "设备相关")
+//@Slf4j
+//public class DeviceController {
+//    @Autowired
+//    private DeviceGateway deviceGateway;
+//
+//    @PostMapping("wap/device/deviceList")
+//    @ApiOperation(value = "获取个人首页信息")
+//    public ApiResult<List<DeviceDTO>> deviceList(@RequestBody @Valid DeviceListParams request) {
+//        return ApiResult.success(deviceGateway.queryDeviceList(request));
+//    }
+//
+//
+//    @GetMapping("/wap/device/deviceUnBind")
+//    @ApiOperation(value = "解绑设备")
+//    public ApiResult<Boolean> deviceUnBind(@RequestParam("userId") Long userId, @RequestParam("deviceId") String deviceId) {
+//        return ApiResult.success(deviceGateway.deviceUnBind(userId, deviceId));
+//    }
+//
+//    @PostMapping("/wap/device/deviceBinding")
+//    @ApiOperation(value = "绑定设备")
+//    public ApiResult<Boolean> deviceBinding(@RequestBody @Valid DeviceBandingParams request) {
+//        return ApiResult.success(deviceGateway.deviceBind(request));
+//    }
+//
+//
+//    @GetMapping("/wap/device/queryDeviceInfoById/{deviceId}")
+//    @ApiOperation(value = "设备详情")
+//    public ApiResult<DeviceDTO> queryDeviceInfoById(@PathVariable("deviceId") String deviceId) {
+//        return ApiResult.success(deviceGateway.queryDeviceById(deviceId));
+//    }
+//
+//    @GetMapping("/wap/device/deviceRelations")
+//    @ApiOperation(value = "设备关系")
+//    // todo
+//    public ApiResult<DeviceDTO> deviceRelations() {
+//        return ApiResult.success();
+//    }
+//
+//
+//    @PostMapping("/wap/device/updateDevice")
+//    @ApiOperation(value = "设备信息修改")
+//    public ApiResult<Boolean> updateDevice(@RequestBody @Valid DeviceBandingParams request) {
+//        return ApiResult.success(deviceGateway.updateDevice(request));
+//    }
+//
+//
+//    @GetMapping("/wap/device/updateDeviceLocation")
+//    @ApiOperation(value = "更新设备位置")
+//    public ApiResult<Boolean> updateDeviceLocation(@RequestBody @Valid DeviceLocationParams params) {
+//        return ApiResult.success(deviceGateway.updateDeviceLocation(params));
+//    }
+//
+//
+//
+//}

+ 45 - 0
device-service-application/src/main/java/com/hfln/device/application/controller/wap/EventController.java

@@ -0,0 +1,45 @@
+//package com.hfln.device.application.controller.wap;
+//
+//import cn.hfln.framework.catchlog.CatchAndLog;
+//import cn.hfln.framework.dto.ApiResult;
+//import com.hfln.device.common.dto.data.event.EventListDTO;
+//import com.hfln.device.common.request.event.EventListParams;
+//import com.hfln.device.common.vo.PageRecord;
+//import com.hfln.device.domain.gateway.DeviceGateway;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.*;
+//
+//import javax.validation.Valid;
+//
+//@RestController
+//@CatchAndLog
+//@Api(tags = "设备事件相关")
+//@Slf4j
+//public class EventController {
+//
+//    @Autowired
+//    private DeviceGateway deviceGateway;
+//
+//
+//    @PostMapping("/wap/event/deviceEventList")
+//    @ApiOperation(value = "设备事件")
+//    public ApiResult<PageRecord<EventListDTO>> deviceEventList(@RequestBody @Valid EventListParams request) {
+//        return ApiResult.success(deviceGateway.queryEventByPage(request));
+//    }
+//
+//    @GetMapping("/wap/event/handleEvent/{eventId}")
+//    @ApiOperation(value = "处理设备事件")
+//    public ApiResult<Boolean> handleEvent(@PathVariable("eventId") Long eventId){
+//        return ApiResult.success(deviceGateway.handleEvent(eventId));
+//    }
+//
+//
+//
+//
+//
+//
+//
+//}

+ 32 - 0
device-service-application/src/main/java/com/hfln/device/application/controller/wap/HomeController.java

@@ -0,0 +1,32 @@
+//package com.hfln.device.application.controller.wap;
+//
+//
+//import cn.hfln.framework.catchlog.CatchAndLog;
+//import cn.hfln.framework.dto.ApiResult;
+//import com.hfln.device.common.dto.data.home.HomeInfoDTO;
+//import com.hfln.device.domain.gateway.DeviceGateway;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.GetMapping;
+//import org.springframework.web.bind.annotation.RequestParam;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//@RestController
+//@CatchAndLog
+//@Api(tags = "首页相关")
+//@Slf4j
+//public class HomeController {
+//
+//    @Autowired
+//    private DeviceGateway deviceGateway;
+//
+//    @GetMapping("wap/home/homeInfo")
+//    @ApiOperation(value = "获取个人首页信息")
+//    public ApiResult<HomeInfoDTO> homeInfo(@RequestParam Long userId) {
+//        return ApiResult.success(deviceGateway.queryHomeInfo(userId));
+//    }
+//
+//
+//}

+ 121 - 0
device-service-application/src/main/java/com/hfln/device/application/controller/wap/UserController.java

@@ -0,0 +1,121 @@
+//package com.hfln.device.application.controller.wap;
+//
+//import cn.hfln.framework.catchlog.CatchAndLog;
+//import cn.hfln.framework.dto.ApiResult;
+//import com.hfln.device.common.dto.data.user.UserDto;
+//import com.hfln.device.common.request.user.LoginBySmsCodeParams;
+//import com.hfln.device.common.request.user.UserLoginParams;
+//import com.hfln.device.common.request.user.UserSignupParams;
+//import com.hfln.device.common.request.user.UserUpdatePasswordParams;
+//import com.hfln.device.domain.gateway.UserGateway;
+//import com.hfln.device.domain.gateway.sms.SmsGateway;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.lang3.StringUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.*;
+//
+//import javax.validation.Valid;
+//import java.util.HashMap;
+//import java.util.Map;
+//
+//@RestController
+//@CatchAndLog
+//@Api(tags = "用户相关")
+//@Slf4j
+//public class UserController {
+//
+//
+//    @Autowired
+//    private UserGateway userGateway;
+//    @Autowired
+//    private SmsGateway smsGateway;
+//
+//    @GetMapping("wap/user/queryForOpenId")
+//    @ApiOperation(value = "登录获取openId")
+//    public ApiResult<String> queryForOpenId(@RequestParam String code) {
+//        String openId = userGateway.getOpenId(code);
+//        if (StringUtils.isNoneEmpty(openId)) {
+//            return ApiResult.success(openId);
+//        }
+//        return ApiResult.failed("获取openId失败!");
+//    }
+//
+//
+//    @GetMapping("wap/user/getLoginSmsCode")
+//    @ApiOperation(value = "获取登录短信验证码")
+//    public ApiResult<String> getLoginSmsCode(@RequestParam String phone) {
+//        if (smsGateway.sendLoginSmsCode(phone)) {
+//            return ApiResult.success("发送短信验证码成功!");
+//        }
+//        return ApiResult.failed("发送短信验证码失败!");
+//    }
+//
+//    @GetMapping("wap/user/getSignupSmsCode")
+//    @ApiOperation(value = "获取注册短信验证码")
+//    public ApiResult<String> getSignupSmsCode(@RequestParam String phone) {
+//        if (smsGateway.sendSignupSmsCode(phone)) {
+//            return ApiResult.success("发送短信验证码成功!");
+//        }
+//        return ApiResult.failed("发送短信验证码失败!");
+//    }
+//
+//
+//    @PostMapping("wap/user/signup")
+//    @ApiOperation(value = "小程序用户注册")
+//    public ApiResult<String> signup(@Valid @RequestBody UserSignupParams request) {
+//        if (userGateway.signup(request)) {
+//            return ApiResult.success("注册成功!");
+//        }
+//        return ApiResult.failed("注册失败!");
+//    }
+//
+//
+//    @GetMapping("wap/user/checkOpenid")
+//    @ApiOperation(value = "校验用户是不是存在")
+//    public ApiResult<String> checkOpenid(@RequestParam String openid) {
+//        return ApiResult.success(userGateway.getOpenId(openid));
+//    }
+//
+//
+//    @PostMapping("wap/user/loginBySmsCode")
+//    @ApiOperation(value = "短信验证码登录")
+//    public ApiResult<UserDto> loginBySmsCode(@Valid @RequestBody LoginBySmsCodeParams request) {
+//        return ApiResult.success(userGateway.loginBySmsCode(request));
+//    }
+//
+//    @PostMapping("wap/user/loginByPassword")
+//    @ApiOperation(value = "密码登录")
+//    public ApiResult<UserDto> loginByPassword(@Valid @RequestBody UserLoginParams request) {
+//        return ApiResult.success(userGateway.loginByPassword(request));
+//    }
+//
+//    @GetMapping("wap/user/getUserPhone")
+//    @ApiOperation(value = "获取用户手机号码")
+//    public ApiResult<Map<String, String>> getUserPhone(@RequestParam String code) {
+//        Map<String, String> result = new HashMap<>();
+//        result.put("phone", userGateway.getUserPhone(code));
+//        return ApiResult.success(result);
+//    }
+//
+//    /**
+//     * todo
+//     * 检测用户是否拥有设备
+//     */
+//    @GetMapping("wap/user/checkDevByOpenId")
+//    @ApiOperation(value = "检测用户是否拥有设备")
+//    public ApiResult<String> checkDevByOpenId(@RequestParam String openId) {
+//        return ApiResult.success(openId);
+//    }
+//
+//    @PostMapping("wap/user/updatePassword")
+//    @ApiOperation(value = "修改用户密码")
+//    public ApiResult<?> updatePassword(@RequestBody @Valid UserUpdatePasswordParams request) {
+//        userGateway.updatePassword(request);
+//        return ApiResult.success();
+//    }
+//
+//
+//
+//}

+ 14 - 0
device-service-application/src/main/java/com/hfln/device/application/controller/web/Test.java

@@ -0,0 +1,14 @@
+package com.hfln.device.application.controller.web;
+
+import cn.hfln.emqx.annotation.MqttListener;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class Test {
+    @MqttListener(topics = {"my/+/topic"})
+    public void listen(String msg) {
+        log.info("{}----------------------------------------", msg);
+    }
+}

+ 27 - 0
device-service-application/src/main/java/com/hfln/device/application/facade/DingFacadeImpl.java

@@ -0,0 +1,27 @@
+//package com.hfln.device.application.facade;
+//
+//import cn.hfln.framework.catchlog.CatchAndLog;
+//import cn.hfln.framework.dto.ApiResult;
+//import com.hfln.device.common.facade.DingFacade;
+//import com.hfln.device.common.request.user.DingUserSyncReq;
+//import com.hfln.device.domain.gateway.UserGateway;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.annotation.Resource;
+//
+///**
+// * @Author: huangls
+// * @CreateTime: 2023-11-29
+// */
+//@CatchAndLog
+//@RestController
+//public class DingFacadeImpl implements DingFacade {
+//
+//    @Resource
+//    private UserGateway userGateway;
+//
+//    @Override
+//    public ApiResult<Boolean> syncDingUserInfo(DingUserSyncReq reqs) {
+//        return ApiResult.success(userGateway.syncDingUserInfo(reqs));
+//    }
+//}

+ 6 - 0
device-service-application/src/test/java/com/hfln/device/app/CustomerConvertorTest.java

@@ -0,0 +1,6 @@
+package com.hfln.device.app;
+
+
+public class CustomerConvertorTest {
+
+}

+ 11 - 0
device-service-application/src/test/java/com/hfln/device/app/CustomerValidatorTest.java

@@ -0,0 +1,11 @@
+package com.hfln.device.app;
+
+import org.junit.Test;
+
+public class CustomerValidatorTest {
+
+    @Test
+    public void testValidation(){
+
+    }
+}

+ 52 - 0
device-service-client-starter/pom.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.hfln.device</groupId>
+        <artifactId>hfln-device-service</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>device-service-client-starter</artifactId>
+    <packaging>jar</packaging>
+    <name>device-service-client-starter</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>hfln-framework-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-openfeign-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.hfln.device</groupId>
+            <artifactId>device-service-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-hystrix</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.4</version>
+
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 59 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/config/FeignConfig.java

@@ -0,0 +1,59 @@
+//package com.hfln.device.client.api.config;
+//
+//import cn.hutool.core.util.StrUtil;
+//import cn.hfln.framework.common.constant.SecurityConstants;
+//import cn.hfln.framework.common.constant.TokenConstants;
+//import cn.hfln.framework.common.security.LoginUser;
+//import cn.hfln.framework.common.security.utils.SecurityUtils;
+//import com.alibaba.fastjson2.JSONObject;
+//import feign.RequestInterceptor;
+//import feign.RequestTemplate;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.web.context.request.RequestContextHolder;
+//import org.springframework.web.context.request.ServletRequestAttributes;
+//
+//import javax.servlet.http.HttpServletRequest;
+//
+///**
+// * 通过feign调用时header向下传递
+// *
+// * @author huolifu
+// * @date 2023/10/30 19:46
+// **/
+//@Slf4j
+//@Configuration
+//public class FeignConfig implements RequestInterceptor {
+//
+//
+//    @Override
+//    public void apply(RequestTemplate template) {
+//        try {
+//            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//            if (attributes == null) {
+//                return;
+//            }
+//            HttpServletRequest request = attributes.getRequest();
+//            if (request == null) {
+//                return;
+//            }
+//            String token = SecurityUtils.getToken(request);
+//            LoginUser loginUser = SecurityUtils.getLoginUser();
+//
+//            if (StrUtil.isNotBlank(token)) {
+//                log.info("feign 拦截:SecurityContextHolder 设置user=[{}]", loginUser);
+//
+//                template.header(TokenConstants.AUTHENTICATION, token);
+//                if (loginUser != null) {
+//                    template.header(SecurityConstants.LOGIN_USER, JSONObject.toJSONString(loginUser));
+//                }
+//                template.header(SecurityConstants.DETAILS_USERNAME, SecurityUtils.getUsername());
+//                template.header(SecurityConstants.REAL_NAME, SecurityUtils.getRealName());
+//                template.header(SecurityConstants.USER_KEY, SecurityUtils.getUserKey());
+//                template.header(SecurityConstants.DETAILS_USER_ID, SecurityUtils.getUserId() != null ? SecurityUtils.getUserId().toString() : null);
+//            }
+//        } catch (Exception e) {
+//            log.error("feign 请求头异常",e);
+//        }
+//    }
+//}

+ 28 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/fallback/DingFacadeFeignFallbackFactory.java

@@ -0,0 +1,28 @@
+//package com.hfln.device.client.api.fallback;
+//
+//import cn.hfln.framework.dto.ApiResult;
+//import com.hfln.device.client.api.feign.DingFacadeFeign;
+//import feign.hystrix.FallbackFactory;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.stereotype.Component;
+//
+///**
+// * DingFacadeFeignFallbackFactory
+// *
+// * @author cw
+// * @date 2024/6/19 17:43
+// */
+//@Component
+//@Slf4j
+//public class DingFacadeFeignFallbackFactory implements FallbackFactory<DingFacadeFeign> {
+//    @Override
+//    public DingFacadeFeign create(Throwable cause) {
+//        log.error("UserFacadeFeignFallbackFactory error", cause);
+//        return new DingFacadeFeign() {
+//            @Override
+//            public ApiResult<Boolean> syncDingUserInfo(DingUserSyncReq reqs) {
+//                return ApiResult.failed("同步钉钉用户信息失败");
+//            }
+//        };
+//    }
+//}

+ 81 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/fallback/StationFacadeFeignFallbackFactory.java

@@ -0,0 +1,81 @@
+//package com.hfln.device.client.api.fallback;
+//
+//import cn.wideth.framework.dto.ApiResult;
+//import com.hfln.device.client.api.feign.StationFacadeFeign;
+//import com.hfln.device.common.request.station.StationListReq;
+//import com.hfln.device.common.request.station.StationOpReq;
+//import com.hfln.device.common.vo.StationVO;
+//import feign.hystrix.FallbackFactory;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.stereotype.Component;
+//
+//import java.math.BigDecimal;
+//import java.util.ArrayList;
+//import java.util.List;
+//
+///**
+// * StationFacadeFeignFallbackFactory
+// *
+// * @author cw
+// * @date 2024/6/20 9:06
+// */
+//@Component
+//@Slf4j
+//public class StationFacadeFeignFallbackFactory implements FallbackFactory<StationFacadeFeign> {
+//    @Override
+//    public StationFacadeFeign create(Throwable throwable) {
+//        log.error("StationFacadeFeignFallbackFactory error", throwable);
+//
+//        return new StationFacadeFeign() {
+//            @Override
+//            public ApiResult<Boolean> addStation(StationOpReq req) {
+//                return ApiResult.failed("添加失败");
+//            }
+//
+//            @Override
+//            public ApiResult<StationVO> getStationById(Long id) {
+//                return ApiResult.success();
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updateStation(Long id, StationOpReq req) {
+//                return ApiResult.failed("修改失败");
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> deleteStation(Long id) {
+//                return ApiResult.failed();
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> batchDelStation(List<Long> ids) {
+//                return ApiResult.failed();
+//            }
+//
+//            @Override
+//            public ApiResult<List<StationVO>> listStationByIds(List<Long> ids) {
+//                return ApiResult.success(new ArrayList<>());
+//            }
+//
+//            @Override
+//            public ApiResult<List<StationVO>> listStation(StationListReq req) {
+//                return ApiResult.success(new ArrayList<>());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updateStationStatus(Long id, String status) {
+//                return ApiResult.failed();
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updateStationDutyScope(Long id, BigDecimal dutyScope) {
+//                return ApiResult.failed();
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> checkStationNameRepeat(Long id, String name) {
+//                return ApiResult.success(false);
+//            }
+//        };
+//    }
+//}

+ 185 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/fallback/UserFacadeFeignFallbackFactory.java

@@ -0,0 +1,185 @@
+//package com.hfln.device.client.api.fallback;
+//
+//import cn.wideth.framework.dto.ApiResult;
+//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+//import com.hfln.device.client.api.feign.UserFacadeFeign;
+//import com.hfln.device.common.request.user.*;
+//import com.hfln.device.common.vo.*;
+//import feign.hystrix.FallbackFactory;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.stereotype.Component;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//
+///**
+// * UserFacadeFeignFallbackFactory
+// *
+// * @author cw
+// * @date 2024/6/19 17:45
+// */
+//@Component
+//@Slf4j
+//public class UserFacadeFeignFallbackFactory implements FallbackFactory<UserFacadeFeign> {
+//    @Override
+//    public UserFacadeFeign create(Throwable cause) {
+//        log.error("UserFacadeFeignFallbackFactory error", cause);
+//        return new UserFacadeFeign() {
+//
+//            @Override
+//            public ApiResult<UserVO> getUserByUserId(Long userId) {
+//                return ApiResult.success(new UserVO());
+//            }
+//
+//            @Override
+//            public ApiResult<UserVO> getUserByUserName(String userName) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> add(UserAddReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Long> addUserReturnId(UserAddReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> update(UserUpdateReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> delete(Long userId) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> batchDel(List<Long> userIds) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updateUserStatus(Long userId, String status) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserBaseInfoVO>> listByOrgId(Long orgId, String realName) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updateOnlineStatus(Long userId, String onlineStatus) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserBaseInfoVO>> listByStation(Long userId, Long stationId) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserVO>> listByUserIds(List<Long> userIds) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updatePwd(UserUpdatePwdReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updateOtherPwd(UserUpdateOtherPwdReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Page<UserPageVO>> page(UserPageReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserPageVO>> list(UserListReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserPageVO>> listByUserTypes(UserListByTypesReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserPageVO>> listDriverAndDoc(UserListReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserPageVO>> listDispatcher(UserListReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserPageVO>> listAllDispatcher(UserListReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> updateUseStatusBatch(UserUpdateUseStatusReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserBaseInfoVO>> listIdleUser(ListIdleUserReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<UserBaseInfoVO>> listDisPatcherByUserTypes(ListIdleUserReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Page<ClientUserVO>> pageClientUser(ClientUserQueryReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<ClientUserVO>> listClientUser(ClientUserQueryReq req) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<ClientUserVO> getClientUserVO(Long userId) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<ClientUserVO> getClientUserByPhoneNumber(String phone) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<String> updateClientUserInfo(ClientUserUpdateReq updateReq) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<Boolean> hasSitNumber(String sitNumber) {
+//                return ApiResult.failed(cause.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<ClientUserVO>> getWechatUserByUserIds(List<Long> userIds) {
+//                return ApiResult.success(new ArrayList<>());
+//            }
+//
+//            @Override
+//            public ApiResult<List<CommonStatisticsVO>> userStatistics(Long orgId) {
+//                return ApiResult.success(new ArrayList<>());
+//            }
+//        };
+//    }
+//}

+ 11 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/DingFacadeFeign.java

@@ -0,0 +1,11 @@
+//package com.hfln.device.client.api.feign;
+//
+//import com.hfln.device.client.api.config.FeignConfig;
+//import com.hfln.device.client.api.fallback.DingFacadeFeignFallbackFactory;
+//import com.hfln.device.common.facade.DingFacade;
+//import org.springframework.cloud.openfeign.FeignClient;
+//
+//@FeignClient(value = "emergency-tenantry-service-server", contextId = "DingFacadeFeign", configuration = FeignConfig.class,fallbackFactory = DingFacadeFeignFallbackFactory.class)
+//public interface DingFacadeFeign extends DingFacade {
+//
+//}

+ 10 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/LogLoginFacadeFegin.java

@@ -0,0 +1,10 @@
+//package com.hfln.device.client.api.feign;
+//
+//import com.hfln.device.client.api.config.FeignConfig;
+//import com.hfln.device.common.facade.LogLoginFacade;
+//import org.springframework.cloud.openfeign.FeignClient;
+//
+//@FeignClient(value = "emergency-tenantry-service-server", contextId = "LogLoginFacadeFegin", configuration = FeignConfig.class)
+//public interface LogLoginFacadeFegin extends LogLoginFacade {
+//
+//}

+ 15 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/TokenFacadeFeign.java

@@ -0,0 +1,15 @@
+//package com.hfln.device.client.api.feign;
+//
+//import com.hfln.device.client.api.config.FeignConfig;
+//import com.hfln.device.common.facade.TokenFacade;
+//import org.springframework.cloud.openfeign.FeignClient;
+//
+///**
+// * 授权登录相关接口
+// *
+// * @author huolifu
+// * @date 2023/10/30 11:21
+// **/
+//@FeignClient(value = "emergency-tenantry-service-server", contextId = "TokenFacadeFeign", configuration = FeignConfig.class)
+//public interface TokenFacadeFeign extends TokenFacade {
+//}

+ 17 - 0
device-service-client-starter/src/main/java/com/hfln/device/client/api/feign/UserFacadeFeign.java

@@ -0,0 +1,17 @@
+//package com.hfln.device.client.api.feign;
+//
+//import com.hfln.device.client.api.config.FeignConfig;
+//import com.hfln.device.client.api.fallback.UserFacadeFeignFallbackFactory;
+//import com.hfln.device.common.facade.UserFacade;
+//import org.springframework.cloud.openfeign.FeignClient;
+//
+///**
+// * @author huolifu
+// * @date 2023/10/17 11:27
+// **/
+//@FeignClient(value = "emergency-tenantry-service-server", contextId = "UserFacadeFeign", configuration = FeignConfig.class,fallbackFactory = UserFacadeFeignFallbackFactory.class)
+//public interface UserFacadeFeign extends UserFacade {
+//
+//
+//
+//}

+ 64 - 0
device-service-common/pom.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hfln-device-service</artifactId>
+        <groupId>com.hfln.device</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>device-service-common</artifactId>
+
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>hfln-framework-dto</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+
+        <!-- Alibaba Fastjson -->
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+        </dependency>
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>

+ 42 - 0
device-service-common/src/main/java/com/hfln/device/common/constant/mqtt/topic/MqttTopics.java

@@ -0,0 +1,42 @@
+package com.hfln.device.common.constant.mqtt.topic;
+
+public class MqttTopics {
+    // 设备 Device
+    public static final String DEV_ALL = "/dev/#";
+    public static final String DEV_LOGIN = "/dev/+/login";
+    public static final String DEV_KEEPALIVE = "/dev/+/keepalive";
+    public static final String DEV_REP_DEV_INFO = "/dev/+/report_device_info";
+    public static final String DEV_REP_DEV_PARAM = "/dev/+/report_device_param";
+    public static final String DEV_CLOUD_POINT = "/dev/+/cloudpoint";
+    public static final String DEV_REP_FALL_EVENT = "/dev/+/report_falling_event";
+    public static final String DEV_REP_PRES_EVENT = "/dev/+/report_presence_event";
+    public static final String DEV_UPDATE_FIRMWARE = "/dev/+/update_firmware";
+    public static final String DEV_REBOOT = "/dev/+/reboot";
+
+    // 设备调试
+    public static final String DEV_SET_DEBUG = "/dev/+/set_debug_param";
+    public static final String DEV_GET_DEBUG = "/dev/+/get_debug_param";
+
+    // 设备接入 Device Access Service
+    public static final String DAS_ALL = "/das/#";
+    public static final String DAS_LOGIN = "/das/+/login";
+    public static final String DAS_KEEPALIVE = "/das/+/keepalive";
+    public static final String DAS_STATUS = "/das/dev_status";
+    public static final String DAS_CLOUD_POINT = "/das/cloudpoint";
+    public static final String DAS_REALTIME_POS = "/das/realtime_pos";
+    public static final String DAS_EVENT = "/das/event";
+    public static final String DAS_EXIST_EVENT = "/das/exist";
+    public static final String DAS_ALARM_EVENT = "/das/alarm_event";
+
+    // 小程序 Mini Program Service
+    public static final String MPS_ALL = "/mps/#";
+    public static final String MPS_GET_DEV_INFO = "/mps/request_device_info";
+    public static final String MPS_GET_DEV_PARAM = "/mps/get_device_param";
+    public static final String MPS_SET_DEV_PARAM = "/mps/set_device_param";
+    public static final String MPS_FALL_EVENT_ACK = "/mps/fall_event/ack";
+
+    // 运维客户端
+    public static final String OPC_ALL = "/opc/#";
+    public static final String OPC_GET_ALARM_PARAM = "/opc/get_alarm_param";
+    public static final String OPC_SET_ALARM_PARAM = "/opc/set_alarm_param";
+}

+ 11 - 0
device-service-common/src/main/java/com/hfln/device/common/constant/mqtt/topic/TopicConstants.java

@@ -0,0 +1,11 @@
+package com.hfln.device.common.constant.mqtt.topic;
+
+public interface TopicConstants {
+
+    String TOPIC_DEV_UPDATE = "/dev/%s/set_device_param";
+
+
+    String TOPIC_SET_DEVICE_PARAM = "/mps/set_device_param";
+
+
+}

+ 18 - 0
device-service-common/src/main/java/com/hfln/device/common/constant/redis/RedisCacheConstant.java

@@ -0,0 +1,18 @@
+package com.hfln.device.common.constant.redis;
+
+/**
+ * 缓存前缀
+ */
+public interface RedisCacheConstant {
+
+    /**
+     * 登录验证码
+     */
+    String SMS_LOGIN_CODE = "sms:login:";
+    String SMS_SIGNUP_CODE = "sms:signup:";
+    String SMS_SEND_LOGIN_TIME = "sms:login:frequency:";
+    String SMS_SEND_SIGNUP_TIME = "sms:signup:frequency:";
+
+
+
+}

+ 17 - 0
device-service-common/src/main/java/com/hfln/device/common/dto/data/CustomerDTO.java

@@ -0,0 +1,17 @@
+package com.hfln.device.common.dto.data;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+@Data
+public class CustomerDTO{
+    private String customerId;
+    private String memberId;
+    private String customerName;
+    private String customerType;
+    @NotEmpty
+    private String companyName;
+    @NotEmpty
+    private String source;
+}

+ 209 - 0
device-service-common/src/main/java/com/hfln/device/common/dto/data/device/DeviceDTO.java

@@ -0,0 +1,209 @@
+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;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+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")
+    private BigDecimal y;
+
+    /**
+     * 指示灯开关:0-关闭,1-开启
+     */
+    @ApiModelProperty("指示灯开关:0-关闭,1-开启")
+    private Integer statusLight;
+
+    /**
+     * 创建人
+     */
+    @ApiModelProperty("创建人")
+    private String createId;
+
+
+    /**
+     * 修改人
+     */
+
+    @ApiModelProperty("修改人")
+    private String updateId;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    private LocalDateTime updateTime;
+
+
+}

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

@@ -0,0 +1,47 @@
+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;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class EventListDTO extends BaseVO {
+    /**
+     * 主键ID
+     */
+    @ApiModelProperty("事件主键")
+    private Long eventListId;
+
+    /**
+     * 设备ID
+     */
+    @ApiModelProperty("设备Id")
+    private String devId;
+
+    /**
+     * 姿态
+     */
+    @ApiModelProperty("姿态")
+    private Integer pose;
+
+    /**
+     * target数组
+     */
+    @ApiModelProperty("target数组")
+    private String targetPoints;
+
+    /**
+     * 事件类型
+     */
+    @ApiModelProperty("事件类型")
+    private Integer event;
+
+    /**
+     * 是否处理:0-未处理,1-已处理
+     */
+    @ApiModelProperty("是否处理:0-未处理,1-已处理")
+    private Integer isHandle;
+
+}

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

@@ -0,0 +1,29 @@
+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;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HomeInfoDTO extends BaseVO {
+
+
+    @ApiModelProperty("轮播图")
+    private String carouselImage;
+
+    @ApiModelProperty("设备列表")
+    private List<DeviceDTO> deviceList;
+
+    @ApiModelProperty("群组数量")
+    private Integer groupNum;
+
+    @ApiModelProperty("分享数量")
+    private Integer shareNum;
+
+
+}

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

@@ -0,0 +1,21 @@
+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")
+    private Long UserId;
+    @ApiModelProperty("手机号码")
+    private String phone;
+    @ApiModelProperty("微信OpenId")
+    private String openid;
+}

+ 21 - 0
device-service-common/src/main/java/com/hfln/device/common/dto/event/CustomerCreatedEvent.java

@@ -0,0 +1,21 @@
+package com.hfln.device.common.dto.event;
+
+/**
+ * CustomerCreatedEvent
+ *
+ * @author Frank Zhang
+ * @date 2019-01-04 10:32 AM
+ */
+public class CustomerCreatedEvent{
+
+    private String customerId;
+
+    public String getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(String customerId) {
+        this.customerId = customerId;
+    }
+
+}

+ 11 - 0
device-service-common/src/main/java/com/hfln/device/common/dto/event/DomainEventConstant.java

@@ -0,0 +1,11 @@
+package com.hfln.device.common.dto.event;
+
+/**
+ * @author niexiaolong
+ * @date 2019/4/16
+ */
+public class DomainEventConstant {
+
+	public static final String CUSTOMER_CREATED_TOPIC = "CRM_CUSTOMER_CREATED_DOMAIN_EVENT_TOPIC";
+
+}

+ 13 - 0
device-service-common/src/main/java/com/hfln/device/common/request/TestRequest.java

@@ -0,0 +1,13 @@
+package com.hfln.device.common.request;
+
+import lombok.Data;
+
+/**
+ * @USER: YangLiu
+ * @DATE: 2023/10/16 11:21
+ * @DESC:
+ */
+@Data
+public class TestRequest {
+    private Long id;
+}

+ 66 - 0
device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceBandingParams.java

@@ -0,0 +1,66 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+import java.math.BigDecimal;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "设备绑定")
+public class DeviceBandingParams extends BaseVO {
+
+    @NotEmpty(message = "设备Id不能为空")
+    @ApiModelProperty(value = "设备ID",required = true)
+    private String devId;
+
+    @NotEmpty(message = "用户Id不能为空")
+    @ApiModelProperty("用户Id")
+    private Long userId;
+
+    @ApiModelProperty("设备名称")
+    private String devName;
+
+    @ApiModelProperty("房间长度")
+    private BigDecimal length;
+
+    @ApiModelProperty("房间宽度")
+    private BigDecimal width;
+
+    @ApiModelProperty("房间高度")
+    private BigDecimal height;
+
+    @ApiModelProperty(value = "北向夹角")
+    private BigDecimal northAngle;
+
+
+    @ApiModelProperty(value = "安装方式")
+    private String mountPlain;
+
+    @ApiModelProperty(value = "安装坐标x开始")
+    private BigDecimal xStart;
+    @ApiModelProperty(value = "安装坐标x结束")
+    private BigDecimal xEnd;
+
+
+    @ApiModelProperty(value = "安装坐标y开始")
+    private BigDecimal yStart;
+    @ApiModelProperty(value = "安装坐标y结束")
+    private BigDecimal yEnd;
+
+
+    @ApiModelProperty(value = "安装坐标z开始")
+    private BigDecimal zStart;
+    @ApiModelProperty(value = "安装坐标z结束")
+    private BigDecimal zEnd;
+
+
+    @ApiModelProperty(value = "指示灯开关")
+    private int statusLight;
+
+
+}

+ 28 - 0
device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceListParams.java

@@ -0,0 +1,28 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "设备列表查询")
+public class DeviceListParams extends BaseVO {
+
+    @NotEmpty(message = "用户Id不能为空!")
+    @ApiModelProperty(value = "用户Id",required = true)
+    private Long userId;
+
+    @ApiModelProperty(value = "关键词")
+    private String keyWord;
+
+    @ApiModelProperty(value = "状态 0:在线  1:离线  2:报警")
+    private Integer status;
+
+
+
+}

+ 28 - 0
device-service-common/src/main/java/com/hfln/device/common/request/device/DeviceLocationParams.java

@@ -0,0 +1,28 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+import java.math.BigDecimal;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "设备为止更新")
+public class DeviceLocationParams extends BaseVO {
+
+
+
+    @NotEmpty(message = "设备Id不能为空!")
+    @ApiModelProperty(value = "设备表Id",required = true)
+    private String deviceId;
+
+    @ApiModelProperty(value = "X坐标")
+    private BigDecimal xValue;
+
+    @ApiModelProperty(value = "Y坐标")
+    private Long yValue;
+}

+ 27 - 0
device-service-common/src/main/java/com/hfln/device/common/request/event/EventListParams.java

@@ -0,0 +1,27 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "事件列表查询")
+public class EventListParams extends PageVo {
+
+    @NotEmpty(message = "设备ID不能为空!")
+    @ApiModelProperty(value = "设备ID",required = true)
+    private String deviceId;
+
+    @ApiModelProperty(value = "开始时间",required = true)
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间",required = true)
+    private Date endTime;
+
+}

+ 26 - 0
device-service-common/src/main/java/com/hfln/device/common/request/user/LoginBySmsCodeParams.java

@@ -0,0 +1,26 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "用户登录参数")
+public class LoginBySmsCodeParams extends BaseVO {
+
+    @NotEmpty(message = "用户名不能为空!")
+    @ApiModelProperty("用户名")
+    private String userName;
+
+    @NotEmpty(message = "验证码不能为空!")
+    @ApiModelProperty("验证码")
+    private String smsCode;
+
+
+}

+ 26 - 0
device-service-common/src/main/java/com/hfln/device/common/request/user/UserLoginParams.java

@@ -0,0 +1,26 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "用户登录参数")
+public class UserLoginParams extends BaseVO {
+
+    @NotEmpty(message = "用户名不能为空!")
+    @ApiModelProperty(value = "用户名",required = true)
+    private String userName;
+
+    @NotEmpty(message = "密码不能为空!")
+    @ApiModelProperty(value = "密码",required = true)
+    private String password;
+
+
+}

+ 33 - 0
device-service-common/src/main/java/com/hfln/device/common/request/user/UserSignupParams.java

@@ -0,0 +1,33 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "小程序用户注册入参")
+public class UserSignupParams extends BaseVO {
+
+    @NotEmpty(message = "用户名不能为空!")
+    @ApiModelProperty("用户名/手机号")
+    private String phone;
+
+    @NotEmpty(message = "验证码不能为空!")
+    @ApiModelProperty("验证码")
+    private String code;
+
+    @NotEmpty(message = "openId不能为空!")
+    @ApiModelProperty("小程序openId")
+    private String openId;
+
+    @NotEmpty(message = "密码不能为空!")
+    @ApiModelProperty("密码")
+    private String password;
+
+}

+ 27 - 0
device-service-common/src/main/java/com/hfln/device/common/request/user/UserUpdatePasswordParams.java

@@ -0,0 +1,27 @@
+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;
+
+import javax.validation.constraints.NotEmpty;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(description = "用户修改密码")
+public class UserUpdatePasswordParams extends BaseVO {
+
+    @NotEmpty(message = "用户Id不能为空!")
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @NotEmpty(message = "新密码不能为空!")
+    @ApiModelProperty("新密码")
+    private String newPassword;
+
+    @NotEmpty(message = "密码不能为空!")
+    @ApiModelProperty("密码")
+    private String oldPassword;
+}

+ 7 - 0
device-service-common/src/main/java/com/hfln/device/common/vo/BaseVO.java

@@ -0,0 +1,7 @@
+package com.hfln.device.common.vo;
+
+import java.io.Serializable;
+
+public class BaseVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+}

+ 32 - 0
device-service-common/src/main/java/com/hfln/device/common/vo/PageRecord.java

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

+ 16 - 0
device-service-common/src/main/java/com/hfln/device/common/vo/PageVo.java

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

+ 59 - 0
device-service-domain/pom.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.hfln.device</groupId>
+        <artifactId>hfln-device-service</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>device-service-domain</artifactId>
+    <packaging>jar</packaging>
+    <name>device-service-domain</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.hfln.device</groupId>
+            <artifactId>device-service-client-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>hfln-framework-common</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <version>3.1.1190</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>cn.hfln.framework</groupId>-->
+<!--            <artifactId>mqtt-spring-boot-starter</artifactId>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>emqx-spring-boot-starter</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <configuration>
+                        <skip>true</skip>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>

+ 14 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/CompanyType.java

@@ -0,0 +1,14 @@
+package com.hfln.device.domain.customer;
+
+/**
+ * CompanyType
+ *
+ * @author Frank Zhang
+ * @date 2018-01-08 11:02 AM
+ */
+public enum CompanyType {
+    POTENTIAL,
+    INTENTIONAL,
+    IMPORTANT,
+    VIP;
+}

+ 9 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/Credit.java

@@ -0,0 +1,9 @@
+package com.hfln.device.domain.customer;
+
+import lombok.Data;
+
+@Data
+//@Entity
+public class Credit{
+    
+}

+ 36 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/Customer.java

@@ -0,0 +1,36 @@
+package com.hfln.device.domain.customer;
+
+import lombok.Data;
+
+//Domain Entity can choose to extends the domain model which is used for DTO
+@Data
+//@Entity
+public class Customer{
+
+    private String customerId;
+    private String memberId;
+    private String globalId;
+    private long registeredCapital;
+    private String companyName;
+    private SourceType sourceType;
+    private CompanyType companyType;
+
+    public Customer() {
+    }
+
+    public boolean isBigCompany() {
+        return registeredCapital > 10000000; //注册资金大于1000万的是大企业
+    }
+
+    public boolean isSME() {
+        return registeredCapital > 10000 && registeredCapital < 1000000; //注册资金大于10万小于100万的为中小企业
+    }
+
+    public void checkConfilict(){
+        //Per different biz, the check policy could be different, if so, use ExtensionPoint
+//        if("ConflictCompanyName".equals(this.companyName)){
+//            throw new BizException(this.companyName+" has already existed, you can not add it");
+//        }
+
+    }
+}

+ 14 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/CustomerType.java

@@ -0,0 +1,14 @@
+package com.hfln.device.domain.customer;
+
+/**
+ * CustomerType
+ *
+ * @author Frank Zhang
+ * @date 2018-01-08 8:51 AM
+ */
+public enum CustomerType {
+    POTENTIAL,
+    INTENTIONAL,
+    IMPORTANT,
+    VIP;
+}

+ 12 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/SourceType.java

@@ -0,0 +1,12 @@
+package com.hfln.device.domain.customer;
+
+/**
+ * SourceType
+ *
+ * @author Frank Zhang
+ * @date 2018-01-08 11:09 AM
+ */
+public enum SourceType {
+    BIZ_ONE, //From biz one
+    BIZ_TWO; //From biz two
+}

+ 6 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/domainservice/CreditChecker.java

@@ -0,0 +1,6 @@
+package com.hfln.device.domain.customer.domainservice;
+
+//The domain's ablility can also be placed here
+public class CreditChecker{
+
+}

+ 118 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/util/MsgClient.java

@@ -0,0 +1,118 @@
+package com.hfln.device.domain.customer.util;
+
+import cn.hfln.framework.extension.BizException;
+import com.tencentcloudapi.common.AbstractModel;
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.sms.v20210111.SmsClient;
+import com.tencentcloudapi.sms.v20210111.models.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.validation.constraints.NotBlank;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Slf4j
+@Component
+public class MsgClient {
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	@NotBlank
+	@Value("${lnxx.sms.tencent.secretId}")
+	private String secretId;
+
+	@NotBlank
+	@Value("${lnxx.sms.tencent.secretKey}")
+	private String secretKey;
+
+	@NotBlank
+	@Value("${lnxx.sms.tencent.loginId}")
+	private String loginId;
+
+	@NotBlank
+	@Value("${lnxx.sms.tencent.registerId}")
+	private String registerId;
+
+	@NotBlank
+	@Value("${lnxx.sms.tencent.notifyId}")
+	private String notifyId;
+
+	@NotBlank
+	@Value("${lnxx.sms.tencent.sdkAppId}")
+	private String sdkAppId;
+
+	@NotBlank
+	@Value("${lnxx.sms.tencent.region}")
+	private String region;
+
+	public String sendMsg(String mobile, String content, String signName) {
+		if (isValidMobile(mobile)) {
+			return "手机号格式不正确";
+		}
+		if (StringUtils.isEmpty(signName)) {
+			signName = "安徽柒零玖";
+		}
+		try {
+			String encodedContent = URLEncoder.encode(content + "【" + signName + "】", "GB2312");
+			String url = String.format(
+					"https://mb345.com/ws/BatchSend2.aspx?CorpID=HFLKJ0006642&Pwd=zh9527@&Mobile=%s&Content=%s&Cell=&SendTime=",
+					mobile, encodedContent);
+
+			log.info("发送短信内容: {}", content);
+			return restTemplate.getForObject(url, String.class);
+
+		} catch (UnsupportedEncodingException e) {
+			log.error("短信内容编码失败", e);
+		} catch (Exception e) {
+			log.error("调用短信接口异常", e);
+		}
+		return "发送失败";
+	}
+
+	public String sendLoginMsg(String mobile, String captcha) {
+		return sendTencentMsg(mobile, loginId, new String[]{captcha, "5"});
+	}
+
+	public String sendRegisterMsg(String mobile, String captcha) {
+		return sendTencentMsg(mobile, registerId, new String[]{captcha});
+	}
+
+	public String sendNotifyMsg(String mobile, String devName) {
+		String nowTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+		String[] timeParts = nowTime.split("[- :]");
+		return sendTencentMsg(mobile, notifyId, new String[]{devName, timeParts[0], timeParts[1], timeParts[2], timeParts[3], timeParts[4], timeParts[5]});
+	}
+
+	private String sendTencentMsg(String mobile, String templateId, String[] templateParams) {
+		if (isValidMobile(mobile)) {
+			throw new BizException("手机号码格式有误");
+		}
+		try {
+			SmsClient client = new SmsClient(new Credential(secretId, secretKey), region, new ClientProfile());
+			SendSmsRequest req = new SendSmsRequest();
+			req.setPhoneNumberSet(new String[]{mobile});
+			req.setSignName("雷能守护小程序");
+			req.setTemplateId(templateId);
+			req.setTemplateParamSet(templateParams);
+			req.setSmsSdkAppId(sdkAppId);
+			SendSmsResponse resp = client.SendSms(req);
+			return AbstractModel.toJsonString(resp);
+		} catch (Exception e) {
+			log.error("发送腾讯云短信失败", e);
+		}
+		return null;
+	}
+
+	private boolean isValidMobile(String mobile) {
+		return mobile == null || !mobile.matches("^1[3-9]\\d{9}$");
+	}
+}

+ 16 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/util/PasswordUtil.java

@@ -0,0 +1,16 @@
+package com.hfln.device.domain.customer.util;
+
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+public class PasswordUtil {
+    private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+
+    public static String encrypt(String rawPassword) {
+        return encoder.encode(rawPassword);
+    }
+
+    public static Boolean matches(String rawPassword, String encodedPassword) {
+        return encoder.matches(rawPassword, encodedPassword);
+    }
+
+}

+ 49 - 0
device-service-domain/src/main/java/com/hfln/device/domain/customer/util/UpdateWrapperBuilder.java

@@ -0,0 +1,49 @@
+package com.hfln.device.domain.customer.util;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import org.apache.commons.lang3.StringUtils;
+
+public class UpdateWrapperBuilder<T> {
+    private final LambdaUpdateWrapper<T> updateWrapper = new LambdaUpdateWrapper<>();
+    private boolean hasUpdate = false;
+
+    public static <T> UpdateWrapperBuilder<T> create() {
+        return new UpdateWrapperBuilder<>();
+    }
+
+    public UpdateWrapperBuilder<T> eq(SFunction<T, ?> column, Object val) {
+        updateWrapper.eq(column, val);
+        return this;
+    }
+
+    public UpdateWrapperBuilder<T> setIfNotNull(SFunction<T, ?> column, Object val) {
+        if (val != null) {
+            updateWrapper.set(column, val);
+            hasUpdate = true;
+        }
+        return this;
+    }
+
+    public UpdateWrapperBuilder<T> setIfNotBlank(SFunction<T, ?> column, String val) {
+        if (StringUtils.isNotBlank(val)) {
+            updateWrapper.set(column, val);
+            hasUpdate = true;
+        }
+        return this;
+    }
+
+    public UpdateWrapperBuilder<T> set(SFunction<T, ?> column, Object val) {
+        updateWrapper.set(column, val);
+        hasUpdate = true;
+        return this;
+    }
+
+    public boolean hasUpdate() {
+        return hasUpdate;
+    }
+
+    public LambdaUpdateWrapper<T> build() {
+        return updateWrapper;
+    }
+}

+ 101 - 0
device-service-domain/src/main/java/com/hfln/device/domain/entity/MenuEntity.java

@@ -0,0 +1,101 @@
+package com.hfln.device.domain.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @BelongsProject: harryDev
+ * @BelongsPackage: com.hfln.device.infrastructure.entity
+ * @Author: huangls
+ * @CreateTime: 2023-10-17  16:14
+ * @Description: TODO
+ * @Version: 1.0
+ */
+@Data
+public class MenuEntity implements Serializable {
+    /**
+     * 菜单ID
+     */
+    private Long menuId;
+    /**
+     * 菜单名称
+     */
+    private String menuName;
+    /**
+     * 父菜单ID
+     */
+    private Long parentId;
+    /**
+     * 显示顺序
+     */
+    private Integer orderNum;
+    /**
+     * 路由地址
+     */
+    private String path;
+    /**
+     * 组件路径
+     */
+    private String component;
+    /**
+     * 路由参数
+     */
+    private String query;
+    /**
+     * 是否为外链(0是 1否)
+     */
+    private Integer isFrame;
+    /**
+     * 菜单类型(0-菜单 1-按钮)
+     */
+    private String menuType;
+    /**
+     * 权限标识
+     */
+    private String perms;
+    /**
+     * 菜单图标
+     */
+    private String icon;
+    /**
+     * 系统类型(1调度中心  2调度分站 3数据大屏 4后台管理 5医生端 6司机端 7专家端 )
+     */
+    private String sysType;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 删除标志
+     */
+    private String delFlag;
+
+    /**
+     * 子菜单
+     */
+    private List<MenuEntity> children = new ArrayList<>();
+    /**
+     * 父级名称
+     */
+    private String parentName;
+
+    /**
+     * 是否与角色关联 0 未关联  1
+     */
+    private String isLink;
+
+    private Long rmId;
+
+    /**
+     * 是否缓存 0-是 1-否
+     */
+    private String cacheFlag;
+
+    /**
+     * 是否显示 0-是 1-否
+     */
+    private String showFlag;
+}

+ 147 - 0
device-service-domain/src/main/java/com/hfln/device/domain/event/MqttHandler.java

@@ -0,0 +1,147 @@
+package com.hfln.device.domain.event;
+
+import cn.hfln.emqx.publisher.MqttPublisher;
+import com.alibaba.fastjson2.JSONObject;
+import com.hfln.device.common.constant.mqtt.topic.TopicConstants;
+import com.hfln.device.common.request.device.DeviceBandingParams;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class MqttHandler {
+    // 常量定义
+    private static final double VERSION_THRESHOLD = 2.0; // 版本阈值,用于判断设备协议版本
+    private static final int QOS = 1;                  // MQTT服务质量等级
+    private static final boolean RETAIN = true;        // MQTT保留消息标志
+
+    @Autowired
+    private MqttPublisher mqttPublisher; // MQTT消息发布器
+
+    /**
+     * 处理设备更新消息
+     * @param deviceVersion 设备协议版本号
+     * @param request 设备绑定请求参数
+     */
+    public void handleDeviceUpdateMessage(String deviceVersion, DeviceBandingParams request) {
+        if (isVersionSupported(deviceVersion)) {
+            // 支持新协议的设备发送更新消息
+            sendDeviceUpdateMessage(request);
+        } else {
+            // 旧版本设备发送参数设置消息
+            sendDeviceParametersMessage(request);
+        }
+    }
+
+    /**
+     * 检查设备版本是否支持新协议
+     * @param version 设备协议版本号
+     * @return true-支持新协议,false-不支持
+     */
+    private boolean isVersionSupported(String version) {
+        try {
+            return Double.parseDouble(version) >= VERSION_THRESHOLD;
+        } catch (NumberFormatException e) {
+            // 版本号解析失败视为不支持
+            return false;
+        }
+    }
+
+    /**
+     * 发送设备更新消息(新协议格式)
+     * @param request 设备绑定请求参数
+     */
+    private void sendDeviceUpdateMessage(DeviceBandingParams request) {
+        // 构建主题:使用设备ID动态生成
+        String topic = String.format(TopicConstants.TOPIC_DEV_UPDATE, request.getDevId());
+
+        // 构建消息体
+        JSONObject message = new JSONObject()
+                .fluentPut("sensor_location", createSensorLocation(request.getHeight())) // 传感器位置
+                .fluentPut("ext_region", createExtendedRegion(request))                  // 扩展区域
+                .fluentPut("indicator_led", calculateIndicatorLedStatus(request.getStatusLight())); // 指示灯状态
+
+        // 发送MQTT消息
+        mqttPublisher.send(topic, message, QOS, RETAIN);
+    }
+
+    /**
+     * 发送设备参数消息(旧协议格式)
+     * @param request 设备绑定请求参数
+     */
+    private void sendDeviceParametersMessage(DeviceBandingParams request) {
+        // 使用固定主题
+        String topic = TopicConstants.TOPIC_SET_DEVICE_PARAM;
+
+        // 构建消息体
+        JSONObject message = new JSONObject()
+                .fluentPut("dev_id", request.getDevId())               // 设备ID
+                .fluentPut("mounting_plain", request.getMountPlain())  // 安装平面
+                .fluentPut("height", request.getHeight())              // 高度
+                .fluentPut("area", createAreaObject(request));         // 区域参数
+
+        // 发送MQTT消息
+        mqttPublisher.send(topic, message, QOS, RETAIN);
+    }
+
+    /**
+     * 创建传感器位置信息
+     * @param height 传感器高度
+     * @return 传感器位置Map
+     */
+    private Map<String, BigDecimal> createSensorLocation(BigDecimal height) {
+        Map<String, BigDecimal> sensorLocation = new HashMap<>();
+        sensorLocation.put("z_cm", height); // z轴坐标
+        return sensorLocation;
+    }
+
+    /**
+     * 创建扩展区域信息
+     * @param request 设备绑定请求参数
+     * @return 扩展区域Map
+     */
+    private Map<String, Map<String, BigDecimal>> createExtendedRegion(DeviceBandingParams request) {
+        // 基础区域参数
+        Map<String, BigDecimal> baseRegion = new HashMap<>();
+        baseRegion.put("x_cm_start", request.getXStart()); // x轴起点
+        baseRegion.put("x_cm_stop", request.getXEnd());    // x轴终点
+        baseRegion.put("y_cm_start", request.getYStart()); // y轴起点
+        baseRegion.put("y_cm_stop", request.getYEnd());   // y轴终点
+        baseRegion.put("z_cm_start", request.getZStart()); // z轴起点
+        baseRegion.put("z_cm_stop", request.getZEnd());   // z轴终点
+
+        Map<String, Map<String, BigDecimal>> extendedRegion = new HashMap<>();
+        extendedRegion.put("base", baseRegion); // 基础区域
+        return extendedRegion;
+    }
+
+    /**
+     * 创建区域对象(旧协议格式)
+     * @param request 设备绑定请求参数
+     * @return 区域JSON对象
+     */
+    private JSONObject createAreaObject(DeviceBandingParams request) {
+        return new JSONObject()
+                .fluentPut("start_x", request.getXStart()) // 起始x坐标
+                .fluentPut("stop_x", request.getXEnd())    // 结束x坐标
+                .fluentPut("start_y", request.getYStart()) // 起始y坐标
+                .fluentPut("stop_y", request.getYEnd())    // 结束y坐标
+                .fluentPut("start_z", request.getZStart()) // 起始z坐标
+                .fluentPut("stop_z", request.getZEnd());   // 结束z坐标
+    }
+
+    /**
+     * 计算指示灯状态
+     * @param statusLight 原始状态灯值
+     * @return 转换后的指示灯状态(0和1互换)
+     */
+    private int calculateIndicatorLedStatus(int statusLight) {
+        return statusLight == 0 ? 1 : 0;
+    }
+
+
+
+}

+ 84 - 0
device-service-domain/src/main/java/com/hfln/device/domain/exception/ErrorEnum.java

@@ -0,0 +1,84 @@
+package com.hfln.device.domain.exception;
+
+import java.util.Objects;
+
+/**
+ * @USER: YangLiu
+ * @DATE: 2023/10/18 13:44
+ * @DESC:
+ */
+public enum ErrorEnum implements ErrorEnumInterface{
+
+    /**
+     * 业务异常
+     */
+    ERROR_BIZ_FAIL( "10000", "业务失败"),
+    USER_NOT_FOUND( "10001", "用户不存在"),
+    MOBILE_EXISTS("10002", "手机号已存在"),
+
+
+    /**
+     * 短信验证码相关
+     */
+    FREQUENT_SMS_SENDING("20001", "短信发送频繁,一分钟后重试"),
+    SMS_CODE_EXPIRED("20002", "短信验证码已过期"),
+    SMS_CODE_ERROR("20003", "短信验证码错误"),
+
+
+    /**
+     * 用户相关
+     */
+    WECHAT_CODE_ISNULL("30001", "微信code不能为空"),
+    USER_ALREADY_EXISTS("30002", "用户已经存在"),
+    USERNAME_OR_PASSWORD_ERROR("30003", "用户名或密码错误"),
+    OLD_PASSWORD_ERROR("30004", "旧密码错误"),
+    USER_IS_NOT_EXIST("30005", "用户不存在"),
+    PASSWORD_IS_REPEAT("30006", "新密码与旧密码相同"),
+
+
+    /**
+     * 三方系统调用相关
+     */
+    WECHAT_INTERFACE_CALL_EXCEPTION("40001", "微信接口调用异常"),
+
+    /**
+     * 设备相关
+     */
+    DEVICE_IS_NOT_EXIST("50001", "设备不存在!"),
+    DEVICE_IS_BINDING("50002", "当前设备已经被绑定!"),
+
+
+
+
+
+    ;
+
+    private final String errorCode;
+    private final String errorMessage;
+
+    ErrorEnum( String errorCode, String errorMessage) {
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+    }
+
+    @Override
+    public String getErrorMessage() {
+        return this.errorMessage;
+    }
+
+    @Override
+    public String getErrorCode() {
+        return this.errorCode;
+    }
+
+
+
+    public static ErrorEnum getErrorByCode(String code) {
+        for (ErrorEnum errorEnum : values()) {
+            if (Objects.equals(errorEnum.getErrorCode(), code)) {
+                return errorEnum;
+            }
+        }
+        return null;
+    }
+}

+ 21 - 0
device-service-domain/src/main/java/com/hfln/device/domain/exception/ErrorEnumInterface.java

@@ -0,0 +1,21 @@
+package com.hfln.device.domain.exception;
+
+/**
+ * @USER: YangLiu
+ * @DATE: 2023/10/18 13:43
+ * @DESC:
+ */
+public interface ErrorEnumInterface {
+    /**
+     * 获取异常信息
+     * @return
+     */
+    String getErrorMessage();
+
+    /**
+     * 获取异常码
+     * @return
+     */
+    String getErrorCode();
+
+}

+ 35 - 0
device-service-domain/src/main/java/com/hfln/device/domain/gateway/DeviceGateway.java

@@ -0,0 +1,35 @@
+package com.hfln.device.domain.gateway;
+
+import com.hfln.device.common.dto.data.device.DeviceDTO;
+import com.hfln.device.common.dto.data.event.EventListDTO;
+import com.hfln.device.common.dto.data.home.HomeInfoDTO;
+import com.hfln.device.common.request.device.DeviceBandingParams;
+import com.hfln.device.common.request.device.DeviceListParams;
+import com.hfln.device.common.request.device.DeviceLocationParams;
+import com.hfln.device.common.request.event.EventListParams;
+import com.hfln.device.common.vo.PageRecord;
+
+import java.util.List;
+
+public interface DeviceGateway {
+
+
+    HomeInfoDTO queryHomeInfo(Long userId);
+
+    List<DeviceDTO> queryDeviceList(DeviceListParams request);
+
+    Boolean deviceUnBind(Long userId,String deviceId);
+
+    Boolean deviceBind(DeviceBandingParams request);
+
+    DeviceDTO queryDeviceById(String deviceId);
+
+    PageRecord<EventListDTO> queryEventByPage(EventListParams request);
+
+    Boolean handleEvent(Long eventId);
+
+    Boolean updateDevice(DeviceBandingParams request);
+
+    Boolean updateDeviceLocation(DeviceLocationParams params);
+
+}

+ 35 - 0
device-service-domain/src/main/java/com/hfln/device/domain/gateway/UserGateway.java

@@ -0,0 +1,35 @@
+package com.hfln.device.domain.gateway;
+
+import com.hfln.device.common.dto.data.user.UserDto;
+import com.hfln.device.common.request.user.LoginBySmsCodeParams;
+import com.hfln.device.common.request.user.UserLoginParams;
+import com.hfln.device.common.request.user.UserSignupParams;
+import com.hfln.device.common.request.user.UserUpdatePasswordParams;
+
+public interface UserGateway {
+
+
+    String getOpenId(String code);
+
+
+    Boolean signup(UserSignupParams request);
+
+
+    Boolean checkOpenId(String openId);
+
+
+    UserDto loginBySmsCode(LoginBySmsCodeParams request);
+
+
+    UserDto loginByPassword(UserLoginParams request);
+
+
+    String getUserPhone(String code);
+
+
+    void test();
+
+
+    void updatePassword(UserUpdatePasswordParams request);
+
+}

+ 15 - 0
device-service-domain/src/main/java/com/hfln/device/domain/gateway/sms/SmsGateway.java

@@ -0,0 +1,15 @@
+package com.hfln.device.domain.gateway.sms;
+
+/**
+ * 验证码相关
+ */
+public interface SmsGateway {
+
+    Boolean sendLoginSmsCode(String phone);
+
+
+    Boolean sendSignupSmsCode(String phone);
+
+
+
+}

+ 9 - 0
device-service-domain/src/test/java/com/hfln/device/domain/CustomerEntityTest.java

@@ -0,0 +1,9 @@
+package com.hfln.device.domain;
+
+
+public class CustomerEntityTest {
+
+    public void testCustomerConflict() {
+        System.out.println("Please mock gateway, test pure Domain Knowledge");
+    }
+}

+ 87 - 0
device-service-infrastructure/pom.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.hfln.device</groupId>
+        <artifactId>hfln-device-service</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>device-service-infrastructure</artifactId>
+    <packaging>jar</packaging>
+    <name>device-service-infrastructure</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.hfln.device</groupId>
+            <artifactId>device-service-domain</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>hfln-framework-exception</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hfln.framework</groupId>
+            <artifactId>knife4j-doc-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct-processor</artifactId>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.10.0</version>
+                    <configuration>
+                        <source>1.8</source>
+                        <target>1.8</target>
+                        <annotationProcessorPaths>
+                            <path>
+                                <groupId>org.mapstruct</groupId>
+                                <artifactId>mapstruct-processor</artifactId>
+                                <version>1.5.3.Final</version>
+                            </path>
+                            <path>
+                                <groupId>org.projectlombok</groupId>
+                                <artifactId>lombok</artifactId>
+                                <version>1.18.38</version>
+                            </path>
+                            <path>
+                                <groupId>org.projectlombok</groupId>
+                                <artifactId>lombok-mapstruct-binding</artifactId>
+                                <version>0.2.0</version>
+                            </path>
+                        </annotationProcessorPaths>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+
+</project>

+ 5 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/DiamondConfig.java

@@ -0,0 +1,5 @@
+package com.hfln.device.infrastructure.config;
+
+public class DiamondConfig {
+    public final static String DummyConfig = "DummyConfig";
+}

+ 108 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/GlobalExceptionHandler.java

@@ -0,0 +1,108 @@
+package com.hfln.device.infrastructure.config;
+
+import cn.hfln.framework.dto.ApiResult;
+import cn.hfln.framework.extension.BizException;
+import com.alibaba.csp.sentinel.Tracer;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BindException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 全局异常处理器
+ *
+ * @author yangliu
+ */
+@Slf4j
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    private final String defaultErrorMsg = "系统繁忙!";
+
+    /**
+     * 请求方式不支持
+     */
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
+    public ApiResult<?> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
+                                                         HttpServletRequest request) {
+        Tracer.trace(e);
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
+        return ApiResult.failed("405", "请求方式不支持");
+    }
+
+    /**
+     * 业务异常
+     */
+    @ExceptionHandler(BizException.class)
+    @ResponseStatus(HttpStatus.OK)
+    public ApiResult<?> handleServiceException(BizException e, HttpServletRequest request) {
+//        log.error(e.getMessage(), e);
+//        Tracer.trace(e);
+        return ApiResult.failed(e.getErrCode(), e.getMessage());
+    }
+
+
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    public ApiResult<?> handleRuntimeException(RuntimeException e, HttpServletRequest request) {
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',发生未知异常.", requestURI, e);
+        Tracer.trace(e);
+        return ApiResult.failed("500", defaultErrorMsg);
+    }
+
+    /**
+     * 系统异常
+     */
+    @ExceptionHandler(Exception.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    public ApiResult<?> handleException(Exception e, HttpServletRequest request) {
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',发生系统异常.", requestURI, e);
+        Tracer.trace(e);
+        return ApiResult.failed("500", defaultErrorMsg);
+    }
+
+    /**
+     * 自定义验证异常
+     */
+    @ExceptionHandler(BindException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public ApiResult<?> handleBindException(BindException e) {
+        log.error("参数绑定异常: {}", e.getMessage(), e);
+        Tracer.trace(e);
+        // 提取字段校验错误信息
+        String errorMessage = e.getBindingResult().getAllErrors().stream()
+                .map(err -> err.getDefaultMessage())
+                .findFirst()
+                .orElse(defaultErrorMsg);
+        return ApiResult.validateFailed(errorMessage);
+    }
+
+    /**
+     * 自定义验证异常
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public ApiResult<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
+        log.error("参数校验异常: {}", e.getMessage(), e);
+        Tracer.trace(e);
+        String errorMessage = e.getBindingResult().getAllErrors().stream()
+                .map(err -> err.getDefaultMessage())
+                .findFirst()
+                .orElse(defaultErrorMsg);
+        return ApiResult.validateFailed(errorMessage);
+    }
+}

+ 38 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/MybatisPlusConfig.java

@@ -0,0 +1,38 @@
+package com.hfln.device.infrastructure.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 分页#配置
+ * @author huolifu
+ * @date 2023/10/18 17:52
+ **/
+@Configuration
+@EnableTransactionManagement
+public class MybatisPlusConfig {
+
+    /**
+     * 分页插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+
+    /**
+     * 审计字段自动填充
+     * @return {@link MetaObjectHandler}
+     */
+//    @Bean
+//    public MybatisPlusMetaObjectHandler mybatisPlusMetaObjectHandler() {
+//        return new MybatisPlusMetaObjectHandler();
+//    }
+}

+ 76 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/MybatisPlusMetaObjectHandler.java

@@ -0,0 +1,76 @@
+//package com.hfln.device.infrastructure.config;
+//
+//import cn.hutool.core.util.StrUtil;
+//import cn.hfln.framework.common.security.LoginUser;
+//import cn.hfln.framework.common.security.utils.SecurityUtils;
+//import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.ibatis.reflection.MetaObject;
+//import org.springframework.util.ClassUtils;
+//
+//import java.nio.charset.Charset;
+//import java.util.Date;
+//
+///**
+// * MybatisPlus 自动填充配置
+// *
+// */
+//@Slf4j
+//public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {
+//
+//	@Override
+//	public void insertFill(MetaObject metaObject) {
+//		log.debug("mybatis plus start insert fill ....");
+//		Date now = new Date();
+//
+//		fillValIfNullByName("createTime", now, metaObject, false);
+//		fillValIfNullByName("updateTime", now, metaObject, false);
+//		fillValIfNullByName("createBy", getUserName(), metaObject, false);
+//		fillValIfNullByName("updateBy", getUserName(), metaObject, false);
+//	}
+//
+//	@Override
+//	public void updateFill(MetaObject metaObject) {
+//		log.debug("mybatis plus start update fill ....");
+//		fillValIfNullByName("updateTime", new Date(), metaObject, true);
+//		fillValIfNullByName("updateBy", getUserName(), metaObject, true);
+//	}
+//
+//	/**
+//	 * 填充值,先判断是否有手动设置,优先手动设置的值,例如:job必须手动设置
+//	 * @param fieldName 属性名
+//	 * @param fieldVal 属性值
+//	 * @param metaObject MetaObject
+//	 * @param isCover 是否覆盖原有值,避免更新操作手动入参
+//	 */
+//	private static void fillValIfNullByName(String fieldName, Object fieldVal, MetaObject metaObject, boolean isCover) {
+//		// 1. 没有 set 方法
+//		if (!metaObject.hasSetter(fieldName)) {
+//			return;
+//		}
+//		// 2. 如果用户有手动设置的值
+//		Object userSetValue = metaObject.getValue(fieldName);
+//		String setValueStr = StrUtil.str(userSetValue, Charset.defaultCharset());
+//		if (StrUtil.isNotBlank(setValueStr) && !isCover) {
+//			return;
+//		}
+//		// 3. field 类型相同时设置
+//		Class<?> getterType = metaObject.getGetterType(fieldName);
+//		if (ClassUtils.isAssignableValue(getterType, fieldVal)) {
+//			metaObject.setValue(fieldName, fieldVal);
+//		}
+//	}
+//
+//	/**
+//	 * 获取 spring security 当前的用户名
+//	 * @return 当前用户名
+//	 */
+//	private String getUserName() {
+//		LoginUser loginUser = SecurityUtils.getLoginUser();
+//		if (loginUser == null){
+//			return "";
+//		}
+//		return loginUser.getUsername();
+//	}
+//
+//}

+ 24 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/config/ObjectInjectConfig.java

@@ -0,0 +1,24 @@
+package com.hfln.device.infrastructure.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class ObjectInjectConfig {
+
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+
+
+    @Bean
+    public BCryptPasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+
+
+    
+}

+ 291 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/gateway/impl/DeviceGatewayImpl.java

@@ -0,0 +1,291 @@
+package com.hfln.device.infrastructure.gateway.impl;
+
+import cn.hfln.framework.extension.BizException;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hfln.device.common.dto.data.device.DeviceDTO;
+import com.hfln.device.common.dto.data.event.EventListDTO;
+import com.hfln.device.common.dto.data.home.HomeInfoDTO;
+import com.hfln.device.common.request.device.DeviceBandingParams;
+import com.hfln.device.common.request.device.DeviceListParams;
+import com.hfln.device.common.request.device.DeviceLocationParams;
+import com.hfln.device.common.request.event.EventListParams;
+import com.hfln.device.common.vo.PageRecord;
+import com.hfln.device.domain.event.MqttHandler;
+import com.hfln.device.domain.exception.ErrorEnum;
+import com.hfln.device.domain.gateway.DeviceGateway;
+import com.hfln.device.infrastructure.po.DevGroup;
+import com.hfln.device.infrastructure.po.DevInfo;
+import com.hfln.device.infrastructure.po.DevShare;
+import com.hfln.device.infrastructure.po.EventList;
+import com.hfln.device.infrastructure.service.*;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class DeviceGatewayImpl implements DeviceGateway {
+
+    @Autowired
+    private DevShareService devShareService;
+
+    @Autowired
+    private DevInfoService devInfoService;
+
+    @Autowired
+    private GroupShareService groupShareService;
+
+    @Autowired
+    private DevGroupService devGroupService;
+
+    @Autowired
+    private EventService eventService;
+
+    @Autowired
+    private MqttHandler mqttHandler;
+
+    @Override
+    public HomeInfoDTO queryHomeInfo(Long userId) {
+        HomeInfoDTO homeInfoDTO = new HomeInfoDTO();
+        //todo 添加轮播图相关信息
+        homeInfoDTO.setCarouselImage(null);
+        /*
+          查询设备详情
+         */
+        // 查询当前OpenId被分享的设备
+        Optional<List<String>> sharedDevIds = devShareService.queryDeviceIdByUserId(userId);
+
+        List<DeviceDTO> deviceDTOs = new ArrayList<>();
+        List<DevInfo> devInfos = devInfoService.queryDeviceList(userId, null, null, sharedDevIds.orElse(Collections.emptyList()));
+
+        for (DevInfo devInfo : devInfos) {
+            DeviceDTO dto = new DeviceDTO();
+            BeanUtils.copyProperties(devInfo, dto);
+            deviceDTOs.add(dto);
+        }
+        homeInfoDTO.setDeviceList(deviceDTOs);
+
+        /*
+         * 查询群组数量
+         */
+        // 查询被分享群组
+        List<String> groupUUid = groupShareService.queryGroupUUidByUserId(userId);
+        List<DevGroup> devGroups = devGroupService.queryGroupByUserId(userId, groupUUid);
+        homeInfoDTO.setGroupNum(devGroups.size());
+
+        /*
+         * 查询被分享数量
+         */
+        homeInfoDTO.setShareNum(devShareService.querySharedNumByUserId(userId).size());
+
+        return homeInfoDTO;
+    }
+
+
+    @Override
+    public List<DeviceDTO> queryDeviceList(DeviceListParams request) {
+
+        Optional<List<String>> sharedDevIds = devShareService.queryDeviceIdByUserId(request.getUserId());
+
+        List<DeviceDTO> deviceDTOs = new ArrayList<>();
+        List<DevInfo> devInfos = devInfoService.queryDeviceList(request.getUserId(), request.getKeyWord(),
+                request.getStatus(), sharedDevIds.orElse(Collections.emptyList()));
+
+        for (DevInfo devInfo : devInfos) {
+            DeviceDTO dto = new DeviceDTO();
+            BeanUtils.copyProperties(devInfo, dto);
+            deviceDTOs.add(dto);
+        }
+        return deviceDTOs;
+    }
+
+    @Override
+    @Transactional
+    public Boolean deviceUnBind(Long userId, String deviceId) {
+        List<DevInfo> devInfos = devInfoService.queryDevices(userId, deviceId);
+        boolean updateFlag;
+        // 绑定人解绑
+        if (CollectionUtils.isNotEmpty(devInfos) && !devInfos.isEmpty()) {
+            //更新设备表
+            boolean flag = devInfoService.update(null,
+                    Wrappers.<DevInfo>lambdaUpdate()
+                            .set(DevInfo::getUserId, null)
+                            .eq(DevInfo::getDevId, deviceId));
+            //更新设备分享表
+            boolean flagV2 = devShareService.update(null,
+                    Wrappers.<DevShare>lambdaUpdate()
+                            .set(DevShare::getState, 0)
+                            .set(DevShare::getIsDeleted, 1)
+                            .eq(DevShare::getDevId, deviceId));
+            updateFlag = flag && flagV2;
+        } else {
+            // 被分享者解绑
+            updateFlag = devShareService.update(null,
+                    Wrappers.<DevShare>lambdaUpdate()
+                            .set(DevShare::getState, 0)
+                            .set(DevShare::getIsDeleted, 1)
+                            .eq(DevShare::getDevId, deviceId)
+                            .eq(DevShare::getSharedUserId, userId));
+        }
+
+        return updateFlag;
+    }
+
+
+    @Override
+    public Boolean deviceBind(DeviceBandingParams request) {
+        // 1. 检查设备是否存在
+        DevInfo devInfo = devInfoService.getOne(
+                Wrappers.<DevInfo>lambdaQuery()
+                        .eq(DevInfo::getDevId, request.getDevId())
+        );
+        if (Objects.isNull(devInfo)) {
+            throw new BizException(ErrorEnum.DEVICE_IS_NOT_EXIST.getErrorCode(), ErrorEnum.DEVICE_IS_NOT_EXIST.getErrorMessage());
+        }
+        if (Objects.nonNull(devInfo.getUserId())) {
+            throw new BizException(ErrorEnum.DEVICE_IS_BINDING.getErrorCode(), ErrorEnum.DEVICE_IS_BINDING.getErrorMessage());
+        }
+
+        // 3. 更新设备信息
+        return devInfoService.updateDevice(devInfo.getDevInfoId(), request);
+    }
+
+
+    @Override
+    public DeviceDTO queryDeviceById(String deviceId) {
+        DevInfo devInfo = devInfoService.getOne(
+                Wrappers.<DevInfo>lambdaQuery()
+                        .eq(DevInfo::getDevId, deviceId));
+        if (Objects.isNull(devInfo)) {
+            throw new BizException(ErrorEnum.DEVICE_IS_NOT_EXIST.getErrorCode(), ErrorEnum.DEVICE_IS_NOT_EXIST.getErrorMessage());
+        }
+        DeviceDTO dto = new DeviceDTO();
+        BeanUtils.copyProperties(devInfo, dto);
+        return dto;
+    }
+
+
+    @Override
+    public PageRecord<EventListDTO> queryEventByPage(EventListParams request) {
+        Integer pageNo = Optional.ofNullable(request.getPageNo()).orElse(1);
+        Integer pageSize = Optional.ofNullable(request.getPageNo()).orElse(10);
+
+        // 执行分页查询
+        Page<EventList> eventPage = eventService.queryEventListByDevId(request.getDeviceId(),
+                request.getStartTime(), request.getEndTime(), pageNo, pageSize);
+        // 换为目标VO
+        List<EventListDTO> targets = convertToTargetVO(eventPage.getRecords());
+        return getEventListDTOPageRecord(eventPage, targets);
+    }
+
+    // 填充PageRecord
+    private PageRecord<EventListDTO> getEventListDTOPageRecord(Page<EventList> eventPage, List<EventListDTO> targets) {
+        int totalPages = (int) Math.ceil((double) eventPage.getTotal() / eventPage.getSize());
+        PageRecord<EventListDTO> pageRecord = new PageRecord<>();
+        pageRecord.setRows(targets);
+        pageRecord.setTotal(eventPage.getTotal());
+        pageRecord.setPageNum((int) eventPage.getCurrent());
+        pageRecord.setPageSize((int) eventPage.getSize());
+        pageRecord.setOutTotalPageNum(eventPage.getCurrent() > totalPages);
+        pageRecord.setTotalPageNum(totalPages);
+        return pageRecord;
+    }
+
+    // 实体转换方法
+    private List<EventListDTO> convertToTargetVO(List<EventList> records) {
+        return records.stream().map(event -> {
+            EventListDTO vo = new EventListDTO();
+            // 使用BeanUtils简化属性拷贝
+            BeanUtils.copyProperties(event, vo);
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+
+    @Override
+    public Boolean handleEvent(Long eventId) {
+        LambdaUpdateWrapper<EventList> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(EventList::getEventListId, eventId)
+                .set(EventList::getIsHandle, 1);
+        return this.eventService.update(updateWrapper);
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateDevice(DeviceBandingParams request) {
+        // 1. 安全获取长度和宽度,提供默认值
+        BigDecimal length = Optional.ofNullable(request.getLength()).orElse(BigDecimal.ZERO);
+        BigDecimal width = Optional.ofNullable(request.getWidth()).orElse(BigDecimal.ZERO);
+
+        // 2. 计算半长半宽
+        BigDecimal halfLength = length.divide(BigDecimal.valueOf(2), 10, RoundingMode.HALF_UP);
+        BigDecimal halfWidth = width.divide(BigDecimal.valueOf(2), 10, RoundingMode.HALF_UP);
+
+        // 3. 设置默认值
+        setIfNull(request::getXStart, () -> halfLength, request::setXStart);
+        setIfNull(request::getXEnd, () -> halfLength, request::setXEnd);
+        setIfNull(request::getYStart, () -> halfWidth, request::setYStart);
+        setIfNull(request::getYEnd, () -> halfWidth, request::setYEnd);
+
+
+        Boolean flag = devInfoService.updateDevice(request.getDevId(), request);
+        DevInfo devInfo = devInfoService.getOne(
+                Wrappers.<DevInfo>lambdaQuery()
+                        .eq(DevInfo::getDevId, request.getDevId()));
+
+        //检查parts.length >= 2确保数组有足够元素,提供默认值"2.0"
+        String result = Optional.ofNullable(devInfo.getSoftware())
+                .filter(s -> s.contains("."))
+                .map(s -> s.split("\\."))
+                .filter(parts -> parts.length >= 2)
+                .map(parts -> parts[0] + "." + parts[1])
+                .orElse("2.0");
+
+        mqttHandler.handleDeviceUpdateMessage(result, request);
+        return flag;
+    }
+
+
+    // 辅助方法:如果值为null则设置默认值
+    private <T> void setIfNull(java.util.function.Supplier<T> getter,
+                               java.util.function.Supplier<T> defaultValueSupplier,
+                               java.util.function.Consumer<T> setter) {
+        if (getter.get() == null) {
+            setter.accept(defaultValueSupplier.get());
+        }
+    }
+
+
+    @Override
+    public Boolean updateDeviceLocation(DeviceLocationParams params) {
+
+        DevInfo devInfo = devInfoService.getOne(
+                Wrappers.<DevInfo>lambdaQuery()
+                        .eq(DevInfo::getDevId, params.getDeviceId()));
+        if (Objects.isNull(devInfo)) {
+            throw new BizException(ErrorEnum.DEVICE_IS_NOT_EXIST.getErrorCode(), ErrorEnum.DEVICE_IS_NOT_EXIST.getErrorMessage());
+        }
+        LambdaUpdateWrapper<DevInfo> updateWrapper = Wrappers.lambdaUpdate();
+        // 仅当字段非空时才更新
+        if (Objects.nonNull(params.getXValue())) {
+            updateWrapper.set(DevInfo::getX, params.getXValue());
+        }
+        if (Objects.nonNull(params.getYValue())) {
+            updateWrapper.set(DevInfo::getY, params.getYValue());
+        }
+        // 如果所有字段均为空,无需更新
+        if (params.getXValue() == null && params.getYValue() == null) {
+            return false;
+        }
+        return devInfoService.update(updateWrapper);
+    }
+}

+ 208 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/gateway/impl/UserGatewayImpl.java

@@ -0,0 +1,208 @@
+package com.hfln.device.infrastructure.gateway.impl;
+
+
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hfln.framework.common.redis.service.RedisService;
+import cn.hfln.framework.extension.BizException;
+import com.alibaba.fastjson2.JSONObject;
+import com.hfln.device.common.constant.redis.RedisCacheConstant;
+import com.hfln.device.common.dto.data.user.UserDto;
+import com.hfln.device.common.request.user.LoginBySmsCodeParams;
+import com.hfln.device.common.request.user.UserLoginParams;
+import com.hfln.device.common.request.user.UserSignupParams;
+import com.hfln.device.common.request.user.UserUpdatePasswordParams;
+import com.hfln.device.domain.customer.util.PasswordUtil;
+import com.hfln.device.domain.exception.ErrorEnum;
+import com.hfln.device.domain.gateway.UserGateway;
+import com.hfln.device.infrastructure.mapper.UserInfoMapper;
+import com.hfln.device.infrastructure.po.UserInfo;
+import com.hfln.device.infrastructure.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Objects;
+
+@Service
+@Slf4j
+public class UserGatewayImpl implements UserGateway {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private UserInfoMapper userInfoMapper;
+
+    @Autowired
+    private UserService userService;
+
+    @Value("${lnxx.wechat.appid}")
+    private String appid;
+
+    @Value("${lnxx.wechat.secret}")
+    private String secret;
+
+
+
+
+    public static String WXX_CX_ACCESS_TOKEN = "";
+
+    @Override
+    public String getOpenId(String code) {
+        if (StringUtils.isEmpty(code)) {
+            throw new BizException(ErrorEnum.WECHAT_CODE_ISNULL.getErrorCode(), ErrorEnum.WECHAT_CODE_ISNULL.getErrorMessage());
+        }
+        String url = String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appid, secret, code);
+        try {
+            String res = restTemplate.getForObject(url, String.class);
+            JSONObject obj = JSONObject.parseObject(res);
+            return Objects.requireNonNull(obj).getString("openid");
+        } catch (Exception e) {
+            log.error("微信登录接口异常", e);
+            throw new BizException(ErrorEnum.WECHAT_INTERFACE_CALL_EXCEPTION.getErrorCode(), ErrorEnum.WECHAT_INTERFACE_CALL_EXCEPTION.getErrorMessage());
+        }
+    }
+
+    @Override
+    public Boolean signup(UserSignupParams request) {
+        //校验验证码
+        String cacheCode = redisService.getCacheObject(RedisCacheConstant.SMS_SIGNUP_CODE + request.getPhone());
+        if (Objects.isNull(cacheCode)) {
+            throw new BizException(ErrorEnum.SMS_CODE_EXPIRED.getErrorCode(), ErrorEnum.SMS_CODE_EXPIRED.getErrorMessage());
+        }
+        if (!Objects.equals(cacheCode, request.getCode())) {
+            throw new BizException(ErrorEnum.SMS_CODE_ERROR.getErrorCode(), ErrorEnum.SMS_CODE_ERROR.getErrorMessage());
+
+        }
+        if (checkOpenId(request.getOpenId())) {
+            throw new BizException(ErrorEnum.USER_ALREADY_EXISTS.getErrorCode(), ErrorEnum.USER_ALREADY_EXISTS.getErrorMessage());
+        }
+        // 验证通过 清除验证码入库
+        redisService.deleteObject(RedisCacheConstant.SMS_SIGNUP_CODE + request.getPhone());
+        UserInfo user = new UserInfo();
+        user.setPhone(request.getPhone());
+        String encryptedPassword = PasswordUtil.encrypt(request.getPassword());
+        user.setPassword(encryptedPassword);
+        user.setOpenid(request.getOpenId());
+        userInfoMapper.insert(user);
+        return true;
+    }
+
+
+    @Override
+    public Boolean checkOpenId(String openId) {
+        return userService.checkOpenId(openId);
+    }
+
+    @Override
+    public UserDto loginBySmsCode(LoginBySmsCodeParams request) {
+        UserDto userDto = new UserDto();
+        String phone = request.getUserName();
+        UserInfo user = userService.checkUserByPassword(phone, null);
+        if (Objects.nonNull(user)) {
+            String cacheSmsCode = redisService.getCacheObject(RedisCacheConstant.SMS_LOGIN_CODE + phone);
+            if (Objects.isNull(cacheSmsCode)) {
+                throw new BizException(ErrorEnum.SMS_CODE_EXPIRED.getErrorCode(), ErrorEnum.SMS_CODE_EXPIRED.getErrorMessage());
+            }
+            if (!Objects.equals(request.getSmsCode(), cacheSmsCode)) {
+                throw new BizException(ErrorEnum.SMS_CODE_ERROR.getErrorCode(), ErrorEnum.SMS_CODE_ERROR.getErrorMessage());
+            }
+            redisService.deleteObject(RedisCacheConstant.SMS_LOGIN_CODE + phone);
+        }
+        BeanUtils.copyProperties(user, userDto);
+        userDto.setUserId(user.getUserInfoId()
+        );
+
+        /*
+        通过sa-token获取token
+         */
+        StpUtil.login(user.getUserInfoId());
+        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
+
+        return userDto;
+    }
+
+
+    @Override
+    public UserDto loginByPassword(UserLoginParams request) {
+        UserDto userDto = new UserDto();
+        UserInfo user = userService.checkUserByPassword(request.getUserName(), request.getPassword());
+        if (Objects.isNull(user)) {
+            throw new BizException(ErrorEnum.USERNAME_OR_PASSWORD_ERROR.getErrorCode(), ErrorEnum.USERNAME_OR_PASSWORD_ERROR.getErrorMessage());
+        }
+        BeanUtils.copyProperties(user, userDto);
+        userDto.setUserId(user.getUserInfoId());
+        return userDto;
+    }
+
+
+    @Override
+    public String getUserPhone(String code) {
+        if (StringUtils.isEmpty(code)) {
+            throw new BizException(ErrorEnum.WECHAT_CODE_ISNULL.getErrorCode(), ErrorEnum.WECHAT_CODE_ISNULL.getErrorMessage());
+        }
+        try {
+            String url = String.format("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s", WXX_CX_ACCESS_TOKEN);
+
+            // 构建请求体
+            JSONObject param = new JSONObject();
+            param.put("code", code);
+
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<String> request = new HttpEntity<>(param.toJSONString(), headers);
+
+            // 发起请求
+            String response = restTemplate.postForObject(url, request, String.class);
+            JSONObject json = JSONObject.parseObject(response);
+
+            // 判断微信返回是否成功
+            if (Objects.requireNonNull(json).getIntValue("errcode") == 0) {
+                return json.getJSONObject("phone_info").getString("phoneNumber");
+            } else {
+                log.error("获取手机号失败,微信返回:{}", json.toJSONString());
+                throw new BizException(ErrorEnum.WECHAT_INTERFACE_CALL_EXCEPTION.getErrorCode(), ErrorEnum.WECHAT_INTERFACE_CALL_EXCEPTION.getErrorMessage());
+            }
+        } catch (Exception e) {
+            log.error("调用微信接口异常", e);
+            throw new BizException(ErrorEnum.WECHAT_INTERFACE_CALL_EXCEPTION.getErrorCode(), ErrorEnum.WECHAT_INTERFACE_CALL_EXCEPTION.getErrorMessage());
+        }
+    }
+
+    @Override
+    // @MqttSubscribes(value = {})
+    public void test() {
+//        mqttPublisher.send("test", "test1");
+    }
+
+
+    @Override
+    public void updatePassword(UserUpdatePasswordParams request) {
+        if (request.getNewPassword().equals(request.getOldPassword())) {
+            throw new BizException(ErrorEnum.PASSWORD_IS_REPEAT.getErrorCode(), ErrorEnum.PASSWORD_IS_REPEAT.getErrorMessage());
+        }
+
+        UserInfo userInfo = userService.getById(request.getUserId());
+        if (Objects.isNull(userInfo)) {
+            throw new BizException(ErrorEnum.USER_IS_NOT_EXIST.getErrorCode(), ErrorEnum.USER_IS_NOT_EXIST.getErrorMessage());
+        }
+        if (!PasswordUtil.matches(request.getOldPassword(), userInfo.getPassword())) {
+            throw new BizException(ErrorEnum.OLD_PASSWORD_ERROR.getErrorCode(), ErrorEnum.OLD_PASSWORD_ERROR.getErrorMessage());
+        }
+        UserInfo info = new UserInfo();
+        info.setUserInfoId(request.getUserId());
+        info.setPassword(request.getNewPassword());
+        userService.updateById(userInfo);
+    }
+}

+ 65 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/gateway/impl/sms/SmsGatewayImpl.java

@@ -0,0 +1,65 @@
+package com.hfln.device.infrastructure.gateway.impl.sms;
+
+import cn.hfln.framework.common.redis.service.RedisService;
+import cn.hfln.framework.extension.BizException;
+import com.hfln.device.common.constant.redis.RedisCacheConstant;
+import com.hfln.device.domain.customer.util.MsgClient;
+import com.hfln.device.domain.exception.ErrorEnum;
+import com.hfln.device.domain.gateway.sms.SmsGateway;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class SmsGatewayImpl implements SmsGateway {
+
+
+    @Autowired
+    private MsgClient msgClient;
+
+    @Autowired
+    private RedisService redisService;
+
+
+    @Override
+    public Boolean sendLoginSmsCode(String phone) {
+        // 限制短信发送不超过一分钟一次
+        String key = RedisCacheConstant.SMS_SEND_LOGIN_TIME + phone;
+        Boolean hasKey = redisService.hasKey(key);
+        if (hasKey) {
+            throw new BizException(ErrorEnum.FREQUENT_SMS_SENDING.getErrorCode(), ErrorEnum.FREQUENT_SMS_SENDING.getErrorMessage());
+        }
+        redisService.setCacheObject(key, 1, 1L, TimeUnit.MINUTES);
+        int captcha = (int) ((Math.random() * 9 + 1) * 1000);
+        String sentLoginMsg = msgClient.sendLoginMsg(phone, String.valueOf(captcha));
+        if (Objects.nonNull(sentLoginMsg)) {
+            // 存入redis  过期时间十分钟
+            redisService.setCacheObject(RedisCacheConstant.SMS_LOGIN_CODE + phone, captcha,10L, TimeUnit.MINUTES);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean sendSignupSmsCode(String phone) {
+        // 限制短信发送不超过一分钟一次
+        String key = RedisCacheConstant.SMS_SEND_SIGNUP_TIME + phone;
+        Boolean hasKey = redisService.hasKey(key);
+        if (hasKey) {
+            throw new BizException(ErrorEnum.FREQUENT_SMS_SENDING.getErrorCode(), ErrorEnum.FREQUENT_SMS_SENDING.getErrorMessage());
+        }
+        int captcha = (int) ((Math.random() * 9 + 1) * 1000);
+        String sentLoginMsg = msgClient.sendRegisterMsg(phone, String.valueOf(captcha));
+        if (Objects.nonNull(sentLoginMsg)) {
+            // 存入redis  过期时间十分钟
+            redisService.setCacheObject(RedisCacheConstant.SMS_SIGNUP_CODE + phone, captcha,10L, TimeUnit.MINUTES);
+            return true;
+        }
+        return false;
+    }
+
+
+
+}

+ 15 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/ClientUserMapper.java

@@ -0,0 +1,15 @@
+//package com.hfln.device.infrastructure.mapper;
+//
+//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+//import com.hfln.device.infrastructure.po.ClientUserPO;
+//import org.apache.ibatis.annotations.Mapper;
+//
+///**
+// * 客户表Mapper
+// *
+// * @author huolifu
+// * @date 2023/10/30 16:43
+// **/
+//@Mapper
+//public interface ClientUserMapper extends BaseMapper<ClientUserPO> {
+//}

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevGroupMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.DevGroup;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 设备群组表 Mapper 接口
+ */
+@Mapper
+public interface DevGroupMapper extends BaseMapper<DevGroup> {
+}

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevInfoMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.DevInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 设备信息表 Mapper 接口
+ */
+@Mapper
+public interface DevInfoMapper extends BaseMapper<DevInfo> {
+}

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevRoomMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.DevRoom;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 设备房间表 Mapper 接口
+ */
+@Mapper
+public interface DevRoomMapper extends BaseMapper<DevRoom> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevShareMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.DevShare;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 设备分享表 Mapper 接口
+ */
+@Mapper
+public interface DevShareMapper extends BaseMapper<DevShare> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/DevTargetMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.DevTarget;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 设备目标表 Mapper 接口
+ */
+@Mapper
+public interface DevTargetMapper extends BaseMapper<DevTarget> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/EventListMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.EventList;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 事件列表表 Mapper 接口
+ */
+@Mapper
+public interface EventListMapper extends BaseMapper<EventList> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/GroupDevMapMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.GroupDevMap;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 群组设备映射表 Mapper 接口
+ */
+@Mapper
+public interface GroupDevMapMapper extends BaseMapper<GroupDevMap> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/GroupFloorplanMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.GroupFloorPlan;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 群组平面图表 Mapper 接口
+ */
+@Mapper
+public interface GroupFloorplanMapper extends BaseMapper<GroupFloorPlan> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/GroupShareMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.GroupShare;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 群组分享表 Mapper 接口
+ */
+@Mapper
+public interface GroupShareMapper extends BaseMapper<GroupShare> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/RecordPlanMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.RecordPlan;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 录制计划表 Mapper 接口
+ */
+@Mapper
+public interface RecordPlanMapper extends BaseMapper<RecordPlan> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/RecordPlanTimeMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.RecordPlanTime;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 录制计划时间表 Mapper 接口
+ */
+@Mapper
+public interface RecordPlanTimeMapper extends BaseMapper<RecordPlanTime> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/StatInfoMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.StatInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 停留时间表 Mapper 接口
+ */
+@Mapper
+public interface StatInfoMapper extends BaseMapper<StatInfo> {
+}

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/StayTimeMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.StayTime;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 停留时间表 Mapper 接口
+ */
+@Mapper
+public interface StayTimeMapper extends BaseMapper<StayTime> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblMenuMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.TblMenu;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 菜单表 Mapper 接口
+ */
+@Mapper
+public interface TblMenuMapper extends BaseMapper<TblMenu> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblOprLogMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.TblOprLog;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 操作日志表 Mapper 接口
+ */
+@Mapper
+public interface TblOprLogMapper extends BaseMapper<TblOprLog> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblOrgMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.TblOrg;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 组织机构表 Mapper 接口
+ */
+@Mapper
+public interface TblOrgMapper extends BaseMapper<TblOrg> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblParameterMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.TblParameter;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 参数配置表 Mapper 接口
+ */
+@Mapper
+public interface TblParameterMapper extends BaseMapper<TblParameter> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblRoleMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.TblRole;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 角色表 Mapper 接口
+ */
+@Mapper
+public interface TblRoleMapper extends BaseMapper<TblRole> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblUserRoleMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.TblUserRole;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户角色关联表 Mapper 接口
+ */
+@Mapper
+public interface TblUserRoleMapper extends BaseMapper<TblUserRole> {
+} 

+ 12 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/TblWxpaycertMapper.java

@@ -0,0 +1,12 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.TblWxpaycert;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 微信支付证书表 Mapper 接口
+ */
+@Mapper
+public interface TblWxpaycertMapper extends BaseMapper<TblWxpaycert> {
+} 

+ 9 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/mapper/UserInfoMapper.java

@@ -0,0 +1,9 @@
+package com.hfln.device.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hfln.device.infrastructure.po.UserInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface UserInfoMapper extends BaseMapper<UserInfo> {
+}

+ 5 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/order/OrderGatewayImpl.java

@@ -0,0 +1,5 @@
+package com.hfln.device.infrastructure.order;
+
+public class OrderGatewayImpl{
+
+}

+ 58 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/BasePO.java

@@ -0,0 +1,58 @@
+package com.hfln.device.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.hfln.device.common.vo.BaseVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * 基础实体类
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class BasePO extends BaseVO {
+
+
+    /**
+     * 创建人
+     */
+    @TableField("create_id")
+    private String createId;
+
+
+    /**
+     * 修改人
+     */
+
+    @TableField("update_id")
+    private String updateId;
+    
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+    
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+    
+    /**
+     * 删除标记:0-未删除,1-已删除
+     */
+    @TableLogic
+    @TableField("is_deleted")
+    private Integer isDeleted;
+    
+    /**
+     * 删除标记常量
+     */
+    public static class DeleteFlag {
+        public static final int NOT_DELETED = 0;  // 未删除
+        public static final int DELETED = 1;      // 已删除
+    }
+} 

+ 63 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevGroup.java

@@ -0,0 +1,63 @@
+package com.hfln.device.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 设备群组表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("dev_group")
+public class DevGroup extends BasePO {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long devGroupId;
+
+    /**
+     * 群组UUID
+     */
+    @TableField("group_uuid")
+    private String groupUuid;
+
+    /**
+     * 群组名称
+     */
+    @TableField("group_name")
+    private String groupName;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 北向夹角
+     */
+    @TableField("north_angle")
+    private BigDecimal northAngle;
+
+    /**
+     * 长度
+     */
+    @TableField("length")
+    private BigDecimal length;
+
+    /**
+     * 宽度
+     */
+    @TableField("width")
+    private BigDecimal width;
+
+
+}

+ 221 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevInfo.java

@@ -0,0 +1,221 @@
+package com.hfln.device.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 设备信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("dev_info")
+public class DevInfo extends BasePO {
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "dev_info_id", type = IdType.ASSIGN_ID)
+    private Long devInfoId;
+
+    /**
+     * 设备ID
+     */
+    @TableField("dev_id")
+    private String devId;
+
+    /**
+     * 用户openid
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 设备名称
+     */
+    @TableField("dev_name")
+    private String devName;
+
+    /**
+     * 设备类型
+     */
+    @TableField("dev_type")
+    private String devType;
+
+    /**
+     * 在线状态:0-离线,1-在线
+     */
+    private Integer online;
+
+    /**
+     * 设备报警:0-正常,1-报警
+     */
+    @TableField("dev_warn")
+    private Integer devWarn;
+
+    /**
+     * 软件版本号
+     */
+    @TableField("software")
+    private String software;
+
+    /**
+     * 硬件版本号
+     */
+    @TableField("hardware")
+    private String hardware;
+
+    /**
+     * wifi名称
+     */
+    @TableField("wifi_name")
+    private String wifiName;
+
+    /**
+     * wifi密码
+     */
+    @TableField("wifi_password")
+    private String wifiPassword;
+
+    /**
+     * ip地址
+     */
+    @TableField("ip")
+    private String ip;
+
+    /**
+     * 安装方式:Wall-墙装,Ceiling-顶装
+     */
+    @TableField("mount_plain")
+    private String mountPlain;
+
+    /**
+     * 跟踪区域起始X坐标
+     */
+    @TableField("start_x")
+    private BigDecimal startX;
+
+    /**
+     * 跟踪区域起始Y坐标
+     */
+    @TableField("start_y")
+    private BigDecimal startY;
+
+    /**
+     * 跟踪区域起始Z坐标
+     */
+    @TableField("start_z")
+    private BigDecimal startZ;
+
+    /**
+     * 跟踪区域结束X坐标
+     */
+    @TableField("stop_x")
+    private BigDecimal stopX;
+
+    /**
+     * 跟踪区域结束Y坐标
+     */
+    @TableField("stop_y")
+    private BigDecimal stopY;
+
+    /**
+     * 跟踪区域结束Z坐标
+     */
+    @TableField("stop_z")
+    private BigDecimal stopZ;
+
+    /**
+     * 安装高度
+     */
+    @TableField("height")
+    private BigDecimal height;
+
+    /**
+     * 房间长度
+     */
+    @TableField("length")
+    private BigDecimal length;
+
+    /**
+     * 房间宽度
+     */
+    @TableField("width")
+    private BigDecimal width;
+
+    /**
+     * target数组
+     */
+    @TableField("target_points")
+    private Object targetPoints;
+
+    /**
+     * 接收target时间
+     */
+    @TableField("signal_time")
+    private LocalDateTime signalTime;
+
+    /**
+     * 北向夹角
+     */
+    @TableField("north_angle")
+    private BigDecimal northAngle;
+
+    /**
+     * 安装坐标x
+     */
+    @TableField("x")
+    private BigDecimal x;
+
+    /**
+     * 安装坐标y
+     */
+    @TableField("y")
+    private BigDecimal y;
+
+    /**
+     * 指示灯开关:0-关闭,1-开启
+     */
+    @TableField("status_light")
+    private Integer statusLight;
+
+    /**
+     * 设备信息常量类
+     */
+    public static class Constants {
+        
+        /**
+         * 在线状态
+         */
+        public static class OnlineStatus {
+            public static final int OFFLINE = 0;  // 离线
+            public static final int ONLINE = 1;   // 在线
+        }
+        
+        /**
+         * 设备报警状态
+         */
+        public static class DevWarnStatus {
+            public static final int NORMAL = 0;   // 正常
+            public static final int WARNING = 1;  // 报警
+        }
+        
+        /**
+         * 安装方式
+         */
+        public static class MountPlain {
+            public static final String WALL = "Wall";     // 墙装
+            public static final String CEILING = "Ceiling"; // 顶装
+        }
+        
+        /**
+         * 指示灯状态
+         */
+        public static class StatusLight {
+            public static final int OFF = 0;      // 关闭
+            public static final int ON = 1;       // 开启
+        }
+    }
+}

+ 53 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevRelation.java

@@ -0,0 +1,53 @@
+package com.hfln.device.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 设备关系表
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("dev_relation")
+public class DevRelation extends BasePO{
+    /**
+     * 主键ID
+     */
+    @TableId(value = "relation_id", type = IdType.ASSIGN_ID)
+    private Long relationId;
+
+    /**
+     * 设备Id
+     */
+    private String devId;
+
+    /**
+     * 姿态
+     */
+    private Integer pose;
+
+    /**
+     * x坐标
+     */
+    private BigDecimal xCoordinate;
+
+    /**
+     * y坐标
+     */
+    private BigDecimal yCoordinate;
+
+    /**
+     * z坐标
+     */
+    private BigDecimal zCoordinate;
+
+    /**
+     * 事件类型
+     */
+    private Integer eventType;
+}

+ 33 - 0
device-service-infrastructure/src/main/java/com/hfln/device/infrastructure/po/DevRoom.java

@@ -0,0 +1,33 @@
+package com.hfln.device.infrastructure.po;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 设备房间表
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("dev_room")
+public class DevRoom extends BasePO {
+    
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long devRoomId;
+    
+    /**
+     * 设备ID
+     */
+    @TableField("dev_id")
+    private String devId;
+    
+    /**
+     * 房间参数
+     */
+    @TableField("room_params")
+    private String roomParams;
+
+} 

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.