From 444124457585238eb6468117fe75adfd32b73185 Mon Sep 17 00:00:00 2001 From: chenchun Date: Thu, 29 Jan 2026 14:40:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=BD=AF=E5=88=A0=E9=99=A4=E5=8F=8A=E6=89=B9=E9=87=8F=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/MessageGetListInput.cs | 14 +++++ .../Services/Chat/MessageService.cs | 51 +++++++++++++++++++ .../Entities/Chat/MessageAggregateRoot.cs | 5 ++ 3 files changed, 70 insertions(+) diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/MessageGetListInput.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/MessageGetListInput.cs index 89af105c..911b18d0 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/MessageGetListInput.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/MessageGetListInput.cs @@ -7,4 +7,18 @@ public class MessageGetListInput:PagedAllResultRequestDto { [Required] public Guid SessionId { get; set; } +} + +public class MessageDeleteInput +{ + /// + /// 要删除的消息Id列表 + /// + [Required] + public List Ids { get; set; } = new(); + + /// + /// 是否同时隐藏后续消息(同一会话中时间大于当前消息的所有消息) + /// + public bool IsDeleteSubsequent { get; set; } = false; } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/MessageService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/MessageService.cs index 6084c4dd..56101112 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/MessageService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/MessageService.cs @@ -35,8 +35,59 @@ public class MessageService : ApplicationService var entities = await _repository._DbQueryable .Where(x => x.SessionId == input.SessionId) .Where(x=>x.UserId == userId) + .Where(x => !x.IsHidden) .OrderBy(x => x.Id) .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); return new PagedResultDto(total, entities.Adapt>()); } + + /// + /// 删除消息(软删除,标记为隐藏) + /// + /// 删除参数,包含消息Id列表和是否删除后续消息的开关 + [Authorize] + public async Task DeleteAsync([FromBody] MessageDeleteInput input) + { + var userId = CurrentUser.GetId(); + + // 获取要删除的消息 + var messages = await _repository._DbQueryable + .Where(x => input.Ids.Contains(x.Id)) + .Where(x => x.UserId == userId) + .ToListAsync(); + + if (messages.Count == 0) + { + return; + } + + // 标记当前消息为隐藏 + var idsToHide = messages.Select(x => x.Id).ToList(); + + // 如果需要删除后续消息 + if (input.IsDeleteSubsequent) + { + foreach (var message in messages) + { + // 获取同一会话中时间大于当前消息的所有消息Id + var subsequentIds = await _repository._DbQueryable + .Where(x => x.SessionId == message.SessionId) + .Where(x => x.UserId == userId) + .Where(x => x.CreationTime > message.CreationTime) + .Where(x => !x.IsHidden) + .Select(x => x.Id) + .ToListAsync(); + + idsToHide.AddRange(subsequentIds); + } + + idsToHide = idsToHide.Distinct().ToList(); + } + + // 批量更新为隐藏状态 + await _repository._Db.Updateable() + .SetColumns(x => x.IsHidden == true) + .Where(x => idsToHide.Contains(x.Id)) + .ExecuteCommandAsync(); + } } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/MessageAggregateRoot.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/MessageAggregateRoot.cs index 69a43156..a704e924 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/MessageAggregateRoot.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/MessageAggregateRoot.cs @@ -75,4 +75,9 @@ public class MessageAggregateRoot : FullAuditedAggregateRoot [SugarColumn(IsOwnsOne = true)] public TokenUsageValueObject TokenUsage { get; set; } = new TokenUsageValueObject(); public MessageTypeEnum MessageType { get; set; } + + /// + /// 是否隐藏(软删除标记,隐藏后不返回给前端) + /// + public bool IsHidden { get; set; } = false; } \ No newline at end of file