# FHIR ServiceRequest期末報告(ServiceRequest延伸擴充)
#### 組員: 林毓文 顏廷軒 龍昱璇 黃冠綸 簡昕儀
## PHR端所產生的ServiceRequest有哪些
1. 預約醫療服務: 病人可以透過 PHR 端發出預約醫生或專業醫療服務的請求,包括診所或醫院的預約、檢查預約等。
2. 健康資訊查詢: 病人可能會請求特定健康問題的資訊,像是疾病症狀、治療方案、飲食建議等。
3. 檢驗報告查詢: 病人可以要求檢視或下載先前的檢驗報告,方便自我管理或與其他醫生分享。
4. 健康諮詢: 透過 PHR,病人可以提出健康問題或病情詢問,並請求專業醫護人員提供建議或回答疑問。
5. 治療跟進: 患者可能會要求跟進先前的治療計畫或建議,以調整治療方案或討論病情進展。
## EMR端所產生的ServiceRequest有哪些
1. 檢驗或檢查請求: 醫生可以通過 EMR 系統發出患者進行特定檢驗或檢查的請求,例如血液檢查、X 光、MRI 等。
2. 處方藥物: 醫生可以透過 EMR 系統發出處方給患者,包括藥物的劑量、用法和頻率等信息。
3. 治療計畫或手術請求: 醫生可以在 EMR 中記錄治療計畫或手術需求,包括手術細節、預定時間和相關醫療團隊。
4. 患者追蹤和監測: 醫生可以要求定期追蹤患者的健康狀況,例如要求特定時間進行追蹤檢查或觀察症狀的變化。
5. 緊急處置請求: 在緊急情況下,醫生可能透過 EMR 系統向相關部門或醫療團隊發出緊急處置的請求。
## 何謂FHIR ServiceRequest
泛指處方概念,而此處方是要使用標準化的技術來進行傳輸以及儲存,利用此技術能夠達成全國性的一致標準,這樣全國各家醫院能夠利用此標準從FHIR Server中取得資料,再利用這些資料經由一些頁面的設計來取得我們所需要的項目資訊。
## 為何要用FHIR ServiceRequest
因為FHIR是一種標準的資料交換格式,可以跨越不同的醫療系統、設備和平台。ServiceRequest 資源的使用能夠確保醫療資訊的一致性和互操作性,讓不同系統之間可以有效地交換和分享醫療服務需求的資訊。
## ServiceRequest ues in PHR
1. 可以讓民眾端調閱出每一次的回診時間
2. 可以搭配手機讓每次回診時間用訊息提醒
3. 可以確認每一項療程所執行的時間與次數
4. 用於運動處方可以讓民眾端監控自己並給予運動指導以及改善
5. 民眾端只需要知道回診時間及醫生給予的注意事項
## ServiceRequest示意圖(以放療處方為例)

#### 概述:
圖中所表示的是每一個癌症病人可能需要經過很多項目的放射治療的療程,而每一個項目的放療過程通常會有表示該項每一次所需要為這病人治療的放射劑量以及每一次的回診時間,如上圖有兩個ServiceRequest,第二層的ServiceRequest所表示為一項療程所記錄的資訊,包含起始以及結束時間...等,而最下面一層的ServiceRequest是基於一項療程的治療次數所產生的每一次治療時間,這些資訊都是由醫護端所產生,而民眾端只需知道何時要回診即可,而若於某時間民眾未回診,則能從民眾端跟該位治療醫生預約掛號並更新回診時間或者是由醫護端直接做修改。
## 基於放療處方之ServiceRequest JSON Data需要哪些重點欄位
1. code: 這裡將包含放射治療的 LOINC code,以描述所需的具體服務和治療類型,例如特定的放射線治療項目。
2. subject: 指明這項放療處方是針對哪位病人的,以確保該服務要提供給正確的人。
3. occurrencePeriod: 用於記錄放射治療的開始和結束時間,確定治療的時間範圍(可能會異動)。
4. extension: 在這種情況下,可以用來記錄特定療程需要的治療次數或頻率。
5. encounter: 表示與這項服務相關的醫療環境,可能是特定的診所、病房或醫院部門(第一,二,三以及近接治療室)。
6. occurrenceDateTime: 用於記錄每次放射治療的具體日期和時間(治療與回診時間建議分開)。
7. note: 提供額外的詳細信息,例如對特定治療過程的個別說明或注意事項(分兩塊,一個是整個療程都需要注意的,一個是某次放射治療需要注意的)。
8. basedOn: 基於醫生或護理師所產生的放射治療計畫。民眾端也有可能不需要這個欄位(plan治療計畫,)。
以下是基於某項放射療程產生出的JSON範例:
```
SQObj=
{
"resourceType": "ServiceRequest",
"status": "active",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "248243006",
"display": "Fatigue"
}
],
"text": "Fatigue"
},
"subject": {
"reference": "Patient/12345"
},
"note": [
{
"text": "患者報告感到極度疲倦。"
}
],
"occurrencePeriod": {
"start": "2023-10-13T10:30:00",
"end": "2023-10-13T11:30:00"
},
"extension": [
{
"url": "http://example.com/extensions#numberOfOccurrences",
"valueInteger": 5
}
]
}
```
以下為基於某項放射療程所產生出的每次放射治療時間:
```
SQObj=
{
"resourceType": "ServiceRequest",
"status": "active",
"intent": "order",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "248243006",
"display": "Fatigue"
}
],
"text": "Fatigue"
},
"subject": {
"reference": "Patient/12345"
},
"basedOn": [
{
"reference": "ServiceRequest/233333"
}
],
"note": [
{
"text": "患者報告感到極度疲倦。"
}
],
"occurrenceDateTime": "2023-10-13T10:30:00+00:00",
}
```
## 基於運動處方之ServiceRequest JSON Data需要哪些重點欄位
1. category: 描述服務的類別。在這裡,服務類別是“Physical Therapy”(物理治療)。
2. code: 表示服務的具體類型或代碼。這裡是“183364003”(有氧運動計畫)。
3. subject: 這個服務要求所涉及的患者。reference指向了患者資訊,這裡是一個假設的參考患者。
4. Timing: 描述服務的發生時間規律。
5. authoredOn: 表示服務要求的建立或編寫日期時間。
以下為JSON範例:
```
{
"resourceType": "ServiceRequest",
"id": "example-request",
"status": "active",
"intent": "order",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/service-category",
"code": "event"
}
],
"text": "Event"
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "27053-7",
"display": "Aerobic exercise plan"
}
],
"text": "Aerobic Exercise Plan"
},
"subject": {
"reference": "Patient/example",
"display": "Patient Name"
},
"performer": [
{
"reference": "Practitioner/example",
"display": "Dr. Smith"
}
],
"reasonCode": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "394849002",
"display": "Obesity"
}
],
"text": "Obesity"
}
],
"insurance": [
{
"reference": "Coverage/example",
"display": "Extended Healthcare Coverage"
}
],
"supportingInfo": [
{
"reference": "Observation/bmi",
"display": "BMI Observation"
}
],
"occurrenceDateTime": "2023-01-01T08:00:00Z",
"authoredOn": "2023-01-01T10:00:00Z",
"requester": {
"reference": "Practitioner/example",
"display": "Dr. Smith"
},
"note": [
{
"text": "Patient should perform aerobic exercise for 30 minutes, 3 times a week for the next two months."
}
],
"quantity": {
"value": 30,
"unit": "minutes",
"system": "http://unitsofmeasure.org",
"code": "min"
},
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/servicerequest-doNotPerform",
"valueBoolean": false
}
],
"bodySite": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "36701003",
"display": "Entire body as a whole"
}
],
"text": "Entire Body"
}
],
"supplementalInstruction": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "43116000",
"display": "Aerobic exercise"
}
],
"text": "Aerobic Exercise"
}
],
"timing": {
"repeat": {
"boundsPeriod": {
"start": "2023-01-01",
"end": "2023-03-01"
},
"frequency": 3,
"period": 7,
"periodUnit": "d"
}
}
}
```
## 針對兩處方的差異點比較
1. JSON物件所記錄的code不同: 放射治療處方所記錄的處方項目與運動處方的項目不同,不同的loinc code有對應所記錄的類型,下面第一張圖為放療處方的loinc code,第二張為運動處方的loins code。


2. 記錄處方的起始時間屬性不同: 在放療處方所用到的屬性為occurrencePeriod,而在運動處方所使用到的為boundPeriod,兩者在意義上有些微的差異,下面第一張圖為放療處方,第二張為運動處方。


3. extension記錄的值有不同: extension能記錄許多值,可以是布林值(表示此項計畫能否正常執行),也可以是數值(例如:治療次數),兩者應用的extension記錄有所不同,下面第一張圖為放療處方,第二張為運動處方。


## 兩範例之JSON物件完整範例
#### 放療處方之ServiceRequest(以一個放療療程資訊所產生的JSON資料)
```
{
"resourceType": "ServiceRequest",
"status": "active",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "248243006",
"display": "Fatigue"
}
],
"text": "Fatigue"
},
"subject": {
"reference": "Patient/12345"
},
"note": [
{
"text": "患者報告感到極度疲倦。"
}
],
"occurrencePeriod": {
"start": "2023-10-13T10:30:00",
"end": "2023-10-13T11:30:00"
},
"extension": [
{
"url": "http://example.com/extensions#numberOfOccurrences",
"valueInteger": 5
}
]
}
```
#### 運動處方之ServiceRequest(以有氧運動為例)
```
{
"resourceType": "ServiceRequest",
"id": "example-request",
"status": "active",
"intent": "order",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/service-category",
"code": "event"
}
],
"text": "Event"
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "27053-7",
"display": "Aerobic exercise plan"
}
],
"text": "Aerobic Exercise Plan"
},
"subject": {
"reference": "Patient/example",
"display": "Patient Name"
},
"performer": [
{
"reference": "Practitioner/example",
"display": "Dr. Smith"
}
],
"reasonCode": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "394849002",
"display": "Obesity"
}
],
"text": "Obesity"
}
],
"insurance": [
{
"reference": "Coverage/example",
"display": "Extended Healthcare Coverage"
}
],
"supportingInfo": [
{
"reference": "Observation/bmi",
"display": "BMI Observation"
}
],
"occurrenceDateTime": "2023-01-01T08:00:00Z",
"authoredOn": "2023-01-01T10:00:00Z",
"requester": {
"reference": "Practitioner/example",
"display": "Dr. Smith"
},
"note": [
{
"text": "Patient should perform aerobic exercise for 30 minutes, 3 times a week for the next two months."
}
],
"quantity": {
"value": 30,
"unit": "minutes",
"system": "http://unitsofmeasure.org",
"code": "min"
},
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/servicerequest-doNotPerform",
"valueBoolean": false
}
],
"bodySite": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "36701003",
"display": "Entire body as a whole"
}
],
"text": "Entire Body"
}
],
"supplementalInstruction": [
{
"coding": [
{
"system": "http://snomed.info/sct",
"code": "43116000",
"display": "Aerobic exercise"
}
],
"text": "Aerobic Exercise"
}
],
"timing": {
"repeat": {
"boundsPeriod": {
"start": "2023-01-01",
"end": "2023-03-01"
},
"frequency": 3,
"period": 7,
"periodUnit": "d"
}
}
}
```
## 如何用網頁修改
1. 因為放療處方所輸入的日期為手動輸入,所以可以切換textbox的型態,把text轉成日曆格式,這樣便能方便填寫運動處方起始和結束時間。
2. 在放療處方所記錄的療程次數運用在運動處方可以拆成兩部分記錄,一個是每周的執行次數以及每次執行多久,故可以多增加一個輸入格讓使用者輸入執行時間。
3. 可以設計一個按鈕當按下送出資料時便可以上傳至FHIR Server中。
4. 以下為放療處方轉成運動處方之修改過後的網頁,第一張圖為放療處方,第二張為運動處方:


## 如何上傳至FHIR Server中
1. 首先利用JS把我們所填寫的資料抓取並存放到我們一開始設計的JSON物件中。
2. 利用jsonstringfy()方法把JSON物件轉變成JSON字串。
3. 設定要傳的API網址。
4. 利用HttpPost的方式上傳至FHIR Server中。
5. 上傳方式類似,只是要如何取的textbox的值要再思考,思考哪些值要填入那些JSON欄位,以下為上傳步驟之範例程式碼:
```
SQObj.subject.reference = "Patient/"+document.getElementById("ID").value;
SQObj.occurrencePeriod.start = document.getElementById("first").value;
SQObj.occurrencePeriod.end = document.getElementById("end").value;
SQObj.extension[0].valueInteger = document.getElementById("times").value;
var id=document.getElementById("ID").value;
var jsonStr = JSON.stringify(SQObj);
alert(jsonStr);
var apiURL;
apiURL = FHIRrootURL + '/' + "ServiceRequest?subject="+id;
// alert(apiURL);
HTTPPostData(apiURL, jsonStr);
```
#### ppt參考
https://docs.google.com/presentation/d/1SgrvvLIr2YJVcUPhBRSYWiE2Oawr0G5W/edit#slide=id.p1