Files
aiot-platform-cloud/openspec/changes/add-video-module-wvp-migration/proposal.md
2026-04-21 10:15:02 +08:00

139 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Proposal: 迁移 WVP-Platform 到 viewsh-module-video
**Change ID**: `add-video-module-wvp-migration`
**Status**: Draft
**Branch**: `feature/video-module`
**Source**: `C:\workspace\java17\wvp-platform` (WVP-PRO v2.7.4, feature 分支)
---
## Context
项目需要视频监控管理能力(摄像头管理、国标 GB28181 信令、视频流、NVR 对接。WVP-Platform 是一个成熟的开源 GB28181 视频平台796 个 Java 文件),需要将其核心代码迁移到已创建的 `viewsh-module-video` 微服务模块中。
### 已完成
- `viewsh-module-video` 模块骨架已创建api + server端口 48093
- 网关路由已配置video-admin-api / video-app-api
- 分支 `feature/video-module` 已建立并提交骨架
### 核心决策(已确认)
| 决策项 | 结论 |
|--------|------|
| ORM | 全部改为 MyBatis PlusBaseMapperX |
| 认证 | 丢弃 WVP 认证,用 viewsh 框架 Security |
| 数据库 | 独立 `aiot-video` 数据库 |
| AI 模块 | 一起迁移 |
| JT1078 | 本次不迁,后续再说 |
| OkHttp | 保留(调用 ZLMediaKit REST API |
---
## Scope
### 迁移范围(~700 文件)
| WVP 模块 | 文件数 | 说明 |
|----------|--------|------|
| `gb28181/` | ~261 | GB28181 国标核心SIP 信令、设备、通道、播放、级联) |
| `media/` | ~78 | 流媒体集成ZLMediaKit + ABL 适配器) |
| `aiot/` | ~50 | AI 告警、边缘设备、ROI、截图 |
| `streamProxy/` | ~15 | 拉流代理 |
| `streamPush/` | ~15 | 推流管理 |
| `storager/` | ~15 | Redis 缓存存储、MapperRedisCatchStorageImpl 被 67 个文件引用) |
| `vmanager/` | ~40 | 录像计划、云端录像、RTP 配置 |
| `service/` | ~30 | 通用业务服务 |
| `common/` | ~20 | 公共工具 |
| `conf/`(部分) | ~15 | SIP/Media/Redis/WebSocket/线程池配置 |
| `utils/` | ~10 | 工具类 |
### 不迁移
| WVP 模块 | 原因 |
|----------|------|
| `conf/security/` | 用 viewsh 框架认证替换 |
| `vmanager/user/` | 用 viewsh-module-system 替代 |
| `jt1078/` | 后续再迁 |
| `conf/ftpServer/` | 非核心,按需 |
| `conf/MybatisConfig.java` | 框架已有 |
| `conf/SpringDocConfig.java` | 框架已有 |
| User/Role 相关 Mapper 和 DO | 框架已有 |
---
## Constraints约束集
### Hard Constraints硬约束
1. **HC-01 SIP 协议栈不可替换** — JAIN SIP 1.3.0-91 是 GB28181 核心,没有替代方案
2. **HC-02 启动顺序必须保留** — SipLayer(@Order 10) → MediaServerConfig(@Order 12) → PlatformService(@Order 15) → DeviceService(@Order 16)
3. **HC-03 异步处理必须保留** — SIP 信令处理通过 @Async("taskExecutor") 异步执行,阻塞会导致设备超时
4. **HC-04 ZLMediaKit Hook 路径必须保留**`/index/hook/*` 是 ZLM 配置的回调地址,改路径需要同步改 ZLM 配置
5. **HC-05 DO 继承框架标准基类** — 业务表 DO 继承 `TenantBaseDO`(含 tenantId/createTime/updateTime/creator/updater/deleted共享表 DO 继承 `BaseDO`。统一使用逻辑删除WVP 原有 39 处硬删除(`DELETE FROM`)改为 MyBatis Plus 的 `deleteById()`/`delete(wrapper)`。含唯一索引的表需将 `deleted` 加入联合唯一索引
6. **HC-06 Mapper 必须继承 BaseMapperX** — viewsh 框架的 ORM 标准
7. **HC-09 RedisTemplate 隔离** — WVP 用 FastJSON2 序列化的 RedisTemplate 必须声明为独立 Bean`videoRedisTemplate`),不能覆盖框架的 Jackson 版本,否则其他模块 Redis 全部崩溃
8. **HC-10 不引入 PageHelper** — WVP 用 PageHelper 分页,但不能引入 `pagehelper-spring-boot-starter`,会和 MyBatis Plus 分页插件冲突导致 double pagination
9. **HC-11 fastjson2 extension 用 spring6 版本** — WVP 依赖 `fastjson2-extension-spring5`,必须改为 `fastjson2-extension-spring6`Spring Boot 3.x 基于 Spring 6
10. **HC-12 Java 版本兼容** — WVP 编译目标是 JDK 21但经扫描实际未使用 Java 21 专有语法(仅用了 isBlank 等 Java 11 特性),风险低,编译目标改为 17 即可
11. **HC-13 多租户支持** — WVP 表需要加 `tenant_id`DO 继承含 tenantId 的 VideoBaseDO框架租户拦截器自动追加 `WHERE tenant_id=?`。少数全局共享表(如 media_server需加入 `viewsh.tenant.ignore-tables` 排除
7. **HC-07 独立数据库** — video-server 连接独立的 `aiot-video` 库,通过多数据源配置
8. **HC-08 WVP 源从 feature 分支获取** — WVP 项目在 `C:\workspace\java17\wvp-platform`,需确认其 feature 分支
### Soft Constraints软约束
1. **SC-01 包名规范**`com.viewsh.module.video.*`,符合项目命名规范
2. **SC-02 Controller 路径** — 放到 `controller/admin/` 包下,框架自动加 `/admin-api` 前缀
3. **SC-03 分页统一** — PageHelper → MyBatis Plus Page + PageResult
4. **SC-04 Redis key 隔离** — 加 `video:` 前缀,避免和其他模块冲突
5. **SC-05 异常码段**`1-060-000-000`
### Dependencies依赖关系
#### 框架已有(直接复用)
- Hutool 5.8.42、Guava 33.5.0、HttpClient、fastexcel
#### 必须新增
| 依赖 | 版本 | 用途 |
|------|------|------|
| jain-sip-ri | 1.3.0-91 | GB28181 SIP 协议栈 |
| dom4j | 2.1.4 | SIP XML 消息解析 |
| okhttp | 4.12.0 | 调用 ZLMediaKit REST API |
| okhttp-digest | 3.1.1 | HTTP Digest 认证 |
| bouncycastle | 1.78.1 | SIP 认证加密 |
| fastjson2 | 2.0.57 | Redis 序列化WVP 用 v2 |
| fastjson2-extension-spring6 | 2.0.57 | Spring 6 适配(不能用 spring5 版本) |
#### 按需引入
| 依赖 | 版本 | 用途 |
|------|------|------|
| paho.mqttv5 | 1.2.5 | AI MQTT 推送(框架有 v3WVP 用 v5 |
| jts-core | 1.18.2 | 地理位置计算 |
| cos_api | 5.6.227 | AI 截图上传腾讯云(可后续替换为 MinIO |
---
## Success Criteria
1. **SC-BUILD**: `mvn compile -pl viewsh-module-video/viewsh-module-video-server` 编译通过
2. **SC-BOOT**: VideoServerApplication 启动成功SIP 端口监听正常
3. **SC-SWAGGER**: 访问 `http://localhost:48093/doc.html` 能看到接口文档
4. **SC-GATEWAY**: 通过网关 `http://localhost:48080/admin-api/video/` 能路由到 video-server
5. **SC-SIP**: 模拟器或真实摄像头能通过 SIP 注册到平台
6. **SC-PLAY**: 点播一路摄像头,返回可用的播放地址
7. **SC-DB**: 独立 `aiot-video` 数据库中表结构完整CRUD 正常
---
## Risks
| 风险 | 等级 | 缓解措施 |
|------|------|---------|
| ORM 改造量大23 个 Mapper | 高 | 分批改造,先简单后复杂;复杂 JOIN SQL 保留 @Select |
| SIP 初始化顺序问题 | 中 | @Order 值从 10/12/15/16 改为 100/102/105/106给框架 Bean 留空间 |
| RedisTemplate Bean 冲突 | **高** | WVP 用独立 `videoRedisTemplate` Bean内部 30+ 文件加 @Qualifier |
| 硬删除改逻辑删除 | 中 | WVP 39 处 `DELETE FROM` 改为 MyBatis Plus deleteById(),唯一索引加 deleted 字段 |
| Java 版本兼容性 | **低** | 经扫描 WVP 未使用 Java 21 专有语法,仅改编译目标即可 |
| 多租户改造 | 中 | 所有业务表加 tenant_id 列共享表media_server加入 ignore-tables |
| PageHelper 与 MyBatis Plus 冲突 | 中 | 绝不引入 pagehelper 依赖,改用 MyBatis Plus 分页 |
| WVP 内部循环依赖 | 低 | application.yaml 已配 allow-circular-references=true |
| 表结构改造(加 VideoBaseDO 字段) | 中 | 编写 SQL 迁移脚本,加 createTime/updateTime/creator/updater |