Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

TODO: titel? 

links til gavn under skrivning:

...

NXRG - Design- og arkitekturbeskrivelse

Indledning

Formål

Dokumentdeling gør det muligt for aktører sundhedsvæsnet at dele relevante data om borgere, og dermed skabe et overblik over den enkelte borgers situation for de aktører som har brug for dette. Det kan være dem, som planlægger og gennemfører behandlingsforløb eller for borgerens selv og omsorgspersoner. Samtidig skal det være muligt for borgeren at bestemme, hvem han/hun vil dele disse data med gennem samtykke samt se, hvem der har læst data via MinLog. Infrastrukturen der muliggør deling af dokumenter på tværs af sundhedsaktører er baseret på IHE XDS standarden

...

Der forventes et hvis kendskab til CDA dokumenter - da fokus ikke er disse, ligesom kendskab til anvendelse af DGWS, NSP og SDN  forventes. Hjælpe moduler som MinSpæring, MinLog og andre komponenter, der er i spil i forbindelse med dokumentdeling berøres heller ikke andet overfladisk.

Hvad er dokumenter

Data i en XDS infrastruktur gemmes som dokumenter. Et dokument har et unikt id (documentId) og en række metadata, der beskriver, hvad dokumentet handler om. Dokumenter kan indholdsmæssigt være af flere forskellige typer: PDF, Word-dokument, men kan også være af typen CDA (Clinical Document Architecture). Et CDA dokument er egentlig bare et struktureret XML dokument, der følger en bestemt standard for kliniske dokumenter til udveksling (deling). Se f.eks. What is HL7 CDA? for en kort beskrivelse. Her kan man bl.a. se, at CDA findes på forskellige niveauer 1-3, hvor 3 har den højeste grad af struktur.

...

TODO: andre dokumenttyper af ondemand som skal nævnes med navn?

Hvad er dokumentdeling

XDS står for Cross-Enterprise Document Sharing og er en international standard udarbejdet af Integrating the Healthcare Enterprise (IHE) for udveksling af kliniske dokumenter. En XDS infrastruktur består (mindst) af følgende to komponenter:

...

IHE XDS standarden er specificeret i en række dokumenter som findes her (revision og dato matcher versionen da link indsat):

IdBeskrivelseLink *
ITI TF-1

Alle IHE profilerne beskrives.

For NSP dokumentdeling er relevant afsnit

  • "10. Cross-Enterprise Document Sharing (XDS.b)"

Man vil også kunne finde brugbar information i flere af appendixerne.

IHE IT Infrastructure Technical Framework Volume 1 (ITI TF-1) Integration Profiles (Revision 17.0 – Final Text)
ITI TF-2

Hvert ITI håndtag beskrives med definition, information som overføres og begrænsninger

Hvilket afsnit, som er relevant afhænger af hvilke ITI håndtag man skal implementere.

Skal man lave fremsøgning (ITI-18) vælges afsnit "3.18 Registry Stored Query [ITI-18]"

IHE IT Infrastructure (ITI) Technical Framework, Volume 2 Revision 18.0, July 30, 2021 – Final Text
ITI TF-3

Her beskrives metadata ved dokumentdeling. 

For NSP dokumentdeling er relevant afsnit

  • "4 Metadata used in Document Sharing profiles"
IHE IT Infrastructure (ITI) Technical Framework, Volume 3 Revision 18.0, July 30, 2021 – Final Text
ITI TF-Metadata

Her beskrives Opdatering af metadata, som endnu ikke er med i den udgivne specifikation.

Dokumentet indeholde de dele, som med tiden skal flettes ind i 1-3 ovenfor. 

Hvis man skal implementere opdatering af metadata (ITI-57) kan følgende afsnit være relevante:

  • 10 Cross-Enterprise Document Sharing (XDS.b)
  • 3.57 Update Document Set [ITI-57]
  • 4.1 Abstract Metadata Model
  • 4.3 Additional Document Sharing Requirements
IHE IT Infrastructure Technical Framework Supplement 10 XDS Metadata Update 15 Rev. 1.12 – Trial Implementation July 2, 2021

...



(*revision og dato matcher versionen da link indsat)


Hvis man skal igang med dokumentdeling, og ingen kendskab har til ovenstående specifikationer, kan en tilgang være:


Arkitekturoversigt af komponenter

På NSP består dokumentdelings infrastrukturen af følgende komponenter.

...

Minlog, behandlingsrelationer, minSamtykke (filter) og værdispring


Hvordan kommer man igang

Komponenterne i dokumentdelings infrastrukuren kommunikerer med ITI kald, som er standardiserede SOAP services, der skal overholde IHE XDS specifikationen.  De er i det såkaldte XML basererede "RIM format"

Det er op til anvenderen/udvikleren selv at vælge platform og frameworks, der passer til resten af dennes løsning. Fra et udvikler perspektiv kan man enten vælge selv at generere stubkode udfra de standardiserede WSDL filer eller at anvende et tredjepartsprodukt.  Nedenfor gives et forslag til, hvordan det kan gribes an med tredjepartsproduktet IPF Open eHealth Integration Platform, som forudsætter man arbejder på en java platform. Andre platforme kan have tilsvarende værktøjer og muligheder.

Da dokumentdelingen kører på NSP og sundhedsdatanettet (SDN) skal man anvende Den gode Web Service og have adgang til SDN for den del af miljøerne. Dette beskrives ikke yderligere her.

OpeneHealth biblioteket til Java

Man behøver ikke at basere alting på Camel, men kan med fordel nøjes med at inkludere biblioteket IPF Commons IHE XDS i sin kodebase. Her findes både stubbe og en masse anvendelige utilitiesDisse kan blandt andet mappe fra RIM formatet til en en "OpeneHealth core model", som er java klasser. Og gør det at udvikle ITI kald lettere at arbejde med.

Helt overordnet kan det at lave et ITI kald deles op i følgende trin

  1. Opret kald i OpeneHealth code model
    1. For ITI41 kald indebærer det blandt andet opret/indlæs af dokument samt opret af metadata til documententry
    2. For ITI42, 57 og 61 indebærer det oprettelse af metadata
    3. For ITI18 skal søge kriterierne sættes op
    4. For ITI43 skal dokumentiderne sættes op
  2. Udfør kald - det transformeres til RIM formatet på vej ud, og tilbage til core model ved returnering automatisk vha. openeHealth frameworket
  3. Aflæs kaldets svar og håndter eventuelle fejl returneret. For ITI-18 og ITI-43 er der ligeledes dokument id'er henholdsvis dokumenter, der skal håndteres.

Dette kan illustreres ved følgende transformeringsdiagram, hvor man ser core modellen blive transformateret til RIM formatet og efterfølgende et ITI kald udført. Resultatet af ITI kaldet kommer tilbage i RIM format, og transformeres til core modellen:

Gliffy Diagram
displayNametransformering
nametransformering
pagePin2


Et eksempel på, hvordan forskellen mellem core model og RIM format kommer til udtryk, ses her for håndtering af confidentiality code og CPR nummer i forbindelse med oprettelse af et dokument.

Først OpeneHealth core model, den kode man skriver i sit program:

Code Block
languagejava
linenumberstrue
documentEntry.getConfidentialityCodes().add(new Code("N", new LocalizedString("N"), "2.16.840.1.113883.5.25"));

AssigningAuthority patientIdAssigningAuthority = new AssigningAuthority("1.2.208.176.1.2");
Code patientCode = new Code("2512489996", new LocalizedString("CPR"), "1.2.208.176.1.2");
documentEntry.setPatientId(new Identifiable(patientCode, patientIdAssigningAuthority));


Og her tilsvarende RIM format, som openeHealth automatisk oversætter det til og som anvendes ved ITI kaldet:

Code Block
languagexml
linenumberstrue
<ns2:Classification classificationScheme="urn:uuid:f4f85eac-e6cb-4883-b524-f2705394840f" classifiedObject="urn:uuid:69d3b9f3-7919-40e0-8731-32fb339216c2" nodeRepresentation="N" id="urn:uuid:9068bc2b-1717-4337-abfb-027f303b20c6">
  <ns2:Slot name="codingScheme">
    <ns2:ValueList>
      <ns2:Value>2.16.840.1.113883.5.25</ns2:Value>
    </ns2:ValueList>
  </ns2:Slot>
  <ns2:Name>
    <ns2:LocalizedString xml:lang="en-US" charset="UTF-8" value="N"/>
  </ns2:Name>
</ns2:Classification>

<ns2:ExternalIdentifier registryObject="urn:uuid:69d3b9f3-7919-40e0-8731-32fb339216c2" identificationScheme="urn:uuid:58a6f841-87b3-4a3e-92fd-a8ffeff98427" value="2512489996^^^&1.2.208.176.1.2&ISO" id="urn:uuid:6dc240d8-d871-4df1-b8c6-3414f1415022">
  <ns2:Name>
    <ns2:LocalizedString value="XDSDocumentEntry.patientId"/>
  </ns2:Name>
</ns2:ExternalIdentifier> 


Det følgende er eksempelkode til at illustrere et ITI-41 kald til oprettelse af et dokument

Code Block
languagejava
titleEksempel på ITI-41 kald
linenumberstrue
// Nyt kald/request 
ProvideAndRegisterDocumentSet provideAndRegisterDocumentSet = new ProvideAndRegisterDocumentSet();

// Opret documentEntry
DocumentEntry documentEntry = new DocumentEntry();
AssigningAuthority patientIdAssigningAuthority = new AssigningAuthority("1.2.208.176.1.2"); // OID for CPR registret
Identifiable patientIdentifiable = patientIdentifiable = new Identifiable("2512489996", patientIdAssigningAuthority);
documentEntry.setPatientId(patientIdentifiable);
... mere metadata, se CDA profilen

// Tilføj dokumentet til request
provideAndRegisterDocumentSet.getDocuments().add(new Document(documentEntry, new DataHandler(new ByteArrayDataSource(documentPayload.getBytes(), documentEntry.getMimeType()))));

// Opret SubmissionSet
provideAndRegisterDocumentSet.setSubmissionSet(createSubmissionSet(documentEntry.getPatientId(), contentTypeCode, submissionTime));

// Opret association mellem SubmissionSet og DocumentEntry
provideAndRegisterDocumentSet.getAssociations().add(createAssociation(submissionSet, documentEntry));

// Transformer request - dette laver core model om til RIM format
ProvideAndRegisterDocumentSetTransformer registerDocumentSetTransformer = new ProvideAndRegisterDocumentSetTransformer(ebXMLFactory);
EbXMLProvideAndRegisterDocumentSetRequest30 ebxmlRequest = (EbXMLProvideAndRegisterDocumentSetRequest30) registerDocumentSetTransformer.toEbXML(provideAndRegisterDocumentSet);
ProvideAndRegisterDocumentSetRequestType provideAndRegisterDocumentSetRequestType = ebxmlRequest.getInternal();

// Udfør kald
RegistryResponseType registryResponse = iti41PortType.documentRepositoryProvideAndRegisterDocumentSetB(provideAndRegisterDocumentSetRequestType);

// Transformer response - dette laver RIM format til core model
ResponseTransformer responseTransformer = new ResponseTransformer(ebXMLFactory);
Response response = responseTransformer.fromEbXML(new EbXMLRegistryResponse30(registryResponse));

// Aflæs kaldets svar
if (response.getStatus().equals(Status.SUCCESS.getOpcode30())	) {
	// Kaldet gik godt
} else {
	// Der er fejl i kaldet, håndter dem
	for (RegistryError error : response.getRegistryErrorList().getRegistryError()) {
	}
} 

(Det er flere detaljer omkring ITI-41 eksempelkode i anvender guiden til DROS.)

TODO map til tegning

Et tilsvarende eksempel for ITI-18 fremsøgning kunne se således ud:

Code Block
languagejava
titleEksempel på ITI-18 kald
linenumberstrue


evt. request resspone 

eksempler på brug af librariet (hvilke objekter og hvilke id'er skal man tage stillinger)

...

husk at nævne overholdes af medcom standard for metadata i documententry

Biblioteker til .Net

De følgende links kan alle bidrage til at lette arbejdet med at implementere dokumentdeling.

...