feat: 添加客服在线状态和聊天粘贴图片功能

**客服在线状态:**
- 后端:添加 admin_users.support_status 字段(online/offline/busy)
- 接口:PUT /admin/me/support-status 更新状态
- 前端:管理员顶部导航显示状态切换器(仅客服权限可见)
- 转接对话框显示客服在线状态和智能排序(在线优先)

**聊天粘贴图片:**
- 用户端、移动端、管理端聊天输入框支持 Ctrl+V/Cmd+V 直接粘贴图片
- 自动调用图片压缩和上传逻辑,与文件选择上传保持一致
- 最多支持粘贴9张图片

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
yml
2026-06-05 19:23:34 +08:00
co-authored by Claude Opus 4.6
parent b380817940
commit 59093f8fd5
18 changed files with 308 additions and 36 deletions
+8 -6
View File
@@ -777,12 +777,13 @@ func (r *Repository) TransferConversation(principal Principal, conversationID ui
func (r *Repository) GetAvailableSupportAdmins() ([]SupportAdminDTO, error) {
// 查询所有有 chat:view 权限且状态为 active 的管理员
type adminRow struct {
ID uint64
Nickname string
ID uint64
Nickname string
SupportStatus string
}
var admins []adminRow
err := r.db.Table("admin_users AS au").
Select("DISTINCT au.id, COALESCE(NULLIF(au.nickname, ''), au.username) AS nickname").
Select("DISTINCT au.id, COALESCE(NULLIF(au.nickname, ''), au.username) AS nickname, au.support_status").
Joins("JOIN admin_user_roles AS aur ON aur.admin_user_id = au.id").
Joins("JOIN role_permissions AS rp ON rp.role_id = aur.role_id").
Joins("JOIN permissions AS p ON p.id = rp.permission_id").
@@ -817,9 +818,10 @@ func (r *Repository) GetAvailableSupportAdmins() ([]SupportAdminDTO, error) {
result := make([]SupportAdminDTO, len(admins))
for i, a := range admins {
result[i] = SupportAdminDTO{
ID: a.ID,
Nickname: a.Nickname,
ChatCount: loadMap[a.ID],
ID: a.ID,
Nickname: a.Nickname,
SupportStatus: a.SupportStatus,
ChatCount: loadMap[a.ID],
}
}
return result, nil