医療情報ユーザーから見た fhirアプリケーションの利点 ......web2.0...
TRANSCRIPT
2019/6/8
1
医療情報ユーザーから見たFHIRアプリケーションの利点群馬大学医学部附属病院 システム統合センター
鳥飼 幸太
このチュートリアルの目的
• FHIRの構成要素について、コーディングスキルを身につける• -REST
• -JSON
• HTMLからREST/JSONを用いて、FHIRサーバからデータを取得するコーディングを身につける
•これらの取り組みを通じて、FHIRがREST/JSONを採用する、開発上のメリットについて具体的実感をもつ
2019/6/8
2
IoTデバイスの広く浸透する医療への変化
総務省 平成30年版 通信情報白書
“Make once, Use Many”
現行システムとFHIRの適用範囲
WWW
TCP/IP
CAT5/6/7 IEEE802.11a/b/g/n/ac
Mobile NetworkWired (Fixed) Network
スタッフが情報とともに移動する個別タスクを個別に分担チーム医療・情報の電子化、即時化目的ごとのデバイス
スタッフが情報の側に移動する共通タスクを複数スタッフで分担部門化の流れとともに浸透共通の端末
HTTP
2019/6/8
3
このチュートリアルの構成
CSVファイル
FHIR/JSONファイル1001,YAMADA TAROU,37.5,degC,2018/3/5
1002,AKIYAMA TADAO, 36.8, degC,2018/3/51003,HARUNA FUMIO, 36.4,degC,2018/3/6…
SELECT ID, Body Temperature FROM …
SQL文でのデータ抽出
REST応答文の実装
<HTML><script type="text/javascript" language="javascript"></script>
<body><br></body></HTML>
http://iris4h.azure.com:52773/fhir/ observation/bodytemperature/1001
ID identifier
datetime
effectiveDateTimevalue
effectiveValue
unit unit
JavaScript/HTMLの作成FHIRタグのパース
RESTコマンドでWebブラウザ表示
グラフライブラリの追加
サーバサイド
クライアントサイド
TCPソケット
外部サーバ参照(TCP)
データ取得(TCP)状態遷移、エラーチェックに手間
データパース(読解)エラーチェック
構造体への割り付け
XML構文宣言が多い(文法規則が多い)(特にデータ提供側で負荷増)
プログラムが持つ構造体にマッピングが必要
デバイスへの表示デバイスごとに表示させる命令セットが異なる→デバイスが変化するとプログラムも作り直し
Web以前
2019/6/8
4
<HEAD>CSS
<HTML>
<BODY>
JavaScript
JavaScript
<div id=t1>
target = t1
書式の基本様式
外部サーバ参照(REST)
データ取得(JSON)
構造化データを処理
表示先に出力する
Webテクノロジー基本セット:HTML+CSS+JavaScript
</HTML>
20分クッキング
愛は学会にある。Mテクノロジー学会
群馬大学医学部附属病院
2019/6/8
5
2019/6/8
6
2019/6/8
7
2019/6/8
8
2019/6/8
9
2019/6/8
10
2019/6/8
11
2019/6/8
12
2019/6/8
13
2019/6/8
14
体温データ取得用の<Route>を追加
体温データのObservationリソースを取得する処理を追加する
2019/6/8
15
体温データを取得するSQLを追加する
2019/6/8
16
2019/6/8
17
2019/6/8
18
2019/6/8
19
2019/6/8
20
2019/6/8
21
2019/6/8
22
2019/6/8
23
2019/6/8
24
処方情報を取得するREST APIの構築
• MedicationDispenseリソース• 患者さんに対して調剤/支給された薬剤の情報をあらわすリ
ソースです。
• https://www.hl7.org/fhir/medicationdispense.html
• RESTのリクエスト /medicationdispense/患者ID に対し、右のBundleで表されるリソース群を返すAPIを構築しました。
Resource : Bundletype : message
Patient :id : 12345name : 山田
Observation :id : 67890Observation :
id : 67890Observation :
id : 67890MedicationDispense :
id : 67890
2019/6/8
25
REST APIから取得したFHIRデータ例
全体はBundleリソースに含まれる
対象の患者のPatientリソースを含む
1件目のMedicationDispenseリソース
対象となるMedicationリソースをcontained内にもつ
7日分の処方
=容量・用法などの情報
1回量
用法・タイミング
トータル処方量
対象患者
処方日
2件目以降のMedicationDispenseリソースへ
RESTリクエストURL
FHIR Tips - Code/Coding/CodeableConcept
• FHIRのデータを眺めているとCodeに関する情報がよくでてきます
• codeは“ただの文字列“• code=10154-3,code=8716-3,code=622669401
• ただし、codeという名前のelementもよく使われる。
• coding=code+コード体系(system)表示名(display)バージョン情報(version)を付加したもの• code=8867-4,system=http://loinc.org, display=“Heart Rate”,version=2.6
• codeableconcept = coding + 付加情報(text)• text=“脈拍”
その結果、一見ややこしい表記に!↑
2019/6/8
26
FHIR Tips2 - Quantity
• 検査結果の数値や処方した薬の数などを表現する目的でQuantityというデータ型を使用します
• データは valueで表現されます
• さらに単位(unit)、単位体系(system) 、単位のコード(code) といった情報が付加されて表現されます。
日数の表現 個数の表現
Webアプリケーション画面
FHIRデータ取得のために実際にリクエストしたFHIR APIのURL
FHIR Bundle内のPatientリソースから取得したデータ
FHIR Bundle内のMedicationDispenseリソース群から取得したデータ
2019/6/8
27
HTML/JavaScriptソース
<head><link rel="stylesheet" type="text/css" href="mycss.css"><meta charset="UTF-8"><title>FHIRTEST Step 4</title><style>body {background: #eeeeee;
}</style>
<script type="text/javascript" language="javascript">
function onButtonClick() {
var linktext5 = 'http://iris4h-fhirapi.japaneast.cloudapp.azure.com:52773/csp/sqltofhir/fhir/medicationdispense/'+document.getElementById("id_textBox1").value;
var xhr = new XMLHttpRequest();xhr.responseType = 'text';xhr.open('GET',linktext5,true);xhr.send();
resturl = document.getElementById("resturl");resturl.innerHTML='<h2>FHIRリクエストURL:'+linktext5+'</h2>';
xhr.onreadystatechange = function(){if (xhr.readyState==4 && xhr.status==200) {
var data = JSON.parse(xhr.responseText);
FHIRデータ取得のために実際にリクエストするURLの組み立て
RESTリクエストの実行
取得したJSONデータのパース処理
HTML/JavaScriptソースvar table = document.getElementById("mdTable");for ( var i in data.entry ) {
var patientinfo='';var record;
//Patient Resourceから患者情報を抽出if (data.entry[i].resource.resourceType=="Patient") {patientinfo=patientinfo+" "+data.entry[i].resource.name[0].family;patientinfo=patientinfo+" "+data.entry[i].resource.name[0].given[0];patientinfo=patientinfo+" "+data.entry[i].resource.gender;patientinfo=patientinfo+" "+data.entry[i].resource.birthDate;
patientinfo=patientinfo+" "+data.entry[i].resource.address[0].postalCode;patientinfo=patientinfo+" "+data.entry[i].resource.address[0].text;
patienttext = document.getElementById("patienttext");patienttext.innerHTML='<h2>患者基本情報:'+patientinfo+'</h2>';
}
else if (data.entry[i].resource.resourceType=="MedicationDispense") {var row=table.insertRow(-1);var cell1 = row.insertCell(-1);var cell2 = row.insertCell(-1);var cell3 = row.insertCell(-1);var cell4 = row.insertCell(-1);var cell5 = row.insertCell(-1);
cell1.innerHTML=data.entry[i].resource.medicationReference.display;cell2.innerHTML=data.entry[i].resource.whenHandedOver;cell3.innerHTML=data.entry[i].resource.dosageInstruction[0].doseQuantity.value + data.entry[i].resource.dosageInstruction[0].doseQuantity.unit;cell4.innerHTML=data.entry[i].resource.dosageInstruction[0].text;cell5.innerHTML=data.entry[i].resource.quantity.value+data.entry[i].resource.quantity.code;
}}
取得したFHIR/JSONデータのPatientリソースから患者情報の抽出
htmlのtableエレメントに追加するrowエレメントを取得
取得したFHIR/JSONデータのMedicationDispenseリソースから処方情報の抽出
取得したFHIR/JSONデータ
"resource": {"resourceType": "Patient","identifier": [
{"value": "1001"
}],"name": [
{"family": "山田","given": [
"太郎"],"use": "official"
}],"birthDate": "1970-01-01","gender": "男","address": [
{"postalCode": "1600023","text": "東京都新宿区西新宿6丁目"
}],
2019/6/8
28
HTML/JavaScriptソース
<body><form name="form1" id="id_form1" action="">PID:<input name="textBox1" id="id_textBox1" type="text" value="1001" /><input type="button" value="Show" onclick="onButtonClick();" />
</form><hr/>
<div id="resturl"></div>
<div id="patienttext"></div><table id="mdTable"><tr><th>薬剤名</th><th>日時</th><th>1回処方量</th><th>用法</th><th>総処方量</th>
</tr>
</table>
<!-- JavaScriptで作られたコード(読みだされた文字リスト)が出力される場所 --><div id="output"></div><br><br>
</body>
結果表示用のHTML要素
今後の展望
2019/6/8
29
医療データに関わる要素と通信方式
DBサーバデータ処理
アルゴリズムWeb
インターフェース
バックエンド(電子カルテや部門システム)
フロントエンド
入出力デバイス
DBサーバ
院内側
地域連携DBサーバ
ユーザー
ユーザー
院外側
…バックエンド??
Webインターフェース
データ処理アルゴリズム
データ処理アルゴリズム
院内データをサーバ以外/院外と通信/共有するという要請は、システムの最適な構成・工数の少ない実装方法に根本的な変化を要請する
1 2
3
技術における複雑化・差別化と、規格化・標準化の分岐点
現場が求める性能(情報量・速度)
ユーザー数
性能向上=差別化要素高付加価値化独自性の追求
R&D領域限定されたユーザー
現場満足の分岐点
市場における技術の有用性の認識データの比較・交換の必要性「標準化活動」
互換性、保守性による活用価値、コストパフォーマンスに関心の重心が移る
独自要素の利点を追求特定領域での応用
性能>互換性 性能<互換性
ユーザーの選択肢が広がる
現場利用条件の充足
2019/6/8
30
医療業界の事例:CT装置における技術進歩とDICOM標準化のあゆみ
現場が求める性能(情報量・速度)
ユーザー数
画質スライス厚撮影時間再構成時間
現場満足の分岐点
市場における技術の有用性の認識データの比較・交換の必要性「標準化活動」
DICOM互換の製品が増加ユーザー数と選択肢が充実
新しいモダリティ技術(cine、Dual Energy等)
各社が独自規格で性能を向上
性能>互換性
現場利用条件の充足
性能<互換性
産業と医療の循環 – 医療情報と医療情報機器について
医療ニーズ
診療に直接作用
診療に二次的作用
医療専用機器(CT等)
産業製品の活用(PC、スマホ等)
医療情報機器・ソフト
(電子カルテ等)
ハードウェアは産業界の製品をそのまま使える高い動作信頼性が求められる
医療法、病名体系、保険収載などは産業界になく、専門の製作が必要現場運用が変化する
IoT事例として血圧、体温、血糖などのデバイスは要薬事承認
IoT実現に負担の大きい領域
産業界における技術の変遷Web2.0以降、開発が個別性から共通性へ変化
Web2.0(REST/JSON) + HL7 = FHIR
2019/6/8
31