Files
AIclinicalresearch/docs/03-业务模块/SSA-智能统计分析/06-开发记录/2026-02-19-端到端测试与Bug修复.md

6.9 KiB
Raw Permalink Blame History

SSA-Pro 2026-02-19 开发总结

版本: v1.0
日期: 2026-02-19
编写: AI 开发助手
状态: T 检验端到端测试通过


1. 开发目标

本日核心目标是完成 T 检验端到端测试,并修复测试过程中发现的所有问题。


2. 完成工作清单

2.1 前端模块注册与激活

任务 状态 说明
模块注册 完成 moduleRegistry.tsplaceholder: false
用户会话隔离 修复 组件挂载时重置 Zustand store
代码下载文件名 修复 Content-Disposition header 提取真实文件名

2.2 后端 Bug 修复

任务 状态 说明
R 服务错误响应处理 修复 检查 status: error,返回 422 + user_hint
变量智能匹配 修复 优先使用用户查询中提到的变量
代码下载 API 增强 动态生成文件名:{toolName}_{dataName}_{MMDD}_{HHmm}.R

2.3 DataParserService 优化

任务 状态 说明
类型推断优化 完成 0/1 数字列识别为分类变量
规则优先级 完成 唯一值 ≤3 或比例 <20% → categorical

2.4 R 服务 Bug 修复

任务 状态 说明
缺失值处理 修复 分析前自动过滤 NA/空字符串
数据清洗日志 新增 记录移除的缺失值行数

3. 关键 Bug 修复详情

3.1 分组变量识别为 3 组问题

问题描述:

  • 用户数据 smoke 列有值 1、2 和缺失值
  • R 服务将缺失值算作第 3 组
  • T 检验要求恰好 2 组,返回错误

修复方案:

# r-statistics-service/tools/t_test_ind.R
# 数据清洗:移除分组变量或数值变量中的缺失值
df <- df[!is.na(df[[group_var]]) & trimws(as.character(df[[group_var]])) != "", ]
df <- df[!is.na(df[[value_var]]), ]

影响:

  • R 服务自动过滤缺失值
  • 日志记录:数据清洗: 移除 7 行缺失值 (剩余 304 行)

3.2 类型推断错误0/1 列识别为 numeric

问题描述:

  • smoke 列是 0/1 或 1/2 数字
  • DataParserService 将其识别为 numeric 而非 categorical
  • 导致变量匹配逻辑找不到分类变量

修复方案:

// backend/src/modules/ssa/services/DataParserService.ts
// 规则1唯一值很少<=10且比例很低<20%)→ 分类变量
if (uniqueCount <= 10 && uniqueRatio < 0.2) {
  return 'categorical';
}
// 规则2即使是数字如果唯一值只有2-3个也视为分类变量
if (uniqueCount <= 3) {
  return 'categorical';
}

3.3 R 服务错误信息未传递给前端

问题描述:

  • R 服务返回 status: errormessage
  • 后端仍返回 200 OK前端无法显示错误原因
  • 用户只看到"执行失败"

修复方案:

// backend/src/modules/ssa/routes/analysis.routes.ts
if (result?.status === 'error') {
  return reply.status(422).send({
    status: 'error',
    error: result.message || '分析执行失败',
    user_hint: result.user_hint || result.message
  });
}
// frontend-v2/src/modules/ssa/hooks/useAnalysis.ts
const errorData = error.response?.data;
const errorMessage = errorData?.user_hint || errorData?.error || '执行出错';
setError(errorMessage);

3.4 下载代码文件名硬编码

问题描述:

  • 前端硬编码文件名:analysis_${sessionId}.R
  • 后端 Content-Disposition header 中的动态文件名被忽略

修复方案:

// frontend-v2/src/modules/ssa/hooks/useAnalysis.ts
const downloadCode = useCallback(async (): Promise<DownloadResult> => {
  const response = await apiClient.get(...);
  const contentDisposition = response.headers['content-disposition'];
  let filename = `analysis_${currentSession.id}.R`;
  if (contentDisposition) {
    const match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
    if (match) {
      filename = decodeURIComponent(match[1].replace(/['"]/g, ''));
    }
  }
  return { blob: response.data, filename };
}, [currentSession]);

3.5 用户会话隔离问题

问题描述:

  • 不同用户登录后看到相同的 session 数据
  • Zustand store 在页面切换时未重置

修复方案:

// frontend-v2/src/modules/ssa/index.tsx
useEffect(() => {
  reset();  // 组件挂载时重置 store
}, [reset]);

4. 测试验证结果

4.1 R 服务直接调用测试

// 请求
POST http://localhost:8082/api/v1/skills/ST_T_TEST_IND
{
  "data_source": { "type": "oss", "oss_url": "..." },
  "params": { "group_var": "smoke", "value_var": "age" }
}

// 响应
{
  "status": "success",
  "message": "分析完成",
  "results": {
    "method": "Welch Two Sample t-test",
    "statistic": 0.8812,
    "df": 197.5738,
    "p_value": 0.3793,
    ...
  },
  "plots": ["data:image/png;base64,..."],
  "trace_log": [
    "数据清洗: 移除 7 行缺失值 (剩余 304 行)",
    ...
  ],
  "reproducible_code": "# SSA-Pro 自动生成代码..."
}

4.2 端到端测试流程

步骤 状态 说明
1. 上传数据 通过 CSV 文件上传到 OSS
2. 数据解析 通过 Schema 正确识别变量类型
3. 生成计划 通过 正确匹配 smoke(分类) + age(数值)
4. 执行分析 通过 R 服务返回完整结果
5. 结果展示 通过 统计结果 + 图表 + 代码
6. 代码下载 通过 动态文件名生效

5. 代码变更清单

文件 变更类型 说明
r-statistics-service/tools/t_test_ind.R 增强 缺失值自动过滤
backend/src/modules/ssa/services/DataParserService.ts 增强 类型推断优化
backend/src/modules/ssa/routes/analysis.routes.ts 修复 R 错误响应处理 + 动态文件名
frontend-v2/src/modules/ssa/hooks/useAnalysis.ts 修复 错误信息提取 + 文件名获取
frontend-v2/src/modules/ssa/index.tsx 修复 用户会话隔离
frontend-v2/src/framework/modules/moduleRegistry.ts 更新 激活 SSA 模块

6. MVP 进度更新

Phase 任务数 已完成 进度
Phase 1 49 38 78%
Phase 2 31 0 0%
Phase 3 26 0 0%
总计 106 38 36%

7. 遗留问题与后续工作

7.1 待完成任务Phase 1

任务 优先级 说明
配置中台DecisionTableLoader 四维匹配逻辑
配置中台RCodeLibraryService 脚本上传/版本管理
DataParserService 隐私保护 稀有值 < 5 隐藏
安装 json-repair + zod LLM 输出容错

7.2 下一步计划

  1. 进入 Phase 2 - 实现更多统计方法ANOVA、卡方检验等
  2. 或完善 Phase 1 - 配置中台基础功能

2026-02-19 开发总结完成。