Java - Ayuda para un trabajo

 
Vista:
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Kabuto (1379 intervenciones) el 12/08/2019 11:18:58
Comienza por pensar en las clases que van a intervenir y como se relacionan entre ellas: Paciente, Psicólogo, Cita, Expediente...

Intenta elaborar un diagrama UML con ellas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Billy Joel (875 intervenciones) el 13/08/2019 00:47:41
Para cuando necesitas ese sistema/proyecto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Kabuto (1379 intervenciones) el 14/08/2019 01:39:01
A ver, estos días no tengo mucho tiempo, pero pensando un poco en el ejercicio se me ocurre el siguiente UML, quizás no definitivo, con las clases que se podrían modelar:

diagrama-Clinica


La idea es que Agenda, GestorPacientes y GestorPsicologos, gestionen por separado cada uno sus objetos asociados.

La clase que no tengo clara es la de HorarioCita, más que nada porque supongo que no es exactamente lo que se espera que haga el alumno a partir del enunciado.
Pero así a priori, me parece una forma más cómoda para controlar las Citas. En lugar de que la hora y la fecha sean simples atributos, prefiero tratarlos como una entidad.
De modo que un fecha y una hora determinada, serán un objeto único e irrepetible, que puede albergar hasta tres Citas simultáneas, ya que como dice el enunciado la clínica cuenta con tres psicólogos que pueden atender a distintos pacientes en la misma hora y fecha.

Aún no he escrito el código, puede que luego según vaya elaborándolo cambie de opinión xD

Lo más engorroso va a ser tener que escribir en ficheros de texto toda la información y luego recuperarla cada vez que se inicie el programa.
Sería más cómodo si se permitiera serializar las clases y guardar la info directamente en archivos binarios, pero bueno, es lo que hay.

Iré escribiendo código cuando encuentre tiempo libre y compartiendo por aquí.

Por supuesto, sería maravilloso que otros compañeros también opinen y compartan cómo lo enfocarían ellos. Si a partir de este ejercicio obtenemos varias versiones sobre como resolverlo, sería muy enriquecedor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Kabuto (1379 intervenciones) el 16/08/2019 01:34:31
OK, novedades.

Como dije, el UML no era definitivo y de hecho he dejado fuera la clase GestionPsicologos.
El programa no pide ningún tipo de gestión sobre ellos, tan solo dice que hay tres disponibles, eso es todo..

Por lo tanto, para simplificar el código, no habrá ni clase ni menú de opciones para gestionarlos.
He decidido ponerlos como atributo de la clase Agenda. Será un array de tres elementos donde el número y nombre de los Psicólogos estarán hardcoded, es decir, escritos en el propio código.

Este sería el nuevo UML:

diagrama-Clinica2


Ya tengo gran parte del código escrito.
Todas las clases están modeladas.
El programa ya es capaz de escribir y recuperar los datos en archivos txt.
Se usan dos archivos, uno para guardar los Pacientes y otro para la Agenda
Al recuperar la Agenda, si no encuentra el archivo en disco (por ejemplo, porque es la primera vez que se ejecuta), automáticamente crea una nueva Agenda con todos los horarios de citas (clase HorarioCita) posibles, desde hoy hasta final de año.
Es decir, por cada día hasta final de año, crea 8 posibles HorariosCita, porque la clínica abre de las 08:00 hasta las 17:00, es decir, la última cita será a la 16:00.
Cada HorarioCita puede tener hasta tres Citas concertadas, porque hay tres Psicólogos.

Bien, el programa no está completo. De momento solo está disponible el menú para gestionar Pacientes con las opciones de Registrar nuevo Paciente (que en realidad NO lo pide el enunciado), mostrar un listado completo de Pacientes y mostrar los Expedientes de un Paciente concreto.

Falta lo más importante, la gestión de la Agenda: concertar Citas, comprobar que un Psicólogo no tenga más de una Cita a la misma hora, hacer un Expediente una vez finalizada la Cita, etc...


Incluyo en un zip el código que llevo escrito hasta ahora.

Aunque por supuesto lo recomendable para Marco Andrés es que intente escribir su propio código, tomando como referencia el UML que he puesto o bien creando uno más de su agrado.

Si vas a usar mi código, intenta al menos comprenderlo al máximo y pregunta cualquier duda que tengas. De nada sirve presentar un proyecto que no sabes explicar su funcionamiento.

Cuando tenga nuevos avances los iré publicando aquí.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 16
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Marco Andres (11 intervenciones) el 16/08/2019 19:42:59
Muchas gracias, una consulta, creo que falto lo de los padecimientos y recomendaciones, por que solo deja llenar los datos del paciente, no se si es porque de momento no tiene la opcion de concretar citas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Kabuto (1379 intervenciones) el 16/08/2019 21:16:35
Exacto.
Primero hay que concertar una Cita.
Luego, habrá una opción para que una Cita que ya ha finalizado, crear un Expediente con ella, que es cuando se introducen los padecimientos y recomendaciones.

Ya tengo hecha la opción de Concertar una Cita.
Quizás me he complicado algo más de la cuenta, pero al final resulta más útil para el usuario.

Es decir, para concretar una Cita, necesitamos además del Paciente, una fecha y una hora.
Si le pedimos al usuario que introduzca una fecha y una hora, además de comprobar que la ha escrito bien, luego hay que comprobar que esa fecha y hora están disponibles para el psicólogo que tiene asignado el paciente.
Si no lo estuviera, habría que pedirle una fecha y hora distinta, y si tampoco lo está pedir de nuevo... al final prácticamente el usuario tiene que adivinar cuando habrá un HorarioCita disponible para ese Psicólogo.

Yo en cambio, he preferido seleccionar de todos los HorariosCita que hay en la Agenda, cuáles están disponibles para ese Psicólogo y se los muestro en pantalla al usuario, en un listado numerado desde el 1 hasta n... para que elija uno con solo introducir un número.
De este modo el usuario no tiene que "adivinar" ni arriesgarse a cometer un error tipográfico al introducir una fecha tipo dd/mm ni una hora hh:mm.
Además creo que es precisamente esto lo que pide el punto 7 del enunciado.

Para evitar mostrar un listado demasiado largo, solo muestro los horarios disponibles para los siguientes 7 días a partir de la fecha actual. Y aún así ya es bastante largo, pues 7 días, por 9 horas disponibles, pueden llegar a mostrarse hasta 63 si el Psicólogo no tuviera ninguna Cita concertada en ese período.

Para hacer esto, uso la clase LocalDate para calcular correctamente la fecha de mañana y la fecha de 7 días a partir de mañana.
Y uso esas fechas para seleccionar un rango de todos los HorariosCita disponibles.

En realidad es sencillo, pero al leer el código sin haberlo escrito uno mismo, puede resultar confuso.


En fin, voy a ver si termino lo que falta y comparto el código final.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Kabuto (1379 intervenciones) el 17/08/2019 00:59:13
Bueno, pues ya he terminado todo el código.
Creo que no me he dejado nada y todo parece funcionar bien.

Lo único que no he podido probar todavía es lo de crear un Expediente.
¿Por qué?
Pues porque lo he programado para que solo se pueda crear una Expediente para una Cita que ya haya tenido lugar. Es decir, se obtiene la fecha actual y si la fecha de la Cita es posterior en el tiempo, es decir, aún no ha ocurrido, pues el programa no permite crear Expediente.

Total, que hasta mañana no podré crear Expedientes, que entonces mis Pacientes y mis Psicólogos ya se habrán visitado je je..

Por lo demás, todo parece funcionar correctamente.
Pruébalo y mírate bien el código. Verás que uso mucho la clase LocalDate, ya que en este programa las fechas son importantes.

He incluido bastantes comentarios y documentado la mayor parte de los métodos, pero aún así no dudes en preguntar lo que no te quede claro.

Fíjate bien en el UML que puse, con él se entiende fácilmente la estructura del programa. Lo único que puede quedar poco claro son dudas a nivel de código.
Repito, pregunta lo que sea y pon a prueba el programa.

Abre también con un editor de texto los archivos que se graban en disco y comprueba que entiendes por qué se escriben de ese modo y como hace el código para saber interpretarlos y recuperar los datos en cada sesión.

Y por supuesto, haz los cambios que creas pertinentes o intenta escribir tu propio programa ahora que ya tienes una idea aproximada de como llevarlo a cabo.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 16
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Marco Andres (11 intervenciones) el 17/08/2019 21:31:48
Muchas gracias, lo he estado probando y me da un un error a la hora de crear la cita
IMG_20190817_132605
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 16
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Marco Andres (11 intervenciones) el 17/08/2019 23:59:39
Hola, como mencionaste antes, el expediente no se puede crear ya que no ha transcurrido la cita, has incluido el Local Date, pero no me sirve de mucho ya que no quiero esperar a la fecha para crear el expediente, quiero que sirva de forma que simule la fecha, no la real
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda para un trabajo

Publicado por Kabuto (1379 intervenciones) el 18/08/2019 00:26:30
EL método que decide si se puede crear un Expediente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public boolean crearExpediente(Paciente paci) {
    /*
        * No se puede hacer un Expediente, si la Cita no ha tenido lugar.
        * Hemos de comparar la fecha actual con la fecha de la Cita
        */
    //Datos fecha actual
    int diaHoy = LocalDate.now().getDayOfMonth();
    int mesHoy = LocalDate.now().getMonthValue();
    int horaHoy = LocalTime.now().getHour();
    //Datos fecha concertada
    String[] fechaYhora = paci.getHorarioCita().split("--");
    int diaCita = Integer.parseInt(fechaYhora[0].split("/")[0]);
    int mesCita = Integer.parseInt(fechaYhora[0].split("/")[1]);
    int horaCita = Integer.parseInt(fechaYhora[1].split(":")[0]);
    //Vamos a comparar...
    if (mesHoy == mesCita && diaHoy == diaCita) {
        //Mismo mes, mismo dia, depende de la hora...
        if (horaHoy > horaCita) {
            nuevoExpediente(paci, fechaYhora[0], fechaYhora[1]);
            return true;
        }
        else
            return false;
    }
    else if (mesHoy == mesCita && diaHoy > diaCita) {
        //Mismo mes, dia de hoy es posterior, la hora es irrelevante
        nuevoExpediente(paci, fechaYhora[0], fechaYhora[1]);
        return true;
    }
    else if (mesHoy > mesCita) {
        //Mes de hoy es posterior, dia y hora son irrelevantes
        nuevoExpediente(paci, fechaYhora[0], fechaYhora[1]);
        return true;
    }
    else {
        System.out.println("\nLa CITA concertada aún no ha tenido lugar.");
        System.out.println("No es posible crear un EXPEDIENTE.");
        return false; //Cualquier otra posibilidad, es que la Cita aún no se ha llevado a cabo.
    }
}

Comenta o elimina la parte donde se comparan las fechas y haz que simplemente se llame al submétodo nuevoExpediente().
Sí tendrás que separar la fecha de la hora para pasarlas por argumentos al invocar al método.

1
2
3
4
5
6
7
8
public boolean crearExpediente(Paciente paci) {
    //Datos fecha concertada
    String[] fechaYhora = paci.getHorarioCita().split("--");
    nuevoExpediente(paci, fechaYhora[0], fechaYhora[1]);
 
    return true;
 
}

Prúebalo así, si no me equivoco, te permitirá crear Expediente cuando lo desees
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar