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 videoRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); - // 使用 FastJSON2 序列化(WVP 内部专用) - GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer(); - // value 值的序列化采用 fastJsonRedisSerializer - redisTemplate.setValueSerializer(fastJsonRedisSerializer); - redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); - - // key 的序列化采用 StringRedisSerializer + // Using Jackson serializer as fallback (WVP originally used FastJSON2) + GenericJackson2JsonRedisSerializer jacksonSerializer = new GenericJackson2JsonRedisSerializer(); + redisTemplate.setValueSerializer(jacksonSerializer); + redisTemplate.setHashValueSerializer(jacksonSerializer); + // key serializer redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory); @@ -33,14 +35,12 @@ public class RedisTemplateConfig { } @Bean("videoRedisTemplateForMobilePosition") - public RedisTemplate videoRedisTemplateForMobilePosition(RedisConnectionFactory redisConnectionFactory) { + public RedisTemplate videoRedisTemplateForMobilePosition( + RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); - // 使用 FastJSON2 序列化 - GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer(); - redisTemplate.setValueSerializer(fastJsonRedisSerializer); - redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); - - // key 的序列化采用 StringRedisSerializer + GenericJackson2JsonRedisSerializer jacksonSerializer = new GenericJackson2JsonRedisSerializer(); + redisTemplate.setValueSerializer(jacksonSerializer); + redisTemplate.setHashValueSerializer(jacksonSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory); diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/security/config/SecurityConfiguration.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/security/config/SecurityConfiguration.java index d5bc7fe0..699c9d64 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/security/config/SecurityConfiguration.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/security/config/SecurityConfiguration.java @@ -31,6 +31,17 @@ public class SecurityConfiguration { registry.requestMatchers("/druid/**").anonymous(); // RPC 服务的安全配置 registry.requestMatchers(ApiConstants.PREFIX + "/**").permitAll(); + + // WVP ZLMediaKit Hook 回调(ZLM → WVP,无用户认证) + // HC-04: ZLM Hook 路径必须保留,ZLM 配置的回调地址 + registry.requestMatchers("/index/hook/**").permitAll(); + + // 设备快照公开访问 + registry.requestMatchers("/video/device/query/snap/**").permitAll(); + + // SSE 推送(媒体事件流,可能由前端直接订阅) + registry.requestMatchers("/video/sse/**").permitAll() + .requestMatchers("/video/emit").permitAll(); } }; diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/websocket/WebSocketConfig.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/websocket/WebSocketConfig.java index 0b2cb7cc..2999aba3 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/websocket/WebSocketConfig.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/framework/websocket/WebSocketConfig.java @@ -1,19 +1,14 @@ package com.viewsh.module.video.framework.websocket; -import com.viewsh.module.video.framework.webLog.LogChannel; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; +/** + * WebSocket configuration. + * In Spring Boot 3 / Spring 6, ServerEndpointExporter was removed. + * JSR-356 @ServerEndpoint beans are auto-detected by embedded Tomcat. + * No explicit bean registration is needed. + */ @Configuration public class WebSocketConfig { - - @Bean - public ServerEndpointExporter serverEndpointExporter(){ - ServerEndpointExporter endpointExporter = new ServerEndpointExporter(); - - endpointExporter.setAnnotatedEndpointClasses(LogChannel.class); - - return endpointExporter; - } + // No-op: Spring Boot 3 auto-registers @ServerEndpoint beans } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/AlarmController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/AlarmController.java index f80f012e..3dbb10a7 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/AlarmController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/AlarmController.java @@ -31,7 +31,7 @@ import java.util.List; @Tag(name = "报警信息管理") @Slf4j @RestController -@RequestMapping("/api/alarm") +@RequestMapping("/video/alarm") public class AlarmController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelController.java index b6403bc7..50aede5d 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelController.java @@ -45,7 +45,7 @@ import java.util.concurrent.TimeUnit; @Tag(name = "全局通道管理") @RestController @Slf4j -@RequestMapping(value = "/api/common/channel") +@RequestMapping(value = "/video/common/channel") public class ChannelController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelFrontEndController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelFrontEndController.java index d061d738..3a45c12e 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelFrontEndController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/ChannelFrontEndController.java @@ -26,7 +26,7 @@ import java.util.List; @Tag(name = "全局通道前端控制") @RestController @Slf4j -@RequestMapping(value = "/api/common/channel/front-end") +@RequestMapping(value = "/video/common/channel/front-end") public class ChannelFrontEndController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceConfig.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceConfig.java index e2d12f90..e59f82a7 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceConfig.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceConfig.java @@ -26,7 +26,7 @@ import org.springframework.web.context.request.async.DeferredResult; @Slf4j @Tag(name = "国标设备配置") @RestController -@RequestMapping("/api/device/config") +@RequestMapping("/video/device/config") public class DeviceConfig { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceControl.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceControl.java index f7b32046..e0eb3186 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceControl.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceControl.java @@ -25,7 +25,7 @@ import org.springframework.web.context.request.async.DeferredResult; @Tag(name = "国标设备控制") @Slf4j @RestController -@RequestMapping("/api/device/control") +@RequestMapping("/video/device/control") public class DeviceControl { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceQuery.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceQuery.java index 2fbc967a..a2489084 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceQuery.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/DeviceQuery.java @@ -42,7 +42,7 @@ import java.nio.file.Files; @SuppressWarnings("rawtypes") @Slf4j @RestController -@RequestMapping("/api/device/query") +@RequestMapping("/video/device/query") public class DeviceQuery { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GBRecordController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GBRecordController.java index dc9b202a..f01963c8 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GBRecordController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GBRecordController.java @@ -38,7 +38,7 @@ import java.util.concurrent.TimeUnit; @Tag(name = "国标录像") @Slf4j @RestController -@RequestMapping("/api/gb_record") +@RequestMapping("/video/gb_record") public class GBRecordController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GroupController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GroupController.java index 36fb5987..ec6f9356 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GroupController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/GroupController.java @@ -20,7 +20,7 @@ import java.util.List; @Slf4j @Tag(name = "分组管理") @RestController -@RequestMapping("/api/group") +@RequestMapping("/video/group") public class GroupController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MediaController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MediaController.java index d245ef4f..0e72817c 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MediaController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MediaController.java @@ -32,7 +32,7 @@ import java.net.URL; @Tag(name = "媒体流相关") @RestController @Slf4j -@RequestMapping(value = "/api/media") +@RequestMapping(value = "/video/media") public class MediaController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MobilePositionController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MobilePositionController.java index 620afb3e..d84e0c5e 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MobilePositionController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/MobilePositionController.java @@ -32,7 +32,7 @@ import java.util.UUID; @Tag(name = "位置信息管理") @Slf4j @RestController -@RequestMapping("/api/position") +@RequestMapping("/video/position") public class MobilePositionController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlatformController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlatformController.java index 14d23e65..b5226943 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlatformController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlatformController.java @@ -30,7 +30,7 @@ import org.springframework.web.bind.annotation.*; @Tag(name = "级联平台管理") @Slf4j @RestController -@RequestMapping("/api/platform") +@RequestMapping("/video/platform") public class PlatformController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlayController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlayController.java index 9b9a1c91..768874a5 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlayController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlayController.java @@ -50,7 +50,7 @@ import java.util.UUID; @Tag(name = "国标设备点播") @Slf4j @RestController -@RequestMapping("/api/play") +@RequestMapping("/video/play") public class PlayController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlaybackController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlaybackController.java index 0abfada2..f7d395a2 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlaybackController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PlaybackController.java @@ -47,7 +47,7 @@ import java.util.UUID; @Tag(name = "视频回放") @Slf4j @RestController -@RequestMapping("/api/playback") +@RequestMapping("/video/playback") public class PlaybackController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PtzController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PtzController.java index 16ccb1ff..f2128d93 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PtzController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/PtzController.java @@ -26,7 +26,7 @@ import org.springframework.web.context.request.async.DeferredResult; @Tag(name = "前端设备控制") @Slf4j @RestController -@RequestMapping("/api/front-end") +@RequestMapping("/video/front-end") public class PtzController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/RegionController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/RegionController.java index a547717c..2bc5f886 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/RegionController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/RegionController.java @@ -20,7 +20,7 @@ import java.util.List; @Tag(name = "区域管理") @RestController -@RequestMapping("/api/region") +@RequestMapping("/video/region") public class RegionController { private final static Logger logger = LoggerFactory.getLogger(RegionController.class); diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/SseController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/SseController.java index c0b4a27e..8d15346e 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/SseController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/gb28181/controller/SseController.java @@ -22,7 +22,7 @@ import java.io.IOException; */ @Tag(name = "SSE 推送") @RestController -@RequestMapping("/api") +@RequestMapping("/video") public class SseController { @Resource diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/bean/JTMediaStreamType.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/bean/JTMediaStreamType.java new file mode 100644 index 00000000..6e894889 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/bean/JTMediaStreamType.java @@ -0,0 +1,10 @@ +package com.viewsh.module.video.jt1078.bean; + +/** + * JT1078 media stream type. + * JT1078 module is not migrated in this phase — stub only. + * TODO: Phase N - migrate JT1078 module + */ +public enum JTMediaStreamType { + PLAY, PLAYBACK, TALK +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/config/JT1078Config.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/config/JT1078Config.java new file mode 100644 index 00000000..7e17eb58 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/config/JT1078Config.java @@ -0,0 +1,22 @@ +package com.viewsh.module.video.jt1078.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +/** + * JT1078 configuration stub. + * JT1078 module is not migrated in this phase. + * TODO: Phase N - migrate JT1078 module + */ +@Component +@Data +@ConfigurationProperties(prefix = "jt1078", ignoreInvalidFields = true) +@Order(3) +public class JT1078Config { + + private Integer port; + + private String password; +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/service/Ijt1078PlayService.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/service/Ijt1078PlayService.java new file mode 100644 index 00000000..ac1c388c --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/service/Ijt1078PlayService.java @@ -0,0 +1,17 @@ +package com.viewsh.module.video.jt1078.service; + +import com.viewsh.module.video.jt1078.bean.JTMediaStreamType; + +/** + * JT1078 play service interface stub. + * JT1078 module is not migrated in this phase. + * TODO: Phase N - migrate JT1078 module + */ +public interface Ijt1078PlayService { + + JTMediaStreamType checkStreamFromJt(String stream); + + void stopPlay(String phoneNumber, Integer channelId); + + void stopPlayback(String phoneNumber, Integer channelId); +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/service/Ijt1078Service.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/service/Ijt1078Service.java new file mode 100644 index 00000000..214a7559 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/jt1078/service/Ijt1078Service.java @@ -0,0 +1,13 @@ +package com.viewsh.module.video.jt1078.service; + +import com.viewsh.module.video.jt1078.bean.JTMediaStreamType; + +/** + * JT1078 service interface stub. + * JT1078 module is not migrated in this phase. + * TODO: Phase N - migrate JT1078 module + */ +public interface Ijt1078Service { + + JTMediaStreamType checkStreamFromJt(String stream); +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/abl/bean/hook/OnRecordProgressABLHookParam.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/abl/bean/hook/OnRecordProgressABLHookParam.java index f862494a..22e7c1bd 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/abl/bean/hook/OnRecordProgressABLHookParam.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/media/abl/bean/hook/OnRecordProgressABLHookParam.java @@ -1,40 +1,12 @@ package com.viewsh.module.video.media.abl.bean.hook; -public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam{ +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam { private Integer currentFileDuration; - private Integer TotalVideoDuration; - private String startTime; - private String endTime; - - public Integer getCurrentFileDuration() { - return currentFileDuration; - } - - public void setCurrentFileDuration(Integer currentFileDuration) { - this.currentFileDuration = currentFileDuration; - } - - public Integer getTotalVideoDuration() { - return TotalVideoDuration; - } - - public void setTotalVideoDuration(Integer totalVideoDuration) { - TotalVideoDuration = totalVideoDuration; - } - - public String getStartTime() { - return startTime; - } - - public void setStartTime(String startTime) { - this.startTime = startTime; - } - - public String getEndTime() { - return endTime; - } - - public void setEndTime(String endTime) { - this.endTime = endTime; - } + private Integer totalVideoDuration; + // startTime and endTime are inherited from OnRecordMp4ABLHookParam (with chain setters) } diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/RoleMapper.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/RoleMapper.java new file mode 100644 index 00000000..37fb65b5 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/RoleMapper.java @@ -0,0 +1,28 @@ +package com.viewsh.module.video.storager.dao; + +import com.viewsh.module.video.storager.dao.dto.Role; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * WVP RoleMapper stub. Role management is provided by viewsh-module-system. + * TODO: Phase 6 - remove all WVP role management code + * + * @deprecated + */ +@Mapper +@Deprecated +public interface RoleMapper { + + Role selectById(@Param("id") int id); + + List selectAll(); + + int add(Role role); + + int update(Role role); + + int delete(@Param("id") int id); +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/UserApiKeyMapper.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/UserApiKeyMapper.java new file mode 100644 index 00000000..db24376f --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/UserApiKeyMapper.java @@ -0,0 +1,38 @@ +package com.viewsh.module.video.storager.dao; + +import com.viewsh.module.video.storager.dao.dto.UserApiKey; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * WVP UserApiKeyMapper stub. API Key management is provided by viewsh-module-system. + * TODO: Phase 6 - remove all WVP API key management code + * + * @deprecated + */ +@Mapper +@Deprecated +public interface UserApiKeyMapper { + + int add(UserApiKey userApiKey); + + boolean isApiKeyExists(@Param("apiKey") String apiKey); + + List getUserApiKeys(); + + int enable(@Param("id") Integer id); + + int disable(@Param("id") Integer id); + + int remark(@Param("id") Integer id, @Param("remark") String remark); + + int delete(@Param("id") Integer id); + + UserApiKey selectById(@Param("id") Integer id); + + int apiKey(@Param("id") Integer id, @Param("apiKey") String apiKey); + + int reset(@Param("id") Integer id, @Param("apiKey") String apiKey); +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/UserMapper.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/UserMapper.java new file mode 100644 index 00000000..3e60d431 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/UserMapper.java @@ -0,0 +1,36 @@ +package com.viewsh.module.video.storager.dao; + +import com.viewsh.module.video.storager.dao.dto.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * WVP UserMapper stub. User management is provided by viewsh-module-system. + * TODO: Phase 6 - remove all WVP user management code + * + * @deprecated + */ +@Mapper +@Deprecated +public interface UserMapper { + + User select(@Param("username") String username, @Param("password") String password); + + User selectById(@Param("id") int id); + + User getUserByUsername(@Param("username") String username); + + List selectAll(); + + List getUsers(); + + int add(User user); + + int update(User user); + + int delete(@Param("id") int id); + + int changePushKey(@Param("id") int id, @Param("pushKey") String pushKey); +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/dto/Role.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/dto/Role.java new file mode 100644 index 00000000..a8e43548 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/dto/Role.java @@ -0,0 +1,19 @@ +package com.viewsh.module.video.storager.dao.dto; + +import lombok.Data; + +/** + * WVP Role DTO stub. Role management is provided by viewsh-module-system. + * This class exists to satisfy compilation of legacy code. + * TODO: Phase 6 - remove all WVP user/role management code, use viewsh role model + * + * @deprecated Use viewsh-module-system role management instead + */ +@Data +@Deprecated +public class Role { + + private int id; + private String roleName; + +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/dto/User.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/dto/User.java new file mode 100644 index 00000000..66b73860 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/storager/dao/dto/User.java @@ -0,0 +1,22 @@ +package com.viewsh.module.video.storager.dao.dto; + +import lombok.Data; + +/** + * WVP User DTO stub. User management is provided by viewsh-module-system. + * This class exists to satisfy compilation of legacy code. + * TODO: Phase 6 - remove all WVP user management code, use viewsh user model + * + * @deprecated Use viewsh-module-system user management instead + */ +@Data +@Deprecated +public class User { + + private int id; + private String username; + private String password; + private String pushKey; + private int roleId; + +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamProxy/controller/StreamProxyController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamProxy/controller/StreamProxyController.java index eabe40fe..d7cdf81b 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamProxy/controller/StreamProxyController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamProxy/controller/StreamProxyController.java @@ -39,7 +39,7 @@ import java.util.Map; @Tag(name = "拉流代理", description = "") @RestController @Slf4j -@RequestMapping(value = "/api/proxy") +@RequestMapping(value = "/video/proxy") public class StreamProxyController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/bean/StreamPushExcelDto.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/bean/StreamPushExcelDto.java index 513986ae..4b318742 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/bean/StreamPushExcelDto.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/bean/StreamPushExcelDto.java @@ -1,6 +1,6 @@ package com.viewsh.module.video.streamPush.bean; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/controller/StreamPushController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/controller/StreamPushController.java index 544996be..aec30798 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/controller/StreamPushController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/controller/StreamPushController.java @@ -1,9 +1,9 @@ package com.viewsh.module.video.streamPush.controller; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.ExcelReader; -import com.alibaba.excel.exception.ExcelDataConvertException; -import com.alibaba.excel.read.metadata.ReadSheet; +import cn.idev.excel.EasyExcel; +import cn.idev.excel.ExcelReader; +import cn.idev.excel.exception.ExcelDataConvertException; +import cn.idev.excel.read.metadata.ReadSheet; import com.viewsh.module.video.common.enums.ChannelDataType; import com.viewsh.module.video.framework.config.UserSetting; import com.viewsh.module.video.framework.exception.ControllerException; @@ -49,7 +49,7 @@ import java.util.UUID; @Tag(name = "推流信息管理") @RestController @Slf4j -@RequestMapping(value = "/api/push") +@RequestMapping(value = "/video/push") public class StreamPushController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/enent/StreamPushUploadFileHandler.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/enent/StreamPushUploadFileHandler.java index acbb3a24..b0626ed6 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/enent/StreamPushUploadFileHandler.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/streamPush/enent/StreamPushUploadFileHandler.java @@ -1,7 +1,7 @@ package com.viewsh.module.video.streamPush.enent; -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; +import cn.idev.excel.context.AnalysisContext; +import cn.idev.excel.event.AnalysisEventListener; import com.viewsh.module.video.streamPush.bean.StreamPush; import com.viewsh.module.video.streamPush.bean.StreamPushExcelDto; import com.viewsh.module.video.streamPush.service.IStreamPushService; diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/TestController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/TestController.java index 741c67f0..ec952494 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/TestController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/TestController.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Map; @RestController -@RequestMapping("/api/test") +@RequestMapping("/video/test") public class TestController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/cloudRecord/CloudRecordController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/cloudRecord/CloudRecordController.java index 71d16e49..4e7f3ccc 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/cloudRecord/CloudRecordController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/cloudRecord/CloudRecordController.java @@ -47,7 +47,7 @@ import java.util.zip.ZipOutputStream; @Tag(name = "云端录像接口") @Slf4j @RestController -@RequestMapping("/api/cloud/record") +@RequestMapping("/video/cloud/record") public class CloudRecordController { diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/log/LogController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/log/LogController.java index a97d6bb5..fcbb72ee 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/log/LogController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/log/LogController.java @@ -28,7 +28,7 @@ import java.util.List; @Tag(name = "日志文件查询接口") @Slf4j @RestController -@RequestMapping("/api/log") +@RequestMapping("/video/log") public class LogController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/ps/PsController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/ps/PsController.java index 09dcd3b5..660b1d0d 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/ps/PsController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/ps/PsController.java @@ -37,7 +37,7 @@ import java.util.concurrent.TimeUnit; @Tag(name = "第三方PS服务对接") @Slf4j @RestController -@RequestMapping("/api/ps") +@RequestMapping("/video/ps") public class PsController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/recordPlan/RecordPlanController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/recordPlan/RecordPlanController.java index 7c4da57d..b5bda19a 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/recordPlan/RecordPlanController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/recordPlan/RecordPlanController.java @@ -25,7 +25,7 @@ import java.util.List; @Tag(name = "录制计划") @Slf4j @RestController -@RequestMapping("/api/record/plan") +@RequestMapping("/video/record/plan") public class RecordPlanController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/rtp/RtpController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/rtp/RtpController.java index 51ab3e3a..2f155fb0 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/rtp/RtpController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/rtp/RtpController.java @@ -38,7 +38,7 @@ import java.util.concurrent.TimeUnit; @Tag(name = "第三方服务对接") @Slf4j @RestController -@RequestMapping("/api/rtp") +@RequestMapping("/video/rtp") public class RtpController { @Autowired diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/server/ServerController.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/server/ServerController.java index 9a4fc6c0..653655c2 100644 --- a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/server/ServerController.java +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/vmanager/server/ServerController.java @@ -49,7 +49,7 @@ import java.util.*; @Tag(name = "服务控制") @Slf4j @RestController -@RequestMapping("/api/server") +@RequestMapping("/video/server") public class ServerController { diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraChannel.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraChannel.java new file mode 100644 index 00000000..099b45b9 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraChannel.java @@ -0,0 +1,32 @@ +package com.viewsh.module.video.web.custom.bean; + +import com.viewsh.module.video.gb28181.bean.CommonGBChannel; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +@Schema(description = "摄像头信息") +public class CameraChannel extends CommonGBChannel { + + @Schema(description = "摄像头设备国标编号") + private String deviceCode; + + + @Schema(description = "图标路径") + private String icon; + + /** + * 分组别名 + */ + @Schema(description = "所属组织结构别名") + private String groupAlias; + + /** + * 分组所属业务分组别名 + */ + @Schema(description = "所属业务分组别名") + private String topGroupGAlias; +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraCount.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraCount.java new file mode 100644 index 00000000..094a0480 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraCount.java @@ -0,0 +1,13 @@ +package com.viewsh.module.video.web.custom.bean; + +import lombok.Data; + +@Data +public class CameraCount { + + private String groupAlias; + private String deviceId; + private Long allCount; + private Long onlineCount; + +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraGroup.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraGroup.java new file mode 100644 index 00000000..80021173 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraGroup.java @@ -0,0 +1,34 @@ +package com.viewsh.module.video.web.custom.bean; + +import com.viewsh.module.video.gb28181.bean.Group; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +public class CameraGroup extends Group { + + @Getter + private CameraGroup parent; + + @Getter + private final List child = new ArrayList<>(); + + public void setParent(CameraGroup parent) { + if (parent == null) { + return; + } + this.parent = parent; + parent.addChild(this); + } + + public void addChild(CameraGroup child) { + if (child == null) { + return; + } + this.child.add(child); + if (this.parent != null) { + this.parent.addChild(child); + } + } +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraStreamContent.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraStreamContent.java new file mode 100644 index 00000000..0e417bfe --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraStreamContent.java @@ -0,0 +1,22 @@ +package com.viewsh.module.video.web.custom.bean; + +import com.viewsh.module.video.common.StreamInfo; +import com.viewsh.module.video.vmanager.bean.StreamContent; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CameraStreamContent extends StreamContent { + + public CameraStreamContent(StreamInfo streamInfo) { + super(streamInfo); + } + + private String name; + + // 0不可动,1可动 + private Integer controlType; + + +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraStreamInfo.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraStreamInfo.java new file mode 100644 index 00000000..9dfdb299 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/CameraStreamInfo.java @@ -0,0 +1,22 @@ +package com.viewsh.module.video.web.custom.bean; + +import com.viewsh.module.video.common.StreamInfo; +import com.viewsh.module.video.gb28181.bean.CommonGBChannel; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CameraStreamInfo { + + + private CommonGBChannel channel; + + + private StreamInfo streamInfo; + + public CameraStreamInfo(CommonGBChannel channel, StreamInfo streamInfo) { + this.channel = channel; + this.streamInfo = streamInfo; + } +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/ChannelParam.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/ChannelParam.java new file mode 100644 index 00000000..21f9dea4 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/ChannelParam.java @@ -0,0 +1,15 @@ +package com.viewsh.module.video.web.custom.bean; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "通道信息") +public class ChannelParam { + + @Schema(description = "摄像头设备国标编号, 对于非国标摄像头可以不设置此参数") + private String deviceCode; + + @Schema(description = "通道编号") + private String deviceId; +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/IdsQueryParam.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/IdsQueryParam.java new file mode 100644 index 00000000..74352bcd --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/IdsQueryParam.java @@ -0,0 +1,17 @@ +package com.viewsh.module.video.web.custom.bean; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "根据多个ID获取摄像头列表") +public class IdsQueryParam { + + @Schema(description = "通道编号列表") + private List deviceIds; + + @Schema(description = "坐标系类型:WGS84,GCJ02、BD09") + private String geoCoordSys; +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/Point.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/Point.java new file mode 100644 index 00000000..e372422e --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/Point.java @@ -0,0 +1,13 @@ +package com.viewsh.module.video.web.custom.bean; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "坐标") +public class Point { + + private double lng; + private double lat; + +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/PolygonQueryParam.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/PolygonQueryParam.java new file mode 100644 index 00000000..319f3e86 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/PolygonQueryParam.java @@ -0,0 +1,23 @@ +package com.viewsh.module.video.web.custom.bean; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "多边形检索摄像头参数") +public class PolygonQueryParam { + + @Schema(description = "多边形位置") + private List position; + + @Schema(description = "地图级别") + private Integer level; + + @Schema(description = "分组别名") + private String groupAlias; + + @Schema(description = "坐标系类型:WGS84,GCJ02、BD09") + private String geoCoordSys; +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/SYMember.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/SYMember.java new file mode 100644 index 00000000..8ccd44c0 --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/custom/bean/SYMember.java @@ -0,0 +1,17 @@ +package com.viewsh.module.video.web.custom.bean; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SYMember { + + private String no; + private Long unicodeNo; + private Long blockId; + private String unitNo; + private String terminalMemberStatus; + private String channelDeviceId; + +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/gb28181/dto/DeviceChannelExtend.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/gb28181/dto/DeviceChannelExtend.java new file mode 100644 index 00000000..3145d26a --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/com/viewsh/module/video/web/gb28181/dto/DeviceChannelExtend.java @@ -0,0 +1,229 @@ +package com.viewsh.module.video.web.gb28181.dto; + +import lombok.Data; + +@Data +public class DeviceChannelExtend { + + + /** + * 数据库自增ID + */ + private int id; + + /** + * 通道id + */ + private String channelId; + + /** + * 设备id + */ + private String deviceId; + + /** + * 通道名 + */ + private String name; + + private String deviceName; + + private boolean deviceOnline; + + /** + * 生产厂商 + */ + private String manufacture; + + /** + * 型号 + */ + private String model; + + /** + * 设备归属 + */ + private String owner; + + /** + * 行政区域 + */ + private String civilCode; + + /** + * 警区 + */ + private String block; + + /** + * 安装地址 + */ + private String address; + + /** + * 是否有子设备 1有, 0没有 + */ + private int parental; + + /** + * 父级id + */ + private String parentId; + + /** + * 信令安全模式 + */ + private int safetyWay; + + /** + * 注册方式 + */ + private int registerWay; + + /** + * 证书序列号 + */ + private String certNum; + + /** + * 证书有效标识 + */ + private int certifiable; + + /** + * 证书无效原因码 + */ + private int errCode; + + /** + * 证书终止有效期 + */ + private String endTime; + + /** + * 保密属性 + */ + private String secrecy; + + /** + * IP地址 + */ + private String ipAddress; + + /** + * 端口号 + */ + private int port; + + /** + * 密码 + */ + private String password; + + /** + * 云台类型 + */ + private int PTZType; + + /** + * 云台类型描述字符串 + */ + private String PTZTypeText; + + /** + * 创建时间 + */ + private String createTime; + + /** + * 更新时间 + */ + private String updateTime; + + /** + * 在线/离线 + */ + private String status; + + /** + * 经度 + */ + private double longitude; + + /** + * 纬度 + */ + private double latitude; + + /** + * 经度 GCJ02 + */ + private double longitudeGcj02; + + /** + * 纬度 GCJ02 + */ + private double latitudeGcj02; + + /** + * 经度 WGS84 + */ + private double longitudeWgs84; + + /** + * 纬度 WGS84 + */ + private double latitudeWgs84; + + /** + * 子设备数 + */ + private int subCount; + + /** + * 流唯一编号,存在表示正在直播 + */ + private String streamId; + + /** + * 是否含有音频 + */ + private boolean hasAudio; + + /** + * 标记通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划 + */ + private int channelType; + + /** + * 业务分组 + */ + private String businessGroupId; + + /** + * GPS的更新时间 + */ + private String gpsTime; + + + public void setPTZType(int PTZType) { + this.PTZType = PTZType; + switch (PTZType) { + case 0: + this.PTZTypeText = "未知"; + break; + case 1: + this.PTZTypeText = "球机"; + break; + case 2: + this.PTZTypeText = "半球"; + break; + case 3: + this.PTZTypeText = "固定枪机"; + break; + case 4: + this.PTZTypeText = "遥控枪机"; + break; + } + } +} diff --git a/viewsh-module-video/viewsh-module-video-server/src/main/java/no/ecc/vectortile/VectorTileEncoder.java b/viewsh-module-video/viewsh-module-video-server/src/main/java/no/ecc/vectortile/VectorTileEncoder.java new file mode 100644 index 00000000..bb4af71e --- /dev/null +++ b/viewsh-module-video/viewsh-module-video-server/src/main/java/no/ecc/vectortile/VectorTileEncoder.java @@ -0,0 +1,41 @@ +package no.ecc.vectortile; + +import org.locationtech.jts.geom.Geometry; + +import java.util.Map; + +/** + * Vector Tile Encoder stub — replaces no.ecc.vectortile:java-vector-tile:1.4.1 + * which is not available in configured Maven repositories. + * + * TODO: Either install the jar in a local Maven repository, or replace with + * an available MVT library (e.g., mapbox-vector-tile from com.wdtinc). + * + * This stub compiles but produces an empty byte array. + */ +public class VectorTileEncoder { + + public VectorTileEncoder() { + } + + /** + * Add a feature to the encoder. + * + * @param layerName the layer name + * @param attributes feature attributes + * @param geometry JTS geometry + */ + public void addFeature(String layerName, Map attributes, Geometry geometry) { + // stub — no-op + } + + /** + * Encode the accumulated features as a protobuf byte array. + * + * @return empty byte array (stub) + */ + public byte[] encode() { + // stub — returns empty tile + return new byte[0]; + } +}