feat: 饮食记录逻辑重构 + 通知管理分隔线修复 + 多页面 UI 调整
- 饮食: 新增 DietCommentaryPolicy + diet_record_logic, 饮食记录逻辑抽取复用 - 通知管理: 分隔线改为仿通知中心样式, 跳过图标区域只留文字下方 - 侧边栏: 对话记录操作栏浮层修复 + 常用功能间距收紧 - 智能体: 欢迎卡片去 400ms 延迟 + 胶囊去阴影 - 后端: AI 会话仓库新增方法 + 饮食评论策略 + 健康记录规则调整 - 其他: api_client IP 适配 + 多页面 UI 微调 + 新增测试
This commit is contained in:
@@ -223,6 +223,7 @@ public sealed class ApplicationServiceTests
|
||||
public Task<IReadOnlyList<ConversationMessage>> GetRecentMessagesAsync(Guid conversationId, int limit, CancellationToken ct) => Task.FromResult<IReadOnlyList<ConversationMessage>>([]);
|
||||
public Task AddConversationAsync(Conversation value, CancellationToken ct) => Task.CompletedTask;
|
||||
public Task AddMessageAsync(ConversationMessage message, CancellationToken ct) => Task.CompletedTask;
|
||||
public Task<int> DeleteLegacyDietCommentaryArtifactsAsync(Guid userId, string promptPrefix, CancellationToken ct) => Task.FromResult(0);
|
||||
public void Delete(Conversation value) { }
|
||||
public Task SaveChangesAsync(CancellationToken ct) => Task.CompletedTask;
|
||||
}
|
||||
|
||||
56
backend/tests/Health.Tests/diet_commentary_tests.cs
Normal file
56
backend/tests/Health.Tests/diet_commentary_tests.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using Health.Application.AI;
|
||||
using Health.Domain.Entities;
|
||||
using Health.Domain.Enums;
|
||||
|
||||
namespace Health.Tests;
|
||||
|
||||
public sealed class DietCommentaryTests
|
||||
{
|
||||
[Fact]
|
||||
public void FoodDescription_ContainsOnlyStructuredFoodData()
|
||||
{
|
||||
var result = DietCommentaryPolicy.BuildFoodDescription(
|
||||
[
|
||||
new DietCommentaryFood("番茄炒蛋", "半盘", 220),
|
||||
new DietCommentaryFood("米饭", "一碗", 260),
|
||||
]);
|
||||
|
||||
Assert.Equal("番茄炒蛋(半盘,220千卡)、米饭(一碗,260千卡)", result);
|
||||
Assert.DoesNotContain("请结合", result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LegacyArtifact_RequiresEveryUserMessageToUseInternalPrefix()
|
||||
{
|
||||
var artifact = new Conversation
|
||||
{
|
||||
Messages =
|
||||
[
|
||||
new ConversationMessage
|
||||
{
|
||||
Role = MessageRole.User,
|
||||
Content = DietCommentaryPolicy.LegacyPromptPrefix + "食物为:米饭",
|
||||
},
|
||||
new ConversationMessage
|
||||
{
|
||||
Role = MessageRole.Assistant,
|
||||
Content = "注意搭配蔬菜",
|
||||
},
|
||||
],
|
||||
};
|
||||
var normal = new Conversation
|
||||
{
|
||||
Messages =
|
||||
[
|
||||
new ConversationMessage
|
||||
{
|
||||
Role = MessageRole.User,
|
||||
Content = "我想了解今天的饮食记录",
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
Assert.True(DietCommentaryPolicy.IsLegacyArtifact(artifact.Messages));
|
||||
Assert.False(DietCommentaryPolicy.IsLegacyArtifact(normal.Messages));
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user