feat: AI 意图路由/草稿存储 + Prompts 模块化 + UI 视觉统一 + AI 同意门 + 资源更新

后端:
- 新增 ai_intent_router 意图路由
- 新增 AiEntryDraft 草稿存储 + EF 迁移
- 新增 Prompts 模块化(global/modules/rag/router)
- AI Agent handlers 扩展

前端:
- 新增 AI 同意门 (ai_consent_gate/provider/details_page)
- HealthMetricVisuals 视觉统一
- 设备扫描/管理页面优化
- agent 插图替换 + 趋势指标图标

配置:
- DeepSeek 模型改 deepseek-v4-flash
- .gitignore 加 artifacts/audit
- build.gradle.kts 签名配置调整
This commit is contained in:
MingNian
2026-07-28 15:03:38 +08:00
parent 25a4078688
commit b4bc15b9b9
88 changed files with 5527 additions and 1240 deletions

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/app_colors.dart';
import '../../core/app_module_visuals.dart';
import '../../core/navigation_provider.dart';
import '../../providers/auth_provider.dart';
import '../../providers/backoffice_refresh_providers.dart';
@@ -124,7 +125,7 @@ class DoctorDashboardPage extends ConsumerWidget {
child: _StatCard(
'待审核报告',
'${stats['pendingReports'] ?? 0}',
Icons.description,
AppModuleVisuals.report.icon,
const Color(0xFFF59E0B),
() {
ref.read(doctorPageProvider.notifier).set('reports');
@@ -136,7 +137,7 @@ class DoctorDashboardPage extends ConsumerWidget {
child: _StatCard(
'今日随访',
'${stats['todayFollowUps'] ?? 0}',
Icons.event_note,
AppModuleVisuals.followup.icon,
const Color(0xFFEF4444),
() {
ref.read(doctorPageProvider.notifier).set('followups');
@@ -166,7 +167,7 @@ class DoctorDashboardPage extends ConsumerWidget {
// 待办:待审核报告
_TodoSection(
title: '待审核报告',
icon: Icons.description_outlined,
icon: AppModuleVisuals.report.icon,
color: const Color(0xFFF59E0B),
items:
(data?['pendingReports'] as List?)
@@ -182,7 +183,7 @@ class DoctorDashboardPage extends ConsumerWidget {
// 今日随访
_TodoSection(
title: '今日随访',
icon: Icons.event_note_outlined,
icon: AppModuleVisuals.followup.icon,
color: const Color(0xFFEF4444),
items:
(data?['todayFollowUps'] as List?)

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/app_colors.dart';
import '../../core/app_module_visuals.dart';
import '../../core/navigation_provider.dart';
import '../../providers/auth_provider.dart';
import '../../providers/backoffice_refresh_providers.dart';
@@ -92,18 +93,18 @@ class _DoctorFollowupsPageState extends ConsumerState<DoctorFollowupsPage> {
),
Expanded(
child: items.isEmpty && refresh.isLoading
? const BackofficeLoadingState(message: '正在加载随访')
? BackofficeLoadingState(message: '正在加载随访')
: items.isEmpty && refresh.hasError
? BackofficeErrorState(onRetry: () => ref.invalidate(_fupRefresh))
: RefreshIndicator(
onRefresh: () => ref.refresh(_fupRefresh.future),
child: items.isEmpty
? ListView(
children: const [
children: [
SizedBox(
height: 360,
child: BackofficeEmptyState(
icon: Icons.event_note_outlined,
icon: AppModuleVisuals.followup.icon,
title: '暂无随访',
description: '新建的复查随访会显示在这里',
),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/app_colors.dart';
import '../../core/app_module_visuals.dart';
import '../../core/navigation_provider.dart';
import '../../providers/auth_provider.dart';
import '../../utils/backoffice_formatters.dart';
@@ -250,7 +251,7 @@ class DoctorPatientDetailPage extends ConsumerWidget {
Expanded(
child: _LinkCard(
'报告 (${reports.length})',
Icons.description_outlined,
AppModuleVisuals.report.icon,
() {},
),
),
@@ -258,7 +259,7 @@ class DoctorPatientDetailPage extends ConsumerWidget {
Expanded(
child: _LinkCard(
'随访 (${followUps.length})',
Icons.event_note_outlined,
AppModuleVisuals.followup.icon,
() {},
),
),

View File

@@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/app_colors.dart';
import '../../core/app_module_visuals.dart';
import '../../core/navigation_provider.dart';
import '../../providers/auth_provider.dart';
import '../../providers/backoffice_refresh_providers.dart';
@@ -116,8 +117,8 @@ class _DoctorReportDetailPageState
onRetry: () => ref.invalidate(_reportDetailProvider(widget.id)),
),
data: (data) => data == null
? const BackofficeEmptyState(
icon: Icons.description_outlined,
? BackofficeEmptyState(
icon: AppModuleVisuals.report.icon,
title: '报告不存在',
)
: _buildBody(data),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/app_colors.dart';
import '../../core/app_module_visuals.dart';
import '../../core/navigation_provider.dart';
import '../../providers/auth_provider.dart';
import '../../providers/backoffice_refresh_providers.dart';
@@ -71,8 +72,8 @@ class _DoctorReportsPageState extends ConsumerState<DoctorReportsPage> {
.where((item) => item['status'] == _filter)
.toList();
return items.isEmpty
? const BackofficeEmptyState(
icon: Icons.description_outlined,
? BackofficeEmptyState(
icon: AppModuleVisuals.report.icon,
title: '暂无报告',
description: '患者上传的待审核报告会显示在这里',
)
@@ -93,8 +94,8 @@ class _DoctorReportsPageState extends ConsumerState<DoctorReportsPage> {
color: AppColors.iconBg,
borderRadius: BorderRadius.circular(12),
),
child: const Icon(
Icons.description_outlined,
child: Icon(
AppModuleVisuals.report.icon,
color: AppColors.primary,
),
),