mcpField
H
hpk-parser

hpk-parser

github.com/dedalus-erp-pasデータ・データベース170 回インストール
リポジトリ

hpk-parser について

hpk-parser は、フランスの医療現場における Hexagone システムの HPK 医療メッセージを解析・説明するスキルです。メッセージ種別の識別、フィールド抽出とラベル付け、構造検証を行い、HPK 仕様に基づいて内容を解説します。

主な機能

  1. 01パイプ区切り HPK メッセージの解析
  2. 02100 種類以上のメッセージに対応
  3. 03フィールドの抽出とラベル付け
  4. 04構造、フィールド数、データ型の検証
  5. 05読みやすいメッセージ解説
  6. 06HL7 v2.5 または IHE PAM へのマッピング

活用シーン

  1. 01形式不正な HPK メッセージのデバッグ
  2. 02HPK 定義に沿ったメッセージフィールドの確認
  3. 03連携作業向け HPK 例の文書化
  4. 04HPK メッセージの HL7 または IHE PAM へのマッピング

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dedalus-erp-pas/foundation-skills --skill hpk-parser

インストール後、Claude Code で/hpk-parserを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

fixtures/identity/
id_m1_create.json
fixtures/movements/
mv_m2_admission.json
mv_m6_transfer.json
mv_m9_discharge.json
reference/
README.md

詳細

HPK メッセージの解析と解説

概要

このスキルは、フランスの医療環境で Hexagone システムが使用する独自のパイプ区切り医療メッセージ形式である HPK(Healthcare Protocol Kernel)メッセージを解析し、解説します。パーサーは複数のドメイン(患者管理、サプライチェーン、在庫、財務、組織)にまたがる 100 種類以上のメッセージタイプに対応し、メッセージタイプの特定、すべてのフィールドの抽出、構造の検証を行い、公式 HPK 辞書と仕様に基づいて人が読みやすい解説を提供します。

主な信頼できる情報源:

  1. HPK Dictionary(@erp-pas/hpk-dictionary)- 完全なメッセージスキーマ、フィールド定義、検証ルールを含む GitLab リポジトリ
  2. HPK ADT Message Specification - 患者管理メッセージの包括的なフィールド定義
  3. HPK GEF Specification - ワークフロー統合および経済・財務管理メッセージ

対応範囲:

  • 患者管理:ID(ID)、移動(MV)、適用範囲(CV)- 12 種類以上のメッセージタイプ
  • サプライチェーン:製品(PR)、サプライヤー(FO)、市場(MA)、注文(CO)、納品(LI)、受領(RO)- 20 種類以上のメッセージタイプ
  • 財務:請求書(FA)、その他の入金(RD)- 4 種類以上のメッセージタイプ
  • 在庫:在庫移動(SO)、資産在庫(IM)- 5 種類以上のメッセージタイプ
  • 組織:組織構造(ST)、ユーザー(UT)- 6 種類以上のメッセージタイプ
  • 依頼:作成依頼(DD)- 2 種類以上のメッセージタイプ

このスキルの使用場面:

  • 任意の HPK メッセージを解析して解説する(あらゆるシステムドメインからの生テキスト入力)
  • HPK メッセージタイプとモードを特定する(ID|M1|C、MV|M2|C、PR|M0|C など)
  • 仕様に従ってすべての HPK フィールドを抽出し、ラベル付けする
  • HPK メッセージの構造、フィールド数、データ型を検証する
  • HPK のビジネスルールとフィールドマッピングを把握する
  • HPK メッセージの問題やデータ品質上の問題をデバッグする
  • 解説付きで HPK メッセージの例を文書化する
  • HPK 辞書への準拠とフィールド定義を確認する
  • HPK メッセージを HL7 v2.5 または IHE PAM の同等形式にマッピングする
  • Hexagone WEB の統合シナリオにおける HPK メッセージフローを分析する
  • HPK メッセージの生成ツールやパーサーの開発を支援する
  • Hexagone WEB と外部システム間のインターフェースの問題を解決する

HPK メッセージ形式

HPK メッセージではフィールド区切り文字としてパイプ(|)を使用し、次の構造を取ります:

Type|Message|Mode|Emetteur|Date|User|...additional fields...

コアフィールド(位置 0~5):

  • フィールド 0:メッセージタイプ(ID = 本人情報、MV = 移動、CV = 適用範囲)
  • フィールド 1:メッセージコード(M1、M2、M3、M6、M8、M9、MT、CE、B1 など)
  • フィールド 2:モード(C = 作成、M = 変更、D = 削除)
  • フィールド 3:送信元(送信者/ソースシステム)
  • フィールド 4:日時(形式:YYYYMMDDHHmmss)
  • フィールド 5:ユーザー ID

メッセージタイプ

本人情報メッセージ(ID|*)
ID|M1 - 患者の本人情報(作成/変更)

目的:患者の人口統計情報(登録)

フィールド構造(全 38 フィールド):

0:  Type (ID)
1:  Message (M1)
2:  Mode (C/M/D)
3:  Emetteur (Sender)
4:  Date (YYYYMMDDHHmmss)
5:  User
6:  IPP (Patient ID)
7:  Nom (Last Name)
8:  Prénom (First Name)
9:  Date de naissance (YYYYMMDD)
10: Sexe (M/F/U)
11: Adresse
12: Code postal
13: Ville
14: Pays
15: Téléphone
16: Téléphone portable
17: Email
18: Nom de naissance
19: Prénom usuel
20: Situation familiale
21: Nombre d'enfants
22: Profession
23: Médecin traitant
24: Établissement de naissance
25: Ville de naissance
26: Pays de naissance
27: Nationalité
28: INS (Identifiant National de Santé)
29: INS-C (Calcul)
30: NIR (Numéro de Sécurité Sociale)
31: Clé NIR
32: OID NIR
33: Matricule d'identité
34: Pays identité
35: Date décès (YYYYMMDD)
36: Indicateur de décès
37: Commentaire

例:

ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|15 RUE DE LA PAIX|75001|PARIS|FRA|0612345678||||||||||||||||||||||||||||||

解説:

  • タイプ:本人情報メッセージ
  • コード:M1(患者の人口統計情報)
  • モード:C(作成 - 新規患者の登録)
  • 患者:DUPONT JEAN、生年月日 15/03/1975、男性
  • 連絡先:06 12 34 56 78、15 RUE DE LA PAIX、75001 PARIS、フランス
  • システム:HEXAGONE システムからのメッセージ、ユーザー USER001、タイムスタンプ 22/01/2026 12:00:00
ID|MT - 主治医

目的:患者の主治医(médecin traitant)を割り当てる、または更新する

フィールド構造(全 13 フィールド):

0:  Type (ID)
1:  Message (MT)
2:  Mode (C/M/D)
3:  Emetteur
4:  Date
5:  User
6:  IPP
7:  Code médecin traitant
8:  Nom médecin traitant
9:  Prénom médecin traitant
10: Spécialité
11: Date début
12: Date fin

例:

ID|MT|C|HEXAGONE|20260122120000|USER001|PAT12345|PR_MARTIN|MARTIN|SOPHIE|CARDIOLOGUE|20260122||

解説:

  • タイプ:本人情報メッセージ
  • コード:MT(Médecin Traitant - 主治医)
  • モード:C(作成 - 新しい主治医を割り当て)
  • 患者:PAT12345
  • 医師:Dr. MARTIN SOPHIE、循環器専門医、コード PR_MARTIN
  • 有効期間:22/01/2026 から(終了日なし)
ID|CE - インフォームド・コンセント

目的:治療/データ処理に関する患者の同意を記録する

フィールド構造(全 11 フィールド):

0:  Type (ID)
1:  Message (CE)
2:  Mode (C/M/D)
3:  Emetteur
4:  Date
5:  User
6:  IPP
7:  Type consentement
8:  Statut (OUI/NON)
9:  Date début validité
10: Date fin validité
移動メッセージ(MV|*)
MV|M2 - 入院

目的:病院への入院(入院)

フィールド構成(全19フィールド):

0:  Type (MV)
1:  Message (M2)
2:  Mode (C/M/D)
3:  Emetteur
4:  Date
5:  User
6:  IPP
7:  Numéro de séjour (Visit ID)
8:  Date/heure entrée (YYYYMMDDHHmmss)
9:  Mode d'entrée (URGENCE/MUTATION/DOMICILE)
10: Établissement
11: Service
12: Unité fonctionnelle (UF)
13: Lit
14: Médecin responsable
15: Provenance
16: Type hospitalisation
17: Mode de traitement
18: Motif d'admission

例:

MV|M2|C|HEXAGONE|20260122140000|USER001|PAT12345|VIS20260122001|20260122140000|URGENCE|CHU_PARIS|CARDIO|UF_CARDIO_01|LIT_001|PR_MARTIN|||||||

説明:

  • 種別:移動メッセージ
  • コード:M2(病院への入院)
  • モード:C(作成 - 新規入院)
  • 患者:PAT12345
  • 来院:VIS20260122001(一意の来院識別子)
  • 入院:22/01/2026 14:00:00、救急部門経由
  • 場所:CHU_PARIS、循環器科、UF_CARDIO_01、病床 LIT_001
  • ケアチーム:担当医 PR_MARTIN
MV|M3 - ステータス変更

目的:患者の事務上のステータス変更

フィールド構成:

0-5:  Common fields (Type, Message, Mode, Emetteur, Date, User)
6:    IPP
7:    Numéro de séjour
8:    Ancien statut
9:    Nouveau statut
10:   Date changement statut
11:   Motif changement
MV|M6 - 病棟入室/転棟

目的:患者の病棟または診療科間の移動

フィールド構成(全18フィールド):

0:  Type (MV)
1:  Message (M6)
2:  Mode (C/M/D)
3:  Emetteur
4:  Date
5:  User
6:  IPP
7:  Numéro de séjour
8:  Nouvelle UF
9:  Nouveau lit
10: Nouveau service
11: Ancienne UF
12: Ancien lit
13: Ancien service
14: Date/heure mouvement
15: Mode de transfert
16: Nouveau médecin responsable
17: Motif de transfert

例:

MV|M6|C|HEXAGONE|20260123090000|USER002|PAT12345|VIS20260122001|UF_NEURO_01|LIT_102|NEURO|UF_CARDIO_01|LIT_001|CARDIO||||||

説明:

  • 種別:移動メッセージ
  • コード:M6(病棟間の移動)
  • モード:C(作成 - 新規移動イベント)
  • 患者:来院 VIS20260122001 の PAT12345
  • 移動元:循環器科 UF_CARDIO_01、病床 LIT_001
  • 移動先:神経内科 UF_NEURO_01、病床 LIT_102
  • 日時:23/01/2026 09:00:00
MV|M8 - 病棟退室

目的:機能病棟からの退室(退院を伴わない)

フィールド構成:

0-5:  Common fields
6:    IPP
7:    Numéro de séjour
8:    UF de sortie
9:    Date/heure sortie UF
10:   Destination
11:   Mode de sortie
MV|M9 - 退院

目的:患者の病院からの退院

フィールド構成(全14フィールド):

0:  Type (MV)
1:  Message (M9)
2:  Mode (C/M/D)
3:  Emetteur
4:  Date
5:  User
6:  IPP
7:  Numéro de séjour
8:  Date/heure sortie (YYYYMMDDHHmmss)
9:  Mode de sortie (DOMICILE/MUTATION/DECES)
10: Destination
11: État à la sortie (AMELIORE/STATIONNAIRE/AGGRAVE)
12: Médecin ayant autorisé la sortie
13: Motif de sortie

例:

MV|M9|C|HEXAGONE|20260125180000|USER003|PAT12345|VIS20260122001|20260125180000|DOMICILE||AMELIORE||||

説明:

  • 種別:移動メッセージ
  • コード:M9(退院)
  • モード:C(作成 - 新規退院イベント)
  • 患者:PAT12345、来院 VIS20260122001
  • 退院:25/01/2026 18:00:00
  • 退院先:DOMICILE(自宅)
  • 状態:AMELIORE(状態改善)
MV|B1 - 救急/処置室移動

目的:救急部門内の処置室移動

フィールド構成:

0-5:  Common fields
6:    IPP
7:    Numéro de passage aux urgences
8:    Box de départ
9:    Box d'arrivée
10:   Date/heure mouvement
11:   Motif
MV|MT - 一時移動

目的:患者の一時的な移動(検査、処置)

フィールド構成:

0-5:  Common fields
6:    IPP
7:    Numéro de séjour
8:    Lieu de départ
9:    Lieu d'arrivée
10:   Date/heure départ
11:   Date/heure retour prévue
12:   Motif (EXAMEN/BLOC/RADIOLOGIE)
保険適用メッセージ(CV|*)
CV|M1 - 保険適用

目的:患者の保険および適用範囲の情報

フィールド構成(全20フィールド):

0:  Type (CV)
1:  Message (M1)
2:  Mode (C/M/D)
3:  Emetteur
4:  Date
5:  User
6:  IPP
7:  Organisme payeur
8:  Code régime
9:  Caisse
10: Centre
11: Numéro adhérent
12: Clé adhérent
13: Rang bénéficiaire
14: Date début droits
15: Date fin droits
16: Type couverture (CPAM/MUTUELLE/AME)
17: Taux de remboursement
18: ALD (Affection Longue Durée)
19: CMU/CMUC

例:

CV|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|CPAM75|01|750|001|1234567890|12|00|20260101|20261231|CPAM|100|OUI|NON

説明:

  • 種別:保険適用メッセージ
  • コード:M1(保険情報)
  • 患者:PAT12345
  • 保険者:CPAM 75(パリ社会保障)、コード 01/750/001
  • 被保険者:#1234567890、キー 12、順位 00(主たる被保険者)
  • 有効期間:01/01/2026 から 31/12/2026
  • 適用範囲:CPAM(国民健康保険)、100%償還
  • 特記事項:ALD(長期疾患)= はい、CMU = いいえ

解析ロジック

HPK メッセージの解析を求められた場合:

ステップ 1:分割と識別
  1. パイプ区切りで分割:fields = message.split('|')

  2. メッセージ種別を識別:fields[0]、fields[1]、fields[2] を確認します

    • 種別:fields[0](ID、MV、CV、PR、FO、MA、CO、LI、RO、FA、SO、RD、IM、DD、UT、ST)
    • メッセージコード:fields[1](M1、M2、M3、M6、M8、M9、MT、CE、B1 など)
    • モード:fields[2](C=作成、M=変更、S/D=取消/削除)
  3. HPK ディクショナリを検索:メッセージキー {Type}|{Message} を使って、@erp-pas/hpk-dictionary からフィールド定義を取得します

ステップ 2:基本フィールドの抽出

標準ヘッダーフィールドを抽出します(位置 0~5 に常に存在します)。

位置フィールド形式説明
0種別2文字メッセージカテゴリ
1メッセージ2文字特定のメッセージ種別
2モード1文字操作(C/M/S/D)
3送信元15文字送信元システム
4日付16文字タイムスタンプ(YYYYMMDDHHMISSnn)
5ユーザー50文字ユーザー識別子
ステップ 3:種類固有のフィールドを抽出する

メッセージの種類に基づいて、残りのフィールドを抽出します。

ID|M1(本人確認情報 - フィールド 6~37):

  • 6:IPP(患者 ID)
  • 7:姓(Last Name)
  • 8:名(First Name)
  • 9:生年月日(YYYYMMDD)
  • 10:性別(M/F/U)
  • 11~37:その他の人口統計情報

MV|M2(入院 - フィールド 6~18):

  • 6:IPP
  • 7:入院番号(Visit ID)
  • 8:入院日時
  • 9:入院方法
  • 10~18:場所とケアチームの詳細

MV|M6(転棟 - フィールド 6~17):

  • 6:IPP
  • 7:入院番号
  • 8~10:新しい場所(UF、ベッド、診療科)
  • 11~13:以前の場所
  • 14~17:転棟の詳細

MV|M9(退院 - フィールド 6~13):

  • 6:IPP
  • 7:入院番号
  • 8:退院日時
  • 9:退院方法
  • 10~13:退院の詳細

CV|M1(保険適用 - フィールド 6~19):

  • 6:IPP
  • 7~19:保険および適用範囲の詳細
ステップ 4:データをフォーマットする

データ型に基づいてフォーマットを適用します。

  1. 日付フィールド(YYYYMMDD):

    • 解析:20260122 → 22/01/2026
    • 検証:有効な日付か確認します
  2. 日時フィールド(YYYYMMDDHHMISSnn):

    • 解析:20260122140530 → 22/01/2026 14:05:30
    • nn = センチ秒(通常、表示では無視します)
  3. 列挙値:

    • 性別:M(男性)、F(女性)、U(不明)
    • モード:C(作成)、M(変更)、S/D(削除)
    • 入院方法:URGENCE、MUTATION、DOMICILE など
  4. 空のフィールド:

    • 空文字列または連続するパイプ ||
    • 「未提供」と表示するか、空欄のままにします
ステップ 5:メッセージを検証する

HPK Dictionary の定義を使用して、次を検証します。

  1. フィールド数の検証:

    expected_count = len(dictionary[message_key].fields)
    actual_count = len(fields)
    if actual_count != expected_count:
        warn("Field count mismatch")
    
  2. 必須フィールドの検証:

    for field_def in dictionary[message_key].fields:
        if field_def.isMandatory and not fields[field_def.position]:
            error(f"Missing required field: {field_def.description}")
    
  3. 型の検証:

    • 日付:形式が YYYYMMDD で、有効な日付か確認します
    • 数値:数値であり、範囲内か確認します
    • 文字列:長さが最大値以下か確認します
  4. 長さの検証:

    if len(field_value) > field_def.length:
        warn(f"Field exceeds maximum length: {field_def.description}")
    
ステップ 6:説明を生成する

背景と解釈を示します。

  1. メッセージの目的:このメッセージが何を行うか説明します
  2. 操作の種類:C/M/S/D モードを説明します
  3. 主要なデータポイント:重要な臨床/管理データを強調します
  4. 業務上の背景:ワークフローへの影響を説明します
  5. 関連メッセージ:一般的なメッセージのシーケンスに触れます

検証ルール

構造の検証
  1. メッセージ形式:有効な Type|Message|Mode パターンで始まる必要があります
  2. ヘッダーの大文字表記:最初の 6 フィールドは大文字である必要があります
  3. パイプ区切り文字:フィールドは |(ASCII 124)で区切ります
  4. スペースなし:空のフィールドは | | ではなく || で表します
  5. 末尾のパイプ:オプションのフィールドには、末尾にパイプが付く場合があります
フィールドレベルの検証

HPK Dictionary の isMandatory および type プロパティに基づきます。

  1. 必須フィールド:isMandatory: true の場合、空にしてはいけません
  2. 日付形式:YYYYMMDD または YYYYMMDDHHMISSnn に一致する必要があります
  3. 数値フィールド:数字のみ(該当する場合は小数点を含む)である必要があります
  4. 長さ制限:Dictionary の length プロパティを超えてはいけません
  5. 列挙値:許可された値と一致する必要があります(comment フィールドを確認します)
業務ロジックの検証

HPK の仕様および業務ルールに基づきます。

  1. IPP の一貫性:一連の関連メッセージでは、同じ IPP を使用する必要があります
  2. 入院番号:同じエピソードに関する MV メッセージでは、入院番号を共通にする必要があります
  3. 日付の順序:
    • 入院日 ≤ 転棟日 ≤ 退院日
    • 保険適用期間の開始日 ≤ 終了日
  4. 場所の参照:診療科/部門/ベッドが組織構造に存在する必要があります
  5. 医療従事者の参照:医師コードがシステム内で有効である必要があります
データ品質の確認
  1. 日付の妥当性:

    • 生年月日が未来の日付ではないこと
    • 入院日が妥当な範囲内であること
    • (特別なケースを除き)年齢が 120 歳を超えていないこと
  2. 識別子の形式:

    • IPP:形式とチェックサム(該当する場合)を確認します
    • NIR:15 桁(13 桁 + 2 桁のキー)で、Luhn 検証に合格すること
    • FINESS:施設の 9 桁のコード
  3. コードの有効性:

    • 性別コード:M、F、U のみ
    • 国コード:ISO 3166-1 alpha-3(FRA など)
    • 保険制度コード:référentiel と照合します
エラー報告

検証に失敗した場合は、次のように報告します。

**Validation Issues**:
❌ **Error**: Missing required field at position 7 (Last Name)
⚠️  **Warning**: Field 9 (Birth Date) exceeds maximum length
⚠️  **Warning**: Field count mismatch - expected 38, got 35
ℹ️  **Info**: Optional field 16 (Mobile phone) not provided

重大度レベル:

  • エラー(❌):メッセージを処理できません
  • 警告(⚠️):メッセージに問題がある可能性がありますが、処理は可能です
  • 情報(ℹ️):任意のフィールドまたは軽微な問題です

出力形式の例

メッセージを解析する際は、次のように提示します。

### HPK Message Analysis

**Raw Message**:

[元の HPK メッセージ]


**Message Identification**:
- Type: [ID/MV/CV]
- Code: [M1/M2/M6/M9/etc.]
- Full Name: [descriptive name]
- Operation: [Creation/Modification/Deletion]

**Core Fields**:
- Sender System: [emetteur]
- Timestamp: [formatted date/time]
- User: [user ID]

**[Type]-Specific Fields**:
[List all relevant fields with labels and values]

**Business Context**:
[Explain what this message represents and its purpose]

**Validation**:
- Field count: [actual] (expected: [expected for this type])
- Required fields: [✓ or ✗ for each required field]
- Date formats: [✓ or ✗]
- Enumerated values: [✓ or ✗]

HPK 辞書との連携

GitLab リポジトリ

リポジトリ:https://gitlab-erp-pas.dedalus.lan/erp-pas/hexagone/hpk-dictionary
パッケージ:@erp-pas/hpk-dictionary(NPM)
バージョン:1.0.5+
目的:すべての HPK メッセージ定義の正式な信頼できる情報源

辞書の構造

HPK 辞書は、Hexagone 医療システム向けの包括的なメッセージ定義を提供する NPM パッケージです。各メッセージタイプには、次の情報が含まれます。

{
  description: String,        // Human-readable message description
  fields: Array[{
    position: Number,         // Field position (1-based)
    description: String,      // Field description
    length: Number,          // Maximum field length
    type: String,            // Data type (String, Number, Date, etc.)
    isMandatory: Boolean,    // Required field flag
    comment: String          // Additional notes/rules
  }]
}
辞書へのアクセス例
const hpk = require('@erp-pas/hpk-dictionary')

// Access message definition
const idM1 = hpk.segments['ID|M1']
console.log(idM1.description)  // "Suppression Identité Patient"

// Iterate through field definitions
idM1.fields.forEach(field => {
  console.log(`${field.position}. ${field.description} (${field.type}, max: ${field.length})`)
  if (field.isMandatory) console.log('   ⚠️  Required')
})
辞書内のメッセージカテゴリ

HPK 辞書では、次の領域にわたる 100 種類以上のメッセージタイプが定義されています。

ID とユーザー管理(ID、UT)
  • ID|M1:患者 ID の作成/変更
  • ID|MT:担当医の割り当て
  • ID|CE:インフォームドコンセント
  • UT|A1:ユーザーアカウント管理
患者の移動(MV)
  • MV|M2:入院
  • MV|M3:管理ステータスの変更
  • MV|M6:病棟/サービス間の転送
  • MV|M8:機能単位からの退出
  • MV|M9:退院
  • MV|B1:救急ボックスの移動
  • MV|MT:一時的な移動(検査、処置)
保険適用範囲と財務(CV、FA)
  • CV|M1:保険適用情報
  • FA|FE:請求書ヘッダー
  • FA|FL:請求書明細
組織構造(ST)
  • ST|EJ:法的施設(Établissement Juridique)
  • ST|EG:地理的施設(Établissement Géographique)
  • ST|BA:建物(Bâtiment)
  • ST|ET:階(Étage)
  • ST|CH:病室(Chambre)
サプライチェーン管理(PR、FO、MA、CO、LI、RO)
  • PR|M0-M5:製品管理
  • FO|M1-M3:サプライヤー管理
  • MA|M1-M3:契約/市場管理
  • CO|M1-M2:注文
  • LI|M1-M2:外部納品
  • RO|M1-M2:受領
在庫とストック(SO、IM)
  • SO|S1:ストック出庫
  • SO|I1:棚卸し
  • SO|T1:ストック移動
  • SO|L1:事前定義リスト
  • IM|M1:資産棚卸し
その他(RD、DD)
  • RD|E1/L1:その他の領収
  • DD|M1/K1:依頼メッセージ
検証での辞書の使用

HPK メッセージを解析する際は、辞書を使用して次の項目を確認します。

  1. フィールド数の検証:実際のフィールド数と、辞書に定義された想定フィールド数を確認します
  2. 必須フィールドの確認:isMandatory フラグを使用して、すべての必須フィールドが存在することを確認します
  3. 型の検証:type フィールドを使用して、データ形式(Date、Number、String)を検証します
  4. 長さの検証:length フィールドを使用して、値が最大長を超えていないことを確認します
  5. ビジネスルール:追加の検証ロジックについては、comment フィールドを使用します
フィールド型の参照

HPK 辞書より:

  • String:テキストフィールド(英数字)
  • Number:数値フィールド(9999.99 のような小数精度を含む場合があります)
  • Date:日付フィールド(YYYYMMDD または YYYYMMDDHHMISSnn 形式)
  • Boolean:真/偽の値(フランス語では T/F または O/N(Oui/Non)で表されます)

参考ドキュメント

主な信頼できる情報源:

  • HPK 辞書リポジトリ - フィールドスキーマ、検証ルール、データ型を含む完全なメッセージ定義

内部ドキュメント:

関連標準(参考):

重要な注意事項

メッセージ形式の標準
  1. 最初の6つのフィールドは大文字でなければなりません(Type、Message、Mode、Emetteur、Date、User)
  2. パイプ区切り文字:フィールド区切り文字として | を使用します
  3. 空のフィールド:連続するパイプ || で表します(スペースなし)
  4. 最大長:辞書に指定されています。超過しないでください
  5. 日付形式:YYYYMMDDHHMISSnn(nn = 1/100秒)

HPK から HL7 へのマッピング

標準メッセージのマッピング

相互運用性を確保するため、HPK メッセージは HL7 v2.5 / IHE PAM 形式にマッピングされることがよくあります。fixtures ディレクトリには、これらのマッピング例が含まれています。

ID メッセージ → HL7 ADT メッセージ
HPK メッセージHL7 メッセージIHE イベント説明
ID|M1|CADT^A28患者登録新しい患者を登録
ID|M1|MADT^A31患者更新患者の属性情報を更新
ID|M1|DADT^A29患者削除患者レコードを削除
ID|MT|CADT^A28-担当医師を追加/更新
ID|CE|CADT^A28-インフォームドコンセントを記録
MV メッセージ → HL7 ADT メッセージ
HPK メッセージHL7 メッセージIHE イベント説明
MV|M2|CADT^A01患者入院 [ITI-31]入院
MV|M3|CADT^A06-ステータス変更(外来へ)
MV|M6|CADT^A02患者転棟 [ITI-32]病棟/診療科間の転棟
MV|M8|CADT^A02-病棟退出(院内転棟)
MV|M9|CADT^A03患者退院 [ITI-33]退院
MV|B1|CADT^A02-救急ボックスの移動
MV|MT|CADT^A09/A10-一時外出/帰院
CV メッセージ → HL7 セグメント
HPK メッセージHL7 セグメント説明
CV|M1|CIN1 + IN2主保険
CV|M1|MIN1 + IN2保険情報の更新
主なフィールドのマッピング
HPK ID|M1 → HL7 ADT PID セグメント
HPK フィールド(位置)HPK の説明HL7 フィールドHL7 の説明
6IPPPID-3患者識別子リスト
7姓PID-5.1患者氏名 - 姓
8名PID-5.2患者氏名 - 名
9生年月日PID-7生年月日/時刻
10性別PID-8行政上の性別
11-14住所、郵便番号、市区町村、国PID-11患者住所
15-16電話番号PID-13電話番号 - 自宅
28INSPID-3国民健康保険ID(OID 1.2.250.1.213.1.4.8)
30-31NIR + キーPID-3社会保障番号(OID 1.2.250.1.213.1.4.10)
HPK MV|M2 → HL7 ADT PV1 セグメント
HPK フィールド(位置)HPK の説明HL7 フィールドHL7 の説明
7入院番号PV1-19来院番号
8入院日時PV1-44入院日時
9入院区分PV1-4入院種別
10医療機関PV1-3.1割り当て患者ロケーション - 医療機関
11診療科PV1-3.2割り当て患者ロケーション - 建物
12機能単位PV1-3.3割り当て患者ロケーション - 階
13病床PV1-3.4割り当て患者ロケーション - 病床
14担当医師PV1-7主治医
HPK MV|M9 → HL7 ADT PV1 セグメント
HPK フィールド(位置)HPK の説明HL7 フィールドHL7 の説明
8退院日時PV1-45退院日時
9退院区分PV1-36退院先
11退院時の状態PV1-52患者状態コード
統合パターン
パターン 1:Hexagone WEB → Service Echange → 外部システム
[Hexagone WEB] --HPK--> [Service Echange] --HPK/HL7--> [External System]
                              ↓
                        [HPK Dictionary]
                        [Mapping Rules]

フロー:

  1. Hexagone WEB でイベントが発生します(入院、転棟、退院)
  2. 辞書定義を使用して HPK メッセージが生成されます
  3. メッセージが Oracle データベースのキューに保存されます
  4. Service Echange/Hexaflux がメッセージを処理します
  5. 必要に応じて、マッピングルールを使用してメッセージが HL7 に変換されます
  6. 設定済みのコネクターを介して、メッセージが外部システムに送信されます
  7. 確認応答を受信し、記録します
パターン 2:外部システム → Hexagone WEB(同期)
[External System] --Request--> [Hexagone WEB API] --HPK Event--> [Database]
                                       ↓
                                 [HPK Message]
                                       ↓
                              [Service Echange] --HPK--> [Other Systems]

フロー:

  1. 外部システムが Hexagone WEB に同期リクエストを送信します
  2. Hexagone WEB がリクエストを処理し、データベースを更新します
  3. データベースのトリガーが HPK メッセージを生成します
  4. メッセージに優先度が設定されます(同期リクエストは高優先度)
  5. Service Echange がメッセージを他のシステムに配信します
  6. 元のリクエスト元に応答が返されます
パターン 3:メッセージの順序

一般的なワークフローでの HPK メッセージの標準的な順序:

新規患者の入院:

1. ID|M1|C    - Register patient identity
2. CV|M1|C    - Add insurance coverage
3. MV|M2|C    - Admit patient to hospital
4. [Optional] ID|MT|C - Assign treating physician

患者の転棟:

1. MV|M8|C    - Exit from current unit
2. MV|M6|C    - Transfer to new unit
3. [If needed] MV|M3|C - Status change

患者の退院:

1. MV|M9|C    - Discharge from hospital
2. [Optional] ID|M1|M - Update address if changed
3. [Optional] CV|M1|M - Update coverage end date
OID 参照(フランスの医療)

HPK から HL7 へのマッピングで重要な OID:

識別子の種類OID説明
INS-C1.2.250.1.213.1.4.8計算済み国民健康識別子
INS-A1.2.250.1.213.1.4.9証明済み国民健康識別子
NIR1.2.250.1.213.1.4.10社会保障番号
IPP1.2.250.1.213.1.4.2患者恒久識別子(ローカル)
FINESS1.2.250.1.71.4.2.2医療機関識別子
RPPS1.2.250.1.71.4.2.1医療従事者共有ディレクトリ

よくある問題のトラブルシューティング

問題 1:フィールド数の不一致

症状:メッセージのフィールド数が想定より少ない、または多い

Expected 38 fields for ID|M1, got 35

原因:

  • 任意フィールドの末尾のパイプが不足している
  • テキストデータ(住所、氏名)に余分なパイプが含まれている
  • 送信中にメッセージが切り詰められている

解決策:

  1. HPK 辞書で想定されるフィールド数を確認します
  2. 必須フィールドがすべて存在することを確認します
  3. データ内にエスケープされていないパイプがないか確認します
  4. 任意フィールドの末尾に不足しているパイプを追加します
問題 2:日付形式のエラー

症状:日付形式が無効、または解析エラーが発生する

Field 9 (Birth Date): "1975/03/15" - expected YYYYMMDD

原因:

  • 日付形式が正しくない(数値ではなくスラッシュを使用している)
  • 無効な日付値(例:20260231)
  • 先頭のゼロが不足している

解決策:

  1. 形式が正確に YYYYMMDD(8 桁)であることを確認します
  2. DateTime の場合:YYYYMMDDHHMISSnn(16 桁)
  3. 実在する日付であることを確認します(2 月 31 日などは無効)
  4. 必要に応じてゼロで埋めます(例:「2026315」→「20260315」)
問題 3:大文字の要件

症状:メッセージが受信側で拒否される

Field 3 (Emetteur): "Hexagone" - must be uppercase

原因:

  • ヘッダーフィールド(位置 0~5)の大文字と小文字が混在している
  • 受信システムの検証で大文字と小文字が区別されている

解決策:

  1. 最初の 6 フィールドを大文字に変換します
  2. 患者名は適切な大文字・小文字表記のままにします(ID|M1 のフィールド 7~8)
  3. フィールドごとの大文字・小文字の要件を仕様で確認します
問題 4:空のフィールドと欠落したフィールド

症状:必須フィールドが空に見える

Field 7 (Last Name): "" - required field missing

原因:

  • 値の代わりに連続したパイプ || が使われている
  • 空白文字 が空として解釈されている
  • Null と空文字列の処理の違い

解決策:

  1. 必須フィールドには空でない値を含める必要があります
  2. 任意フィールドには ||(連続したパイプ)を使用します
  3. 空を表すために空白を使用しないでください。| | は誤りです
  4. フィールド値から空白を削除します
問題 5:文字エンコーディング

症状:特殊文字が文字化けする

"Hôpital" appears as "H?pital"

原因:

  • UTF-8 と ISO-8859-1 のエンコーディングが一致していない
  • アクセント付き文字が正しくエンコードされていない

解決策:

  1. エンコーディングの仕様を確認します(通常は UTF-8 または ISO-8859-1)
  2. パイプライン全体で一貫したエンコーディングを使用します
  3. アクセント付き文字(é、è、à、ô、ç)でテストします
  4. 比較時にアクセントを取り除く正規化を検討します

実用例

例 1:識別メッセージの解析

入力:

ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|15 RUE DE LA PAIX|75001|PARIS|FRA|0612345678||||||||||||||||||||||||||||||||||||||

想定される出力:

### HPK Message Analysis

**Message Type**: ID|M1|C - Patient Identity Creation

**Core Information**:
- System: HEXAGONE
- Timestamp: 22/01/2026 12:00:00
- User: USER001
- Operation: Creation (new patient registration)

**Patient Demographics**:
- IPP: PAT12345
- Name: DUPONT JEAN
- Birth Date: 15/03/1975 (50 years old)
- Gender: Male
- Address: 15 RUE DE LA PAIX, 75001 PARIS, France
- Phone: 06 12 34 56 78

**Business Context**:
This message registers a new patient in the system. The IPP (PAT12345) will be used to identify this patient in all subsequent messages (admissions, transfers, etc.). The message was generated by USER001 on 22/01/2026 at 12:00.

**Validation**: ✓ All required fields present, correct format
例 2:入院メッセージの解析

入力:

MV|M2|C|HEXAGONE|20260122140000|USER001|PAT12345|VIS20260122001|20260122140000|URGENCE|CHU_PARIS|CARDIO|UF_CARDIO_01|LIT_001|PR_MARTIN|||||||

想定される出力:

### HPK Message Analysis

**Message Type**: MV|M2|C - Patient Admission

**Core Information**:
- System: HEXAGONE
- Timestamp: 22/01/2026 14:00:00
- User: USER001
- Operation: Creation (new admission)

**Patient & Visit**:
- IPP: PAT12345
- Visit Number: VIS20260122001
- Admission Date/Time: 22/01/2026 14:00:00

**Admission Details**:
- Entry Mode: URGENCE (Emergency admission)
- Facility: CHU_PARIS
- Service: CARDIO (Cardiology)
- Functional Unit: UF_CARDIO_01
- Bed: LIT_001
- Attending Physician: PR_MARTIN

**Business Context**:
Patient PAT12345 admitted to CHU Paris Cardiology department via emergency room on 22/01/2026 at 14:00. The visit is assigned number VIS20260122001 which will track all movements during this hospital stay. Patient assigned to bed LIT_001 in functional unit UF_CARDIO_01 under care of Dr. PR_MARTIN.

**HL7 Mapping**: Maps to ADT^A01 (Admit Patient) - IHE PAM [ITI-31]

**Validation**: ✓ All required fields present
例 3:メッセージシーケンスの解析

入力(複数のメッセージ):

1. ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|...
2. CV|M1|C|HEXAGONE|20260122120100|USER001|PAT12345|CPAM75|01|750|...
3. MV|M2|C|HEXAGONE|20260122140000|USER002|PAT12345|VIS001|20260122140000|URGENCE|...
4. MV|M6|C|HEXAGONE|20260123090000|USER003|PAT12345|VIS001|UF_NEURO|...
5. MV|M9|C|HEXAGONE|20260125180000|USER002|PAT12345|VIS001|20260125180000|DOMICILE|...

期待される出力:

### HPK Message Sequence Analysis

**Workflow**: Complete Patient Episode

**Timeline**:

**22/01/2026 12:00** - Patient Registration (ID|M1|C)
- Patient DUPONT JEAN (IPP: PAT12345) registered by USER001

**22/01/2026 12:01** - Insurance Added (CV|M1|C) [+1 min]
- CPAM Paris coverage added by USER001

**22/01/2026 14:00** - Emergency Admission (MV|M2|C) [+2h]
- Admitted via emergency, Visit: VIS001 by USER002

**23/01/2026 09:00** - Transfer (MV|M6|C) [+19h]
- Transferred to Neurology by USER003

**25/01/2026 18:00** - Discharge (MV|M9|C) [+2d 9h]
- Discharged home by USER002

**Summary**:
- Episode duration: 3 days 6 hours
- Visit VIS001 completed
- 3 users involved
- ✓ Logical sequence maintained
- ✓ Chronological order correct

**HL7 Equivalent**: ADT^A28 → ADT^A28 → ADT^A01 → ADT^A02 → ADT^A03

クイックリファレンス

コアメッセージタイプ
患者管理(ID、MV、CV)
HPK メッセージ正式名称用途HL7 相当
ID|M1|C/M/D患者識別情報患者の属性情報と登録ADT^A28/A31/A29
ID|MT|C/M/D担当医主治医の割り当て/更新ADT^A28
ID|CE|C/M/Dインフォームド・コンセント患者の同意を記録ADT^A28
MV|M2|C/M/D入院入院手続きADT^A01
MV|M3|C/M/Dステータス変更管理上のステータス変更ADT^A06
MV|M6|C/M/D転棟病棟/診療科間の移動ADT^A02
MV|M8|C/M/D病棟退出機能別ユニットからの退出ADT^A02
MV|M9|C/M/D退院退院手続きADT^A03
MV|B1|C/M/Dボックス移動救急部門内のボックス移動ADT^A02
MV|MT|C/M/D一時移動一時的な移動(検査、処置)ADT^A09/A10
CV|M1|C/M/D保険適用範囲保険および適用範囲の情報IN1/IN2
ユーザー管理(UT)
HPK メッセージ正式名称用途
UT|A1|C/M/Sユーザーアカウントユーザーアカウントの作成/変更/削除
組織構造(ST)
HPK メッセージ正式名称用途
ST|EJ|C/M法的施設法的施設(法人)
ST|EG|C/M地理的施設地理的施設(物理的な拠点)
ST|BA|C/M/S建物建物構造
ST|ET|C/M/Sフロア階層
ST|CH|C/M/S部屋部屋/空間
サプライチェーン — 製品とサプライヤー(PR、FO)
HPK メッセージ正式名称用途
PR|M0|C/M/S製品 — 一般データ製品の一般情報
PR|M1|C/M/S製品 — 薬局情報薬局固有の製品データ
PR|M2|C/M/S製品 — 治療薬集治療薬集の情報
PR|M3|C/M/S製品 — 会計情報会計および財務データ
PR|M4|C/M/S製品 — 経済情報経済管理情報
PR|M5|C/M/S製品 — 店舗情報店舗/倉庫の情報
FO|M1|C/M/Sサプライヤー — 一般情報サプライヤーの一般情報
FO|M2|C/M/Sサプライヤー — 銀行情報銀行取引先情報
FO|M3|C/M/Sサプライヤー — 発注窓口発注に関する連絡窓口
サプライチェーン — 注文と納品(MA、CO、LI、RO)
HPK メッセージ正式名称用途
MA|M1|C/M/S市場 — ヘッダー契約/市場のヘッダー
MA|M2|C/M/S市場 — 明細契約/市場の明細項目
MA|M3|C/M/S市場 — サプライヤー市場別サプライヤー
CO|M1|C/M/S注文 — ヘッダー発注書のヘッダー
CO|M2|C/M/S注文 — 明細発注書の明細項目
LI|M1|C/M納品 — 明細外部納品の明細
LI|M2|C/M納品 — ロット明細ロット管理を伴う納品明細
RO|M1|C/M/S受領 — 明細受領明細
RO|M2|C/M受領 — ロット明細ロット管理を伴う受領明細
財務(FA、RD)
HPK メッセージ正式名称用途
FA|FE|C請求書 — ヘッダー請求書のヘッダー
FA|FL|C請求書 — 明細請求書の明細項目
RD|E1|C雑収入 — ヘッダー雑収入のヘッダー
RD|L1|C雑収入 — 明細雑収入の明細項目
在庫とストック(SO、IM)
HPK メッセージ正式名称目的
SO|S1|Cストック出庫出庫(ストックの払い出し)
SO|I1|C棚卸棚卸(ストックの数量確認)
SO|T1|Cストック移動移動(内部移動)
SO|L1|C事前定義リスト事前定義リスト
IM|M1|C資産棚卸備品棚卸(資産管理)
リクエスト(DD)
HPK メッセージ正式名称目的
DD|M1|CID リクエストID 作成リクエスト
DD|K1|C行為リクエスト行為作成リクエスト
操作モード
モードフランス語英語説明
C作成作成新しいレコードを作成します
M変更変更既存のレコードを更新します
S削除削除レコードを削除します
D削除削除削除(別表記)
共通フィールドパターン

標準ヘッダー(すべてのメッセージ):

Type|Message|Mode|Emetteur|Date|User|...

日付形式:

  • 短い日付:YYYYMMDD(例:20260122)
  • 完全なタイムスタンプ:YYYYMMDDHHMISSnn(例:20260122140530)
  • nn = センチ秒(1/100 秒)

性別コード:

  • M = 男性(男性)
  • F = 女性(女性)
  • U = 不明(不明)

フランスの行政用語:

  • IPP = Identifiant Permanent du Patient(患者の恒久 ID)
  • INS = Identifiant National de Santé(国民医療 ID)
  • NIR = Numéro d'Inscription au Répertoire(社会保障番号)
  • UF = Unité Fonctionnelle(機能単位)
  • FINESS = Fichier National des Établissements Sanitaires et Sociaux
  • CPAM = Caisse Primaire d'Assurance Maladie(医療保険基金)
  • ALD = Affection Longue Durée(長期疾患)
  • CMU = Couverture Maladie Universelle(国民皆医療保障)

コメント