完善访客结束流程与转接可见性

- 会话结束后支持重新咨询,评价改为选星+快捷文案再提交
- 转接/分配事件写入操作人与目标坐席,工作台时间线与备注可见
This commit is contained in:
yml2213
2026-07-15 14:49:55 +08:00
parent 1359bfe597
commit a1336c630b
3 changed files with 422 additions and 125 deletions
+52 -5
View File
@@ -594,11 +594,39 @@ func (h *SessionHandler) Assign(c *gin.Context) {
return
}
model.DB.Create(&model.SessionEvent{SessionID: session.ID, OperatorID: middleware.GetUserID(c), Action: "assign", Detail: "会话分配"})
operatorID := middleware.GetUserID(c)
operatorName := userDisplayName(operatorID)
targetName := userDisplayName(req.AgentID)
detail := "会话分配给 " + targetName
if operatorID == req.AgentID {
detail = operatorName + " 领取了会话"
} else {
detail = operatorName + " 将会话分配给 " + targetName
}
model.DB.Create(&model.SessionEvent{
SessionID: session.ID,
OperatorID: operatorID,
Action: "assign",
Detail: detail,
})
session.AgentID = &req.AgentID
session.Status = "active"
broadcastSessionUpdate(session)
middleware.JSON(c, gin.H{"message": "分配成功"})
middleware.JSON(c, gin.H{"message": "分配成功", "detail": detail})
}
func userDisplayName(userID uint) string {
var user model.User
if err := model.DB.Select("id", "nickname", "username").First(&user, userID).Error; err != nil {
return "未知坐席"
}
if strings.TrimSpace(user.Nickname) != "" {
return user.Nickname
}
if strings.TrimSpace(user.Username) != "" {
return user.Username
}
return "未知坐席"
}
func (h *SessionHandler) Transfer(c *gin.Context) {
@@ -621,6 +649,19 @@ func (h *SessionHandler) Transfer(c *gin.Context) {
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "目标客服不存在或不可用"})
return
}
if session.AgentID != nil && *session.AgentID == req.AgentID {
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "不能转接给当前接待坐席"})
return
}
operatorID := middleware.GetUserID(c)
operatorName := userDisplayName(operatorID)
targetName := userDisplayName(req.AgentID)
fromName := ""
if session.AgentID != nil {
fromName = userDisplayName(*session.AgentID)
}
result := model.DB.Model(&model.Session{}).
Where("id = ? AND tenant_id = ? AND status = ?", session.ID, session.TenantID, "active").
Updates(map[string]interface{}{"agent_id": req.AgentID, "last_read_seq": 0})
@@ -633,16 +674,22 @@ func (h *SessionHandler) Transfer(c *gin.Context) {
return
}
// 详情写明「谁 → 谁」,便于接手坐席在备注/时间线中一眼看清
detail := operatorName + " 转接给 " + targetName
if fromName != "" && fromName != operatorName {
detail = operatorName + " 将会话由 " + fromName + " 转接给 " + targetName
}
model.DB.Create(&model.SessionEvent{
SessionID: session.ID,
OperatorID: middleware.GetUserID(c),
OperatorID: operatorID,
Action: "transfer",
Detail: "会话转接",
Detail: detail,
})
session.AgentID = &req.AgentID
broadcastSessionUpdate(session)
middleware.JSON(c, gin.H{"message": "转接成功"})
middleware.JSON(c, gin.H{"message": "转接成功", "detail": detail})
}
func (h *SessionHandler) End(c *gin.Context) {