feat: add manual "转人工" (request human) action for conversations

- Backend: RequestHuman service method changes status from AI_SERVING to PENDING
- Backend: POST /api/dashboard/conversation/request-human endpoint
- Frontend: requestHumanConversation API client
- Frontend: "转人工" button in conversation list dropdown and detail dialog
This commit is contained in:
Aibo117
2026-05-26 15:46:09 +08:00
parent c5d0317bb6
commit 63dec1d8f1
6 changed files with 99 additions and 1 deletions
+32
View File
@@ -374,6 +374,38 @@ func (s *conversationService) TryOffHoursHandoffByAI(conversationID int64, aiAge
return handled, err
}
func (s *conversationService) RequestHuman(conversationID int64, operator *dto.AuthPrincipal) error {
if operator == nil {
return errorsx.Unauthorized("未登录或登录已过期")
}
conversation := s.Get(conversationID)
if conversation == nil {
return errorsx.InvalidParam("会话不存在")
}
if conversation.Status != enums.IMConversationStatusAIServing {
return errorsx.InvalidParam("当前会话状态不允许转人工")
}
now := time.Now()
return sqls.WithTransaction(func(ctx *sqls.TxContext) error {
if err := repositories.ConversationRepository.Updates(ctx.Tx, conversationID, map[string]any{
"status": enums.IMConversationStatusPending,
"update_user_id": operator.UserID,
"update_user_name": operator.Username,
"updated_at": now,
}); err != nil {
return err
}
return ConversationEventLogService.CreateEvent(ctx, conversationID,
enums.IMEventTypeTransfer, enums.IMSenderTypeSystem, 0,
"管理员手动转人工",
buildEventPayload(map[string]any{
"operator": operator.Username,
"fromStatus": enums.IMConversationStatusAIServing,
"toStatus": enums.IMConversationStatusPending,
}))
})
}
func (s *conversationService) CloseConversation(conversationID int64, closeReason string, operator *dto.AuthPrincipal) error {
if operator == nil {
return errorsx.Unauthorized("未登录或登录已过期")