# SSA-Pro 前端 UI 改进计划 - 审查回应
> **回应日期:** 2026-02-20
> **回应人:** SSA 开发团队
> **审查文档:** SSA-Pro 前端 UI 改进计划审查报告.md
> **原计划文档:** 05-前端UI改进开发计划-V8双屏版.md
---
## 📋 总体评价
感谢审查团队的细致审核,总体评价 **A-** 及三个亮点(组件复用、职责拆分、Zustand 状态管理)的肯定,我们深感认可。
以下是对 5 个盲区的逐条回应:
---
## 盲区一:流式输出与右侧面板的"精准握手"
### 审查意见
> AI 正在打字输出时,右侧应该立刻切换到 SAPViewer,建议采用"特定标记解析"或"Tool Calling"机制。
### 回应:✅ 认可,补充到计划
**我们的方案**:采用 **Artifact 标记解析** 机制
```typescript
// AI 输出流中嵌入结构化标记
"我已为您生成分析方案:"
// useAIStream Hook 中增加解析逻辑
const handleChunk = (chunk: string) => {
const artifactMatch = chunk.match(//);
if (artifactMatch) {
const [_, type, id] = artifactMatch;
ssaStore.setActivePane(type as 'sap' | 'execution' | 'result');
ssaStore.loadArtifact(type, id);
}
};
```
**已有能力支撑**:
- `useAIStream` Hook 已支持流式解析(见 `shared/components/Chat/hooks/useAIStream.ts`)
- 后端 `StreamingService` 已支持 OpenAI Compatible 格式
**计划更新**:在 Day 2 任务中新增"流式标记解析器"开发(预计 2h)
---
## 盲区二:历史记录回溯的"状态水合"
### 审查意见
> 用户点击历史记录时,右侧要瞬间恢复到当时最终的 ResultViewer 状态。
### 回应:✅ 部分认可,MVP 简化处理
**MVP 方案**:
| 步骤 | 处理方式 |
|------|---------|
| 1. 用户点击历史 | 左侧加载聊天记录 |
| 2. 右侧初始状态 | 显示 `empty`(空状态) |
| 3. 自动恢复 | 根据 session 数据判断最终状态,自动切换 |
**Store 扩展**:
```typescript
// ssaStore.ts 新增
hydrateFromHistory: (session: SSASession) => {
// 根据 session 状态恢复右侧面板
if (session.executionResult) {
set({ activePane: 'result', currentArtifact: { type: 'result', data: session.executionResult } });
} else if (session.currentPlan) {
set({ activePane: 'sap', currentArtifact: { type: 'sap', data: session.currentPlan } });
} else {
set({ activePane: 'empty', currentArtifact: null });
}
}
```
**后端配合**:现有 `GET /api/v1/ssa/sessions/:id` 已返回完整 session 数据(含 plan、result),无需修改。
**计划更新**:在 Store 设计章节补充 `hydrateFromHistory` action。
---
## 盲区三:响应式降级策略
### 审查意见
> 小屏幕(<1024px)双屏会拥挤,建议降级为抽屉或模态框。
### 回应:✅ 认可,但延后至 Phase 2
**理由**:
1. V8 原型图明确定位 **PC 端宽屏**(1280px+)
2. 目标用户为医院研究人员,主要使用 PC 办公
3. MVP 聚焦核心体验,响应式作为增强功能
**Phase 2 降级方案**(预留设计):
```css
/* 小屏幕降级:右侧变为全屏 Drawer */
@media (max-width: 1024px) {
.ssa-workspace {
/* 隐藏右侧面板 */
.artifact-pane { display: none; }
/* 左侧全宽 */
.chat-pane { width: 100%; }
}
/* 结果以 Drawer 形式弹出 */
.artifact-drawer {
position: fixed;
right: 0;
width: 90vw;
height: 100vh;
}
}
```
**计划更新**:在"风险与应对"章节注明响应式降级作为 Phase 2 任务。
---
## 盲区四:ExecutionViewer 的动态数据流机制
### 审查意见
> 未说明 ExecutionViewer 数据是轮询还是 SSE,建议明确技术方案。
### 回应:⚠️ 审查者对现有能力不了解
**现有能力**:
| 能力 | 位置 | 状态 |
|------|------|------|
| **useAIStream Hook** | `shared/components/Chat/hooks/useAIStream.ts` | ✅ 已实现 |
| **StreamingService** | `backend/src/common/streaming/` | ✅ 已实现 |
| **traceSteps 状态管理** | `ssaStore.ts` 第 32-35 行 | ✅ 已实现 |
```typescript
// 现有 ssaStore.ts
setTraceSteps: (steps: TraceStep[]) => void;
updateTraceStep: (index: number, step: Partial) => void;
```
**SSA 执行日志的技术路径**:
| 方案 | 说明 | MVP 采用 |
|------|------|---------|
| **方案 A** | 对话流内嵌执行状态(复用 useAIStream) | ✅ 推荐 |
| **方案 B** | 独立 SSE 端点 | Phase 2 |
| **方案 C** | 同步返回 + 伪进度 | 备选 |
**推荐方案 A 示例**:
```
// AI 对话流中输出执行状态
data: {"choices":[{"delta":{"content":"🔍 正在检验正态性..."}}]}
data: {"choices":[{"delta":{"content":"✅ Shapiro-Wilk p=0.32,符合正态分布"}}]}
data: {"choices":[{"delta":{"content":"📊 正在执行独立样本 T 检验..."}}]}
data: {"choices":[{"delta":{"content":""}}]}
```
**无需额外开发**:直接复用 `AIStreamChat` 组件,后端调整输出格式即可。
**计划更新**:在技术方案章节补充"执行日志数据流"说明。
---
## 盲区五:前端数据 Schema 解析前置
### 审查意见
> 建议前端用 papaparse 提取表头,拼接到 Prompt 发送给 Planner。
### 回应:❌ 不采纳,违背隐私架构
**SSA 隐私保护架构**(核心设计原则):
```
真实数据绝不传给 LLM,只传脱敏后的 Schema
```
**正确的数据流**:
```
┌─────────┐ 完整文件 ┌─────────┐ 脱敏 Schema ┌─────────┐
│ 前端 │ ───────────────→ │ 后端 │ ───────────────→ │ LLM │
└─────────┘ └─────────┘ └─────────┘
↑
DataParserService
├── 隐藏稀有值 (<5)
├── 模糊 Min/Max (N<10)
└── 脱敏处理
```
**如果前端解析 Schema 会发生什么**:
| 风险 | 说明 |
|------|------|
| 绕过隐私保护 | 原始 Schema 可能包含敏感分类值 |
| 脱敏逻辑分散 | 后端已有 `DataParserService`,前端重复实现 |
| 架构不一致 | 违背"后端统一控制"原则 |
**现有后端实现**:
```typescript
// backend/src/modules/ssa/services/DataParserService.ts
// 已实现:
// - 表头解析
// - 稀有值隐藏(<5)
// - Min/Max 模糊(N<10)
// - 脱敏 Schema 返回
```
**结论**:保持现有设计,不在前端解析 Schema。
---
## 📝 计划更新汇总
| 盲区 | 处理方式 | 计划更新内容 |
|------|---------|-------------|
| **盲区一** | ✅ 采纳 | Day 2 新增"流式标记解析器"任务 |
| **盲区二** | ✅ 部分采纳 | Store 设计章节补充 `hydrateFromHistory` |
| **盲区三** | ⏸️ 延后 | 风险章节注明 Phase 2 处理 |
| **盲区四** | 📝 澄清 | 技术方案章节补充执行日志数据流说明 |
| **盲区五** | ❌ 不采纳 | 无需修改,保持后端 Schema 解析 |
---
## 🎯 最终结论
1. **计划总体方向正确**,审查团队的 A- 评分符合实际
2. **盲区一、二、三** 的建议有价值,已纳入计划或延后处理
3. **盲区四** 审查者对现有 SSE 能力不了解,已澄清技术路径
4. **盲区五** 建议违背隐私架构设计,不予采纳
**准予启动开发!** 🚀
---
**回应人:** SSA 开发团队
**日期:** 2026-02-20