Plataforma integral de gestión de citas médicas con .NET 9, Clean Architecture, PostgreSQL, cliente multiplataforma en Flutter y Asistente Virtual con IA alimentado por OpenRouter y Model Context Protocol (MCP).
- Acerca del Proyecto
- Características Principales
- Stack Tecnológico
- Arquitectura y Estructura
- Requisitos Previos
- Configuración de Variables de Entorno & Secretos
- Guía de Instalación y Ejecución
- Asistente IA & MCP
- Documentación Adicional
- Licencia
Portal Médico es una solución digital completa diseñada para modernizar la atención médica y agilizar la programación de consultas. Ofrece flujos de trabajo optimizados tanto para pacientes como para profesionales de la salud a través de una aplicación cliente unificada en Flutter, respaldada por una robusta arquitectura backend basada en Clean Architecture y capacidades conversacionales asistidas por Inteligencia Artificial.
- Autenticación Segura: Registro e inicio de sesión con correo y contraseña.
- Reserva de Citas en Tiempo Real:
- Filtrado por especialidad médica y médico tratante.
- Selección de horarios en bloques dinámicos de 30 minutos.
- Registro del motivo de consulta.
- Gestión de Citas: Historial completo y estado de citas futuras.
- Regla de Cancelación Controlada: Cancelación automatizada permitida únicamente si faltan más de 24 horas para la consulta.
- Asistente Virtual IA: Chatbot inteligente para consultar médicos, especialidades y disponibilidad mediante lenguaje natural.
- Agenda Semanal Interactiva: Visualización clara de la jornada médica (Lunes a Viernes, 8:00 AM - 6:00 PM).
- Atención Médica & Notas Clínicas: Registro de consultas atendidas y notas médicas del paciente.
- Historial Clínico: Buscador en tiempo real de pacientes y sus registros previos.
- Dashboard Métrico: Métricas de citas del día y resúmenes de atención.
- Gestión de Personal Médico: Alta, baja lógica y asignación de especialidades/horarios.
- Control Global de Citas: Reagendamiento y cancelación sin restricciones de tiempo.
- Framework: .NET 9 Web API
- Arquitectura: Clean Architecture (Domain, Application, Infrastructure, API, MCP)
- ORM: Entity Framework Core 9 (Npgsql)
- Autenticación: JWT (JSON Web Tokens) & BCrypt para Hashing
- AI & Integración: OpenRouter API Client + Model Context Protocol (MCP) Server
- Motor: PostgreSQL
- Framework: Flutter (Dart)
- Arquitectura: Feature-First & Repository Pattern
- Gestión de Estado: Provider /
ChangeNotifier - Cliente HTTP:
Diocon Interceptores JWT y Manejo de Errores - UI: Material Design 3
App-PortalMedico/
├── backend/ # Solución Backend (.NET 9)
│ ├── src/
│ │ ├── SistemaCitas.Domain/ # Entidades centrales, Enums y Contratos
│ │ ├── SistemaCitas.Application/ # Casos de uso, DTOs y Servicios
│ │ ├── SistemaCitas.Infrastructure/ # EF Core, PostgreSQL, JWT, OpenRouter Chat
│ │ ├── SistemaCitas.API/ # Controllers, Middlewares y OpenAPI/Swagger
│ │ └── SistemaCitas.Mcp/ # Herramientas MCP para el Asistente IA
│ └── gestorcitas.slnx
├── mobile/ # Aplicación cliente unificada (Flutter)
│ ├── lib/
│ │ ├── core/ # Estado global, Red (Dio), Tema y Repositorios
│ │ ├── features/ # Módulos: auth, paciente, medico
│ │ └── shared/ # Modelos DTOs y Widgets reutilizables
│ └── pubspec.yaml
├── db/ # Scripts de referencia SQL DDL
└── docs/ # Especificación técnica y guía de endpoints
Antes de comenzar, asegúrate de tener instalado:
- .NET 9.0 SDK
- PostgreSQL 13+ (o ejecución vía Docker)
- Flutter SDK
>=3.0.0y Dart - (Opcional) Herramienta global de EF Core CLI:
dotnet tool install --global dotnet-ef
El backend lee la configuración desde appsettings.json, appsettings.Development.json o Variables de Entorno.
| Parámetro | Variable de Entorno | Descripción | Valor por defecto / Ejemplo |
|---|---|---|---|
ConnectionStrings:DefaultConnection |
ConnectionStrings__DefaultConnection |
Cadena de conexión PostgreSQL | Host=localhost;Database=SistemaCitasDB;Username=postgres;Password=postgres |
Jwt:ClaveSecreta |
Jwt__ClaveSecreta |
Clave secreta para JWT (>= 32 caracteres) | TuClaveSecretaSuperSeguraYLargaDe32Caracteres! |
Jwt:Issuer |
Jwt__Issuer |
Emisor del token JWT | SistemaCitasAPI |
Jwt:Audience |
Jwt__Audience |
Audiencia del token JWT | SistemaCitasClientes |
Jwt:ExpiracionMinutos |
Jwt__ExpiracionMinutos |
Expiración del token (minutos) | 120 |
OpenRouter:ApiKey |
OpenRouter__ApiKey |
API Key de OpenRouter (Asistente IA) | sk-or-v1-... |
OpenRouter:Model |
OpenRouter__Model |
Modelo LLM (Opcional) | qwen/qwen3-coder:free |
Crea o edita backend/src/SistemaCitas.API/appsettings.Development.json:
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=SistemaCitasDB;Username=postgres;Password=postgres"
},
"Jwt": {
"ClaveSecreta": "TuClaveSecretaSuperSeguraYLargaDe32Caracteres!",
"Issuer": "SistemaCitasAPI",
"Audience": "SistemaCitasClientes",
"ExpiracionMinutos": 120
},
"OpenRouter": {
"ApiKey": "TU_OPENROUTER_API_KEY",
"Model": "qwen/qwen3-coder:free"
}
}Nota de Desarrollo: En entorno
Development, la base de datos se inicializa y se alimenta automáticamente al iniciar la API gracias alDbSeeder.csintegrado.
Inicia el servicio de PostgreSQL en tu máquina local o mediante Docker:
docker run --name postgres-citas -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=SistemaCitasDB -p 5432:5432 -d postgres:latest-
Clona el repositorio e ingresa a la API:
cd backend/src/SistemaCitas.API -
Restaura las dependencias NuGet:
dotnet restore
-
(Opcional) Aplica las migraciones de EF Core:
dotnet ef database update --project ../SistemaCitas.Infrastructure
-
Inicia la API:
dotnet run
- URL base local:
http://localhost:5250 - Swagger / OpenAPI Specs:
http://localhost:5250/openapi/v1.json
-
Ingresa al directorio
mobile:cd mobile -
Descarga los paquetes de Flutter:
flutter pub get
-
Configuración de Host HTTP:
Enmobile/lib/core/network/api_client.dart:- Navegador Web / Desktop:
http://localhost:5250 - Emulador Android:
http://10.0.2.2:5250
- Navegador Web / Desktop:
-
Ejecuta la aplicación:
# En navegador Web (Chrome) flutter run -d chrome # En Android Emulator o Dispositivo flutter run # En Linux Desktop flutter run -d linux
La solución integra un chatbot médico accesible desde el perfil de Paciente en la aplicación móvil:
- Tecnología: Integra la API de OpenRouter con soporte para Tool Calling y el estándar Model Context Protocol (MCP) en la ruta
/mcp. - Capacidades: Permite a los pacientes realizar consultas en lenguaje natural como "¿Qué cardiólogos están disponibles el próximo lunes por la tarde?".
- Herramientas MCP Expuestas:
listar_especialidadeslistar_medicosobtener_disponibilidad_de_medicobuscar_medicos_disponibles