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