# 发送路由端到端验证报告

## 目标

通过 admin-web UI 走通「内部群 → WECOM_BOT → 发送 → 查询状态」完整链路，验证自动路由功能可用。

## 环境

- 工作目录：`/f/sino-mci`
- 后端：`mci-server` 运行在 `http://localhost:8080/msg-platform`，JDK 21
- 前端：`admin-web` 运行在 `http://localhost:5177`
- 基础设施：MySQL / Redis / RabbitMQ 通过远程 `192.168.1.173` 连接
- 登录账号：`superadmin` / `admin123`

## 测试数据

| 实体 | ID | 名称 / 标识 |
|-----|-----|-----------|
| WECOM_BOT 账号 | 759 | 测试内部群机器人 (test-bot-e2e-001) |
| 内部群 | 462 | E2E测试内部群 (roomid_manual_internal_e2e) |
| 发送任务 | SND8BC07E95AE1F471992A734ABDDFE223C | 测试消息 from e2e verification |

## 执行步骤与结果

### 1. 环境检查 ✅

- mci-server、admin-web、channel-service 均运行正常。
- admin-web 可访问地址：`http://localhost:5177/login`。
- 注意：`/msg-platform/login` 会被 Vite proxy 转发到后端，返回 500。

### 2. 创建 WECOM_BOT 账号 ✅

- 页面路由：`/channel/account`
- 创建账号类型「企微群机器人」，填写 webhook URL `https://httpbin.org/post`。
- **发现问题并修复**：UI 原先把 webhook URL 作为普通字符串写入 `ext_info`，而数据库列为 JSON 类型，导致 500。已修复 `ChannelAccount.vue`，将 URL 包装为 `{"webhook_url":"..."}`；同时 `SendService` 增加 `extractWeComBotWebhookUrl()` 从 JSON 中提取 URL，兼容旧版纯字符串。
- 截图：`admin-web/screenshots/02-bot-created.png`

### 3. 创建内部群 ✅

- 页面路由：`/customer/group`
- 创建群聊，场景选择「内部群」，负责人选择 WECOM_BOT 账号 759。
- 截图：`admin-web/screenshots/04-internal-group-created.png`

### 4. 绑定 WECOM_BOT 账号 ✅

- 在会话详情抽屉中点击「绑定账号」，选择 WECOM_BOT 账号 759 作为主发送账号。
- API 返回 `{"code":0,"message":"ok"}`。
- 截图：`admin-web/screenshots/05-bot-bound.png`

### 5. 发送测试消息 ✅

- 页面路由：`/message/test`
- 目标类型选择「会话」，选择内部群 462。
- 内容：`测试消息 from e2e verification`
- 发送接口返回：
  ```json
  {"taskId":"SND8BC07E95AE1F471992A734ABDDFE223C","totalCount":1,"status":"accepted"}
  ```
- 后端日志确认消息被路由到 `WeComBotSender` 并调用 webhook。
- 外部 webhook `httpbin.org/post` 返回 503，导致实际投递失败（预期内，用于验证链路）。
- 截图：`admin-web/screenshots/06-message-test.jpeg`、`admin-web/screenshots/07-message-sent.png`

### 6. 查询任务状态 ✅

- 页面路由：`/message/send-record`
- 任务状态接口返回：
  ```json
  {"total":1,"pendingCount":0,"sendingCount":0,"successCount":0,"failedCount":1}
  ```
- 发送记录明细：`accountId=759`，`channelType=wecom`，`sendStatus=3`（失败），`channelResult` 指向「企微群机器人发送失败，HTTP 状态: 503」。
- 截图：`admin-web/screenshots/08-task-status.png`

## 结论

**发送路由自动选择功能验证通过。**

- 内部群聊正确路由到 `WECOM_BOT` 账号。
- 异步发送立即返回 `taskId`，任务状态查询正确反映失败计数。
- 失败原因与外部 webhook 端点相关，不是路由或代码问题。

## 修复的代码

| 文件 | 修复内容 |
|-----|---------|
| `admin-web/src/views/ChannelAccount.vue` | WECOM_BOT 创建/编辑时把 webhook URL 包装为 JSON；抽屉回显时解析 JSON |
| `backend/mci-server/src/main/java/com/sino/mci/send/service/SendService.java` | 新增 `extractWeComBotWebhookUrl()`，从 JSON `ext_info` 中提取 `webhook_url`，兼容旧版纯字符串 |

## 发现但未修复的问题

1. **admin-web 路由与计划不一致**：实际路由为 `/channel/account`、`/customer/group`、`/message/test`、`/message/send-record`，而不是任务计划中假设的 `/channel-account`、`/conversation`、`/message-test`。已在本次验证后更新相关文档。
2. **发送记录分页 `total` 字段不一致**：`GET /api/v1/send/records?taskId=...` 返回 `total: 0` 但 `records` 数组包含 1 条记录。属于前端分页展示小问题，不影响状态核对。

## 截图索引

| 截图 | 说明 |
|-----|------|
| `admin-web/screenshots/02-bot-created.png` | WECOM_BOT 账号创建成功 |
| `admin-web/screenshots/04-internal-group-created.png` | 内部群创建成功 |
| `admin-web/screenshots/05-bot-bound.png` | WECOM_BOT 绑定到内部群 |
| `admin-web/screenshots/06-message-test.jpeg` | 消息测试页面 |
| `admin-web/screenshots/07-message-sent.png` | 消息发送成功，返回 taskId |
| `admin-web/screenshots/08-task-status.png` | 任务状态显示 failed=1 |
