如何将自定义函数与医疗技术服务设备映射配合使用

重要

自 2025 年 2 月 26 日起,医疗技术服务将不再在以下区域提供:英国西部、阿联酋北部、南非北部、卡塔尔中部。

使用 JMESPath 作为表达式语言时,可以使用许多函数。 除了 JMESPath 规范中提供的内置函数外,还可以使用其他许多自定义函数。 本文介绍如何将特定于医疗技术服务的自定义函数与医疗技术服务设备映射配合使用。

可以使用医疗技术服务映射调试器帮助创建、更新和排查医疗技术服务设备和 FHIR® 目标映射问题。 利用映射调试器,可以轻松实时查看和进行内联调整,而无需离开 Azure 门户。 映射调试器还可用于上传测试设备消息,以查看在处理成规范化消息并转换为 FHIR 观察后的外观。

函数签名

每个函数都有一个遵循 JMESPath 规范的签名。 此签名可以表示为:

return_type function_name(type $argname)

签名指示参数的有效类型。 如果为参数传入的类型无效,则会发生错误。

重要

创建与数学相关的函数后,最终结果必须能够适应 C# long 值。 如果最终结果无法适应 C# long 值,则会发生数学错误。

如前所述,仅当指定 JmesPath 作为表达式语言时才能使用这些函数。 默认情况下,表达式语言是 JsonPath。 定义表达式时可以更改表达式语言。

例如:

"templateType": "CalculatedContent",
    "template": {
        "typeName": "heartrate",
        "patientIdExpression": {
            "value": "insertString('123', 'patient', `0`) ",
            "language": "JmesPath"
        },
        ...
    }

此示例使用 insertString 表达式生成患者 IDpatient123

文本值

可以向函数提供常量值。

  • 数字值应该用反撇号 ` 括住:
    • 示例:add(`10`,`10`)
  • 字符串值应该用单引号 ' 括住:
    • 示例:insertString('mple', 'sa', `0`)

有关详细信息,请参阅 JMESPath 规范

异常处理

设备数据处理生命周期中的各个阶段都可能发生异常。 下面是可能发生异常的各个位置:

行动 时间 分析设备映射期间可能发生的异常 结果
设备映射分析 每次收到一批新的设备消息时,都会加载并分析设备映射。 无法分析设备映射。 系统尝试重新加载并分析最新的设备映射,直到分析成功。 在分析成功之前不会处理任何新的设备消息。
设备映射分析 每次收到一批新的设备消息时,都会加载并分析设备映射。 无法分析任何表达式。 系统尝试重新加载并分析最新的设备映射,直到分析成功。 在分析成功之前不会处理任何新的设备消息。
函数执行 每次针对设备消息中的设备数据执行某个函数时。 输入设备数据与函数签名不匹配。 系统停止处理该设备消息。 不会重试设备消息。
函数执行 每次针对设备消息中的设备数据执行某个函数时。 函数说明中列出的任何其他异常。 系统停止处理该设备消息。 不会重试设备消息。

数学函数

add

number add(number $left, number $right)

返回将左参数与右参数相加的结果。

例子:

给定值 表达式 结果
n/a add(`10`, `10`) 20
{"left": 40, "right": 50} add(left, right) 90
{"left": 0, "right": 50} add(left, right) 50

divide

number divide(number $left, number $right)

返回将左参数与右参数相除的结果。

例子:

给定值 表达式 结果
n/a divide(`10`, `10`) 1
{"left": 40, "right": 50} divide(left, right) 0.8
{"left": 0, "right": 50} divide(left, right) 0
{"left": 50, "right": 0} divide(left, right) 数学错误:除以零

multiply

number multiply(number $left, number $right)

返回将左参数与右参数相乘的结果。

例子:

给定值 表达式 结果
n/a multiply(`10`, `10`) 100
{"left": 40, "right": 50} multiply(left, right) 2000
{"left": 0, "right": 50} multiply(left, right) 0

pow

number pow(number $left, number $right)

返回将左参数提升为右参数的幂的结果。

例子:

给定值 表达式 结果
n/a pow(`10`, `10`) 10000000000
{"left": 40, "right": 50} pow(left, right) 数学错误:溢出
{"left": 0, "right": 50} pow(left, right) 0
{"left": 100, "right": 0.5} pow(left, right) 10

subtract

number subtract(number $left, number $right)

返回从左参数减去右参数的结果。

例子:

给定值 表达式 结果
n/a subtract(`10`, `10`) 0
{"left": 40, "right": 50} subtract(left, right) -10
{"left": 0, "right": 50} subtract(left, right) -50

字符串函数

insertString

string insertString(string $original, string $toInsert, number pos)

通过将 toInsert 的值插入字符串 original 来生成一个新字符串。 该字符串插入到字符串 original 中的 pos 位置处。

如果位置参数从零开始,则零位置表示字符串中的第一个字符。

如果提供的位置参数超出了 original 的长度范围,则会发生错误。

例子:

给定值 表达式 结果
n/a insertString('mple', 'sa', 0) "sample"
{"original": "mple", "toInsert": "sa", "pos": 0} insertString(original, toInsert, pos) "sample"
{"original": "suess", "toInsert": "cc", "pos": 2} insertString(original, toInsert, pos) "success"
{"original": "myString", "toInsert": "!!", "pos": 8} insertString(original, toInsert, pos) "myString!!"

日期函数

fromUnixTimestamp

string fromUnixTimestamp(number $unixTimestampInSeconds)

根据给定的 Unix 时间戳生成符合 ISO 8061 规范的时间戳。 该时间戳表示自纪元(1970 年 1 月 1 日)以来经过的秒数。

例子:

给定值 表达式 结果
{"unix": 1625677200} fromUnixTimestamp(unix) "2021-07-07T17:00:00+0"
{"unix": 0} fromUnixTimestamp(unix) "1970-01-01T00:00:00+0"

fromUnixTimestampMs

string fromUnixTimestampMs(number $unixTimestampInMs)

根据给定的 Unix 时间戳生成符合 ISO 8061 规范的时间戳。 该时间戳表示自纪元(1970 年 1 月 1 日)以来经过的毫秒数。

例子:

给定值 表达式 结果
{"unix": 1626799080000} fromUnixTimestampMs(unix) "2021-07-20T16:38:00+0"
{"unix": 0} fromUnixTimestampMs(unix) "1970-01-01T00:00:00+0"

小提示

请参阅医疗技术服务文章使用医疗技术服务日志排查错误,获取有关使用医疗技术服务日志修复错误的帮助。

后续步骤

医疗技术服务设备映射概述

医疗技术服务 FHIR 目标映射概述

基于医疗技术服务方案的映射示例概述

注释

FHIR® 是 HL7 的注册商标,经 HL7 许可使用。