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

海康、大华、onvif相关插件及接口

hanzhengyi 11 часов назад
Родитель
Сommit
4fbbf2c18e
31 измененных файлов с 689 добавлено и 4998 удалено
  1. 0 3606
      API设计文档.md
  2. 0 0
      sas-service-0a1fc66b-9bb3-443c-94be-e3907721d2f2-tcp192168101591883/.lck
  3. 0 0
      sas-service-290bb711-b6cc-493c-9061-8e7b3514f438-tcp192168101591883/.lck
  4. 0 0
      sas-service-4d23a61e-8bf3-4af8-b965-a2f3a4e0ac97-tcp192168101591883/.lck
  5. 0 0
      sas-service-501f5fe4-8a41-4e4f-abfd-2bf18dd561ee-tcp192168101591883/.lck
  6. 0 0
      sas-service-58084279-9b31-4d9f-af94-eddbc0b43d63-tcp192168101591883/.lck
  7. 0 0
      sas-service-769ca000-6bcd-40e7-b499-d0a4afd01615-tcp192168101591883/.lck
  8. 0 0
      sas-service-7a4fe915-15db-4e8d-babc-08be5ac1a97b-tcp192168101591883/.lck
  9. 0 0
      sas-service-a5369716-399e-42c5-b5ba-d1158751977d-tcp192168101591883/.lck
  10. 0 0
      sas-service-c427b2c2-b890-48fc-8e87-11bc19119c41-tcp192168101591883/.lck
  11. 0 0
      sas-service-ccff152a-e34e-4e5c-aed7-0d660b243dfe-tcp192168101591883/.lck
  12. 0 0
      sas-service-d09f88b7-7ccd-4e53-a28f-385e92f9b884-tcp192168101591883/.lck
  13. 0 0
      sas-service-d6b62103-a9b4-4df2-b962-30629ad9a298-tcp192168101591883/.lck
  14. 0 0
      sas-service-e57d1fc9-7e98-44b9-90e1-5d0421075df8-tcp192168101591883/.lck
  15. 0 0
      sas-service-e97718ff-50b9-4229-8e24-4d70f07d0247-tcp192168101591883/.lck
  16. 0 7
      service-sas/service-sas-biz/pom.xml
  17. 3 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/common/dahua/DahuaVideoStreamService.java
  18. 2 2
      service-sas/service-sas-biz/src/main/java/com/usky/sas/common/dahua/InitNetSDKLib.java
  19. 161 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/common/entity/DeviceVideoInfo.java
  20. 17 23
      service-sas/service-sas-biz/src/main/java/com/usky/sas/common/onvif/OnvifService.java
  21. 1 1
      service-sas/service-sas-biz/src/main/java/com/usky/sas/common/onvif/StandardOnvifService.java
  22. 19 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasDeviceController.java
  23. 2 1
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAlarsasGroupType.java
  24. 2 1
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasDevice.java
  25. 2 1
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasGis.java
  26. 5 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/MqttService.java
  27. 13 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasDeviceService.java
  28. 430 1
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasDeviceServiceImpl.java
  29. 24 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/vo/DeviceConfigSaveRequest.java
  30. 8 2
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/vo/IntelligentEventPageRequest.java
  31. 0 1353
      usky-agapp.sql

+ 0 - 3606
API设计文档.md

@@ -1,3606 +0,0 @@
-# 智能安防集成应用系统 API 设计文档
-
-## 文档信息
-
-- **系统名称**: 智能安防集成应用系统
-- **数据库**: agapp (MySQL 8.0.35)
-- **文档版本**: v1.1
-- **创建日期**: 2026-01-30
-- **更新日期**: 2026-02-28
-
----
-
-## 目录
-
-1. [概述](#概述)
-2. [通用规范](#通用规范)
-3. [认证授权](#认证授权)
-4. [安防集成管理](#安防集成管理)
-5. [首页](#首页)
-6. [电子地图](#电子地图)
-7. [智能分析](#智能分析)
-8. [人员管理](#人员管理)
-9. [一标六实](#一标六实)
-10. [用户管理](#用户管理)
-11. [系统管理](#系统管理)
-
----
-
-## 概述
-
-### 系统简介
-
-智能安防集成应用系统是一个综合性的安防管理平台,集成了设备管理、事件监控、人员管理、电子地图、智能分析等功能模块。
-
-### 技术栈
-
-- **后端**: Java (Spring Boot)
-- **数据库**: MySQL 8.0.35
-- **协议**: RESTful API
-- **数据格式**: JSON
-
-### 基础信息
-
-- **数据库地址**: 192.168.10.151:3306
-- **数据库名**: agapp
-- **参考平台地址**: http://192.168.10.151
-
----
-
-## 通用规范
-
-### 请求规范
-
-#### 请求头
-
-```
-Content-Type: application/json
-Authorization: Bearer {token}
-```
-
-#### 统一响应格式
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "操作成功",
-  "data": {},
-  "exception": null
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态:一般为 SUCCESS/FAIL |
-| code | int | 业务状态码,对应统一错误码说明 |
-| msg | string | 本次调用的提示信息 |
-| data | object | 具体业务数据载体,不同接口结构不同 |
-| exception | string/null | 异常信息,正常情况下为 null |
-
-#### 响应状态码
-
-| 状态码 | 说明 |
-|--------|------|
-| 200 | 成功 |
-| 400 | 请求参数错误 |
-| 401 | 未授权 |
-| 403 | 无权限 |
-| 404 | 资源不存在 |
-| 500 | 服务器内部错误 |
-
-### 分页规范
-
-#### 请求参数
-
-```json
-{
-  "current": 1,
-  "size": 10,
-  "sortField": "create_time",
-  "sortOrder": "desc"
-}
-```
-
-#### 响应格式
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "records": [],
-    "total": 100,
-    "current": 1,
-    "size": 10,
-    "totalPages": 10
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态:一般为 SUCCESS/FAIL |
-| code | int | 业务状态码,对应统一错误码说明 |
-| data | object | 分页数据对象 |
-| data.records | array | 当前页数据列表 |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页记录数 |
-| data.totalPages | int | 总页数 |
-
----
-
-## 认证授权
-
-### 1. 系统激活
-
-**接口地址**: `POST /prod-api/service-sas/activate`
-
-**功能描述**: 系统激活
-
-**请求参数**:
-
-```json
-{
-  "licenseKey": "string"
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "激活成功",
-  "data": {
-    "isPerpetual": false,
-    "validityTime": "2026-12-31T23:59:59"
-  }
-}
-```
-
-**字段说明**(结合表 `sas_system_activation`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 激活结果提示信息 |
-| data | object | 激活结果数据 |
-| data.isPerpetual | boolean | 是否永久授权(对应 sas_system_activation.is_perpetual) |
-| data.validityTime | string | 授权到期时间,ISO8601 格式(对应 sas_system_activation.validity_time) |
-
----
-
-## 安防集成管理
-
-### 网络配置
-
-#### 1.1 分页查询网络配置
-
-**接口地址**: `GET /prod-api/service-sas/network/config`
-
-**功能描述**: 分页展示网络配置列表,支持按网络名称、IP 地址、启用状态筛选。
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码,默认 1 |
-| size | int | 否 | 每页数量,默认 10 |
-| name | string | 否 | 网络名称(模糊查询) |
-| ipAddr | string | 否 | IP 地址(模糊查询) |
-| status | boolean | 否 | 状态:true 启用,false 未启用 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "records": [
-      {
-        "id": 1,
-        "name": "主网络",
-        "ipAddr": "192.168.10.151",
-        "gatewayAddr": "192.168.10.1",
-        "subnetMask": "255.255.255.0",
-        "dns": "8.8.8.8",
-        "status": true,
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 10,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_system_wlan_config`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.records | array | 网络配置列表 |
-| data.records[].id | int | 主键 id(sas_system_wlan_config.id) |
-| data.records[].name | string | 网络名称(sas_system_wlan_config.name) |
-| data.records[].ipAddr | string | IP 地址(sas_system_wlan_config.ip_addr) |
-| data.records[].gatewayAddr | string | 网关地址(sas_system_wlan_config.gateway_addr) |
-| data.records[].subnetMask | string | 子网掩码(sas_system_wlan_config.subnet_mask) |
-| data.records[].dns | string | DNS 服务器地址(sas_system_wlan_config.dns) |
-| data.records[].status | boolean | 是否启用:true 启用,false 未启用(sas_system_wlan_config.status) |
-| data.records[].createTime | string | 创建时间,ISO8601 格式(sas_system_wlan_config.create_time) |
-| data.records[].updateTime | string | 更新时间,ISO8601 格式(sas_system_wlan_config.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 1.2 编辑网络配置
-
-**接口地址**: `PUT /prod-api/service-sas/network/config`
-
-**功能描述**: 编辑网络配置,点击"网络配置"切换到开启状态,在IP信息栏输入需要配置的信息
-
-**请求参数**:
-
-```json
-{
-  "id": 1,
-  "name": "主网络",
-  "ipAddr": "192.168.10.151",
-  "gatewayAddr": "192.168.10.1",
-  "subnetMask": "255.255.255.0",
-  "dns": "8.8.8.8",
-  "status": true
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 更新结果提示信息 |
-
-### 系统配置
-
-#### 2.1 查询系统配置
-
-**接口地址**: `GET /prod-api/service-sas/system/config`
-
-**功能描述**: 展示系统配置信息
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "id": 1,
-    "owlAgentHost": "192.168.10.151",
-    "systemHost": "192.168.10.151",
-    "videoServerHost": "192.168.10.151",
-    "gatewayName": "网关1",
-    "daysToKeepHistory": 30,
-    "maskAvatar": true,
-    "maskIdCardNo": false,
-    "createTime": "2026-01-30T10:00:00",
-    "updateTime": "2026-01-30T10:00:00"
-  }
-}
-```
-
-**字段说明**(结合表 `sas_systesas_config` 现表名 `sas_system_config`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 系统配置数据对象 |
-| data.id | int | 主键id(sas_system_config.id) |
-| data.owlAgentHost | string | agent 服务器地址(sas_system_config.owl_agent_host) |
-| data.systemHost | string | 系统服务器地址(sas_system_config.system_host) |
-| data.videoServerHost | string | 视频服务器地址(sas_system_config.video_server_host) |
-| data.gatewayName | string | 网关名称(sas_system_config.gateway_name) |
-| data.daysToKeepHistory | int | 数据保留天数(sas_system_config.days_to_keep_history) |
-| data.maskAvatar | boolean | 是否显示人员照片(sas_system_config.mask_avatar) |
-| data.maskIdCardNo | boolean | 是否显示身份证号(sas_system_config.mask_id_card_no) |
-| data.createTime | string | 创建时间,ISO8601 格式(sas_system_config.create_time) |
-| data.updateTime | string | 更新时间,ISO8601 格式(sas_system_config.update_time) |
-
-#### 2.2 编辑系统配置
-
-**接口地址**: `PUT /prod-api/service-sas/system/config`
-
-**功能描述**: 编辑系统配置,点击"人员照片、身份证信息"切换到开启状态,设置数据保留天数等
-
-**请求参数**:
-
-```json
-{
-  "id": 1,
-  "owlAgentHost": "192.168.10.151",
-  "systemHost": "192.168.10.151",
-  "videoServerHost": "192.168.10.151",
-  "gatewayName": "网关1",
-  "daysToKeepHistory": 30,
-  "maskAvatar": true,
-  "maskIdCardNo": false
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 更新结果提示信息 |
-
-### Agbox/Metabus配置
-
-#### 3.1 查询Agbox/Metabus配置
-
-**接口地址**: `GET /prod-api/service-sas/agbox/config`
-
-**功能描述**: 展示 Agbox/Metabus 配置信息,并返回当前 MQTT 连接状态、监听状态。
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "id": 1,
-    "keyds": "agbox_key_12345",
-    "host": "192.168.10.151",
-    "port": "1883",
-    "username": "mqtt_user",
-    "password": "mqtt_password",
-    "isTsl": false,
-    "createTime": "2026-01-30T10:00:00",
-    "updateTime": "2026-01-30T10:00:00",
-    "isConnected": true,
-    "isListening": true
-  }
-}
-```
-
-**字段说明**(结合表 `sas_config` 及运行时 MQTT 状态):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | Agbox/Metabus 配置及状态对象 |
-| data.id | int | 主键id(sas_config.id) |
-| data.keyds | string | 秘钥 Key(sas_config.keyds) |
-| data.host | string | MQTT 服务 IP 地址(sas_config.host) |
-| data.port | string | MQTT 服务端口(sas_config.port) |
-| data.username | string | MQTT 用户名(sas_config.username) |
-| data.password | string | MQTT 密码(sas_config.password) |
-| data.isTsl | boolean | 是否安全传输 TLS,对应 is_tsl:true 启用,false 不启用 |
-| data.createTime | string | 创建时间,ISO8601 格式(sas_config.create_time) |
-| data.updateTime | string | 更新时间,ISO8601 格式(sas_config.update_time) |
-| data.isConnected | boolean | MQTT 是否已连接 Broker(运行时状态) |
-| data.isListening | boolean | MQTT 是否正在监听、未暂停(运行时状态) |
-
-#### 3.2 编辑Agbox/Metabus配置
-
-**接口地址**: `PUT /prod-api/service-sas/agbox/config`
-
-**功能描述**: 编辑Agbox/Metabus配置,输入Agbox的Key、IP地址、端口号、Agbox MQTT服务信息
-
-**请求参数**:
-
-```json
-{
-  "id": 1,
-  "keyds": "agbox_key_12345",
-  "host": "192.168.10.151",
-  "port": "1883",
-  "username": "mqtt_user",
-  "password": "mqtt_password",
-  "isTsl": false
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 更新结果提示信息 |
-
-#### 3.3 暂停 MQTT 事件订阅
-
-**接口地址**: `POST /prod-api/service-sas/agbox/mqtt/pause`
-
-**功能描述**: 暂停 MQTT 事件订阅。调用后不再处理新到达的 MQTT 消息,与 Broker 的连接保持不断开;用于临时停止事件入库、减轻负载等场景。
-
-**请求参数**: 无(Request Body 为空)
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "操作成功",
-  "data": null
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 操作结果提示信息 |
-| data | null | 无业务数据 |
-
-#### 3.4 恢复 MQTT 事件订阅
-
-**接口地址**: `POST /prod-api/service-sas/agbox/mqtt/resume`
-
-**功能描述**: 恢复 MQTT 事件订阅。调用后继续处理新到达的 MQTT 消息,与「暂停 MQTT 事件订阅」配对使用。
-
-**请求参数**: 无(Request Body 为空)
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "操作成功",
-  "data": null
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 操作结果提示信息 |
-| data | null | 无业务数据 |
-
-### 事件编码/子类型查询
-
-#### 3.5 根据系统类型查询事件编码列表
-
-**接口地址**: `GET /prod-api/service-sas/event/codes`
-
-**功能描述**: 根据系统类型编码返回对应的事件编码(子类型)列表,用于配置事件组、筛选事件类型等。
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| code | int | 是 | 系统类型编码,见 SystemTypeCodeEnum:1001 实时智能分析、1002 视频安防监控、1003 视频导出防护、1004 组合认证控制、1005 出入门禁控制、1006 车牌抓拍分析、1007 入侵紧急报警、1008 实时电子巡检、1009 状态感知探测、1010 数据采集探测、1011 状态采集探测、1012 阻车路障探测 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": [
-    { "code": 1, "name": "人员识别" },
-    { "code": 2, "name": "人脸识别" }
-  ]
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | array | 事件编码列表;当请求的 code 未匹配任何系统类型时为 null |
-| data[].code | int | 事件编码(gauth 时为 functions) |
-| data[].name | string | 名称 |
-
-### 设备心跳
-
-#### 4.1 查询设备状态
-
-**接口地址**: `GET /prod-api/service-sas/device/heartbeat`
-
-**功能描述**: 查询设备心跳状态
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| deviceId | string | 否 | 设备编号 |
-| deviceType | int | 否 | 设备类型 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "id": "device_001",
-        "deviceId": "DEV001",
-        "deviceType": 1,
-        "ipAddr": "192.168.10.100",
-        "triggerTime": "2026-01-30T10:00:00",
-        "status": "online",
-        "lastHeartbeat": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 100,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_event_type_group`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 事件组配置列表 |
-| data.list[].id | string | 主键id(sas_event_type_group.id) |
-| data.list[].name | string | 事件分组名称(sas_event_type_group.name) |
-| data.list[].deviceType | int | 设备事件类型(sas_event_type_group.device_type) |
-| data.list[].eventCodes | string | 事件类型编码集合,逗号分隔(sas_event_type_group.event_codes) |
-| data.list[].eventLevel | int | 事件等级(sas_event_type_group.event_level,对应事件优先级编码) |
-| data.list[].canDel | boolean | 是否可删除:true 可删,false 不可删(sas_event_type_group.can_del) |
-| data.list[].createTime | string | 创建时间(sas_event_type_group.create_time) |
-| data.list[].updateTime | string | 更新时间(sas_event_type_group.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-**字段说明**(结合表 `sas_device` 与心跳时间字段):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 设备心跳列表 |
-| data.list[].id | string | 设备主键id(可对应 sas_device.id) |
-| data.list[].deviceId | string | 设备编码(sas_device.device_id) |
-| data.list[].deviceType | int | 设备类型编码(sas_device.device_type) |
-| data.list[].ipAddr | string | 设备 IP 地址(sas_device.ip_addr) |
-| data.list[].triggerTime | string | 最近心跳时间(对应 sas_device.trigger_time) |
-| data.list[].status | string | 设备在线状态,如 online/offline |
-| data.list[].lastHeartbeat | string | 最近一次心跳时间(与 triggerTime 一致或更精确) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-### 事件组配置
-
-#### 5.1 查询事件组配置
-
-**接口地址**: `GET /prod-api/service-sas/event/group`
-
-**功能描述**: 展示已配置事件组信息,返回事件组名称、设备事件类型名称、事件等级名称以及按系统类型解析后的事件编码列表。
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| deviceType | int | 否 | 设备事件类型 |
-| name | string | 否 | 事件组名称(模糊查询) |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "id": "group_001",
-        "name": "报警事件组",
-        "deviceType": 1007,
-        "deviceTypeName": "入侵紧急报警",
-        "eventCodes": [
-          { "code": 2001, "name": "入侵报警" },
-          { "code": 2002, "name": "紧急报警" }
-        ],
-        "eventLevel": 1,
-        "eventLevelName": "紧急",
-        "canDel": true,
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 10,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_event_type_group` 及各事件编码表,如 `sas_alarsas_event_code`、`sas_snap_type_code` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 事件组配置列表 |
-| data.list[].id | string | 主键id(sas_event_type_group.id) |
-| data.list[].name | string | 事件分组名称(sas_event_type_group.name) |
-| data.list[].deviceType | int | 设备事件类型编码(sas_event_type_group.device_type,对应 `SystemTypeCodeEnum.code`) |
-| data.list[].deviceTypeName | string | 设备事件类型名称(`SystemTypeCodeEnum.message`,如:入侵紧急报警、实时智能分析等) |
-| data.list[].eventCodes | array | 事件编码列表,已按系统类型解析为对象数组 |
-| data.list[].eventCodes[].code | int | 事件编码(各事件编码表 code;组合认证 gauth 时为 functions) |
-| data.list[].eventCodes[].name | string | 事件名称(各事件编码表 name,gauth 时为 name/actionName) |
-| data.list[].eventLevel | int | 事件等级编码(sas_event_type_group.event_level,对应事件优先级编码) |
-| data.list[].eventLevelName | string | 事件等级名称,如:紧急/高/普通/无 |
-| data.list[].canDel | boolean | 是否可删除:true 可删,false 不可删(sas_event_type_group.can_del) |
-| data.list[].createTime | string | 创建时间(sas_event_type_group.create_time) |
-| data.list[].updateTime | string | 更新时间(sas_event_type_group.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 5.2 新增事件组配置
-
-**接口地址**: `POST /prod-api/service-sas/event/group`
-
-**功能描述**: 新增事件组,选择设备事件类型并输入事件组名称、选择报警事件
-
-**请求参数**:
-
-```json
-{
-  "name": "报警事件组",
-  "deviceType": 1,
-  "eventCodes": [1001, 1002, 1003],
-  "eventLevel": 1
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "创建成功",
-  "data": {
-    "id": "group_001"
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 创建结果提示信息 |
-| data | object | 新建结果对象 |
-| data.id | string | 新建事件组主键id(对应 sas_event_type_group.id) |
-
-#### 5.3 编辑事件组配置
-
-**接口地址**: `PUT /prod-api/service-sas/event/group/{id}`
-
-**功能描述**: 编辑事件组配置
-
-**请求参数**:
-
-```json
-{
-  "name": "报警事件组",
-  "deviceType": 1,
-  "eventCodes": [1001, 1002, 1003],
-  "eventLevel": 1
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 更新结果提示信息 |
-
-#### 5.4 删除事件组配置
-
-**接口地址**: `DELETE /prod-api/service-sas/event/group/{id}`
-
-**功能描述**: 删除事件组配置
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "删除成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 删除结果提示信息 |
-
-### 事件优先级配置
-
-#### 6.1 查询事件优先级配置
-
-**接口地址**: `GET /prod-api/service-sas/event/priority`
-
-**功能描述**: 展示已配置事件优先级信息
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "urgent": ["group_001", "group_002"],
-    "high": ["group_003"],
-    "normal": ["group_004"],
-    "none": ["group_005"]
-  }
-}
-```
-
-#### 6.2 编辑事件优先级配置
-
-**接口地址**: `PUT /prod-api/service-sas/event/priority`
-
-**功能描述**: 将事件组按照紧急、高、普通、无四个等级进行分类,将事件拖拉至对应等级
-
-**请求参数**:
-
-```json
-{
-  "urgent": ["group_001", "group_002"],
-  "high": ["group_003"],
-  "normal": ["group_004"],
-  "none": ["group_005"]
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-### 设备配置
-
-#### 7.1 查询设备配置
-
-**接口地址**: `GET /prod-api/service-sas/device/config`
-
-**功能描述**: 可根据报警联动组、视频监控组、设备类型、设备编码、设备ip查询
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| alarmGroupType | string | 否 | 报警联动组 |
-| videoGroupType | string | 否 | 视频监控组 |
-| deviceType | int | 否 | 设备类型 |
-| deviceId | string | 否 | 设备编码 |
-| ipAddr | string | 否 | 设备IP |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "id": "device_001",
-        "deviceId": "DEV001",
-        "channel": 0,
-        "deviceType": 1,
-        "ipAddr": "192.168.10.100",
-        "port": 8000,
-        "username": "admin",
-        "shield": false,
-        "villageCode": "village_001",
-        "houseCode": "house_001",
-        "address": "一楼大厅",
-        "videoGroupType": "video_group_001",
-        "alarmGroupType": "alarm_group_001",
-        "note": "摄像头设备",
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 100,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_device`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 设备配置列表 |
-| data.list[].id | string | 主键id(sas_device.id) |
-| data.list[].deviceId | string | 设备编码(sas_device.device_id) |
-| data.list[].channel | int | 通道号(sas_device.channel) |
-| data.list[].deviceType | int | 设备类型编码(sas_device.device_type) |
-| data.list[].ipAddr | string | 设备 IP 地址(sas_device.ip_addr) |
-| data.list[].port | int | 设备端口号(sas_device.port) |
-| data.list[].username | string | 登录用户名(sas_device.username) |
-| data.list[].shield | boolean | 是否屏蔽设备(sas_device.shield) |
-| data.list[].villageCode | string | 地块编码(sas_device.village_code) |
-| data.list[].houseCode | string | 部位编码(sas_device.house_code) |
-| data.list[].address | string | 设备安装位置(sas_device.address) |
-| data.list[].videoGroupType | string | 视频监控组类型(sas_device.video_group_type) |
-| data.list[].alarmGroupType | string | 报警联动组类型(sas_device.alarsas_group_type) |
-| data.list[].note | string | 备注描述(sas_device.note) |
-| data.list[].createTime | string | 创建时间(sas_device.create_time) |
-| data.list[].updateTime | string | 更新时间(sas_device.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 7.2 新增设备配置
-
-**接口地址**: `POST /prod-api/service-sas/device/config`
-
-**功能描述**: 新增设备配置
-
-**请求参数**:
-
-```json
-{
-  "deviceId": "DEV001",
-  "channel": 0,
-  "deviceType": 1,
-  "ipAddr": "192.168.10.100",
-  "port": 8000,
-  "username": "admin",
-  "password": "password",
-  "shield": false,
-  "villageCode": "village_001",
-  "houseCode": "house_001",
-  "address": "一楼大厅",
-  "videoGroupType": "video_group_001",
-  "alarmGroupType": "alarm_group_001",
-  "note": "摄像头设备"
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "创建成功",
-  "data": {
-    "id": "device_001"
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 创建结果提示信息 |
-| data | object | 新增结果对象 |
-| data.id | string | 新建设备主键id(对应 sas_device.id) |
-
-#### 7.2.1 批量新增设备配置
-
-**接口地址**: `POST /prod-api/service-sas/device/config/batch-add`
-
-**功能描述**: 批量新增同一设备编号下的多条设备记录,常用于一次性为 NVR 设备按通道生成多个设备。后端会根据 `channels` 字段,从 0 开始依次生成通道号为 `0 ~ channels-1` 的设备记录;若某个通道已存在相同 `deviceId + deviceType + channel` 的记录,则该通道会自动跳过,不重复插入。
-
-**请求参数**:
-
-```json
-{
-  "deviceId": "DEV001",
-  "deviceType": 1,
-  "ipAddr": "192.168.10.100",
-  "port": 8000,
-  "channels": 4,
-  "username": "admin",
-  "password": "password",
-  "address": "一楼机房",
-  "houseCode": "house_001",
-  "videoDeviceType": 2,
-  "videoProtocol": 2,
-  "note": "NVR 批量通道设备"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| deviceId | string | 是 | 设备编号(所有通道共用) |
-| deviceType | int | 是 | 设备类型编码(对应 `SystemTypeCodeEnum.code`) |
-| ipAddr | string | 是 | 设备 IP 地址 |
-| port | int | 是 | 设备端口 |
-| channels | int | 是 | 通道数量,>=1;将生成通道号为 0~channels-1 的多条记录 |
-| username | string | 否 | 登录用户名 |
-| password | string | 否 | 登录密码 |
-| address | string | 否 | 安装位置描述 |
-| houseCode | string | 否 | 部位编码(`sas_device.house_code`) |
-| videoDeviceType | int | 否 | 视频设备类型,如 1-IPC、2-NVR 等(对应 `sas_device.video_type`) |
-| videoProtocol | int | 否 | 视频协议,如 1-ONVIF、2-海康、3-大华 等(对应 `sas_device.video_protocol`) |
-| note | string | 否 | 备注说明 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "操作成功",
-  "data": null
-}
-```
-
-**补充说明**:
-
-- 判重规则:每个通道以 `deviceId + deviceType + channel` 作为唯一键;已存在的通道记录会被跳过,不抛错。
-- GIS 信息:批量新增接口不处理经纬度/高度,`gis_id` 为空,如需带坐标请使用“设备导入模板 + 批量导入”方式。
-
-#### 7.3 编辑设备配置
-
-**接口地址**: `PUT /prod-api/service-sas/device/config/{id}`
-
-**功能描述**: 编辑设备配置
-
-**请求参数**: 同新增接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 更新结果提示信息 |
-
-#### 7.4 删除设备配置
-
-**接口地址**: `DELETE /prod-api/service-sas/device/config/{id}`
-
-**功能描述**: 删除设备配置
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "删除成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 删除结果提示信息 |
-
-#### 7.5 同步 AG 设备
-
-**接口地址**: `POST /prod-api/service-sas/device/syncAgboxDevice`
-
-**功能描述**: 从 AG(Agbox)同步设备到 `sas_device`。按系统类型(实时智能分析、视频安防监控、出入门禁控制等)依次调用 AG 的 `getDeviceList`,对每个设备可选调用 `getDeviceChannelList`;若有通道则按通道落库多条设备,否则按设备落库一条(通道号为 0)。已存在的设备(按 deviceId + deviceType + channel 判定)不会重复插入。若 AG 返回设备经纬度信息则自动写入 `sas_gis` 并关联设备的 `gis_id`。依赖 Agbox 配置(`sas_config` 的 host、port、keyds)。
-
-**请求参数**: 无(POST 无请求体)
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": null,
-  "msg": "操作成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 操作结果提示信息 |
-
-#### 7.6 获取设备导入模板
-
-**接口地址**: `GET /prod-api/service-sas/device/import/template`
-
-**功能描述**: 获取设备批量导入的 Excel 模板文件。前端调用后浏览器会直接下载一个名为「设备导入模板」的 `.xlsx` 文件,示例中会包含一行演示数据,方便用户参考填写格式。后续可配合“批量设备导入”接口使用(本次仅实现模板导出)。
-
-**请求参数**: 无
-
-**响应说明**:
-
-- **Content-Type**: `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`
-- **响应体**: 二进制 Excel 文件流,不再包装 `ApiResult`。
-
-**模板示例字段**(列头与内容示例):
-
-| 列名 | 示例值 | 说明 |
-|------|--------|------|
-| 设备类型(必填) | 1001 | 对应 `SystemTypeCodeEnum.code`,如 1001-实时智能分析 |
-| 设备编号(必填) | test-01 | 设备唯一编号 |
-| 设备IP(必填) | 192.168.3.141 | 设备 IP 地址 |
-| 端口(必填) | 8000 | 设备端口 |
-| 通道号 | 1 | NVR 通道号,普通 IPC 可填 1 或留空 |
-| 视频设备类型 | 1 | 预留字段,例如 1-IPC、2-NVR 等 |
-| 视频协议 | 2 | 预留字段,例如 1-ONVIF、2-海康、3-大华 等 |
-| 用户名 | admin | 登录用户名 |
-| 密码 | admin | 登录密码 |
-| 备注 | 备注 | 说明文字 |
-| 安装位置 | 位置示例 | 安装地点描述 |
-| 部位编码(houseCode) | 示例-houseCode | 关联 `sas_device.house_code` |
-| 经度 |  | 可选,经度 |
-| 纬度 |  | 可选,纬度 |
-| 高度 |  | 可选,高度 |
-| 楼层 | 11 | 可选,楼层号 |
-
-#### 7.7 批量设备导入(Excel)
-
-**接口地址**: `POST /prod-api/service-sas/device/importBatchDeviceByExcel`
-
-**功能描述**: 通过上传设备导入模板 Excel 文件,批量新增设备到 `sas_device` 表。系统会按行解析 Excel 内容,对每一行生成一条设备记录;若已存在相同的设备(按 `deviceId + deviceType + channel` 判重)则跳过,不会重复插入。
-
-**请求参数**(`multipart/form-data`):
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| file | file | 是 | 设备导入 Excel 文件(可使用 7.6 接口下载的模板) |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": "设备批量导入成功",
-  "msg": "操作成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | string | 导入结果提示信息,如“设备批量导入成功” |
-| msg | string | 通用提示信息 |
-
-**导入规则说明**:
-
-- 必填列:**设备类型(必填)**、**设备编号(必填)**、**设备IP(必填)**、**端口(必填)**,任意一列为空则整行导入失败并返回错误。
-- 判重规则:同一条记录以 `deviceId + deviceType + channel` 作为唯一键;若数据库中已存在相同组合,则该行数据会被自动跳过,不报错。
-- 经纬度/高度:若模板中填写了经纬度或高度,则会自动在 `sas_gis` 中生成一条坐标记录,并把 `gis_id` 关联到设备。
-- 其他字段:用户名、密码、安装位置、备注、houseCode、视频设备类型、视频协议等字段会直接写入 `sas_device` 对应列;`is_binding` 默认 `false`,`shield` 默认 `false`。
-
-### 报警联动配置
-
-#### 8.1 查询联动报警组
-
-**接口地址**: `GET /prod-api/service-sas/alarm/group`
-
-**功能描述**: 展示已添加联动报警组
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "id": "alarm_group_001",
-        "name": "报警联动组1",
-        "note": "描述信息",
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 10,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_alarsas_group_type`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 报警联动组列表 |
-| data.list[].id | string | 主键id(sas_alarsas_group_type.id) |
-| data.list[].name | string | 报警联动组名称(sas_alarsas_group_type.name) |
-| data.list[].note | string | 描述信息(sas_alarsas_group_type.note) |
-| data.list[].createTime | string | 创建时间 |
-| data.list[].updateTime | string | 更新时间 |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 8.2 新增联动报警组
-
-**接口地址**: `POST /prod-api/service-sas/alarm/group`
-
-**功能描述**: 新增填写名称及描述并将需要联动设备绑定到同一个报警组
-
-**请求参数**:
-
-```json
-{
-  "name": "报警联动组1",
-  "note": "描述信息",
-  "deviceIds": ["device_001", "device_002"]
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "创建成功",
-  "data": {
-    "id": "alarm_group_001"
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 创建结果提示信息 |
-| data | object | 新建结果对象 |
-| data.id | string | 新建报警联动组主键id(对应 sas_alarsas_group_type.id) |
-
-#### 8.3 编辑联动报警组
-
-**接口地址**: `PUT /prod-api/service-sas/alarm/group/{id}`
-
-**功能描述**: 编辑联动报警组
-
-**请求参数**: 同新增接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 更新结果提示信息 |
-
-#### 8.4 删除联动报警组
-
-**接口地址**: `DELETE /prod-api/service-sas/alarm/group/{id}`
-
-**功能描述**: 删除联动报警组
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "删除成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 删除结果提示信息 |
-
-### 电子地图配置
-
-#### 9.1 查询电子地图
-
-**接口地址**: `GET /prod-api/service-sas/map`
-
-**功能描述**: 展示已添加地图及绑定设备信息,如摄像头可点击绑定的摄像头图标查看直播与回放
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| parentId | string | 否 | 父地图ID |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "id": "map_001",
-        "name": "一楼平面图",
-        "type": 1,
-        "remark": "描述",
-        "parentId": null,
-        "width": 1920,
-        "height": 1080,
-        "isMask": false,
-        "backImgId": "img_001",
-        "devices": [
-          {
-            "id": "map_device_001",
-            "deviceId": "device_001",
-            "deviceName": "摄像头1",
-            "x": 100.5,
-            "y": 200.3,
-            "type": "camera"
-          }
-        ],
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 10,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_maps`、`sas_map_device`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 地图列表 |
-| data.list[].id | string | 地图主键id(sas_maps.id) |
-| data.list[].name | string | 地图名称(sas_maps.name) |
-| data.list[].type | int | 地图类型(sas_maps.type) |
-| data.list[].remark | string | 地图描述(sas_maps.remark) |
-| data.list[].parentId | string/null | 父地图id(sas_maps.parent_id) |
-| data.list[].width | number | 画布宽度(sas_maps.width) |
-| data.list[].height | number | 画布高度(sas_maps.height) |
-| data.list[].isMask | boolean | 超出画布是否隐藏(sas_maps.is_mask) |
-| data.list[].backImgId | string | 背景图片id(sas_maps.back_img_id) |
-| data.list[].devices | array | 绑定在该地图上的设备列表(关联 sas_map_device) |
-| data.list[].devices[].id | string | 地图设备主键id(sas_map_device.id) |
-| data.list[].devices[].deviceId | string | 绑定设备id(sas_map_device.device_id) |
-| data.list[].devices[].deviceName | string | 设备名称(业务字段,便于展示) |
-| data.list[].devices[].x | number | 设备在地图上的 X 坐标(sas_map_device.x) |
-| data.list[].devices[].y | number | 设备在地图上的 Y 坐标(sas_map_device.y) |
-| data.list[].devices[].type | string | 地图设备类型,如 camera 等(sas_map_device.type) |
-| data.list[].createTime | string | 地图创建时间(sas_maps.create_time) |
-| data.list[].updateTime | string | 地图更新时间(sas_maps.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 9.2 新增电子地图
-
-**接口地址**: `POST /prod-api/service-sas/map`
-
-**功能描述**: 在地图导航添加地图名称及地图描述;再点击上传图片将项目平面图上传并开启父地图
-
-**请求参数**:
-
-```json
-{
-  "name": "一楼平面图",
-  "type": 1,
-  "remark": "描述",
-  "parentId": null,
-  "width": 1920,
-  "height": 1080,
-  "isMask": false,
-  "backImgId": "img_001"
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "创建成功",
-  "data": {
-    "id": "map_001"
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 创建结果提示信息 |
-| data | object | 新建结果对象 |
-| data.id | string | 新建地图主键id(对应 sas_maps.id) |
-
-#### 9.3 编辑电子地图
-
-**接口地址**: `PUT /prod-api/service-sas/map/{id}`
-
-**功能描述**: 编辑电子地图
-
-**请求参数**: 同新增接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "更新成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 更新结果提示信息 |
-
-#### 9.4 删除电子地图
-
-**接口地址**: `DELETE /prod-api/service-sas/map/{id}`
-
-**功能描述**: 删除电子地图。会**递归删除**当前地图及其所有子地图,并同时删除这些地图下绑定的所有设备点位(`sas_map_device` 记录)。
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "删除成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 删除结果提示信息 |
-
-#### 9.5 绑定地图设备
-
-**接口地址**: `POST /prod-api/service-sas/map/{mapId}/device`
-
-**功能描述**: 在地图上绑定设备
-
-**请求参数**:
-
-```json
-{
-  "deviceId": "device_001",
-  "imgId": "img_002",
-  "type": "camera",
-  "x": 100.5,
-  "y": 200.3,
-  "width": 50,
-  "height": 50,
-  "angle": 0,
-  "text": "摄像头1"
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "绑定成功",
-  "data": {
-    "id": "map_device_001"
-  }
-}
-```
-
-**字段说明**(结合表 `sas_map_device`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 绑定结果提示信息 |
-| data | object | 新建地图设备对象 |
-| data.id | string | 地图设备主键id(sas_map_device.id) |
-
-#### 9.6 解绑地图设备
-
-**接口地址**: `DELETE /prod-api/service-sas/map/{mapId}/device/{deviceId}`
-
-**功能描述**: 解绑地图设备
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "解绑成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 解绑结果提示信息 |
-
-### 视频导出防护配置
-
-#### 10.1 查询视频导出防护配置
-
-**接口地址**: `GET /prod-api/service-sas/video/protection`
-
-**功能描述**: 显示与电子地图一致,右下角会有视频导出防护事件
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "enabled": true,
-    "events": [
-      {
-        "eventId": "event_001",
-        "deviceId": "device_001",
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 2001
-      }
-    ]
-  }
-}
-```
-
-**字段说明**(结合表 `sas_video_event` 或相关事件表):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 视频导出防护配置对象 |
-| data.enabled | boolean | 是否启用视频导出防护 |
-| data.events | array | 告警事件列表 |
-| data.events[].eventId | string | 事件编码(对应各事件表 event_id) |
-| data.events[].deviceId | string | 设备编号(各事件表 device_id) |
-| data.events[].triggerTime | string | 触发时间(各事件表 trigger_time) |
-| data.events[].eventCode | int | 事件编码(各事件编码表 code) |
-
-### 实时电子巡检配置
-
-#### 11.1 查询实时电子巡检配置
-
-**接口地址**: `GET /prod-api/service-sas/patrol/config`
-
-**功能描述**: 显示与电子地图一致,右下角会有实时电子巡检事件
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "enabled": true,
-    "events": [
-      {
-        "eventId": "event_001",
-        "deviceId": "device_001",
-        "name": "巡检员1",
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 3001
-      }
-    ]
-  }
-}
-```
-
-**字段说明**(结合表 `sas_patrol_event`、`sas_patrol_event_code`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 实时电子巡检配置对象 |
-| data.enabled | boolean | 是否启用实时电子巡检事件展示 |
-| data.events | array | 巡检事件列表 |
-| data.events[].eventId | string | 事件编码(sas_patrol_event.event_id) |
-| data.events[].deviceId | string | 设备编号(sas_patrol_event.device_id) |
-| data.events[].name | string | 巡检人姓名(sas_patrol_event.name) |
-| data.events[].triggerTime | string | 触发时间(sas_patrol_event.trigger_time) |
-| data.events[].eventCode | int | 事件编码(sas_patrol_event.event_code / sas_patrol_event_code.code) |
-
----
-
-## 首页
-
-首页包含以下功能区域:
-- **左上角**:已添加摄像头信息,可点击进行直播或回放
-- **左下角**:服务器信息与资源使用情况
-- **中上部分**:三个模块——实时监控(默认空,点击摄像头进行直播或播放)、事件列表(各模块所有事件)、实时事件(开启通知时弹窗:左侧关联摄像头、右侧事件信息,可提前关闭)
-- **中下部分**:按分类显示各类型开启通知的事件预警历史,可点击详情重新查看
-
-### 1. 查询首页综合信息
-
-**接口地址**: `GET /prod-api/service-sas/homepage/info`
-
-**功能描述**: 首页综合信息查询。包含:左上角已添加摄像头列表(可点击直播或回放);设备与事件统计;左下角服务器信息与资源使用情况(JVM 内存、处理器数等)。
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "cameras": [
-      {
-        "id": "device_001",
-        "name": "摄像头1",
-        "ipAddr": "192.168.10.100",
-        "status": "online",
-        "liveUrl": "rtsp://192.168.10.100:554/stream",
-        "playbackUrl": "http://192.168.10.151/playback"
-      }
-    ],
-    "statistics": {
-      "totalDevices": 100,
-      "onlineDevices": 95,
-      "todayEvents": 50,
-      "alarmEvents": 5
-    },
-    "serverInfo": {
-      "memoryMaxMb": 1024,
-      "memoryUsedMb": 256,
-      "memoryFreeMb": 768,
-      "availableProcessors": 8,
-      "serverTime": "2026-02-27T10:00:00"
-    }
-  }
-}
-```
-
-**字段说明**(部分字段结合表 `sas_device`、事件表等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 首页综合信息对象 |
-| data.cameras | array | 首页左上角摄像头列表,来源于设备表 `sas_device` |
-| data.cameras[].id | string | 设备主键id(sas_device.id) |
-| data.cameras[].name | string | 摄像头名称 |
-| data.cameras[].ipAddr | string | 摄像头 IP 地址(sas_device.ip_addr) |
-| data.cameras[].status | string | 在线状态 |
-| data.cameras[].liveUrl | string | 实时直播地址 |
-| data.cameras[].playbackUrl | string | 回放地址 |
-| data.statistics | object | 设备与事件统计信息 |
-| data.statistics.totalDevices | int | 设备总数 |
-| data.statistics.onlineDevices | int | 在线设备数量 |
-| data.statistics.todayEvents | int | 今日事件总数 |
-| data.statistics.alarmEvents | int | 今日报警事件数量 |
-| data.serverInfo | object | 服务器资源使用情况 |
-| data.serverInfo.memoryMaxMb | int | JVM 最大内存(MB) |
-| data.serverInfo.memoryUsedMb | int | JVM 已用内存(MB) |
-| data.serverInfo.memoryFreeMb | int | JVM 空闲内存(MB) |
-| data.serverInfo.availableProcessors | int | 可用处理器核心数 |
-| data.serverInfo.serverTime | string | 服务器当前时间 |
-
-### 2. 事件列表
-
-**接口地址**: `GET /prod-api/service-sas/homepage/events`
-
-**功能描述**: 中上部分「事件列表」模块使用。查看各模块(智能分析抓拍、报警、出入口、停车、巡更等)所有事件信息,支持分页与按事件类型、设备、时间筛选。
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| eventType | string | 否 | 事件类型:snap / alarm / entrance / parking / patrol,不传则默认 snap |
-| current | int | 否 | 页码,默认 1 |
-| size | int | 否 | 每页数量,默认 10 |
-| deviceId | string | 否 | 设备编号 |
-| startTime | string | 否 | 开始时间(ISO 格式) |
-| endTime | string | 否 | 结束时间(ISO 格式) |
-
-**响应示例**: 与智能分析事件分页一致,返回 `data.list`、`data.total`、`data.current`、`data.size`,列表中每项为事件对象(含 eventId、deviceId、triggerTime、eventCode 等)。
-
-### 3. 实时事件(开启通知)
-
-**接口地址**: `GET /prod-api/service-sas/homepage/realtimeNotificationEvents`
-
-**功能描述**: 中上部分「实时事件」弹窗使用。返回最近一批开启通知的事件,用于弹窗左侧播放关联摄像头、右侧展示事件信息,支持提前关闭。最多返回 20 条,按触发时间倒序。
-
-**请求参数**: 无
-
-**响应示例**: 返回数组,每项为事件对象(结构同事件列表单项)。
-
-### 4. 预警历史
-
-**接口地址**: `GET /prod-api/service-sas/homepage/alertHistory`
-
-**功能描述**: 中下部分使用。按分类显示各类型开启通知的事件预警历史,支持分页;前端可点击详情重新查看。当前支持事件类型为智能分析抓拍(snap)。
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码,默认 1 |
-| size | int | 否 | 每页数量,默认 10 |
-| eventType | string | 否 | 事件类型,默认 snap |
-
-**响应示例**: 分页结构同事件列表,`data.list` 为开启通知的预警事件列表。
-
----
-
-## 电子地图
-
-### 1. 电子地图导航
-
-**接口地址**: `GET /prod-api/service-sas/map/navigate`
-
-**功能描述**: 在电子地图中,将鼠标放置在点位图标上,此时会将绑定的设备信息展示出来
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| mapId | string | 是 | 地图ID |
-| x | decimal | 否 | X坐标 |
-| y | decimal | 否 | Y坐标 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "map": {
-      "id": "map_001",
-      "name": "一楼平面图",
-      "backImgUrl": "http://192.168.10.151/images/map_001.jpg"
-    },
-    "devices": [
-      {
-        "id": "map_device_001",
-        "deviceId": "device_001",
-        "deviceName": "摄像头1",
-        "deviceType": "camera",
-        "x": 100.5,
-        "y": 200.3,
-        "status": "online"
-      }
-    ]
-  }
-}
-```
-
-### 2. 获取设备详情
-
-**接口地址**: `GET /prod-api/service-sas/map/device/{deviceId}/detail`
-
-**功能描述**: 获取地图上设备的详细信息
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "id": "device_001",
-    "deviceId": "DEV001",
-    "name": "摄像头1",
-    "type": "camera",
-    "ipAddr": "192.168.10.100",
-    "status": "online",
-    "liveUrl": "rtsp://192.168.10.100:554/stream",
-    "playbackUrl": "http://192.168.10.151/playback",
-    "address": "一楼大厅"
-  }
-}
-```
-
----
-
-## 智能分析
-
-### 1. 查询事件信息
-
-**接口地址**: `GET /prod-api/service-sas/intelligent/events`
-
-**功能描述**: 点击头部不同事件类型显示所有相关事件的记录
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| eventType | string | 是 | 事件类型(snap/alarm/entrance/parking/patrol等) |
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| startTime | datetime | 否 | 开始时间 |
-| endTime | datetime | 否 | 结束时间 |
-| deviceId | string | 否 | 设备编号 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "eventId": "event_001",
-        "deviceId": "device_001",
-        "deviceName": "摄像头1",
-        "channel": 0,
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 1001,
-        "eventName": "人员识别",
-        "picId": "pic_001",
-        "picUrl": "http://192.168.10.151/images/pic_001.jpg",
-        "similarity": 95,
-        "personCode": "person_001",
-        "personName": "张三"
-      }
-    ],
-    "total": 100,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_snap_event`、`sas_snap_type_code` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 智能分析事件列表 |
-| data.list[].eventId | string | 事件编码(sas_snap_event.event_id 等) |
-| data.list[].deviceId | string | 设备编号(sas_snap_event.device_id) |
-| data.list[].deviceName | string | 设备名称(业务字段) |
-| data.list[].channel | int | 通道号(sas_snap_event.channel) |
-| data.list[].triggerTime | string | 触发时间(sas_snap_event.trigger_time) |
-| data.list[].eventCode | int | 事件编码(sas_snap_event.event_code / sas_snap_type_code.code) |
-| data.list[].eventName | string | 事件名称 |
-| data.list[].picId | string | 图片id(sas_snap_event.event_pic_id 或 scene_pic_id) |
-| data.list[].picUrl | string | 图片访问地址(关联 sas_pic.url/path) |
-| data.list[].similarity | int | 比对相似度(sas_snap_event.similarity) |
-| data.list[].personCode | string | 人员编码(sas_snap_event.person_code) |
-| data.list[].personName | string | 人员姓名(关联 sas_person.name) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-### 2. 查询实时智能分析事件
-
-**接口地址**: `GET /prod-api/service-sas/intelligent/snap`
-
-**功能描述**: 查询实时智能分析事件(人脸识别等)
-
-**请求参数**: 同查询事件信息接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "eventId": "snap_001",
-        "deviceId": "device_001",
-        "channel": 0,
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 1001,
-        "eventName": "人员识别",
-        "scenePicId": "pic_001",
-        "eventPicId": "pic_002",
-        "similarity": 95,
-        "personCode": "person_001",
-        "personName": "张三",
-        "notify": true,
-        "scene": true
-      }
-    ],
-    "total": 100,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_snap_event`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 实时智能分析事件列表 |
-| data.list[].eventId | string | 事件编码(sas_snap_event.event_id) |
-| data.list[].deviceId | string | 设备编号(sas_snap_event.device_id) |
-| data.list[].channel | int | 通道号(sas_snap_event.channel) |
-| data.list[].triggerTime | string | 触发时间(sas_snap_event.trigger_time) |
-| data.list[].eventCode | int | 事件编码(sas_snap_event.event_code) |
-| data.list[].eventName | string | 事件名称 |
-| data.list[].scenePicId | string | 场景图片id(sas_snap_event.scene_pic_id) |
-| data.list[].eventPicId | string | 事件图片id(sas_snap_event.event_pic_id) |
-| data.list[].similarity | int | 比对相似度(sas_snap_event.similarity) |
-| data.list[].personCode | string | 人员编码(sas_snap_event.person_code) |
-| data.list[].personName | string | 人员姓名(关联 sas_person.name) |
-| data.list[].notify | boolean | 是否本地 MQTT 通知(sas_snap_event.notify) |
-| data.list[].scene | boolean | 是否包含场景图片(sas_snap_event.scene) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-### 3. 查询报警事件
-
-**接口地址**: `GET /prod-api/service-sas/intelligent/alarm`
-
-**功能描述**: 查询入侵紧急报警事件
-
-**请求参数**: 同查询事件信息接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "eventId": "alarm_001",
-        "deviceId": "device_001",
-        "channel": 0,
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 2001,
-        "eventName": "入侵报警",
-        "picId": "pic_001",
-        "relPerson": "person_001",
-        "dealPerson": "user_001",
-        "eventSystem": 1
-      }
-    ],
-    "total": 50,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_alarsas_event`、`sas_alarsas_event_code`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 报警事件列表 |
-| data.list[].eventId | string | 事件编码(sas_alarsas_event.event_id) |
-| data.list[].deviceId | string | 设备编号(sas_alarsas_event.device_id) |
-| data.list[].channel | int | 通道号(sas_alarsas_event.channel) |
-| data.list[].triggerTime | string | 触发时间(sas_alarsas_event.trigger_time) |
-| data.list[].eventCode | int | 事件编码(sas_alarsas_event.event_code / sas_alarsas_event_code.code) |
-| data.list[].eventName | string | 事件名称 |
-| data.list[].picId | string | 事件图片id(sas_alarsas_event.pic_id) |
-| data.list[].relPerson | string | 关联对象(sas_alarsas_event.rel_person) |
-| data.list[].dealPerson | string | 发现/处置人员(sas_alarsas_event.deal_person) |
-| data.list[].eventSystem | int | 系统编码(sas_alarsas_event.event_system) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-### 4. 查询门禁事件
-
-**接口地址**: `GET /prod-api/service-sas/intelligent/entrance`
-
-**功能描述**: 查询出入门禁控制事件
-
-**请求参数**: 同查询事件信息接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "eventId": "entrance_001",
-        "deviceId": "device_001",
-        "channel": 0,
-        "certifiedType": 1,
-        "certifiedNo": "110101199001011234",
-        "name": "张三",
-        "phone": "13800138000",
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 3001,
-        "cardId": "card_001",
-        "similarity": 98,
-        "picId": "pic_001"
-      }
-    ],
-    "total": 200,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_entrance_event`、`sas_entrance_event_code`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 门禁事件列表 |
-| data.list[].eventId | string | 事件编码(sas_entrance_event.event_id) |
-| data.list[].deviceId | string | 设备编号(sas_entrance_event.device_id) |
-| data.list[].channel | int | 通道号(sas_entrance_event.channel) |
-| data.list[].certifiedType | int | 证件类型(sas_entrance_event.certified_type) |
-| data.list[].certifiedNo | string | 证件号码(sas_entrance_event.certified_no) |
-| data.list[].name | string | 姓名(sas_entrance_event.name) |
-| data.list[].phone | string | 电话(sas_entrance_event.phone) |
-| data.list[].triggerTime | string | 触发时间(sas_entrance_event.trigger_time) |
-| data.list[].eventCode | int | 事件编码(sas_entrance_event.event_code / sas_entrance_event_code.code) |
-| data.list[].cardId | string | 卡号(sas_entrance_event.card_id) |
-| data.list[].similarity | int | 比对相似度(sas_entrance_event.similarity) |
-| data.list[].picId | string | 图片id(sas_entrance_event.pic_id) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-### 5. 查询停车事件
-
-**接口地址**: `GET /prod-api/service-sas/intelligent/parking`
-
-**功能描述**: 查询停车场车牌抓拍事件
-
-**请求参数**: 同查询事件信息接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "eventId": "parking_001",
-        "deviceId": "device_001",
-        "channel": 0,
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 4001,
-        "entranceCode": "entrance_001",
-        "plateNo": "京A12345",
-        "plateType": 1,
-        "plateColor": "blue",
-        "carType": 1,
-        "accessType": 1,
-        "similarity": 95,
-        "platePicId": "pic_001",
-        "eventPicId": "pic_002"
-      }
-    ],
-    "total": 150,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_parking_event`、`sas_parking_event_code`、`sas_car_type_code` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 停车场车牌抓拍事件列表 |
-| data.list[].eventId | string | 事件编码(sas_parking_event.event_id) |
-| data.list[].deviceId | string | 设备编号(sas_parking_event.device_id) |
-| data.list[].channel | int | 通道号(sas_parking_event.channel) |
-| data.list[].triggerTime | string | 触发时间(sas_parking_event.trigger_time) |
-| data.list[].eventCode | int | 事件编码(sas_parking_event.event_code / sas_parking_event_code.code) |
-| data.list[].entranceCode | string | 出入口编号(sas_parking_event.entrance_code) |
-| data.list[].plateNo | string | 车牌号码(sas_parking_event.plate_no) |
-| data.list[].plateType | int | 车牌类型(sas_parking_event.plate_type / sas_plate_type_code.code) |
-| data.list[].plateColor | string | 车牌颜色(sas_parking_event.plate_color / sas_plate_color.code) |
-| data.list[].carType | int | 车辆类型(sas_parking_event.car_type / sas_car_type_code.code) |
-| data.list[].accessType | int | 出入类型:1 进、2 出、9 抓拍(sas_parking_event.access_type) |
-| data.list[].similarity | int | 识别可信度(sas_parking_event.similarity) |
-| data.list[].platePicId | string | 车牌照片id(sas_parking_event.plate_pic_id) |
-| data.list[].eventPicId | string | 事件图片id(sas_parking_event.event_pic_id) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-### 6. 查询巡检事件
-
-**接口地址**: `GET /prod-api/service-sas/intelligent/patrol`
-
-**功能描述**: 查询实时电子巡检事件
-
-**请求参数**: 同查询事件信息接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "eventId": "patrol_001",
-        "deviceId": "device_001",
-        "channel": 0,
-        "triggerTime": "2026-01-30T10:00:00",
-        "eventCode": 5001,
-        "name": "巡检员1",
-        "credentialType": 1,
-        "credentialNo": "110101199001011234",
-        "typeName": "正常巡检",
-        "picId": "pic_001"
-      }
-    ],
-    "total": 80,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_patrol_event`、`sas_patrol_event_code`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 巡检事件列表 |
-| data.list[].eventId | string | 事件编码(sas_patrol_event.event_id) |
-| data.list[].deviceId | string | 设备编号(sas_patrol_event.device_id) |
-| data.list[].channel | int | 通道号(sas_patrol_event.channel) |
-| data.list[].triggerTime | string | 触发时间(sas_patrol_event.trigger_time) |
-| data.list[].eventCode | int | 事件编码(sas_patrol_event.event_code / sas_patrol_event_code.code) |
-| data.list[].name | string | 巡检人姓名(sas_patrol_event.name) |
-| data.list[].credentialType | int | 证件类型编码(sas_patrol_event.credential_type) |
-| data.list[].credentialNo | string | 证件号(sas_patrol_event.credential_no) |
-| data.list[].typeName | string | 巡检类型名称(sas_patrol_event.type_name) |
-| data.list[].picId | string | 照片id(sas_patrol_event.pic_id) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
----
-
-## 人员管理
-
-### 白名单
-
-#### 1.1 查询白名单人员信息
-
-**接口地址**: `GET /prod-api/service-sas/personnel/whitelist`
-
-**功能描述**: 同步agbox白名单,正常展示:姓名、人脸照片、备注、更新时间、详情
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| name | string | 否 | 姓名(模糊查询) |
-| personCode | string | 否 | 人员编码 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "personCode": "person_001",
-        "name": "张三",
-        "picId": "pic_001",
-        "picUrl": "http://192.168.10.151/images/pic_001.jpg",
-        "remark": "备注信息",
-        "updateTime": "2026-01-30T10:00:00",
-        "credentialType": 1,
-        "credentialNo": "110101199001011234"
-      }
-    ],
-    "total": 100,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_person`、`sas_credential_type_code`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 白名单人员列表 |
-| data.list[].personCode | string | 人员唯一编码(sas_person.person_code) |
-| data.list[].name | string | 姓名(sas_person.name) |
-| data.list[].picId | string | 人脸图片id(sas_person.pic_id) |
-| data.list[].picUrl | string | 人脸图片访问地址(关联 sas_pic.url) |
-| data.list[].remark | string | 备注信息 |
-| data.list[].updateTime | string | 人员更新时间(sas_person.update_time) |
-| data.list[].credentialType | int | 证件类型编码(sas_person.credential_type / sas_credential_type_code.code) |
-| data.list[].credentialNo | string | 证件号码(sas_person.credential_no) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 1.2 同步白名单
-
-**接口地址**: `POST /prod-api/service-sas/personnel/whitelistSync`
-
-**功能描述**: 从agbox同步白名单数据
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "同步成功",
-  "data": {
-    "syncCount": 50
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 同步结果提示信息 |
-| data | object | 同步结果对象 |
-| data.syncCount | int | 本次同步的记录数量 |
-
-#### 1.3 查询白名单人员详情
-
-**接口地址**: `GET /prod-api/service-sas/personnel/whitelist/{personCode}`
-
-**功能描述**: 查询白名单人员详细信息
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "personCode": "person_001",
-    "name": "张三",
-    "credentialType": 1,
-    "credentialNo": "110101199001011234",
-    "picId": "pic_001",
-    "picUrl": "http://192.168.10.151/images/pic_001.jpg",
-    "phone1": "13800138000",
-    "phone2": "010-12345678",
-    "remark": "备注信息",
-    "updateTime": "2026-01-30T10:00:00"
-  }
-}
-```
-
-**字段说明**(结合表 `sas_person`、`sas_credential_type_code`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 白名单人员详情对象 |
-| data.personCode | string | 人员唯一编码(sas_person.person_code) |
-| data.name | string | 姓名(sas_person.name) |
-| data.credentialType | int | 证件类型编码(sas_person.credential_type / sas_credential_type_code.code) |
-| data.credentialNo | string | 证件号码(sas_person.credential_no) |
-| data.picId | string | 人脸图片id(sas_person.pic_id) |
-| data.picUrl | string | 人脸图片访问地址(关联 sas_pic.url) |
-| data.phone1 | string | 电话1(sas_person.phone1) |
-| data.phone2 | string | 电话2(sas_person.phone2) |
-| data.remark | string | 备注信息 |
-| data.updateTime | string | 更新时间(sas_person.update_time) |
-
-### 黑名单
-
-#### 2.1 查询黑名单人员信息
-
-**接口地址**: `GET /prod-api/service-sas/personnel/blacklist`
-
-**功能描述**: 同步agbox黑名单展示字段与白名单相同
-
-**请求参数**: 同白名单查询接口
-
-**响应示例**: 同白名单查询接口
-
-#### 2.2 同步黑名单
-
-**接口地址**: `POST /prod-api/service-sas/personnel/blacklistSync`
-
-**功能描述**: 从agbox同步黑名单数据
-
-**请求参数**: 无
-
-**响应示例**: 同白名单同步接口
-
-#### 2.3 查询黑名单人员详情
-
-**接口地址**: `GET /prod-api/service-sas/personnel/blacklist/{personCode}`
-
-**功能描述**: 查询黑名单人员详细信息
-
-**请求参数**: 无
-
-**响应示例**: 同白名单详情接口
-
-### 在册人员
-
-#### 3.1 查询在册人员信息
-
-**接口地址**: `GET /prod-api/service-sas/personnel/registered`
-
-**功能描述**: 同步agbox白名单,默认展示:姓名、证件类型、证件号码、人员类型、更新日期、详情
-
-**请求参数**: 同白名单查询接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "personCode": "person_001",
-        "name": "张三",
-        "credentialType": 1,
-        "credentialNo": "110101199001011234",
-        "credentialTypeName": "身份证",
-        "peopleTypeCode": 1,
-        "peopleTypeName": "常住人口",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 200,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_person`、`sas_credential_type_code`、`sas_people_type_code`/`sas_person_type_code`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 在册人员列表 |
-| data.list[].personCode | string | 人员唯一编码(sas_person.person_code) |
-| data.list[].name | string | 姓名(sas_person.name) |
-| data.list[].credentialType | int | 证件类型编码(sas_person.credential_type) |
-| data.list[].credentialNo | string | 证件号码(sas_person.credential_no) |
-| data.list[].credentialTypeName | string | 证件类型名称(sas_credential_type_code.name) |
-| data.list[].peopleTypeCode | int | 人员类型编码(sas_person.person_type_code / sas_people_type_code.code) |
-| data.list[].peopleTypeName | string | 人员类型名称 |
-| data.list[].updateTime | string | 更新时间(sas_person.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 3.2 同步在册人员
-
-**接口地址**: `POST /prod-api/service-sas/personnel/registeredSync`
-
-**功能描述**: 从agbox同步在册人员数据
-
-**请求参数**: 无
-
-**响应示例**: 同白名单同步接口
-
-#### 3.3 查询在册人员详情
-
-**接口地址**: `GET /prod-api/service-sas/personnel/registered/{personCode}`
-
-**功能描述**: 查询在册人员详细信息
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "personCode": "person_001",
-    "name": "张三",
-    "credentialType": 1,
-    "credentialNo": "110101199001011234",
-    "credentialTypeName": "身份证",
-    "peopleTypeCode": 1,
-    "peopleTypeName": "常住人口",
-    "picId": "pic_001",
-    "phone1": "13800138000",
-    "phone2": "010-12345678",
-    "phone3": null,
-    "entranceTypeCode": null,
-    "entranceTypeName": null,
-    "remark": null,
-    "educationCode": 1,
-    "maritalStatusCode": 1,
-    "nationalityCode": "CHN",
-    "origin": "北京市",
-    "placeOfBirth": "北京市",
-    "updateTime": "2026-01-30T10:00:00"
-  }
-}
-```
-
-**字段说明**(结合表 `sas_person`、`sas_education_code`、`sas_marital_status_code`、`sas_nationality_code` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 在册人员详情对象 |
-| data.personCode | string | 人员唯一编码(sas_person.person_code) |
-| data.name | string | 姓名(sas_person.name) |
-| data.credentialType | int | 证件类型编码(sas_person.credential_type) |
-| data.credentialNo | string | 证件号码(sas_person.credential_no) |
-| data.credentialTypeName | string | 证件类型名称(sas_credential_type_code.name,如:身份证) |
-| data.peopleTypeCode | int | 人员类型编码(sas_person.people_type_code) |
-| data.peopleTypeName | string | 人员类型名称(sas_people_type_code.name,如:常住人口) |
-| data.picId | string | 人脸图片id(sas_person.pic_id) |
-| data.phone1 | string | 电话1(sas_person.phone1) |
-| data.phone2 | string | 电话2(sas_person.phone2) |
-| data.phone3 | string | 电话3(sas_person.phone3) |
-| data.entranceTypeCode | int | 出入类型编码(sas_person.entrance_type_code) |
-| data.entranceTypeName | string | 出入类型名称(暂无编码表时可为空) |
-| data.remark | string | 备注(sas_person 表暂无该字段时可为空) |
-| data.educationCode | int | 学历编码(sas_person.education_code / sas_education_code.code) |
-| data.maritalStatusCode | int | 婚姻状况编码(sas_person.marital_status_code / sas_marital_status_code.code) |
-| data.nationalityCode | string | 国家编码(sas_person.nationality_code / sas_nationality_code.code) |
-| data.origin | string | 籍贯(sas_person.origin) |
-| data.placeOfBirth | string | 出生地(sas_person.place_of_birth) |
-| data.updateTime | string | 更新时间(sas_person.update_time) |
-
-### 关注人员
-
-#### 4.1 查询关注人员信息
-
-**接口地址**: `GET /prod-api/service-sas/personnel/follow`
-
-**功能描述**: 同步agbox黑名单展示字段与关注人员相同
-
-**请求参数**: 同白名单查询接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "personCode": "person_001",
-        "name": "张三",
-        "followPeopleType": 1,
-        "followPeopleTypeName": "重点关注",
-        "picId": "pic_001",
-        "picUrl": "http://192.168.10.151/images/pic_001.jpg",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 50,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_follow_person`、`sas_follow_people_type`、`sas_pic`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 关注人员列表 |
-| data.list[].personCode | string | 人员编码(sas_follow_person.person_code) |
-| data.list[].name | string | 姓名(sas_follow_person.name) |
-| data.list[].followPeopleType | int | 关注人员类型编码(sas_follow_person.follow_people_type / sas_follow_people_type.code) |
-| data.list[].followPeopleTypeName | string | 关注人员类型名称(sas_follow_people_type.name) |
-| data.list[].picId | string | 图片地址id(sas_follow_person.pic_id) |
-| data.list[].picUrl | string | 图片访问地址(关联 sas_pic.url) |
-| data.list[].updateTime | string | 更新时间(sas_follow_person.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 4.2 同步关注人员
-
-**接口地址**: `POST /prod-api/service-sas/personnel/followSync`
-
-**功能描述**: 从agbox同步关注人员数据
-
-**请求参数**: 无
-
-**响应示例**: 同白名单同步接口
-
-#### 4.3 查询关注人员详情
-
-**接口地址**: `GET /prod-api/service-sas/personnel/follow/{personCode}`
-
-**功能描述**: 查询关注人员详细信息
-
-**请求参数**: 无
-
-**响应示例**: 同关注人员查询接口,包含更多详细信息
-
----
-
-## 一标六实
-
-### 实有力量
-
-#### 1.1 查询实有力量信息
-
-**接口地址**: `GET /prod-api/service-sas/one-standard-six-realities/power`
-
-**功能描述**: 与关注人员相同
-
-**请求参数**: 同人员查询接口
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "personCode": "person_001",
-        "name": "张三",
-        "powerCode": "power_001",
-        "powerName": "保安",
-        "securityCardNo": "SEC001",
-        "securityDutiesCode": "duty_001",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 30,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_person`、`sas_power_code`、`sas_security_duties_code` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 实有力量人员列表 |
-| data.list[].personCode | string | 人员编码(sas_person.person_code) |
-| data.list[].name | string | 姓名(sas_person.name) |
-| data.list[].powerCode | string | 实有力量分类编码(sas_person.power_code / sas_power_code.code) |
-| data.list[].powerName | string | 实有力量分类名称(sas_power_code.name) |
-| data.list[].securityCardNo | string | 保安人员卡号(sas_person.security_card_no) |
-| data.list[].securityDutiesCode | string | 安全职责编码(sas_person.security_duties_code / sas_security_duties_code.code) |
-| data.list[].updateTime | string | 更新时间(sas_person.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 1.2 同步实有力量
-
-**接口地址**: `POST /prod-api/service-sas/one-standard-six-realities/powerSync`
-
-**功能描述**: 从agbox同步实有力量数据
-
-**请求参数**: 无
-
-**响应示例**: 同人员同步接口
-
-### 实有设施
-
-#### 2.1 查询实有设施信息
-
-**接口地址**: `GET /prod-api/service-sas/one-standard-six-realities/facility`
-
-**功能描述**: 同步agbox
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| equipType | int | 否 | 装备类型 |
-| villageCode | string | 否 | 地块编码 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "code": "equip_001",
-        "equipName": "消防栓",
-        "equipType": 1,
-        "equipTypeName": "消防设施",
-        "villageCode": "village_001",
-        "floor": 1,
-        "urlId": "img_001",
-        "picUrl": "http://192.168.10.151/images/img_001.jpg",
-        "gisId": "gis_001",
-        "remark": "备注",
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 50,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_equip`、`sas_equip_code`、`sas_village`、`sas_pic`、`sas_gis`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 实有设施(装备)列表 |
-| data.list[].code | string | 装备编码(sas_equip.code) |
-| data.list[].equipName | string | 装备昵称(sas_equip.equip_name) |
-| data.list[].equipType | int | 装备类型编码(sas_equip.equip_type / sas_equip_code.code) |
-| data.list[].equipTypeName | string | 装备类型名称(sas_equip_code.name) |
-| data.list[].villageCode | string | 地块编码(sas_equip.village_code / sas_village.village_code) |
-| data.list[].floor | int | 楼层(sas_equip.floor) |
-| data.list[].urlId | string | 装备图片地址id(sas_equip.url_id / sas_pic.id) |
-| data.list[].picUrl | string | 装备图片访问地址(关联 sas_pic.url) |
-| data.list[].gisId | string | 定位地址id(sas_equip.gis_id / sas_gis.id) |
-| data.list[].remark | string | 备注(sas_equip.remark) |
-| data.list[].createTime | string | 创建时间(sas_equip.create_time) |
-| data.list[].updateTime | string | 更新时间(sas_equip.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 2.2 同步实有设施
-
-**接口地址**: `POST /prod-api/service-sas/one-standard-six-realities/facilitySync`
-
-**功能描述**: 从agbox同步实有设施数据
-
-**请求参数**: 无
-
-**响应示例**: 同人员同步接口
-
-### 出入口
-
-#### 3.1 查询出入口信息
-
-**接口地址**: `GET /prod-api/service-sas/one-standard-six-realities/entrance`
-
-**功能描述**: 同步agbox
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| villageCode | string | 否 | 地块编码 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "entranceCode": "entrance_001",
-        "name": "主入口",
-        "villageCode": "village_001",
-        "address": "一楼大厅",
-        "deviceIds": ["device_001", "device_002"],
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 10,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_entrance_event`、`sas_village`、`sas_device` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 出入口信息列表 |
-| data.list[].entranceCode | string | 出入口编号(来自停车/门禁事件 entrance_code 或独立配置) |
-| data.list[].name | string | 出入口名称 |
-| data.list[].villageCode | string | 地块编码(sas_village.village_code) |
-| data.list[].address | string | 地址 |
-| data.list[].deviceIds | array | 关联设备id 列表(关联 sas_device.id) |
-| data.list[].createTime | string | 创建时间 |
-| data.list[].updateTime | string | 更新时间 |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 3.2 同步出入口
-
-**接口地址**: `POST /prod-api/service-sas/one-standard-six-realities/entranceSync`
-
-**功能描述**: 从agbox同步出入口数据
-
-**请求参数**: 无
-
-**响应示例**: 同人员同步接口
-
-### 区域信息
-
-#### 4.1 查询区域信息
-
-**接口地址**: `GET /prod-api/service-sas/one-standard-six-realities/area`
-
-**功能描述**: 同步agbox
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| villageCode | string | 否 | 地块编码 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "buildingCode": "building_001",
-        "buildingNo": "B001",
-        "floorTotal": 10,
-        "houseTotal": 100,
-        "note": "区域描述",
-        "gisId": "gis_001",
-        "villageCode": "village_001",
-        "placeType": 1,
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 20,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_building`、`sas_village`、`sas_gis`、`sas_place_type` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 区域信息列表 |
-| data.list[].buildingCode | string | 区域编码(sas_building.building_code) |
-| data.list[].buildingNo | string | 区域编号(sas_building.building_no) |
-| data.list[].floorTotal | int | 楼层数(sas_building.floor_total) |
-| data.list[].houseTotal | int | 户数(sas_building.house_total) |
-| data.list[].note | string | 区域描述(sas_building.note) |
-| data.list[].gisId | string | gis 定位id(sas_building.gis_id / sas_gis.id) |
-| data.list[].villageCode | string | 地块编码(sas_building.village_code / sas_village.village_code) |
-| data.list[].placeType | int | 用途类型编码(sas_building.place_type / sas_place_type.id) |
-| data.list[].createTime | string | 创建时间(sas_building.create_time) |
-| data.list[].updateTime | string | 更新时间(sas_building.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 4.2 同步区域信息
-
-**接口地址**: `POST /prod-api/service-sas/one-standard-six-realities/areaSync`
-
-**功能描述**: 从agbox同步区域信息数据
-
-**请求参数**: 无
-
-**响应示例**: 同人员同步接口
-
-### 房屋信息
-
-#### 5.1 查询房屋信息
-
-**接口地址**: `GET /prod-api/service-sas/one-standard-six-realities/house`
-
-**功能描述**: 同步agbox
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| buildingCode | string | 否 | 区域编码 |
-| villageCode | string | 否 | 地块编码 |
-| houseNo | string | 否 | 部位编号 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "houseCode": "house_001",
-        "houseNo": "101",
-        "houseName": "101室",
-        "floor": 1,
-        "houseLabelCode": 1,
-        "houseLabel": "住宅",
-        "housePurposeCode": 1,
-        "housePurpose": "居住",
-        "note": "部位描述",
-        "isPublic": false,
-        "isAction": true,
-        "systemTypeCode": 1,
-        "buildingCode": "building_001",
-        "gisId": "gis_001",
-        "personNumber": 3,
-        "houseArea": 100,
-        "villageCode": "village_001",
-        "tags": "tag1,tag2",
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 500,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_house`、`sas_house_type_code`、`sas_house_purpose_code`、`sas_village`、`sas_building` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 房屋(部位)信息列表 |
-| data.list[].houseCode | string | 部位编码(sas_house.house_code) |
-| data.list[].houseNo | string | 部位编号(sas_house.house_no) |
-| data.list[].houseName | string | 部位名称(sas_house.house_name) |
-| data.list[].floor | int | 楼层(sas_house.floor) |
-| data.list[].houseLabelCode | int | 部位类别编码(sas_house.house_label_code / sas_house_type_code.id) |
-| data.list[].houseLabel | string | 部位类别名称(sas_house.house_label) |
-| data.list[].housePurposeCode | int | 部位用途编码(sas_house.house_purpose_code / sas_house_purpose_code.id) |
-| data.list[].housePurpose | string | 部位用途名称(sas_house.house_purpose) |
-| data.list[].note | string | 部位描述(sas_house.note) |
-| data.list[].isPublic | boolean | 是否公共部位(sas_house.is_public) |
-| data.list[].isAction | boolean | 是否受控区域(sas_house.is_action) |
-| data.list[].systemTypeCode | int | 系统类型编码(sas_house.systesas_type_code / sas_systesas_type_code.code) |
-| data.list[].buildingCode | string | 区域编码(sas_house.building_code / sas_building.building_code) |
-| data.list[].gisId | string | 经纬度id(sas_house.gis_id / sas_gis.id) |
-| data.list[].personNumber | int | 最大居住/办公人数(sas_house.person_number) |
-| data.list[].houseArea | int | 部位面积(sas_house.house_area) |
-| data.list[].villageCode | string | 地块编码(sas_house.village_code / sas_village.village_code) |
-| data.list[].tags | string | 系统标签(sas_house.tags) |
-| data.list[].createTime | string | 创建时间(sas_house.create_time) |
-| data.list[].updateTime | string | 更新时间(sas_house.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 5.2 同步房屋信息
-
-**接口地址**: `POST /prod-api/service-sas/one-standard-six-realities/houseSync`
-
-**功能描述**: 从 agbox 同步房屋信息数据。可选传入 `buildingCode` 仅同步指定区域下的房屋。
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| buildingCode | string | 否 | 区域编码,不传则同步全部房屋 |
-
-**响应示例**: 同人员同步接口
-
-### 地块信息
-
-#### 6.1 查询地块信息
-
-**接口地址**: `GET /prod-api/service-sas/one-standard-six-realities/village`
-
-**功能描述**: 同步agbox
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-| villageName | string | 否 | 地块名称(模糊查询) |
-| isDefault | boolean | 否 | 是否默认 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "villageCode": "village_001",
-        "villageName": "XX小区",
-        "address": "XX路XX号",
-        "provinceCode": 110000,
-        "provinceName": "上海市",
-        "cityCode": 110100,
-        "cityName": "市辖区",
-        "districtCode": 110101,
-        "districtName": "青浦区",
-        "streetCode": 110101001,
-        "streetName": "徐泾镇",
-        "roadCode": "road_001",
-        "roadName": "华徐公路",
-        "policeStationCode": "station_001",
-        "policeStationName": "青浦分局徐乐路派出所",
-        "latitude": 31.123456,
-        "longitude": 121.123456,
-        "altitude": 0,
-        "companyCode": "company_001",
-        "companyName": "XX物业公司",
-        "picUrlId": "img_001",
-        "gisId": "gis_001",
-        "gisAreaId": "area_001",
-        "isDefault": true,
-        "createTime": "2026-01-30T10:00:00",
-        "updateTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 5,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**(结合表 `sas_village`、`sas_police_station`、`sas_sys_area` 等):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 地块信息列表 |
-| data.list[].villageCode | string | 地块编码(sas_village.village_code) |
-| data.list[].villageName | string | 地块名称(sas_village.village_name) |
-| data.list[].address | string | 地块地址(sas_village.address) |
-| data.list[].provinceCode | int | 省编码(sas_village.province_code / sas_sys_area.code) |
-| data.list[].provinceName | string | 省份名称(sas_sys_area.name) |
-| data.list[].cityCode | int | 市编码(sas_village.city_code / sas_sys_area.code) |
-| data.list[].cityName | string | 城市名称(sas_sys_area.name) |
-| data.list[].districtCode | int | 区县编码(sas_village.district_code / sas_sys_area.code) |
-| data.list[].districtName | string | 区县名称(sas_sys_area.name) |
-| data.list[].streetCode | int | 街道编码(sas_village.street_code / sas_sys_area.code) |
-| data.list[].streetName | string | 街道名称(sas_sys_area.name) |
-| data.list[].roadCode | string | 道路编码(sas_village.road_code) |
-| data.list[].roadName | string | 道路名称(sas_sys_area.name) |
-| data.list[].policeStationCode | string | 派出所编码(sas_village.police_station_code / sas_police_station.code) |
-| data.list[].policeStationName | string | 派出所名称(sas_police_station.name) |
-| data.list[].latitude | number | 纬度(sas_gis.lat,无数据时默认 0) |
-| data.list[].longitude | number | 经度(sas_gis.lon,无数据时默认 0) |
-| data.list[].altitude | number | 高度(sas_gis.alt,无数据时默认 0) |
-| data.list[].companyCode | string | 单位编码(sas_village.company_code / sas_company_type_code.code) |
-| data.list[].companyName | string | 单位名称(sas_village.company_name) |
-| data.list[].picUrlId | string | 图片地址路径id(sas_village.pic_url_id / sas_pic.id) |
-| data.list[].gisId | string | gis 定位id(sas_village.gis_id / sas_gis.id) |
-| data.list[].gisAreaId | string | 区域坐标id(sas_village.gis_area_id / sas_gis_area.id) |
-| data.list[].isDefault | boolean | 是否默认地块(sas_village.is_default) |
-| data.list[].createTime | string | 创建时间(sas_village.create_time) |
-| data.list[].updateTime | string | 更新时间(sas_village.update_time) |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 6.2 同步地块信息
-
-**接口地址**: `POST /prod-api/service-sas/one-standard-six-realities/villageSync`
-
-**功能描述**: 从agbox同步地块信息数据
-
-**请求参数**: 无
-
-**响应示例**: 同人员同步接口
-
-#### 6.3 设置默认地块
-
-**接口地址**: `PUT /prod-api/service-sas/one-standard-six-realities/villageDefault/{villageCode}`
-
-**功能描述**: 设置默认地块
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "设置成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 设置默认地块结果提示信息 |
-
----
-
-## 系统管理
-
-### 系统信息
-
-#### 1.1 查询系统信息
-
-**接口地址**: `GET /prod-api/service-sas/system/info`
-
-**功能描述**: 共分三个模块:系统信息、系统版本、系统备份
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "systemInfo": {
-      "id": "client_001",
-      "name": "XX厂商",
-      "createTime": "2026-01-30T10:00:00",
-      "updateTime": "2026-01-30T10:00:00"
-    },
-    "versionInfo": {
-      "id": 1,
-      "jarVersion": "1.0.0",
-      "vueVersion": "1.0.0",
-      "durationOfUpdate": "5分钟",
-      "createTime": "2026-01-30T10:00:00",
-      "updateTime": "2026-01-30T10:00:00"
-    },
-    "backupInfo": {
-      "lastBackupTime": "2026-01-30T10:00:00",
-      "backupFiles": [
-        {
-          "fileName": "backup_20260130.sql",
-          "fileSize": "1024MB",
-          "createTime": "2026-01-30T10:00:00"
-        }
-      ]
-    }
-  }
-}
-```
-
-**字段说明**(结合表 `sas_systesas_info`、`sas_version_admin` 以及备份记录):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 系统信息综合对象 |
-| data.systemInfo | object | 系统信息(对应 sas_systesas_info) |
-| data.systemInfo.id | string | 客户端id(sas_systesas_info.id) |
-| data.systemInfo.name | string | 厂商名称(sas_systesas_info.name) |
-| data.systemInfo.createTime | string | 创建时间(sas_systesas_info.create_time) |
-| data.systemInfo.updateTime | string | 更新时间(sas_systesas_info.update_time) |
-| data.versionInfo | object | 系统版本信息(sas_version_admin) |
-| data.versionInfo.id | int | 主键id(sas_version_admin.id) |
-| data.versionInfo.jarVersion | string | 后端 jar 版本号(sas_version_admin.jar_version) |
-| data.versionInfo.vueVersion | string | 前端 vue 版本号(sas_version_admin.vue_version) |
-| data.versionInfo.durationOfUpdate | string | 更新时长描述(sas_version_admin.duration_of_update) |
-| data.versionInfo.createTime | string | 创建时间(sas_version_admin.create_time) |
-| data.versionInfo.updateTime | string | 更新时间(sas_version_admin.update_time) |
-| data.backupInfo | object | 备份信息 |
-| data.backupInfo.lastBackupTime | string | 最近一次备份时间 |
-| data.backupInfo.backupFiles | array | 备份文件列表 |
-| data.backupInfo.backupFiles[].fileName | string | 备份文件名 |
-| data.backupInfo.backupFiles[].fileSize | string | 备份文件大小 |
-| data.backupInfo.backupFiles[].createTime | string | 备份文件创建时间 |
-
-### 系统版本
-
-#### 2.1 查询系统版本
-
-**接口地址**: `GET /prod-api/service-sas/system/version`
-
-**功能描述**: 查询系统版本信息
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "id": 1,
-    "jarVersion": "1.0.0",
-    "vueVersion": "1.0.0",
-    "durationOfUpdate": "5分钟",
-    "createTime": "2026-01-30T10:00:00",
-    "updateTime": "2026-01-30T10:00:00"
-  }
-}
-```
-
-**字段说明**(结合表 `sas_version_admin`):
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 系统版本信息对象 |
-| data.id | int | 主键id(sas_version_admin.id) |
-| data.jarVersion | string | 后端 jar 版本号(sas_version_admin.jar_version) |
-| data.vueVersion | string | 前端 vue 版本号(sas_version_admin.vue_version) |
-| data.durationOfUpdate | string | 更新时长描述(sas_version_admin.duration_of_update) |
-| data.createTime | string | 创建时间(sas_version_admin.create_time) |
-| data.updateTime | string | 更新时间(sas_version_admin.update_time) |
-
-#### 2.2 升级系统版本
-
-**接口地址**: `POST /prod-api/service-sas/system/versionUpgrade`
-
-**功能描述**: 点击升级至最新版本会进行版本号检查并升级
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "升级成功",
-  "data": {
-    "jarVersion": "1.0.1",
-    "vueVersion": "1.0.1"
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 升级结果提示信息 |
-| data | object | 升级后版本信息 |
-| data.jarVersion | string | 新的后端 jar 版本号 |
-| data.vueVersion | string | 新的前端 vue 版本号 |
-
-### 系统备份
-
-#### 3.1 备份数据库
-
-**接口地址**: `POST /prod-api/service-sas/system/backupBd`
-
-**功能描述**: 将当前系统数据库文件进行备份
-
-**请求参数**: 无
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "备份成功",
-  "data": {
-    "fileName": "backup_20260130_100000.sql",
-    "filePath": "/backup/backup_20260130_100000.sql",
-    "fileSize": "1024MB"
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 备份结果提示信息 |
-| data | object | 备份结果对象 |
-| data.fileName | string | 备份文件名 |
-| data.filePath | string | 备份文件存储路径 |
-| data.fileSize | string | 备份文件大小 |
-
-#### 3.2 查询备份文件列表
-
-**接口地址**: `GET /prod-api/service-sas/system/backupList`
-
-**功能描述**: 查询所有备份文件
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| current | int | 否 | 页码 |
-| size | int | 否 | 每页数量 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "list": [
-      {
-        "fileName": "backup_20260130_100000.sql",
-        "filePath": "/backup/backup_20260130_100000.sql",
-        "fileSize": "1024MB",
-        "createTime": "2026-01-30T10:00:00"
-      }
-    ],
-    "total": 10,
-    "current": 1,
-    "size": 10
-  }
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| data | object | 分页数据对象 |
-| data.list | array | 备份文件列表 |
-| data.list[].fileName | string | 备份文件名 |
-| data.list[].filePath | string | 备份文件存储路径 |
-| data.list[].fileSize | string | 备份文件大小 |
-| data.list[].createTime | string | 备份文件创建时间 |
-| data.total | int | 总记录数 |
-| data.current | int | 当前页码 |
-| data.size | int | 每页数量 |
-
-#### 3.3 恢复数据库
-
-**接口地址**: `POST /prod-api/service-sas/system/backupRestore`
-
-**功能描述**: 将生成的备份文件上传点击恢复进行数据还原
-
-**请求参数**:
-
-```json
-{
-  "fileName": "backup_20260130_100000.sql",
-  "filePath": "/backup/backup_20260130_100000.sql"
-}
-```
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "msg": "恢复成功"
-}
-```
-
-**字段说明**:
-
-| 字段名 | 类型 | 说明 |
-|--------|------|------|
-| status | string | 接口调用状态 |
-| code | int | 业务状态码 |
-| msg | string | 数据库恢复结果提示信息 |
-
-#### 3.4 下载备份文件
-
-**接口地址**: `GET /prod-api/service-sas/system/backupDownload/{fileName}`
-
-**功能描述**: 下载备份文件
-
-**请求参数**: 无
-
-**响应**: 文件流
-
----
-
-## 附录
-
-### 数据字典
-
-#### 设备类型编码
-
-| 编码 | 名称 |
-|------|------|
-| 1 | 摄像头 |
-| 2 | 门禁设备 |
-| 3 | 报警设备 |
-| 4 | 停车设备 |
-| 5 | 巡检设备 |
-
-#### 事件类型编码
-
-| 编码 | 名称 |
-|------|------|
-| 1001 | 人员识别 |
-| 1002 | 人脸识别 |
-| 2001 | 入侵报警 |
-| 2002 | 紧急报警 |
-| 3001 | 门禁开门 |
-| 3002 | 门禁关门 |
-| 4001 | 车辆进入 |
-| 4002 | 车辆离开 |
-| 5001 | 正常巡检 |
-| 5002 | 异常巡检 |
-
-#### 证件类型编码
-
-| 编码 | 名称 |
-|------|------|
-| 1 | 身份证 |
-| 2 | 护照 |
-| 3 | 军官证 |
-| 4 | 其他 |
-
-#### 事件优先级编码
-
-| 编码 | 名称 |
-|------|------|
-| 1 | 紧急 |
-| 2 | 高 |
-| 3 | 普通 |
-| 4 | 无 |
-
-### 错误码说明
-
-| 错误码 | 说明 |
-|--------|------|
-| 200 | 成功 |
-| 400 | 请求参数错误 |
-| 401 | 未授权,请先登录 |
-| 403 | 无权限访问 |
-| 404 | 资源不存在 |
-| 500 | 服务器内部错误 |
-| 1001 | 用户名或密码错误 |
-| 1002 | 账号已被禁用 |
-| 1003 | 账号不存在 |
-| 2001 | 设备不存在 |
-| 2002 | 设备已离线 |
-| 3001 | 人员不存在 |
-| 3002 | 人员已在白名单中 |
-| 4001 | 地图不存在 |
-| 4002 | 设备已绑定到其他地图 |
-| 5001 | 系统配置错误 |
-| 5002 | 数据库连接失败 |
-
-### 时间格式
-
-所有时间字段统一使用 ISO 8601 格式:`YYYY-MM-DDTHH:mm:ss`
-
-示例:`2026-01-30T10:00:00`
-
-### 视频流接口
-
-#### 获取直播流地址
-
-**接口地址**: `GET /prod-api/service-sas/video/liveStream`
-
-**功能描述**: 获取设备直播流地址
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| deviceId | string | 是 | 设备ID |
-| channel | int | 否 | 通道号,默认0 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "rtspUrl": "rtsp://192.168.10.100:554/stream",
-    "hlsUrl": "http://192.168.10.151/hls/stream_001.m3u8",
-    "flvUrl": "http://192.168.10.151/flv/stream_001.flv"
-  }
-}
-```
-
-#### 获取回放流地址
-
-**接口地址**: `GET /prod-api/service-sas/video/playbackStream`
-
-**功能描述**: 获取设备回放流地址
-
-**请求参数**:
-
-| 参数名 | 类型 | 必填 | 说明 |
-|--------|------|------|------|
-| deviceId | string | 是 | 设备ID |
-| channel | int | 否 | 通道号,默认0 |
-| startTime | datetime | 是 | 开始时间 |
-| endTime | datetime | 是 | 结束时间 |
-
-**响应示例**:
-
-```json
-{
-  "status": "SUCCESS",
-  "code": 200,
-  "data": {
-    "rtspUrl": "rtsp://192.168.10.100:554/playback?start=20260130100000&end=20260130110000",
-    "hlsUrl": "http://192.168.10.151/hls/playback_001.m3u8",
-    "flvUrl": "http://192.168.10.151/flv/playback_001.flv"
-  }
-}
-```
-
----
-
-## 版本历史
-
-| 版本 | 日期 | 说明 | 作者 |
-|------|------|------|------|
-| v1.0 | 2026-01-30 | 初始版本,完成所有模块 API 设计 | - |
-| v1.1 | 2026-02-28 | 网络配置改为分页接口;修正黑名单/实有设施接口路径;系统配置与激活表名更正为 sas_system_*;同步房屋支持可选 buildingCode;实有设施响应示例修正 | - |
-
----
-
-## 联系方式
-
-如有问题或建议,请联系开发团队。

+ 0 - 0
sas-service-0a1fc66b-9bb3-443c-94be-e3907721d2f2-tcp192168101591883/.lck


+ 0 - 0
sas-service-290bb711-b6cc-493c-9061-8e7b3514f438-tcp192168101591883/.lck


+ 0 - 0
sas-service-4d23a61e-8bf3-4af8-b965-a2f3a4e0ac97-tcp192168101591883/.lck


+ 0 - 0
sas-service-501f5fe4-8a41-4e4f-abfd-2bf18dd561ee-tcp192168101591883/.lck


+ 0 - 0
sas-service-58084279-9b31-4d9f-af94-eddbc0b43d63-tcp192168101591883/.lck


+ 0 - 0
sas-service-769ca000-6bcd-40e7-b499-d0a4afd01615-tcp192168101591883/.lck


+ 0 - 0
sas-service-7a4fe915-15db-4e8d-babc-08be5ac1a97b-tcp192168101591883/.lck


+ 0 - 0
sas-service-a5369716-399e-42c5-b5ba-d1158751977d-tcp192168101591883/.lck


+ 0 - 0
sas-service-c427b2c2-b890-48fc-8e87-11bc19119c41-tcp192168101591883/.lck


+ 0 - 0
sas-service-ccff152a-e34e-4e5c-aed7-0d660b243dfe-tcp192168101591883/.lck


+ 0 - 0
sas-service-d09f88b7-7ccd-4e53-a28f-385e92f9b884-tcp192168101591883/.lck


+ 0 - 0
sas-service-d6b62103-a9b4-4df2-b962-30629ad9a298-tcp192168101591883/.lck


+ 0 - 0
sas-service-e57d1fc9-7e98-44b9-90e1-5d0421075df8-tcp192168101591883/.lck


+ 0 - 0
sas-service-e97718ff-50b9-4229-8e24-4d70f07d0247-tcp192168101591883/.lck


+ 0 - 7
service-sas/service-sas-biz/pom.xml

@@ -57,13 +57,6 @@
             <version>1.2.5</version>
         </dependency>
 
-        <!-- 工具类 -->
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.8.20</version>
-        </dependency>
-
         <dependency>
             <groupId>com.usky</groupId>
             <artifactId>ruoyi-common-swagger</artifactId>

+ 3 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/common/dahua/DahuaVideoStreamService.java

@@ -2,9 +2,12 @@ package com.usky.sas.common.dahua;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.usky.sas.common.global.Constant;
+import com.usky.sas.common.global.StreamContext;
 import com.usky.sas.common.util.GetIpUtils;
 import com.usky.sas.service.vo.VideoStreamVo;
 import com.usky.sas.common.exception.BusinessException;
+import com.usky.sas.common.global.GlobalMemoryMap;
 import com.usky.sas.common.entity.DahuaNvrInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 2 - 2
service-sas/service-sas-biz/src/main/java/com/usky/sas/common/dahua/InitNetSDKLib.java

@@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil;
 import com.usky.sas.common.exception.BusinessException;
 import com.usky.sas.common.global.GlobalMemoryMap;
 import com.usky.sas.common.hik.OsSelect;
-import com.usky.sas.service.impl.DeviceServiceImpl;
+import com.usky.sas.service.impl.SasDeviceServiceImpl;
 import com.sun.jna.Callback;
 import com.sun.jna.Memory;
 import com.sun.jna.Native;
@@ -222,7 +222,7 @@ public class InitNetSDKLib {
         long offset = 0L;
 
         for(int i = 0; i < pJavaStuArr.length; ++i) {
-            DeviceServiceImpl.SetStructDataToPointer(pJavaStuArr[i], pNativeData, offset);
+            SasDeviceServiceImpl.SetStructDataToPointer(pJavaStuArr[i], pNativeData, offset);
             offset += (long)pJavaStuArr[i].size();
         }
 

+ 161 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/common/entity/DeviceVideoInfo.java

@@ -17,4 +17,165 @@ public class DeviceVideoInfo {
     private Integer bitrate;
     @ApiModelProperty("视频流类型 1实时预览 2回放")
     private Integer streamType;
+
+    public DeviceVideoInfo() {
+    }
+
+    public Integer getUserId() {
+        return this.userId;
+    }
+
+    public String getSsrc() {
+        return this.ssrc;
+    }
+
+    public Integer getHandle() {
+        return this.handle;
+    }
+
+    public String getUrl() {
+        return this.url;
+    }
+
+    public Integer getBitrate() {
+        return this.bitrate;
+    }
+
+    public Integer getStreamType() {
+        return this.streamType;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public void setSsrc(String ssrc) {
+        this.ssrc = ssrc;
+    }
+
+    public void setHandle(Integer handle) {
+        this.handle = handle;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public void setBitrate(Integer bitrate) {
+        this.bitrate = bitrate;
+    }
+
+    public void setStreamType(Integer streamType) {
+        this.streamType = streamType;
+    }
+
+    public boolean equals(Object o) {
+        if (o == this) {
+            return true;
+        } else if (!(o instanceof DeviceVideoInfo)) {
+            return false;
+        } else {
+            DeviceVideoInfo other = (DeviceVideoInfo)o;
+            if (!other.canEqual(this)) {
+                return false;
+            } else {
+                Object this$userId = this.getUserId();
+                Object other$userId = other.getUserId();
+                if (this$userId == null) {
+                    if (other$userId != null) {
+                        return false;
+                    }
+                } else if (!this$userId.equals(other$userId)) {
+                    return false;
+                }
+
+                Object this$ssrc = this.getSsrc();
+                Object other$ssrc = other.getSsrc();
+                if (this$ssrc == null) {
+                    if (other$ssrc != null) {
+                        return false;
+                    }
+                } else if (!this$ssrc.equals(other$ssrc)) {
+                    return false;
+                }
+
+                Object this$handle = this.getHandle();
+                Object other$handle = other.getHandle();
+                if (this$handle == null) {
+                    if (other$handle != null) {
+                        return false;
+                    }
+                } else if (!this$handle.equals(other$handle)) {
+                    return false;
+                }
+
+                label62: {
+                    Object this$url = this.getUrl();
+                    Object other$url = other.getUrl();
+                    if (this$url == null) {
+                        if (other$url == null) {
+                            break label62;
+                        }
+                    } else if (this$url.equals(other$url)) {
+                        break label62;
+                    }
+
+                    return false;
+                }
+
+                label55: {
+                    Object this$bitrate = this.getBitrate();
+                    Object other$bitrate = other.getBitrate();
+                    if (this$bitrate == null) {
+                        if (other$bitrate == null) {
+                            break label55;
+                        }
+                    } else if (this$bitrate.equals(other$bitrate)) {
+                        break label55;
+                    }
+
+                    return false;
+                }
+
+                Object this$streamType = this.getStreamType();
+                Object other$streamType = other.getStreamType();
+                if (this$streamType == null) {
+                    if (other$streamType != null) {
+                        return false;
+                    }
+                } else if (!this$streamType.equals(other$streamType)) {
+                    return false;
+                }
+
+                return true;
+            }
+        }
+    }
+
+    protected boolean canEqual(Object other) {
+        return other instanceof DeviceVideoInfo;
+    }
+
+    public int hashCode() {
+        final int PRIME = 59;
+        int result = 1;
+        Object $userId = this.getUserId();
+        result = result * PRIME + ($userId == null ? 43 : $userId.hashCode());
+        Object $ssrc = this.getSsrc();
+        result = result * PRIME + ($ssrc == null ? 43 : $ssrc.hashCode());
+        Object $handle = this.getHandle();
+        result = result * PRIME + ($handle == null ? 43 : $handle.hashCode());
+        Object $url = this.getUrl();
+        result = result * PRIME + ($url == null ? 43 : $url.hashCode());
+        Object $bitrate = this.getBitrate();
+        result = result * PRIME + ($bitrate == null ? 43 : $bitrate.hashCode());
+        Object $streamType = this.getStreamType();
+        result = result * PRIME + ($streamType == null ? 43 : $streamType.hashCode());
+        return result;
+    }
+
+    public String toString() {
+        return "DeviceVideoInfo(userId=" + this.getUserId() + ", ssrc=" + this.getSsrc() + ", handle=" + this.getHandle() + ", url=" + this.getUrl() + ", bitrate=" + this.getBitrate() + ", streamType=" + this.getStreamType() + ")";
+    }
 }
+

+ 17 - 23
service-sas/service-sas-biz/src/main/java/com/usky/sas/common/onvif/OnvifService.java

@@ -1,28 +1,11 @@
 package com.usky.sas.common.onvif;
 
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.usky.sas.common.entity.SearchDeviceInfo;
 import com.usky.sas.common.exception.BusinessException;
 import com.usky.sas.common.util.GetIpUtils;
-import com.fjkj.agcp.entity.Device;
-import com.fjkj.agcp.entity.info.SearchDeviceInfo;
-import com.fjkj.agcp.mapper.DeviceMapper;
-import java.io.StringReader;
-import java.net.DatagramPacket;
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.MulticastSocket;
-import java.net.NetworkInterface;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
+import com.usky.sas.domain.SasDevice;
+import com.usky.sas.mapper.SasDeviceMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -30,6 +13,15 @@ import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.StringReader;
+import java.net.*;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
 @Service
 public class OnvifService {
     private static final Logger log = LoggerFactory.getLogger(OnvifService.class);
@@ -43,7 +35,7 @@ public class OnvifService {
         return "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n<e:Envelope xmlns:e=\"http://www.w3.org/2003/05/soap-envelope\" \n xmlns:w=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" \n xmlns:d=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\" \n xmlns:dn=\"http://www.onvif.org/ver10/network/wsdl\"> \n <e:Header> \n  <w:MessageID>uuid:" + UUID.randomUUID() + "</w:MessageID> \n  <w:To e:mustUnderstand=\"true\">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To> \n  <w:Action a:mustUnderstand=\"true\">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</w:Action> \n </e:Header> \n <e:Body> \n  <d:Probe> \n   <d:Types>dn:NetworkVideoTransmitter</d:Types> \n  </d:Probe> \n </e:Body> \n</e:Envelope>  ";
     }
 
-    public static List<SearchDeviceInfo> searchDeviceByOnvif(Integer second, DeviceMapper deviceMapper) {
+    public static List<SearchDeviceInfo> searchDeviceByOnvif(Integer second, SasDeviceMapper deviceMapper) {
         List<SearchDeviceInfo> deviceInfoList = new ArrayList();
 
         try (MulticastSocket socket = new MulticastSocket(0)) {
@@ -83,7 +75,7 @@ public class OnvifService {
         return deviceInfoList;
     }
 
-    private static SearchDeviceInfo parseProbeMatchResponse(String responseData, DeviceMapper deviceMapper) {
+    private static SearchDeviceInfo parseProbeMatchResponse(String responseData, SasDeviceMapper deviceMapper) {
         try {
             SearchDeviceInfo searchDeviceInfo = new SearchDeviceInfo();
             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
@@ -133,7 +125,9 @@ public class OnvifService {
                 }
             }
 
-            Device device = (Device)deviceMapper.selectOne((Wrapper)(new LambdaQueryWrapper()).eq(Device::getMacAddr, searchDeviceInfo.getMacAddr()));
+            LambdaQueryWrapper<SasDevice> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(SasDevice::getMacAddr, searchDeviceInfo.getMacAddr());
+            SasDevice device = deviceMapper.selectOne(wrapper);
             searchDeviceInfo.setIsAdded(device != null);
             return searchDeviceInfo;
         } catch (Exception e) {

+ 1 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/common/onvif/StandardOnvifService.java

@@ -49,7 +49,7 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
-@Service
+@Service("onvifStandardOnvifService")
 public class StandardOnvifService {
     private static final Logger log = LoggerFactory.getLogger(StandardOnvifService.class);
 

+ 19 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasDeviceController.java

@@ -37,6 +37,8 @@ import java.util.List;
  * GET  /prod-api/service-sas/device/import/template    获取设备导入模板(Excel)
  * POST /prod-api/service-sas/device/importBatchDeviceByExcel 批量设备导入
  * POST /prod-api/service-sas/device/config/batch-add   批量新增设备配置
+ * GET  /prod-api/service-sas/device/unitySearchDevice  扫描获取周边设备
+ * POST /prod-api/service-sas/device/unityAddSearchDevice  统一扫描添加设备
  */
 @RestController
 @RequestMapping("/device")
@@ -143,6 +145,23 @@ public class SasDeviceController {
         return ApiResult.success();
     }
 
+    /**
+     * 扫描获取周边设备(统一扫描接口)
+     */
+    @GetMapping("/unitySearchDevice")
+    public ApiResult<List<SearchDeviceInfoVO>> unitySearchDevice(@RequestParam("second") Integer second,
+                                                                 @RequestParam("code") Integer code) {
+        return ApiResult.success(sasDeviceService.unitySearchDevice(second, code));
+    }
+
+    /**
+     * 统一扫描添加设备:根据前端选择的扫描结果和协议类型,批量生成设备记录
+     */
+    @PostMapping("/unityAddSearchDevice")
+    public ApiResult<List<String>> unityAddSearchDevice(@RequestBody UnityAddSearchDeviceRequest request) {
+        return ApiResult.success(sasDeviceService.unityAddSearchDevice(request));
+    }
+
     /**
      * 获取设备导入模板(Excel)
      */

+ 2 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAlarsasGroupType.java

@@ -1,5 +1,6 @@
 package com.usky.sas.domain;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -17,7 +18,7 @@ public class SasAlarsasGroupType implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId(value = "id")
+    @TableId(value = "id", type = IdType.INPUT)
     private String id;
 
     private String name;

+ 2 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasDevice.java

@@ -1,5 +1,6 @@
 package com.usky.sas.domain;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -18,7 +19,7 @@ public class SasDevice implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId(value = "id")
+    @TableId(value = "id", type = IdType.INPUT)
     private String id;
 
     private String deviceId;

+ 2 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasGis.java

@@ -1,5 +1,6 @@
 package com.usky.sas.domain;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -18,7 +19,7 @@ public class SasGis implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId(value = "id")
+    @TableId(value = "id", type = IdType.INPUT)
     private String id;
 
     /** 经度 */

+ 5 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/MqttService.java

@@ -270,6 +270,11 @@ public class MqttService {
                 String eventId = message.getId() != null && !message.getId().isEmpty()
                         ? message.getId()
                         : IdUtil.randomUUID();
+                // 如果该事件已存在(设备重发/重复消息),避免主键冲突,直接跳过
+                if (snapEventService.getById(eventId) != null) {
+                    log.info("抓拍事件已存在, 跳过保存, eventId={}", eventId);
+                    return;
+                }
                 event.setEventId(eventId);
 
                 BeanUtil.copyProperties(message, event, "eventId");

+ 13 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasDeviceService.java

@@ -62,5 +62,18 @@ public interface SasDeviceService extends CrudService<SasDevice> {
 
     /** 批量新增设备(按 channels 生成多条记录) */
     void addDeviceBatch(DeviceBatchAddRequest request);
+
+    /**
+     * 扫描网络,获取周边设备列表。
+     *
+     * @param second 扫描时长(秒)
+     * @param code   协议类型:1-ONVIF,2-海康,3-大华 等
+     */
+    List<SearchDeviceInfoVO> unitySearchDevice(Integer second, Integer code);
+
+    /**
+     * 统一扫描添加设备:根据前端选择的扫描结果和协议类型,批量生成 sas_device 记录。
+     */
+    List<String> unityAddSearchDevice(UnityAddSearchDeviceRequest request);
 }
 

+ 430 - 1
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasDeviceServiceImpl.java

@@ -4,14 +4,34 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.alibaba.fastjson2.JSON;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.sun.jna.Memory;
+import com.sun.jna.Pointer;
+import com.sun.jna.Structure;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.common.dahua.EM_SEND_SEARCH_TYPE;
+import com.usky.sas.common.dahua.InitNetSDKLib;
+import com.usky.sas.common.dahua.NET_IN_STARTSERACH_DEVICE;
+import com.usky.sas.common.dahua.NET_OUT_STARTSERACH_DEVICE;
+import com.usky.sas.common.dahua.NetSDKLib;
+import com.usky.sas.common.dahua.RemoteDeviceInfo;
+import com.usky.sas.common.entity.SearchDeviceInfo;
+import com.usky.sas.common.enums.DeviceTypeEnum;
+import com.usky.sas.common.enums.ProtocolEnum;
+import com.usky.sas.common.hik.InitSadp;
+import com.usky.sas.common.hik.PDEVICE_FIND_CALLBACK_V40;
+import com.usky.sas.common.hik.SADP_DEVICE_INFO_V40;
+import com.usky.sas.common.hik.Sadp;
+import com.usky.sas.common.onvif.StandardOnvifService;
+import com.usky.sas.common.onvif.OnvifService;
+import com.usky.sas.common.util.GetIpUtils;
 import com.usky.sas.domain.SasAlarsasGroupType;
+import com.usky.sas.domain.SasConfig;
 import com.usky.sas.domain.SasDevice;
 import com.usky.sas.domain.SasGis;
-import com.usky.sas.domain.SasConfig;
 import com.usky.sas.domain.SasVideoMonitorGroupType;
 import com.usky.sas.enums.SystemTypeCodeEnum;
 import com.usky.sas.mapper.SasAlarsasGroupTypeMapper;
@@ -26,6 +46,10 @@ import com.usky.sas.service.dto.agbox.JsonRpcRequest;
 import com.usky.sas.service.vo.*;
 import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -65,6 +89,9 @@ public class SasDeviceServiceImpl extends AbstractCrudService<SasDeviceMapper, S
     @Autowired
     private SasGisMapper sasGisMapper;
 
+    @Autowired
+    private StandardOnvifService standardOnvifService;
+
     private final ObjectMapper objectMapper = new ObjectMapper();
 
     @Override
@@ -133,6 +160,17 @@ public class SasDeviceServiceImpl extends AbstractCrudService<SasDeviceMapper, S
         SasDevice device = new SasDevice();
         device.setId(UUID.randomUUID().toString());
         applyConfig(device, request);
+        // 经纬度信息:有任一非空则创建 gis 记录并关联
+        if (request.getLon() != null || request.getLat() != null || request.getAlt() != null) {
+            String gisId = UUID.randomUUID().toString();
+            SasGis gis = new SasGis();
+            gis.setId(gisId);
+            gis.setLon(request.getLon() != null ? request.getLon() : BigDecimal.ZERO);
+            gis.setLat(request.getLat() != null ? request.getLat() : BigDecimal.ZERO);
+            gis.setAlt(request.getAlt() != null ? request.getAlt() : BigDecimal.ZERO);
+            sasGisMapper.insert(gis);
+            device.setGisId(gisId);
+        }
         LocalDateTime now = LocalDateTime.now();
         device.setCreateTime(now);
         device.setUpdateTime(now);
@@ -147,6 +185,34 @@ public class SasDeviceServiceImpl extends AbstractCrudService<SasDeviceMapper, S
             return;
         }
         applyConfig(device, request);
+        // 若传入了经纬度/高度,则更新或创建 gis 记录
+        if (request.getLon() != null || request.getLat() != null || request.getAlt() != null) {
+            String gisId = device.getGisId();
+            SasGis gis = null;
+            if (gisId != null) {
+                gis = sasGisMapper.selectById(gisId);
+            }
+            if (gis == null) {
+                gisId = UUID.randomUUID().toString();
+                gis = new SasGis();
+                gis.setId(gisId);
+            }
+            if (request.getLon() != null) {
+                gis.setLon(request.getLon());
+            }
+            if (request.getLat() != null) {
+                gis.setLat(request.getLat());
+            }
+            if (request.getAlt() != null) {
+                gis.setAlt(request.getAlt());
+            }
+            if (device.getGisId() == null) {
+                sasGisMapper.insert(gis);
+                device.setGisId(gisId);
+            } else {
+                sasGisMapper.updateById(gis);
+            }
+        }
         device.setUpdateTime(LocalDateTime.now());
         this.updateById(device);
     }
@@ -597,6 +663,260 @@ public class SasDeviceServiceImpl extends AbstractCrudService<SasDeviceMapper, S
         return "设备批量导入成功";
     }
 
+    @Override
+    public List<SearchDeviceInfoVO> unitySearchDevice(Integer second, Integer code) {
+        if (second == null || second <= 0) {
+            second = 3;
+        }
+        if (code == null) {
+            throw new BusinessException("协议类型 code 不能为空");
+        }
+
+        // 海康 SADP 扫描
+        if (code.equals(ProtocolEnum.HIK.getCode())) {
+            Sadp sadp = InitSadp.sadp;
+            log.info("SADP 释放资源开始");
+            sadp.SADP_Clearup();
+            log.info("SADP 正在关闭");
+            sadp.SADP_Stop();
+
+            final List<SearchDeviceInfo> deviceInfoList = new ArrayList<>();
+            PDEVICE_FIND_CALLBACK_V40 callback = new PDEVICE_FIND_CALLBACK_V40() {
+                @Override
+                public void invoke(SADP_DEVICE_INFO_V40 lpDeviceInfo, Pointer pUserData) {
+                    log.info("SADP 回调:发现设备");
+                    SearchDeviceInfo info = new SearchDeviceInfo();
+                    info.setIpAddr(bytesToString(lpDeviceInfo.struSadpDeviceInfo.szIPv4Address));
+                    info.setPort(lpDeviceInfo.struSadpDeviceInfo.dwPort);
+                    info.setDeviceId(String.valueOf(lpDeviceInfo.struSadpDeviceInfo.dwDeviceType));
+                    info.setSerialNo(bytesToString(lpDeviceInfo.struSadpDeviceInfo.szSerialNO));
+                    info.setNote(bytesToString(lpDeviceInfo.struSadpDeviceInfo.szDevDesc));
+                    info.setOemInfo(bytesToString(lpDeviceInfo.struSadpDeviceInfo.szOEMinfo));
+                    info.setMacAddr(bytesToMacString(lpDeviceInfo.struSadpDeviceInfo.szMAC));
+                    info.setNetMask(bytesToString(lpDeviceInfo.struSadpDeviceInfo.szIPv4SubnetMask));
+                    info.setGateway(bytesToString(lpDeviceInfo.struSadpDeviceInfo.szIPv4Gateway));
+
+                    SasDevice device = baseMapper.selectOne(
+                            new LambdaQueryWrapper<SasDevice>()
+                                    .eq(SasDevice::getMacAddr, info.getMacAddr())
+                    );
+                    info.setIsAdded(device != null);
+                    info.setIsActive(StrUtil.utf8Str(lpDeviceInfo.struSadpDeviceInfo.byActivated).equals("0"));
+                    info.setProtocol(ProtocolEnum.HIK.getCode());
+                    deviceInfoList.add(info);
+                }
+            };
+
+            boolean result = sadp.SADP_Start_V40(callback);
+            sadp.SADP_SetAutoRequestInterval(0);
+            try {
+                Thread.sleep(second * 1000L);
+                log.info("SADP 正在停止");
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+            if (!result) {
+                log.error("SADP 查询失败,错误码: {}", sadp.SADP_GetLastError());
+            }
+
+            List<SearchDeviceInfo> deviceList = sortByIpAddr(deviceInfoList);
+            deviceList = distinctByMac(deviceList);
+            log.info("海康搜索结果:{}", JSON.toJSONString(deviceList));
+            return toVOList(deviceList);
+        }
+
+        // ONVIF 扫描
+        if (code.equals(ProtocolEnum.ONVIF.getCode())) {
+            List<SearchDeviceInfo> list = OnvifService.searchDeviceByOnvif(second, baseMapper);
+            if (list == null) {
+                list = Collections.emptyList();
+            }
+            list.forEach(d -> d.setProtocol(ProtocolEnum.ONVIF.getCode()));
+            List<SearchDeviceInfo> deviceList = sortByIpAddr(list);
+            deviceList = distinctByMac(deviceList);
+            log.info("ONVIF 搜索结果:{}", JSON.toJSONString(deviceList));
+            return toVOList(deviceList);
+        }
+
+        // 大华 NetSDK 扫描
+        if (code.equals(ProtocolEnum.DA_HUA.getCode())) {
+            NET_IN_STARTSERACH_DEVICE inParam = new NET_IN_STARTSERACH_DEVICE();
+            final List<SearchDeviceInfo> deviceInfoList = new ArrayList<>();
+            NetSDKLib.fSearchDevicesCBEx cb = new NetSDKLib.fSearchDevicesCBEx() {
+                @Override
+                public void invoke(Long lSearchHandle, Pointer pDevNetInfo, Pointer pUserData) {
+                    NetSDKLib.DEVICE_NET_INFO_EX lpDeviceInfo = new NetSDKLib.DEVICE_NET_INFO_EX(pDevNetInfo);
+                    lpDeviceInfo.read();
+
+                    SearchDeviceInfo info = new SearchDeviceInfo();
+                    info.setIpAddr(new String(lpDeviceInfo.szIP).trim());
+                    info.setPort(lpDeviceInfo.nPort);
+                    info.setDeviceId(new String(lpDeviceInfo.szDevName).trim());
+                    info.setSerialNo(new String(lpDeviceInfo.szSerialNo).trim());
+                    info.setOemInfo(new String(lpDeviceInfo.szVendor).trim());
+                    info.setMacAddr(new String(lpDeviceInfo.szMac).trim());
+                    info.setNetMask(new String(lpDeviceInfo.szSubmask).trim());
+                    info.setGateway(new String(lpDeviceInfo.szGateway).trim());
+
+                    SasDevice device = baseMapper.selectOne(
+                            new LambdaQueryWrapper<SasDevice>()
+                                    .eq(SasDevice::getMacAddr, info.getMacAddr())
+                    );
+                    info.setIsAdded(device != null);
+                    info.setIsActive(StrUtil.utf8Str(lpDeviceInfo.byInitStatus).equals("2"));
+                    info.setProtocol(ProtocolEnum.DA_HUA.getCode());
+                    deviceInfoList.add(info);
+                }
+            };
+
+            inParam.cbSearchDevices = cb;
+            byte[] localIpBytes = GetIpUtils.getServerIP().getBytes();
+            System.arraycopy(localIpBytes, 0, inParam.szLocalIp, 0, localIpBytes.length);
+            inParam.emSendType = EM_SEND_SEARCH_TYPE.EM_SEND_SEARCH_TYPE_BROADCAST.ordinal();
+
+            Pointer pInBuf = new Memory(inParam.size());
+            SetStructDataToPointer(inParam, pInBuf, 0L);
+
+            NET_OUT_STARTSERACH_DEVICE outParam = new NET_OUT_STARTSERACH_DEVICE();
+            Pointer pOutBuf = new Memory(outParam.size());
+            SetStructDataToPointer(outParam, pOutBuf, 0L);
+
+            Long searchHandle = InitNetSDKLib.dhNetSDK.CLIENT_StartSearchDevicesEx(pInBuf, pOutBuf);
+            if (searchHandle == 0L) {
+                log.error("启动大华设备搜索失败,错误码:{}", InitNetSDKLib.dhNetSDK.CLIENT_GetLastError());
+                return Collections.emptyList();
+            }
+
+            log.info("大华设备搜索已启动,本机IP: {},等待设备响应...", GetIpUtils.getServerIP());
+            try {
+                Thread.sleep(second * 1000L);
+                boolean stopped = InitNetSDKLib.dhNetSDK.CLIENT_StopSearchDevices(searchHandle);
+                if (!stopped) {
+                    log.error("关闭大华设备搜索失败,错误码:{}", InitNetSDKLib.dhNetSDK.CLIENT_GetLastError());
+                }
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+
+            List<SearchDeviceInfo> deviceList = sortByIpAddr(deviceInfoList);
+            deviceList = distinctByMac(deviceList);
+            log.info("大华搜索结果:{}", JSON.toJSONString(deviceList));
+            return toVOList(deviceList);
+        }
+
+        throw new BusinessException("不支持的协议类型 code=" + code);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<String> unityAddSearchDevice(UnityAddSearchDeviceRequest request) {
+        if (request == null || request.getCode() == null || request.getDevices() == null || request.getDevices().isEmpty()) {
+            throw new BusinessException("统一扫描添加设备参数不能为空");
+        }
+        log.info("统一扫描添加设备,请求参数:{}", JSON.toJSONString(request));
+
+        List<SasDevice> toSave = new ArrayList<>();
+        List<String> ids = new ArrayList<>();
+
+        Integer code = request.getCode();
+
+        // 海康
+        if (code.equals(ProtocolEnum.HIK.getCode())) {
+            for (SearchDeviceAddRequest bo : request.getDevices()) {
+                if (bo == null) continue;
+                if (Objects.equals(bo.getVideoType(), DeviceTypeEnum.IPC.getCode())) {
+                    SasDevice device = BeanUtil.toBean(bo, SasDevice.class);
+                    String id = IdUtil.randomUUID();
+                    device.setId(id);
+                    SasGis gis = new SasGis();
+                    String gisId = IdUtil.randomUUID();
+                    gis.setId(gisId);
+                    sasGisMapper.insert(gis);
+                    device.setGisId(gisId);
+                    device.setChannel(1);
+                    device.setDeviceType(SystemTypeCodeEnum.video.getCode());
+                    device.setVideoProtocol(ProtocolEnum.HIK.getCode());
+                    device.setIsBinding(false);
+                    device.setShield(false);
+                    toSave.add(device);
+                    ids.add(id);
+                }
+            }
+        }
+        // ONVIF
+        else if (code.equals(ProtocolEnum.ONVIF.getCode())) {
+            for (SearchDeviceAddRequest bo : request.getDevices()) {
+                if (bo == null) continue;
+                if (Objects.equals(bo.getVideoType(), DeviceTypeEnum.IPC.getCode())) {
+                    SasDevice device = BeanUtil.toBean(bo, SasDevice.class);
+                    String id = IdUtil.randomUUID();
+                    device.setId(id);
+                    SasGis gis = new SasGis();
+                    String gisId = IdUtil.randomUUID();
+                    gis.setId(gisId);
+                    sasGisMapper.insert(gis);
+                    device.setGisId(gisId);
+                    device.setDeviceType(SystemTypeCodeEnum.video.getCode());
+                    device.setShield(false);
+                    device.setChannel(1);
+                    device.setVideoProtocol(ProtocolEnum.ONVIF.getCode());
+                    toSave.add(device);
+                    ids.add(id);
+                }
+            }
+        }
+        // 大华
+        else if (code.equals(ProtocolEnum.DA_HUA.getCode())) {
+            for (SearchDeviceAddRequest bo : request.getDevices()) {
+                if (bo == null) continue;
+                if (Objects.equals(bo.getVideoType(), DeviceTypeEnum.IPC.getCode())) {
+                    SasDevice device = BeanUtil.toBean(bo, SasDevice.class);
+                    String id = IdUtil.randomUUID();
+                    device.setId(id);
+                    SasGis gis = new SasGis();
+                    String gisId = IdUtil.randomUUID();
+                    gis.setId(gisId);
+                    sasGisMapper.insert(gis);
+                    device.setGisId(gisId);
+                    device.setDeviceType(SystemTypeCodeEnum.video.getCode());
+                    device.setVideoProtocol(ProtocolEnum.DA_HUA.getCode());
+                    device.setIsBinding(false);
+                    device.setShield(false);
+                    device.setChannel(1);
+                    toSave.add(device);
+                    ids.add(id);
+                }
+            }
+        } else {
+            throw new BusinessException("不支持的协议类型 code=" + code);
+        }
+
+        // 过滤已存在的设备(按 macAddr + deviceType + channel)
+        if (!toSave.isEmpty()) {
+            Iterator<SasDevice> it = toSave.iterator();
+            while (it.hasNext()) {
+                SasDevice d = it.next();
+                LambdaQueryWrapper<SasDevice> wrapper = new LambdaQueryWrapper<>();
+                wrapper.eq(SasDevice::getMacAddr, d.getMacAddr())
+                        .eq(SasDevice::getDeviceType, d.getDeviceType())
+                        .eq(SasDevice::getChannel, d.getChannel());
+                if (this.count(wrapper) > 0) {
+                    it.remove();
+                }
+            }
+            if (!toSave.isEmpty()) {
+                LocalDateTime now = LocalDateTime.now();
+                for (SasDevice d : toSave) {
+                    d.setCreateTime(now);
+                    d.setUpdateTime(now);
+                }
+                this.saveBatch(toSave);
+            }
+        }
+
+        return ids;
+    }
+
     private String deviceTypeName(Integer code) {
         SystemTypeCodeEnum e = SystemTypeCodeEnum.getByCode(code);
         return e != null ? e.getMessage() : null;
@@ -629,6 +949,8 @@ public class SasDeviceServiceImpl extends AbstractCrudService<SasDeviceMapper, S
         device.setDeviceType(request.getDeviceType());
         device.setIpAddr(request.getIpAddr());
         device.setPort(request.getPort());
+        device.setVideoProtocol(request.getVideoProtocol());
+        device.setVideoType(request.getVideoType());
         device.setUsername(request.getUsername());
         device.setPassword(request.getPassword());
         device.setShield(request.getShield());
@@ -660,5 +982,112 @@ public class SasDeviceServiceImpl extends AbstractCrudService<SasDeviceMapper, S
         vo.setUpdateTime(d.getUpdateTime());
         return vo;
     }
+
+    /**
+     * 根据 MAC 地址去重,保留第一条记录,保持原有顺序
+     */
+    private List<SearchDeviceInfo> distinctByMac(List<SearchDeviceInfo> list) {
+        if (list == null || list.isEmpty()) {
+            return list;
+        }
+        Map<String, SearchDeviceInfo> map = new LinkedHashMap<>();
+        for (SearchDeviceInfo info : list) {
+            String mac = info.getMacAddr();
+            // 以 MAC 为 key,已存在的不覆盖,保证顺序
+            map.putIfAbsent(mac, info);
+        }
+        return new ArrayList<>(map.values());
+    }
+
+    private static String bytesToString(byte[] bytes) {
+        if (bytes == null) {
+            return null;
+        }
+        int len = 0;
+        while (len < bytes.length && bytes[len] != 0) {
+            len++;
+        }
+        return new String(bytes, 0, len).trim();
+    }
+
+    private static String bytesToMacString(byte[] bytes) {
+        if (bytes == null) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < bytes.length; i++) {
+            int b = bytes[i] & 0xFF;
+            if (b == 0 && i >= 5) {
+                break;
+            }
+            if (sb.length() > 0) {
+                sb.append("-");
+            }
+            sb.append(String.format("%02X", b));
+        }
+        return sb.toString();
+    }
+
+    private static long ipToLong(String ip) {
+        if (ip == null || ip.isEmpty()) {
+            return Long.MAX_VALUE;
+        }
+        String[] parts = ip.split("\\.");
+        if (parts.length != 4) {
+            return Long.MAX_VALUE;
+        }
+        long res = 0;
+        for (String part : parts) {
+            try {
+                int v = Integer.parseInt(part);
+                res = (res << 8) | (v & 0xFF);
+            } catch (NumberFormatException e) {
+                return Long.MAX_VALUE;
+            }
+        }
+        return res;
+    }
+
+    private static List<SearchDeviceInfo> sortByIpAddr(List<SearchDeviceInfo> list) {
+        if (list == null) {
+            return Collections.emptyList();
+        }
+        return list.stream()
+                .sorted(Comparator.comparingLong(d -> ipToLong(d.getIpAddr())))
+                .collect(Collectors.toList());
+    }
+
+    private static List<SearchDeviceInfoVO> toVOList(List<SearchDeviceInfo> list) {
+        if (list == null) {
+            return Collections.emptyList();
+        }
+        List<SearchDeviceInfoVO> result = new ArrayList<>();
+        for (SearchDeviceInfo d : list) {
+            if (d == null) {
+                continue;
+            }
+            SearchDeviceInfoVO vo = new SearchDeviceInfoVO();
+            vo.setIpAddr(d.getIpAddr());
+            vo.setPort(d.getPort());
+            vo.setDeviceId(d.getDeviceId());
+            vo.setSerialNo(d.getSerialNo());
+            vo.setNote(d.getNote());
+            vo.setOemInfo(d.getOemInfo());
+            vo.setMacAddr(d.getMacAddr());
+            vo.setNetMask(d.getNetMask());
+            vo.setGateway(d.getGateway());
+            vo.setIsAdded(d.getIsAdded());
+            vo.setIsActive(d.getIsActive());
+            vo.setProtocol(d.getProtocol());
+            result.add(vo);
+        }
+        return result;
+    }
+
+    public static void SetStructDataToPointer(Structure pJavaStu, Pointer pNativeData, long OffsetOfpNativeData) {
+        pJavaStu.write();
+        Pointer pJavaMem = pJavaStu.getPointer();
+        pNativeData.write(OffsetOfpNativeData, pJavaMem.getByteArray(0L, pJavaStu.size()), 0, pJavaStu.size());
+    }
 }
 

+ 24 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/vo/DeviceConfigSaveRequest.java

@@ -2,6 +2,8 @@ package com.usky.sas.service.vo;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class DeviceConfigSaveRequest {
 
@@ -15,6 +17,16 @@ public class DeviceConfigSaveRequest {
 
     private Integer port;
 
+    /**
+     * 视频协议:如 1-ONVIF、2-海康、3-大华 等(对应 sas_device.video_protocol)
+     */
+    private Integer videoProtocol;
+
+    /**
+     * 视频设备类型:如 1-IPC、2-NVR 等(对应 sas_device.video_type)
+     */
+    private Integer videoType;
+
     private String username;
 
     private String password;
@@ -32,5 +44,17 @@ public class DeviceConfigSaveRequest {
     private String alarmGroupType;
 
     private String note;
+
+    /** 经度 */
+    private BigDecimal lon;
+
+    /** 纬度 */
+    private BigDecimal lat;
+
+    /** 高度 */
+    private BigDecimal alt;
+
+    /** 楼层(目前仅作为辅助展示使用) */
+    private Integer floor;
 }
 

+ 8 - 2
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/vo/IntelligentEventPageRequest.java

@@ -1,8 +1,10 @@
 package com.usky.sas.service.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
@@ -27,10 +29,14 @@ public class IntelligentEventPageRequest {
     @Max(value = 100, message = "每页大小不能超过100")
     private Integer size = 10;
 
-    @ApiModelProperty(value = "开始时间")
+    @ApiModelProperty(value = "开始时间", example = "2026-03-12 00:00:00")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime startTime;
 
-    @ApiModelProperty(value = "结束时间")
+    @ApiModelProperty(value = "结束时间", example = "2026-03-27 23:59:59")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
 
     @ApiModelProperty(value = "设备ID")

+ 0 - 1353
usky-agapp.sql

@@ -1,1353 +0,0 @@
-/*
-Navicat MySQL Data Transfer
-
-Source Server         : 安防集成应用系统
-Source Server Version : 80035
-Source Host           : 192.168.10.151:3306
-Source Database       : agapp
-
-Target Server Type    : MYSQL
-Target Server Version : 80035
-File Encoding         : 65001
-
-Date: 2026-01-30 16:43:10
-*/
-
-SET FOREIGN_KEY_CHECKS=0;
-
--- ----------------------------
--- Table structure for sas_acquisition_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_acquisition_event`;
-CREATE TABLE `sas_acquisition_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号 0 表示本主机',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `total` decimal(10,2) DEFAULT NULL COMMENT '抄表数',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='数据采集设备事件表';
-
--- ----------------------------
--- Table structure for sas_acquisition_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_acquisition_event_code`;
-CREATE TABLE `sas_acquisition_event_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='数据采集设备事件编码表';
-
--- ----------------------------
--- Table structure for sas_alarsas_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_alarsas_event`;
-CREATE TABLE `sas_alarsas_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `rel_person` varchar(255)  DEFAULT NULL COMMENT '关联对象',
-  `deal_person` varchar(255)  DEFAULT NULL COMMENT '发现/处置人员',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `event_system` int DEFAULT NULL COMMENT '系统编码',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='入侵紧急报警事件表';
-
--- ----------------------------
--- Table structure for sas_alarsas_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_alarsas_event_code`;
-CREATE TABLE `sas_alarsas_event_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='入侵和紧急报警事件编码表';
-
--- ----------------------------
--- Table structure for sas_alarsas_group_type
--- ----------------------------
-DROP TABLE IF EXISTS `sas_alarsas_group_type`;
-CREATE TABLE `sas_alarsas_group_type` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  `note` varchar(255)  DEFAULT NULL COMMENT '描述',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='报警联动组类型表';
-
--- ----------------------------
--- Table structure for sas_alarsas_systesas_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_alarsas_systesas_code`;
-CREATE TABLE `sas_alarsas_systesas_code` (
-  `code` int NOT NULL COMMENT '警报类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '警报类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='警报类型表';
-
--- ----------------------------
--- Table structure for sas_building
--- ----------------------------
-DROP TABLE IF EXISTS `sas_building`;
-CREATE TABLE `sas_building` (
-  `building_code` varchar(255)  NOT NULL COMMENT '区域编码',
-  `building_no` varchar(255)  DEFAULT NULL COMMENT '区域编号',
-  `floor_total` int DEFAULT NULL COMMENT '楼层数',
-  `house_total` int DEFAULT NULL COMMENT '户数',
-  `note` varchar(255)  DEFAULT NULL COMMENT '区域描述',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT 'gis定位id',
-  `village_code` varchar(255)  DEFAULT NULL COMMENT '地块编码',
-  `place_type` int DEFAULT NULL COMMENT '用途类型编码',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`building_code`) USING BTREE,
-  UNIQUE KEY `buildingNo` (`building_no`) USING BTREE COMMENT '区域编号唯一'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='区域信息表';
-
--- ----------------------------
--- Table structure for sas_card_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_card_type_code`;
-CREATE TABLE `sas_card_type_code` (
-  `code` int NOT NULL COMMENT '门禁卡类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '门禁卡类型名称',
-  `note` varchar(255)  DEFAULT NULL COMMENT '说明',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='门禁卡类型编码表';
-
--- ----------------------------
--- Table structure for sas_car_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_car_type_code`;
-CREATE TABLE `sas_car_type_code` (
-  `code` int NOT NULL COMMENT '车辆类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '车辆类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='车辆类型编码表';
-
--- ----------------------------
--- Table structure for sas_certified_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_certified_type_code`;
-CREATE TABLE `sas_certified_type_code` (
-  `code` int NOT NULL COMMENT '认证类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '认证类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='认证类型编码表';
-
--- ----------------------------
--- Table structure for sas_collection_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_collection_event`;
-CREATE TABLE `sas_collection_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号 0 表示本主机',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '事件图片id',
-  `scene_pic_id` varchar(255)  DEFAULT NULL COMMENT '场景图片id',
-  `val` decimal(10,2) DEFAULT NULL COMMENT '状态值',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `total` decimal(10,2) DEFAULT NULL COMMENT '抄表数',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='状态采集探测事件表';
-
--- ----------------------------
--- Table structure for sas_collection_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_collection_event_code`;
-CREATE TABLE `sas_collection_event_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='状态采集探测事件编码表';
-
--- ----------------------------
--- Table structure for sas_company_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_company_type_code`;
-CREATE TABLE `sas_company_type_code` (
-  `code` int NOT NULL COMMENT '主键编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='单位类型编码表';
-
--- ----------------------------
--- Table structure for sas_config
--- ----------------------------
-DROP TABLE IF EXISTS `sas_config`;
-CREATE TABLE `sas_config` (
-  `id` int NOT NULL COMMENT '主键id',
-  `keyds` varchar(255)  DEFAULT NULL COMMENT '秘钥',
-  `host` varchar(255)  DEFAULT NULL COMMENT 'ip地址',
-  `port` varchar(255)  DEFAULT NULL COMMENT 'ip端口',
-  `username` varchar(255)  DEFAULT NULL COMMENT 'mqtt用户名',
-  `password` varchar(255)  DEFAULT NULL COMMENT 'mqtt用户密码',
-  `is_tsl` tinyint DEFAULT NULL COMMENT '是否安全传输 true:启用 false:不启用',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Agbox/Metabus配置表';
-
--- ----------------------------
--- Table structure for sas_credential_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_credential_type_code`;
-CREATE TABLE `sas_credential_type_code` (
-  `code` int NOT NULL COMMENT '证件类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '证件类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='证件类型表';
-
--- ----------------------------
--- Table structure for sas_device
--- ----------------------------
-DROP TABLE IF EXISTS `sas_device`;
-CREATE TABLE `sas_device` (
-  `id` varchar(255)  NOT NULL COMMENT '主键',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编码',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `device_type` int DEFAULT NULL COMMENT '设备类型',
-  `ip_addr` varchar(255)  DEFAULT NULL COMMENT '设备IP地址',
-  `remote_ipc_ip_addr` varchar(255) DEFAULT NULL COMMENT '通道设备IP地址',
-  `mac_addr` varchar(255)  DEFAULT NULL COMMENT 'mac地址',
-  `port` int DEFAULT NULL COMMENT '端口号',
-  `username` varchar(255)  DEFAULT NULL COMMENT '用户名',
-  `password` varchar(255)  DEFAULT NULL COMMENT '密码',
-  `shield` tinyint DEFAULT NULL COMMENT '是否屏蔽',
-  `village_code` varchar(255)  DEFAULT NULL COMMENT '地块编码',
-  `house_code` varchar(255)  DEFAULT NULL COMMENT '部位编码',
-  `address` varchar(255)  DEFAULT NULL COMMENT '设备位置',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标信息id',
-  `video_protocol` int DEFAULT NULL COMMENT '视频协议',
-  `video_type` int DEFAULT NULL COMMENT '视频设备类型',
-  `binding_ipc` varchar(255) DEFAULT NULL COMMENT '绑定IPC设备id',
-  `is_binding` tinyint DEFAULT NULL COMMENT '是否已被绑定',
-  `video_group_type` varchar(255)  DEFAULT NULL COMMENT '视频监控组类型',
-  `alarsas_group_type` varchar(255)  DEFAULT NULL COMMENT '报警联动组类型',
-  `video_source_token` varchar(255) DEFAULT NULL COMMENT 'nvr设备实际通道唯一视频源标识',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注描述',
-  `trigger_time` datetime DEFAULT NULL COMMENT '心跳时间',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE KEY `device_channel_type` (`device_id`,`channel`,`device_type`) USING BTREE COMMENT '同一设备类型设备编码唯一通道号唯一'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='设备信息表';
-
--- ----------------------------
--- Table structure for sas_device_protocol_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_device_protocol_code`;
-CREATE TABLE `sas_device_protocol_code` (
-  `id` int NOT NULL COMMENT '主键',
-  `protocol` varchar(255)  DEFAULT NULL COMMENT '协议',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='视频协议类型表';
-
--- ----------------------------
--- Table structure for sas_device_video_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_device_video_type_code`;
-CREATE TABLE `sas_device_video_type_code` (
-  `id` int NOT NULL COMMENT '主键id',
-  `type` varchar(255)  DEFAULT NULL COMMENT '类型',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='视频设备类型表';
-
--- ----------------------------
--- Table structure for sas_education_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_education_code`;
-CREATE TABLE `sas_education_code` (
-  `code` int NOT NULL COMMENT '文化程度编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '文化程度名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='文化程度分类';
-
--- ----------------------------
--- Table structure for sas_entrance_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_entrance_event`;
-CREATE TABLE `sas_entrance_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `certified_type` int DEFAULT NULL COMMENT '证件类型',
-  `certified_no` varchar(255)  DEFAULT NULL COMMENT '证件号码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '姓名',
-  `phone` varchar(255)  DEFAULT NULL COMMENT '电话',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `certified_type_code` int DEFAULT NULL COMMENT '认证类型编码',
-  `card_id` varchar(255)  DEFAULT NULL COMMENT '卡号',
-  `visit` varchar(255)  DEFAULT NULL COMMENT '被访问人',
-  `house_code` varchar(255)  DEFAULT NULL COMMENT '部位编码',
-  `similarity` int DEFAULT NULL COMMENT '比对相似度',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='出入门禁控制事件表';
-
--- ----------------------------
--- Table structure for sas_entrance_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_entrance_event_code`;
-CREATE TABLE `sas_entrance_event_code` (
-  `code` int NOT NULL COMMENT '出入口控制事件类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '出入口控制事件类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='出入口控制事件类型表';
-
--- ----------------------------
--- Table structure for sas_equip
--- ----------------------------
-DROP TABLE IF EXISTS `sas_equip`;
-CREATE TABLE `sas_equip` (
-  `code` varchar(255)  NOT NULL COMMENT '装备编码',
-  `village_code` varchar(255)  DEFAULT NULL COMMENT '地块编码',
-  `url_id` varchar(255)  DEFAULT NULL COMMENT '装备图片地址id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '定位地址id',
-  `create_time` datetime DEFAULT NULL COMMENT '装备创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '装备更新时间',
-  `equip_name` varchar(255)  DEFAULT NULL COMMENT '装备昵称',
-  `equip_type` int DEFAULT NULL COMMENT '装备类型编码',
-  `remark` varchar(255)  DEFAULT NULL COMMENT '备注',
-  `floor` int DEFAULT NULL COMMENT '楼层',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='实有装备信息表';
-
--- ----------------------------
--- Table structure for sas_equip_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_equip_code`;
-CREATE TABLE `sas_equip_code` (
-  `code` int NOT NULL COMMENT '类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '装备名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='实有装备分类编码表';
-
--- ----------------------------
--- Table structure for sas_entrance
--- ----------------------------
-DROP TABLE IF EXISTS `sas_entrance`;
-CREATE TABLE `sas_entrance` (
-  `entrance_code` varchar(255)  NOT NULL COMMENT '出入口编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  `village_code` varchar(255)  DEFAULT NULL COMMENT '地块编码',
-  `address` varchar(500)  DEFAULT NULL COMMENT '地址',
-  `device_ids` varchar(500)  DEFAULT NULL COMMENT '设备id列表,逗号分隔',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '出入口图片地址',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`entrance_code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='出入口信息表';
-
--- ----------------------------
--- Table structure for sas_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_event_code`;
-CREATE TABLE `sas_event_code` (
-  `code` int NOT NULL COMMENT '事件编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '事件名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='usb防插拔事件编码类型表';
-
--- ----------------------------
--- Table structure for sas_event_level
--- ----------------------------
-DROP TABLE IF EXISTS `sas_event_level`;
-CREATE TABLE `sas_event_level` (
-  `id` int NOT NULL COMMENT '编码主键',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='事件组优先级编码表';
-
--- ----------------------------
--- Table structure for sas_event_type_group
--- ----------------------------
-DROP TABLE IF EXISTS `sas_event_type_group`;
-CREATE TABLE `sas_event_type_group` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '事件分组名称',
-  `device_type` int DEFAULT NULL COMMENT '设备事件类型',
-  `event_codes` longtext  COMMENT '事件类型(编码,逗号隔开)',
-  `event_level` int DEFAULT NULL COMMENT '事件等级',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `can_del` tinyint DEFAULT '1' COMMENT '是否能删除:true可删 false不可删',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='事件类型分组表';
-
--- ----------------------------
--- Table structure for sas_follow_people_type
--- ----------------------------
-DROP TABLE IF EXISTS `sas_follow_people_type`;
-CREATE TABLE `sas_follow_people_type` (
-  `code` int NOT NULL COMMENT '关注人员类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '关注人员类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='关注人员类型表';
-
--- ----------------------------
--- Table structure for sas_follow_person
--- ----------------------------
-DROP TABLE IF EXISTS `sas_follow_person`;
-CREATE TABLE `sas_follow_person` (
-  `person_code` varchar(255)  NOT NULL COMMENT '人员编码',
-  `follow_people_type` int DEFAULT NULL COMMENT '关注人员类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '文件名',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '文件地址id',
-  PRIMARY KEY (`person_code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='关注人员表';
-
--- ----------------------------
--- Table structure for sas_gauth_certification
--- ----------------------------
-DROP TABLE IF EXISTS `sas_gauth_certification`;
-CREATE TABLE `sas_gauth_certification` (
-  `functions` int NOT NULL COMMENT '功能/组合编号',
-  `action_name` varchar(255)  DEFAULT NULL COMMENT '功能说明',
-  `name` varchar(255)  DEFAULT NULL COMMENT '人员类型',
-  `group_enabled` tinyint DEFAULT NULL COMMENT '是否有组合\r\ntrue 首尾刷功能卡,组合刷卡时,人脸比对失败时刷卡无\r\n效,需重新刷卡比对。\r\nfalse 刷卡即时上传(包括人脸比对失败)',
-  `action` int DEFAULT NULL COMMENT '动作按位操作\r\n0 bit 截图位 0 不截图 1 截图\r\n1 bit 继电器工作位 0 不工作 1 工作\r\n其他位备用',
-  `grou` varchar(255)  DEFAULT NULL COMMENT '后续刷卡序列必须包含的卡功能组合,无顺序要求。',
-  `leader` int DEFAULT NULL,
-  `car_type` int DEFAULT NULL,
-  `leader_chk_face` tinyint DEFAULT NULL COMMENT '首刷操作:true刷卡比对,false仅刷卡',
-  PRIMARY KEY (`functions`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='组合功能/方式表';
-
--- ----------------------------
--- Table structure for sas_gauth_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_gauth_event`;
-CREATE TABLE `sas_gauth_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `rel_person` varchar(255)  DEFAULT NULL COMMENT '关联对象',
-  `deal_person` varchar(255)  DEFAULT NULL COMMENT '发现/处置人员',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `event_system` int DEFAULT NULL COMMENT '系统编码',
-  `card_no` varchar(255)  DEFAULT NULL COMMENT '卡号',
-  `group_code` varchar(255)  DEFAULT NULL COMMENT '更新/新增标识码',
-  `functions` int DEFAULT NULL COMMENT '功能编号',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='组合认证事件表';
-
--- ----------------------------
--- Table structure for sas_gauth_event_person_info
--- ----------------------------
-DROP TABLE IF EXISTS `sas_gauth_event_person_info`;
-CREATE TABLE `sas_gauth_event_person_info` (
-  `id` varchar(255)  NOT NULL COMMENT '主键',
-  `event_id` varchar(255)  DEFAULT NULL COMMENT '事件id',
-  `card_no` varchar(255)  DEFAULT NULL COMMENT '卡号',
-  `card_type` int DEFAULT NULL COMMENT '卡类型',
-  `similarity` int DEFAULT NULL COMMENT '比对结果',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '照片',
-  `credential_type` int DEFAULT NULL COMMENT '证件类型',
-  `identifier_card` varchar(255)  DEFAULT NULL COMMENT '证件号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='组合认证事件人员信息表';
-
--- ----------------------------
--- Table structure for sas_gauth_identity_card_information
--- ----------------------------
-DROP TABLE IF EXISTS `sas_gauth_identity_card_information`;
-CREATE TABLE `sas_gauth_identity_card_information` (
-  `id` varchar(255)  NOT NULL COMMENT '主键',
-  `functions` int DEFAULT NULL COMMENT '功能号',
-  `name` varchar(255)  DEFAULT NULL COMMENT '姓名',
-  `credential_no` varchar(255)  DEFAULT NULL COMMENT '身份证号码',
-  `nation_code` int DEFAULT NULL COMMENT '民族编号',
-  `birth_date` date DEFAULT NULL COMMENT '生日',
-  `gender_code` int DEFAULT NULL COMMENT '性别 1-男 2 女 9-其他',
-  `address` varchar(255)  DEFAULT NULL COMMENT '地址',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '身份证照片',
-  `issue_authority` varchar(255)  DEFAULT NULL COMMENT '发证机关',
-  `valid_tersas_begin` date DEFAULT NULL COMMENT '有效开始日期',
-  `valid_tersas_end` date DEFAULT NULL COMMENT '有效结束日期',
-  `collect_pic_id` varchar(255)  DEFAULT NULL COMMENT '现场采集比对照片',
-  `trigger_time` datetime DEFAULT NULL COMMENT '刷卡时间',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='组合认证人员卡信息表';
-
--- ----------------------------
--- Table structure for sas_gis
--- ----------------------------
-DROP TABLE IF EXISTS `sas_gis`;
-CREATE TABLE `sas_gis` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `lon` decimal(10,6) DEFAULT NULL COMMENT '经度',
-  `lat` decimal(10,6) DEFAULT NULL COMMENT '纬度',
-  `alt` decimal(10,6) DEFAULT NULL COMMENT '高度',
-  `gis_type` int DEFAULT NULL COMMENT '经纬度类型',
-  `floor` int DEFAULT NULL COMMENT '楼层',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `area` varchar(255)  DEFAULT NULL COMMENT '区域',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='经纬度信息表';
-
--- ----------------------------
--- Table structure for sas_gis_area
--- ----------------------------
-DROP TABLE IF EXISTS `sas_gis_area`;
-CREATE TABLE `sas_gis_area` (
-  `id` varchar(255)  NOT NULL COMMENT '主键',
-  `gis_ids` varchar(255)  DEFAULT NULL COMMENT '区域坐标',
-  `gis_type` int DEFAULT NULL COMMENT '坐标类型',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='区域范围经纬度信息表';
-
--- ----------------------------
--- Table structure for sas_gis_type
--- ----------------------------
-DROP TABLE IF EXISTS `sas_gis_type`;
-CREATE TABLE `sas_gis_type` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  NOT NULL COMMENT '坐标系名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='坐标系类型编码表';
-
--- ----------------------------
--- Table structure for sas_house
--- ----------------------------
-DROP TABLE IF EXISTS `sas_house`;
-CREATE TABLE `sas_house` (
-  `house_code` varchar(255)  NOT NULL COMMENT '部位编码',
-  `floor` int DEFAULT NULL COMMENT '楼层',
-  `house_no` varchar(255)  DEFAULT NULL COMMENT '部位编号',
-  `house_label_code` int DEFAULT NULL COMMENT '部位类别编码',
-  `house_label` varchar(255)  DEFAULT NULL COMMENT '部位类别',
-  `house_purpose_code` int DEFAULT NULL COMMENT '部位用途编码',
-  `house_purpose` varchar(255)  DEFAULT NULL COMMENT '部位用途',
-  `note` varchar(255)  DEFAULT NULL COMMENT '部位描述',
-  `is_public` tinyint DEFAULT NULL COMMENT 'true 公共部位',
-  `is_action` tinyint DEFAULT NULL COMMENT '受控区域',
-  `systesas_type_code` int DEFAULT NULL COMMENT '系统类型id',
-  `building_code` varchar(255)  DEFAULT NULL COMMENT '区域信息id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '经纬度id',
-  `person_number` int DEFAULT NULL COMMENT '最大居住/办公人数',
-  `house_area` int DEFAULT NULL COMMENT '部位面积',
-  `village_code` varchar(255)  DEFAULT NULL COMMENT '地块编码',
-  `tags` varchar(255)  DEFAULT NULL COMMENT '系统标签',
-  `place_type_id` int DEFAULT NULL,
-  `house_name` varchar(255)  DEFAULT NULL COMMENT '部位名称',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`house_code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='部位信息表';
-
--- ----------------------------
--- Table structure for sas_houserel_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_houserel_code`;
-CREATE TABLE `sas_houserel_code` (
-  `code` varchar(255)  NOT NULL COMMENT '人屋关系分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '人屋关系分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='人屋关系分类';
-
--- ----------------------------
--- Table structure for sas_house_purpose_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_house_purpose_code`;
-CREATE TABLE `sas_house_purpose_code` (
-  `id` int NOT NULL COMMENT '部位用途id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '用途名称',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='部位用途定义编码表';
-
--- ----------------------------
--- Table structure for sas_house_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_house_type_code`;
-CREATE TABLE `sas_house_type_code` (
-  `id` int NOT NULL COMMENT '部位类别定义主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '部位类别定义名称',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='部位类别定义编码表';
-
--- ----------------------------
--- Table structure for sas_label_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_label_code`;
-CREATE TABLE `sas_label_code` (
-  `code` varchar(255)  NOT NULL COMMENT '人员特征分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '人员特征分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='人员特征分类';
-
--- ----------------------------
--- Table structure for sas_maps
--- ----------------------------
-DROP TABLE IF EXISTS `sas_maps`;
-CREATE TABLE `sas_maps` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  `type` int DEFAULT NULL COMMENT '类型',
-  `remark` varchar(255)  DEFAULT NULL COMMENT '描述',
-  `parent_id` varchar(255)  DEFAULT NULL COMMENT '父id',
-  `width` double DEFAULT NULL COMMENT '画布属性:宽',
-  `height` double DEFAULT NULL COMMENT '画布属性:高',
-  `is_mask` tinyint DEFAULT NULL COMMENT '超出画布隐藏',
-  `back_img_id` varchar(255)  DEFAULT NULL COMMENT '背景图片id',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='地图导航表';
-
--- ----------------------------
--- Table structure for sas_map_device
--- ----------------------------
-DROP TABLE IF EXISTS `sas_map_device`;
-CREATE TABLE `sas_map_device` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '绑定设备id',
-  `img_id` varchar(255)  DEFAULT NULL COMMENT '标签图片id',
-  `type` varchar(255)  DEFAULT NULL COMMENT '类型',
-  `background_color` varchar(255)  DEFAULT NULL COMMENT '背景颜色',
-  `x` decimal(10,2) DEFAULT NULL COMMENT '坐标X轴',
-  `y` decimal(10,2) DEFAULT NULL COMMENT '坐标Y轴',
-  `width` double DEFAULT NULL COMMENT '宽',
-  `height` double DEFAULT NULL COMMENT '高',
-  `angle` double DEFAULT NULL COMMENT '旋转角度',
-  `font_color` varchar(255)  DEFAULT NULL COMMENT '文字颜色',
-  `thickness` int DEFAULT NULL COMMENT '文字粗细',
-  `font_size` int DEFAULT NULL COMMENT '文字大小',
-  `text` longtext  COMMENT '文字内容',
-  `map_id` varchar(255)  DEFAULT NULL COMMENT '地图id',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='电子地图设备表';
-
--- ----------------------------
--- Table structure for sas_marital_status_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_marital_status_code`;
-CREATE TABLE `sas_marital_status_code` (
-  `code` int NOT NULL COMMENT '婚姻状况分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '婚姻状况分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='婚姻状况分类';
-
--- ----------------------------
--- Table structure for sas_msg_source
--- ----------------------------
-DROP TABLE IF EXISTS `sas_msg_source`;
-CREATE TABLE `sas_msg_source` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  NOT NULL COMMENT '来源名称',
-  `level` int DEFAULT NULL COMMENT '等级',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='信息来源编码表';
-
--- ----------------------------
--- Table structure for sas_nationality_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_nationality_code`;
-CREATE TABLE `sas_nationality_code` (
-  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
-  `code` varchar(255)  NOT NULL COMMENT '国家编码',
-  `name` varchar(255)  NOT NULL COMMENT '国家名称',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=228 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='国家编码表';
-
--- ----------------------------
--- Table structure for sas_nation_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_nation_code`;
-CREATE TABLE `sas_nation_code` (
-  `code` varchar(255)  NOT NULL COMMENT '民族分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '民族分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='民族分类';
-
--- ----------------------------
--- Table structure for sas_parking_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_parking_event`;
-CREATE TABLE `sas_parking_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `plate_pic_id` varchar(255)  DEFAULT NULL COMMENT '车牌照片',
-  `event_pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `event_system` int DEFAULT NULL COMMENT '系统编码',
-  `entrance_code` varchar(255)  DEFAULT NULL COMMENT '出入口编号',
-  `plate_no` varchar(255)  DEFAULT NULL COMMENT '车牌号码',
-  `plate_type` int DEFAULT NULL COMMENT '车牌类型',
-  `plate_color` varchar(255)  DEFAULT NULL COMMENT '车牌颜色',
-  `car_type` int DEFAULT NULL COMMENT '车辆类型',
-  `access_type` int DEFAULT NULL COMMENT '1 进 2 出 9 抓拍',
-  `car_type_code` int DEFAULT NULL COMMENT '注册车辆类型(来自 share/car getCarTypeCode)',
-  `similarity` int DEFAULT NULL COMMENT '识别可信度',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='停车场车牌抓拍事件表';
-
--- ----------------------------
--- Table structure for sas_parking_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_parking_event_code`;
-CREATE TABLE `sas_parking_event_code` (
-  `code` int NOT NULL COMMENT '停车场事件编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '停车场事件名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='停车场车牌抓拍分析';
-
--- ----------------------------
--- Table structure for sas_patrol_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_patrol_event`;
-CREATE TABLE `sas_patrol_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `rel_person` varchar(255)  DEFAULT NULL COMMENT '关联对象',
-  `deal_person` varchar(255)  DEFAULT NULL COMMENT '发现/处置人员',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `event_system` int DEFAULT NULL COMMENT '系统编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '巡检人姓名',
-  `credential_type` int DEFAULT NULL COMMENT '证件类型编码',
-  `credential_no` varchar(255)  DEFAULT NULL COMMENT '证件号',
-  `user_parasas_id` varchar(255)  DEFAULT NULL COMMENT '用户参数id',
-  `type_name` varchar(255)  DEFAULT NULL COMMENT '类型名',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='实时电子巡检事件表';
-
--- ----------------------------
--- Table structure for sas_patrol_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_patrol_event_code`;
-CREATE TABLE `sas_patrol_event_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='实时电子巡检事件编码';
-
--- ----------------------------
--- Table structure for sas_patrol_user_param
--- ----------------------------
-DROP TABLE IF EXISTS `sas_patrol_user_param`;
-CREATE TABLE `sas_patrol_user_param` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `status` varchar(255)  DEFAULT NULL COMMENT '事件备注',
-  `status_code` int DEFAULT NULL COMMENT '事件编号',
-  `handle_code` varchar(255)  DEFAULT NULL COMMENT '终端编号',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='实时电子巡检用户参数表';
-
--- ----------------------------
--- Table structure for sas_people_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_people_type_code`;
-CREATE TABLE `sas_people_type_code` (
-  `code` varchar(255)  NOT NULL COMMENT '人员类型分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '人员类型分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='人员类型编码表';
-
--- ----------------------------
--- Table structure for sas_perception_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_perception_event`;
-CREATE TABLE `sas_perception_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `rel_person` varchar(255)  DEFAULT NULL COMMENT '关联对象',
-  `deal_person` varchar(255)  DEFAULT NULL COMMENT '发现/处置人员',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `event_system` int DEFAULT NULL COMMENT '系统编码',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='状态感知探测事件表';
-
--- ----------------------------
--- Table structure for sas_perception_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_perception_event_code`;
-CREATE TABLE `sas_perception_event_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='入侵和紧急报警事件编码表';
-
--- ----------------------------
--- Table structure for sas_person
--- ----------------------------
-DROP TABLE IF EXISTS `sas_person`;
-CREATE TABLE `sas_person` (
-  `person_code` varchar(255)  NOT NULL COMMENT '人员唯一编码id',
-  `card_number` varchar(255)  DEFAULT NULL,
-  `credential_type` int DEFAULT NULL COMMENT '证件类型',
-  `credential_no` varchar(255)  DEFAULT NULL COMMENT '证件号码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '姓名',
-  `car_code` varchar(255)  DEFAULT NULL COMMENT '车辆编码',
-  `label_code` varchar(255)  DEFAULT NULL COMMENT '人员特征编码',
-  `msg_source_code` int DEFAULT NULL COMMENT '消息来源编码',
-  `power_code` varchar(255)  DEFAULT NULL COMMENT '实有力量分类编码',
-  `real_population` tinyint DEFAULT NULL COMMENT 'rue 返回常驻人员,false 返回流动人员信息, 无该键为不区分。',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '人脸图片地址id',
-  `phone1` varchar(255)  DEFAULT NULL COMMENT '电话1',
-  `phone1_id` varchar(255)  DEFAULT NULL COMMENT '电话1信息编码',
-  `phone2` varchar(255)  DEFAULT NULL COMMENT '电话2',
-  `phone2_id` varchar(255)  DEFAULT NULL COMMENT '电话2信息编码',
-  `phone3` varchar(255)  DEFAULT NULL COMMENT '电话3',
-  `phone3_id` varchar(255)  DEFAULT NULL COMMENT '电话3信息编码',
-  `people_type_code` int DEFAULT NULL COMMENT '人员来源类型编码',
-  `update_time` datetime DEFAULT NULL COMMENT '人员更新时间',
-  `create_time` datetime DEFAULT NULL COMMENT '人员创建时间',
-  `company_code` varchar(255)  DEFAULT NULL COMMENT '单位编码',
-  `source` int DEFAULT NULL COMMENT '来源',
-  `domicile_id` varchar(255)  DEFAULT NULL COMMENT '户籍信息id',
-  `origin` varchar(255)  DEFAULT NULL COMMENT '籍贯',
-  `residence_id` varchar(255)  DEFAULT NULL COMMENT '居住信息id',
-  `education_code` int DEFAULT NULL COMMENT '学历编码',
-  `marital_status_code` int DEFAULT NULL COMMENT '婚姻状况',
-  `spouse_name` varchar(255)  DEFAULT NULL COMMENT '配偶姓名',
-  `spouse_type` int DEFAULT NULL COMMENT '配偶证件类型',
-  `spouse_no` varchar(255)  DEFAULT NULL COMMENT '配偶证件号码',
-  `nationality_code` varchar(255)  DEFAULT NULL COMMENT '国家编码',
-  `entry_time` datetime DEFAULT NULL COMMENT '入境时间',
-  `surname_eng` varchar(255)  DEFAULT NULL COMMENT '外文姓',
-  `name_eng` varchar(255)  DEFAULT NULL COMMENT '外文名',
-  `security_card_no` varchar(255)  DEFAULT NULL COMMENT '保安人员卡号',
-  `security_duties_code` int DEFAULT NULL COMMENT '安全职责编码',
-  `entrance_type_code` int DEFAULT NULL COMMENT '出入类型',
-  `place_of_birth` varchar(255)  DEFAULT NULL COMMENT '出生地',
-  `person_type_code` int DEFAULT NULL COMMENT '人员类型编码',
-  `functions` int DEFAULT NULL COMMENT '组合认证人员类型',
-  `person_entrance_type_code` int DEFAULT NULL,
-  PRIMARY KEY (`person_code`) USING BTREE,
-  UNIQUE KEY `security_card_no` (`security_card_no`) USING BTREE,
-  UNIQUE KEY `credentialNo` (`credential_no`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='人员信息表';
-
--- ----------------------------
--- Table structure for sas_person_part
--- ----------------------------
-DROP TABLE IF EXISTS `sas_person_part`;
-CREATE TABLE `sas_person_part` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `person_code` varchar(255)  DEFAULT NULL COMMENT '人员编码',
-  `village_code` varchar(255)  DEFAULT NULL COMMENT '地块编码',
-  `building_code` varchar(255)  DEFAULT NULL COMMENT '区域编码',
-  `house_code` varchar(255)  DEFAULT NULL COMMENT '部位编码',
-  `house_rel_code` varchar(255)  DEFAULT NULL COMMENT '人屋关系编码',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='人员部位信息编码表';
-
--- ----------------------------
--- Table structure for sas_person_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_person_type_code`;
-CREATE TABLE `sas_person_type_code` (
-  `code` int NOT NULL COMMENT '人员类型分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '人员类型分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='人员类型分类编码';
-
--- ----------------------------
--- Table structure for sas_pic
--- ----------------------------
-DROP TABLE IF EXISTS `sas_pic`;
-CREATE TABLE `sas_pic` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `url` varchar(255)  DEFAULT NULL COMMENT '图片地址',
-  `path` varchar(255)  DEFAULT NULL COMMENT '图片路径',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='图片文件地址表';
-
--- ----------------------------
--- Table structure for sas_pic_source
--- ----------------------------
-DROP TABLE IF EXISTS `sas_pic_source`;
-CREATE TABLE `sas_pic_source` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '图片名称',
-  `remark` varchar(255)  DEFAULT NULL COMMENT '描述信息',
-  `pic_type` int DEFAULT NULL COMMENT '图片类型',
-  `subtype` int DEFAULT NULL COMMENT '子类型',
-  `tag` varchar(255)  DEFAULT NULL COMMENT '标签',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '图片地址id',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='图片资源表';
-
--- ----------------------------
--- Table structure for sas_pic_type
--- ----------------------------
-DROP TABLE IF EXISTS `sas_pic_type`;
-CREATE TABLE `sas_pic_type` (
-  `id` int NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='图片类型表';
-
--- ----------------------------
--- Table structure for sas_place_type
--- ----------------------------
-DROP TABLE IF EXISTS `sas_place_type`;
-CREATE TABLE `sas_place_type` (
-  `id` int NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '用途名称',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='部位类型编码表';
-
--- ----------------------------
--- Table structure for sas_plate_color
--- ----------------------------
-DROP TABLE IF EXISTS `sas_plate_color`;
-CREATE TABLE `sas_plate_color` (
-  `code` varchar(255)  NOT NULL COMMENT '主键编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='车牌颜色分类表';
-
--- ----------------------------
--- Table structure for sas_plate_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_plate_type_code`;
-CREATE TABLE `sas_plate_type_code` (
-  `code` int NOT NULL COMMENT '车辆牌照类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '车辆牌照类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='车辆牌照类型编码表';
-
--- ----------------------------
--- Table structure for sas_police_station
--- ----------------------------
-DROP TABLE IF EXISTS `sas_police_station`;
-CREATE TABLE `sas_police_station` (
-  `code` varchar(255)  NOT NULL COMMENT '派出所唯一编号',
-  `name` varchar(255)  DEFAULT NULL COMMENT '派出所名称',
-  `address` varchar(255)  DEFAULT NULL COMMENT '地址',
-  `tel` varchar(255)  DEFAULT NULL COMMENT '电话',
-  `liaison` varchar(255)  DEFAULT NULL COMMENT '联系人',
-  `handphone` varchar(255)  DEFAULT NULL COMMENT '联系手机',
-  `state` int DEFAULT NULL COMMENT '状态 1 – 启用',
-  `district_code` varchar(255)  DEFAULT NULL COMMENT '区县编码',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='派出所信息表';
-
--- ----------------------------
--- Table structure for sas_police_station_type
--- ----------------------------
-DROP TABLE IF EXISTS `sas_police_station_type`;
-CREATE TABLE `sas_police_station_type` (
-  `code` int NOT NULL COMMENT '派出所属部门编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '派出所属部门名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='派出所所属部门表';
-
--- ----------------------------
--- Table structure for sas_power_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_power_code`;
-CREATE TABLE `sas_power_code` (
-  `code` varchar(255)  NOT NULL COMMENT '类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='实有力量分类编码表';
-
--- ----------------------------
--- Table structure for sas_public_order_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_public_order_code`;
-CREATE TABLE `sas_public_order_code` (
-  `code` varchar(255)  NOT NULL COMMENT '治安人员类型分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '治安人员类型分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='治安人员类型分类';
-
--- ----------------------------
--- Table structure for sas_roadblock_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_roadblock_event`;
-CREATE TABLE `sas_roadblock_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号 0 表示本主机',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '事件图片id',
-  `scene_pic` varchar(255)  DEFAULT NULL COMMENT '场景图片id',
-  `val` decimal(10,2) DEFAULT NULL COMMENT '状态值',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `total` decimal(10,2) DEFAULT NULL COMMENT '抄表数',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='阻车路障探测事件表';
-
--- ----------------------------
--- Table structure for sas_roadblock_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_roadblock_event_code`;
-CREATE TABLE `sas_roadblock_event_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='阻车路障探测事件编码表';
-
--- ----------------------------
--- Table structure for sas_scale_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_scale_code`;
-CREATE TABLE `sas_scale_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='单位规模';
-
--- ----------------------------
--- Table structure for sas_security_duties_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_security_duties_code`;
-CREATE TABLE `sas_security_duties_code` (
-  `code` varchar(255)  NOT NULL COMMENT '专业保安职责分类编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '专业保安职责分类名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='专业保安职责分类';
-
--- ----------------------------
--- Table structure for sas_snap_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_snap_event`;
-CREATE TABLE `sas_snap_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `scene_pic_id` varchar(255)  DEFAULT NULL COMMENT '场景图片',
-  `event_pic_id` varchar(255)  DEFAULT NULL COMMENT '图片',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `rel_person` varchar(255)  DEFAULT NULL COMMENT '关联对象',
-  `deal_person` varchar(255)  DEFAULT NULL COMMENT '发现/处置人员',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `event_system` int DEFAULT NULL COMMENT '系统编码',
-  `similarity` int DEFAULT NULL COMMENT '比对相似度',
-  `notify` tinyint DEFAULT NULL COMMENT '本地 MQTT 通知',
-  `feature` varchar(255)  DEFAULT NULL COMMENT '特征码',
-  `scene` tinyint DEFAULT NULL COMMENT 'true 包含场景图片',
-  `person_code` varchar(255)  DEFAULT NULL COMMENT '人员编码',
-  `preperson_id` varchar(255)  DEFAULT NULL COMMENT '当结果为路人时该编码为在册名单最接近的人员编码',
-  `count` int DEFAULT NULL,
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='实时智能分析事件表';
-
--- ----------------------------
--- Table structure for sas_snap_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_snap_type_code`;
-CREATE TABLE `sas_snap_type_code` (
-  `code` int NOT NULL COMMENT '主键',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  `is_used` tinyint DEFAULT NULL COMMENT '1:启用 0:未启用',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='事件编码表';
-
--- ----------------------------
--- Table structure for sas_subtypes
--- ----------------------------
-DROP TABLE IF EXISTS `sas_subtypes`;
-CREATE TABLE `sas_subtypes` (
-  `id` int NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '姓名',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='子类型表';
-
--- ----------------------------
--- Table structure for sas_system_activation
--- ----------------------------
-DROP TABLE IF EXISTS `sas_system_activation`;
-CREATE TABLE `sas_system_activation` (
-  `id` int NOT NULL COMMENT '主键',
-  `license_key` longtext  COMMENT '激活码',
-  `is_perpetual` tinyint DEFAULT NULL COMMENT '是否永久:true永久 false非永久',
-  `activation_time` datetime DEFAULT NULL COMMENT '激活时间',
-  `validity_time` datetime DEFAULT NULL COMMENT '到期时间',
-  `authorization_module` varchar(255)  DEFAULT NULL COMMENT '授权模块',
-  `status` int DEFAULT NULL COMMENT '设备激活状态',
-  `client_id` varchar(255)  DEFAULT NULL COMMENT '客户端id',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE KEY `clientId` (`client_id`) USING BTREE COMMENT '客户端id唯一'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统激活信息表';
-
--- ----------------------------
--- Table structure for sas_system_config
--- ----------------------------
-DROP TABLE IF EXISTS `sas_system_config`;
-CREATE TABLE `sas_system_config` (
-  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
-  `owl_agent_host` varchar(255)  DEFAULT NULL COMMENT 'agent服务器地址',
-  `systesas_host` varchar(255)  DEFAULT NULL COMMENT '服务器地址',
-  `video_server_host` varchar(255)  DEFAULT NULL COMMENT '视频服务器地址',
-  `gateway_name` varchar(255)  DEFAULT NULL COMMENT '网关名称',
-  `days_to_keep_history` int DEFAULT NULL COMMENT '数据保留天数',
-  `mask_avatar` tinyint DEFAULT NULL COMMENT '是否显示人员照片 true:显示,false:不显示',
-  `mask_id_card_no` tinyint DEFAULT NULL COMMENT '是否显示身份证信息 true:显示,false:不显示',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统配置表';
-
--- ----------------------------
--- Table structure for sas_system_info
--- ----------------------------
-DROP TABLE IF EXISTS `sas_system_info`;
-CREATE TABLE `sas_system_info` (
-  `id` varchar(255)  NOT NULL COMMENT '客户端id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '厂商',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统信息表';
-
--- ----------------------------
--- Table structure for sas_system_type_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_system_type_code`;
-CREATE TABLE `sas_system_type_code` (
-  `code` int NOT NULL COMMENT '系统类型编码',
-  `name` varchar(255)  NOT NULL COMMENT '系统类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统类型编码表';
-
--- ----------------------------
--- Table structure for sas_system_wlan_config
--- ----------------------------
-DROP TABLE IF EXISTS `sas_system_wlan_config`;
-CREATE TABLE `sas_system_wlan_config` (
-  `id` int NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '网络名称',
-  `ip_addr` varchar(255)  DEFAULT NULL COMMENT 'IP地址',
-  `gateway_addr` varchar(255)  DEFAULT NULL COMMENT '网关地址',
-  `subnet_mask` varchar(255)  DEFAULT NULL COMMENT '子网掩码',
-  `dns` varchar(255)  DEFAULT NULL COMMENT 'DNS',
-  `status` tinyint DEFAULT NULL COMMENT '状态:true启用 false未启用',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='网络配置表';
-
--- ----------------------------
--- Table structure for sas_sys_area
--- ----------------------------
-DROP TABLE IF EXISTS `sas_sys_area`;
-CREATE TABLE `sas_sys_area` (
-  `code` varchar(15) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '地址编码',
-  `name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '地区名称',
-  `sname` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '地区全称',
-  `parent_code` varchar(15) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '地址父编码',
-  `initialition` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '默认值(预留)',
-  `spell` varchar(5) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '首字母',
-  `type` decimal(2,0) NOT NULL COMMENT '类型:1是省会,2直辖市,3港澳台,4其它',
-  `orders` decimal(3,0) NOT NULL COMMENT '同级下排序',
-  `level` decimal(2,0) NOT NULL COMMENT '0全国、1省、2市区、3郊县、4街道、5居委会',
-  `remark` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '备注',
-  `village_type` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '城乡分类代码',
-  `nation_name` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '所属国家名',
-  `province_name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '所属省名称',
-  `city_name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '所属市名称',
-  `district_name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '所属区县名称',
-  `street_name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '所属街道名称',
-  `lng` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '经度',
-  `lat` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '纬度',
-  `map_type` decimal(2,0) DEFAULT NULL COMMENT '来源地图,百度1,高德2',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='行政编码表';
-
--- ----------------------------
--- Table structure for sas_trade_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_trade_code`;
-CREATE TABLE `sas_trade_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='行业编码';
-
--- ----------------------------
--- Table structure for sas_usb_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_usb_event`;
-CREATE TABLE `sas_usb_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `certified_type` int DEFAULT NULL COMMENT '证件类型',
-  `certified_no` varchar(255)  DEFAULT NULL COMMENT '证件号码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '姓名',
-  `phone` varchar(255)  DEFAULT NULL COMMENT '电话',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `certified_type_code` int DEFAULT NULL COMMENT '认证类型编码',
-  `card_id` varchar(255)  DEFAULT NULL COMMENT '卡号',
-  `visit` varchar(255)  DEFAULT NULL COMMENT '被访问人',
-  `house_code` varchar(255)  DEFAULT NULL COMMENT '部位编码',
-  `similarity` int DEFAULT NULL COMMENT '比对相似度',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='USB防插拔事件表';
-
--- ----------------------------
--- Table structure for sas_usb_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_usb_event_code`;
-CREATE TABLE `sas_usb_event_code` (
-  `code` int NOT NULL COMMENT '出入口控制事件类型编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '出入口控制事件类型名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='出入口控制事件类型表';
-
--- ----------------------------
--- Table structure for sas_version_admin
--- ----------------------------
-DROP TABLE IF EXISTS `sas_version_admin`;
-CREATE TABLE `sas_version_admin` (
-  `id` bigint NOT NULL COMMENT '主键id',
-  `jar_version` varchar(255)  DEFAULT NULL COMMENT 'jar版本',
-  `vue_version` varchar(255)  DEFAULT NULL COMMENT 'vue版本',
-  `duration_of_update` varchar(255)  DEFAULT NULL COMMENT '更新时长',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='版本更新表';
-
--- ----------------------------
--- Table structure for sas_video_event
--- ----------------------------
-DROP TABLE IF EXISTS `sas_video_event`;
-CREATE TABLE `sas_video_event` (
-  `event_id` varchar(255)  NOT NULL COMMENT '事件编码',
-  `device_id` varchar(255)  DEFAULT NULL COMMENT '设备编号',
-  `channel` int DEFAULT NULL COMMENT '通道号',
-  `trigger_time` datetime DEFAULT NULL COMMENT '触发时间',
-  `event_code` int DEFAULT NULL COMMENT '事件编码',
-  `note` varchar(255)  DEFAULT NULL COMMENT '备注说明',
-  `pic_id` varchar(255)  DEFAULT NULL COMMENT '二进制图片id',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT '坐标id',
-  `rel_person` varchar(255)  DEFAULT NULL COMMENT '关联对象',
-  `deal_person` varchar(255)  DEFAULT NULL COMMENT '发现/处置人员',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
-  `event_system` int DEFAULT NULL COMMENT '系统编码',
-  PRIMARY KEY (`event_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='视频安防监控事件表';
-
--- ----------------------------
--- Table structure for sas_video_event_code
--- ----------------------------
-DROP TABLE IF EXISTS `sas_video_event_code`;
-CREATE TABLE `sas_video_event_code` (
-  `code` int NOT NULL COMMENT '编码',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  PRIMARY KEY (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='入侵和紧急报警事件编码表';
-
--- ----------------------------
--- Table structure for sas_video_monitor_group_type
--- ----------------------------
-DROP TABLE IF EXISTS `sas_video_monitor_group_type`;
-CREATE TABLE `sas_video_monitor_group_type` (
-  `id` varchar(255)  NOT NULL COMMENT '主键id',
-  `name` varchar(255)  DEFAULT NULL COMMENT '名称',
-  `note` varchar(255)  DEFAULT NULL COMMENT '描述',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='视频监控组类型表';
-
--- ----------------------------
--- Table structure for sas_village
--- ----------------------------
-DROP TABLE IF EXISTS `sas_village`;
-CREATE TABLE `sas_village` (
-  `village_code` varchar(255)  NOT NULL COMMENT '地块编码',
-  `village_name` varchar(255)  DEFAULT NULL COMMENT '地块名称',
-  `address` varchar(255)  DEFAULT NULL COMMENT '地块地址',
-  `update_time` datetime DEFAULT NULL COMMENT '数据更新时间',
-  `province_code` bigint DEFAULT NULL COMMENT '省编码',
-  `city_code` bigint DEFAULT NULL COMMENT '城市编码',
-  `district_code` bigint DEFAULT NULL COMMENT '区县编码',
-  `street_code` bigint DEFAULT NULL COMMENT '街道编码',
-  `road_code` varchar(255)  DEFAULT NULL COMMENT '道路编码',
-  `police_station_code` varchar(255)  DEFAULT NULL COMMENT '派出所编码',
-  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
-  `company_code` varchar(255)  DEFAULT NULL COMMENT '单位编码',
-  `company_name` varchar(255)  DEFAULT NULL COMMENT '单位名称',
-  `pic_url_id` varchar(255)  DEFAULT NULL COMMENT '图片地址路径',
-  `gis_id` varchar(255)  DEFAULT NULL COMMENT 'gis定位id',
-  `gis_area_id` varchar(255)  DEFAULT NULL COMMENT '区域坐标',
-  `area_gis` varchar(255)  DEFAULT NULL COMMENT '区域',
-  `is_default` tinyint DEFAULT NULL COMMENT '是否设为默认,1默认,0非默认',
-  PRIMARY KEY (`village_code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='地块信息表';