实现租户系统设置落库:欢迎语、工作时间与通知开关
- 新增 TenantSetting 模型与 /api/settings 读写接口 - 设置页接通基本资料、自动回复、工作时间、通知偏好 - Widget 初始化使用欢迎语/离线提示,非工作时间不自动分配 - 补充设置持久化与 Widget 提示集成测试
This commit is contained in:
@@ -125,8 +125,13 @@ func (h *WidgetHandler) Init(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
setting, _ := getOrCreateTenantSettings(channel.TenantID)
|
||||
withinWorkHours := isWithinWorkHours(setting, time.Now())
|
||||
// 非工作时间不自动分配,走留言/排队提示
|
||||
canServeNow := onlineCount > 0 && withinWorkHours
|
||||
|
||||
var assignedAgent *model.User
|
||||
if onlineCount > 0 {
|
||||
if canServeNow {
|
||||
assignedAgent, err = tryAutoAssign(&session)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 500, "message": "自动分配失败"})
|
||||
@@ -138,22 +143,55 @@ func (h *WidgetHandler) Init(c *gin.Context) {
|
||||
ws.DefaultHub.BroadcastToTenantStaff(session.TenantID, payload)
|
||||
}
|
||||
|
||||
agentsOnline := onlineCount > 0
|
||||
resp := gin.H{
|
||||
"session_id": session.ID,
|
||||
"customer_id": customer.ID,
|
||||
"channel_id": channel.ID,
|
||||
"tenant_id": channel.TenantID,
|
||||
"visitor_token": visitorToken,
|
||||
"agents_online": agentsOnline,
|
||||
"session_status": session.Status,
|
||||
welcome := defaultWelcomeMessage
|
||||
offlinePrompt := offlineLeavePrompt
|
||||
agentNickname := defaultAgentNickname
|
||||
displayName := "在线客服"
|
||||
worktimePrompt := defaultWorktimePrompt
|
||||
if setting != nil {
|
||||
if setting.WelcomeMessage != "" {
|
||||
welcome = setting.WelcomeMessage
|
||||
}
|
||||
if setting.OfflinePrompt != "" {
|
||||
offlinePrompt = setting.OfflinePrompt
|
||||
}
|
||||
if setting.AgentNickname != "" {
|
||||
agentNickname = setting.AgentNickname
|
||||
}
|
||||
if setting.DisplayName != "" {
|
||||
displayName = setting.DisplayName
|
||||
}
|
||||
if setting.WorktimePrompt != "" {
|
||||
worktimePrompt = setting.WorktimePrompt
|
||||
}
|
||||
}
|
||||
if !agentsOnline {
|
||||
resp["offline_prompt"] = offlineLeavePrompt
|
||||
// 非工作时间优先展示非工作时间提示
|
||||
if !withinWorkHours {
|
||||
offlinePrompt = worktimePrompt
|
||||
}
|
||||
|
||||
resp := gin.H{
|
||||
"session_id": session.ID,
|
||||
"customer_id": customer.ID,
|
||||
"channel_id": channel.ID,
|
||||
"tenant_id": channel.TenantID,
|
||||
"visitor_token": visitorToken,
|
||||
"agents_online": canServeNow,
|
||||
"online_agent_count": onlineCount,
|
||||
"within_work_hours": withinWorkHours,
|
||||
"session_status": session.Status,
|
||||
"welcome_message": welcome,
|
||||
"display_name": displayName,
|
||||
"agent_nickname": agentNickname,
|
||||
}
|
||||
if !canServeNow {
|
||||
resp["offline_prompt"] = offlinePrompt
|
||||
}
|
||||
if assignedAgent != nil {
|
||||
resp["agent_id"] = assignedAgent.ID
|
||||
resp["agent_name"] = assignedAgent.Nickname
|
||||
} else if canServeNow {
|
||||
resp["agent_name"] = agentNickname
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"code": 0, "data": resp})
|
||||
|
||||
Reference in New Issue
Block a user