# FHIR Observation入門 ## 何謂FHIR 在這裡指的是醫護端為了實現數據交換和訊息共享的標準,於不同系統之間的資料能互通且能標準化,而標準化是能基於FHIR官網的規格來訂定JSON格式的資料,能夠把這些資料上傳至FHIR API,這樣便能於不同系統之間進行調閱以及上傳。 ## FHIR Observation應用於哪一些方面 1. 生理測量數據:包括血壓、心率、體溫、血糖、血氧飽和度等各種生理參數的測量結果。 2. 實驗室結果:用於表示實驗室檢查的結果,例如血液化驗、尿液檢查、生化指標、細胞學檢查等。 3. 臨床評估:包括醫生對患者身體狀況、症狀、疼痛程度等進行的觀察和評估的結果。 4. 影像檢查結果:包括X射線、CT掃描、MRI等各種影像檢查的結果。 所以基於以上的應用,FHIR Observation可以用於PHR端,如上述的基本血壓或心率量測;反之也可以應用於EMR端,如上述的血液檢查...等在醫院的測量,而PHR端可以上傳生理監測,醫護端也可以,兩者階可以進行上傳與調閱之功能。 ## 基於FHIR Observation所確立之基本JSON欄位 在這裡的範例我們以收縮壓作為範例,而在填寫範例之前必須先要有病人的基本資料,故請先填寫完基本資料後再填寫生理監測資料。 #### JSON資料範例 ```json= { "resourceType": "Observation", "status": "final", "category": [ { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs", "display": "Vital Signs" } ], "text": "Vital Signs" } ], "code": { "coding": [ { "system": "http://loinc.org", "code": "8480-6", "display": "Systolic blood pressure" } ], "text": "Systolic Blood Pressure" }, "subject": { "reference": "Patient/1111" }, "effectiveDateTime": "2023-11-11", "valueQuantity": { "value": 120, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]" } } ``` 1. category: 這個欄位包含此觀察值屬於哪種分類,通過 coding 屬性來描述觀察的類別。 2. code: 這個欄位包含了觀察的代碼信息,包括了觀察的名稱和代碼 3. subject: 這個欄位表示此觀察值屬於哪位病人,通過 reference屬性引用了一個特定的患者 4. effectiveDateTime: 這個欄位表示此觀察值於哪一天測量,這裡是"2023-11-11",表示這個觀察是在 2023 年 11 月 11 日進行的。 5. valueQuantity: 這個欄位包含了觀察的值,以及值的單位信息。在這個示例中,觀察的值是 120,單位是 "mm[hg]",表示收縮壓。 ## 基於JSON物件產生可更動的HTML表單 要基於FHIR Observation來製作網頁表單通常會有以下的元素,這裡以血壓為例子: 1. input標籤: 用來輸入病人ID或者是血壓的生理監測數值。 2. button: 這裡把input標籤以button形式宣告此按鈕,當按出去時會進行上傳至FHIR Server的動作。 2-1: 將所填寫完的值利用jaascript的方式來把值存入JSON物件中 2-2: 將物件轉成JSON字串 2-3: 設定需要上傳的FHIR API網址 2-4: 建立Https的通訊協定 #### 以下為建立填寫收縮壓之生理監測表單 ```htmlembedded= <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script src="setting.js"></script> <script src="HTTPlink.js"></script> <body style="height: 780px"> <h3>新增(上傳)生理監測資料</h3> 病人ID: <input type="text" id="id" /> <br/> <br/> 測量時間: <input type="text" id="time" /> <br/> 收縮壓: <input type="text" id="DFS" /> <br/> <br/> <input id="Button1" onclick="postData()" type="button" value="postData" /> </body> </html> ``` #### 上傳至FHIR Server之程式碼參考 ```javascript= function postData() { myObj.subject.reference = "Patient/"+document.getElementById("id").value; myObj.effectiveDateTime = document.getElementById("time").value; myObj.valueQuantity.value = document.getElementById("DFS").value; var jsonStr = JSON.stringify(myObj); alert(jsonStr); var apiURL; apiURL = FHIRrootURL + '/' + "Observation"; HTTPPostData(apiURL, jsonStr); } ``` 1. 第一步先把填寫至欄位的值些讀取至myObj的物件中,例如: myObj.subject.reference代表著要存入myObj的物件中subject這欄位裡的reference這位置上,而需要把數值填入哪一個欄位則以此方式取值來類推。 2. 第二步則是把JSON物件變成JSON字串,這步驟很重要,因為在上傳至FHIR Server中需要利用Http協定來進行上傳,而Http上傳只接受字串,故需在此步驟進行轉字串的動作,如: var jsonStr = JSON.stringify(myObj) 這動作。 3. 最後指定上完路徑上傳至指定FHIR Server中,只需要確立好上傳路徑即可,上傳成功與否則是由後端程式去執行。 #### Http協定之上傳程式碼(參考即可,上傳動作類似,直接複製即可) ```javascript= function HTTPPostData(urlStr, dataStr ) { var HttpObj = new XMLHttpRequest(); HttpObj.open("POST", urlStr, true); HttpObj.setRequestHeader("Content-type", "application/json+fhir"); HttpObj.onreadystatechange = function () { if (HttpObj.readyState === 4) { ret = HttpObj.responseText; alert(ret); } } HttpObj.send(dataStr); } ``` ## 如何進行延伸別的生理監測表單 1. 首先可以更改input之標籤以及填寫內容之標題內容,如下圖框起來所示。 ![螢幕擷取畫面 2024-02-28 193420](https://hackmd.io/_uploads/rJsi992ha.png) 2. 之後可以修改JSON物件之category,code及valueQuantity的欄位,因為測量類型可能不一樣,如下圖所示。 ![螢幕擷取畫面 2024-02-28 193830](https://hackmd.io/_uploads/rJhti9h3a.png) ![螢幕擷取畫面 2024-02-28 193856](https://hackmd.io/_uploads/S1X9i922a.png) 完成以上兩件事即可修改成新的生理監測之功能,非常簡單。 ## 延伸補充(Observation之調閱) 已知我們可以在FHIR Server上查看觀察值的JSON資料,但大多數醫生或者是病人看不懂怎麼樣解析這個資料,所以可以透過網頁產生表格或是摺線圖的方式來讓數據明顯化,以下示例為產生規格化的表格之畫面: ![螢幕擷取畫面 2024-03-11 162853](https://hackmd.io/_uploads/rJ7J-H3ap.png) #### 產生次畫面之範例程式碼(使用Javascript) ```javascript= var myObj; function callBack() { myObj= JSON.parse(ret); //把JSON格式資料转换为 JavaScript 对象 } function showData() { HTTPGetData("https://fhir.tcumi.com:58443/r5/fhir/Observation?subject="+document.getElementById("ID").value); var tableStr = "<tr> <th >測量日期</th><th>數值(mm[hg])</th></tr>"; for (i = 0; i <myObj.entry.length; i++) { var trStr = "<tr>"; trStr = trStr + "<td>"; trStr = trStr + myObj.entry[i].resource.effectiveDateTime; trStr = trStr + "</td>"; trStr = trStr + "<td>"; trStr = trStr + myObj.entry[i].resource.valueQuantity.value; trStr = trStr + "</td>"; trStr = trStr + "</tr>"; tableStr = tableStr + trStr; } document.getElementById("t1").innerHTML = tableStr; addRowHandlers("t1"); // add event to table t1 document.getElementById("t1").style.visibility = "visible"; } ``` #### 產生次畫面之範例程式碼(使用HTML) ```htmlembedded= <body style="height: 780px"> <h2>收縮壓查詢</h2> <p> <h3>要搜尋的病人的ID: <input id="ID" type="text"/></h3> <input id="Button1" onclick="showData();" type="button" value="搜尋" /></p> <table id = "t1" style="visibility: hidden;"></table><br/> </body> ``` ## 作業(占總成績20%) 1. 請根據上述的內容修改成自己想測量之生理監測之的表單,並成功上傳至FHIR Server中,請先操作此表單前先填寫完病人資料取的ID,才能進行填寫生理監測表單,之後把成功上傳之作業連結傳到ican上(包含病人ID以及該病人的生理監測資料),上傳之FHIR Server之連結為(var FHIRrootURL ="https://fhir.tcumi.com:58443/r5/fhir")。(10分) 2. 完成上傳時在設計一個網頁,以表格的樣式讀取已上傳的資料,資料筆數至少為3筆。(10分) #### 其他之Observation之JSON物件之參考連結 [https://drive.google.com/drive/folders/1RFCAufR0v_8QDfObempBv4MpdYaiRCzK](https://) ## 會議時間 1. 3/31 15:00~17:00 討論FHIR Observation調閱並製成折線圖(視訊討論) 2. 4/8 17:00~19:00 討論FHIR ServiceRequest的規格(與學弟妹在H707討論,可否定餐點?) 3. 4/19 15:00~17:00 與謝組長討論應用於放腫科癌病PHR系統與所需要的FHI規格(視訊討論) ## 作業繳交 1. 病人ID: 6154 2. 上傳病人成功連結: https://fhir.tcumi.com:58443/r5/fhir/Patient/6154 3. 上傳生理監測成功連結: [https://fhir.tcumi.com:58443/r5/fhir/Observation?subject=6154](https://) 4. 成功調閱之頁面: ![螢幕擷取畫面 2024-03-28 103823](https://hackmd.io/_uploads/SyUH_IGkR.png)