feat: 饮食记录逻辑重构 + 通知管理分隔线修复 + 多页面 UI 调整

- 饮食: 新增 DietCommentaryPolicy + diet_record_logic, 饮食记录逻辑抽取复用
- 通知管理: 分隔线改为仿通知中心样式, 跳过图标区域只留文字下方
- 侧边栏: 对话记录操作栏浮层修复 + 常用功能间距收紧
- 智能体: 欢迎卡片去 400ms 延迟 + 胶囊去阴影
- 后端: AI 会话仓库新增方法 + 饮食评论策略 + 健康记录规则调整
- 其他: api_client IP 适配 + 多页面 UI 微调 + 新增测试
This commit is contained in:
MingNian
2026-07-12 22:49:38 +08:00
parent d82e006cf4
commit 335a3e6440
33 changed files with 2056 additions and 1283 deletions

View File

@@ -1,4 +1,5 @@
using Health.Application.Medications;
using Health.Application.AI;
using Health.Domain.Entities;
using Health.Domain.Enums;
using Health.Infrastructure.AI;
@@ -13,6 +14,50 @@ namespace Health.Tests;
public sealed class PersistencePipelineTests
{
[Fact]
public async Task ConversationCleanup_DeletesOnlyLegacyDietCommentaryArtifacts()
{
await using var db = CreateDbContext();
var userId = Guid.NewGuid();
var artifact = new Conversation
{
Id = Guid.NewGuid(),
UserId = userId,
AgentType = AgentType.Default,
};
artifact.Messages.Add(new ConversationMessage
{
Id = Guid.NewGuid(),
ConversationId = artifact.Id,
Role = MessageRole.User,
Content = DietCommentaryPolicy.LegacyPromptPrefix + "食物为:米饭",
});
var normal = new Conversation
{
Id = Guid.NewGuid(),
UserId = userId,
AgentType = AgentType.Default,
};
normal.Messages.Add(new ConversationMessage
{
Id = Guid.NewGuid(),
ConversationId = normal.Id,
Role = MessageRole.User,
Content = "请分析我今天吃的米饭",
});
db.Conversations.AddRange(artifact, normal);
await db.SaveChangesAsync();
var repository = new EfAiConversationRepository(db);
var deleted = await repository.DeleteLegacyDietCommentaryArtifactsAsync(
userId,
DietCommentaryPolicy.LegacyPromptPrefix,
CancellationToken.None);
Assert.Equal(1, deleted);
Assert.Equal(normal.Id, Assert.Single(db.Conversations).Id);
}
[Fact]
public async Task AiConfirmation_CanOnlyBeTakenOnceByOwner()
{