iconsulting/docs/implementation-plan-p0-p1-p...

197 lines
7.3 KiB
Markdown
Raw 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.

# 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 级别