# 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之標籤以及填寫內容之標題內容,如下圖框起來所示。

2. 之後可以修改JSON物件之category,code及valueQuantity的欄位,因為測量類型可能不一樣,如下圖所示。


完成以上兩件事即可修改成新的生理監測之功能,非常簡單。
## 延伸補充(Observation之調閱)
已知我們可以在FHIR Server上查看觀察值的JSON資料,但大多數醫生或者是病人看不懂怎麼樣解析這個資料,所以可以透過網頁產生表格或是摺線圖的方式來讓數據明顯化,以下示例為產生規格化的表格之畫面:

#### 產生次畫面之範例程式碼(使用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. 成功調閱之頁面: 