fix(chat): 修复一键清理未读失败

This commit is contained in:
yml2213
2026-08-25 19:32:04 +08:00
parent 52dcb18c96
commit 16237dcefc
6 changed files with 85 additions and 2 deletions
+28
View File
@@ -239,3 +239,31 @@ func (r *Repository) MarkRead(ctx context.Context, principal Principal, conversa
}
return nil
}
// MarkAllAdminConversationsRead advances one admin's read cursor for every conversation in one transaction.
func (r *Repository) MarkAllAdminConversationsRead(ctx context.Context, adminID uint64) error {
now := time.Now()
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
// 先补齐状态行,再更新游标。拆成两步可兼容本地 MySQL/MariaDB 对
// INSERT ... SELECT 同表读取并 ON DUPLICATE KEY UPDATE 的限制。
if err := tx.Exec(`
INSERT INTO chat_admin_conversation_states
(conversation_id, admin_user_id, remark, last_read_message_id, last_read_at)
SELECT c.id, ?, COALESCE(existing.remark, ''), COALESCE(c.last_message_id, 0), ?
FROM chat_conversations AS c
LEFT JOIN chat_admin_conversation_states AS existing
ON existing.conversation_id = c.id AND existing.admin_user_id = ?
WHERE existing.id IS NULL`, adminID, now, adminID).Error; err != nil {
return err
}
return tx.Exec(`
UPDATE chat_admin_conversation_states AS cas
JOIN chat_conversations AS c ON c.id = cas.conversation_id
SET cas.last_read_message_id = c.last_message_id,
cas.last_read_at = ?,
cas.updated_at = CURRENT_TIMESTAMP
WHERE cas.admin_user_id = ?
AND c.last_message_id IS NOT NULL
AND cas.last_read_message_id < c.last_message_id`, now, adminID).Error
})
}