Files

261 lines
7.3 KiB
Markdown
Raw Permalink 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.
# SSA-Pro 模块 Week 1 开发总结报告
> **版本:** v1.0
> **日期:** 2026-02-19
> **编写:** AI 开发助手
> **状态:** ✅ Week 1 完成
---
## 📋 目录
1. [开发目标](#1-开发目标)
2. [完成工作清单](#2-完成工作清单)
3. [关键决策与讨论](#3-关键决策与讨论)
4. [技术挑战与解决方案](#4-技术挑战与解决方案)
5. [代码审查与规范对齐](#5-代码审查与规范对齐)
6. [产出物清单](#6-产出物清单)
7. [遗留问题与后续工作](#7-遗留问题与后续工作)
---
## 1. 开发目标
Week 1 的核心目标是**搭建 SSA-Pro 模块的技术骨架**,包括:
- R 统计服务 Docker 环境
- 后端 SSA 模块结构
- 前端 SSA 模块结构
- 数据库 Schema 设计
---
## 2. 完成工作清单
### 2.1 R 统计服务 (r-statistics-service)
| 任务 | 状态 | 说明 |
|------|------|------|
| Dockerfile 编写 | ✅ 完成 | 基于 `rocker/r-ver:4.3`,包含完整系统依赖 |
| plumber.R API 入口 | ✅ 完成 | 健康检查、工具列表、技能执行 |
| data_loader.R | ✅ 完成 | 支持 inline 数据和预签名 URL |
| guardrails.R | ✅ 完成 | 正态性、方差齐性、样本量检验 |
| error_codes.R | ✅ 完成 | 友好错误映射 |
| result_formatter.R | ✅ 完成 | APA 格式化 |
| t_test_ind.R 示例工具 | ✅ 完成 | 独立样本 T 检验 |
| Docker 镜像构建 | ✅ 完成 | `ssa-r-statistics:1.0.1`1.81GB |
### 2.2 后端模块 (backend/src/modules/ssa)
| 任务 | 状态 | 说明 |
|------|------|------|
| 模块目录结构 | ✅ 完成 | 标准模块结构 |
| index.ts 入口 | ✅ 完成 | 使用 `authenticate` 中间件 |
| session.routes.ts | ✅ 完成 | 会话管理 API |
| analysis.routes.ts | ✅ 完成 | 分析执行 APIOSS 存储集成 |
| consult.routes.ts | ✅ 完成 | 咨询模式 APILLM 网关集成 |
| config.routes.ts | ✅ 完成 | 配置管理 API |
| RClientService.ts | ✅ 完成 | R 服务客户端,预签名 URL 支持 |
### 2.3 前端模块 (frontend-v2/src/modules/ssa)
| 任务 | 状态 | 说明 |
|------|------|------|
| 模块目录结构 | ✅ 完成 | 标准模块结构 |
| index.tsx 入口 | ✅ 完成 | 主布局组件 |
| useAnalysis.ts Hook | ✅ 完成 | 使用 apiClient 认证 |
| 组件骨架 | ✅ 完成 | DataUploader, PlanConfirm 等 |
### 2.4 数据库 Schema
| 任务 | 状态 | 说明 |
|------|------|------|
| Prisma Schema 定义 | ✅ 完成 | 9 个 SSA 相关模型 |
| Migration SQL | ✅ 完成 | 手动创建并应用 |
---
## 3. 关键决策与讨论
### 3.1 OSS 访问方案
**讨论背景:**
- 开发团队审查报告建议 R 服务实现 OSS 签名(`oss_signer.R`
- 这需要 R 服务持有 OSS 密钥
**最终决策:** ❌ 不采用 R 直接签名方案
**采用方案:** 预签名 URL
```
Node.js 生成预签名 URL → 传递给 R 服务 → R 直接 GET 下载
```
**理由:**
1. 符合平台 OSS 存储规范(密钥集中管控)
2. R 服务无需持有敏感密钥
3. 简化 R 代码复杂度
### 3.2 生产环境性能优化
**问题:** `plumber.R` 每次请求都 `source()` 工具脚本
**解决方案:**
```r
# 生产环境:启动时预加载到 TOOL_CACHE
if (!DEV_MODE) {
preload_tools() # 缓存 run_analysis 函数
}
```
### 3.3 安全加固
| 问题 | 解决方案 |
|------|----------|
| Docker Root 权限 | 添加 `USER appuser` |
| 路径遍历攻击 | `tool_code` 正则白名单 `^[A-Z][A-Z0-9_]*$` |
---
## 4. 技术挑战与解决方案
### 4.1 Prisma Migration Drift
**问题:** `prisma migrate dev` 检测到 drift要求 `migrate reset`
**解决方案:**
1. 手动创建 SQL 文件
2. 直接执行 SQL
3. 使用 `prisma migrate resolve --applied` 标记已应用
### 4.2 Docker 构建依赖问题
**问题链:**
```
zlib.h 缺失 → httpuv 编译失败
cmake 缺失 → nloptr 编译失败
ggplot2 版本冲突 → cowplot 安装失败
```
**解决方案:**
1. 添加系统依赖:`zlib1g-dev`, `cmake`, `libnlopt-dev`, `gfortran`
2. 放弃 renv直接 `install.packages()` 让 R 自动解决依赖
### 4.3 PowerShell 重定向问题
**问题:** `<` 操作符在 PowerShell 中被保留
**解决方案:**
```powershell
Get-Content "file.sql" | docker exec -i postgres psql ...
```
---
## 5. 代码审查与规范对齐
Week 1 后期进行了一次重要的**规范对齐审查**,确保新代码遵循平台规范。
### 5.1 发现的问题
| 文件 | 问题 | 修复 |
|------|------|------|
| `useAnalysis.ts` | 使用原生 fetch无认证 | 改用 `apiClient` |
| `ssa/index.ts` | 自定义 authenticate | 使用平台 `authenticate` 中间件 |
| `RClientService.ts` | 直接传 OSS key | 使用 `storage.getUrl()` 预签名 |
| `ConsultChat.tsx` | 自定义 Chat 组件 | 删除,使用平台 `AIStreamChat` |
| 各 routes | 手动获取 userId | 使用 `getUserId(request)` |
### 5.2 参考规范文档
- `docs/02-通用能力层/00-通用能力层清单.md`
- `docs/04-开发规范/10-模块认证规范.md`
- `docs/04-开发规范/11-OSS存储开发规范.md`
---
## 6. 产出物清单
### 6.1 代码文件
```
r-statistics-service/
├── Dockerfile # 生产就绪
├── docker-compose.yml # 本地开发
├── plumber.R # API 入口
├── utils/
│ ├── data_loader.R # 预签名 URL 方案
│ ├── guardrails.R # Block/Warn/Switch
│ ├── error_codes.R
│ └── result_formatter.R
├── tools/
│ └── t_test_ind.R # 示例工具
└── tests/fixtures/
└── normal_data.csv
backend/src/modules/ssa/
├── index.ts
├── routes/
│ ├── session.routes.ts
│ ├── analysis.routes.ts
│ ├── consult.routes.ts
│ └── config.routes.ts
├── executor/
│ └── RClientService.ts
└── types/
frontend-v2/src/modules/ssa/
├── index.tsx
├── components/
├── hooks/
│ └── useAnalysis.ts
└── types/
```
### 6.2 Docker 镜像
| 镜像名 | 版本 | 大小 | 状态 |
|--------|------|------|------|
| `ssa-r-statistics` | 1.0.1 | 1.81 GB | ✅ 本地构建成功 |
### 6.3 数据库 Schema
- `ssa_schema` 命名空间
- 9 个新表:`SsaSession`, `SsaMessage`, `SsaTool`, `SsaExecutionLog`
---
## 7. 遗留问题与后续工作
### 7.1 待完成任务
| 任务 | 优先级 | 说明 |
|------|--------|------|
| 后端主路由注册 | P0 | 将 SSA 路由加入 `index.ts` |
| 前端模块注册 | P0 | 加入 `moduleRegistry.ts` |
| T 检验数据格式调试 | P1 | JSON 转 data.frame 格式问题 |
| 配置中心 Excel 模板 | P1 | 决策表、参数映射等 |
### 7.2 Week 2 计划
1. **完成模块注册** - 后端/前端路由注册
2. **端到端测试** - 数据上传 → 计划生成 → 执行
3. **配置中心实现** - DecisionTableLoader, RCodeLibraryService
4. **Planner 引擎** - LLM 方法推荐逻辑
---
## 附录:关键文件变更记录
| 文件 | 变更类型 | 变更内容 |
|------|----------|----------|
| `data_loader.R` | 重构 | OSS 签名 → 预签名 URL |
| `plumber.R` | 增强 | 生产预加载 + tool_code 校验 |
| `Dockerfile` | 增强 | 非特权用户 + 健康检查 |
| `RClientService.ts` | 修复 | 使用 storage.getUrl() |
| `useAnalysis.ts` | 修复 | 使用 apiClient |
| `ssa/index.ts` | 修复 | 使用平台 authenticate |
---
**Week 1 开发总结完成。**