- 核心业务拆分为 Endpoint → Application Service → Repository 三层 - AI写入操作必须用户确认后才写库(确认卡片机制) - 报告/饮食/用药分析改为持久化任务队列(原子领取/重试/重启恢复) - 运动计划修复: 连续真实日期替代周模板 - 用药提醒去重 + 通知Outbox预留 - 认证收拢到AuthService, 管理员收拢到AdminService - AI会话加用户归属校验防串号 - 提示词调整为患者视角 - 开发假数据已关闭 - 21/21测试通过, 0警告0错误
97 lines
3.2 KiB
Dart
97 lines
3.2 KiB
Dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'auth_provider.dart';
|
|
import '../services/health_service.dart';
|
|
import '../services/admin_service.dart';
|
|
|
|
final exerciseServiceProvider = Provider<ExerciseService>((ref) {
|
|
return ExerciseService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
/// 健康数据服务
|
|
final healthServiceProvider = Provider<HealthService>((ref) {
|
|
return HealthService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
final userServiceProvider = Provider<UserService>((ref) {
|
|
return UserService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
final medicationServiceProvider = Provider<MedicationService>((ref) {
|
|
return MedicationService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
final dietServiceProvider = Provider<DietService>((ref) {
|
|
return DietService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
final followUpServiceProvider = Provider<FollowUpService>((ref) {
|
|
return FollowUpService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
final consultationServiceProvider = Provider<ConsultationService>((ref) {
|
|
return ConsultationService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
final adminServiceProvider = Provider<AdminService>((ref) {
|
|
return AdminService(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
/// 最新健康数据 Provider
|
|
final latestHealthProvider = FutureProvider<Map<String, dynamic>>((ref) async {
|
|
final service = ref.watch(healthServiceProvider);
|
|
return service.getLatest();
|
|
});
|
|
|
|
/// AI 录入数据后调用,刷新侧边栏
|
|
void refreshHealthData(WidgetRef ref) {
|
|
ref.invalidate(latestHealthProvider);
|
|
ref.invalidate(medicationListProvider);
|
|
}
|
|
|
|
/// 用药列表 Provider
|
|
final medicationListProvider = FutureProvider<List<Map<String, dynamic>>>((ref) async {
|
|
final service = ref.watch(medicationServiceProvider);
|
|
return service.getList();
|
|
});
|
|
|
|
final medicationReminderProvider = FutureProvider<List<Map<String, dynamic>>>((ref) async {
|
|
final service = ref.watch(medicationServiceProvider);
|
|
return service.getReminders();
|
|
});
|
|
|
|
/// 医生列表 Provider
|
|
final doctorListProvider = FutureProvider<List<Map<String, dynamic>>>((ref) async {
|
|
final service = ref.watch(consultationServiceProvider);
|
|
return service.getDoctors().timeout(const Duration(seconds: 8));
|
|
});
|
|
|
|
/// 问诊配额 Provider
|
|
final consultationQuotaProvider = FutureProvider<Map<String, dynamic>>((ref) async {
|
|
final service = ref.watch(consultationServiceProvider);
|
|
return service.getQuota();
|
|
});
|
|
|
|
/// 当前运动计划 Provider
|
|
final currentExercisePlanProvider = FutureProvider<Map<String, dynamic>?>((ref) async {
|
|
final service = ref.watch(exerciseServiceProvider);
|
|
return service.getCurrentPlan().timeout(const Duration(seconds: 8));
|
|
});
|
|
|
|
/// 拍照/相册直接触发(无需跳转页面)
|
|
final cameraActionProvider = NotifierProvider<CameraActionNotifier, String?>(CameraActionNotifier.new);
|
|
|
|
class CameraActionNotifier extends Notifier<String?> {
|
|
@override String? build() => null;
|
|
void trigger(String action) => state = action;
|
|
void clear() => state = null;
|
|
}
|
|
|
|
/// 拍饮食动作触发(不用跳多余页面)
|
|
final dietActionProvider = NotifierProvider<DietActionNotifier, String?>(DietActionNotifier.new);
|
|
|
|
class DietActionNotifier extends Notifier<String?> {
|
|
@override String? build() => null;
|
|
void trigger(String action) => state = action;
|
|
void clear() => state = null;
|
|
}
|