你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何将自定义函数与 MedTech 服务设备映射配合使用

注意

快速医疗保健互操作性资源 (FHIR®) 是一个开放的医疗保健规范。

使用 JMESPath 作为表达式语言时,许多函数都可用。 除了 作为 JMESPath 规范的一部分提供的内置函数外,还可以使用更多自定义函数。 本文介绍如何将特定于 MedTech 服务的自定义函数与 MedTech 服务 设备映射配合使用。

提示

可以使用 MedTech 服务 映射调试器 帮助创建、更新 MedTech 服务设备和 FHIR 目标映射并对其进行故障排除。 映射调试器使你可以轻松地实时查看和进行内联调整,而无需离开Azure 门户。 映射调试器还可用于上传测试设备消息,以查看它们被处理为规范化消息并转换为 FHIR 观察后的外观。

函数签名

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

return_type function_name(type $argname)

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

重要

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

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

例如:

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

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

文本值

常量值可以提供给函数。

  • 数值应括在反引号内:'
    • 示例:添加 (“10”、“10”)
  • 字符串值应括在单引号中:'
    • 示例:insertString ('mple'、 'sa'、 '0')

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

异常处理

异常可能发生在设备数据处理生命周期内的不同点。 下面是可能发生异常的各种点:

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

数学函数

add

number add(number $left, number $right)

返回将左参数添加到右参数的结果。

示例:

假定为 表达式 结果
不适用 添加 (“10”、“10”) 20
{“left”: 40, “right”: 50} 向左、向右添加 () 90
{“left”: 0, “right”: 50} 向左、向右添加 () 50

divide

number divide(number $left, number $right)

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

示例:

假定为 表达式 结果
不适用 除 (“10”、“10”) 1
{“left”: 40, “right”: 50} 除 (左、右) 0.8
{“left”: 0, “right”: 50} 除 (左、右) 0
{“left”: 50, “right”: 0} 除 (左、右) 数学错误:除以零

multiply

number multiply(number $left, number $right)

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

示例:

假定为 表达式 结果
不适用 乘 (“10”、“10”) 100
{“left”: 40, “right”: 50} 乘 (左、右) 2000
{“left”: 0, “right”: 50} 乘 (左、右) 0

pow

number pow(number $left, number $right)

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

示例:

假定为 表达式 结果
不适用 pow (“10”、“10”) 10000000000
{“left”: 40, “right”: 50} pow (左、右) 数学错误:溢出
{“left”: 0, “right”: 50} pow (左、右) 0
{“left”: 100, “right”: 0.5} pow (左、右) 10

减 (subtract)

number subtract(number $left, number $right)

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

示例:

假定为 表达式 结果
不适用 减去 (“10”、“10”) 0
{“left”: 40, “right”: 50} 减去 (左、右) -10
{“left”: 0, “right”: 50} 减去 (左、右) -50

字符串函数

insertString

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

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

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

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

示例:

假定为 表达式 结果
不适用 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 的时间戳。 时间戳表示为自 Epoch (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 的时间戳。 时间戳表示为自 Epoch (1970 年 1 月 1 日) 以来的毫秒数。

示例:

假定为 表达式 结果
{“unix”: 1626799080000} fromUnixTimestampMs (unix) “2021-07-20T16:38:00+0”
{“unix”: 0} fromUnixTimestampMs (unix) “1970-01-01T00:00:00+0”

提示

请参阅 MedTech 服务文章 使用 MedTech 服务日志排查错误 ,以获取使用 MedTech 服务日志修复错误的帮助。

后续步骤

本文介绍了如何在设备映射中使用 MedTech 服务自定义函数。

有关 MedTech 服务设备映射的概述,请参阅

有关 MedTech 服务 FHIR 目标映射的概述,请参阅

有关基于 MedTech 服务方案的映射示例的概述,请参阅

FHIR® 是 Health Level Seven International 的注册商标,在美国商标局注册,经其许可使用。