# iConsulting Agent 能力扩展 — P0/P1/P2 实施计划

> 生成日期: 2026-02-07
> 目标：将 iConsulting 从纯咨询 Agent 升级为具备完整业务闭环的智能助手

---

## 当前状态总结

### 已实现 ✅
- 多 Agent 协调架构 (Coordinator + 6 specialists)
- 16 个工具 (knowledge search, assessment, memory, web search, etc.)
- 支付工具 `generate_payment` 已定义但返回 MOCK 数据
- payment-service 已有完整的 Order/Payment/Adapter 架构（Alipay/WeChat/Stripe adapter 为 mock）
- WebSocket 已 emit `tool_call` 和 `tool_result` 事件
- 前端 `ToolCallResult` 组件已识别 `generate_payment` 但只显示占位符

### 缺失 ❌
- conversation-service 没有调用 payment-service 的 HTTP 客户端
- 没有 `check_payment_status` 工具（Agent 无法查询支付状态）
- 没有 `query_order_history` 工具（Agent 无法查询用户订单历史）
- 前端没有安装 `qrcode.react`，无法渲染真实二维码
- 前端 `tool_call`/`tool_result` WebSocket 事件只 console.log，未处理到消息 metadata
- 没有发票生成能力
- 没有前端交互式表单（chat 内嵌表单收集信息）

---

## P0 — 支付闭环（Payment Closure）

### 目标
Agent 能真正生成支付订单 → 返回支付二维码 → 前端渲染二维码 → Agent 能查询支付状态 → Agent 能查询订单历史

### 步骤

#### P0-1: PaymentClientService
**新建** `conversation-service/src/infrastructure/payment/payment-client.service.ts`

- 模仿 `KnowledgeClientService` 的 HTTP 客户端模式（使用 native `fetch`）
- `PAYMENT_SERVICE_URL` 从 ConfigService 读取，默认 `http://payment-service:3002`
- 方法:
  - `createOrder(params: { userId, serviceType, serviceCategory?, conversationId? })` → 调用 `POST /orders`
  - `createPayment(params: { orderId, method })` → 调用 `POST /payments`
  - `checkPaymentStatus(paymentId: string)` → 调用 `GET /payments/:id/status`
  - `getOrderStatus(orderId: string)` → 调用 `GET /orders/:id/status`
  - `getUserOrders(userId: string)` → 调用 `GET /orders` (header: x-user-id)

**新建** `conversation-service/src/infrastructure/payment/payment.module.ts`
- 提供 `PaymentClientService`，导出供 `AgentsModule` 使用

**修改** `agents.module.ts`
- 导入 `PaymentModule`
- `ImmigrationToolsService` 构造函数注入 `PaymentClientService`

#### P0-2: 重写 generate_payment 工具
**修改** `immigration-tools.service.ts` 的 `generatePayment()` 方法

流程:
1. 调用 `paymentClient.createOrder(...)` 创建订单
2. 调用 `paymentClient.createPayment({ orderId, method })` 生成支付
3. 返回真实的 `{ orderId, paymentId, qrCodeUrl, amount, expiresAt }`
4. 删除 MOCK 数据

#### P0-3: 添加 check_payment_status 工具
**修改** `immigration-tools.service.ts`:
- 添加工具定义: `check_payment_status`，输入 `{ orderId }`
- 添加实现: 调用 `paymentClient.getOrderStatus(orderId)` 返回状态

**修改** `coordinator-tools.ts`:
- 在 `DIRECT_TOOLS` 中添加 `check_payment_status` 工具定义
- 在 `TOOL_CONCURRENCY_MAP` 中标记为 `true`（只读）

#### P0-4: 添加 query_order_history 工具
**修改** `immigration-tools.service.ts`:
- 添加工具定义: `query_order_history`，输入 `{ userId }`
- 添加实现: 调用 `paymentClient.getUserOrders(userId)` 返回订单列表

**修改** `coordinator-tools.ts`:
- 在 `DIRECT_TOOLS` 中添加 `query_order_history` 工具定义
- 在 `TOOL_CONCURRENCY_MAP` 中标记为 `true`（只读）

#### P0-5: 前端 QR 码渲染
**安装** `qrcode.react` 到 web-client

**修改** `MessageBubble.tsx` 的 `ToolCallResult` 组件:
- 导入 `QRCodeSVG` from `qrcode.react`
- `generate_payment` 结果中，使用 `<QRCodeSVG value={qrCodeUrl} />` 渲染真实二维码
- 添加 `check_payment_status` 结果的渲染（状态卡片）
- 添加 `query_order_history` 结果的渲染（订单列表卡片）

#### P0-6: 处理 tool_call/tool_result WebSocket 事件
**修改** `useChat.ts`:
- `tool_call` 事件: 存储到临时状态（当前消息正在执行的工具调用）
- `tool_result` 事件: 将结果收集到 pending toolCalls 数组
- `stream_end` 事件: 将收集的 toolCalls 注入消息 metadata

---

## P1 — 信息收集 UX 增强

### 目标
Agent 能在聊天中展示结构化的评估结果卡片，用户能直观看到评分和建议

### 步骤

#### P1-1: 评估结果卡片组件
**新建** `web-client/src/features/chat/presentation/components/AssessmentResultCard.tsx`

- 针对 `collect_assessment_info` 和 `invoke_assessment_expert` 的工具结果
- 展示：评估类别、各项得分、总分、建议
- 使用现有 Tailwind 样式
- 分数条形图（纯 CSS，不需要 recharts）

#### P1-2: 在 ToolCallResult 中集成
**修改** `MessageBubble.tsx`:
- 识别 `collect_assessment_info` 工具结果，渲染 `AssessmentResultCard`
- 识别评估相关结果，渲染评分卡片

---

## P2 — 财务合规

### 目标
Agent 能查询用户交易记录，支持退款处理（为未来发票功能预留接口）

### 步骤

#### P2-1: 交易历史查询增强
**修改** `PaymentClientService`:
- 添加 `getOrderDetail(orderId)` → 获取含支付详情的完整订单

**修改** `immigration-tools.service.ts`:
- `query_order_history` 工具返回更丰富的信息（支付时间、状态、金额明细）

#### P2-2: 退款处理工具
**修改** `PaymentClientService`:
- 添加 `requestRefund(orderId, reason)` → 调用 payment-service 退款 API

**修改** `immigration-tools.service.ts`:
- 添加 `request_refund` 工具定义和实现
- 安全限制：需要确认对话 + 订单在可退款时间窗口内

**修改** `coordinator-tools.ts`:
- 添加 `request_refund` 工具定义
- `TOOL_CONCURRENCY_MAP` 中标记为 `false`（有副作用）

#### P2-3: 前端交易记录展示
**修改** `MessageBubble.tsx`:
- 增强 `query_order_history` 的渲染：显示支付方式图标、退款状态
- 添加 `request_refund` 结果渲染

---

## 文件变更清单

### P0 新建文件 (2)
| 文件 | 说明 |
|------|------|
| `infrastructure/payment/payment-client.service.ts` | Payment-service HTTP 客户端 |
| `infrastructure/payment/payment.module.ts` | Payment 模块 |

### P0 修改文件 (5)
| 文件 | 改动 |
|------|------|
| `agents/agents.module.ts` | +PaymentModule import |
| `claude/tools/immigration-tools.service.ts` | +PaymentClientService 注入, 重写 generatePayment, +2 新工具 |
| `agents/tools/coordinator-tools.ts` | +2 新工具定义, +concurrency map |
| `web-client/.../MessageBubble.tsx` | +QRCodeSVG, +3 工具结果渲染 |
| `web-client/.../useChat.ts` | +tool_call/tool_result 事件处理 |

### P1 新建文件 (1)
| 文件 | 说明 |
|------|------|
| `web-client/.../AssessmentResultCard.tsx` | 评估结果卡片组件 |

### P1 修改文件 (1)
| 文件 | 改动 |
|------|------|
| `web-client/.../MessageBubble.tsx` | +评估结果卡片渲染 |

### P2 修改文件 (3)
| 文件 | 改动 |
|------|------|
| `infrastructure/payment/payment-client.service.ts` | +getOrderDetail, +requestRefund |
| `claude/tools/immigration-tools.service.ts` | +request_refund 工具 |
| `agents/tools/coordinator-tools.ts` | +request_refund 定义 |

---

## 验证计划

每个 P 级别完成后:
1. `pnpm build` — conversation-service 和 web-client 均编译通过
2. 详细 commit 备注说明改动内容
3. `git push` 推送到 remote
4. 进入下一个 P 级别
