feat(rvw): deliver tenant portal v4 flow and config foundation

Implement RVW V4.0 tenant-aware backend/frontend flow with tenant routing, config APIs, and full portal UX updates. Sync system/RVW/deployment docs to capture verified upload-review-report workflow and next-step admin configuration work.

Made-with: Cursor
This commit is contained in:
2026-03-14 22:29:40 +08:00
parent ba464082cb
commit 16179e16ca
45 changed files with 4753 additions and 93 deletions

View File

@@ -0,0 +1,67 @@
# **RVW V4.0 智能审稿 SaaS 开发计划 \- 架构与工程审查报告**
**审查目标:** 评估 V1.0 版开发计划的技术可行性识别潜在的架构漏洞、数据迁移风险及开发体验DX阻塞点。
**架构前提变更:** 确认 MVP 阶段为节约泛域名 SSL 证书成本,采用 **URL 路径隔离 (review.xunzhengyixue.com/jtim)** 方案。 **审查结论:** 整体架构设计优秀,但在**历史数据迁移、长耗时接口设计、以及路径路由下的静态资源加载**等方面存在 6 个具体的工程盲区,需在执行前修正。
## **🔴 核心高风险项 (P0级 \- 影响系统稳定与上线)**
### **1\. 历史数据迁移盲区review\_tasks 增加 tenantId 会导致现网报错**
* **计划现状**:任务 1.2 提出给现有的 review\_tasks 表添加 tenant\_id 字段,并设为外键。
* **风险点**线上生产环境RDS中已经存在大量 V3.0 的历史审稿任务。如果在 Prisma 中直接增加强制Required关联的 tenantId 字段,**Prisma Migrate 将会报错并中断**,因为历史数据该字段为空,违反了非空和外键约束。
* **修正建议**
在 Phase 1 的数据库改造中,必须明确两步走的迁移策略:
1. 先在 platform\_schema.tenants 中初始化一个“默认临床主站租户”(如 tenant-default-yanjiu
2. 编写自定义的数据迁移脚本Data Migration Script在添加 tenant\_id 列后,将所有历史 review\_tasks 的 tenant\_id 刷为这个默认租户的 ID最后再设置外键非空约束。
### **2\. 接口超时风险:退修信生成(任务 3.7)采用了同步阻塞设计**
* **计划现状**:任务 3.7 设计的接口 POST /api/v2/rvw/tasks/:id/revision-letter 是一个同步接口,直接返回 letterContent 和 wordFileUrl。
* **风险点**:组装数十个问题并请求大模型生成一封高质量、排版精美的退修信,耗时极易超过阿里云 SAE 网关的 **60秒超时限制**。如果让前端一直 loading 等待,极易出现 504 Gateway Timeout。
* **修正建议**
鉴于你们在 ASL Deep Research V2.0 中已经成功应用了 SSE 流式架构,强烈建议将退修信生成改为:
* **方案 A流式推荐**:前端调用 SSE 接口,打字机式实时渲染退修信,生成完毕后再通过另一个接口触发 Word 文件上传并获取 URL。
* **方案 B异步**:复用现有的 pg-boss 队列,前端轮询任务状态(但退修信字数不多,方案 A 体验更好)。
## **🟡 中风险项 (P1级 \- 影响开发体验与业务闭环)**
### **3\. 【新增架构风险】前端静态资源404与Nginx刷新白屏风险**
* **计划现状**MVP 架构已调整为 review.xunzhengyixue.com/:tenantId 路径隔离。
* **风险点**
1. **静态资源 404**:如果前端打包配置使用的是相对路径(./),用户访问 /jtim 时,浏览器会向 /jtim/assets/... 错误地请求 JS/CSS 文件,导致全站白屏。
2. **Nginx 刷新 404**:用户在 /jtim/dashboard 页面直接刷新浏览器时Nginx 会试图寻找服务器上的真实物理目录,找不到即报 404。
* **修正建议**
* **前端组**打包配置Vite/Webpack中的 base 或 publicPath 必须强制设置为绝对根路径 /。
* **运维组**:部署前端镜像的 nginx.conf 中,必须配置 try\_files $uri $uri/ /index.html; 以支持单页应用SPA的 History 路由回退。
### **4\. 业务闭环缺失:谁把“责编”拉进特定的租户?**
* **计划现状**:计划涵盖了数据隔离和 ADMIN 配置,但忽略了“用户-租户绑定User-Tenant Binding”的操作入口。
* **风险点**:当我们把 review.xunzhengyixue.com/jtim 交付给客户时JTIM 的编辑登录后,系统如何知道他属于 JTIM如果他不在 tenant\_members 表里,他依然会看到空数据或 403。
* **修正建议**
系统状态文档显示已有 platform\_schema.tenant\_members 表和用户管理 API。需要在 Phase 2 的任务中补充明确:**内部超管通过 ADMIN 端现有的【用户管理 / 租户成员管理】界面,预先将对应的医生账号添加到指定的期刊租户中,并赋予 RVW 模块权限**。这不需要新开发,但必须列入交付 SOP 流程。
### **5\. 灾难级配置风险Handlebars 缺少“实时预览”功能(任务 2.2**
* **计划现状**ADMIN 端的 Panel B 提供了一个供运营人员编辑 Handlebars 模板的文本区。
* **风险点**:如果运营人员不小心写错了语法(例如少写了一个 }),或者引用了错误的变量。由于没有预览功能,必须去前台上传一篇真实的 PDF等待 5 分钟 LLM 分析完,在最后一步渲染报告时系统才会崩溃。这会导致极高的配置试错成本。
* **修正建议**
强烈建议在任务 2.2 的 Handlebars 编辑器旁,复用你们在 ADMIN Phase 3.5.4 已经实现的\*\*“测试渲染 (Test Render)”\*\*功能。提供一份 Mock 好的完整 system\_metrics JSON 假数据,运营人员点击“预览”按钮,即可立刻在右侧看到 Markdown 报告的渲染效果,确保语法 100% 正确后再保存。
## **🟢 细节优化项 (P2级 \- 架构规范对齐)**
### **6\. 后端鉴权上下文提取方式需明确 (适应路径隔离)**
* **计划现状**:由子域名切换到了 URL 路径隔离。
* **风险点**:后端无法再通过请求头中的 Origin 或 Host 隐式判断当前用户正在访问哪个租户的工作台。
* **修正建议** 明确开发规范:前端在使用 Axios 发起对 RVW 模块的业务 API 请求时,必须在 Header 中显式携带 x-tenant-id从前端路由 :tenantId 中获取)。后端 auth.middleware.ts 统一从 Header 获取上下文,进行防越权校验。
## **🎯 总结与建议行动**
这份开发计划总体可以直接执行但建议在启动会Kick-off让技术负责人将以上 6 点更新进原有的 Markdown 计划中:
1. **后端/DBA**:确认 review\_tasks 的平滑迁移 SQL 脚本。
2. **后端**:将退修信接口(任务 3.7)重构为 SSE 流式响应,并在鉴权中间件增加 x-tenant-id 解析。
3. **前端 & 运维**:死守前端打包的 base: '/' 设置与 Nginx try\_files 配置,确保路径路由不白屏;并在 ADMIN 增加模板预览按钮。