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