Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
クリニックシステムとFHIRバックエンドの連携方法
チュートリアル:クリニックEMRを患者のFHIR R4レコードに接続する方法:医師ディレクトリ、記録番号によるマッチング、トランザクションとしての診療記録、検査レポート、他のプロバイダーのデータ、Webhookについて説明します。
このチュートリアルでは、クリニックのソフトウェア(EMR、診療管理システム、または予約ツール)をAnpheros内の患者のHL7 FHIR R4レコードに接続します。クリニックとその医師はディレクトリに登録され、患者はクリニックのレコード番号でマッチングされ、診察は医師を著者として指定した1つのトランザクションとして記録され、クリニックは他のプロバイダーが追加したデータについて知ることができます。 すべてのリクエストは無料サンドボックスに対してcurlされ、レスポンスはプラットフォーム固有のものです。
連携はクリニックのサーバー上で実行され、クリニックが登録する患者用のプロジェクトAPIキーと、既にAnpherosレコードを持つ人々用の承認されたOAuthグラントを使用します。
マッピングについて
| クリニックシステムでの表現 | FHIR R4での表現 |
|---|---|
| クリニック、その部門 | Organization |
| 医師または看護師 | Practitioner |
| そのクリニックで働く、専門分野を持つその人物 | PractitionerRole |
| 患者ファイルとその番号 | クリニックシステムのidentifierを持つPatient |
| 受診 | Encounter |
| バイタルサイン、受診中に測定された結果 | EncounterにリンクされたObservation |
| 診断 | Condition (ICD-10)、 provisional または confirmed のverificationStatus付き |
| 処方箋、現在の治療 | MedicationStatement (ATC) |
| 紹介状、退院サマリー、スキャン | ファイルと共にDocumentReference |
| 検査結果 | ラボコネクタ経由で、Observationへ |
ステップ 1: クリニックとその医師の登録
ディレクトリリソースには患者はいません。同じ環境内の他のプロジェクトはそれらを読み取ることができます。これにより、患者の他のプロバイダーは誰が何を書いたかを確認できますが、変更できるのはあなたのプロジェクトだけです。
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
H=(-H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json")
curl -X POST $BASE/Organization "${H[@]}" -d '{"resourceType": "Organization", "active": true, "name": "Clinica Cardio Nord",
"identifier": [{"system": "https://clinic.example/org", "value": "CCN"}]}'
curl -X POST $BASE/Practitioner "${H[@]}" -d '{"resourceType": "Practitioner", "active": true,
"name": [{"family": "Popescu", "given": ["Ana"], "prefix": ["Dr."]}]}'
curl -X POST $BASE/PractitionerRole "${H[@]}" -d '{"resourceType": "PractitionerRole", "active": true,
"practitioner": {"reference": "Practitioner/'$PRACTITIONER'"},
"organization": {"reference": "Organization/'$ORG'"},
"code": [{"text": "Cardiologist"}]}'
返されたIDをスタッフレコードの横に保持してください。誰かが退職した場合は、PractitionerRole を "active": false に設定してください。過去の書き込みはその名前を保持し、システムを通じてそれ以上操作できなくなります。
ステップ 2: 患者のマッチング
クリニックが登録する患者については、クリニックの記録番号を識別子としてPatientを作成します。
curl -X POST $BASE/Patient "${H[@]}" -d '{"resourceType": "Patient",
"identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-20981"}],
"name": [{"family": "Dinu", "given": ["Andrei"]}], "gender": "male", "birthDate": "1968-11-05"}'
それ以降は、名前や生年月日ではなく、その番号で患者を検索してください。
curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"
その人が既にAnpherosの記録を持っている場合、自身のアプリまたは他のプロバイダーから、クリニックは2つ目の記録を作成しません。受付のタブレットまたは訪問前に送信されたリンクを使用して、OAuthでアクセスを求めます。この際、機密性の高いアプリケーション(クリニックのサーバーがシークレットを保持します)を使用します。患者は自身の記録と、クリニックがそれにアクセスできる期間を選択します。手順はSMART on FHIRを使用した患者同意の実装方法に記載されています。トークンのpatientフィールドは、ファイルと共に保存するIDです。
ステップ 3: 1つのトランザクションとして診療記録を作成する
診療記録は、互いに関連する複数のリソースを生成します。それらをまとめて一度に保存するか、全く保存しないようにするためにtransactionで送信し、誰が作業しているかを指定します。X-Anpheros-Acting-Asは医師の役割を指定します。これはProvenanceの作成者となり、アクセスログに記録され、患者には名前で表示されます。
curl -X POST $BASE "${H[@]}" \
-H "X-Anpheros-Acting-As: PractitionerRole/$ROLE" \
-H "X-Anpheros-Author-Type: practitioner" \
-H "X-Anpheros-Source-System: ccn-emr" -d '{
"resourceType": "Bundle", "type": "transaction",
"entry": [
{"fullUrl": "urn:uuid:aa000000-0000-4000-8000-000000000001",
"resource": {"resourceType": "Encounter", "status": "finished",
"class": {"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "AMB", "display": "ambulatory"},
"subject": {"reference": "Patient/'$PID'"},
"serviceProvider": {"reference": "Organization/'$ORG'"},
"participant": [{"individual": {"reference": "PractitionerRole/'$ROLE'"}}],
"period": {"start": "2026-10-09T10:00:00Z", "end": "2026-10-09T10:30:00Z"}},
"request": {"method": "POST", "url": "Encounter"}},
{"resource": {"resourceType": "Observation", "status": "final",
"category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
"code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]},
"subject": {"reference": "Patient/'$PID'"},
"encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
"effectiveDateTime": "2026-10-09T10:10:00Z",
"valueQuantity": {"value": 92, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
"request": {"method": "POST", "url": "Observation"}},
{"resource": {"resourceType": "Condition",
"subject": {"reference": "Patient/'$PID'"},
"encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
"clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
"verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "provisional"}]},
"code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I48.0", "display": "Paroxysmal atrial fibrillation"}]}},
"request": {"method": "POST", "url": "Condition"}}
]}'
transaction-responseには、Encounter、Observation、Condition のための201 Createdが含まれています。Observation と Condition は、実際のEncounter/0ca25459-…を指すようになります。それぞれのProvenanceは、医師の役割、クリニック、ソースシステムを指定します。
"agent": [{"who": {"reference": "PractitionerRole/e6d8c227-…",
"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "practitioner"}},
"onBehalfOf": {"reference": "Organization/c3a56a4b-…", "display": "Clinica Cardio Nord"}}],
"entity": [{"role": "source", "what": {"identifier": {"system": "ccn-emr"}}}]
診断は、確定されるまでprovisionalとして扱われます。後でconfirmedに更新すると、履歴には両方が保持されます。各フィールドの意味については、医療データプロビナンスの説明で説明されています。
ステップ 4: 検査結果と文書
クリニック自身の検査室からの結果、または患者が持参したレポートは、レポートごとに1つのリクエストでラボコネクタを経由します。
curl -X POST "https://platform.anpheros.com/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
-H "Content-Type: x-application/hl7-v2+er7" -H "X-Anpheros-Source-System: ccn-lab" --data-binary @oru.hl7
手紙や退院サマリーは文書です。DocumentReference から /v1/patients/{id}/documents を作成し、PDF をアップロードします。元のファイルは決して変更されず、そこから抽出された値は元のファイルを参照します。FHIR レコードへの検査結果のインポート方法 および 医療データ API を参照してください。
ステップ 5: 他のプロバイダーの記録を読み、自身の範囲に留まる
患者の同意を得て、クリニックは他のクリニック、検査機関、および患者が追加したものを含む、自身のスコープ内の全記録を読み取ります。クリニックが変更できるのは、自身が作成した記録のみです。他の組織が作成したリソースの更新または削除は 403 で応答され、元の記録はそのまま保持されます。他のプロバイダーが作成したものを修正するには、自身の新しいリソース(例: 自身の評価を含む新しい Condition)を作成し、記録に両方を、それぞれの作成者と共に表示させます。
診察前に、GET $BASE/Patient/$PID/$summary は、あらゆるソースからの問題、薬剤、アレルギー、および最近のバイタルサインを含む、記録の国際患者サマリーを提供します。
ステップ 6: 新規データに関する通知を受ける
クリニックのプロジェクトに対して、一度だけWebhookを登録します。
curl -X POST https://platform.anpheros.com/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"url": "https://ccn.example/anpheros/hook", "events": ["resource.created", "resource.updated", "consent.revoked"]}'
他のプロジェクトが、あなたのクリニックがアクセスできるレコードに書き込んだ場合、イベントはdata.external: trueとソースを示し、EMRがポーリングなしで「他のラボからの新しい結果」を表示できるようになります。consent.revokedイベントは、その人がクリニックのアクセスを撤回したことを意味します。そのレコードの同期を停止してください。署名、リトライ、ペイロードについては、Webhookで説明しています。
患者が見るもの
患者は、自身の記録にある診察、心拍数、暫定診断を確認できます。これらはすべて、Clinica Cardio Nord の Dr. Ana Popescu によって追加されたものとして表示されます。接続情報では、クリニックのアプリケーションが、施術者が操作した際のアクセス履歴を名前とともに一覧表示します。この透明性があるからこそ、患者は次のクリニックへのアクセス許可を喜んで提供するのです。
本番稼働のためのチェックリスト
- [ ] 組織、施術者、施術者ロールが登録され、退職者は非アクティブに設定されている
- [ ] 患者はクリニックの識別子で照合され、名前では照合されない
- [ ] 既存の記録はOAuth同意を通じて取得され、重複しない
- [ ] 臨床スタッフからのすべてのリクエストには
X-Anpheros-Acting-Asが含まれる - [ ] 訪問はトランザクションとして記録され、診断は適切な検証ステータスで記録される
- [ ] すべての書き込みでソースシステムが設定され、検査レポートはコネクタ経由で送信される
- [ ] Webhookエンドポイントが署名を検証し、
consent.revokedを処理する - [ ] 本番プロジェクトには署名済みのDPA(
sk_live_…キー)があり、料金を参照
よくある質問
Anpheros は私の EMR 用の既製のコネクタを持っていますか?
いいえ。特定の EMR や検査システム用の既製のコネクタはありません。統合は FHIR R4 および REST API に対して構築され、通常は EMR の隣に配置される小さなサービスとして機能します。HL7 v2 の検査メッセージはそのまま受け入れられます。
医師は 2 つのクリニックで働くことができますか?
はい。Practitioner は各組織に PractitionerRole を持つことができます。X-Anpheros-Acting-As で指定されたロールが、各書き込みがどのクリニックに記録されるかを決定します。
患者がクリニックのアクセスを拒否するとどうなりますか?
そのレコードに対するクリニックからの呼び出しは 401 を返し、consent.revoked の webhook が送信されます。クリニックが書き込んだ内容は、その出所とともに患者のレコードに残ります。クリニックはそれを読み取ったり変更したりできなくなります。
関連情報
- 医療連携: すべての連携パターンを一覧で確認
- 医療データプロベナンスの説明
- SMART on FHIR を使用した患者同意の実装方法
- FHIR レコードへの検査結果のインポート方法
- 医療データの相互運用性
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card