14 KiB
14 KiB
GoChat vs Chatwoot 实现差距报告 & 优化计划
生成时间: 2026-06-03
作者: Hermes Agent
版本: v1.0
1. 项目概览
| 项目 | GoChat (Go) | Chatwoot (Ruby on Rails) |
|---|---|---|
| 语言/框架 | Go + Gin | Ruby on Rails |
| 数据库 | PostgreSQL | PostgreSQL |
| 实时通讯 | WebSocket (gorilla) | ActionCable |
| 搜索 | pgvector (stub) | Elasticsearch |
| IMAP | goimap_stub | Mail imap |
| 全项目文件 | 635 Go + 272 test | 722 Ruby |
架构层
| 层 | GoChat | Chatwoot | 差距 |
|---|---|---|---|
| Controller/Handler | 129 | 177 | 48 |
| Model | 104 (158含测试) | 103 | 0 |
| Service | 105 | 197 | 92 |
| Repository | 95 | ~100 (Rails无独立repo层) | - |
| Middleware | 19 | ~50 (concern) | - |
| Channel Provider | 73 | ~20 | - |
| 其他模块 | 14(auto)+ 16(automation)+ 6(campaign)+ 3(canned)+ 3(csat)+ 5(reporting)+ 4(search)+ 6(security)+ 8(ws)+ 3(pubsub) | - | - |
| 总模块目录 | 27个 | ~10 | 17差距 |
路由统计
| 指标 | GoChat | Chatwoot | 备注 |
|---|---|---|---|
| 总 HTTP 路由 | 653 | 539 | GoChat含额外路由 |
| Account-scoped 资源 | 67个 | 68个 | 基本持平 |
| 非 Account 路由 | 48条 | ~70条 | auth/profile/notification/sso等 |
| Platform 路由 | 25条 | 15条 | GoChat含更多platform路由 |
| Widget 路由 | 8条 | 10条 | 接近持平 |
| 路由参数名冲突 | 已修复5个 | 0 | ✅ |
| 路由重复注册 | 已修复2个 | 0 | ✅ |
| 参数名标准化后匹配 | 101条 | 101条 | 覆盖率18.7% |
API方法分布
| 方法 | GoChat | Chatwoot | 差距 |
|---|---|---|---|
| GET | 262 | 216 | +46 |
| POST | 205 | 178 | +27 |
| DELETE | 96 | 76 | +20 |
| PUT | 57 | 1 | +56 |
| PATCH | 29 | 68 | -39 |
关键发现: GoChat PATCH路由严重不足(29 vs 68),说明部分更新逻辑用了PUT替代或完全缺失。Chatwoot大量使用PATCH做字段级更新,GoChat需补齐39条PATCH路由。
2. 核心差距分析 (资源级对比)
P0 核心缺失 — 影响基础使用流程的必要资源
| 资源 | 状态 | 影响 |
|---|---|---|
| assignable_agents | ❌ 完全缺失 | 工单分配核心功能 |
| inbox_members | ❌ 完全缺失 | 收件箱成员管理 |
| inbox_limits | ❌ 完全缺失 | 收件箱容量限制 |
| notes | ❌ 完全缺失 | 对话备注功能 |
| draft_messages | ❌ 完全缺失 | 消息草稿箱 |
| delivery_status | ❌ 完全缺失 | 消息投递状态追踪 |
| custom_attribute_definitions | ⚠️ 部分实现 | 自定义属性定义 |
| contact_merge | ⚠️ 仅service | 联系人合并 |
| csat_template | ❌ 完全缺失 | CSAT模板管理 |
| csat_survey_responses | ⚠️ handler存在但service薄弱 | CSAT调查响应 |
| hooks | ⚠️ 仅webhook handler | 集成Hook管理 |
| notification_subscriptions | ⚠️ 仅部分路由 | 通知订阅管理 |
| participants | ⚠️ 仅部分实现 | 对话参与者管理 |
| account_users | ⚠️ 仅路由 | 账户用户管理 |
| access_tokens | ❌ 完全缺失 | 平台访问令牌 |
P1 重要缺失 — 企业级/高级功能
| 资源 | 状态 | 影响 |
|---|---|---|
| agents | ⚠️ 仅index/create | 代理人CRUD+批量操作 |
| assignments | ❌ 完全缺失 | 对话分配记录 |
| custom_roles | ⚠️ 仅CRUD路由 | 自定义角色权限 |
| sla_policies | ⚠️ 仅CRUD路由 | SLA策略管理 |
| applied_slas | ⚠️ 仅GET路由 | SLA应用追踪 |
| dashboard_apps | ⚠️ 仅CRUD路由 | 仪表盘应用 |
| macros | ⚠️ 路由存在但service薄弱 | 宏操作 |
| mfa | ❌ 完全缺失 | 多因素认证 |
| apps | ❌ 完全缺失 | 平台应用 |
| installation_configs | ❌ 完全缺失 | 安装配置 |
| agent_capacity_policies | ⚠️ 仅路由 | 代理人容量策略 |
P2 二级缺失 — 集成/扩展/边缘功能
| 资源 | 状态 | 影响 |
|---|---|---|
| captain/assistants | ⚠️ 仅部分路由 | AI助手(Captain) |
| captain/copilot_threads | ⚠️ 仅路由 | AI Copilot线程 |
| captain/custom_tools | ⚠️ 仅路由 | AI自定义工具 |
| captain/documents | ⚠️ 仅路由 | AI文档管理 |
| captain/scenarios | ⚠️ 仅路由 | AI场景 |
| captain/assistant_responses | ⚠️ 仅路由 | AI助手响应 |
| categories/articles | ⚠️ 仅CRUD路由 | 知识库分类/文章 |
| conference | ❌ 完全缺失 | 视频会议(Dyte) |
| team_members | ❌ 完全缺失 | 团队成员管理 |
| events | ❌ 完全缺失 | 事件追踪 |
| callback | ⚠️ 仅路由 | 回调管理 |
| whatsapp_calls | ❌ 完全缺失 | WhatsApp通话 |
| notification_settings | ⚠️ 仅路由 | 通知设置 |
3. Service层差距 (关键缺失)
| Service | GoChat | Chatwoot | 缺失 |
|---|---|---|---|
| AssignableAgentService | ❌ | ✅ autoassignment模块扩展 | 缺少round-robin/负载均衡/技能匹配 |
| InboxMemberService | ❌ | ✅ | 缺少CRUD+批量操作 |
| InboxLimitService | ❌ | ✅ | 缺少容量检查+限制逻辑 |
| NoteService | ❌ | ✅ | 缺少CRUD |
| DraftMessageService | ❌ | ✅ | 缺少CRUD+发送逻辑 |
| DeliveryStatusService | ❌ | ✅ | 缺少状态追踪+更新 |
| CsatTemplateService | ❌ | ✅ | 缺少模板管理 |
| HookService | ❌ | ✅ | 缺少CRUD+事件分发 |
| AssignmentService | ❌ | ✅ | 缺少分配记录 |
| MfaService | ❌ | ✅ | 缺少启用/禁用/验证 |
| PlatformAppService | ⚠️ stub | ✅ | 需完整实现 |
| AgentCapacityPolicyService | ⚠️ stub | ✅ | 需完整实现 |
| CustomRoleService | ⚠️ stub | ✅ | 需完整实现 |
| SlaPolicyService | ⚠️ stub | ✅ | 需完整实现 |
| MacroExecutionService | ❌ | ✅ | 缺少执行引擎 |
| DashboardAppService | ⚠️ stub | ✅ | 需完整实现 |
| AppliedSlaService | ❌ | ✅ | 缺少SLA追踪 |
| SlaPolicyAssignmentService | ❌ | ✅ | 缺少策略分配 |
Service层总计: GoChat 105 vs Chatwoot 197, 缺失92个service
4. 业务逻辑对齐差距 (即使路由和service存在,逻辑也可能不匹配Chatwoot)
| 功能 | GoChat | Chatwoot | 差距类型 |
|---|---|---|---|
| 对话自动分配 | autoassignment模块(6文件)+5个service | AutoAssignmentService+round-robin/负载均衡/技能匹配 | 逻辑简化,缺少round-robin/负载均衡 |
| 对话创建 | 基础CRUD+3个service | ConversationService+contact_inboxes/label批量操作 | 缺少contact_inboxes/label批量操作 |
| 对话搜索 | ConversationFinder(7种过滤器) | ConversationFinder(7种过滤器+排序+分页) | 缺少排序和分页 |
| 联系人搜索 | ContactFinder(2种过滤器) | ContactFinder(6种过滤器+排序+分页) | 缺少4种过滤器+排序+分页 |
| 消息发送 | 渠道差异化发送逻辑 | MessageSenderService+渠道差异化 | 需逐渠道对齐发送细节 |
| CSAT收集 | CsatSurveyResponseService | CsatSurveyResponseService+CsatTemplateService | 缺少CsatTemplateService(模板管理) |
| 联系人合并 | ContactMergeService | ContactMergeService+ContactMergeActionService | 缺少ContactMergeActionService(合并操作) |
| 实时报告 | LiveReportService | LiveReportService+ReportService+SummaryReportService+YearInReview | 缺少3个报告service |
| SLA | SlaPolicyService | SlaPolicyService+AppliedSlaService+SlaPolicyAssignmentService | 缺少2个SLA service |
| 宏操作 | MacroService | MacroService+MacroExecutionService | 缺少MacroExecutionService(执行引擎) |
| 通知 | NotificationService | NotificationService+NotificationSubscriptionService | 缺少NotificationSubscriptionService(订阅管理) |
| 自动化规则 | AutomationRuleService | AutomationRuleService+AutomationActionService | 缺少AutomationActionService(执行引擎) |
5. 测试状态
| 指标 | 数值 |
|---|---|
| 总测试数 | 2,577 |
| PASS | 2,566 |
| FAIL | 11 |
| 通过率 | 99.6% |
FAIL测试清单(11个,全部在handler层):
- TestAgentBotHandlerSuite — agent_bot handler auth/middleware问题
- TestAutomationRuleHandlerTestSuite — automation_rule handler auth问题(9个子FAIL)
- TestConversationCrudTestSuite — conversation CRUD auth问题(10个子FAIL)
- TestConversationHandlerTestSuite — conversation handler auth问题(5+子FAIL)
- TestConversationParticipantHandlerTestSuite — participant handler auth问题(5+子FAIL)
- TestDraftMessageHandlerTestSuite — draft_message handler auth问题
- TestMessageHandlerTestSuite — message handler auth问题(5+子FAIL)
- TestNotificationGet — notification handler DB/mock问题
- TestNotificationGetDifferentID — notification handler DB/mock问题
- TestNotificationHandler_SnoozeWithDB — notification handler DB/mock问题
- TestNotificationHandler_UnreadWithDB — notification handler DB/mock问题
所有FAIL均属于auth middleware或DB mock配置问题, 非业务逻辑错误。
6. 优化计划 (分4 Phase推进)
Phase 1: 路由补全 (优先级 P0 > P1)
目标: 补齐缺失路由, 覆盖率从18.7%提升至80%+
Wave 1 (P0核心, 2周):
- S1: assignable_agents — GET /api/v1/accounts/:id/assignable_agents
- S2: inbox_members — CRUD /api/v1/accounts/:id/inboxes/:id/inbox_members
- S3: inbox_limits — GET/POST /api/v1/accounts/:id/inboxes/:id/inbox_limits
- S4: notes — CRUD /api/v1/accounts/:id/conversations/:id/notes
- S5: draft_messages — CRUD /api/v1/accounts/:id/conversations/:id/draft_messages
- S6: delivery_status — GET /api/v1/accounts/:id/conversations/:id/messages/:id/delivery_status
- S7: contact_merge — POST /api/v1/accounts/:id/actions/contact_merge
- S8: csat_template — GET/PATCH /api/v1/accounts/:id/csat_template
- S9: csat_survey_responses — 补齐service层缺失逻辑
- S10: hooks — CRUD /api/v1/accounts/:id/integrations/:id/hooks
Wave 2 (P1重要, 2周):
- S11: assignments — CRUD /api/v1/accounts/:id/conversations/:id/assignments
- S12: account_users — 补齐service层缺失逻辑
- S13: access_tokens — CRUD /platform/api/v1/apps/:id/access_tokens
- S14: agents — 补齐destroy/bulk_actions
- S15: mfa — GET/POST /api/v1/profile/mfa
- S16: apps — CRUD /platform/api/v1/apps
- S17: installation_configs — CRUD /api/v1/installation_configs
- S18: agent_capacity_policies — 补齐service层缺失逻辑
关键修正: PATCH路由需从29→68, 补39条PATCH路由(部分更新逻辑)
Phase 2: Service补全 (优先级 P0 > P1 > P2)
目标: 补齐92个缺失service, 从105提升至197
Stream 1 (P0, 3周):
- AssignableAgentService (autoassignment模块扩展)
- InboxMemberService (新增)
- InboxLimitService (新增)
- NoteService (新增)
- DraftMessageService (新增)
- DeliveryStatusService (新增)
- CsatTemplateService (新增)
- HookService (新增)
- AssignmentService (新增)
- ContactMergeActionService (新增)
Stream 2 (P1, 3周):
- MfaService (新增)
- PlatformAppService (从stub→完整实现)
- AgentCapacityPolicyService (从stub→完整实现)
- CustomRoleService (从stub→完整实现)
- SlaPolicyService (从stub→完整实现)
- MacroExecutionService (新增)
- DashboardAppService (从stub→完整实现)
- AppliedSlaService (新增)
- SlaPolicyAssignmentService (新增)
Stream 3 (P2, 4周):
- Captain各service (6个)
- NotificationSubscriptionService (新增)
- TeamMemberService (新增)
- ConferenceService (新增)
- CategoryService/ArticleService (从stub→完整实现)
- ReportService/SummaryReportService/YearInReviewService (新增)
Phase 3: 逻辑1:1对齐验证 (优先级 P0 > P1)
目标: 验证所有已实现功能的逻辑完全匹配Chatwoot
Stream 1 (P0, 3周):
- 对话自动分配: round-robin/负载均衡/技能匹配
- 对话搜索: 7种过滤器+排序+分页
- 联系人搜索: 6种过滤器+排序+分页
- 消息发送: 渠道差异化发送逻辑
- CSAT: 模板管理+收集逻辑
- 联系人合并: 合并操作+关联迁移
Stream 2 (P1, 3周):
- 自动化规则: AutomationActionService执行引擎
- SLA: AppliedSla追踪+策略分配
- 宏操作: MacroExecutionService执行引擎
- 实时报告: 4种报告service对齐
Phase 4: 测试覆盖提升
目标: 从272个测试提升至834+, 覆盖率从93%提升至95%+
Stream 1 (修复现有7个FAIL, 1周):
- 修复handler auth middleware测试问题(11个FAIL)
Stream 2 (新增P0测试, 2周):
- AssignableAgentService测试
- InboxMemberService测试
- NoteService测试
- DraftMessageService测试
- DeliveryStatusService测试
- ContactMergeActionService测试
Stream 3 (新增P1/P2测试, 2周):
- MfaService测试
- MacroExecutionService测试
- SlaPolicyService测试
- Captain各service测试
7. 关键风险和建议
| 风险 | 影响 | 建议 |
|---|---|---|
| Chatwoot routes.rb解析器产生嵌套路由串联问题 | 差距报告伪缺失 | 重写解析器,改用资源级对比而非路由路径级 |
| GoChat路由数量多于Chatwoot(653 vs 539) | 多余路由可能含冗余/错误注册 | 逐条审查多余路由, 确认是合理扩展还是误注册 |
| normalize函数标准化不足 | 低估覆盖率 | 只标准化_id结尾参数, 不标准化子段名(如avatar) |
| Service层92个缺口 | 功能不可用 | 优先补齐P0核心service |
| 11个handler测试FAIL | 功能回归测试不可靠 | 优先修复FAIL测试, 再补新service测试 |
| Chatwoot有197个service而GoChat只有105个 | Phase 2工作量巨大 | 分3波推进, P0→P1→P2 |
| 1:1对齐要求极高 | 实现细节差异大 | Phase 3需逐模块对比验证, 预计耗时最长 |
| PATCH路由严重不足(29 vs 68) | 部分更新逻辑缺失 | Phase 1需优先补齐39条PATCH路由 |
| v2 API完全缺失 | 报告API不可用 | 需新增/api/v2/路由组(12条路由) |
8. 数据来源
- GoChat路由: cmd/dump_routes输出 (653条HTTP路由)
- Chatwoot路由: scripts/parse_chatwoot_routes_v3.py解析routes.rb (539条API路由)
- GoChat文件统计: find + wc统计
- Chatwoot文件统计: find + wc统计
- 测试数据: go test ./internal/... -v输出
- Service差距: 手动比对internal/service/ vs chatwoot app/services/