Files
sino-mci/docs/testing/2026-07-15-send-routing-e2e-report.md

103 lines
4.7 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.

# 发送路由端到端验证报告
## 目标
通过 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 |