完善访客结束流程与转接可见性
- 会话结束后支持重新咨询,评价改为选星+快捷文案再提交 - 转接/分配事件写入操作人与目标坐席,工作台时间线与备注可见
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user