feat: AI 提示词模块化 + AI 同意门控 + AI 草稿存储 + 意图路由 + 医疗引用知识库 + 多页面 UI 优化

- AI 提示词拆分为 markdown 模块(Prompts/global + modules + rag + router)
- 新增 AI 同意门控(用户需同意后才能使用 AI 功能)
- 新增 AI 录入草稿存储(AiEntryDraftContracts/EfAiEntryDraftStore/AiEntryDraftRecord)
- 新增 AI 意图路由(ai_intent_router)
- 新增医疗引用知识库(MedicalCitationKnowledge)
- 重构 prompt_manager 和 ai_chat_endpoints
- 优化聊天/趋势/档案/抽屉/医生端等多个页面 UI
- 新增 agent 插画和趋势指标图标资源
- 删除 HANDOFF-2026-07-17.md
This commit is contained in:
MingNian
2026-07-27 16:53:20 +08:00
parent ad93e38b7e
commit 3b5cec10a6
80 changed files with 4358 additions and 1339 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,
),
),