over 4 years ago

透過 Metadata Generator 扮演 Document Source 之一元件,
將病歷上傳至 Document Repository 存放及 Document Registry 註冊,
提供 Document Consumer 查詢及調閱

1. 組態設定 /src/main/resources/ProvideAndRegisterDocumentSet.properties

  • repository.endpoint;Repository 端口位置
  • sourceId:Document Source ID
ProvideAndRegisterDocumentSet.properties
repository.endpoint = http://localhost:8020/axis2/services/xdsrepositoryb?wsdl
sourceId = 1.3.6.1.4.1.21367.2010.1.2

1.1. 程式碼下載

下載

2. 初始化工作

Initial
// 建置 ProvideAndRegisterDocumentSet 交易物件,初始化 Webservice
// 取得 MetadataType 實體物件
// 設置 SumissionSet 分類
ProvideAndRegisterDocumentSet pnr = new ProvideAndRegisterDocumentSet(false);
MetadataType md = pnr.getMetadataInstance();
md.setContentTypeCode("Communication"); //SubmissionSet 分類

2.1. 建置病患基本資料

PatientInfoType
// 建置病患基本資料
pInfo = new PatientInfoType();
pInfo.setPid03("20131214^^^&1.3.6.1.4.1.21367.2005.3.7&ISO");
pInfo.setPid05("王大尾");
pInfo.setPid07("19990801000000");
pInfo.setPid08("M");
md.setPatientInfo(pInfo);

// 將病患基本資料描述於 SubmisstionSet 
md.setSourcePatientId(sourcePatientId);

2.2. 建置上傳交易之人員/機器資訊

AuthorType
// 建置上傳交易之人員/機器資訊
AuthorType a = new AuthorType();
a.setAuthorRole("行政");
a.setAuthorPerson("Gaduo");
a.setAuthorInstitution("花蓮慈濟醫院");
a.setAuthorSpecialty("行政");

// 將上傳交易的作者描述於 SubmisstionSet 
md.addAuthor(a);

3. 上傳一或多份文件

將要上傳一份醫學文件如:CDA、PDF、HL7、Word、Excel ... 等醫學記錄文件,須建置 Metadata 闡述該文件,並將該文件與 Metadata 在同一個 Webservice 交易中一併上傳至 Document Repository,最後接收成功與否的回應。

3.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立文件資訊

3.2. 程式示範

SubmitOneDocument
// 建立一份文件
// 文件標題,**副檔名** 重要,用於查詢 MIMEType 用
// 文件簡易敘述
// 文件擁有者的病患識別碼
// 文件內容由 Base64 編碼設定,也提供 Overload,可給予 byte[]、File、InputStream、Base64 字串
// 將上述病患資訊闡述於文件之中
DocumentType document = new DocumentType();
document.setTitle("Helloworld.txt");
document.setDescription("Helloworld.txt");
document.setSourcePatientId(sourcePatientId);
document.setContent("VGhpcyBpcyBteSBkb2N1bWVudC4NCg0KSXQgaXMgZ3JlYXQh");
document.setPatientInfo(pInfo);

// 建立文件的作者基本資料,可能是主治醫師、住院醫師、醫技人員等
DocumentAuthorType author = new DocumentAuthorType();
author.setAuthorRole("主治醫師");
author.setAuthorPerson("陳醫師");
author.setAuthorInstitution("花蓮慈濟醫院");
author.setAuthorSpecialty("心臟專科醫師");

// 將上述文件的作者闡述於文件之中
// 類別:用藥史、同意、分類、評估和管理、出院摘要等
// 文件格式代碼:CDA、PDF、TEXT、Generic Image、DICOM KOS
// 醫療照護機構代碼:家庭醫學診所、過敏診所、腎臟科診所、神經內科診所
// 臨床領域:一般醫學、重症照護醫學、心臟病學、糖尿病學、牙科、婦科
// 類型代碼:護理之家綜合病史和理學檢查記錄、介入治療記錄、血庫檢查
// 保密守則:一般、限制、名人、臨床醫生、限制共享、敏感,可複選
// 事件清單:腹部、乳房、支氣管、結腸、腹部主動脈,可複選
// 加入文件,若要上傳多份文件,可再建置其他 DocumentType 物件
document.addAuthor(author);
document.setClassCode("10160-0");
document.setFormatCode("urn:ihe:pcc:apr:lab:2008");
document.setHealthcareFacilityTypeCode("281PC2000N");
document.setPracticeSettingCode("394802001");
document.setTypeCode("34096-8");
document.addConfidentialityCode("N");
document.addEventCodeList("T-D4909");
document.addEventCodeList("TRID1001");
md.addDocument(document);

// 建置 DocumentEntry 與 SubmissionSet 的關聯
OMElement response = pnr.MetadataGenerator(md);

4. 上傳一個目錄

允許 Document Source 要求 Document Registry 建立目錄在雲端

4.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立目錄資訊

4.2. 程式示範

SubmitNewEmptyFolder
FolderType folder = new FolderType();
folder.setTitle("FF01");
folder.setDescription("FF01");
folder.setSourcePatientId(sourcePatientId);
folder.addFolderCodeList("Referrals");
folder.addFolderCodeList("Referrals");
md.addFolder(folder);

5. 上傳一個目錄並包含一或多份文件

5.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立文件資訊
  5. 建立目錄資訊
  6. 將文件加入至目錄

5.2. 程式示範

SubmitNewEmptyFolder
(略,參考1.1. 1.2.)
folder.addDocument(document);
md.addFolder(folder);

6. 一或多份已註冊於 Registry 的文件移動至已註冊的目錄之中

6.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立文件資訊:透過 ITI-18 查詢文件 EntryUUID, 或任何方式取得
  5. 建立目錄資訊:透過 ITI-18 查詢目錄 EntryUUID, 或任何方式取得
  6. 將文件加入至目錄

6.2. 程式示範

ExistingDocumentEntryAddToExistingFolder
(略,參考1.1. 1.2.)
DocumentType document = new DocumentType();
document.setExistingDocumentId(existingDocumentId);

FolderType folder = new FolderType();
folder.setExistingFolderId(existingFolderId);
folder.addDocument(document);       
md.addFolder(folder);

7. 上傳一或多份文件移動至已註冊的目錄之中

7.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立文件資訊
  5. 建立目錄資訊:透過 ITI-18 查詢目錄 EntryUUID, 或任何方式取得
  6. 將文件加入至目錄

7.2. 程式示範

DocumentEntrySubmittedAddedToExistingFolder
DocumentType document = new DocumentType();
document.setTitle("Hellow.txt");
document.setDescription("Hellow.txt");
document.setSourcePatientId(sourcePatientId);
document.setContent("VGhpcyBpcyBteSBkb2N1bWVudC4NCg0KSXQgaXMgZ3JlYXQh");
document.setPatientInfo(pInfo);
DocumentAuthorType author = new DocumentAuthorType();
author.addAuthorRole("主治醫師");
author.addAuthorPerson("黃柏榮醫師");
author.addAuthorInstitution("台北醫學大學附設醫院");
author.addAuthorSpecialty("乳房專科醫師");
document.addAuthor(author);
document.setClassCode("10160-0");
document.setFormatCode("urn:ihe:pcc:apr:lab:2008");
document.setHealthcareFacilityTypeCode("281PC2000N");
document.setPracticeSettingCode("394802001");
document.setTypeCode("34096-8");
document.addConfidentialityCode("N");
document.addConfidentialityCode("N");
document.addEventCodeList("T-D4909");
document.addEventCodeList("TRID1001");
        
FolderType folder = new FolderType();
folder.setExistingFolderId(existingFolderId);
folder.addDocument(document);   

8. 上傳一個目錄將一或多個已註冊文件移動至其中

8.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立文件資訊:透過 ITI-18 查詢文件 EntryUUID, 或任何方式取得
  5. 建立目錄資訊
  6. 將文件加入至目錄

8.2. 程式示範

ExistingDocumentEntryAddToFolder
DocumentType document = new DocumentType();
document.setExistingDocumentId(existingDocumentId);

FolderType folder = new FolderType();
folder.setTitle("FF01");
folder.setDescription("FF01");
folder.setSourcePatientId(sourcePatientId);
folder.addFolderCodeList("Referrals");
folder.addFolderCodeList("Referrals");
folder.addDocument(document);

9. Lifecyle

9.1. 附加 Append

9.1.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立子文件資訊
  5. 建立父文件資訊:透過 ITI-18 查詢文件 EntryUUID, 或任何方式取得
  6. 設定父文件與子文件相互關係:APND

9.1.2. 程式示範

APND
document.setExistingDocumentId(existingDocumentId);
try {
document.setOperation(DocumentType.APND);
} catch (Exception e) {
e.printStackTrace();
}
md.addDocument(document);

9.2. 取代 Replace

9.2.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立子文件資訊
  5. 建立父文件資訊:透過 ITI-18 查詢文件 EntryUUID, 或任何方式取得
  6. 設定父文件與子文件相互關係:RPLC

9.2.2. 程式示範

RPLC
document.setExistingDocumentId(existingDocumentId);
try {
document.setOperation(DocumentType.RPLC);
} catch (Exception e) {
e.printStackTrace();
}
md.addDocument(document);

9.3. 翻譯 Transform

9.3.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立子文件資訊
  5. 建立父文件資訊:透過 ITI-18 查詢文件 EntryUUID, 或任何方式取得
  6. 設定父文件與子文件相互關係:XFRM

9.3.2. 程式示範

XFRM
document.setExistingDocumentId(existingDocumentId);
try {
document.setOperation(DocumentType.XFRM);
} catch (Exception e) {
e.printStackTrace();
}
md.addDocument(document);

9.4. 翻譯並取代 Transform And Replace

9.4.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立子文件資訊
  5. 建立父文件資訊:透過 ITI-18 查詢文件 EntryUUID, 或任何方式取得
  6. 設定父文件與子文件相互關係:XFRM_RPLC

9.4.2. 程式示範

XFRM_RPLC
document.setExistingDocumentId(existingDocumentId);
try {
document.setOperation(DocumentType.XFRM_RPLC);
} catch (Exception e) {
e.printStackTrace();
}
md.addDocument(document);

9.5 數位簽章 Signs

9.5.1. 建立 Metadata

  1. 初始化工作
  2. 建置病患基本資料
  3. 建置上傳交易之人員/機器資訊
  4. 建立子文件資訊
  5. 建立父文件資訊:透過 ITI-18 查詢文件 EntryUUID, 或任何方式取得
  6. 設定父文件與子文件相互關係:SIGNS

9.5.2. 程式示範

SIGNS
document.setExistingDocumentId(existingDocumentId);
try {
document.setOperation(DocumentType.SIGNS);
} catch (Exception e) {
e.printStackTrace();
}
md.addDocument(document);

10. Metadata Generator Schema

Metadata Generator
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="MetadataGenerator" type="metadataType"/>

  <xs:complexType name="metadataType">
     <xs:sequence>
       <xs:element name="RepositoryUrl" type="xs:string" minOccurs="0"/>
       <xs:element name="SourcePatientId" type="xs:string" minOccurs="1"/>
       <xs:element name="PatientInfo" type="PatientInfo" minOccurs="1"/>
       <xs:element name="Authors" type="Authors" minOccurs="1"/>
       <xs:element name="ContentTypeCode" type="xs:string" minOccurs="1"/>
       <xs:element name="Documents" type="Documents" minOccurs="0"/>
       <xs:element name="Folders" type="Folders" minOccurs="0"/>
     </xs:sequence>
  </xs:complexType>

  <xs:complexType name="PatientInfo">
     <xs:sequence>
       <xs:element name="PID-3" type="xs:string" minOccurs="1"/>
       <xs:element name="PID-5" type="xs:string" minOccurs="1"/>
       <xs:element name="PID-7" type="xs:string" minOccurs="1"/>
       <xs:element name="PID-8" type="xs:string" minOccurs="1"/>
       <xs:element name="PID-11" type="xs:string" minOccurs="0"/>
     </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Authors">
    <xs:sequence>
      <xs:element name="Author" type="Author" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

    <xs:complexType name="Author">
        <xs:sequence>
            <xs:element name="authorPerson" type="xs:string" minOccurs="0" />
            <xs:element name="authorInstitution" type="xs:string" minOccurs="0" />
            <xs:element name="authorRole" type="xs:string" minOccurs="0" />
            <xs:element name="authorSpecialty" type="xs:string" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

  <xs:complexType name="Documents">
    <xs:sequence>
      <xs:element name="Document" type="Document" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Document">
     <xs:sequence>
       <xs:element name="Title" type="xs:string" minOccurs="1"/>
       <xs:element name="Description" type="xs:string" minOccurs="1"/>
       <xs:element name="CreationTime" type="xs:string" minOccurs="1"/>
       <xs:element name="MimeType" type="xs:string" minOccurs="1"/>
       <xs:element name="Content" type="xs:string" minOccurs="1"/>
       <xs:element name="DocumentAuthors" type="DocumentAuthors" minOccurs="1"/>
       <xs:element name="ClassCode" type="xs:string" minOccurs="1"/>
       <xs:element name="FormatCode" type="xs:string" minOccurs="1"/>
       <xs:element name="HealthcareFacilityTypeCode" type="xs:string" minOccurs="1"/>
       <xs:element name="PracticeSettingCode" type="xs:string" minOccurs="1"/>
       <xs:element name="TypeCode" type="xs:string" minOccurs="1"/>
       <xs:element name="ConfidentialityCodes" type="Codes" minOccurs="1" maxOccurs="unbounded"/>
       <xs:element name="EventCodeList" type="Codes" minOccurs="0" maxOccurs="unbounded"/>
       <xs:element name="Operation" type="xs:int"/>
       <xs:element name="ExistingDocumentId" type="xs:string" minOccurs="1"/>
     </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Codes">
    <xs:sequence>
      <xs:element name="Code" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="DocumentAuthors">
    <xs:sequence>
      <xs:element name="DocumentAuthor" type="DocumentAuthor" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="DocumentAuthor">
    <xs:complexContent>
      <xs:extension base="Author">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Folders">
    <xs:sequence>
      <xs:element name="Folder" type="Folder" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Folder">
     <xs:sequence>
       <xs:element name="Title" type="xs:string" minOccurs="1"/>
       <xs:element name="Description" type="xs:string" minOccurs="1"/>
       <xs:element name="Documents" type="Documents" minOccurs="0"/>
       <xs:element name="FolderCodeList" type="Codes" minOccurs="1"/>
       <xs:element name="ExistingFolderId" type="xs:string" minOccurs="1"/>
     </xs:sequence>
  </xs:complexType>
</xs:schema>
← Android - 使用資料庫 SQLite Android - Bluetooth 藍牙 →
 
comments powered by Disqus