diff --git a/src/main/java/com/triz/trizservice/bean/DicomPacsBean.java b/src/main/java/com/triz/trizservice/bean/DicomPacsBean.java new file mode 100644 index 0000000..a9cedca --- /dev/null +++ b/src/main/java/com/triz/trizservice/bean/DicomPacsBean.java @@ -0,0 +1,213 @@ +package com.triz.trizservice.bean; + +import com.triz.trizservice.modeles.Centre; +import com.triz.trizservice.modeles.Machine; +import com.triz.trizservice.modeles.ServiceUser; +import com.triz.trizservice.modeles.TypeMachine; +import com.triz.trizservice.service.TransactionService; +import com.triz.util.UtilContext; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.Serializable; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.bean.ManagedBean; +import javax.faces.bean.ViewScoped; +import javax.faces.context.FacesContext; +import org.primefaces.PrimeFaces; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("dicomPacsBean") +@Scope("view") +public class DicomPacsBean implements Serializable { + + private static final long serialVersionUID = 1L; + + // TODO : remplacer par l'injection du DAO réel (DaoServiceImpl / EJB) + // quand le mapping table sera défini. + private List machines; + private Machine selectedMachine; + private Centre centre; + private ServiceUser user; + + private Date dernierMajOrthanc; + private String etatMwlScp; + private Date dernierEtudeRecu; + + @Autowired + public TransactionService service; + + @Autowired + public UtilContext context; + + @PostConstruct + public void init() { + centre = context.getCurrentEtablissement(); + user = context.getCurrentUser(); + machines = new ArrayList<>(); + machines = service.getAllByCentre(Machine.class, centre); + selectedMachine = new Machine(); + context.saveNewManipulation("Machine", "", "Consulter Machine", new Date(), new Date(), user, "", ""); + // Valeurs d'en-tête neutres pour l'instant (pas de source de données branchée) + dernierMajOrthanc = null; + etatMwlScp = "Actif"; + dernierEtudeRecu = null; + ping("localhost"); + } + + public void prepareNew() { + selectedMachine = new Machine(); + } + + public void prepareEdit(Machine machine) { + selectedMachine = machine; + PrimeFaces.current().ajax().update(":dicomPacsForm:dlgMachine"); + } + + public void saveMachine() { + try { + if (selectedMachine.getId() == null) { + + selectedMachine.setFkCentre(centre); + machines.add(selectedMachine); + + addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine ajoutée avec succès"); + } else { + selectedMachine.setLastUpdate(new Date()); + addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine modifiée avec succès"); + + } + service.save(selectedMachine); + if (selectedMachine.getId() == null) { + context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Ajouter Machine", new Date(), new Date(), user, "", ""); + + } else { + context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Modifier Machine", new Date(), new Date(), user, "", ""); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue lors de l'enregistrement"); + } + } + + public void deleteMachine() { + try { + selectedMachine.setActif(Boolean.FALSE); + selectedMachine.setLastUpdate(new Date()); + service.save(selectedMachine); + context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "Desactiver Machine", new Date(), new Date(), user, "", ""); + addMessage(FacesMessage.SEVERITY_INFO, "Succès", "Machine supprimée avec succès"); + } catch (Exception e) { + System.out.println(e.getMessage()); + addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue lors de la suppression"); + } + } + + private void addMessage(FacesMessage.Severity severity, String summary, String detail) { + FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, summary, detail)); + } + + public List getStatutsDisponibles() { + return Arrays.asList("Actif", "Inactif", "Indisponible"); + } + + public List getTypesMachineDisponibles() { + // TODO : brancher sur le tab "Types de machines" de Paramétrage une fois l'entité TypeMachine exposée + return service.findAll(TypeMachine.class); + } + + // ===== Getters / Setters ===== + public List getMachines() { + return machines; + } + + public void setMachines(List machines) { + this.machines = machines; + } + + public Machine getSelectedMachine() { + return selectedMachine; + } + + public void setSelectedMachine(Machine selectedMachine) { + this.selectedMachine = selectedMachine; + } +// Supprimer le champ dernierMajOrthanc et son setter, garder seulement ce getter : + + public Date getDernierMajOrthanc() { + return machines.stream() + .filter(m -> "Orthanc Principal".equals(m.getNom())) + .map(Machine::getLastUpdate) + .findFirst() + .orElse(null); + } + + public String getEtatMwlScp() { + return etatMwlScp; + } + + public void setEtatMwlScp(String etatMwlScp) { + this.etatMwlScp = etatMwlScp; + } + + public java.util.Date getDernierEtudeRecu() { + return dernierEtudeRecu; + } + + public void setDernierEtudeRecu(java.util.Date dernierEtudeRecu) { + this.dernierEtudeRecu = dernierEtudeRecu; + } + + public void toggleActif() { + try { + boolean nouvelEtat = !Boolean.TRUE.equals(selectedMachine.getActif()); + selectedMachine.setActif(nouvelEtat); + selectedMachine.setLastUpdate(new Date()); + service.save(selectedMachine); + context.saveNewManipulation("Machine", selectedMachine.getId().toString(), "reactiver Machine", new Date(), new Date(), user, "", ""); + // TODO : persister le changement via le DAO réel (merge) + + String msg = nouvelEtat ? "Machine réactivée avec succès" : "Machine désactivée avec succès"; + addMessage(FacesMessage.SEVERITY_INFO, "Succès", msg); + } catch (Exception e) { + addMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Une erreur est survenue"); + } + } + + public void ping(String host) { + System.out.println("ping"); + System.out.println("host " + host); + try { + + Process process = Runtime.getRuntime() + .exec("ping -n 4 " + host); + + BufferedReader reader = new BufferedReader( + new InputStreamReader( + process.getInputStream(), + Charset.forName("CP850") + ) + ); + + String line; + + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + + process.waitFor(); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/MachineConverter.java b/src/main/java/com/triz/trizservice/bean/converter/MachineConverter.java similarity index 96% rename from src/main/java/MachineConverter.java rename to src/main/java/com/triz/trizservice/bean/converter/MachineConverter.java index b44f80e..bebaebe 100644 --- a/src/main/java/MachineConverter.java +++ b/src/main/java/com/triz/trizservice/bean/converter/MachineConverter.java @@ -1,3 +1,5 @@ +package com.triz.trizservice.bean.converter; + import com.triz.trizservice.modeles.Machine; import com.triz.trizservice.service.TransactionService; import java.util.UUID; diff --git a/src/main/java/com/triz/trizservice/bean/converter/TypeMachineConverter.java b/src/main/java/com/triz/trizservice/bean/converter/TypeMachineConverter.java new file mode 100644 index 0000000..fc73360 --- /dev/null +++ b/src/main/java/com/triz/trizservice/bean/converter/TypeMachineConverter.java @@ -0,0 +1,48 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.triz.trizservice.bean.converter; + +import com.triz.trizservice.modeles.TypeMachine; +import com.triz.trizservice.service.TransactionService; +import java.util.UUID; +import javax.faces.application.FacesMessage; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.FacesConverter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * + * @author FORCE TECH + */ +@FacesConverter("typeMachineConverter") +@Component +public class TypeMachineConverter implements Converter{ + @Autowired + protected transient TransactionService service; + + @Override + public Object getAsObject(FacesContext fc, UIComponent uic, String value) { + try { + return service.findById(TypeMachine.class, UUID.fromString(value)); + } catch (NumberFormatException e) + { + new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Centre n'existe pas."); + } + + return null; + } + + @Override + public String getAsString(FacesContext fc, UIComponent uic, Object object) { + if (object != null) { + return String.valueOf(((TypeMachine) object).getId()); + } else { + return null; + } + } +} diff --git a/src/main/java/com/triz/trizservice/modeles/Machine.java b/src/main/java/com/triz/trizservice/modeles/Machine.java index 48e87c6..5d529d9 100644 --- a/src/main/java/com/triz/trizservice/modeles/Machine.java +++ b/src/main/java/com/triz/trizservice/modeles/Machine.java @@ -5,6 +5,7 @@ package com.triz.trizservice.modeles; import java.io.Serializable; +import java.util.Date; import java.util.List; import java.util.UUID; import javax.persistence.Basic; @@ -19,6 +20,8 @@ import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; @@ -73,10 +76,16 @@ public class Machine implements Serializable { @JoinColumn(name = "fk_type_machine", referencedColumnName = "id") @ManyToOne private TypeMachine fkTypeMachine; - - @JoinColumn(name = "fk_salle", referencedColumnName = "id") + + @JoinColumn(name = "fk_salle", referencedColumnName = "id") @ManyToOne private SalleDeSoin fkSalle; + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_update") + private Date lastUpdate; + + @Column(name = "nom") + private String nom; public Machine() { } @@ -125,7 +134,6 @@ public class Machine implements Serializable { this.disponible = disponible; } - public Integer getPort() { return port; } @@ -207,5 +215,21 @@ public class Machine implements Serializable { public void setFkSalle(SalleDeSoin fkSalle) { this.fkSalle = fkSalle; } - + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public Date getLastUpdate() { + return lastUpdate; + } + + public void setLastUpdate(Date lastUpdate) { + this.lastUpdate = lastUpdate; + } + } diff --git a/src/main/java/com/triz/util/UtilControleAccess.java b/src/main/java/com/triz/util/UtilControleAccess.java index 4020330..8dee2be 100644 --- a/src/main/java/com/triz/util/UtilControleAccess.java +++ b/src/main/java/com/triz/util/UtilControleAccess.java @@ -166,8 +166,8 @@ public class UtilControleAccess { for (ServiceMember member : listMemberShip) { helpingFonctionGroupe = service.getFonctionGroupByFonctionIdAndGoupe(fonction1, member.getFkGroupe()); if (helpingFonctionGroupe != null) { - list.add(true); - System.out.println("helpingFonctionGroupe.getCanUpdate() : " + helpingFonctionGroupe.getCanUpdate()); + list.add(helpingFonctionGroupe.getCanSee()); + System.out.println("helpingFonctionGroupe.getCanSee() : " + helpingFonctionGroupe.getCanSee()); } } System.out.println("helpingFonctionGroupe: " + helpingFonctionGroupe); diff --git a/src/main/resources/db/migration/V000__main_schema.sql b/src/main/resources/db/migration/V000__main_schema.sql index 17eb7c6..ce9e958 100644 --- a/src/main/resources/db/migration/V000__main_schema.sql +++ b/src/main/resources/db/migration/V000__main_schema.sql @@ -851,4 +851,38 @@ ADD CONSTRAINT specialite_medicale_pkey PRIMARY KEY(id); ALTER TABLE medecin_specialiste ADD CONSTRAINT medecin_specialiste_fk_specialite_fkey FOREIGN KEY (fk_specialite_id) -REFERENCES specialite_medicale(id); \ No newline at end of file +REFERENCES specialite_medicale(id); + +ALTER TABLE Machine +ADD COLUMN IF NOT EXISTS last_update Date; + +ALTER TABLE Machine +ADD COLUMN IF NOT EXISTS nom VARCHAR; + +-- 1. Créer le type de machine "OrthancPrincipale" s'il n'existe pas +INSERT INTO type_machine (id, type, code) +SELECT gen_random_uuid(), 'OrthancPrincipale', 'ORTHANC_PRINCIPALE' +WHERE NOT EXISTS ( + SELECT 1 FROM type_machine WHERE type = 'OrthancPrincipale' +); + +-- 2. Créer la machine "Orthanc Principal" en l'associant au type ci-dessus +INSERT INTO machine (id, nom, actif, disponible, fk_type_machine) +SELECT + gen_random_uuid(), + 'Orthanc Principal', + true, + true, + tm.id +FROM type_machine tm +WHERE tm.type = 'OrthancPrincipale' +AND NOT EXISTS ( + SELECT 1 FROM machine WHERE nom = 'Orthanc Principal' +); + +UPDATE machine +SET fk_centre = (SELECT id FROM centre LIMIT 1) +WHERE nom = 'Orthanc Principal'; + +ALTER TABLE machine +ALTER COLUMN last_update TYPE TIMESTAMP USING last_update::timestamp; \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/layout/sections/menu.xhtml b/src/main/webapp/WEB-INF/layout/sections/menu.xhtml index ab33b4e..588f2cf 100644 --- a/src/main/webapp/WEB-INF/layout/sections/menu.xhtml +++ b/src/main/webapp/WEB-INF/layout/sections/menu.xhtml @@ -141,14 +141,14 @@ + rendered="#{utilControleAccess.isshow1('param')}" /> diff --git a/src/main/webapp/views/Dicom/form.xhtml b/src/main/webapp/views/Dicom/form.xhtml new file mode 100644 index 0000000..4760a0a --- /dev/null +++ b/src/main/webapp/views/Dicom/form.xhtml @@ -0,0 +1,479 @@ + + + DICOM / PACS + + + + + + + + + + +
+ +
+
+ Dernier Mis a jour Orthanc Principale +
+
+ + + +
+
+ +
+
+ Etat MWL SCP +
+
+ + +
+
+ +
+
+ Dernier étude Reçu +
+
+ + + +
+
+ +
+ + +
+ +
+ Nœuds DICOM configurés +
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ( + #{machine.nbPatientMax} + / + #{machine.nbRdvMax} + ) / jour + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ +
+ + + + + +
+ + + +
+ + + + +
+ +
+ + + + +
+ +
+ + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + +
+ +
+ +
+ + + + + + +
+ +
+ +
\ No newline at end of file