7.3 KiB
7.3 KiB
SSA-Pro 模块 Week 1 开发总结报告
版本: v1.0
日期: 2026-02-19
编写: AI 开发助手
状态: ✅ Week 1 完成
📋 目录
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 | ✅ 完成 | 分析执行 API,OSS 存储集成 |
| consult.routes.ts | ✅ 完成 | 咨询模式 API,LLM 网关集成 |
| 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 下载
理由:
- 符合平台 OSS 存储规范(密钥集中管控)
- R 服务无需持有敏感密钥
- 简化 R 代码复杂度
3.2 生产环境性能优化
问题: plumber.R 每次请求都 source() 工具脚本
解决方案:
# 生产环境:启动时预加载到 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
解决方案:
- 手动创建 SQL 文件
- 直接执行 SQL
- 使用
prisma migrate resolve --applied标记已应用
4.2 Docker 构建依赖问题
问题链:
zlib.h 缺失 → httpuv 编译失败
cmake 缺失 → nloptr 编译失败
ggplot2 版本冲突 → cowplot 安装失败
解决方案:
- 添加系统依赖:
zlib1g-dev,cmake,libnlopt-dev,gfortran - 放弃 renv,直接
install.packages()让 R 自动解决依赖
4.3 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-通用能力层清单.mddocs/04-开发规范/10-模块认证规范.mddocs/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 计划
- 完成模块注册 - 后端/前端路由注册
- 端到端测试 - 数据上传 → 计划生成 → 执行
- 配置中心实现 - DecisionTableLoader, RCodeLibraryService
- 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 开发总结完成。