# GoChat vs Chatwoot 1:1 复制差距报告 > 生成时间: 2026-06-01 > 基准: chatwoot-reference (Ruby) vs gochat (Go) --- ## 一、总体覆盖率 | 维度 | Chatwoot | GoChat | 覆盖率 | |------|----------|--------|--------| | API Controller/Handler | 136 | 107 | 78.7% | | 路由注册 | 136 controllers | 80 handler refs | 58.8% | | Service 层 | 197 | 97 | 49.2% | | Model | 52 | 119* | — | | API Action 方法 | 265 | 140 | **52.8%** | | Handler 方法真实实现 | — | 597 real / 33 stub | 94.8% 非stub | *GoChat model 数量多于 Chatwoot 是因为拆分了子模型和辅助结构体 **核心差距:API action 覆盖率仅 52.8%,Service 层差 100 个** --- ## 二、P0:完全缺失的 Handler(28个) Chatwoot 有对应 controller,GoChat 无任何对应 handler。 ### 2.1 核心业务缺失(必须实现) | Chatwoot Controller | 缺失 Actions | 优先级 | 说明 | |---------------------|-------------|--------|------| | AgentsController | index, create, update, destroy, bulk_create | **P0** | Agent 管理(创建/删除/批量创建)是核心功能 | | InboxesController | index, show, assignable_agents, campaigns, avatar, create, update, reset_secret, destroy | **P0** | Inbox 管理 9 个 action 全缺,路由已注册 `h.Inbox.` 但 handler 未实现 | | CsatSurveyResponsesController | index, metrics, download | **P0** | CSAT 问卷响应查看/下载 | | CategoriesController | index, show, create, update, destroy, reorder | **P0** | Helpcenter 分类 CRUD | | BulkActionsController | create | P1 | 批量操作入口 | | SearchController | index, conversations, contacts, messages, articles | **P0** | 全局搜索 5 个端点 | | ContactInboxesController | filter | P1 | Contact-Inbox 过滤 | | InboxMembersController | show, create, update, destroy | P1 | 路由有 `h.InboxMember.` 但 4 个 action 全缺 | | LabelsController | index, show, create, update, destroy | P1 | 路由有 `h.Label.` 但 5 个 action 全缺 | | UploadController | create | P1 | 文件上传 | ### 2.2 集成/渠道缺失 | Chatwoot Controller | 缺失 Actions | 说明 | |---------------------|-------------|------| | CallbacksController | register_facebook_page, log_additional_info, facebook_pages, reauthorize_page | Facebook 回调处理 | | Integrations::AppsController | index, show | 集成 App 列表/详情 | | Integrations::HooksController | create, update, destroy | 集成 Hook CRUD | | Integrations::DyteController | create_a_meeting, add_participant_to_meeting | Dyte 视频会议 | | Integrations::LinearController | destroy, teams, team_entities, create_issue, link_issue, unlink_issue, linked_issues, search_issue | Linear 项目管理集成(8 action) | | Integrations::NotionController | destroy | Notion 集成删除 | | Integrations::ShopifyController | auth, orders | Shopify 电商集成 | | Google::AuthorizationsController | create | Google OAuth 授权 | ### 2.3 AI/Captain 缺失 | Chatwoot Controller | 缺失 Actions | 说明 | |---------------------|-------------|------| | Captain::PreferencesController | show, update | AI 助手偏好设置 | | Captain::TasksController | rewrite, summarize, reply_suggestion, label_suggestion, follow_up | AI 助手任务(5 action) | ### 2.4 Reporting/分析缺失 | Chatwoot Controller | 缺失 Actions | 说明 | |---------------------|-------------|------| | V2::LiveReportsController | conversation_metrics, grouped_conversation_metrics | 实时报表 | | V2::SummaryReportsController | agent, channel | 汇总报表 | | V2::YearInReviewsController | show | 年度回顾 | ### 2.5 其他缺失 | Chatwoot Controller | 缺失 Actions | 说明 | |---------------------|-------------|------| | AssignmentPoliciesController | index, show, create, update, destroy | 路由有注册但映射失败 | | SlaPoliciesController | index, show, create, update, destroy | SLA 策略 CRUD | --- ## 三、P1:部分匹配的 Handler(12个) 存在 handler 但缺少部分 action。 | Chatwoot Controller | GoChat Handler | 覆盖 | 缺失 Actions | |---------------------|---------------|------|-------------| | ContactsController | ContactHandler | 10/13 (77%) | filter, destroy_custom_attributes, avatar | | ConversationsController | ConversationHandler | 13/20 (65%) | attachments, pending_to_open_by_bot, should_assign_conversation, toggle_priority, toggle_typing_status, update_last_seen, custom_attributes | | PortalsController | PortalHandler | 6/8 (75%) | logo, send_instructions | | NotificationsController | NotificationHandler | 5/8 (62%) | read_all, destroy_all, unread_count | | ProfilesController | ProfileHandler | 3/7 (43%) | auto_offline, availability, resend_confirmation, reset_access_token | | Articles::BulkActionsController | ArticleHandler | 2/3 (67%) | translate | | Conversations::MessagesController | ConversationHandler | 4/6 (67%) | retry, translate | | AssignmentPolicies::InboxesController | AssignmentPolicyHandler | 0/1 (0%) | index | | InboxMembersController | InboxMemberHandler | 0/4 (0%) | show, create, update, destroy | | LabelsController | LabelHandler | 0/5 (0%) | index, show, create, update, destroy | | SearchController | SearchHandler | 0/5 (0%) | index, conversations, contacts, messages, articles | | UploadController | UploadHandler | 0/1 (0%) | create | --- ## 四、Stub/Placeholder 方法(33个) 方法已声明但实现为 stub/placeholder,未包含真实业务逻辑。 | Handler | Stub Method | 说明 | |---------|------------|------| | account | UpdateActiveAt | 活跃时间更新 | | campaign | Start, Stop | Campaign 启停 | | captain_preference | Delete | AI偏好删除 | | company | AddContact, DeleteNote, RemoveContact | Company 关联操作 | | contact | Delete, DeleteCustomAttributes | 联系人删除 | | email_channel | Delete | Email渠道删除 | | facebook_channel | DeleteFacebookPage, ReauthorizeFacebookPage | Facebook 页面管理 | | google_channel | Delete | Google渠道删除 | | inbox | RegisterWebhook, SetAgentBot | Inbox Webhook注册/AgentBot设置 | | integration_hook | ProcessHookEvent | Hook事件处理 | | line_channel | Delete | LINE渠道删除 | | linear_integration | Delete | Linear集成删除 | | microsoft_channel | Delete | Microsoft渠道删除 | | notification | DestroyAll, MarkAllRead, UpdateSettings | 通知批量操作 | | notion_integration | Delete | Notion集成删除 | | saml | SPInitiatedSLO | SAML SLO | | shopify_integration | Delete | Shopify集成删除 | | slack_integration | Delete | Slack集成删除 | | tiktok_channel | DeleteTikTokChannel | TikTok渠道删除 | | twilio_channel | Delete | Twilio渠道删除 | | twitter_channel | Delete | Twitter渠道删除 | | webwidget_offline | DismissOfflineMessage | 离线消息dismiss | | webwidget_theme | DeletePreChatForm, DeleteThemeConfig | Widget配置删除 | | whatsapp_call | Delete | WhatsApp通话删除 | --- ## 五、未注册路由的 Handler(30个) Handler 文件存在但未在 router.go 注册路由(HTTP 不可访问)。 关键缺失路由: | Handler | 应注册路由 | 优先级 | |---------|-----------|--------| | AuthHandler | /api/v1/auth/* | P0 | | AgentCapacityHandler | /api/v1/accounts/:account_id/agent_capacity_policies/* | P1 | | AuditHandler | /api/v1/accounts/:account_id/audits/* | P2 | | CustomRoleHandler | /api/v1/accounts/:account_id/custom_roles/* | P1 | | IntegrationHookHandler | /api/v1/accounts/:account_id/integrations/hooks/* | P1 | | NoteHandler | /api/v1/accounts/:account_id/contacts/:contact_id/notes/* | P0 | | NotificationSettingHandler | /api/v1/accounts/:account_id/notification_settings/* | P1 | | WidgetHandler | /widget/* | P1 | | WebhookHandler | /api/v1/accounts/:account_id/webhooks/* | P1 | 其余 21 个为 SSO/LDAP/OIDC/MFA 等认证相关和渠道集成(Twilio/Slack/Shopify 等),优先级较低。 --- ## 六、Model 层差距 ### 6.1 Chatwoot 有但 GoChat 缺的 Model | Model | 重要性 | 说明 | |-------|--------|------| | WorkingHour | **P1** | 营业时间(影响自动分配和 SLA) | | NotificationSubscription | P2 | 推送订阅管理 | | PlatformAppPermissible | P1 | Platform App 权限 | | PlatformBanner | P1 | Platform Banner(已有 BannerHandler 但 model 不匹配) | | Webhook | P2 | 旧版 Webhook | | EmailTemplate | P2 | 邮件模板 | 其余(ApplicationRecord, DataImport, Integrations, JsonbAttributesLengthValidator, Kbase, SuperAdmin)是 Rails 内部/辅助模型,无需复制。 ### 6.2 已有 Model 但可能缺少字段 需逐一对比 Chatwoot model 的字段与 GoChat model 字段。关键可疑差距: - **User**: 缺 `availability_status`, `auto_offline` 字段(Profile handler 43% 覆盖) - **Conversation**: 缺 `priority`, `pending_by_bot` 状态相关字段 - **Inbox**: 缺 `agent_bot` 关联 - **Contact**: 缺自定义属性删除逻辑 --- ## 七、Service 层差距(最严重) Chatwoot 197 services vs GoChat 97 services,**差 100 个 service**。 ### 7.1 关键缺失 Service 分类 | 分类 | Chatwoot 数量 | GoChat 状态 | 差距说明 | |------|-------------|------------|---------| | conversations | 14 | 部分 | 缺 filter_service, message_window_service, permission_filter_service, typing_status_manager, unread_counts 全套(9) | | contacts | 6 | 部分 | 缺 bulk_action_service, contactable_inboxes_service, filter_service, sync_attributes | | instagram | 10 | 无 | 完全缺失 Instagram 渠道 service | | whatsapp | 7+ | 部分 | 缺 send_on_whatsapp_service, incoming_message_service 等 | | telegram | 3 | 部分 | 缺 send_on_telegram_service | | auto_assignment | 5 | ✅ 已实现 | GoChat 有完整 autoassignment 包 | | automation_rules | 3 | 部分 | 缺 action_service, condition_validation_service | | notification | 多个 | 部分 | 缺 push_notification_service | | search | 多个 | 无 | 搜索 service 完全缺失(search 包被标记 bak_offline) | | reporting | 多个 | 部分 | 有 reporting 包但缺具体聚合 service | | portal/kbase | 多个 | 部分 | 缺 portal 相关子 service | | captain/ai | 多个 | 部分 | 有 llm 包但缺具体 captain service | | email/imap | 5 | 无 | IMAP 邮件获取完全缺失 | | line | 2 | 部分 | LINE 渠道 service | | twilio | 多个 | 部分 | SMS/WhatsApp 渠道 | | sla | 多个 | 部分 | SLA 计算 service | | macro | 多个 | 部分 | Macro 执行 service | | crm | 9 | 无 | CRM 集成(LeadSquared 等)完全缺失 | | facebook | 1 | 部分 | 缺 send_on_facebook_service | ### 7.2 GoChat 已实现的 Service 亮点 - **autoassignment**: 完整实现(round_robin, rate_limiter, listener) - **automation**: 16 个文件,较完整 - **auth**: 14 个文件,SSO/MFA/OIDC/SAML/LDAP 全覆盖 - **channel**: 13 个文件,多渠道支持 - **middleware**: 19 个文件,中间件完整 - **ws**: 8 个文件,WebSocket/SSE 实现 --- ## 八、优化计划 ### Phase 1: P0 核心功能补齐(2-3周) 目标:API action 覆盖率从 52.8% → 70% | 任务 | 工作量 | 依赖 | |------|--------|------| | 实现 AgentsController(5 action) | 3天 | Agent model + AgentService | | 实现 InboxesController(9 action) | 5天 | InboxService 完善 | | 实现 SearchController(5 action) | 3天 | SearchService(需解冻 search_bak) | | 实现 CategoriesController(6 action) | 2天 | CategoryService 完善 | | 实现 CsatSurveyResponsesController(3 action) | 2天 | CsatSurveyService | | 实现缺失路由注册(30个 handler → router.go) | 2天 | 各 handler 已存在 | | 补齐 ContactHandler 3 action | 1天 | Contact model | | 补齐 ConversationHandler 7 action | 3天 | ConversationService | | 补齐 NotificationHandler 3 action | 1天 | NotificationService | | 补齐 ProfileHandler 4 action | 1天 | User model 字段 | ### Phase 2: P1 功能补齐(2-3周) 目标:API action 覆盖率从 70% → 85% | 任务 | 工作量 | |------|--------| | 33 stub 方法改为真实实现 | 5天 | | Label CRUD 5 action | 1天 | | InboxMember CRUD 4 action | 1天 | | Upload create action | 1天 | | IntegrationHook CRUD | 2天 | | IntegrationApp list/show | 1天 | | WorkingHour model + service | 2天 | | Conversation unread_counts 全套 | 3天 | | Contact filter/bulk services | 2天 | | Notification push service | 2天 | ### Phase 3: 渠道集成补齐(3-4周) 目标:API action 覆盖率从 85% → 95% | 任务 | 工作量 | |------|--------| | Instagram 渠道 service(10个) | 5天 | | IMAP 邕件获取(5个) | 3天 | | Facebook callback 处理 | 2天 | | Slack integration service | 2天 | | Linear integration service | 3天 | | Shopify integration service | 2天 | | Dyte integration service | 1天 | | Captain/AI task services | 3天 | ### Phase 4: 测试覆盖 & 稳定性(持续) | 任务 | 说明 | |------|------| | Handler 测试覆盖率 80% | 当前 71.4%,需继续写 0%-coverage handler 测试 | | Service 层测试 | 当前缺失大量 service 测试 | | 集成测试 | 渠道回调、事件发布等集成测试 | | E2E 测试 | 关键业务链路 E2E | --- ## 九、关键发现总结 1. **最大差距在 Service 层**:差 100 个 service(197 vs 97),大量业务逻辑未实现 2. **路由注册是隐性差距**:30 个 handler 存在但路由未注册,等于 30 个 handler 完全不可用 3. **Conversation 是最大单点差距**:13/20 action 覆盖,缺 7 个关键 action(priority, typing_status, bot assignment 等) 4. **Search 功能完全缺失**:search 包标记 bak_offline,5 个搜索端点全部 0% 覆盖 5. **33 个 stub 方法**:方法声明了但返回 placeholder,无真实业务逻辑 6. **渠道集成大面积缺失**:Instagram(10), IMAP(5), CRM(9), Linear(8) 等渠道 service 全无 7. **已有亮点**:autoassignment 完整、auth 完整、automation 较完整、WebSocket/SSE 实现 --- ## 十、风险评估 | 风险 | 级别 | 说明 | |------|------|------| | Search 包标记 bak_offline | 高 | 搜索功能完全不可用,需决定重新实现还是解冻 | | Conversation 65% 覆盖 | 高 | 核心功能缺 7 action,影响日常使用 | | 30 个 handler 未注册路由 | 中 | 功能已实现但无法访问,注册后立即可用 | | 33 个 stub 方法 | 中 | 方法存在但返回空,需逐一实现真实逻辑 | | 渠道集成缺失 | 中 | Instagram/IMAP/CRM 等渠道无法接入 | | Service 层差 100 个 | 高 | 大量业务逻辑(过滤、批量操作、通知推送等)缺失 |