Files
gochat/docs/comparison/Gochat-vs-Chatwoot-Full-Comparison.md
T
2026-06-04 15:44:48 +08:00

283 lines
14 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.
# GoChat vs Chatwoot 全面对比 — 1:1 功能复制差距分析
> 生成日期:2026-05-24
> 目标:评估GoChat是否达到Chatwoot 1:1功能复制,具备生产级上线能力
---
## 一、总览对比
| 指标 | Chatwoot | GoChat | 差距 |
|------|---------|--------|------|
| API路由数 | 327+ | 106 | **缺221+路由 (仅32%覆盖)** |
| Handler方法数 | ~150+ | 99 | **缺51+方法** |
| 真实实现率 | 100% | 57% | **差43%** |
| Stub/Placeholder | 0 | 37个 | **全部需补实现** |
| 501 Not Implemented | 0 | 6个 | **全部需补实现** |
| 消息队列调度 | Sidekiq完整 | WorkerPool全stub | **不可用** |
| 渠道扩展机制 | 11渠道+Channelable | 注册机制有+仅2渠道 | **缺9渠道** |
| 事件分发 | Dispatcher+9 Listener | Dispatcher骨架+无真实Listener | **事件驱动完全不可用** |
---
## 二、按模块详细对比
### ✅ 完全实现模块(11个,56个方法)
| 模块 | 方法数 | 实现率 | 说明 |
|------|--------|--------|------|
| Auth | 8 | 100% | Login/MFA/Register/Refresh/Logout/SwitchAccount/ResetPassword/ConfirmEmail |
| MFA | 4 | 100% | Enable/Verify/Disable/GetStatus |
| Captain Assistant | 9 | 100% | 完整CRUD + Search + Inbox关联 |
| Captain Document | 5 | 100% | CRUD + Search |
| Captain Scenario | 5 | 100% | 完整CRUD |
| Captain Custom Tool | 5 | 100% | 完整CRUD |
| Copilot | 3 | 100% | SuggestReplies/Summarize/Translate |
| WebWidget | 3 | 100% | GetConfig/InitConversation/SendMessage |
| Telegram Channel | 4 | 100% | Configure/Deauthorize/Reauthorize/GetInfo |
| Analytics | 6 | 100% | Summary + 5类Metrics |
| LiveReport | 3 | 100% | AccountSummary + AgentConversation + Labels |
### ⚠️ 部分实现模块(2个)
| 模块 | Real | Stub | 差距说明 |
|------|------|------|----------|
| Account | 1 (Delete) | 4 (List/Get/Create/Update) | CRUD全stub,仅Delete有真实实现 |
| SAML | 1 (Enable) | 2 (GetConfig/InitiateLogin) | 缺SSO登录流程 |
### ❌ 全Stub模块(9个,43个方法)—— **生产上线最大障碍**
| 模块 | Stub方法 | 501方法 | Chatwoot对应功能 | 严重性 |
|------|----------|---------|-----------------|--------|
| **Contact** | 4 (List/Get/Create/Search) | 2 (Update/Delete) | M4-联系人管理 | 🔴 致命 |
| **Conversation** | 4 (List/Get/Create/UpdateLabels) | 1 (Update) | M3-对话核心 | 🔴 致命 |
| **Message** | 3 (List/Create/Search) | 0 | M3-消息核心 | 🔴 致命 |
| **Inbox** | 3 (List/Get/Create) | 2 (Update/Delete) | M2-渠道管理 | 🔴 致命 |
| **Profile** | 3 (Get/Update/DeleteAvatar) | 0 | M1-用户设置 | 🟡 重要 |
| **Notification** | 6 (List/Get/MarkRead/MarkAllRead/UnreadCount/DeleteAll) | 0 | M8-通知系统 | 🟡 重要 |
| **Team** | 4 (List/Create/Get/Update) | 1 (Delete) | M5-团队管理 | 🟡 重要 |
| **PlatformApp** | 2 (List/Create) | 0 | M12-平台应用 | 🟢 可后补 |
| **DashboardApp** | 2 (List/Create) | 0 | M12-仪表盘 | 🟢 可后补 |
---
## 三、消息队列调度系统差距
### Chatwoot 事件驱动架构
Chatwoot使用 **Wisper + Sidekiq** 双层事件系统:
| 层 | 技术 | 功能 | 关键组件 |
|----|------|------|---------|
| 同步层 | Wisper广播 | 实时事件通知(ActionCable、AgentBot) | SyncDispatcher |
| 异步层 | Sidekiq Worker | 持久化异步任务处理 | 9个AsyncDispatcher Listener |
| WebSocket | ActionCable | 前端实时推送 | ActionCableListener |
| Push通知 | FCM + Web Push | 移动端推送 | PushNotificationListener |
| Email | Mailer | 邮件通知 | EmailNotificationListener |
**Chatwoot 9个异步Listener(全部通过Sidekiq持久队列):**
1. **AutomationRuleListener** — 事件触发自动化规则执行
2. **CampaignListener** — 营销活动消息发送
3. **CsatSurveyListener** — 满意度调查推送
4. **HookListener** — Integration Hook执行
5. **InstallationWebhookListener** — 平台级Webhook投递
6. **NotificationListener** — 应用内通知创建
7. **ParticipationListener** — 对话参与度更新
8. **ReportingEventListener** — 报表数据聚合
9. **WebhookListener** — Account Webhook投递
### GoChat 当前状态
| 层 | 技术 | 状态 | 差距 |
|----|------|------|------|
| 事件总线 | Watermill + Redis Streams | **骨架有,未接入业务** | EventBus定义了topic常量但无真实subscriber |
| PubSub接口 | RedisPubSub + InMemoryPubSub | **接口完整,无业务调用** | Publish/Subscribe可用但service层从不调用 |
| Dispatcher | channel.Dispatcher + dispatch.Dispatcher | **注册机制有,无真实Listener** | Dispatcher.Register可注册但无业务Listener实现 |
| WorkerPool | 全stub | **不可用** | Start/Stop返回nil,无任何job处理 |
| WebSocket | ws包 | **骨架有,无消息关联** | broadcast/presence/typing有但未与pubsub联动 |
**关键缺失:整个事件流转链路断裂**
```
Chatwoot完整链路:
用户操作 → Event → Wisper广播 → SyncDispatcher(实时) + Sidekiq(异步)
→ AutomationRuleListener → 执行规则 → 发消息/改状态/分配坐席
→ NotificationListener → 创建通知 → ActionCable推送前端
→ WebhookListener → HTTP POST到外部系统
GoChat当前链路:
用户操作 → handler stub → 返回placeholder JSON → 结束(无事件发布)
```
**差距量化:**
- Chatwoot 9个Async Listener → GoChat 0个
- Chatwoot Sidekiq 6个Worker类型 → GoChat WorkerPool全stub
- Chatwoot ActionCable 15+事件频道 → GoChat WebSocket未接入pubsub
- Chatwoot Webhook投递(签名+重试+去重) → GoChat仅webhook_auth中间件
---
## 四、可扩展Inbox机制差距
### Chatwoot Channelable架构
Chatwoot采用 **多态 + Concern** 模式,支持11种渠道类型:
| 渠道类型 | Channel模型 | 状态 | 特殊功能 |
|---------|-----------|------|---------|
| Channel::WebWidget | channel_web_widgets | ✅ | 实时聊天+离线消息+欢迎语 |
| Channel::Telegram | channel_telegram | ✅ | Bot API+Webhook回调 |
| Channel::FacebookPage | channel_facebook_pages | ✅ | Messenger+OAuth刷新 |
| Channel::Instagram | channel_instagram | ✅ | DM+评论+OAuth |
| Channel::WhatsApp | channel_whatsapp | ✅ | Meta Business API+Baileys |
| Channel::Email | channel_email | ✅ | IMAP接收+SMTP发送 |
| Channel::TwilioSMS | channel_twilio_sms | ✅ | Twilio API |
| Channel::TwilioWhatsApp | channel_twilio_whatsapp | ✅ | Twilio WA API |
| Channel::Line | channel_line | ✅ | LINE Messaging API |
| Channel::Slack | channel_slack | ✅ | Slack Events API |
| Channel::Api | channel_api | ✅ | REST API接入 |
**Chatwoot Inbox扩展性关键机制:**
1. **Channelable concern** — 统一接口(name/avatar_type/revalidate_credentials等)
2. **多态关联** — Inbox belongs_to channel, polymorphic: true
3. **渠道创建流程** — InboxBuilder根据channel_type选择对应Builder
4. **IncomingMessageService** — 根据channel_type路由到对应处理逻辑
5. **OutgoingMessageService** — 根据channel_type选择发送渠道
6. **OAuth刷新** — Reauthorizable concern(FB/Instagram定期刷新token)
7. **Webhook回调** — 每个渠道有独立webhook endpoint
8. **渠道设置** — 每个渠道有独立设置页面和配置字段
### GoChat 当前状态
| 机制 | 状态 | 差距 |
|------|------|------|
| ChannelRegistry | ✅ 完整实现 | 注册/获取/列举provider均可 |
| ChannelProvider接口 | ✅ 完整定义 | Type/Name/ConfigSchema/ValidateConfig/ProcessIncoming/SendOutgoing等 |
| ChannelType枚举 | ✅ 定义了11种 | 但仅2种有真实provider |
| WebWidget provider | ✅ 完整实现 | pipeline+service+repository |
| Telegram provider | ✅ 完整实现 | pipeline+service+repository+webhook_handler |
| Facebook provider | ❌ 无实现 | model文件有但channel/provider/facebook.go缺失 |
| WhatsApp provider | ❌ 无实现 | model文件有但无provider |
| Instagram provider | ❌ 无实现 | 无任何文件 |
| Email provider | ❌ 无实现 | 无任何文件 |
| TwilioSMS/WA provider | ❌ 无实现 | 无任何文件 |
| Line provider | ❌ 无实现 | 无任何文件 |
| Slack provider | ❌ 无实现 | 无任何文件 |
| API provider | ❌ 无实现 | model文件有(txt)但无provider |
| InboxBuilder | ❌ 缺失 | 无根据channel_type选择Builder的逻辑 |
| IncomingMessage路由 | ❌ 缺失 | ProcessIncoming在provider接口定义但无真实路由调用 |
| OutgoingMessage路由 | ❌ 缺失 | SendOutgoing在provider接口定义但无真实调用 |
| OAuth刷新 | ❌ 缺失 | 无Reauthorizable机制 |
| 渠道Webhook路由 | ❌ 仅1个stub | `/webhooks/:channel_type/:identifier` placeholder |
**差距量化:**
- 11种渠道类型 → 仅2种有实现 (18%覆盖率)
- Inbox CRUD 5方法 → 全stub (0%实现率)
- InboxMember坐席绑定 → 无路由、无model关联
- 渠道创建流程 → 无InboxBuilder
- 消息收发路由 → 无Incoming/Outgoing消息路由到provider
---
## 五、Chatwoot完全缺失的API模块(路由级别)
| # | 缺失模块 | 缺失路由数 | 严重性 |
|---|---------|-----------|--------|
| 1 | **Agent/AgentBot** | 8+ | 🔴 致命 |
| 2 | **Canned Responses** | 4 | 🟡 重要 |
| 3 | **Automation Rules** | 6 | 🟡 重要 |
| 4 | **Macros** | 5 | 🟡 重要 |
| 5 | **SLA Policies** | 5 | 🟡 重要 |
| 6 | **Custom Roles** | 5 | 🟡 重要 |
| 7 | **Agent Capacity Policies** | 7+ | 🟡 重要 |
| 8 | **Assignment Policies** | 5+ | 🔴 致命 |
| 9 | **Campaigns** | 5 | 🟢 可后补 |
| 10 | **Search(全局搜索)** | 5 | 🔴 致命 |
| 11 | **Companies** | 10+ | 🟡 重要 |
| 12 | **CSAT Survey Responses** | 4+ | 🟡 重要 |
| 13 | **Notes (对话笔记)** | 4 | 🟡 重要 |
| 14 | **Labels** | 3 | 🟡 重要 |
| 14 | **Attachments** | 3 | 🟡 重要 |
| 15 | **Integrations/Apps** | 10+ | 🟢 可后补 |
| 16 | **Help Center/Portal** | 15+ | 🟢 可后补 |
| 17 | **OAuth回调(FB/Instagram/WA)** | 5+ | 🔴 致命 |
| **总计缺失路由** | | **~100+** | |
---
## 六、结论与建议
### 当前状态:**不具备生产级上线能力**
**三层架构断裂:**
1. **Handler层断裂** — 9个核心CRM模块全stub(Contact/Conversation/Message/Inbox等),客服系统核心功能完全不可用
2. **事件驱动断裂** — EventBus/PubSub/Dispatcher骨架存在但零业务接入,无Listener实现,无异步Worker处理,事件流转链路完全断裂
3. **渠道扩展断裂** — 注册机制完整但仅2/11渠道有实现,Inbox CRUD全stub,消息收发路由未接入ChannelProvider
### 实现到1:1功能复制需要的工作量估算
| 优先级 | 模块 | 工作内容 | 预估天数 |
|--------|------|---------|---------|
| P0 致命 | Conversation+Message | 全部handler+service+repo真实实现+状态流转+标签+笔记+附件 | 4-5 |
| P0 致命 | Contact+Inbox | 全部handler+service+repo+InboxBuilder+InboxMember+Channelable路由 | 3-4 |
| P0 致命 | Account完整CRUD | List/Get/Create/Update真实实现 | 1 |
| P0 致命 | Agent/AgentBot+Assignment | 新模块CRUD+自动分配引擎(round-robin/lowest-load) | 3-4 |
| P0 致命 | 事件驱动系统 | 9个Async Listener+WorkerPool(asynq)+PubSub→Service联动 | 3-4 |
| P0 致命 | 消息收发路由 | Incoming→ChannelProvider.ProcessIncoming+Outgoing→SendOutgoing | 2-3 |
| P1 重要 | Notification+Webhook | 全部handler+创建通知+Webhook投递(签名+重试) | 2-3 |
| P1 重要 | Team+Profile | 全部handler真实实现 | 1-2 |
| P1 重要 | AutomationRule+Macro+CSAT | 新模块CRUD+规则执行引擎 | 2-3 |
| P1 重要 | SLA+CustomRole+CapacityPolicy | 新模块CRUD | 2 |
| P1 重要 | Search全局搜索 | Elasticsearch/Meilisearch集成 | 1-2 |
| P2 可后补 | 渠道集成(FB/WA/Email) | 9个Channel Provider实现 | 5-8 |
| P2 可后补 | Companies+Campaign+HelpCenter | 新模块 | 3-4 |
| **总计** | | **约130+方法/API** | **~25-35天** |
### 建议执行策略
**P0阶段(致命缺口,约15天):先让客服系统"能跑起来"**
1. Conversation+Message核心 — 对话创建+状态流转+消息收发
2. Contact+Inbox核心 — 联系人管理+收件箱CRUD+渠道绑定
3. 事件驱动接入 — PubSub→Service联动+WorkerPool(asynq)
4. 消息收发路由 — Incoming/Outgoing→ChannelProvider
5. Agent+自动分配 — 坐席管理+round-robin分配
**P1阶段(运营必需,约10天):让系统"好用"**
6. Notification+Webhook — 坐席感知+外部集成
7. Automation+Macro+CSAT — 自动化+满意度
8. SLA+Role+Capacity — 企业级管理
9. Team+Profile+Search — 团队协作+信息检索
**P2阶段(可迭代,约10天):让系统"完整"**
10. 9个渠道Provider实现
11. Companies+Campaign+HelpCenter
12. OAuth刷新+更多渠道设置
---
## 附录:关键代码文件索引
| 功能 | GoChat文件 | 状态 |
|------|-----------|------|
| PubSub接口 | internal/pubsub/pubsub.go | ✅ 接口完整 |
| Redis PubSub | internal/pubsub/redis_pubsub.go | ✅ Watermill实现 |
| EventBus | internal/pubsub/event_bus.go | ✅ topic常量定义 |
| Dispatcher | internal/channel/dispatcher.go | ⚠️ 注册机制有,无Listener |
| dispatch.Dispatcher | internal/dispatch/dispatcher.go | ⚠️ Sync/Async骨架,无业务接入 |
| WorkerPool | internal/worker/worker.go | ❌ 全stub |
| ChannelRegistry | internal/channel/registry.go | ✅ 完整实现 |
| ChannelProvider | internal/channel/provider.go | ✅ 接口完整 |
| WebWidget Provider | internal/channel/web_widget/ | ✅ 完整实现 |
| Telegram Provider | internal/channel/telegram/ | ✅ 完整实现 |
| Facebook Provider | internal/channel/provider/facebook.go | ❌ 缺失 |
| WhatsApp Provider | internal/channel/provider/whatsapp.go | ❌ 缺失 |
| InboxHandler | internal/handler/api/v1/inbox_handler.go | ❌ 全stub |
| ContactHandler | internal/handler/api/v1/contact_handler.go | ❌ 全stub |
| ConversationHandler | internal/handler/api/v1/conversation_handler.go | ❌ 全stub |
| MessageHandler | internal/handler/api/v1/message_handler.go | ❌ 全stub |