feat: 后端架构重构 — Endpoint→Service→Repository分层 + AI确认机制 + 异步任务持久化

- 核心业务拆分为 Endpoint → Application Service → Repository 三层
- AI写入操作必须用户确认后才写库(确认卡片机制)
- 报告/饮食/用药分析改为持久化任务队列(原子领取/重试/重启恢复)
- 运动计划修复: 连续真实日期替代周模板
- 用药提醒去重 + 通知Outbox预留
- 认证收拢到AuthService, 管理员收拢到AdminService
- AI会话加用户归属校验防串号
- 提示词调整为患者视角
- 开发假数据已关闭
- 21/21测试通过, 0警告0错误
This commit is contained in:
MingNian
2026-06-20 20:41:42 +08:00
parent c610417e29
commit 4d213b5a44
132 changed files with 6733 additions and 2856 deletions

View File

@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:developer';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:signalr_netcore/signalr_client.dart';
import '../core/api_client.dart' show baseUrl;
@@ -197,7 +198,7 @@ class ConsultationChatNotifier extends Notifier<ConsultationChatState> {
doctorTitle: doc['title']?.toString() ?? '',
doctorDepartment: doc['department']?.toString() ?? '',
);
} catch (e) { print('[Consultation]请求失败: $e'); }
} catch (e) { log('[Consultation]请求失败: $e'); }
}
Future<void> _loadMessages(String consultationId) async {
@@ -218,7 +219,7 @@ class ConsultationChatNotifier extends Notifier<ConsultationChatState> {
if (msgs.isNotEmpty) {
state = state.copyWith(messages: msgs);
}
} catch (e) { print('[Consultation]请求失败: $e'); }
} catch (e) { log('[Consultation]请求失败: $e'); }
}
Future<void> sendMessage(String text) async {
@@ -333,7 +334,7 @@ class ConsultationChatNotifier extends Notifier<ConsultationChatState> {
if (newMsgs.isNotEmpty) {
state = state.copyWith(messages: [...state.messages, ...newMsgs]);
}
} catch (e) { print('[Consultation]请求失败: $e'); }
} catch (e) { log('[Consultation]请求失败: $e'); }
}
void stop() {