Explorar o código

调整mqtt模块

hanzhengyi hai 1 día
pai
achega
a904a7716e

+ 3382 - 0
API设计文档.md

@@ -0,0 +1,3382 @@
+# 智能安防集成应用系统 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 | 无业务数据 |
+
+### 设备心跳
+
+#### 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": 1,
+        "eventCodes": "1001,1002,1003",
+        "eventLevel": 1,
+        "canDel": true,
+        "createTime": "2026-01-30T10:00:00",
+        "updateTime": "2026-01-30T10:00:00"
+      }
+    ],
+    "total": 10,
+    "current": 1,
+    "size": 10
+  }
+}
+```
+
+#### 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.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 | 删除结果提示信息 |
+
+### 报警联动配置
+
+#### 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}`
+
+**功能描述**: 删除电子地图
+
+**响应示例**:
+
+```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;实有设施响应示例修正 | - |
+
+---
+
+## 联系方式
+
+如有问题或建议,请联系开发团队。

+ 34 - 3
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasAgboxConfigController.java

@@ -1,10 +1,14 @@
 package com.usky.sas.controller.web;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.sas.domain.SasConfig;
+import com.usky.sas.mqtt.MqttService;
 import com.usky.sas.service.SasConfigService;
+import com.usky.sas.service.vo.SasConfigVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -16,6 +20,8 @@ import org.springframework.web.bind.annotation.RestController;
  * 对应 API 文档:
  * GET /prod-api/service-sas/agbox/config
  * PUT /prod-api/service-sas/agbox/config
+ * POST /prod-api/service-sas/agbox/mqtt/pause  暂停 MQTT 事件订阅
+ * POST /prod-api/service-sas/agbox/mqtt/resume 恢复 MQTT 事件订阅
  */
 @RestController
 @RequestMapping("/agbox")
@@ -24,12 +30,19 @@ public class SasAgboxConfigController {
     @Autowired
     private SasConfigService sasConfigService;
 
+    @Autowired
+    private MqttService mqttService;
+
     /**
-     * 查询 Agbox/Metabus 配置
+     * 查询 Agbox/Metabus 配置(含 MQTT 连接状态、监听状态)
      */
     @GetMapping("/config")
-    public ApiResult<SasConfig> getConfig() {
-        return ApiResult.success(sasConfigService.getConfig());
+    public ApiResult<SasConfigVo> getConfig() {
+        SasConfig config = sasConfigService.getConfig();
+        SasConfigVo vo = config == null ? new SasConfigVo() : BeanUtil.toBean(config, SasConfigVo.class);
+        vo.setIsConnected(mqttService.getConnectionStatus());
+        vo.setIsListening(mqttService.getListeningStatus());
+        return ApiResult.success(vo);
     }
 
     /**
@@ -40,5 +53,23 @@ public class SasAgboxConfigController {
         sasConfigService.updateConfig(config);
         return ApiResult.success();
     }
+
+    /**
+     * 暂停 MQTT 事件订阅(不再处理新到达的消息,连接保持)
+     */
+    @PostMapping("/mqtt/pause")
+    public ApiResult<Void> pauseMqttSubscription() {
+        mqttService.pauseListening();
+        return ApiResult.success();
+    }
+
+    /**
+     * 恢复 MQTT 事件订阅(继续处理消息)
+     */
+    @PostMapping("/mqtt/resume")
+    public ApiResult<Void> resumeMqttSubscription() {
+        mqttService.resumeListening();
+        return ApiResult.success();
+    }
 }
 

+ 113 - 16
service-sas/service-sas-biz/src/main/java/com/usky/sas/mqtt/MqttService.java

@@ -25,25 +25,17 @@ import java.util.List;
 @Service
 public class MqttService {
 
-    @Value("${mqtt.host:localhost}")
-    private String host;
-
-    @Value("${mqtt.port:1883}")
-    private int port;
-
+    /** clientId、topics 仍从配置文件读取,连接参数 host/port/username/password 从 sas_config 表获取 */
     @Value("${mqtt.client-id:sas-client-${random.uuid}}")
     private String clientId;
 
-    @Value("${mqtt.username:}")
-    private String username;
-
-    @Value("${mqtt.password:}")
-    private String password;
-
     @Value("${mqtt.topics:}")
     private String topics;
 
     private MqttClient client;
+    /** 是否处理消息:false 时收到消息不进入业务处理,用于启停监听 */
+    private volatile boolean isListening = true;
+
     private final ObjectMapper mapper = new ObjectMapper()
             .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -69,9 +61,23 @@ public class MqttService {
     @Autowired
     private SasCollectionEventService collectionEventService;
 
+    @Autowired
+    private SasConfigService sasConfigService;
+
     @PostConstruct
     public void init() {
+        SasConfig config = sasConfigService.getConfig();
+        if (config == null || config.getHost() == null || config.getHost().isEmpty()) {
+            log.warn("sas_config 中无 MQTT 配置或 host 为空,跳过 MQTT 连接");
+            isListening = false;
+            return;
+        }
         try {
+            String host = config.getHost();
+            int port = parsePort(config.getPort(), 1883);
+            String username = config.getUsername() != null ? config.getUsername() : "";
+            String password = config.getPassword() != null ? config.getPassword() : "";
+
             String brokerUrl = "tcp://" + host + ":" + port;
             client = new MqttClient(brokerUrl, clientId);
 
@@ -90,16 +96,21 @@ public class MqttService {
                 public void connectComplete(boolean reconnect, String serverURI) {
                     log.info("MQTT连接成功, reconnect={}", reconnect);
                     parseTopics().forEach(MqttService.this::subscribe);
+                    isListening = true;
                 }
 
                 @Override
                 public void connectionLost(Throwable cause) {
                     log.error("MQTT连接丢失: {}", cause.getMessage());
+                    isListening = false;
+                    scheduleReconnect();
                 }
 
                 @Override
                 public void messageArrived(String topic, MqttMessage message) throws Exception {
-                    processMessage(topic, message);
+                    if (isListening) {
+                        processMessage(topic, message);
+                    }
                 }
 
                 @Override
@@ -109,12 +120,44 @@ public class MqttService {
 
             client.connect(options);
             log.info("MQTT客户端初始化完成, clientId={}", clientId);
+            isListening = true;
 
         } catch (MqttException e) {
             log.error("MQTT初始化失败: {}", e.getMessage(), e);
+            isListening = false;
         }
     }
 
+    private static int parsePort(String portStr, int defaultPort) {
+        if (portStr == null || portStr.isEmpty()) {
+            return defaultPort;
+        }
+        try {
+            return Integer.parseInt(portStr.trim());
+        } catch (NumberFormatException e) {
+            return defaultPort;
+        }
+    }
+
+    /**
+     * 连接丢失后延迟尝试主动重连(与自动重连互补)
+     */
+    private void scheduleReconnect() {
+        Thread t = new Thread(() -> {
+            try {
+                Thread.sleep(5000L);
+                if (client != null && !client.isConnected()) {
+                    log.info("尝试主动重连MQTT...");
+                    client.reconnect();
+                }
+            } catch (Exception e) {
+                log.error("MQTT主动重连失败", e);
+            }
+        }, "mqtt-reconnect");
+        t.setDaemon(true);
+        t.start();
+    }
+
     private List<String> parseTopics() {
         return Arrays.asList(topics.split(","));
     }
@@ -505,12 +548,66 @@ public class MqttService {
         }
     }
 
+    /**
+     * 暂停监听:不再处理新到达的 MQTT 消息,连接保持
+     */
+    public void pauseListening() {
+        this.isListening = false;
+        log.info("MQTT监听已暂停");
+    }
+
+    /**
+     * 恢复监听:继续处理 MQTT 消息
+     */
+    public void resumeListening() {
+        this.isListening = true;
+        log.info("MQTT监听已恢复");
+    }
+
+    /**
+     * 查询连接状态:是否已连接 Broker
+     */
+    public boolean getConnectionStatus() {
+        return client != null && client.isConnected();
+    }
+
+    /**
+     * 查询监听状态:是否正在处理消息(未暂停)
+     */
+    public boolean getListeningStatus() {
+        return isListening;
+    }
+
+    /**
+     * 主动重连:先断开并关闭旧连接,再重新初始化连接并订阅
+     */
+    public void reconnect() {
+        try {
+            if (client != null) {
+                if (client.isConnected()) {
+                    client.disconnect();
+                }
+                client.close();
+                client = null;
+            }
+            isListening = true;
+            init();
+        } catch (Exception e) {
+            log.error("MQTT重连失败", e);
+            isListening = false;
+        }
+    }
+
     @PreDestroy
     public void disconnect() {
         try {
-            if (client != null && client.isConnected()) {
-                client.disconnect();
-                log.info("MQTT连接已断开");
+            if (client != null) {
+                if (client.isConnected()) {
+                    client.disconnect();
+                    log.info("MQTT连接已断开");
+                }
+                client.close();
+                client = null;
             }
         } catch (MqttException e) {
             log.error("断开MQTT连接失败", e);

+ 32 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/vo/SasConfigVo.java

@@ -0,0 +1,32 @@
+package com.usky.sas.service.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * Agbox/Metabus 配置查询响应(含 MQTT 连接、监听状态)
+ */
+@Data
+public class SasConfigVo {
+
+    private Integer id;
+    private String keyds;
+    private String host;
+    private String port;
+    private String username;
+    private String password;
+    private Boolean isTsl;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+
+    /**
+     * MQTT 是否已连接 Broker
+     */
+    private Boolean isConnected;
+
+    /**
+     * MQTT 是否正在监听(未暂停)
+     */
+    private Boolean isListening;
+}

+ 1353 - 0
usky-agapp.sql

@@ -0,0 +1,1353 @@
+/*
+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='地块信息表';