关于 hpk-parser
hpk-parser 是用于解析和解释 HPK 医疗消息的技能,适用于法国医疗环境中的 Hexagone 系统。它可识别消息类型、提取并标注字段、验证结构,并依据 HPK 规范说明内容。
主要功能
- 01解析管道符分隔的 HPK 消息
- 02支持 100 多种消息类型
- 03提取并标注字段
- 04验证结构、字段数量和数据类型
- 05生成易读的消息说明
- 06映射至 HL7 v2.5 或 IHE PAM
适用场景
- 01排查格式错误的 HPK 消息
- 02依据 HPK 定义检查消息字段
- 03为集成工作记录 HPK 示例
- 04将 HPK 消息映射至 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.jsonfixtures/movements/mv_m2_admission.jsonmv_m6_transfer.jsonmv_m9_discharge.jsonreference/README.md详细介绍
HPK 消息解析器和说明器
概述
此技能可解析并说明 HPK(Healthcare Protocol Kernel)消息——一种专有的管道分隔医疗消息格式,用于 Hexagone 系统的法国医疗环境。解析器支持多个领域的 100 多种消息类型(患者管理、供应链、库存、财务、组织),可识别消息类型、提取所有字段、验证结构,并根据官方 HPK 词典和规范提供通俗易懂的说明。
主要事实来源:
- HPK 词典(
@erp-pas/hpk-dictionary)——包含完整消息架构、字段定义和验证规则的 GitLab 仓库 - HPK ADT 消息规范——患者管理消息的完整字段定义
- HPK GEF 规范——工作流集成和经济/财务管理消息
覆盖范围:
- 患者管理:身份(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:Emetteur(发送方/源系统)
- 字段 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
- 医生: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 - 患者入院
目的:医院收治(admission hospitalière)
字段结构(共 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(创建 - 新的转运事件)
- 患者:PAT12345,就诊编号 VIS20260122001
- 来源:心脏科 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(长期疾病)= YES,CMU = NO
解析逻辑
收到解析 HPK 消息的请求时:
第 1 步:拆分并识别
-
按竖线分隔符拆分:
fields = message.split('|') -
识别消息类型:检查 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=停用/删除)
-
查阅 HPK 字典:使用消息键
{Type}|{Message},从@erp-pas/hpk-dictionary获取字段定义
第 2 步:提取基础字段
提取标准头部字段(始终位于位置 0-5):
| 位置 | 字段 | 格式 | 描述 |
|---|---|---|---|
| 0 | 类型 | 2 个字符 | 消息类别 |
| 1 | 消息 | 2 个字符 | 具体消息类型 |
| 2 | 模式 | 1 个字符 | 操作(C/M/S/D) |
| 3 | Emetteur | 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:格式化数据
根据数据类型应用格式:
-
日期字段(YYYYMMDD):
- 解析:
20260122→22/01/2026 - 验证:检查日期是否有效
- 解析:
-
日期时间字段(YYYYMMDDHHMISSnn):
- 解析:
20260122140530→22/01/2026 14:05:30 - nn = 厘秒(显示时通常忽略)
- 解析:
-
枚举值:
- 性别:M(男性)、F(女性)、U(未知)
- 模式:C(创建)、M(修改)、S/D(删除)
- 入院方式:URGENCE、MUTATION、DOMICILE 等
-
空字段:
- 空字符串或连续的竖线
|| - 显示为“未提供”或留空
- 空字符串或连续的竖线
步骤 5:验证消息
使用 HPK Dictionary 定义:
-
字段数量验证:
expected_count = len(dictionary[message_key].fields) actual_count = len(fields) if actual_count != expected_count: warn("Field count mismatch") -
必填字段验证:
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}") -
类型验证:
- 日期:检查格式是否为 YYYYMMDD,以及日期是否有效
- 数字:检查是否为数字且在范围内
- 字符串:检查长度是否 <= 最大值
-
长度验证:
if len(field_value) > field_def.length: warn(f"Field exceeds maximum length: {field_def.description}")
步骤 6:生成说明
提供上下文和解释:
- 消息用途:描述此消息的功能
- 操作类型:解释 C/M/S/D 模式
- 关键数据点:突出重要的临床/管理数据
- 业务上下文:解释对工作流的影响
- 相关消息:说明典型的消息序列
验证规则
结构验证
- 消息格式:必须以有效的 Type|Message|Mode 模式开头
- 大写标头:前 6 个字段必须为大写
- 竖线分隔符:字段以
|(ASCII 124)分隔 - 不含空格:空字段用
||表示,而不是| | - 尾随竖线:可使用尾随竖线表示可选字段
字段级验证
根据 HPK Dictionary 的 isMandatory 和 type 属性:
- 必填字段:如果
isMandatory: true,则不能为空 - 日期格式:必须符合 YYYYMMDD 或 YYYYMMDDHHMISSnn
- 数字字段:只能包含数字(适用时可包含小数点)
- 长度限制:不得超过字典中的
length属性 - 枚举值:必须符合允许的值(检查
comment字段)
业务逻辑验证
根据 HPK 规范和业务规则:
- IPP 一致性:同一序列中的相关消息必须使用相同的 IPP
- 住院号:同一就诊期间的 MV 消息必须使用相同的住院号
- 日期顺序:
- 入院日期 ≤ 转科日期 ≤ 出院日期
- 覆盖期限的开始日期 ≤ 结束日期
- 地点引用:科室/单元/床位必须存在于组织结构中
- 执业人员引用:医生代码必须在系统中有效
数据质量检查
-
日期合理性:
- 出生日期不能在未来
- 入院日期必须在合理范围内
- 年龄不能超过 120 岁(特殊情况除外)
-
标识符格式:
- IPP:检查格式和校验位(如适用)
- NIR:15 位数字(13 位 + 2 位校验码),并通过 Luhn 验证
- FINESS:机构代码为 9 位数字
-
代码有效性:
- 性别代码:仅限 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 字典是一个 NPM 软件包,为 Hexagone 医疗系统提供全面的消息定义。每种消息类型都包括:
{
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、UT)
- ID|M1:患者身份创建/修改
- 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 消息时,请使用字典执行以下操作:
- 验证字段数量:根据字典检查实际字段数量与预期字段数量
- 验证必填字段:使用
isMandatory标志,确保所有必填字段均存在 - 类型验证:使用
type字段验证数据格式(Date、Number、String) - 长度验证:使用
length字段确保值不超过最大长度 - 业务规则:使用
comment字段获取其他验证逻辑
字段类型参考
来自 HPK 字典:
- String:文本字段(字母数字)
- Number:数值字段(可能包含小数精度,例如
9999.99) - Date:日期字段(YYYYMMDD 或 YYYYMMDDHHMISSnn 格式)
- Boolean:真/假值(法语中表示为 T/F 或 O/N:Oui/Non)
参考文档
主要信息源:
- HPK 字典仓库 - 完整的消息定义,包含字段架构、验证规则和数据类型
内部文档:
- HPK ADT 消息规范 - ADT 消息的完整字段定义和业务规则
- HPK GEF 规范 - 经济与财务管理的工作流和集成详情
相关标准(供参考):
- IHE PAM 2.10 规范:https://github.com/Interop-Sante/ihe.iti.pam.fr
- HL7 v2.5 标准:http://www.hl7.eu/HL7v2x/v25/std25/ch02.html
重要说明
消息格式标准
- 前 6 个字段必须使用大写(Type、Message、Mode、Emetteur、Date、User)
- 管道分隔符:使用
|作为字段分隔符 - 空字段:用连续的管道符
||表示(不加空格) - 最大长度:由字典指定,不得超出
- 日期格式:YYYYMMDDHHMISSnn(其中 nn = 厘秒)
HPK 到 HL7 的映射
标准消息映射
为实现互操作性,HPK 消息通常映射到 HL7 v2.5 / IHE PAM 格式。fixtures 目录中包含这些映射的示例。
身份消息(ID)→ HL7 ADT 消息
| HPK 消息 | HL7 消息 | IHE 事件 | 描述 |
|---|---|---|---|
| ID|M1|C | ADT^A28 | 患者新增 | 注册新患者 |
| ID|M1|M | ADT^A31 | 患者更新 | 更新患者人口统计信息 |
| ID|M1|D | ADT^A29 | 患者删除 | 删除患者记录 |
| ID|MT|C | ADT^A28 | - | 添加/更新主治医生 |
| ID|CE|C | ADT^A28 | - | 记录知情同意 |
移动消息(MV)→ HL7 ADT 消息
| HPK 消息 | HL7 消息 | IHE 事件 | 描述 |
|---|---|---|---|
| MV|M2|C | ADT^A01 | 患者入院 [ITI-31] | 医院入院 |
| MV|M3|C | ADT^A06 | - | 状态变更(转为门诊患者) |
| MV|M6|C | ADT^A02 | 患者转科 [ITI-32] | 病区/科室转移 |
| MV|M8|C | ADT^A02 | - | 离开病区(院内转移) |
| MV|M9|C | ADT^A03 | 患者出院 [ITI-33] | 医院出院 |
| MV|B1|C | ADT^A02 | - | 急诊箱转移 |
| MV|MT|C | ADT^A09/A10 | - | 临时离院/返回 |
保障消息(CV)→ HL7 段
| HPK 消息 | HL7 段 | 描述 |
|---|---|---|
| CV|M1|C | IN1 + IN2 | 主保险 |
| CV|M1|M | IN1 + IN2 | 保险信息更新 |
关键字段映射
HPK ID|M1 → HL7 ADT PID 段
| HPK 字段(位置) | HPK 描述 | HL7 字段 | HL7 描述 |
|---|---|---|---|
| 6 | IPP | PID-3 | 患者标识符列表 |
| 7 | 姓氏 | PID-5.1 | 患者姓名 - 姓氏 |
| 8 | 名字 | PID-5.2 | 患者姓名 - 名字 |
| 9 | 出生日期 | PID-7 | 出生日期/时间 |
| 10 | 性别 | PID-8 | 行政性别 |
| 11-14 | 地址、邮政编码、城市、国家 | PID-11 | 患者地址 |
| 15-16 | 电话 | PID-13 | 电话号码 - 家庭 |
| 28 | INS | PID-3 | 国家健康 ID(OID 1.2.250.1.213.1.4.8) |
| 30-31 | NIR + 校验码 | 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]
流程:
- Hexagone WEB 中发生事件(入院、转院、出院)
- 使用字典定义生成 HPK 消息
- 消息存储在 Oracle 数据库队列中
- Service Echange/Hexaflux 处理消息
- 根据需要使用映射规则将消息转换为 HL7
- 通过已配置的连接器将消息发送到外部系统
- 接收确认并记录日志
模式 2:外部系统 → Hexagone WEB(同步)
[External System] --Request--> [Hexagone WEB API] --HPK Event--> [Database]
↓
[HPK Message]
↓
[Service Echange] --HPK--> [Other Systems]
流程:
- 外部系统向 Hexagone WEB 发起同步请求
- Hexagone WEB 处理请求并更新数据库
- 数据库触发器生成 HPK 消息
- 提高消息优先级(同步请求的优先级较高)
- Service Echange 将消息广播到其他系统
- 将响应返回给原始请求方
模式 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-C | 1.2.250.1.213.1.4.8 | 计算得出的国家健康标识符 |
| INS-A | 1.2.250.1.213.1.4.9 | 经认证的国家健康标识符 |
| NIR | 1.2.250.1.213.1.4.10 | 社会保险号码 |
| IPP | 1.2.250.1.213.1.4.2 | 患者永久标识符(本地) |
| FINESS | 1.2.250.1.71.4.2.2 | 机构标识符 |
| RPPS | 1.2.250.1.71.4.2.1 | 医疗专业人员共享名录 |
常见问题排查
问题 1:字段数量不匹配
症状:消息中的字段数量少于或多于预期
Expected 38 fields for ID|M1, got 35
原因:
- 可选字段缺少末尾竖线
- 文本数据(地址、姓名)中有多余的竖线
- 消息在传输过程中被截断
解决方案:
- 检查 HPK 字典中预期的字段数量
- 确认所有必填字段均存在
- 检查数据中是否有未转义的竖线
- 为可选字段补上缺少的末尾竖线
问题 2:日期格式错误
症状:日期格式无效或解析错误
Field 9 (Birth Date): "1975/03/15" - expected YYYYMMDD
原因:
- 日期格式错误(使用斜杠而非数字)
- 日期值无效(例如,20260231)
- 缺少前导零
解决方案:
- 确认格式严格为 YYYYMMDD(8 位数字)
- 日期时间格式:YYYYMMDDHHMISSnn(16 位数字)
- 确认日期有效(例如,不存在 2 月 31 日)
- 如有需要,用零补齐(例如,"2026315" → "20260315")
问题 3:大写要求
症状:接收方拒绝消息
Field 3 (Emetteur): "Hexagone" - must be uppercase
原因:
- 标头字段(位置 0-5)大小写混用
- 接收系统进行区分大小写的验证
解决方案:
- 将前 6 个字段转换为大写
- 患者姓名使用规范大小写(ID|M1 中的字段 7-8)
- 查看规范,确认每个字段的大小写要求
问题 4:空字段与缺失字段
症状:必填字段为空
Field 7 (Last Name): "" - required field missing
原因:
- 使用连续竖线
||而非填写值 - 空格字符
被视为空值 - 空值与空字符串的处理方式不同
解决方案:
- 必填字段:必须包含非空值
- 可选字段:使用
||(连续竖线) - 切勿用空格表示空值:
| |是错误的 - 去除字段值中的空白字符
问题 5:字符编码
症状:特殊字符损坏
"Hôpital" appears as "H?pital"
原因:
- UTF-8 与 ISO-8859-1 编码不匹配
- 带重音符号的字符编码不正确
解决方案:
- 确认编码规范(通常为 UTF-8 或 ISO-8859-1)
- 确保整个处理流程中的编码一致
- 使用带重音符号的字符进行测试:é、è、à、ô、ç
- 比较时考虑进行规范化(移除重音符号)
实用示例
示例 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 | 主治医生 | 指定/更新 médecin traitant | 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 | 法律实体 | Établissement Juridique(法律实体) |
| ST|EG|C/M | 地理位置实体 | Établissement Géographique(实际场所) |
| ST|BA|C/M/S | 建筑物 | Bâtiment(建筑结构) |
| ST|ET|C/M/S | 楼层 | Étage(楼层) |
| ST|CH|C/M/S | 房间 | Chambre/Pièce(房间/空间) |
供应链——产品和供应商(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 | 发票——标题 | Facture Entête(发票标题) |
| FA|FL|C | 发票——条目 | Facture Lignes(发票条目) |
| RD|E1|C | 杂项收款——标题 | Recettes diverses 标题 |
| RD|L1|C | 杂项收款——条目 | Recettes diverses 条目 |
库存与存货(SO、IM)
| HPK 消息 | 全称 | 用途 |
|---|---|---|
| SO|S1|C | 库存出库 | 出库(库存提取) |
| SO|I1|C | 库存盘点 | 盘点(库存清点) |
| SO|T1|C | 库存转移 | 转移(内部转移) |
| SO|L1|C | 预设清单 | 预设清单 |
| IM|M1|C | 资产盘点 | 家具盘点(资产跟踪) |
请求(DD)
| HPK 消息 | 全称 | 用途 |
|---|---|---|
| DD|M1|C | 身份请求 | 创建身份请求 |
| DD|K1|C | 行为请求 | 创建行为请求 |
操作模式
| 模式 | 法语 | 英语 | 说明 |
|---|---|---|---|
| C | Création | 创建 | 创建新记录 |
| M | Modification | 修改 | 更新现有记录 |
| S | Suppression | 删除 | 删除/移除记录 |
| D | Deletion | 删除 | 删除(另一种表示法) |
常见字段模式
标准标头(所有消息):
Type|Message|Mode|Emetteur|Date|User|...
日期格式:
- 短日期:
YYYYMMDD(例如,20260122) - 完整时间戳:
YYYYMMDDHHMISSnn(例如,20260122140530) - nn = 厘秒(1/100 秒)
性别代码:
M= 男性(Masculin)F= 女性(Féminin)U= 未知(Inconnu)
法国行政术语:
- 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(全民健康保险)