2. 检测结果数据模型与语义定义
跨系统接口之所以经常出现“数值对得上、含义对不上”的问题,根源往往不在传输层,而在数据模型与语义定义不统一。同一个血糖结果,在 LIS 中可能是一条带项目代码、结果值、单位、参考区间、方法学、样本类型和审核状态的记录;在体检系统中,它可能被拆成“指标项 + 结果 + 提示”;在区域平台上,它又需要携带患者标识、机构标识、检测时间与结果状态。若这些字段没有统一的对象模型和语义约束,接口映射就会变成逐字段猜测。本节围绕检测结果对象,建立一套可落地的语义模型,并用状态机描述结果从产生到发布的生命周期。
一、结果对象:以“一次检测的单项结果”为最小语义单元
检测结果数据模型的最小单元不是“一张报告”,也不是“一个患者”,而是一次检测中某个指标在特定样本、特定方法学下产生的一个结果。我们把它定义为 ObservationResult 对象。一个完整的 ObservationResult 至少应包含以下语义组:
- 身份与上下文:患者标识、就诊/申请标识、样本标识、检测机构与设备标识。
- 指标定义:指标代码、指标名称、项目类别(如生化、免疫、血常规)。
- 结果值:数值、文本或定性编码,以及对应的单位。
- 参考区间:参考下限、上限、参考文本、适用人群条件。
- 方法学:检测方法、仪器型号、试剂批号、校准信息。
- 样本信息:样本类型、采集时间、接收时间、样本状态。
- 状态与时间:结果状态、审核时间、发布时间、版本号。
这七组字段不是简单堆叠,而是有明确的依赖关系:没有样本信息,结果值无法解释;没有单位,数值无法比较;没有参考区间,结果无法判读;没有方法学,结果无法在跨机构间做等价性判断。因此,结果对象的设计应遵循“值 + 单位 + 参考区间 + 方法学 + 样本 + 状态”六位一体的原则。
二、指标与单位:语义锚点必须可编码、可映射
指标不能只用中文名称表达。“血糖”在不同系统里可能叫“葡萄糖”“GLU”“血糖(GLU)”,若接口按名称匹配,必然产生歧义。正确做法是采用标准编码 + 本地编码 + 显示名称三元组。例如以 LOINC 作为标准编码锚点,本地 LIS 代码作为映射来源,显示名称仅用于界面展示。接口传输时以标准编码为准,本地编码作为扩展字段保留,便于回溯。
单位是第二个语义锚点。同一指标在不同单位下数值完全不同,例如血糖 5.6 mmol/L 等价于 100.8 mg/dL。接口中必须明确单位来源,推荐使用 UCUM 编码,如 mmol/L、mg/dL、10^9/L。若源系统只提供中文单位“毫摩尔每升”,接收方应通过单位映射表转换为 UCUM 编码,而不是直接透传。单位缺失时,结果值应标记为“不可比较”,不得参与趋势计算或跨机构比对。
三、参考区间:必须与人群条件绑定
参考区间不是固定常量,它依赖年龄、性别、生理状态甚至检测方法。例如成人男性血红蛋白参考区间约为 130–175 g/L,成年女性约为 115–150 g/L,儿童则随年龄段变化。因此参考区间对象应包含:下限、上限、单位、适用性别、适用年龄范围、参考文本以及来源说明。接口传输时,参考区间应与结果值同时传递,接收方不得自行用本地默认区间覆盖,除非明确声明“本地重新判读”。
四、方法学与样本信息:跨机构等价性的前提
方法学字段用于回答“这个结果是怎么测出来的”。至少应包含检测方法(如免疫比浊法、高效液相色谱法)、仪器型号、试剂批号、校准品批号与溯源级别。跨机构结果互认时,若方法学不同,即使指标代码和单位一致,也不能直接判定为等价。例如同一肌钙蛋白在不同平台上的第99百分位参考上限可能不同,直接比较会误导临床。
样本信息则决定结果是否可解释。样本类型(血清、血浆、全血、尿液)、采集时间、接收时间、样本状态(正常、溶血、脂血、黄疸)都会影响结果。接口中若缺少样本类型,接收方无法判断该结果是否适用于当前判读规则。因此样本信息应作为结果对象的必填语义组,而非可选备注。
五、状态机建模:结果不是静态值,而是有生命周期的对象
检测结果从产生到最终发布,会经历多个状态。若接口只传“最终值”,就无法处理更正、复检、作废等真实场景。建议为结果对象定义如下状态机:
- 初步(preliminary):仪器或中间件已产生结果,尚未人工审核。
- 已审核(verified):检验人员已确认结果,但尚未发布。
- 已发布(final):结果已对外发布,接收方可用于临床判读。
- 已更正(corrected):原结果被修正,需携带原版本号与更正原因。
- 已作废(cancelled):结果不再有效,需说明作废原因。
状态迁移必须由明确事件触发:审核通过触发 preliminary → verified;发布操作触发 verified → final;发现错误并修正触发 final → corrected;样本不合格或复检取消触发 → cancelled。接口传输时,状态字段与版本号必须同时传递,接收方依据状态决定是否更新本地记录。若收到 corrected 状态,必须按版本号覆盖旧值,并保留更正历史,而不是简单追加一条新记录。
六、可落地的结果对象字段示例
下面给出一个接口传输用的 JSON 结构示例,字段命名仅作教学示意,实际项目可按 HL7 FHIR Observation 或自定义规范调整:
{
"resultId": "R20240612001",
"version": 2,
"status": "corrected",
"patientId": "P10086",
"specimen": {
"type": "serum",
"collectedAt": "2024-06-12T07:30:00+08:00",
"receivedAt": "2024-06-12T08:05:00+08:00",
"condition": "normal"
},
"analyte": {
"standardCode": "LOINC:2345-7",
"localCode": "GLU",
"displayName": "葡萄糖"
},
"value": { "type": "numeric", "number": 5.6 },
"unit": { "ucum": "mmol/L", "display": "mmol/L" },
"referenceRange": {
"low": 3.9, "high": 6.1, "unit": "mmol/L",
"gender": "any", "ageRange": "18-65"
},
"method": {
"name": "己糖激酶法",
"instrument": "AU5800",
"reagentLot": "GLU-2405A"
},
"correctedFrom": "R20240612001-v1",
"correctReason": "复检修正"
}
该结构体现了本节的核心原则:结果值必须与单位、参考区间、方法学、样本信息和状态共同存在,缺一不可。接口映射时,应逐字段核对语义,而不是只核对数值。只有把结果对象建模为带状态、带上下文、带版本的语义单元,跨系统数据一致性才有可靠基础。