18c9354095
- 注入数据库、运行时配置、统一响应、文件存储和平台 AI 能力,补充业务读写工具与客户快捷操作契约。 - 移除模块内重复的组织、客户、工单、标签、技能、旧工作流、MCP 和迁移实现,将身份权限与业务主体交由宿主管理。 - 使用 libSQL 重构向量存储,并完善图片消息、访客身份、排队调度、企业微信和支持聊天页面。 - 统一 HTTP、DTO 与 WebSocket 的 snake_case 协议,补齐模块初始化、业务动作和公共载荷等回归测试。
55 lines
2.0 KiB
Go
55 lines
2.0 KiB
Go
package event_handlers
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"strings"
|
|
|
|
"code.tczkiot.com/wlw/ai-agent/internal/events"
|
|
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/request"
|
|
"code.tczkiot.com/wlw/ai-agent/internal/pkg/eventbus"
|
|
"code.tczkiot.com/wlw/ai-agent/internal/pkg/i18nx"
|
|
"code.tczkiot.com/wlw/ai-agent/internal/services"
|
|
)
|
|
|
|
func init() {
|
|
eventbus.
|
|
Register[events.ConversationAssignedEvent]().
|
|
Subscribe(handleConversationAssignedInAppNotification)
|
|
}
|
|
|
|
func handleConversationAssignedInAppNotification(ctx context.Context, event events.ConversationAssignedEvent) error {
|
|
if event.ConversationID <= 0 || event.ToUserID <= 0 {
|
|
return nil
|
|
}
|
|
conversation := services.ConversationService.Get(event.ConversationID)
|
|
if conversation == nil {
|
|
return nil
|
|
}
|
|
content := i18nx.Getf(i18nx.DefaultLocale, "notification.conversationAssigned.line", conversation.ID)
|
|
if summary := strings.TrimSpace(services.ConversationService.BuildConversationSummary(conversation)); summary != "" {
|
|
content = content + "\n" + summary
|
|
}
|
|
if reason := strings.TrimSpace(event.Reason); reason != "" {
|
|
reasonKey := "notification.conversationAssigned.reason"
|
|
if strings.TrimSpace(event.AssignType) == events.ConversationAssignTypeTransfer {
|
|
reasonKey = "notification.conversationTransferred.reason"
|
|
}
|
|
content = content + "\n" + i18nx.Getf(i18nx.DefaultLocale, reasonKey, reason)
|
|
}
|
|
_, err := services.NotificationService.CreateAndPush(request.CreateNotificationRequest{
|
|
RecipientUserID: event.ToUserID,
|
|
Title: conversationAssignedNotifyTitle(event.AssignType),
|
|
Content: content,
|
|
NotificationType: "conversation_assigned",
|
|
BizType: "conversation",
|
|
BizID: conversation.ID,
|
|
ActionURL: fmt.Sprintf("/dashboard/conversations?conversation_id=%d", conversation.ID),
|
|
})
|
|
if err != nil {
|
|
slog.Error("create conversation assigned in-app notification failed", "error", err, "conversationId", event.ConversationID, "toUserId", event.ToUserID)
|
|
}
|
|
return nil
|
|
}
|