diff --git a/sql/mysql/aiot-video.sql b/sql/mysql/aiot-video.sql
new file mode 100644
index 00000000..5eb515a4
--- /dev/null
+++ b/sql/mysql/aiot-video.sql
@@ -0,0 +1,843 @@
+/*
+ * aiot-video 模块数据库初始化脚本
+ *
+ * 基于 WVP-Platform 2.7.4 + AIoT 扩展表
+ * 适配 viewsh 框架规范:
+ * - 业务表:含 tenant_id, creator, create_time, updater, update_time, deleted
+ * - 共享表(wvp_media_server):无 tenant_id,不含 deleted
+ * - 唯一索引包含 deleted 字段以支持逻辑删除
+ * - 时间字段统一改为 datetime 类型
+ * - WVP 原 serial 改为 bigint AUTO_INCREMENT
+ * - 不含 wvp_user / wvp_user_role / wvp_user_api_key(由 viewsh-module-system 管理)
+ * - 不含 wvp_jt_terminal / wvp_jt_channel(JT1078 Phase 2 迁移)
+ *
+ * 维护者:AI Assistant
+ * 生成日期:2026-04-05
+ */
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- 国标设备基础信息
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_device`;
+CREATE TABLE `wvp_device` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `device_id` varchar(50) NOT NULL COMMENT '国标设备编号',
+ `name` varchar(255) NULL COMMENT '设备名称',
+ `manufacturer` varchar(255) NULL COMMENT '设备厂商',
+ `model` varchar(255) NULL COMMENT '设备型号',
+ `firmware` varchar(255) NULL COMMENT '固件版本号',
+ `transport` varchar(50) NULL COMMENT '信令传输协议(TCP/UDP)',
+ `stream_mode` varchar(50) NULL COMMENT '拉流方式(主动/被动)',
+ `on_line` tinyint(1) NOT NULL DEFAULT 0 COMMENT '在线状态',
+ `register_time` varchar(50) NULL COMMENT '注册时间',
+ `keepalive_time` varchar(50) NULL COMMENT '最近心跳时间',
+ `ip` varchar(50) NULL COMMENT '设备IP地址',
+ `port` int NULL COMMENT '信令端口',
+ `expires` int NULL COMMENT '注册有效期',
+ `subscribe_cycle_for_catalog` int NOT NULL DEFAULT 0 COMMENT '目录订阅周期',
+ `subscribe_cycle_for_mobile_position` int NOT NULL DEFAULT 0 COMMENT '移动位置订阅周期',
+ `mobile_position_submission_interval` int NOT NULL DEFAULT 5 COMMENT '移动位置上报间隔',
+ `subscribe_cycle_for_alarm` int NOT NULL DEFAULT 0 COMMENT '报警订阅周期',
+ `host_address` varchar(50) NULL COMMENT '设备域名/主机地址',
+ `charset` varchar(50) NULL COMMENT '信令字符集',
+ `ssrc_check` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否校验SSRC',
+ `geo_coord_sys` varchar(50) NULL COMMENT '坐标系类型',
+ `media_server_id` varchar(50) NOT NULL DEFAULT 'auto' COMMENT '绑定的流媒体服务ID',
+ `custom_name` varchar(255) NULL COMMENT '自定义显示名称',
+ `sdp_ip` varchar(50) NULL COMMENT 'SDP中携带的IP',
+ `local_ip` varchar(50) NULL COMMENT '本地局域网IP',
+ `password` varchar(255) NULL COMMENT '设备鉴权密码',
+ `as_message_channel` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否作为消息通道',
+ `heart_beat_interval` int NULL COMMENT '心跳间隔',
+ `heart_beat_count` int NULL COMMENT '心跳失败次数',
+ `position_capability` int NULL COMMENT '定位能力标识',
+ `broadcast_push_after_ack` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'ACK后是否自动推流',
+ `server_id` varchar(50) NULL COMMENT '所属信令服务器ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_device_id_deleted` (`device_id`, `deleted`) COMMENT '设备ID唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='国标设备基础信息';
+
+-- ----------------------------
+-- 设备报警记录
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_device_alarm`;
+CREATE TABLE `wvp_device_alarm` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `device_id` varchar(50) NOT NULL COMMENT '国标设备ID',
+ `channel_id` varchar(50) NOT NULL COMMENT '报警关联的通道ID',
+ `alarm_priority` varchar(50) NULL COMMENT '报警级别',
+ `alarm_method` varchar(50) NULL COMMENT '报警方式(视频/语音等)',
+ `alarm_time` varchar(50) NULL COMMENT '报警发生时间',
+ `alarm_description` varchar(255) NULL COMMENT '报警描述',
+ `longitude` double NULL COMMENT '报警经度',
+ `latitude` double NULL COMMENT '报警纬度',
+ `alarm_type` varchar(50) NULL COMMENT '报警类型',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '数据入库时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_device_id` (`device_id`) COMMENT '设备ID索引'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备报警记录';
+
+-- ----------------------------
+-- 移动位置订阅上报数据
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_device_mobile_position`;
+CREATE TABLE `wvp_device_mobile_position` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `device_id` varchar(50) NOT NULL COMMENT '设备ID',
+ `channel_id` varchar(50) NOT NULL COMMENT '通道ID',
+ `device_name` varchar(255) NULL COMMENT '设备名称',
+ `time` varchar(50) NULL COMMENT '上报时间',
+ `longitude` double NULL COMMENT '经度',
+ `latitude` double NULL COMMENT '纬度',
+ `altitude` double NULL COMMENT '海拔',
+ `speed` double NULL COMMENT '速度',
+ `direction` double NULL COMMENT '方向角',
+ `report_source` varchar(50) NULL COMMENT '上报来源',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_device_channel` (`device_id`, `channel_id`) COMMENT '设备+通道索引'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='移动位置订阅上报数据';
+
+-- ----------------------------
+-- 设备通道信息
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_device_channel`;
+CREATE TABLE `wvp_device_channel` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `device_id` varchar(50) NULL COMMENT '所属设备ID',
+ `name` varchar(255) NULL COMMENT '通道名称',
+ `manufacturer` varchar(50) NULL COMMENT '厂商',
+ `model` varchar(50) NULL COMMENT '型号',
+ `owner` varchar(50) NULL COMMENT '归属单位',
+ `civil_code` varchar(50) NULL COMMENT '行政区划代码',
+ `block` varchar(50) NULL COMMENT '区域/小区编号',
+ `address` varchar(50) NULL COMMENT '安装地址',
+ `parental` int NULL COMMENT '是否有子节点',
+ `parent_id` varchar(50) NULL COMMENT '父级通道ID',
+ `safety_way` int NULL COMMENT '安全防范等级',
+ `register_way` int NULL COMMENT '注册方式',
+ `cert_num` varchar(50) NULL COMMENT '证书编号',
+ `certifiable` int NULL COMMENT '是否可认证',
+ `err_code` int NULL COMMENT '故障状态码',
+ `end_time` varchar(50) NULL COMMENT '服务截止时间',
+ `secrecy` int NULL COMMENT '保密级别',
+ `ip_address` varchar(50) NULL COMMENT '设备IP地址',
+ `port` int NULL COMMENT '设备端口',
+ `password` varchar(255) NULL COMMENT '访问密码',
+ `status` varchar(50) NULL COMMENT '在线状态',
+ `longitude` double NULL COMMENT '经度',
+ `latitude` double NULL COMMENT '纬度',
+ `ptz_type` int NULL COMMENT '云台类型',
+ `position_type` int NULL COMMENT '点位类型',
+ `room_type` int NULL COMMENT '房间类型',
+ `use_type` int NULL COMMENT '使用性质',
+ `supply_light_type` int NULL COMMENT '补光方式',
+ `direction_type` int NULL COMMENT '朝向',
+ `resolution` varchar(255) NULL COMMENT '分辨率',
+ `business_group_id` varchar(255) NULL COMMENT '业务分组ID',
+ `download_speed` varchar(255) NULL COMMENT '下载/码流速率',
+ `svc_space_support_mod` int NULL COMMENT '空域SVC能力',
+ `svc_time_support_mode` int NULL COMMENT '时域SVC能力',
+ `sub_count` int NULL COMMENT '子节点数量',
+ `stream_id` varchar(255) NULL COMMENT '绑定的流ID',
+ `has_audio` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否有音频',
+ `gps_time` varchar(50) NULL COMMENT 'GPS定位时间',
+ `stream_identification` varchar(50) NULL COMMENT '流标识',
+ `channel_type` int NOT NULL DEFAULT 0 COMMENT '通道类型',
+ `map_level` int NOT NULL DEFAULT 0 COMMENT '地图层级',
+ `gb_device_id` varchar(50) NULL COMMENT 'GB内的设备ID',
+ `gb_name` varchar(255) NULL COMMENT 'GB上报的名称',
+ `gb_manufacturer` varchar(255) NULL COMMENT 'GB厂商',
+ `gb_model` varchar(255) NULL COMMENT 'GB型号',
+ `gb_owner` varchar(255) NULL COMMENT 'GB归属',
+ `gb_civil_code` varchar(255) NULL COMMENT 'GB行政区划',
+ `gb_block` varchar(255) NULL COMMENT 'GB区域',
+ `gb_address` varchar(255) NULL COMMENT 'GB地址',
+ `gb_parental` int NULL COMMENT 'GB子节点标识',
+ `gb_parent_id` varchar(255) NULL COMMENT 'GB父通道',
+ `gb_safety_way` int NULL COMMENT 'GB安全防范',
+ `gb_register_way` int NULL COMMENT 'GB注册方式',
+ `gb_cert_num` varchar(50) NULL COMMENT 'GB证书编号',
+ `gb_certifiable` int NULL COMMENT 'GB认证标志',
+ `gb_err_code` int NULL COMMENT 'GB错误码',
+ `gb_end_time` varchar(50) NULL COMMENT 'GB截止时间',
+ `gb_secrecy` int NULL COMMENT 'GB保密级别',
+ `gb_ip_address` varchar(50) NULL COMMENT 'GB IP',
+ `gb_port` int NULL COMMENT 'GB端口',
+ `gb_password` varchar(50) NULL COMMENT 'GB接入密码',
+ `gb_status` varchar(50) NULL COMMENT 'GB状态',
+ `gb_longitude` double NULL COMMENT 'GB经度',
+ `gb_latitude` double NULL COMMENT 'GB纬度',
+ `gb_business_group_id` varchar(50) NULL COMMENT 'GB业务分组',
+ `gb_ptz_type` int NULL COMMENT 'GB云台类型',
+ `gb_position_type` int NULL COMMENT 'GB点位类型',
+ `gb_room_type` int NULL COMMENT 'GB房间类型',
+ `gb_use_type` int NULL COMMENT 'GB用途',
+ `gb_supply_light_type` int NULL COMMENT 'GB补光',
+ `gb_direction_type` int NULL COMMENT 'GB朝向',
+ `gb_resolution` varchar(255) NULL COMMENT 'GB分辨率',
+ `gb_download_speed` varchar(255) NULL COMMENT 'GB码流速率',
+ `gb_svc_space_support_mod` int NULL COMMENT 'GB空域SVC',
+ `gb_svc_time_support_mode` int NULL COMMENT 'GB时域SVC',
+ `record_plan_id` int NULL COMMENT '绑定的录像计划ID',
+ `data_type` int NOT NULL COMMENT '数据类型标识',
+ `data_device_id` int NOT NULL COMMENT '数据来源设备主键',
+ `gps_speed` double NULL COMMENT 'GPS速度',
+ `gps_altitude` double NULL COMMENT 'GPS海拔',
+ `gps_direction` double NULL COMMENT 'GPS方向',
+ `enable_broadcast` int NOT NULL DEFAULT 0 COMMENT '是否支持广播',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_gb_device_id_deleted` (`gb_device_id`, `deleted`) COMMENT 'GB通道ID唯一(含逻辑删除)',
+ INDEX `idx_data_type` (`data_type`),
+ INDEX `idx_data_device_id` (`data_device_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备通道信息';
+
+-- ----------------------------
+-- 媒体服务器节点配置(共享表,不含 tenant_id/deleted)
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_media_server`;
+CREATE TABLE `wvp_media_server` (
+ `id` varchar(255) NOT NULL COMMENT '媒体服务器ID',
+ `ip` varchar(50) NULL COMMENT '服务器IP',
+ `hook_ip` varchar(50) NULL COMMENT 'hook回调IP',
+ `sdp_ip` varchar(50) NULL COMMENT 'SDP中使用的IP',
+ `stream_ip` varchar(50) NULL COMMENT '推流使用的IP',
+ `http_port` int NULL COMMENT 'HTTP端口',
+ `http_ssl_port` int NULL COMMENT 'HTTPS端口',
+ `rtmp_port` int NULL COMMENT 'RTMP端口',
+ `rtmp_ssl_port` int NULL COMMENT 'RTMPS端口',
+ `rtp_proxy_port` int NULL COMMENT 'RTP代理端口',
+ `rtsp_port` int NULL COMMENT 'RTSP端口',
+ `rtsp_ssl_port` int NULL COMMENT 'RTSPS端口',
+ `flv_port` int NULL COMMENT 'FLV端口',
+ `flv_ssl_port` int NULL COMMENT 'FLV HTTPS端口',
+ `mp4_port` int NULL COMMENT 'MP4点播端口',
+ `mp4_ssl_port` int NULL COMMENT 'MP4 HTTPS端口',
+ `ws_flv_port` int NULL COMMENT 'WS-FLV端口',
+ `ws_flv_ssl_port` int NULL COMMENT 'WS-FLV HTTPS端口',
+ `jtt_proxy_port` int NULL COMMENT 'JT/T代理端口',
+ `auto_config` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否自动配置',
+ `secret` varchar(50) NULL COMMENT 'ZLM校验密钥',
+ `type` varchar(50) NOT NULL DEFAULT 'zlm' COMMENT '节点类型',
+ `rtp_enable` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否开启RTP',
+ `rtp_port_range` varchar(50) NULL COMMENT 'RTP端口范围',
+ `send_rtp_port_range` varchar(50) NULL COMMENT '发送RTP端口范围',
+ `record_assist_port` int NULL COMMENT '录像辅助端口',
+ `default_server` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否默认节点',
+ `hook_alive_interval` int NULL COMMENT 'hook心跳间隔',
+ `record_path` varchar(255) NULL COMMENT '录像目录',
+ `record_day` int NOT NULL DEFAULT 7 COMMENT '录像保留天数',
+ `transcode_suffix` varchar(255) NULL COMMENT '转码指令后缀',
+ `server_id` varchar(50) NULL COMMENT '对应信令服务器ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_ip_http_port_server_id` (`ip`, `http_port`, `server_id`) COMMENT '节点IP+端口+服务器唯一'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='媒体服务器节点配置(不含租户隔离)';
+
+-- ----------------------------
+-- 上级国标平台注册信息
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_platform`;
+CREATE TABLE `wvp_platform` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `enable` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用该平台注册',
+ `name` varchar(255) NULL COMMENT '平台名称',
+ `server_gb_id` varchar(50) NULL COMMENT '上级平台国标编码',
+ `server_gb_domain` varchar(50) NULL COMMENT '上级平台域编码',
+ `server_ip` varchar(50) NULL COMMENT '上级平台IP',
+ `server_port` int NULL COMMENT '上级平台注册端口',
+ `device_gb_id` varchar(50) NULL COMMENT '本平台向上注册的国标编码',
+ `device_ip` varchar(50) NULL COMMENT '本平台信令IP',
+ `device_port` varchar(50) NULL COMMENT '本平台信令端口',
+ `username` varchar(255) NULL COMMENT '注册用户名',
+ `password` varchar(50) NULL COMMENT '注册密码',
+ `expires` varchar(50) NULL COMMENT '注册有效期',
+ `keep_timeout` varchar(50) NULL COMMENT '心跳超时时间',
+ `transport` varchar(50) NULL COMMENT '传输协议(UDP/TCP)',
+ `civil_code` varchar(50) NULL COMMENT '行政区划代码',
+ `manufacturer` varchar(255) NULL COMMENT '厂商',
+ `model` varchar(255) NULL COMMENT '型号',
+ `address` varchar(255) NULL COMMENT '地址',
+ `character_set` varchar(50) NULL COMMENT '字符集',
+ `ptz` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否支持PTZ',
+ `rtcp` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否开启RTCP',
+ `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '注册状态',
+ `catalog_group` int NULL COMMENT '目录分组方式',
+ `register_way` int NULL COMMENT '注册方式',
+ `secrecy` int NULL COMMENT '保密级别',
+ `as_message_channel` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否作为消息通道',
+ `catalog_with_platform` int NOT NULL DEFAULT 1 COMMENT '是否推送平台目录',
+ `catalog_with_group` int NOT NULL DEFAULT 1 COMMENT '是否推送分组目录',
+ `catalog_with_region` int NOT NULL DEFAULT 1 COMMENT '是否推送区域目录',
+ `auto_push_channel` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否自动推送通道',
+ `send_stream_ip` varchar(50) NULL COMMENT '推流时使用的IP',
+ `server_id` varchar(50) NULL COMMENT '对应信令服务器ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_server_gb_id_deleted` (`server_gb_id`, `deleted`) COMMENT '上级平台国标编码唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='上级国标平台注册信息';
+
+-- ----------------------------
+-- 国标平台通道映射关系
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_platform_channel`;
+CREATE TABLE `wvp_platform_channel` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `platform_id` bigint NULL COMMENT '平台ID',
+ `device_channel_id` bigint NULL COMMENT '本地通道表主键',
+ `custom_device_id` varchar(50) NULL COMMENT '自定义国标编码',
+ `custom_name` varchar(255) NULL COMMENT '自定义名称',
+ `custom_manufacturer` varchar(50) NULL COMMENT '自定义厂商',
+ `custom_model` varchar(50) NULL COMMENT '自定义型号',
+ `custom_owner` varchar(50) NULL COMMENT '自定义归属',
+ `custom_civil_code` varchar(50) NULL COMMENT '自定义行政区划',
+ `custom_block` varchar(50) NULL COMMENT '自定义区域',
+ `custom_address` varchar(50) NULL COMMENT '自定义地址',
+ `custom_parental` int NULL COMMENT '自定义父/子标识',
+ `custom_parent_id` varchar(50) NULL COMMENT '自定义父节点',
+ `custom_safety_way` int NULL COMMENT '自定义安全防范',
+ `custom_register_way` int NULL COMMENT '自定义注册方式',
+ `custom_cert_num` varchar(50) NULL COMMENT '自定义证书编号',
+ `custom_certifiable` int NULL COMMENT '自定义可认证标志',
+ `custom_err_code` int NULL COMMENT '自定义错误码',
+ `custom_end_time` varchar(50) NULL COMMENT '自定义截止时间',
+ `custom_secrecy` int NULL COMMENT '自定义保密级别',
+ `custom_ip_address` varchar(50) NULL COMMENT '自定义IP',
+ `custom_port` int NULL COMMENT '自定义端口',
+ `custom_password` varchar(255) NULL COMMENT '自定义密码',
+ `custom_status` varchar(50) NULL COMMENT '自定义状态',
+ `custom_longitude` double NULL COMMENT '自定义经度',
+ `custom_latitude` double NULL COMMENT '自定义纬度',
+ `custom_ptz_type` int NULL COMMENT '自定义云台类型',
+ `custom_position_type` int NULL COMMENT '自定义点位类型',
+ `custom_room_type` int NULL COMMENT '自定义房间类型',
+ `custom_use_type` int NULL COMMENT '自定义用途',
+ `custom_supply_light_type` int NULL COMMENT '自定义补光',
+ `custom_direction_type` int NULL COMMENT '自定义朝向',
+ `custom_resolution` varchar(255) NULL COMMENT '自定义分辨率',
+ `custom_business_group_id` varchar(255) NULL COMMENT '自定义业务分组',
+ `custom_download_speed` varchar(255) NULL COMMENT '自定义码流速率',
+ `custom_svc_space_support_mod` int NULL COMMENT '自定义空域SVC',
+ `custom_svc_time_support_mode` int NULL COMMENT '自定义时域SVC',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_platform_channel_deleted` (`platform_id`, `device_channel_id`, `deleted`) COMMENT '平台+通道唯一(含逻辑删除)',
+ UNIQUE KEY `uk_custom_device_id_deleted` (`custom_device_id`, `deleted`) COMMENT '自定义设备ID唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='国标平台通道映射关系';
+
+-- ----------------------------
+-- 平台与分组关联
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_platform_group`;
+CREATE TABLE `wvp_platform_group` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `platform_id` bigint NULL COMMENT '平台ID',
+ `group_id` bigint NULL COMMENT '分组ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_platform_group_deleted` (`platform_id`, `group_id`, `deleted`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台与分组关联';
+
+-- ----------------------------
+-- 平台与区域关联
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_platform_region`;
+CREATE TABLE `wvp_platform_region` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `platform_id` bigint NULL COMMENT '平台ID',
+ `region_id` bigint NULL COMMENT '区域ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_platform_region_deleted` (`platform_id`, `region_id`, `deleted`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台与区域关联';
+
+-- ----------------------------
+-- 拉流代理/转推配置
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_stream_proxy`;
+CREATE TABLE `wvp_stream_proxy` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `type` varchar(50) NULL COMMENT '代理类型(拉流/推流)',
+ `app` varchar(255) NULL COMMENT '应用名',
+ `stream` varchar(255) NULL COMMENT '流ID',
+ `src_url` varchar(255) NULL COMMENT '源地址',
+ `timeout` int NULL COMMENT '拉流超时时间',
+ `ffmpeg_cmd_key` varchar(255) NULL COMMENT 'FFmpeg命令模板键',
+ `rtsp_type` varchar(50) NULL COMMENT 'RTSP拉流方式',
+ `media_server_id` varchar(50) NULL COMMENT '指定媒体服务器ID',
+ `enable_audio` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用音频',
+ `enable_mp4` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否录制MP4',
+ `pulling` tinyint(1) NOT NULL DEFAULT 0 COMMENT '当前是否在拉流',
+ `enable` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用该代理',
+ `name` varchar(255) NULL COMMENT '代理名称',
+ `stream_key` varchar(255) NULL COMMENT '唯一流标识',
+ `server_id` varchar(50) NULL COMMENT '信令服务器ID',
+ `enable_disable_none_reader` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否无人观看时自动停流',
+ `relates_media_server_id` varchar(50) NULL COMMENT '关联的媒体服务器ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_app_stream_deleted` (`app`, `stream`, `deleted`) COMMENT '应用+流ID唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='拉流代理/转推配置';
+
+-- ----------------------------
+-- 推流会话记录
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_stream_push`;
+CREATE TABLE `wvp_stream_push` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `app` varchar(255) NULL COMMENT '应用名',
+ `stream` varchar(255) NULL COMMENT '流ID',
+ `media_server_id` varchar(50) NULL COMMENT '推流所在媒体服务器',
+ `server_id` varchar(50) NULL COMMENT '信令服务器ID',
+ `push_time` varchar(50) NULL COMMENT '推流开始时间',
+ `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '推流状态',
+ `pushing` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否正在推流',
+ `self` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否本地发起',
+ `start_offline_push` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否离线后自动重推',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_app_stream_deleted` (`app`, `stream`, `deleted`) COMMENT '应用+流ID唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='推流会话记录';
+
+-- ----------------------------
+-- 云端录像记录
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_cloud_record`;
+CREATE TABLE `wvp_cloud_record` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `app` varchar(255) NULL COMMENT '应用名',
+ `stream` varchar(255) NULL COMMENT '流ID',
+ `call_id` varchar(255) NULL COMMENT '会话ID',
+ `start_time` bigint NULL COMMENT '录像开始时间',
+ `end_time` bigint NULL COMMENT '录像结束时间',
+ `media_server_id` varchar(50) NULL COMMENT '媒体服务器ID',
+ `server_id` varchar(50) NULL COMMENT '信令服务器ID',
+ `file_name` varchar(255) NULL COMMENT '文件名',
+ `folder` varchar(500) NULL COMMENT '目录',
+ `file_path` varchar(500) NULL COMMENT '完整路径',
+ `collect` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否收藏',
+ `file_size` bigint NULL COMMENT '文件大小',
+ `time_len` double NULL COMMENT '时长',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_app_stream` (`app`, `stream`) COMMENT '应用+流ID索引',
+ INDEX `idx_call_id` (`call_id`) COMMENT '会话ID索引'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='云端录像记录';
+
+-- ----------------------------
+-- 通用分组表(行业/组织结构)
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_common_group`;
+CREATE TABLE `wvp_common_group` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `device_id` varchar(50) NOT NULL COMMENT '分组对应的平台或设备ID',
+ `name` varchar(255) NOT NULL COMMENT '分组名称',
+ `parent_id` bigint NULL COMMENT '父级分组ID',
+ `parent_device_id` varchar(50) NULL COMMENT '父级分组对应的设备ID',
+ `business_group` varchar(50) NOT NULL COMMENT '业务分组编码',
+ `civil_code` varchar(50) NULL COMMENT '行政区划代码',
+ `alias` varchar(255) NULL COMMENT '别名',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_device_id_deleted` (`device_id`, `deleted`) COMMENT '分组设备ID唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通用分组表';
+
+-- ----------------------------
+-- 通用行政区域表
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_common_region`;
+CREATE TABLE `wvp_common_region` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `device_id` varchar(50) NOT NULL COMMENT '区域对应的平台或设备ID',
+ `name` varchar(255) NOT NULL COMMENT '区域名称',
+ `parent_id` bigint NULL COMMENT '父级区域ID',
+ `parent_device_id` varchar(50) NULL COMMENT '父级区域的设备ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_device_id_deleted` (`device_id`, `deleted`) COMMENT '区域设备ID唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通用行政区域表';
+
+-- ----------------------------
+-- 通用 GB 通道视图表(跨来源统一)
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_common_gb_channel`;
+CREATE TABLE `wvp_common_gb_channel` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `gb_device_id` varchar(50) NULL COMMENT 'GB通道编号',
+ `name` varchar(255) NULL COMMENT '通道名称',
+ `manufacturer` varchar(255) NULL COMMENT '厂商',
+ `model` varchar(255) NULL COMMENT '型号',
+ `owner` varchar(255) NULL COMMENT '归属单位',
+ `civil_code` varchar(50) NULL COMMENT '行政区划代码',
+ `block` varchar(50) NULL COMMENT '区域/小区编号',
+ `address` varchar(255) NULL COMMENT '安装地址',
+ `parental` int NULL COMMENT '是否有子节点',
+ `parent_id` varchar(50) NULL COMMENT '父级通道ID',
+ `safety_way` int NULL COMMENT '安全防范等级',
+ `register_way` int NULL COMMENT '注册方式',
+ `cert_num` varchar(50) NULL COMMENT '证书编号',
+ `certifiable` int NULL COMMENT '是否可认证',
+ `err_code` int NULL COMMENT '故障状态码',
+ `end_time` varchar(50) NULL COMMENT '服务截止时间',
+ `secrecy` int NULL COMMENT '保密级别',
+ `ip_address` varchar(50) NULL COMMENT '设备IP地址',
+ `port` int NULL COMMENT '设备端口',
+ `password` varchar(255) NULL COMMENT '访问密码',
+ `status` varchar(50) NULL COMMENT '在线状态',
+ `longitude` double NULL COMMENT '经度',
+ `latitude` double NULL COMMENT '纬度',
+ `ptz_type` int NULL COMMENT '云台类型',
+ `position_type` int NULL COMMENT '点位类型',
+ `room_type` int NULL COMMENT '房间类型',
+ `use_type` int NULL COMMENT '使用性质',
+ `supply_light_type` int NULL COMMENT '补光方式',
+ `direction_type` int NULL COMMENT '朝向',
+ `resolution` varchar(255) NULL COMMENT '分辨率',
+ `business_group_id` varchar(255) NULL COMMENT '业务分组ID',
+ `download_speed` varchar(255) NULL COMMENT '下载/码流速率',
+ `svc_space_support_mod` int NULL COMMENT '空域SVC能力',
+ `svc_time_support_mode` int NULL COMMENT '时域SVC能力',
+ `has_audio` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否有音频',
+ `stream_identification` varchar(50) NULL COMMENT '流标识',
+ `data_type` int NOT NULL DEFAULT 0 COMMENT '数据类型(0=GB设备 1=拉流代理 2=推流)',
+ `data_device_id` bigint NOT NULL DEFAULT 0 COMMENT '数据来源设备主键',
+ `record_plan_id` bigint NULL COMMENT '绑定的录像计划ID',
+ `stream_id` varchar(255) NULL COMMENT '绑定的流ID',
+ `map_level` int NOT NULL DEFAULT 0 COMMENT '地图层级',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_gb_device_id_deleted` (`gb_device_id`, `deleted`) COMMENT 'GB通道编号唯一(含逻辑删除)',
+ INDEX `idx_data_type` (`data_type`),
+ INDEX `idx_data_device_id` (`data_device_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通用 GB 通道统一视图';
+
+-- ----------------------------
+-- 录像计划基础信息
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_record_plan`;
+CREATE TABLE `wvp_record_plan` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `snap` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否抓图计划',
+ `name` varchar(255) NOT NULL COMMENT '计划名称',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='录像计划基础信息';
+
+-- ----------------------------
+-- 录像计划条目
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_record_plan_item`;
+CREATE TABLE `wvp_record_plan_item` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `start` int NULL COMMENT '开始时间(分钟)',
+ `stop` int NULL COMMENT '结束时间(分钟)',
+ `week_day` int NULL COMMENT '星期(0-6)',
+ `plan_id` bigint NULL COMMENT '所属录像计划ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_plan_id` (`plan_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='录像计划条目';
+
+-- ============================================================
+-- AIoT 智能视频分析扩展表
+-- ============================================================
+
+-- ----------------------------
+-- ROI 区域配置
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_roi`;
+CREATE TABLE `wvp_ai_roi` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `roi_id` varchar(50) NOT NULL COMMENT 'UUID,与FastAPI端同步用',
+ `camera_id` varchar(50) NOT NULL COMMENT '通道国标编号',
+ `channel_db_id` bigint NULL COMMENT 'WVP通道表ID',
+ `device_id` varchar(50) NULL COMMENT '设备国标编号',
+ `name` varchar(100) NULL COMMENT 'ROI名称',
+ `roi_type` varchar(20) NOT NULL DEFAULT 'rectangle' COMMENT '形状:rectangle/polygon',
+ `coordinates` text NOT NULL COMMENT 'JSON归一化坐标',
+ `color` varchar(20) NULL DEFAULT '#FF0000' COMMENT '显示颜色',
+ `priority` int NOT NULL DEFAULT 0 COMMENT '优先级',
+ `enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '启用状态',
+ `extra_params` text NULL COMMENT '扩展参数JSON',
+ `description` varchar(500) NULL COMMENT '描述',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_roi_id_deleted` (`roi_id`, `deleted`) COMMENT 'ROI UUID唯一(含逻辑删除)',
+ INDEX `idx_camera_id` (`camera_id`),
+ INDEX `idx_device_id` (`device_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ROI区域配置';
+
+-- ----------------------------
+-- 算法注册表
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_algorithm`;
+CREATE TABLE `wvp_ai_algorithm` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `algo_code` varchar(100) NOT NULL COMMENT '算法编码',
+ `algo_name` varchar(200) NULL COMMENT '算法名称',
+ `target_class` varchar(50) NULL COMMENT '目标类别',
+ `param_schema` text NULL COMMENT '参数模板JSON',
+ `description` varchar(500) NULL COMMENT '描述',
+ `is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否可用',
+ `sync_time` varchar(50) NULL COMMENT '最后同步时间',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_algo_code_deleted` (`algo_code`, `deleted`) COMMENT '算法编码唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='算法注册表';
+
+-- ----------------------------
+-- 算法模板表
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_algo_template`;
+CREATE TABLE `wvp_ai_algo_template` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `algo_code` varchar(100) NOT NULL COMMENT '算法编码',
+ `name` varchar(200) NOT NULL COMMENT '模板名称',
+ `params` text NULL COMMENT '预定义参数JSON',
+ `description` varchar(500) NULL COMMENT '描述',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_algo_code` (`algo_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='算法模板表';
+
+-- ----------------------------
+-- ROI-算法绑定
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_roi_algo_bind`;
+CREATE TABLE `wvp_ai_roi_algo_bind` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `bind_id` varchar(50) NOT NULL COMMENT 'UUID,同步用',
+ `roi_id` varchar(50) NOT NULL COMMENT 'ROI的UUID',
+ `algo_code` varchar(100) NOT NULL COMMENT '算法编码',
+ `params` text NULL COMMENT '自定义参数JSON',
+ `priority` int NOT NULL DEFAULT 0 COMMENT '优先级',
+ `enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '启用状态',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_bind_id_deleted` (`bind_id`, `deleted`) COMMENT '绑定UUID唯一(含逻辑删除)',
+ INDEX `idx_roi_id` (`roi_id`),
+ INDEX `idx_algo_code` (`algo_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ROI算法绑定';
+
+-- ----------------------------
+-- 配置变更日志
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_config_log`;
+CREATE TABLE `wvp_ai_config_log` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `config_type` varchar(30) NOT NULL COMMENT '类型:ROI/ALGORITHM/BIND',
+ `config_id` varchar(50) NOT NULL COMMENT '目标ID',
+ `old_value` text NULL COMMENT '变更前JSON',
+ `new_value` text NULL COMMENT '变更后JSON',
+ `updated_by` varchar(100) NULL COMMENT '操作人',
+ `updated_at` varchar(50) NULL COMMENT '操作时间',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_config_type` (`config_type`),
+ INDEX `idx_config_id` (`config_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='配置变更日志';
+
+-- ----------------------------
+-- 配置快照(下发前生成)
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_config_snapshot`;
+CREATE TABLE `wvp_ai_config_snapshot` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `camera_id` varchar(50) NOT NULL COMMENT '通道国标编号',
+ `snapshot` longtext NULL COMMENT '快照JSON(ROI+算法绑定组合)',
+ `version` varchar(50) NULL COMMENT '快照版本号',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_camera_id` (`camera_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI配置快照';
+
+-- ----------------------------
+-- 边缘设备状态
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_edge_device`;
+CREATE TABLE `wvp_ai_edge_device` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `edge_id` varchar(100) NOT NULL COMMENT '边缘设备唯一标识',
+ `name` varchar(200) NULL COMMENT '设备名称',
+ `ip` varchar(50) NULL COMMENT '设备IP',
+ `status` varchar(20) NOT NULL DEFAULT 'offline' COMMENT '状态:online/offline',
+ `last_heartbeat` datetime NULL COMMENT '最近心跳时间',
+ `uptime_seconds` bigint NOT NULL DEFAULT 0 COMMENT '累计运行时长(秒)',
+ `frame_count` bigint NOT NULL DEFAULT 0 COMMENT '已处理帧数',
+ `alert_count` bigint NOT NULL DEFAULT 0 COMMENT '累计告警次数',
+ `extra_info` text NULL COMMENT '额外信息JSON',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_edge_id_deleted` (`edge_id`, `deleted`) COMMENT '边缘设备ID唯一(含逻辑删除)'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='边缘设备状态';
+
+-- ----------------------------
+-- 告警记录
+-- ----------------------------
+DROP TABLE IF EXISTS `wvp_ai_alert`;
+CREATE TABLE `wvp_ai_alert` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ `alert_id` varchar(50) NOT NULL COMMENT '告警UUID',
+ `camera_id` varchar(50) NOT NULL COMMENT '通道国标编号',
+ `camera_code` varchar(50) NULL COMMENT '摄像头自定义编号',
+ `roi_id` varchar(50) NULL COMMENT '触发告警的ROI UUID',
+ `algo_code` varchar(100) NOT NULL COMMENT '算法编码',
+ `alert_type` varchar(50) NOT NULL COMMENT '告警类型',
+ `image_path` varchar(500) NULL COMMENT '告警图片COS路径',
+ `confidence` double NULL COMMENT '置信度(0-1)',
+ `start_time` datetime NULL COMMENT '告警开始时间',
+ `end_time` datetime NULL COMMENT '告警结束时间',
+ `duration_ms` bigint NOT NULL DEFAULT 0 COMMENT '持续时长(毫秒)',
+ `extra_data` text NULL COMMENT '额外数据JSON',
+ `resolved` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已处理',
+ `edge_device_id` varchar(100) NULL COMMENT '上报的边缘设备ID',
+ `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_alert_id_deleted` (`alert_id`, `deleted`) COMMENT '告警UUID唯一(含逻辑删除)',
+ INDEX `idx_camera_id` (`camera_id`),
+ INDEX `idx_algo_code` (`algo_code`),
+ INDEX `idx_start_time` (`start_time`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI告警记录';
+
+-- ============================================================
+-- 初始数据
+-- ============================================================
+
+-- 预置算法(与 FastAPI 边缘端保持一致)
+INSERT INTO `wvp_ai_algorithm` (`algo_code`, `algo_name`, `target_class`, `param_schema`, `description`, `is_active`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES
+('leave_post', '离岗检测', 'person',
+ '{"confirm_on_duty_sec":{"type":"int","default":10,"min":1},"confirm_leave_sec":{"type":"int","default":30,"min":1},"leave_countdown_sec":{"type":"int","default":300,"min":0},"cooldown_sec":{"type":"int","default":600,"min":0},"working_hours":{"type":"list","default":[]}}',
+ '检测人员是否在岗,支持工作时间段配置', 1, 'system', NOW(), 'system', NOW(), b'0', 0),
+('intrusion', '周界入侵检测', 'person',
+ '{"cooldown_seconds":{"type":"int","default":120,"min":0},"confirm_seconds":{"type":"int","default":5,"min":1}}',
+ '检测人员进入指定区域', 1, 'system', NOW(), 'system', NOW(), b'0', 0);
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/viewsh-dependencies/pom.xml b/viewsh-dependencies/pom.xml
index d13c3ecd..4d342039 100644
--- a/viewsh-dependencies/pom.xml
+++ b/viewsh-dependencies/pom.xml
@@ -85,6 +85,8 @@
1.2.5
1.18.2
5.6.227
+ 1.4.1
+ 6.6.5
2.40.15
1.16.7
@@ -764,6 +766,24 @@
cos_api
${cos_api.version}
+
+
+ no.ecc.vectortile
+ java-vector-tile
+ ${java-vector-tile.version}
+
+
+
+ com.squareup.okhttp3
+ logging-interceptor
+ ${okhttp.version}
+
+
+
+ com.github.oshi
+ oshi-core
+ ${oshi-core.version}
+
diff --git a/viewsh-module-video/viewsh-module-video-server/pom.xml b/viewsh-module-video/viewsh-module-video-server/pom.xml
index b6f45654..45c40a2d 100644
--- a/viewsh-module-video/viewsh-module-video-server/pom.xml
+++ b/viewsh-module-video/viewsh-module-video-server/pom.xml
@@ -177,6 +177,30 @@
com.qcloud
cos_api
+
+
+
+
+
+ com.squareup.okhttp3
+ logging-interceptor
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+
+
+ com.github.oshi
+ oshi-core
+
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/PageHelper.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/PageHelper.java
new file mode 100644
index 00000000..7c12cf2c
--- /dev/null
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/PageHelper.java
@@ -0,0 +1,25 @@
+package com.github.pagehelper;
+
+/**
+ * PageHelper compatibility shim for WVP migration.
+ * startPage() is a no-op — actual pagination needs to be replaced with MyBatis Plus.
+ * TODO: Phase 5.7 - migrate all usages to MyBatis Plus selectPage()
+ */
+public class PageHelper {
+
+ private PageHelper() {}
+
+ /**
+ * No-op stub. TODO: Replace with MyBatis Plus pagination.
+ */
+ public static void startPage(int pageNum, int pageSize) {
+ // no-op stub for compilation
+ }
+
+ /**
+ * No-op stub. TODO: Replace with MyBatis Plus pagination.
+ */
+ public static void startPage(int pageNum, int pageSize, String orderBy) {
+ // no-op stub for compilation
+ }
+}
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/PageInfo.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/PageInfo.java
new file mode 100644
index 00000000..56ce59db
--- /dev/null
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/PageInfo.java
@@ -0,0 +1,105 @@
+package com.github.pagehelper;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * PageHelper compatibility shim for WVP migration.
+ * Wraps the basic pagination data needed by the migrated code.
+ * TODO: Phase 5.7 - migrate to viewsh PageResult properly
+ */
+public class PageInfo implements Serializable {
+
+ private long total;
+ private List list;
+ private int pageNum;
+ private int pageSize;
+ private int pages;
+ private int startRow;
+ private int endRow;
+ private int size;
+ private int prePage;
+ private int nextPage;
+ private boolean isFirstPage;
+ private boolean isLastPage;
+ private boolean hasPreviousPage;
+ private boolean hasNextPage;
+ private int navigatePages = 8;
+ private int[] navigatepageNums = new int[0];
+ private int navigateFirstPage;
+ private int navigateLastPage;
+
+ public PageInfo() {
+ this.list = new ArrayList<>();
+ }
+
+ public PageInfo(List list) {
+ this.list = list != null ? list : new ArrayList<>();
+ this.total = this.list.size();
+ this.size = this.list.size();
+ this.pageSize = this.list.size();
+ this.pageNum = 1;
+ this.pages = 1;
+ }
+
+ public PageInfo(List list, long total) {
+ this.list = list != null ? list : new ArrayList<>();
+ this.total = total;
+ this.size = this.list.size();
+ }
+
+ public long getTotal() { return total; }
+ public void setTotal(long total) { this.total = total; }
+
+ public List getList() { return list; }
+ public void setList(List list) { this.list = list; }
+
+ public int getPageNum() { return pageNum; }
+ public void setPageNum(int pageNum) { this.pageNum = pageNum; }
+
+ public int getPageSize() { return pageSize; }
+ public void setPageSize(int pageSize) { this.pageSize = pageSize; }
+
+ public int getPages() { return pages; }
+ public void setPages(int pages) { this.pages = pages; }
+
+ public int getStartRow() { return startRow; }
+ public void setStartRow(int startRow) { this.startRow = startRow; }
+
+ public int getEndRow() { return endRow; }
+ public void setEndRow(int endRow) { this.endRow = endRow; }
+
+ public int getSize() { return size; }
+ public void setSize(int size) { this.size = size; }
+
+ public int getPrePage() { return prePage; }
+ public void setPrePage(int prePage) { this.prePage = prePage; }
+
+ public int getNextPage() { return nextPage; }
+ public void setNextPage(int nextPage) { this.nextPage = nextPage; }
+
+ public boolean isIsFirstPage() { return isFirstPage; }
+ public void setIsFirstPage(boolean isFirstPage) { this.isFirstPage = isFirstPage; }
+
+ public boolean isIsLastPage() { return isLastPage; }
+ public void setIsLastPage(boolean isLastPage) { this.isLastPage = isLastPage; }
+
+ public boolean isHasPreviousPage() { return hasPreviousPage; }
+ public void setHasPreviousPage(boolean hasPreviousPage) { this.hasPreviousPage = hasPreviousPage; }
+
+ public boolean isHasNextPage() { return hasNextPage; }
+ public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; }
+
+ public int getNavigatePages() { return navigatePages; }
+ public void setNavigatePages(int navigatePages) { this.navigatePages = navigatePages; }
+
+ public int[] getNavigatepageNums() { return navigatepageNums; }
+ public void setNavigatepageNums(int[] navigatepageNums) { this.navigatepageNums = navigatepageNums; }
+
+ public int getNavigateFirstPage() { return navigateFirstPage; }
+ public void setNavigateFirstPage(int navigateFirstPage) { this.navigateFirstPage = navigateFirstPage; }
+
+ public int getNavigateLastPage() { return navigateLastPage; }
+ public void setNavigateLastPage(int navigateLastPage) { this.navigateLastPage = navigateLastPage; }
+}
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/util/StringUtil.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/util/StringUtil.java
new file mode 100644
index 00000000..eb1fb065
--- /dev/null
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/github/pagehelper/util/StringUtil.java
@@ -0,0 +1,18 @@
+package com.github.pagehelper.util;
+
+/**
+ * PageHelper StringUtil compatibility shim.
+ * TODO: Replace usages with Hutool StrUtil or StringUtils
+ */
+public class StringUtil {
+
+ private StringUtil() {}
+
+ public static boolean isEmpty(String str) {
+ return str == null || str.isEmpty();
+ }
+
+ public static boolean isNotEmpty(String str) {
+ return !isEmpty(str);
+ }
+}
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java
index 4321830e..528fff0e 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlertController.java
@@ -18,7 +18,7 @@ import java.util.Map;
@Slf4j
@RestController
-@RequestMapping("/api/ai/alert")
+@RequestMapping("/video/ai/alert")
@Tag(name = "AI-告警管理")
public class AiAlertController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgoTemplateController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgoTemplateController.java
index 463e9649..44a73615 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgoTemplateController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgoTemplateController.java
@@ -13,7 +13,7 @@ import java.util.List;
@Slf4j
@RestController
-@RequestMapping("/api/ai/template")
+@RequestMapping("/video/ai/template")
@Tag(name = "AI-算法参数模板")
public class AiAlgoTemplateController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgorithmController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgorithmController.java
index b3ca8adb..1b08ee85 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgorithmController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiAlgorithmController.java
@@ -12,7 +12,7 @@ import java.util.List;
@Slf4j
@RestController
-@RequestMapping("/api/ai/algorithm")
+@RequestMapping("/video/ai/algorithm")
@Tag(name = "AI-算法管理")
public class AiAlgorithmController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiCameraController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiCameraController.java
index ac38430e..733de76e 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiCameraController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiCameraController.java
@@ -20,7 +20,7 @@ import java.util.stream.Collectors;
*/
@Slf4j
@RestController
-@RequestMapping("/api/ai/camera")
+@RequestMapping("/video/ai/camera")
@Tag(name = "AI-摄像头管理")
public class AiCameraController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigController.java
index 1df445a9..4efc0edb 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigController.java
@@ -20,7 +20,7 @@ import java.util.Map;
@Slf4j
@RestController
-@RequestMapping("/api/ai/config")
+@RequestMapping("/video/ai/config")
@Tag(name = "AI-配置推送与版本管理")
public class AiConfigController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigLogController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigLogController.java
index e7664bab..0a7445d1 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigLogController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiConfigLogController.java
@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
-@RequestMapping("/api/ai/log")
+@RequestMapping("/video/ai/log")
@Tag(name = "AI-变更日志")
public class AiConfigLogController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiEdgeDeviceController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiEdgeDeviceController.java
index a8dcd04b..a620ab60 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiEdgeDeviceController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiEdgeDeviceController.java
@@ -15,7 +15,7 @@ import java.util.Map;
@Slf4j
@RestController
-@RequestMapping("/api/ai/device")
+@RequestMapping("/video/ai/device")
@Tag(name = "AI-边缘设备管理")
public class AiEdgeDeviceController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiRoiController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiRoiController.java
index 217829b4..0e2b90d8 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiRoiController.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/aiot/controller/AiRoiController.java
@@ -23,7 +23,7 @@ import java.util.Map;
@Slf4j
@RestController
-@RequestMapping("/api/ai/roi")
+@RequestMapping("/video/ai/roi")
@Tag(name = "AI-ROI区域管理")
public class AiRoiController {
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/JwtUtils.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/JwtUtils.java
new file mode 100644
index 00000000..16e609dc
--- /dev/null
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/JwtUtils.java
@@ -0,0 +1,22 @@
+package com.viewsh.module.video.conf.security;
+
+/**
+ * JWT utility stub — WVP authentication removed, replaced by viewsh Security framework.
+ * This class exists only to satisfy unused imports and annotation references in migrated controllers.
+ * TODO: Phase 6 - remove all references to this class from controllers
+ *
+ * @deprecated Use viewsh SecurityFrameworkUtils instead
+ */
+@Deprecated
+public class JwtUtils {
+
+ /**
+ * HTTP header name for JWT token — used in Swagger @SecurityRequirement annotations.
+ * TODO: Phase 6 - replace with viewsh security header name
+ */
+ public static final String HEADER = "Authorization";
+
+ private JwtUtils() {
+ // utility stub, not instantiable
+ }
+}
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/SecurityUtils.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/SecurityUtils.java
new file mode 100644
index 00000000..82bf72af
--- /dev/null
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/SecurityUtils.java
@@ -0,0 +1,26 @@
+package com.viewsh.module.video.conf.security;
+
+import com.viewsh.module.video.conf.security.dto.LoginUser;
+
+/**
+ * WVP SecurityUtils stub — replaced by viewsh Security framework.
+ * TODO: Phase 6 - replace usages with viewsh SecurityFrameworkUtils
+ *
+ * @deprecated Use viewsh SecurityFrameworkUtils instead
+ */
+@Deprecated
+public class SecurityUtils {
+
+ private SecurityUtils() {
+ // utility stub
+ }
+
+ /**
+ * Get current login user info.
+ * TODO: Phase 6 - implement using viewsh SecurityFrameworkUtils.getLoginUser()
+ */
+ public static LoginUser getUserInfo() {
+ // Stub: always returns null (anonymous user) until Phase 6 auth integration
+ return null;
+ }
+}
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/dto/LoginUser.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/dto/LoginUser.java
new file mode 100644
index 00000000..d9c509bf
--- /dev/null
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/conf/security/dto/LoginUser.java
@@ -0,0 +1,30 @@
+package com.viewsh.module.video.conf.security.dto;
+
+/**
+ * WVP LoginUser stub — replaced by viewsh Security framework.
+ * TODO: Phase 6 - replace usages with viewsh LoginUser
+ *
+ * @deprecated Use viewsh SecurityFrameworkUtils instead
+ */
+@Deprecated
+public class LoginUser {
+
+ private Long id;
+ private String username;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+}
diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/redis/RedisTemplateConfig.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/redis/RedisTemplateConfig.java
index 77443943..714f900f 100644
--- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/redis/RedisTemplateConfig.java
+++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/redis/RedisTemplateConfig.java
@@ -1,17 +1,21 @@
package com.viewsh.module.video.framework.redis;
-import com.alibaba.fastjson2.support.spring.data.redis.GenericFastJsonRedisSerializer;
import com.viewsh.module.video.gb28181.bean.MobilePosition;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
- * Video 模块专用 RedisTemplate 配置(使用 FastJSON2 序列化)
+ * Video 模块专用 RedisTemplate 配置
* 独立 Bean 名称,避免覆盖框架的 Jackson 版本 RedisTemplate
+ *
+ * NOTE: Original WVP used FastJSON2 (GenericFastJsonRedisSerializer from fastjson2-extension-spring6).
+ * Temporarily using GenericJackson2JsonRedisSerializer as fallback until
+ * fastjson2-extension-spring6 is available in the local Maven repository.
+ * TODO: Switch back to GenericFastJsonRedisSerializer once the dependency is resolved.
*/
@Configuration
public class RedisTemplateConfig {
@@ -19,13 +23,11 @@ public class RedisTemplateConfig {
@Bean("videoRedisTemplate")
public RedisTemplate