# FHIRバックエンドとのクリニックシステムの連携方法

> チュートリアル：クリニックのEMRを患者のFHIR R4レコードに接続する — 医師ディレクトリ、レコード番号によるマッチング、医師を著者とする1つのトランザクションとしての診察、検査レポート、他のプロバイダーのデータ、およびWebhook。

Source: https://developers.anpheros.com/ja/guides/integrate-clinic-systems-fhir

**このチュートリアルでは、クリニックのソフトウェア（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` |
| 検査結果 | [ラボコネクタ](https://developers.anpheros.com/ja/guides/lab-connector)経由で、`Observation`へ |

## ステップ 1: クリニックとその医師の登録

ディレクトリリソースには患者はいません。同じ環境内の他のプロジェクトはそれらを読み取ることができます。これにより、患者の他のプロバイダーは誰が何を書いたかを確認できますが、変更できるのはあなたのプロジェクトだけです。

```bash
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`を作成します。

```bash
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"}'
```

それ以降は、名前や生年月日ではなく、その番号で患者を検索してください。

```bash
curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"
```

**その人が既にAnpherosの記録を持っている場合**、自身のアプリまたは他のプロバイダーから、クリニックは2つ目の記録を作成しません。受付のタブレットまたは訪問前に送信されたリンクを使用して、OAuthでアクセスを求めます。この際、**機密性の高い**アプリケーション（クリニックのサーバーがシークレットを保持します）を使用します。患者は自身の記録と、クリニックがそれにアクセスできる期間を選択します。手順は[SMART on FHIRを使用した患者同意の実装方法](https://developers.anpheros.com/ja/guides/smart-on-fhir-backend)に記載されています。トークンの`patient`フィールドは、ファイルと共に保存するIDです。

## ステップ 3: 1つのトランザクションとして診療記録を作成する

診療記録は、互いに関連する複数のリソースを生成します。それらをまとめて一度に保存するか、全く保存しないようにするために`transaction`で送信し、誰が作業しているかを指定します。`X-Anpheros-Acting-As`は医師の役割を指定します。これはProvenanceの作成者となり、アクセスログに記録され、患者には名前で表示されます。

```bash
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は、医師の役割、クリニック、ソースシステムを指定します。

```json
"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`に更新すると、履歴には両方が保持されます。各フィールドの意味については、[医療データプロビナンスの説明](https://developers.anpheros.com/guides/medical-data-provenance)で説明されています。

## ステップ 4: 検査結果と文書

クリニック自身の検査室からの結果、または患者が持参したレポートは、レポートごとに1つのリクエストでラボコネクタを経由します。

```bash
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 レコードへの検査結果のインポート方法](https://developers.anpheros.com/ja/guides/import-lab-results-fhir) および [医療データ API](https://developers.anpheros.com/ja/guides/medical-data-api) を参照してください。

## ステップ 5: 他のプロバイダーの記録を読み、自身の範囲に留まる

患者の同意を得て、クリニックは他のクリニック、検査機関、および患者が追加したものを含む、自身のスコープ内の全記録を読み取ります。クリニックが変更できるのは、自身が作成した記録のみです。他の組織が作成したリソースの更新または削除は `403` で応答され、元の記録はそのまま保持されます。他のプロバイダーが作成したものを修正するには、自身の新しいリソース（例: 自身の評価を含む新しい `Condition`）を作成し、記録に両方を、それぞれの作成者と共に表示させます。

診察前に、`GET $BASE/Patient/$PID/$summary` は、あらゆるソースからの問題、薬剤、アレルギー、および最近のバイタルサインを含む、記録の国際患者サマリーを提供します。

## ステップ 6: 新規データに関する通知を受ける

クリニックのプロジェクトに対して、一度だけWebhookを登録します。

```bash
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](https://developers.anpheros.com/ja/guides/webhooks)で説明しています。

## 患者が見るもの

患者は、自身の記録にある診察、心拍数、暫定診断を確認できます。これらはすべて、Clinica Cardio Nord の Dr. Ana Popescu によって追加されたものとして表示されます。接続情報では、クリニックのアプリケーションが、施術者が操作した際のアクセス履歴を名前とともに一覧表示します。この透明性があるからこそ、患者は次のクリニックへのアクセス許可を喜んで提供するのです。

## 本番稼働のためのチェックリスト

- [ ] 組織、施術者、施術者ロールが登録され、退職者は非アクティブに設定されている
- [ ] 患者はクリニックの識別子で照合され、名前では照合されない
- [ ] 既存の記録はOAuth同意を通じて取得され、重複しない
- [ ] 臨床スタッフからのすべてのリクエストには`X-Anpheros-Acting-As`が含まれる
- [ ] 訪問はトランザクションとして記録され、診断は適切な検証ステータスで記録される
- [ ] すべての書き込みでソースシステムが設定され、検査レポートはコネクタ経由で送信される
- [ ] Webhookエンドポイントが署名を検証し、`consent.revoked`を処理する
- [ ] 本番プロジェクトには署名済みのDPA（`sk_live_…`キー）があり、[料金](https://developers.anpheros.com/ja/guides/pricing)を参照

## よくある質問

### Anpheros は私の EMR 用の既製のコネクタを持っていますか？
いいえ。特定の EMR や検査システム用の既製のコネクタはありません。統合は FHIR R4 および REST API に対して構築され、通常は EMR の隣に配置される小さなサービスとして機能します。HL7 v2 の検査メッセージはそのまま受け入れられます。

### 医師は 2 つのクリニックで働くことができますか？
はい。`Practitioner` は各組織に `PractitionerRole` を持つことができます。`X-Anpheros-Acting-As` で指定されたロールが、各書き込みがどのクリニックに記録されるかを決定します。

### 患者がクリニックのアクセスを拒否するとどうなりますか？
そのレコードに対するクリニックからの呼び出しは `401` を返し、`consent.revoked` の webhook が送信されます。クリニックが書き込んだ内容は、その出所とともに患者のレコードに残ります。クリニックはそれを読み取ったり変更したりできなくなります。

## 関連情報

- [医療連携](https://developers.anpheros.com/ja/guides/healthcare-integrations): すべての連携パターンを一覧で確認
- [医療データプロベナンスの説明](https://developers.anpheros.com/guides/medical-data-provenance)
- [SMART on FHIR を使用した患者同意の実装方法](https://developers.anpheros.com/ja/guides/smart-on-fhir-backend)
- [FHIR レコードへの検査結果のインポート方法](https://developers.anpheros.com/ja/guides/import-lab-results-fhir)
- [医療データの相互運用性](https://developers.anpheros.com/ja/guides/interoperability)
