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

refactor(pms): 调整海康接口包结构及测试环境配置

Zimo 1 неделя назад
Родитель
Сommit
1242f3c007

+ 20 - 11
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/hikvision/HikvisionArtemisConfiguration.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/hikvision/HikvisionArtemisConfiguration.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.pms.hikvision;
+package cn.iocoder.yudao.module.pms.controller.admin.hikvision;
 
 import com.hikvision.artemis.sdk.config.ArtemisConfig;
 import org.springframework.beans.factory.annotation.Value;
@@ -11,10 +11,12 @@ import java.util.Map;
 /**
  * 海康 Artemis SDK 配置。
  *
- * <p>该配置类完成两件事:</p>
+ * <p>
+ * 该配置类完成两件事:
+ * </p>
  * <ol>
- *     <li>根据环境配置创建全局复用的 {@link ArtemisConfig} Bean;</li>
- *     <li>将环境中的 {@code hikvision.artemisPath} 与具体 API 地址拼接成 SDK 要求的请求路径 Map。</li>
+ * <li>根据环境配置创建全局复用的 {@link ArtemisConfig} Bean;</li>
+ * <li>将环境中的 {@code hikvision.artemisPath} 与具体 API 地址拼接成 SDK 要求的请求路径 Map。</li>
  * </ol>
  */
 @Configuration(proxyBeanMethods = false)
@@ -38,11 +40,13 @@ public class HikvisionArtemisConfiguration {
     /**
      * 创建海康 SDK 的全局单例配置。
      *
-     * <p>host、appKey 和 appSecret 在应用启动时从当前环境配置注入,之后由所有海康接口共同复用,
-     * 避免每次请求都重新创建和填写 {@link ArtemisConfig}。</p>
+     * <p>
+     * host、appKey 和 appSecret 在应用启动时从当前环境配置注入,之后由所有海康接口共同复用,
+     * 避免每次请求都重新创建和填写 {@link ArtemisConfig}。
+     * </p>
      *
-     * @param host Artemis 网关主机和端口,不包含协议和接口路径
-     * @param appKey 海康开放平台应用 Key
+     * @param host      Artemis 网关主机和端口,不包含协议和接口路径
+     * @param appKey    海康开放平台应用 Key
      * @param appSecret 海康开放平台应用 Secret
      * @return 配置完成的 Artemis SDK 对象
      */
@@ -61,13 +65,18 @@ public class HikvisionArtemisConfiguration {
     /**
      * 构建海康 SDK 请求所需的路径 Map。
      *
-     * <p>例如环境配置为 {@code artemisPath=/artemis},调用方传入
-     * {@code /api/resource/v2/regions/subRegions},最终得到:</p>
+     * <p>
+     * 例如环境配置为 {@code artemisPath=/artemis},调用方传入
+     * {@code /api/resource/v2/regions/subRegions},最终得到:
+     * </p>
+     *
      * <pre>{@code
      * {"https://": "/artemis/api/resource/v2/regions/subRegions"}
      * }</pre>
      *
-     * <p>调用方传入的 address 必须以 {@code /} 开头,否则两个路径直接拼接后会缺少分隔符。</p>
+     * <p>
+     * 调用方传入的 address 必须以 {@code /} 开头,否则两个路径直接拼接后会缺少分隔符。
+     * </p>
      *
      * @param address 不包含 artemisPath 的海康 API 地址
      * @return 以 {@code https://} 为 key、完整 Artemis 请求路径为 value 的不可变 Map

+ 7 - 7
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/hikvision/HikvisionController.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/hikvision/HikvisionController.java

@@ -1,8 +1,8 @@
-package cn.iocoder.yudao.module.pms.hikvision;
+package cn.iocoder.yudao.module.pms.controller.admin.hikvision;
 
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.module.pms.hikvision.vo.HikvisionTreeNodeRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.hikvision.vo.HikvisionTreeNodeRespVO;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -84,9 +84,7 @@ public class HikvisionController {
     @GetMapping("/tree")
     @Operation(summary = "获取海康区域和监控点懒加载树")
     public CommonResult<List<HikvisionTreeNodeRespVO>> treeChildren(
-            @Parameter(description = "区域唯一标识;传 -1 加载根节点及其下一层", required = true)
-            @RequestParam("regionIndexCode")
-            @NotBlank(message = "区域编号不能为空") String regionIndexCode) {
+            @Parameter(description = "区域唯一标识;传 -1 加载根节点及其下一层", required = true) @RequestParam("regionIndexCode") @NotBlank(message = "区域编号不能为空") String regionIndexCode) {
         try {
             if ("-1".equals(regionIndexCode)) {
                 // 首次加载时保留根节点,并提前填充根节点的下一层 children。
@@ -245,9 +243,11 @@ public class HikvisionController {
     /**
      * 读取海康响应中的布尔字段,并在当前接口版本未返回该字段时使用业务默认值。
      *
-     * <p>{@link JSONObject#getBoolean(String)} 在字段不存在时返回 {@code null}。这里先保留接口的真实值,
+     * <p>
+     * {@link JSONObject#getBoolean(String)} 在字段不存在时返回 {@code null}。这里先保留接口的真实值,
      * 只有返回值为 {@code null} 时才使用默认值,避免把接口明确返回的 {@code false} 错误覆盖为
-     * {@code true}。</p>
+     * {@code true}。
+     * </p>
      *
      * @param source       海康接口返回的单个对象
      * @param fieldName    要读取的字段名称

+ 5 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/hikvision/vo/HikvisionTreeNodeRespVO.java → yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/hikvision/vo/HikvisionTreeNodeRespVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.pms.hikvision.vo;
+package cn.iocoder.yudao.module.pms.controller.admin.hikvision.vo;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -11,8 +11,10 @@ import java.util.List;
 /**
  * 区域树懒加载的统一节点结构。
  *
- * <p>海康的区域接口和资源接口返回的数据结构不同,该 VO 将两类数据统一为前端树组件可识别的格式。
- * 前端通过 {@link #nodeType} 区分区域和监控点:区域节点可以继续请求子节点,监控点节点用于触发视频播放。</p>
+ * <p>
+ * 海康的区域接口和资源接口返回的数据结构不同,该 VO 将两类数据统一为前端树组件可识别的格式。
+ * 前端通过 {@link #nodeType} 区分区域和监控点:区域节点可以继续请求子节点,监控点节点用于触发视频播放。
+ * </p>
  */
 @Schema(description = "管理后台 - Hikvision 懒加载树节点 Response VO")
 @JsonInclude(JsonInclude.Include.NON_NULL)

+ 123 - 19
yudao-server/src/main/resources/application-test.yaml

@@ -1,13 +1,22 @@
 server:
-  port: 48080
-
+  port: 58080
+  broker:
+    enabled: true           # mqttBroker类型选择, true: 基于netty的mqttBroker和webSocket  false: emq的mqttBroker
+    broker-node: node1       # 服务器集群节点
+    port: 1883
+    openws: true             # 控制webSocket是否开启
+    websocket-port: 8083
+    websocket-path: /mqtt
+    keep-alive: 70
+  tomcat:
+    connection-timeout: 120000
 --- #################### 数据库相关配置 ####################
 
 spring:
-#  autoconfigure:
-#    exclude:
-#      - org.springframework.ai.autoconfigure.vectorstore.qdrant.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
-#      - org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
+  #  autoconfigure:
+  #    exclude:
+  #      - org.springframework.ai.autoconfigure.vectorstore.qdrant.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
+  #      - org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
   # 数据源配置项
   autoconfigure:
     exclude:
@@ -52,20 +61,19 @@ spring:
           password: .N_Mdq!BR1W4
         slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
           lazy: true # 开启懒加载,保证启动速度
-#          url: jdbc:mysql://1.94.244.160:3306/rqiot?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+          #          url: jdbc:mysql://1.94.244.160:3306/rqiot?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
           url: jdbc:mysql://172.21.20.20:3306/yanfan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
           username: ruiqi
           password: .N_Mdq!BR1W4
-        # TDengine数据库
         tdengine:
           enabled: true
           url: jdbc:TAOS-RS://172.21.10.65:6041/iot_log?allowMultiQueries=true
           username: root
           password: taosdata
           driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
-            #driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver
+          #driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver
           jpa:
-            show-sql: true #JPA是否显示sql语句
+            show-sql: false #JPA是否显示sql语句
             # 使用mysql的方言,否则报错
             database-platform: org.hibernate.dialect.MySQLDialect
         yanfan:
@@ -77,8 +85,13 @@ spring:
   redis:
     host: localhost # 地址
     port: 6379 # 端口
-    database: 0  # 数据库索引
-    password: 123456
+    username: default
+    database: 1 # 数据库索引
+    password: r1q6IrEp@4s # 密码,建议生产环境开启
+
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
 
 --- #################### 定时任务相关配置 ####################
 
@@ -164,9 +177,9 @@ logging:
 
 --- #################### 钉微应用相关配置 ####################
 dingtalk:
-  AGENT_ID: 2474111366  # DeepOil 微应用 agent_id
-  APP_KEY: dingh3nuuagvbkahgvjh # 钉钉微应用 appkey
-  APP_SECRET: iZ6sPUELzmwMBIldGzvoBhE8SNhbDzmFxhQOcStClxfZR-qAN_PJ_8qRxiC1kQW8 # 钉钉微应用 appkey
+  AGENT_ID: 3687646006  # DeepOil 微应用 agent_id
+  APP_KEY: dingmr9ez0ecgbmscfeb # 钉钉微应用 appkey
+  APP_SECRET: VhG_zMdTvIBwA_0Ef8FJ0foH3VYYo5T-kw0ukX_PBA8Ah1xl7AjDw5RVYCU0DTpe # 钉钉微应用 appkey
   GET_ACCESS_TOKEN_URL: https://oapi.dingtalk.com/gettoken  # 获取access_token
   URL_GET_USERINFO_BYCODE: https://oapi.dingtalk.com/sns/getuserinfo_bycode # 通过二维码扫码获取UNIONID
   URL_GET_USERINFO_BYUNIONID: https://oapi.dingtalk.com/topapi/user/getbyunionid # 通过UNIONID获取用户信息
@@ -187,6 +200,13 @@ sap:
     pool_capacity: 10
     peak_limit: 20
 
+--- #################### hikvision 相关配置 ####################
+hikvision:
+  appKey: 24712355
+  appSecret: TcNp8k8UX80X99sXaOds
+  host: vms.deepoil.cc    # vms.deepoil.cc:1443
+  artemisPath: /artemis   #监控点列表v2
+
 --- #################### 微信公众号相关配置 ####################
 wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
   mp:
@@ -223,8 +243,8 @@ justauth:
   enabled: true
   type:
     DINGTALK: # 钉钉
-      client-id: dingh3nuuagvbkahgvjh
-      client-secret: iZ6sPUELzmwMBIldGzvoBhE8SNhbDzmFxhQOcStClxfZR-qAN_PJ_8qRxiC1kQW8
+      client-id: dingmr9ez0ecgbmscfeb
+      client-secret: VhG_zMdTvIBwA_0Ef8FJ0foH3VYYo5T-kw0ukX_PBA8Ah1xl7AjDw5RVYCU0DTpe
       ignore-check-redirect-uri: true
       ignore-check-state: true
     WECHAT_ENTERPRISE: # 企业微信
@@ -269,12 +289,96 @@ iot:
 yanfan:
   url: http://172.21.10.65
 
+portal:
+  secret: cc99d802-ce5c-5f62-b037-9a00726e7109
+
 # 插件配置
 pf4j:
   pluginsDir: ${user.home}/plugins # 插件目录
-
 system:
-  url: https://iot.deepoil.cc/
+  url: https://aims.deepoil.cc/
+oa:
+  register: https://yfoa.keruioil.com/api/ec/dev/auth/regist
+  gettoken: https://yfoa.keruioil.com/api/ec/dev/auth/applytoken
+  outMaintain: https://yfoa.keruioil.com/api/workflow/paService/doCreateRequest
+  companyUrl: https://yfoa.keruioil.com/api/hrm/resful/getHrmsubcompanyWithPage
+  departmentUrl: https://yfoa.keruioil.com/api/hrm/resful/getHrmdepartmentWithPage
+  userUrl: https://yfoa.keruioil.com/api/hrm/resful/getHrmUserInfoWithPage
+  workflowId: "640"
+  requestName: "设备委外维修申请流程"
+  appid: TW
+  cpk: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApmtQUp9M82/z22P7am5owQCknjQnjF4U4ckEh7XVtJVQZrZx7d1lCPfoYrwOKEM4DEV7khW6++4Zv5caJ/9nqPn4QFwCqJWVmCEm9vC1BA6i2yfa4bmTxdR1/oeU/Af9pDFlvv5GC9XyilO7CIKu19Ce50v7aN6h1Tjix+h5Ba8e12XAEpEZk9pFroEYfR4lrecvi1pQOwRw8YzDRC4lhGNOo5Cen1rGjk7dwzzgs4uEv9ZyPZoVJnty5P9JE/ctboEf3x4jbqIliuCRgOyXYsLlp+N282CKcWZ35URkGw2orKyG1U6L1hNoj7kkpvAo8Zagf97SdZ0nYdRBIHv6PQIDAQAB
+  oaSecret: kryfoa20250905@szh
+  user: OAuser
+  userId: cLPEaFs9moW6b3xZMl1kNNWAAo7bp61ZRRTKmpiJUe56hSxQvrC2vWtY5ogj7g5FAnUOlzYjYg9MRktKXcseh/nsvZCQGa3BAlYixlDJruV19y4Omx5dYnqu/qv2rJAqTzUS71sOwuB1M2nKlLVsphw1GF74UhGP4xsjpZP7mC8=
+
+file:
+  upload-path: /iotfiles
 
+sip:
+  enabled: false                            # 是否启用视频监控SIP,true为启用
+  ## 本地调试时,绑定网卡局域网IP,设备在同一局域网,设备接入IP填写绑定IP
+  ## 部署服务端时,默认绑定容器IP,设备接入IP填写服务器公网IP
+  ip: 172.21.10.129
+  port: 5061                                # SIP端口(保持默认)
+  domain: 3402000000                        # 由省级、市级、区级、基层编号组成
+  id: 34020000002000000001                  # 同上,另外增加编号,(可保持默认)
+  password: 12345678
 
+hikvision:
+  # ISAPI协议配置
+  isapi:
+    # 超脑设备配置
+    devices:
+      - id: "nvr-001"
+        name: "超脑巡检设备1"
+        ip: "172.26.0.52"
+        port: 80
+        username: "admin"
+        password: "rqny@szh2026"
+        protocol: "http"
+        timeout: 10000
+        # ISAPI接口路径
+        paths:
+          event-notification: "/ISAPI/Event/notification/"
+          intelligence-analysis: "/ISAPI/Intelligent/Analysis/"
+          system-status: "/ISAPI/System/status"
+          device-info: "/ISAPI/System/deviceInfo"
+          sip-info: "/ISAPI/System/Network/SIP/1/SIPInfo"
+        # 订阅配置
+        subscription:
+          heartbeat-interval: 30
+          event-types: "All"
+    # 回调配置
+    callback:
+      enabled: true
+      # 本地接收告警的接口地址(超脑会调用这个地址)
+      local-url: "http://172.21.10.129:58080/admin-api/hikvision/alarm/callback"
+      # 用于接收图片的接口
+      image-url: "http://172.21.10.129:58080/admin-api/hikvision/image/callback"
+      retry-times: 3
+      retry-interval: 1000
+    # 存储配置
+    storage:
+      save-alarm: true
+      save-image: false
+      image-path: "./alarm-images/"
 
+  # 告警事件处理配置
+  alarm:
+    event-types:
+      - name: "入侵检测"
+        code: "IntrusionDetection"
+        level: "HIGH"
+      - name: "人员聚集"
+        code: "CrowdDetection"
+        level: "MEDIUM"
+      - name: "安全帽检测"
+        code: "HelmetDetection"
+        level: "MEDIUM"
+      - name: "区域入侵"
+        code: "RegionIntrusion"
+        level: "HIGH"
+      - name: "设备离线"
+        code: "DeviceOffline"
+        level: "CRITICAL"