# 实验室结果 API：HL7 v2、FHIR 和 LOINC

> 实验室结果如何作为 HL7 v2 和 FHIR 数据传输，单个结果必须包含哪些信息，以及如何将实验室报告接收到 FHIR 记录中，并附带真实示例。

Source: https://developers.anpheros.com/zh/guides/lab-results-api

**实验室结果 API 以结构化数据的形式提供实验室结果——测试代码、值、单位、参考范围、状态和时间——而不是 PDF，以便软件能够存储、比较、绘制图表和共享它们。** 今天，这些数据以三种形式传输：HL7 v2 ORU^R01 消息（仍然是实验室和医院之间的骨干）、HL7 FHIR R4 `Observation` 和 `DiagnosticReport` 资源（现代 API 的格式），以及实验室特定的 CSV、JSON 或 PDF 导出。本页将解释这些组件如何协同工作，一个好的实验室结果 API 必须包含哪些内容，以及如何使用 Anpheros 将实验室数据接收到患者的 FHIR 记录中。

## 谁交换实验室结果，以及使用什么格式

| 从 → 到 | 当今常用格式 | 备注 |
|---|---|---|
| 实验室 → 医院或诊所系统 | HL7 v2 ORU^R01 (在美国，通常遵循 HL7 v2.5.1 实验室结果接口指南) | 订单以 ORM/OML 消息的形式发送到另一个方向 |
| 实验室 → 公共卫生机构 | HL7 v2 电子实验室报告，日益增多的 FHIR | 仅报告的疾病 |
| 诊所系统 → 患者应用程序 | 通过患者访问 API 的 FHIR R4 | 在美国，经过认证的 EHR 将实验室结果作为 FHIR (US Core) 公开；在欧盟，欧洲健康数据空间将实验室结果列为其优先数据类别之一 |
| 实验室 → 患者 | PDF 报告、门户网站，有时是 CSV | 患者实际收到的格式 |
| 应用程序 → AI 模型 | 从 Observations 构建的结构化上下文 | 需要代码和单位才能可靠 |

方向很重要：实验室信息系统 (LIS) 是结果的真相来源，下游的每个系统都会保留一份副本。使副本值得信赖的是，每个副本都保留了值的代码、单位、范围和来源。

## 一个实验室结果需要包含什么信息

仅仅显示“葡萄糖 126”的结果无法安全地进行解释。一个完整的结果应包含：

- **标准代码。** LOINC 用于识别分析物、标本和方法：`2345-7` 表示血清或血浆中的葡萄糖，`2339-0` 表示全血中的葡萄糖。实验室自己的代码可以与其一同传输。
- **带有单位的值。** 理想情况下应使用 UCUM 单位（`mg/dL`、`mmol/L`、`10*3/uL`），这样来自不同实验室的值就可以进行转换和比较。
- **实验室使用的参考范围**，以及实验室提供的**解释**标志（H、L、N…）。
- **状态：** 初步、最终、已更正或已修订。更正时有发生；API 必须允许您在不丢失旧版本的情况下查看新版本。
- **时间：** 标本采集时间（`effectiveDateTime`）和结果发布时间（`issued`）。
- **来源：** 哪个实验室出具了该结果，以及该结果属于哪个报告或医嘱。

在 FHIR R4 中，每个结果是一个 `Observation`，包含 `category = laboratory`，而将它们分组的报告是一个 `DiagnosticReport`，它在 `result` 中列出了 Observations。在 [FHIR R4 JSON 示例](https://developers.anpheros.com/tools/fhir-examples/observation-lab-result) 中可以找到两者的有效示例，其中包含验证器报告最多的错误——另请参阅 [DiagnosticReport 示例](https://developers.anpheros.com/tools/fhir-examples/diagnostic-report)。

## HL7 v2 与 FHIR 并行

今天大多数实验室发送的相同血脂检查结果，以及 API 应如何存储：

```
OBX|1|NM|2093-3^Cholesterol^LN||212|mg/dL|<200|H|||F|||20261002074500
```

| HL7 v2 字段 | 含义 | FHIR R4 Observation 元素 |
|---|---|---|
| OBX-3 `2093-3^Cholesterol^LN` | 测试，使用 LOINC 编码 | `code.coding` (系统 `http://loinc.org`) |
| OBX-5 `212`, OBX-2 `NM` | 数值 | `valueQuantity.value` |
| OBX-6 `mg/dL` | 单位 | `valueQuantity.unit` |
| OBX-7 `<200` | 参考范围 | `referenceRange.high` |
| OBX-8 `H` | 异常标志 | `interpretation` |
| OBX-11 `F` | 最终结果 | `status = final` |
| OBX-14 | 观察时间 | `effectiveDateTime` |

两者之间的转换主要是字段映射。难点在于其他方面：实验室发送自己的代码而不是 LOINC，数字以文本形式表示 (`"6,4"`, `"<5"`)，范围表示法多样，以及超时后重复发送的报告。[如何规范化医疗数据](https://developers.anpheros.com/zh/guides/normalize-medical-data) 详细介绍了这些内容。

## 使用 Anpheros 将实验室结果接收到 FHIR 记录中

Anpheros 将每个患者的记录存储为 HL7 FHIR R4，并提供一个 [实验室连接器](https://developers.anpheros.com/zh/guides/lab-connector)：一次请求即可接收 HL7 v2、CSV 或 JSON 格式的完整报告，并返回带有 LOINC 代码、参考范围、解释和来源的实验室 Observation。

```bash
curl -s -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: springfield-lis" \
  --data-binary @lipid-panel.hl7
```

对于三项脂质检查（胆固醇、HDL、甘油三酯），本地运行平台的响应如下：

```json
{
  "created": 3, "skipped": 0, "unmapped": [], "warnings": [],
  "observations": [
    {"id": "26ed9219-…", "marker": "Cholesterol", "code": "2093-3", "system": "http://loinc.org",
     "value": 212.0, "unit": "mg/dL", "date": "2026-10-02T07:45:00Z"},
    {"id": "2633d1d4-…", "marker": "HDL cholesterol", "code": "2085-9", "system": "http://loinc.org",
     "value": 48.0, "unit": "mg/dL", "date": "2026-10-02T07:45:00Z"},
    {"id": "a02520bb-…", "marker": "Triglyceride", "code": "2571-8", "system": "http://loinc.org",
     "value": 165.0, "unit": "mg/dL", "date": "2026-10-02T07:45:00Z"}
  ]
}
```

每个存储的结果都是标准的 FHIR R4 Observation，任何 FHIR 客户端都可以读取：

```json
{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "2093-3",
                        "display": "Cholesterol [Mass/volume] in Serum or Plasma"}], "text": "Cholesterol"},
  "subject": {"reference": "Patient/4c3062d9-…"},
  "effectiveDateTime": "2026-10-02T07:45:00Z",
  "valueQuantity": {"value": 212.0, "unit": "mg/dL"},
  "interpretation": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", "code": "H"}]}],
  "referenceRange": [{"high": {"value": 200.0, "unit": "mg/dL"}}]
}
```

再次发送相同的消息不会创建任何新内容 (`"created": 0, "skipped": 3`)：每一行都从报告 ID、代码、日期和值中获得一个稳定的标识符。平台无法映射到 LOINC 的标记会保留实验室的代码，并在 `unmapped` 中返回，以便您从源头修复映射。

读取结果是一个标准的 FHIR 搜索：

```bash
curl -s "https://platform.anpheros.com/fhir/R4/Observation?patient=$PID&category=laboratory&code=http://loinc.org|2093-3" \
  -H "Authorization: Bearer $KEY"
```

其他数据输入和输出方式：

- **直接 FHIR：** `POST /fhir/R4/Observation`，或一个包含 `DiagnosticReport` 及其 Observation 的事务 Bundle。
- **事件：** 每个 Observation 一个 `resource.created` [webhook](https://developers.anpheros.com/zh/guides/webhooks)，以便诊所或应用程序在结果到达时做出反应。
- **面向人类和 AI：** 患者在其应用程序中查看结果；他们同意的应用程序读取结果；`POST /v1/context` 为 AI 模型提供一个包含近期实验室值的、带有来源标签的摘要。
- **来源：** 每条导入的结果都会记录 `author_type = import`、源系统和报告 ID（[医疗数据来源](https://developers.anpheros.com/zh/guides/medical-data-provenance)）。

完整的演练，包括 CSV 报告、HL7 v2 消息、未映射的标记和合成患者的重复报告，请参阅教程 [如何将实验室结果导入 FHIR 记录](https://developers.anpheros.com/zh/guides/import-lab-results-fhir)。

## 发送前检查结果

免费的 [FHIR R4 验证器](https://developers.anpheros.com/tools/fhir-validator) 会检查 Observation 的结构和必需的值集，并且通过 `eu-lab` 配置文件，它还会检查实验室结果应包含的内容：`laboratory` 类别、LOINC 代码、主题、最终类型状态、时间、值、UCUM 单位和参考范围。平台通过 `POST /fhir/R4/Observation/$validate?profile=eu-lab` 运行相同的检查。

## 选择实验室结果 API：清单

- 它是否将结果存储为带有 LOINC 编码的 FHIR R4 Observations，还是存储在其自己的模式的行中？
- 它是否能接受您的实验室实际发送的格式（大多数医院使用 HL7 v2，小型实验室使用 CSV 或 PDF）？
- 对于无法映射的标记，会发生什么：是被拒绝、丢弃还是保留实验室代码？
- 重试是否安全，或者重新发送的报告是否会创建重复项？
- 更正后的结果是否已版本化，并且可以读取早期值？
- 每个值的来源是否已记录并对患者可见？
- 谁可以读取结果，这是否由患者的同意决定？

## Anpheros 不做什么

Anpheros 不是一个实验室信息系统，也不连接到商业实验室网络：报告由实验室、诊所或患者的应用程序发送。它不路由实验室订单，不通过此 API 读取 PDF 报告（Anpheros Daily 应用从患者端的照片和 PDF 中提取结果），也不进行临床结果解读。单位按实验室发送的方式存储；将其转换为 UCUM 代码由发送方负责，如[如何规范化医疗数据](https://developers.anpheros.com/zh/guides/normalize-medical-data)中所述。

## 常见问题解答

### 什么是实验室结果 API？
一种允许软件以结构化数据形式发送或接收实验室结果的接口——即编码的测试、带单位的值、参考范围、状态和时间——而不是以文档形式。现代实验室结果 API 使用 HL7 FHIR R4 Observation 和 DiagnosticReport 资源；大多数实验室仍然发出 HL7 v2 ORU^R01 消息。

### 哪个代码系统标识实验室测试？
LOINC。每个 LOINC 代码都命名了分析物、标本，通常还有方法，因此 `2345-7`（血清或血浆中的葡萄糖）和 `2339-0`（全血中的葡萄糖）是不同的结果。单位最好用 UCUM 表示。

### Observation 和 DiagnosticReport 之间有什么区别？
Observation 是一个结果，例如胆固醇 212 mg/dL。DiagnosticReport 是整个报告——订购的组合测试、签发者和时间——并列出了其 Observation，如 `result` 所示。

### 我可以将 HL7 v2 实验室消息导入 FHIR 服务器吗？
可以。每个 OBX 段映射到一个 Observation（OBX-3 到 `code`，OBX-5 和 OBX-6 到 `valueQuantity`，OBX-7 到 `referenceRange`，OBX-8 到 `interpretation`）。Anpheros 实验室连接器在一个请求中完成此操作，并将实验室的报告 ID 保存在 Provenance 中。

### 如何避免在报告被重新发送时出现重复的实验室结果？
为每个结果分配一个源自报告、测试、时间和值的稳定标识符，并跳过标识符已存在的行。Anpheros 实验室连接器会自动执行此操作，并将计数报告为 `skipped`。

## 相关资源

- [HL7 v2 到 FHIR 映射](https://developers.anpheros.com/zh/guides/hl7-v2-to-fhir-mapping)：每个段和 OBX 字段
- [如何将实验室结果导入 FHIR 记录](https://developers.anpheros.com/zh/guides/import-lab-results-fhir)：分步教程
- [实验室连接器](https://developers.anpheros.com/zh/guides/lab-connector)：端点参考
- [如何规范化医疗数据](https://developers.anpheros.com/zh/guides/normalize-medical-data)：LOINC、UCUM、日期、范围和重复项
- [医疗数据溯源详解](https://developers.anpheros.com/zh/guides/medical-data-provenance)
- [FHIR 代码系统](https://developers.anpheros.com/zh/guides/fhir-code-systems)
- [如何将诊所系统与 FHIR 后端集成](https://developers.anpheros.com/zh/guides/integrate-clinic-systems-fhir)
- [FHIR 与 HL7 v2：实际区别](https://developers.anpheros.com/zh/guides/fhir-vs-hl7-v2)
- [HL7 v2 和 FHIR 用于临床仪表板](https://developers.anpheros.com/zh/guides/clinical-dashboard-hl7-fhir)：从实验室消息到仪表板磁贴
