feat(iit): QC deep fix + V3.1 architecture plan + project member management

QC System Deep Fix:
- HardRuleEngine: add null tolerance + field availability pre-check (skipped status)
- SkillRunner: baseline data merge for follow-up events + field availability check
- QcReportService: record-level pass rate calculation + accurate LLM XML report
- iitBatchController: legacy log cleanup (eventId=null) + upsert RecordSummary
- seed-iit-qc-rules: null/empty string tolerance + applicableEvents config

V3.1 Architecture Design (docs only, no code changes):
- QC engine V3.1 plan: 5-level data structure (CDISC ODM) + D1-D7 dimensions
- Three-batch implementation strategy (A: foundation, B: bubbling, C: new engines)
- Architecture team review: 4 whitepapers reviewed + feedback doc + 4 critical suggestions
- CRA Agent strategy roadmap + CRA 4-tool explanation doc for clinical experts

Project Member Management:
- Cross-tenant member search and assignment (remove tenant restriction)
- IIT project detail page enhancement with tabbed layout (KB + members)
- IitProjectContext for business-side project selection
- System-KB route access control adjustment for project operators

Frontend:
- AdminLayout sidebar menu restructure
- IitLayout with project context provider
- IitMemberManagePage new component
- Business-side pages adapt to project context

Prisma:
- 2 new migrations (user-project RBAC + is_demo flag)
- Schema updates for project member management

Made-with: Cursor
This commit is contained in:
2026-03-01 15:27:05 +08:00
parent c3f7d54fdf
commit 0b29fe88b5
61 changed files with 6877 additions and 524 deletions

View File

@@ -0,0 +1,166 @@
# 2026年2月28日部署完成总结
> **部署日期**2026-02-28
> **部署范围**Node.js后端 + 前端Nginx 更新(旧系统集成上线)
> **部署状态**:✅ 全部完成
> **文档日期**2026-02-28
---
## 部署成果一览
### 服务版本对比
| 服务 | 部署前 | 部署后 | 变更类型 |
|------|--------|--------|---------|
| Node.js后端 | v2.2 | **v2.3** | 新增旧系统集成模块 |
| 前端Nginx | v1.8 | **v1.9** | 新增旧系统嵌入前端 |
### 内网地址变更
| 服务 | 部署前地址 | 部署后地址 | 状态 |
|------|-----------|-----------|------|
| Node.js后端 | `172.17.197.28:3001` | `172.17.197.30:3001` | ✅ 已变更 |
| 前端Nginx | `172.17.197.29:80` | `172.17.197.31:80` | ✅ 已变更 |
---
## 一、Node.js后端更新v2.2 → v2.3
### 1.1 主要变更
| 类别 | 变更内容 |
|------|---------|
| 新增模块 | Legacy Bridge旧系统集成认证服务 |
| 新增依赖 | `mysql2`(连接旧系统 ECS MySQL |
| 新增 API | `POST /api/v1/legacy/auth`旧系统Token注入 |
| 新增服务 | `legacy-auth.service.ts`MySQL用户查找/创建 + MD5 Token生成 |
### 1.2 Legacy Bridge 工作原理
1. 新系统前端调用 `POST /api/v1/legacy/auth`
2. 后端从 JWT 中提取用户手机号
3. 后端连接旧系统 MySQL`xzyx_online`),通过手机号查找/创建用户
4. 后端为该用户生成 MD5 Token注入到 `u_user_token`
5. 返回 Token + 用户信息给前端
6. 前端构建 `token-bridge.html` URL 并在 iframe 中加载
### 1.3 镜像信息
| 项目 | 值 |
|------|---|
| ACR 仓库 | `backend-service` |
| 镜像版本 | v2.2 → **v2.3** |
| 镜像地址 | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v2.3` |
| Digest | `sha256:6e25d13cc7e1b228638a30eda35bd4aa70e0f7d52283cf66a2ffb21bee4ea288` |
| 构建方式 | `tsc --noCheck` + Docker 多阶段构建 |
### 1.4 新增环境变量
| 环境变量 | 值 | 说明 |
|---------|---|------|
| `LEGACY_MYSQL_HOST` | `8.154.22.149` | 旧系统 ECS 服务器公网IP |
| `LEGACY_MYSQL_PORT` | `3306` | MySQL 端口 |
| `LEGACY_MYSQL_USER` | `root` | MySQL 用户名 |
| `LEGACY_MYSQL_DATABASE` | `xzyx_online` | 旧系统数据库名 |
### 1.5 SAE 应用配置
| 配置项 | 0227 部署 | 0228 部署 |
|-------|----------|----------|
| 应用名称 | `nodejs-backend-test` | `nodejs-backend-test` |
| 实例规格 | 2核4GB | 2核4GB |
| 容器端口 | 3001 | 3001 |
| 内网地址 | `172.17.197.28` | **`172.17.197.30`** |
| 镜像版本 | v2.2 | **v2.3** |
---
## 二、前端Nginx更新v1.8 → v1.9
### 2.1 主要变更
| 类别 | 变更内容 |
|------|---------|
| 新增模块 | Legacy System iframe 嵌入(研究管理 + 统计工具) |
| 新增组件 | `LegacySystemPage.tsx``ResearchManagement.tsx``StatisticalTools.tsx` |
| 路由更新 | `App.tsx` 注册 `/legacy/*` 路由 |
| 模块注册 | `moduleRegistry.ts` 更新研究管理/统计分析为 iframe embed 模式 |
### 2.2 旧系统嵌入架构
```
新系统前端 (React)
└─ <iframe src="token-bridge.html?token=xxx&redirect=/index.html">
└─ token-bridge.html (ECS 上,同源于 xunzhengyixue.com)
├─ 设置认证 Cookie (SameSite=None; Secure)
├─ 注入 CSS 隐藏导航栏/页脚
└─ <iframe src="/index.html"> (旧系统真实页面)
```
### 2.3 镜像信息
| 项目 | 值 |
|------|---|
| ACR 仓库 | `ai-clinical_frontend-nginx` |
| 镜像版本 | v1.8 → **v1.9** |
| 镜像地址 | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.9` |
| Digest | `sha256:ff3c19152f5f5944d4be187d7bc5af986fd00b69501effbd0d53a6f8b064228a` |
### 2.4 SAE 应用配置
| 配置项 | 0227 部署 | 0228 部署 |
|-------|----------|----------|
| 应用名称 | `frontend-nginx-service` | `frontend-nginx-service` |
| 实例规格 | 0.5核1GB | 0.5核1GB |
| 容器端口 | 80 | 80 |
| 内网地址 | `172.17.197.29` | **`172.17.197.31`** |
| 镜像版本 | v1.8 | **v1.9** |
| BACKEND_SERVICE_HOST | `172.17.197.28` | **`172.17.197.30`** |
---
## 三、环境变量联动更新
由于后端 IP 变更,前端环境变量需同步更新:
| 服务 | 环境变量 | 旧值 | 新值 |
|------|---------|------|------|
| frontend-nginx-service | `BACKEND_SERVICE_HOST` | `172.17.197.28` | `172.17.197.30` |
> **注意**CLB 负载均衡器由阿里云自动更新,无需手动操作。
---
## 四、当前系统配置速查
### 服务内网地址
```
R统计引擎: http://172.17.173.101:8080 (不变)
Python: http://172.17.173.102:8000 (不变)
后端: http://172.17.197.30:3001 (更新)
前端: http://172.17.197.31:80 (更新)
```
### ACR 镜像版本
| 仓库 | 版本 |
|------|-----|
| `ssa-r-statistics` | v1.0.1 |
| `python-extraction` | v1.2 |
| `backend-service` | **v2.3** |
| `ai-clinical_frontend-nginx` | **v1.9** |
### 公网访问
```
CLB: http://8.140.53.236/
域名: https://iit.xunzhengyixue.com/
```
---
> **文档版本**v1.0
> **最后更新**2026-02-28
> **维护人员**:开发团队