feat: 后端架构重构 — Endpoint→Service→Repository分层 + AI确认机制 + 异步任务持久化
- 核心业务拆分为 Endpoint → Application Service → Repository 三层 - AI写入操作必须用户确认后才写库(确认卡片机制) - 报告/饮食/用药分析改为持久化任务队列(原子领取/重试/重启恢复) - 运动计划修复: 连续真实日期替代周模板 - 用药提醒去重 + 通知Outbox预留 - 认证收拢到AuthService, 管理员收拢到AdminService - AI会话加用户归属校验防串号 - 提示词调整为患者视角 - 开发假数据已关闭 - 21/21测试通过, 0警告0错误
This commit is contained in:
63
backend/src/Health.Application/AI/AiConversationContracts.cs
Normal file
63
backend/src/Health.Application/AI/AiConversationContracts.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using Health.Domain.Entities;
|
||||
using Health.Domain.Enums;
|
||||
|
||||
namespace Health.Application.AI;
|
||||
|
||||
public sealed record AiConversationDto(
|
||||
Guid Id,
|
||||
string AgentType,
|
||||
string? Title,
|
||||
string? Summary,
|
||||
int MessageCount,
|
||||
DateTime CreatedAt,
|
||||
DateTime UpdatedAt);
|
||||
|
||||
public sealed record AiConversationMessageDto(
|
||||
Guid Id,
|
||||
string Role,
|
||||
string Content,
|
||||
string? Intent,
|
||||
string? MetadataJson,
|
||||
DateTime CreatedAt);
|
||||
|
||||
public sealed record OpenConversationResult(
|
||||
bool Found,
|
||||
bool Created,
|
||||
Guid ConversationId);
|
||||
|
||||
public interface IAiConversationService
|
||||
{
|
||||
Task<OpenConversationResult> OpenAsync(Guid userId, Guid? conversationId, AgentType agentType, string firstMessage, CancellationToken ct);
|
||||
Task AddUserMessageAsync(Guid conversationId, string content, CancellationToken ct);
|
||||
Task AddAssistantMessageAsync(Guid conversationId, string content, CancellationToken ct);
|
||||
Task<IReadOnlyList<AiConversationMessageDto>> GetRecentMessagesAsync(Guid conversationId, int limit, CancellationToken ct);
|
||||
Task<IReadOnlyList<AiConversationDto>> ListAsync(Guid userId, CancellationToken ct);
|
||||
Task<IReadOnlyList<AiConversationMessageDto>> GetMessagesAsync(Guid userId, Guid conversationId, CancellationToken ct);
|
||||
Task DeleteAsync(Guid userId, Guid conversationId, CancellationToken ct);
|
||||
}
|
||||
|
||||
public interface IAiConversationRepository
|
||||
{
|
||||
Task<Conversation?> GetOwnedAsync(Guid userId, Guid conversationId, CancellationToken ct);
|
||||
Task<Conversation?> GetAsync(Guid conversationId, CancellationToken ct);
|
||||
Task<IReadOnlyList<Conversation>> ListAsync(Guid userId, CancellationToken ct);
|
||||
Task<IReadOnlyList<ConversationMessage>> GetMessagesAsync(Guid conversationId, CancellationToken ct);
|
||||
Task<IReadOnlyList<ConversationMessage>> GetRecentMessagesAsync(Guid conversationId, int limit, CancellationToken ct);
|
||||
Task AddConversationAsync(Conversation conversation, CancellationToken ct);
|
||||
Task AddMessageAsync(ConversationMessage message, CancellationToken ct);
|
||||
void Delete(Conversation conversation);
|
||||
Task SaveChangesAsync(CancellationToken ct);
|
||||
}
|
||||
|
||||
public interface IPatientContextService
|
||||
{
|
||||
Task<string> BuildAsync(Guid userId, CancellationToken ct);
|
||||
}
|
||||
|
||||
public sealed record AiConfirmedWriteResult(int Code, object? Data, string? Message);
|
||||
|
||||
public interface IAiToolExecutionService
|
||||
{
|
||||
Task<object> ExecuteAsync(string toolName, string arguments, Guid userId, CancellationToken ct);
|
||||
Task<AiConfirmedWriteResult> ConfirmAsync(Guid commandId, Guid userId, CancellationToken ct);
|
||||
}
|
||||
Reference in New Issue
Block a user