
Bonjour Je m'appelle Andrey, je travaille dans une entreprise qui crée des solutions informatiques dans le domaine de la médecine. En tant que langage de développement principal, nous utilisons Clojure, ainsi que (selon le projet / module) Python, Javascript, Go, C, C #, Rust, Objective-C, etc.
Une place importante dans notre pile technologique est occupée par la norme internationale
FHIR (Fast Healthcare Interoperability Resources), qui définit le format de stockage / échange / fourniture d'informations médicales sous forme électronique et inclut la spécification
RESTful API d'interaction client-serveur.
Il y a quelque temps, j'ai commencé un projet pour animaux de compagnie d'une application qui visualise le contenu des ressources d'un serveur FHIR arbitraire et vous permet d'effectuer des opérations CRUD de base. Le KDPV montre une capture d'écran de la page d'édition d'un élément de ressource de type Patient.
Sous le chat, il y a une courte description et un lien vers une démo en ligne - vous pouvez sentir le vrai serveur FHIR en direct, piquer des boutons, voir / créer / modifier diverses ressources, et même essayer d'appeler le même effet habra! )
Quelques mots sur FHIR
Je ne réécrirai pas la description de la norme ici, ceux qui le souhaitent peuvent apprendre tous les détails à partir du lien ci-dessus, lire d'autres documents sur diverses ressources, ainsi que poser des questions et participer à la discussion dans le
chat FHIR . Je ne donnerai qu'une idée générale: le concept central est une ressource, les ressources sont divisées par types et groupes, chaque type a sa propre structure de champ, dont les valeurs peuvent être des types primitifs ou composites et des liens vers d'autres ressources. Les champs peuvent être obligatoires ou facultatifs, contenir une valeur ou une collection de valeurs. Par exemple, la ressource
Patient a des champs de type primitif: date de naissance / sexe / ..., type composite: nom / adresse / ...., des liens vers l'organisation et la liste des médecins traitants, etc.
Pour chaque ressource, l'historique de ses modifications est stocké sous forme de liste d'états avec les dates de leur pertinence et le numéro de version de l'objet. L'API RESTful vous permet de demander des métadonnées sur la composition et la structure des ressources prises en charge par ce serveur FHIR, une liste d'éléments de ressource de tout type avec de larges capacités de filtrage en fonction des valeurs des paramètres individuels, l'inclusion des ressources dépendantes, restreindre la sortie des résultats aux valeurs des champs répertoriés, trier le résultat de la requête par des critères complexes, et etc. Il existe également des méthodes pour prendre en charge CRUD au niveau d'un élément de ressource - création / mise à jour avec validation de la structure et présence de champs obligatoires, suppression d'un élément. Il existe des méthodes API pour afficher l'historique des modifications à la fois au niveau de l'élément et au niveau du type de ressource.
Dans une application typique, l'utilisation de cette API générique est abstraite par une couche épaisse de logique métier pour un client particulier. Par exemple, lors de la nomination d'un patient chez un médecin, on lui demande des données sur le nombre de ses assurances médicales et la durée de leur validité, un historique des visites précédentes, des informations sur l'équilibre des règlements entre le patient et la clinique, etc., des données sur le calendrier du médecin sélectionné et la disponibilité des heures d'admission .p. Et tout cela est commodément présenté sur l'écran du lieu de travail de l'employé effectuant l'enregistrement. Ou, le planificateur de tâches automatique démarre périodiquement un processus selon un calendrier donné, demandant une liste des visites à venir et envoyant automatiquement des SMS aux patients avec le texte des rappels ou des notifications selon des modèles prédéfinis.
Mais j'ai eu l'idée de faire une visualisation universelle du contenu des ressources du serveur FHIR, et donc un projet appelé ...
Fhir-face
L'application vous permet de vous connecter à n'importe quel serveur FHIR et de visualiser le contenu des ressources et CRUD de base. L'une des difficultés de cette approche universelle est que différents serveurs peuvent avoir différentes versions de la norme FHIR, ne pas l'implémenter complètement, avoir des écarts dans la liste, la composition et la structure des ressources et des API, et également avoir des fonctionnalités supplémentaires qui ne sont pas incluses dans la spécification . Mais si ce serveur vous permet de demander des métadonnées sur la composition et la structure des ressources prises en charge, vous pouvez ajouter sa prise en charge dans ce projet.
L'interface du projet est intuitive. L'adresse du serveur est sélectionnée via le paramètre de la barre d'adresse, mais dans la version de démonstration actuelle
hapi.fhir.org est sélectionné par
défaut . À partir de la page de démarrage, la composition et la structure des ressources sont téléchargées et il est proposé de sélectionner un type spécifique de ressource pour afficher son contenu. Lors du choix du type de ressource, une demande est faite pour un nombre limité de ses éléments, qui sont affichés dans un tableau avec des colonnes: identifiant, représentation conditionnelle de l'utilisateur (si possible) et taille en caractères de sérialisation de chaîne. Une recherche en texte intégral sur le contenu de la ressource fonctionne. Lorsque vous cliquez sur une ligne du tableau ou sur le bouton de création d'un nouvel élément, une redirection vers la page du contenu de l'élément ressource se produit.
En haut de la page de l'élément, il y a des boutons pour une convolution / dépliage complet du contenu hiérarchique et un bouton pour changer le style de présentation des détails. Le contenu de l'article est représenté par une liste de détails. Chaque attribut a un nom, un type, une courte description et une signification. Un cercle rempli de noir à gauche de l'attribut signifie que cet attribut est présent dans la ressource (même si sa valeur n'est pas sélectionnée - dans ce cas, l'attribut a cet attribut, mais il a une valeur vide), un cercle vide indique l'absence de cet attribut dans l'élément, mais la liste détails de la structure de ce type de ressource. Tout attribut peut être ajouté / supprimé de l'élément en cliquant sur l'icône de cercle à gauche du nom. Les détails non répertoriés dans la structure du type de ressource, mais disponibles dans l'élément, sont surlignés en violet.
Les valeurs des types primitifs sont représentées par les widgets typés correspondants - date, heure, nombre, chaîne, etc. L'icône à droite des détails de la chaîne bascule le mode de saisie / édition de texte - avec ou sans sauts de ligne. Lors de l'édition, le widget se redimensionne automatiquement en fonction de son contenu. Lorsque vous commencez à remplir le formulaire, tous les champs de texte de plus de 50 caractères sont représentés par des widgets textArea avec des sauts de ligne. Les widgets de lien sont représentés par le type de la ressource de lien et la valeur, lorsque vous choisissez une valeur, une recherche en texte intégral sur le contenu de la ressource de lien fonctionne.
Les détails des types composites peuvent être réduits pour mettre en évidence le nombre de détails subordonnés possibles et remplis ou déployés avec une démonstration du contenu. Lorsque vous cliquez sur le nom / type / description du requis, une convolution / dépliage complet et profond du contenu est déclenché, lorsque vous cliquez sur la surbrillance, le nombre de champs correspond au déploiement du niveau suivant des exigences. Les attributs de collection (avec un nombre arbitraire de valeurs) ont une icône
+ à droite de la description de l'attribut - pour ajouter de nouvelles valeurs à la collection. La convolution / dépliage d'un élément de collection (s'il s'agit à son tour d'une valeur de type composite) s'effectue en cliquant sur la partie la plus à droite du cadre délimitant l'élément de collection. Lorsque vous cliquez sur la croix dans le coin supérieur droit du cadre, l'élément de collection est supprimé.
Cette interface vous permet de modifier le contenu de n'importe quelle ressource. Au bas de la page se trouve un bouton pour enregistrer la ressource dans l'état modifié. Lorsqu'une ressource est écrite, le serveur FHIR valide son contenu et s'il y a des erreurs, il n'enregistre pas la ressource, mais renvoie une liste d'erreurs de validation. Dans ce cas, le texte de ces erreurs est affiché en rouge sous le bouton Enregistrer. La structure de l'objet des erreurs de validation est déterminée par l'implémentation du serveur; par conséquent, une variante de sa représentation textuelle universelle a été choisie. S'il n'y a pas d'erreur, l'élément de ressource est enregistré et redirigé vers la page de liste des éléments.
Et enfin, les liens promis:
Démo en ligne du projetGithub du projet - le chat n'est pas un animal en peluche d'exposition, mais un travailleur vivant, il y a donc des zones commentées, des échafaudages et d'autres éléments nécessaires pour les travaux de construction et d'installation, portez des casques)