refactor: 将客服后端重构为宿主可嵌入模块

- 注入数据库、运行时配置、统一响应、文件存储和平台 AI 能力,补充业务读写工具与客户快捷操作契约。

- 移除模块内重复的组织、客户、工单、标签、技能、旧工作流、MCP 和迁移实现,将身份权限与业务主体交由宿主管理。

- 使用 libSQL 重构向量存储,并完善图片消息、访客身份、排队调度、企业微信和支持聊天页面。

- 统一 HTTP、DTO 与 WebSocket 的 snake_case 协议,补齐模块初始化、业务动作和公共载荷等回归测试。
This commit is contained in:
t
2026-08-28 22:23:13 +08:00
parent 6845c728f8
commit 18c9354095
377 changed files with 13199 additions and 22881 deletions
+6 -97
View File
@@ -13,6 +13,8 @@ func registerApiChannelRoutes(group *gin.RouterGroup) {
}
func registerApiConversationRoutes(group *gin.RouterGroup) {
group.GET("/quick_actions", api.ConversationGetQuick_actions)
group.POST("/quick_action", api.ConversationPostQuick_action)
group.GET("/:id", api.ConversationGetBy)
group.POST("/close", api.ConversationPostClose)
group.POST("/create_or_match", api.ConversationPostCreate_or_match)
@@ -30,79 +32,22 @@ func registerDashboardDashboardRoutes(group *gin.RouterGroup) {
group.GET("/overview", dashboard.DashboardGetOverview)
}
func registerDashboardCompanyRoutes(group *gin.RouterGroup) {
group.GET("/:id", dashboard.CompanyGetBy)
group.POST("/create", dashboard.CompanyPostCreate)
group.POST("/delete", dashboard.CompanyPostDelete)
group.Any("/list", dashboard.CompanyAnyList)
group.POST("/update", dashboard.CompanyPostUpdate)
group.POST("/update_status", dashboard.CompanyPostUpdate_status)
}
func registerDashboardCustomerRoutes(group *gin.RouterGroup) {
group.GET("/:id", dashboard.CustomerGetBy)
group.POST("/create", dashboard.CustomerPostCreate)
group.POST("/delete", dashboard.CustomerPostDelete)
group.POST("/list", dashboard.CustomerPostList)
group.POST("/save_profile", dashboard.CustomerPostSave_profile)
group.POST("/update", dashboard.CustomerPostUpdate)
group.POST("/update_status", dashboard.CustomerPostUpdate_status)
}
func registerDashboardCustomerContactRoutes(group *gin.RouterGroup) {
group.POST("/create", dashboard.CustomerContactPostCreate)
group.POST("/delete", dashboard.CustomerContactPostDelete)
group.Any("/list", dashboard.CustomerContactAnyList)
group.POST("/update", dashboard.CustomerContactPostUpdate)
}
func registerDashboardTagRoutes(group *gin.RouterGroup) {
group.GET("/:id", dashboard.TagGetBy)
group.POST("/create", dashboard.TagPostCreate)
group.POST("/delete", dashboard.TagPostDelete)
group.Any("/list", dashboard.TagAnyList)
group.GET("/list_all", dashboard.TagGetList_all)
group.POST("/update", dashboard.TagPostUpdate)
group.POST("/update_sort", dashboard.TagPostUpdate_sort)
group.POST("/update_status", dashboard.TagPostUpdate_status)
}
func registerDashboardConversationRoutes(group *gin.RouterGroup) {
group.GET("/:id", dashboard.ConversationGetBy)
group.POST("/add_tag", dashboard.ConversationPostAdd_tag)
group.POST("/assign", dashboard.ConversationPostAssign)
group.POST("/close", dashboard.ConversationPostClose)
group.Any("/conversations", dashboard.ConversationAnyConversations)
group.POST("/dispatch", dashboard.ConversationPostDispatch)
group.POST("/link_customer", dashboard.ConversationPostLink_customer)
group.Any("/list", dashboard.ConversationAnyList)
group.Any("/message_list", dashboard.ConversationAnyMessage_list)
group.POST("/read", dashboard.ConversationPostRead)
group.POST("/recall_message", dashboard.ConversationPostRecall_message)
group.POST("/remove_tag", dashboard.ConversationPostRemove_tag)
group.POST("/send_message", dashboard.ConversationPostSend_message)
group.POST("/transfer", dashboard.ConversationPostTransfer)
group.POST("/upload_attachment", dashboard.ConversationPostUpload_attachment)
group.POST("/upload_image", dashboard.ConversationPostUpload_image)
}
func registerDashboardTicketRoutes(group *gin.RouterGroup) {
group.GET("/:id", dashboard.TicketGetBy)
group.POST("/assign", dashboard.TicketPostAssign)
group.POST("/change_status", dashboard.TicketPostChange_status)
group.POST("/create", dashboard.TicketPostCreate)
group.POST("/create_from_conversation", dashboard.TicketPostCreate_from_conversation)
group.POST("/delete_view", dashboard.TicketPostDelete_view)
group.POST("/link_customer", dashboard.TicketPostLink_customer)
group.Any("/list", dashboard.TicketAnyList)
group.POST("/progress/create", dashboard.TicketPostProgressCreate)
group.Any("/progress/list", dashboard.TicketAnyProgressList)
group.POST("/save_view", dashboard.TicketPostSave_view)
group.Any("/summary", dashboard.TicketAnySummary)
group.POST("/update", dashboard.TicketPostUpdate)
group.Any("/view_list", dashboard.TicketAnyView_list)
}
func registerDashboardNotificationRoutes(group *gin.RouterGroup) {
group.Any("/list", dashboard.NotificationAnyList)
group.POST("/mark_all_read", dashboard.NotificationPostMark_all_read)
@@ -178,25 +123,6 @@ func registerDashboardAIAgentRoutes(group *gin.RouterGroup) {
group.POST("/update_status", dashboard.AIAgentPostUpdate_status)
}
func registerDashboardAIWorkflowRoutes(group *gin.RouterGroup) {
group.POST("/create", dashboard.AIWorkflowPostCreate)
group.POST("/update", dashboard.AIWorkflowPostUpdate)
group.POST("/delete", dashboard.AIWorkflowPostDelete)
group.POST("/restore-version", dashboard.AIWorkflowPostRestoreVersion)
group.Any("/list", dashboard.AIWorkflowAnyList)
group.GET("/node-spec/list", dashboard.AIWorkflowGetNodeSpecList)
group.GET("/default-definition", dashboard.AIWorkflowGetDefaultDefinition)
group.GET("/template/list", dashboard.AIWorkflowGetTemplateList)
group.POST("/validate", dashboard.AIWorkflowPostValidate)
group.POST("/publish", dashboard.AIWorkflowPostPublish)
group.Any("/run/list", dashboard.AIWorkflowAnyRunList)
group.GET("/run/:id", dashboard.AIWorkflowGetRunBy)
group.Any("/version/list", dashboard.AIWorkflowAnyVersionList)
group.GET("/version/:id", dashboard.AIWorkflowGetVersionBy)
group.GET("/:id/usage", dashboard.AIWorkflowGetUsage)
group.GET("/:id", dashboard.AIWorkflowGetBy)
}
func registerDashboardAgentRunRoutes(group *gin.RouterGroup) {
group.Any("/metrics", dashboard.AgentRunAnyMetrics)
group.POST("/evaluate", dashboard.AgentRunPostEvaluate)
@@ -216,6 +142,10 @@ func registerDashboardAIConfigRoutes(group *gin.RouterGroup) {
group.POST("/update_status", dashboard.AIConfigPostUpdate_status)
}
func registerDashboardPlatformAIRoutes(group *gin.RouterGroup) {
group.GET("/status", dashboard.PlatformAIGetStatus)
}
func registerDashboardAssetRoutes(group *gin.RouterGroup) {
group.GET("/:id", dashboard.AssetGetBy)
group.POST("/create", dashboard.AssetPostCreate)
@@ -276,27 +206,6 @@ func registerDashboardKnowledgeRetrieveLogRoutes(group *gin.RouterGroup) {
group.Any("/list", dashboard.KnowledgeRetrieveLogAnyList)
}
func registerDashboardSkillDefinitionRoutes(group *gin.RouterGroup) {
group.GET("/:id", dashboard.SkillDefinitionGetBy)
group.POST("/create", dashboard.SkillDefinitionPostCreate)
group.POST("/debug_resume", dashboard.SkillDefinitionPostDebug_resume)
group.POST("/debug_run", dashboard.SkillDefinitionPostDebug_run)
group.POST("/delete", dashboard.SkillDefinitionPostDelete)
group.Any("/list", dashboard.SkillDefinitionAnyList)
group.GET("/list_all", dashboard.SkillDefinitionGetList_all)
group.POST("/restore", dashboard.SkillDefinitionPostRestore)
group.POST("/update", dashboard.SkillDefinitionPostUpdate)
group.POST("/update_status", dashboard.SkillDefinitionPostUpdate_status)
}
func registerDashboardMCPRoutes(group *gin.RouterGroup) {
group.POST("/call_tool", dashboard.MCPPostCall_tool)
group.Any("/catalog", dashboard.MCPAnyCatalog)
group.Any("/list_servers", dashboard.MCPAnyList_servers)
group.POST("/list_tools", dashboard.MCPPostList_tools)
group.POST("/test_connection", dashboard.MCPPostTest_connection)
}
func registerThirdWechatRoutes(group *gin.RouterGroup) {
group.GET("/callback", third.WechatGetCallback)
group.POST("/callback", third.WechatPostCallback)