電子カルテ情報共有 導入記
電子カルテ情報共有 導入記
(工事中)
2025.4.19 更新
No. 05
診療情報提供書XMLサンプルソフト (試行版)
前ページで 使った 診療情報提供書のサンプルJSONをもとに我々の実情に合わせたものに書き換えたら。実診療で使えるFHIR文書ができるのではないかという考えのもとに Filemakerで試作品をつくってみました。実際にこのやりかたでいいのか 分かりません。また, 今後 不具合が見つかるものと思いますが, その都度「追伸」で修正させてもらいます。
1. サンプルプログラムを任意の場所にdownloadしてください。「JSON_FHIR_1F」Folerのなかには「JSON_FHIR_1F.fmp12」と「JSON_FireFox」,「TEST_req」,「TEST_json」Folderが入っています。「 JSON_FHIR_1F」Folerは どこにおいてもいいのですが, なかの 4アイテムはそのまま動かさないでください。
2.JSON_FHIR_1F.fmp12 を起動してください。「ゲスト」でLoginしてください。 拡張アクセス権(fmuriscript)を許可していますので, 環境によっては, 何かmessageがでるかもしれません。
3.通常使っているネットブラウザーも起動してください。起動されていないと「閲覧」がうまく作動しないことがあります。
ひながたJSONは 日本医療情報学会のHPに掲載されている,
https://jpfhir.jp/fhir/clins/output/Bundle-Bundle-CLINS-Referral-NoEntry-Example-01.json.html
『Bundle-Bundle-CLINS-Referral-NoEntry-Example-01』をひながたとして使わせていただきます。 その中の 固有名詞, 電話番号, etc 病歴等の単語, テキストを 被置換語として組み込んで, 最後に 実際のテキストに置き換えて 診療情報提供書JSONを完成させます。 被置換語はJSONのテキストとかぶらないように決定します。
["RAN_DOM";$ran ]; //乱数
["MED_FEE_ME"; XMLJ::G030_診療点数表];
["MED_FEE_NUM_ME"; XMLJ::G032_診療点数コードT];
["CLIN_NUM_ME"; XMLJ::G040_自己医療機関番号];
["CLIN_NUM_ORG_ME"; XMLJ::G042_自己医療機関_組織番号];
["DOC_ME"; XMLJ::G070_自己_医師 ];
["CLIN_NAME_ME"; XMLJ::G050_自己医療機関_名 ];
["POST_ME"; XMLJ::G058_自己_〒番号];
["ADDRESS_ME"; XMLJ::G060_自己医療機関住所];
["STATE_ME"; XMLJ::G062_自己_都道府県];
["STATE_NUM_ME"; XMLJ::G064_自己_都道府県番号];
["PHONE_ME"; XMLJ::G076_自己_TEL];
["PROF_ME"; XMLJ::G072_自己_診療科];
["PROF_NUM_ME"; XMLJ::G074_自己_診療科番号];
["MED_FEE_YOU"; XMLJ::H030_診療点数表];
["MED_FEE_NUM_YOU"; XMLJ::H032_診療点数コードT];
["CLIN_NUM_YOU"; XMLJ::H040_紹介先_医療機関番号];
["CLIN_NUM_ORG_YOU"; XMLJ::H042_紹介先_医療機関_組織番号];
["DOC_YOU"; XMLJ::H070_紹介先_医師 ];
["CLIN_NAME_YOU"; XMLJ::H050_紹介先_医療機関_名 ];
["POST_YOU"; XMLJ::H058_紹介先_〒番号];
["ADDRESS_YOU"; XMLJ::H060_紹介先_住所];
["STATE_YOU"; XMLJ::H062_紹介先_都道府県];
["STATE_NUM_YOU"; XMLJ::H064_紹介先_都道府県番号];
["PHONE_YOU"; XMLJ::H076_紹介先_TEL];
["PROF_YOU"; XMLJ::H072_紹介先_診療科];
["PROF_NUM_YOU"; XMLJ::H074_紹介先_診療科番号];
["PT_HOKEN_INFO"; $hoken ];
["PT_ID_NUM";XMLJ::P410_受診者_ID番号000];
["PT_SEI_KJ";XMLJ::P500_受診者_姓];
["PT_MEI_KJ";XMLJ::P501_受診者_名];
["PT_SEI_KN";XMLJ::P502_受診者_セイ];
["PT_MEI_KN";XMLJ::P503_受診者_メイ];
["PT_NAME_KJ";XMLJ::P504_受診者_姓名];
["PT_NAME_KN";XMLJ::P505_受診者_セイメイ];
["PT_SEX";XMLJ::P506_受診者_性別];
["PT_BDATE";XMLJ::P520被保険者_生年月日];
["PT_ADDRESS_WHOLE"; XMLJ::P522被保険者_住所];
["PT_ADDRESS_STATE";XMLJ::P523被保険者_住所_県 ];
["PT_ADDRESS_CITY"; XMLJ::P525被保険者_住所_市町村];
["PT_POST"; XMLJ::P540被保険者_〒番号];
["PT_PHONE_H";XMLJ::P545被保険者_Home電話];
["PT_PHONE_W";XMLJ::P550被保険者_Work電話];
["PT_ROMAN";XMLJ::P507_受診者_Roman];
["PURPOS_E"; $r01 ];//XMLJ::K110_紹介目的
["C_COMPLAINTS"; $r02 ];//XMLJ::K120_傷病名・主訴
["HISTORY_PRES"; $r03 ];//XMLJ::K130_現病歴
["HISTORY_PAST"; $r04 ];//XMLJ::K140_既往歴
["ALLERGY_S"; $r05 ];//XMLJ::K150_アレルギー・不耐応
["F_HISTORY"; $r06 ];//XMLJ::K160_家族歴
["PRES_STATUS"; $r07 ];//XMLJ::K170_身体所見
["INFECTION_S"; $r08 ];//XMLJ::K180_感染症情報
["CL_COURSE"; $r09 ];//XMLJ::K190_臨床経過
["DRUG_S"; $r10 ];//XMLJ::K200_投薬指示
["THANK_S"; $r11]//XMLJ::K210_連絡事項
左の赤い単語が被置換単語になっています。 それを ひながたJSON に組み込みます。
以下 ひながたJSONの一部分です。全文download→ ( hinagata_1E.rtf )
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\"><a name=\"Patient_Example-JP-Patient-eCS-PT_ROMANInline\"> </a><p class=\"res-header-id\"><b>Generated Narrative: Patient Example-JP-Patient-eCS-PT_ROMANInline</b></p><a name=\"Example-JP-Patient-eCS-PT_ROMANInline\"> </a><a name=\"hcExample-JP-Patient-eCS-PT_ROMANInline\"> </a><a name=\"Example-JP-Patient-eCS-PT_ROMANInline-ja-JP\"> </a><div style=\"display: inline-block; background-color: #d9e0e7; padding: 6px; margin: 4px; border: 1px solid #8da1b4; border-radius: 5px; line-height: 60%\"><p style=\"margin-bottom: 0px\">Last updated: 2021-11-26 10:00:00+0900; Language: ja</p><p style=\"margin-bottom: 0px\">Profile: <a href=\"StructureDefinition-JP-Patient-eCS.html\">JP_Patient_eCSversion: null1.10.0)</a></p></div><p style=\"border: 1px #661aff solid; background-color: #e6e6ff; padding: 10px;\">PT_NAME_KJ PT_SEX, PT_BDATE: 1930-06-28 ( urn:oid:1.2.392.100495.20.3.51.1CLIN_NUM_ME#PT_ID_NUM)</p><hr/><table class=\"grid\"><tr><td style=\"background-color: #f3f5da\" title=\"Record is active\">Active:</td><td colspan=\"3\">true</td></tr><tr><td style=\"background-color: #f3f5da\" title=\"Other Ids (see the one above)\">Other Ids:</td><td colspan=\"3\"><code>http://jpfhir.jp/fhir/clins/Idsystem/JP_Insurance_memberID</code>/PT_HOKEN_INFO:05</td></tr><tr><td style=\"background-color: #f3f5da\" title=\"Alternate names (see the one above)\">Alt. Name:</td><td colspan=\"3\">PT_NAME_KN</td></tr><tr><td style=\"background-color: #f3f5da\" title=\"Ways to contact the Patient\">Contact Detail</td><td colspan=\"3\"><ul><li>ph: PT_PHONE_H(Home)</li><li>PT_ADDRESS_WHOLE</li></ul></td></tr><tr><td style=\"background-color: #f3f5da\" title=\"Patient contact\">Contact:</td><td colspan=\"3\"><ul><li>ph: PT_PHONE_W(Work)</li></ul></td></tr></table></div>"
},
"identifier" : [{
"system" : "urn:oid:1.2.392.100495.20.3.51.1CLIN_NUM_ME",
"value" : "PT_ID_NUM"
},
{
"system" : "http://jpfhir.jp/fhir/clins/Idsystem/JP_Insurance_memberID",
"value" : "PT_HOKEN_INFO"
}],
"active" : true,
"name" : [{
"extension" : [{
"url" : "http://hl7.org/fhir/StructureDefinition/iso21090-EN-representation",
"valueCode" : "IDE"
}],
"text" : "PT_NAME_KJ",
"family" : "PT_SEI_KJ",
"given" : ["PT_MEI_KJ"]
留意点
1. 以下オリジナルJSON の冒頭の12行ですが
{
"resourceType" : "Bundle",
"id" : "Bundle-CLINS-Referral-NoEntry-Example-01",
"meta" : {
"lastUpdated" : "2021-11-26T10:00:00+09:00",
"profile" : ["http://jpfhir.jp/fhir/clins/StructureDefinition/JP_Bundle_eReferral|1.10.0-testCondBundle"]
},
"language" : "ja",
"identifier" : {
"system" : "http://jpfhir.jp/fhir/clins/bundle-identifier",
"value" : "1318814790^2024^0123-Referral-203949583949"
11行目 "system" : "http://jpfhir.jp/fhir/clins/bundle-identifier", は この文書の ID が その直下の
"value" : "1318814790^2024^0123-Referral-203949583949" であることを示しています。このID は、
『医療機関番号10桁^西暦4件^36文字以内の半角文字列(英字、数字、ハイフン記号のみ可)であること。』
『Bundleリソースのidentifier要素は、一般に受信システム側で保存される。送信側は、後続の送信においてこのidentifierを指定することで、受信側は過去に受信したBundleリソースを特定し、それに含まれていた全データについて削除、更新などの処理を行うためにこれを使用することができる。』と解説されています。
https://jpfhir.jp/fhir/clins/igv1/StructureDefinition-JP-Bundle-eReferral.html
そのIDが 同一のJSON文書を電子カルテ共有サービスに送信すると「この文書はすでに 登録されています。』というようなXML_resが返されます. そこで 便宜上 このソフトでは 送信のたびに後半部分の12ケタの数字を乱数 (RAN_DOM) にしています。
このvalue値は JSON文書を一意に特定する ID ですから, 実際は自院で管理しながら規則に沿って作成することになるでしょう。
2. Field内に 改行を入れてXMLを作成すると,エラーになります。 HTMLのマークアップ言語では改行に<br/>を使用しますので, 被置換語を置き換える前に改行文字を <br/>に自動変更することにしました。 なので Fieldでは使用してもOKです。患者情報, 自己情報, 紹介先情報ではこの操作はしていません。
3. Fieldはすべてなにかの文字を入れなければなりません。 emptyは エラーになります.
4. オリジナルのjsonでは 既往歴 etc の部分に "\u3000" が使用されています。 "\u3000"は全角空白 を著しています, JavaScriptなどのプログラミング言語で 使われるようですが, この部分はdocumet の内部なので, 表現は自由だと思います. 使っても, 使わなくてもエラーにはなりません. ただ正しい医療JSONでは使わないといけないかもしれません。
5. 診療科と 都道府県を入力すると,診療科番号と 都道府県番号は, 自動計算で入力されるようにしました。
6.試験環境でも医療機関番号(10ケタ)は架空のものは使えません。また 実在の医療機関のものでも, その医療機関が電子カルテ共有サービスに登録していないと使えません。 なので, 支払基金に登録を済ませてから, 試験環境でトライしてください。 紹介元と紹介先に同じ医療機関番号を使ってもOKです. そもそも, この紹介先の医療機関番号が記載されないと 相手に届かないので, 必須と思われます。 今は, すべての医療機関のそれは各地の厚生局で公表されています。
このソフトでは とりあえず 送信先は “TEST_req” Folderになっていますので, エラーは出ません。
7.また 外枠のXMLにも 保険情報を記載する必要がありますが, これも XMLひながたを作ってから, はめ込みます。 このことは 前ページ ( route4 ) でも説明しています。
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<XmlMsg>
<MessageHeader>
<ArbitraryFileIdentifier>Clinic_NUM_TODAY</ArbitraryFileIdentifier>
</MessageHeader>
<MessageBody>
<MedicalReferralDocument>BASE_B</MedicalReferralDocument>
<BrowsingConsent>0</BrowsingConsent>
<QualificationInfo>
<InsurerNumber>PT_INS_NUM</InsurerNumber>
<InsuredCardSymbol>PT_INS_SYMB</InsuredCardSymbol>
<InsuredIdentificationNumber>PT_INS_MEM</InsuredIdentificationNumber>
<InsuredBranchNumber>PT_INS_BR</InsuredBranchNumber>
</QualificationInfo>
<Birthdate>PT_BDATE</Birthdate>
</MessageBody>
</XmlMsg>
8.「XML作製」ボタンで最終的な XMLが完成します。
「XML送信」ボタンで 送信されます。ただし, このサンプルソフトでは 便宜上 同階層の“TEST_req”に 送信されます。
Script “XML_送信”のなかの $pathreqfile を書き換えることによって 送信先をオンライン資格確認 Folderに変更できます。
"file:TEST_req/" & Q_XML::Q120_FileName (download 時)
[Windows] "file:/C:/OQS/req/"
[Mac → Windows] filemac:/OQS/req/”
ひょっとしたら, これではうまくゆかないかもしれません。このあたりは 皆さんの環境で変更・試行してください。
9.任意のJSONを 置き換えないで, そのままXMLに組み込んで送信することもできます。
上の [割込_JS]ボタンで「割り込み_JSON」レイアウトに移動して, 任意のJSON を Fieldにコピペしてください。そのページの「XML作製」「XML送信」ボタンを使ってください。そのままのJSONがXMLに組み込まれて送信されます。
10.[Decode] レイアウトで完成 XMLから JSONを抜き出して復元することができます。
11.[完成JSON_閲覧] [割込JSON_閲覧] ボタンで 完成 JSON, 割込JSON の <div>...</div> の部分を抽出して ネットブラウザーで読むことができます。( route2 参照 ) ただし URLのパスが うまく作動しないことがありますので, そのときは「JSON_FireFox」を開いて, 最新の”FHIR_xxxxxx.html”をクリックしてください。
XML 作製方法 概略
Script “XML_作成”で JSON文書を組み込んだXMLを作成し, Script “XML_送信”で送信します。
1. ひながたJSONを 実際の単語で置換します。 (A)
2. (A)をTextEncode ( Path13 参照 )で (A) をUTF8, 改行コード CRLF (Windows) に変換します。 これは CR,LF でも問題無いようです。 TextEncode は Object Fieldに出力されます。 (B)
3. (B)をBase64Encodeします.(C)
4. (C)から 改行コード( CR, LF )を削除して, 1行のTextにします.(D)
5.(D = $base_b)を 以下の XML 形式に組み込みます ( Route4 参照 )。(E)
"<?xml version=\"1.0\"?>" & "<Document>
<FHIRDocument id=\"FHIRDocument\">" & $base_b & "</FHIRDocument></Document>"
Filmakerのなかでは, ScriptのText中に使うダブルコーテーション( “ )は Text の前後に使う それと混同されるのを避ける意味で『\”』を使用します。
6. (E)の改行コードを削除します.(F)
7. (F)を Base64Encode します.(G)
8. 外枠のXML (医療機関番号, 患者保険情報を組み込んだ)に はめ込みます ( Route4 参照 ) 。(H)
9. (H)の改行コードを削除して Final XML が完成します。( I )
10.( I )を "CISsiMRD01req_xxxxx.xml" の File Name で req Folderに送信します. Script “XML_送信”
*任意JSON(割込)からXMLを作製するとき(Script: XML_作製_割込_JS)は上記の1 (A)の操作を省略します。
今後の課題
1.uuid: [timestampのような 意味合いの乱数に近い文字列 ]をどうするか, やみくもに書き込めばいいのか?
2.LastUpdate , date, など一致しない日付 は?
追伸 2025.4.8 ( JSON_FHIR_1C )
サンプルソフトの ひながたJSONに 一部欠落 がありましたので, 修正版を掲載させていただきます。
(JSON_FHIR_1C.fmp12)
ひながたJSON downloadも変更しました (honagata_1C.rtf)
オリジナル JSONでは 「循環器内科」となっていますが, 厚生労働省の サイトから引用した ものには 「循環器科」となっており, 循環器内科 で ONSのValidator にかけると 「正常終了しました」にはなるのですが, 「循環器内科はなんたらかんたら...にしたほうがいい...」というような内容の長いコメントが付いてきます。精神衛生上よろしくないので, 診療科マスターは「循環器科」としました。
このソフトで 完成XMLを試験環境の req Folderに投函して 「正常終了しました」のresが返ってきました。
試験環境でご使用のときは 医療機関番号を実在で電子処方箋管理サービスに登録した医療機関のものをお使いください。デモ患者の保険情報も書き換えてください。XMLひながたの保険情報等も自動変換されます。
前述の ID のところで"1318814790^2024^0123-Referral-203949583949" の最初の 10文字は 医療機関番号ですが, オリジナルJSONでは 紹介元,紹介先 いずれの番号とも異なります。ただここは紹介元の番号と考えるのが順当と考えますので, そのように置換するしくみにしました。制作者に聞いてみたいですね。
「 *** 検索」ボタンを押すと任意の語の検索ができます。次の語を続いて検索するときは Macでは コマンド + G, Windows では control + G を押すと移動します。
「閲覧」も機能します。ネットブラウザーを立ち上げておいてください。
追伸 2025.4.15 ( JSON_FHIR_1D )
点数区分コード という 項目があって, 以下のようになっています。先のサンプルソフトでは 「医科:1」に固定していましたが, これを変更できるソフトにしました。レイアウト: 「診情書」 ( JSON_FHIR_1D.fmp12 )
医科1、
非保険検診施設2、
歯科3、
調剤4、
訪問看護ステーション 6
追伸 2025.4.19 ( JSON_FHIR_1E )
オリジナルJSON では 311-312 行 以下のようになっていますが,
"system" : "urn:oid:1.2.392.100495.20.3.51.11318814790",
"value" : "000999739"
“sytem” の 末尾 “11318814790” は,「1 + 医療機関番号」の意味です。
“value” は 患者の院内ID番号になっています。
また 308 行 <div>...</div> には 同じような 記載があります。
( urn:oid:1.2.392.100495.20.3.51.11318814790#000999739)
これは 1 + 医療機関番号」# 院内ID番号 ( PT_ID_NUM ) となっています。
“MedicalOrganizationID”という語が紹介元,先に2カ所ずつ出てきますが,
これは 保険医療機関番号の右側7桁の数字です。これが本来の医療機関番号ですが, これを CLIN_NUM_ORG_ME, CLIN_NUM_ORG_YOUとしてに置き換える仕様にしました。
308 行 <div>...</div> の “DoB” は患者 生年月日でしたが, 被置換語にしていませんでした。修正しました
追伸 2025.4.21 ( JSON_FHIR_1F )
完成したjson を取り出せるようにしました。[XML_作成] ボタンを 押すと「TEST_json」Folderに入ります。
改行コードは “CRLF”になっています。
文末に「追伸」あり
2025.4.8 2025.4.15 2025.4.19 2025.4.21