#InterSystems IRIS for Health

0 关注者 · 862 帖子

InterSystems IRIS for Health™ 是全球第一个也是唯一一个专门为医疗应用程序的快速开发而设计的数据平台,用于管理全世界最重要的数据。它包括强大的开箱即用的功能:事务处理和分析、可扩展的医疗保健数据模型、基于 FHIR 的解决方案开发、对医疗保健互操作性标准的支持等等。所有这些将使开发者能够快速实现价值并构建具有突破性的应用程序。了解更多信息

InterSystems 官方 Claire Zheng · 二月 15, 2023

InterSystems 纠正了一个可能导致 InterSystems IRIS® 和 Caché 无法在 Windows 上利用大页共享内存的问题,即使这些产品得到的信息是已分配到了大页内存。这会对系统性能产生不利影响。

该问题是由于 Windows 10 中的一个更改引起的,该更改需要 InterSystems IRIS® 和 Caché做相应的修改。请注意,此问题还会影响所有基于 InterSystems IRIS® 或 Caché 的 InterSystems 产品。以下版本的 Windows 会出现此问题:

Windows 10(版本 1703 及以上)

Windows 11

Windows Server 2019

Windows Server 2022

Windows Server 2016 不受影响。

作为参考,此问题的更正标识为 RJF533。此更正将包含在所有未来的 InterSystems IRIS® 和 Caché 发行版中。该更正也作为受支持产品版本的补丁提供。

InterSystems 建议采取以下措施以避免潜在的严重系统性能下降:

  • 对于使用大页内存的系统,推迟升级到受影响的 Windows 版本,直到实施更正。
  • 对于已经运行受影响的 Windows 版本并使用大页内存的系统,在任何有计划的系统负载增加之前实施更正。
0
0 187
文章 Jingwei Wang · 十一月 29, 2022 3m read

在Windows配置DSN

  1. 确认InterSystems ODBC客户端驱动已安装
    • InterSystems IRIS ODBC驱动会随着InterSystems IRIS安装包默认安装。
    • 如果没有随着InterSystems IRIS安装,请由此下载驱动,下载后执行.exe文件进行安装。
  2. 定义DSN(Data Source Names)
    • 打开Administrative Tools
    • 打开ODBC Data Sources Administrator(32-bit 或者 64-bit)
    • 选择‘System DSN’,点击右边 ‘Add’,弹出‘Create New Data Source’窗口。
    • 选择一个InterSystems IRIS 安装版本的ODBC驱动,点击‘Finish’
    • 如下图所示,输入驱动名称,IP地址,端口号(使用超级服务端口号),命名空间,用户名和密码。 
    • 然后点击 'Test Connection' 进行连接测试

在Linux配置DSN

3
0 591
公告 Michael Lei · 二月 8, 2023

InterSystems 宣布其首个开发人员预览版,作为2023.1 版开发人员预览计划的一部分。 2023.1 中添加了许多更新和增强功能,还有全新的功能,例如对列存储Columnar Storage 的生产就绪支持、使用Bulk FHIR 的能力以及对MacOS 13 Ventura的支持。当前的开发人员预览版可能不提供其中一些功能或改进。

未来的预览版本预计每两周更新一次,我们将在功能准备就绪时添加它们。请通过开发者社区分享您的反馈,以便我们共同打造更好的产品。

可以在下面的这些链接中找到初始文档。它们将在接下来的几周内更新,直到正式宣布发布(一般可用性 - GA):

此外,查看此链接以获取与此版本相关的升级信息。

与往常一样,扩展维护 (EM) 版本附带适用于所有受支持平台的经典安装包,以及 Docker 容器格式的容器映像。有关完整列表,请参阅支持的平台文档

安装包和预览密钥可从 WRC 的预览下载站点或通过评估服务网站获得(使用标记“显示预览软件”以访问 2023.1)。

0
0 203
文章 Yubo Mao · 二月 3, 2023 2m read

Intersystems IRIS平台

队列监控组件

  1. 概述

随着医院信息化建设的逐步完善,医院业务接口越来越多,业务接口数据处理可能会由于多种因素(网络、消费方系统等)影响下,出现消息堆积过多甚至造成接口卡顿的情况,影响院内正常业务开展,因此对于业务接口组件队列的的监控愈发重要。

当前Intersystems IRIS平台内置的队列监控界面仅展示接口组件实时队列信息,对于对于医院实际应用场景所需要的队列数据信息提供较为局限。队列监控组件程序是基于Intersystems IRIS平台开发,可以对所有接口组件进行统一监控,并展示组件24h内组件队列信息,也可通过设置时间段查询组件历史队列数据,更好满足当前的院内应用需求。      

关键应用:IRIS、Analytics

  1. 应用介绍
    1. 功能简介

通过配置该程序组件,对Intersystems IRIS平台中production运行组件的消息队列实现实时统一监控功能,并展示当前业务接口组件24h队列趋势情况,也可以通过指定时间范围展示历史队列趋势情况,可通过组件历史队列数据分析当前业务接口组件配置是否合理、是否需优化;通过历史队列数据趋势分析,对队列数量产生频次;对于由队列问题引起的事故可通过趋势图快速定位队列起始时间及业务事件ID,减少事故排查时间,极大地提高排查效率。

0
0 292
公告 Michael Lei · 一月 23, 2023

InterSystems 很高兴地宣布,InterSystems IRIS、InterSystems IRIS for Health 和 HealthShare Health Connect 2022.1.2 的扩展维护版本现已推出。这些版本为 2022.1.0 和 2022.1.1 版本提供了一些选定的功能和错误修复。

您可以在这些页面上找到有关更改内容的更多信息:

请通过开发者社区分享您的反馈,以便我们共同打造更好的产品。

 

如何获得软件

该软件以经典安装包和容器镜像的形式提供。有关可用安装程序和容器映像的完整列表,请参阅支持的平台网页

每个产品的完整安装包都可以从 WRC 的软件分发页面获得。

安装包和预览密钥可从 WRC 的预览下载站点或通过评估服务网站获得。

InterSystems IRIS 和 IRIS for Health 的企业版和社区版的容器镜像以及所有相应的组件都可以从InterSystems Container Registry获得。

此版本中所有套件和容器的数量为2022.1.2.574.0

0
0 113
文章 Jingwei Wang · 一月 19, 2023 6m read

什么是网页抓取:

简单来说,网络抓取网络收获网络数据提取是从网站收集大数据(非结构化)的自动化过程。用户可以根据需要提取特定站点上的所有数据或特定数据。收集的数据可以以结构化格式存储以供进一步分析。

什么是网页抓取? — 詹姆斯·勒
网页抓取涉及的步骤:

  1. 找到您要抓取的网页的 URL
  2. 通过检查选择特定元素
  3. 编写代码获取被选元素的内容
  4. 以需要的格式存储数据

就这么简单!

用于网络抓取的流行库/工具是:

  • Selenium – 用于测试 Web 应用程序的框架
  • BeautifulSoup – 用于从 HTML、XML 和其他标记语言中获取数据的 Python 库
  • Pandas – 用于数据操作和分析的 Python 库


什么是Beautiful Soup?

Beautiful Soup 是一个纯 Python 库,用于从网站中提取结构化数据。它允许您解析来自 HTML 和 XML 文件的数据。它充当辅助模块,并以与使用其他可用开发人员工具以网页交互的方式与 HTML 交互。

0
0 296
文章 Lilian Huang · 一月 19, 2023 10m read

在上一篇文章中,我们看到了最常用的HL7消息类型之一--ADT(入院、出院、转院)的结构,以及ADT^A04的例子和它所有字段的描述。现在让我们来看看另一个数据流,它与测试订单的订购和履行有关。我说的是ORM(从2.5版本开始,你应该使用特定的消息来订购测试,如OMG、OML、OMD、OMS、OMN、OMI和OMP),ORL和ORU消息。在一个非常简化的情况下,数据的交换可能看起来像这样。

让我们更详细地看一下这些消息。

0
0 791
文章 Jingwei Wang · 一月 19, 2023 6m read

Python 已成为世界上使用最广泛的编程语言(来源:https://www.tiobe.com/tiobe-index/),SQL 作为数据库语言继续引领潮流。 Python 和 SQL 一起工作以提供 SQL 单独无法提供的新功能不是很好吗?毕竟,Python 拥有超过 380,000 个已发布的库(来源:https://pypi.org/),它们具有非常有趣的功能,可以在 Python 中扩展您的 SQL 查询。本文详细介绍了如何使用嵌入式 Python 在 InterSystems IRIS 数据库中创建新的 SQL 存储过程。

用作示例的 Python 库

本文将使用两个非常有用的库:Geopy 和 Chronyk。

Geopy 是一个用于将地理编码(地址和地理坐标的限定)应用于地址数据的库。有了它,就可以从街道名称中获取邮局格式的邮政编码和完整地址。非常有用,因为许多记录都有地址。

Chronyk 用于使用人类语言处理日期和时间。这非常有用,因为在内部,对于 IRIS 和 Python,日期是一个数字,表示自初始日期以来经过的时间量。对于人类来说,日期是 7 月 20 日,或者昨天,或者明天,或者两个小时前。 Chronyk 接受接收这样的日期,然后将其转换为通用日期格式。

InterSystems IRIS 中的 Python 支持

0
0 174
文章 Lilian Huang · 一月 19, 2023 4m read

动机

这个项目是在我考虑如何通过Embedded Python让Python代码自然地处理IRIS globals所提供的可扩展的存储和高效的检索机制时想到的。

我最初的想法是使用globals创建一种Python字典的实现,但很快我就意识到,我应该首先处理对象的抽象问题。

所以,我开始创建一些可以包装Python对象的Python类,在globals中存储和检索它们的数据,也就是说,在IRIS globals中序列化和反序列化Python对象。

它是如何工作的?

像 ObjectScript 的%DispatchGetProperty()%DispatchSetProperty() 和%DispatchMethod()一样, Python 有委托对象的属性和方法调用的方式。

当你设置或获取一个对象属性时,Python 解释器让你通过方式 __setattr__(self, name, value) 和 __getattr(self, name)__来截获这个操作。

请看这个相当基本的例子。

0
0 170
文章 Michael Lei · 一月 17, 2023 3m read

ZPM 设计用于与 InterSystems IRIS 数据平台的应用程序和模块一起使用。 它由两个组件组成:ZPN 客户端(用于管理模块的 CLI)和注册表(模块和元信息的数据库)。 我们可以使用 ZPM 来搜索、安装、升级、移除和发布模块。 使用 ZPM,可以安装 ObjectScript 类、前端应用程序、互操作性生产环境、IRIS BI 解决方案、IRIS 数据集或任何文件,例如嵌入式 Python wheel。 

今天的这份实战宝典将分为 3 个部分:

  1. 安装 ZPM
  2. 生成模块
  3. 在注册表中查找、安装、发布模块
  1. 安装 ZPM
  • 下载最新版本的 ZPM(它应该是一个 XML 文件)下载链接
  • 将下载的 XML 导入到 IRIS(它只能部署到已打开 IRIS 的 IRIS 终端)并按 Enter 键

write $SYSTEM.OBJ.Load("C:\zpm.xml", "c")

请注意,“C:\zpm.xml”是下载的 XML 文件的路径,这一步可能需要一些时间。

  • 安装完成后,只需输入 zpm,按 Enter 键,您会看到您在 zpm shell 中

  1. 生成模块

在开始生成模块之前,我们需要准备一个文件夹,里面有一个或多个可以加载的文件,因此我在 C 盘下创建了一个名为 zpm 的文件夹。

执行命令 generate C:/zpm

在指定所有必要的内容后,您的第一个模块已成功生成,您还会看到 

注意: 

  1. 模块版本正在使用语义化版本控制 
  2. 模块源文件夹是包含所有类文件的文件夹
  3. zpm 还提供了一个选项,可以添加 web 应用程序和依赖项,本例中我将其留空

现在,打开文件资源管理器,您会看到一个名为“module.xml”的文件,如下面的屏幕截图所示

输入命令 _load C:\ZPM\ _,您会看到您的模块已重新加载、验证、编译和激活

 

3. 在注册表中查找、安装、发布模块

在当前注册表中查找可用的软件包:zpm:USER>search

举例来说,从当前注册表安装软件包,让我们在公共注册表中安装一个名为 zpmshow 的模块:_zpm:USER>install zpmshow _(命令为 install "moduleName")

加载后发布模块:zpm:USER>publish myFirstZPMDemo

可以使用 zpm:USER>search 验证发布,本例中,您可以看到“myfirstzpmdemo 0.1.0”位于当前注册表中。

注意:如果发布模块时遇到以下错误:“ERROR! Publishing module, something went wrong”(错误!发布模块时出错了),确保当前注册表的状态为“已启用”且可用。

可以使用_ zpm:USER>repo -list, _验证当前注册表的状态。  

可用视频:点击此处

0
0 210
文章 Nicky Zhu · 一月 6, 2023 8m read

国务院于2022年12月19日发布了《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》(后简称《数据二十条》),如何有效利用数据已经成为下一步的趋势。另一方面,无论是基于数据中台还是数据编织理念,两者也都对如何利用数据提出了构想。因此医疗行业数字化建设的目标已不能再局限于如何收集数据,建立医疗行业数据的流通机制将会是为越来越普遍的需求。

时钟拨回几年前,数据中台概念开始火爆。人们对数据中台的定义、诠释尽管有诸多差异,通过数据中台降低数据共享和利用的成本则是共同的期望。但经过这几年的探索之后,中台已死的观点也在涌现。究其原因,除去中台概念在技术上的不确定,数据流通过程中的责权益的不清晰也是严重的制约因素。毕竟,数据中台自身作为一套技术框架并不能代替法律法规与市场自动将数据转变为商品从而创造出流通价值。

那么,如何能够使数据的流通合规合法,使数据能够如货币和商品一般自由流动,则是我们需要思考和探索的主题,这次《数据二十条》的出现,无疑为医疗信息技术工作者提供了一个明确的思考方向。

0
0 264
文章 sun yao · 一月 4, 2023 6m read

一、目的 因使用BP中Switch分支来区分不同节点(即接口)及流向,个人已知方法中无相关统计功能能直接获取各分支节点及流向BO(调用第三方系统)信息,且当前使用系统未封装相关模块供查询,故通过解析BP中XData的方式获取Switch-Case节点及Call调用相关信息

二、解析类中的XData数据

/// 解析类中的XData内容
/// SELECT * FROM %Dictionary.CompiledXData
/// xdataID XData表ID
/// d ##class(BOE.TEST.ClassAnalysis).XDataAnalysisTextReader("JHIP.SM.BP.View||BPL")
ClassMethod XDataAnalysisTextReader(xdataID As %String) As %Status
{
   //获取XData流
   s compiledXdata=##class(%Dictionary.CompiledXData).%OpenId(xdataID)
   s tStream=compiledXdata.Data
   If '$IsObject(tStream) s tSC=%objlasterror q
   
   //逐行读取xml
   s status=##class(%XML.TextReader).ParseStream(tStream,.textreader)
   if $$$ISERR(status) do $System.Status.DisplayError(status) q
   s conditionMsgCode="sy"
   while textreader.Read()
   {
	   //节点类型为element
       if (textreader.NodeType="element"){
	       //节点路径中包含/switch/case且case为结尾
	       if ((textreader.Path["/switch/case")&&(textreader.Path'["/switch/case/")){ //接口switch case解析接口 element
	       		//节点有属性
	       		if (textreader.HasAttributes){
		       		//移动到对应的属性节点Attribute
		       		if (textreader.MoveToAttributeName("condition")){
			       		s condition=textreader.Value
			       		s len=$l(condition,"||")
			       		for i=1:1:len{
				       		s tepCondition=$p(condition,"||",i)
				       		if (tepCondition["'="){
					       		s conditionMsgCode=$tr($p(tepCondition,"action",2),"""")
					       		if (conditionMsgCode=""){
						       		s conditionMsgCode=$tr($p(tepCondition,"OriginalDocId",2),"""")
					       		}
				       		}else{
				       			s conditionMsgCode=$tr($p(tepCondition,"=",2),"""")
				       		}
			       		}
			       		//b:conditionMsgCode=""
			       		s conditionMsgCode=$tr(conditionMsgCode,"()")
			       		if (conditionMsgCode=""){ //如果未定义分支条件,则设置为类名
				       		s conditionMsgCode=xdataID
			       		}
			       		//移动到下一个节点Node
			       		d textreader.Read()
			       		if (textreader.HasAttributes){
				       		if (textreader.MoveToAttributeName("name")){
					       		s name=textreader.Value
			       				s ^sy(conditionMsgCode)=name
				       		}
			       		}else{
				       		s ^sy(conditionMsgCode)=""
			       		}
		       		}
	       		}		
	       }
	       if ((textreader.Path["/switch/case/")&&(textreader.Path["/call")&&(textreader.Path'["/call/")){ //接口switch case call解析接口 element
	       		s callName="",callTarget=""
	       		if (textreader.HasAttributes){
		       		if (textreader.MoveToAttributeName("name")){
			       		s callName=textreader.Value
			       		s ^sy(conditionMsgCode,"callName",callName)=callName
		       		}
		       		if (textreader.MoveToAttributeName("target")){
			       		s callTarget=textreader.Value
			       		s ^sy(conditionMsgCode,"callTarget",callTarget)=callTarget
		       		}
	       		}		
	       }
       }
   }
}

XData解析测试

  • 测试用BP结构
Class JHIP.SM.BP.View Extends Ens.BusinessProcessBPL
{

/// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl" ]
{
<process language='objectscript' request='Ens.Request' response='Ens.Response' height='2000' width='2015' >
<context>
<property name='sqltype' type='%String' initialexpression='"Query"' instantiate='0' >
<parameters>
<parameter name='MAXLEN'  value='50' />
</parameters>
</property>
<property name='sqlstatement' type='%String' instantiate='0' >
<parameters>
<parameter name='MAXLEN'  value='1000' />
</parameters>
</property>
<property name='tablename' type='%String' instantiate='0' >
<parameters>
<parameter name='MAXLEN'  value='50' />
</parameters>
</property>
<property name='sql' type='JHIPLIB.SQL.MSG.SQLMessage' instantiate='0' />
<property name='sqlparameter' type='%String' instantiate='0' >
<parameters>
<parameter name='MAXLEN'  value='50' />
</parameters>
</property>
</context>
<sequence xend='200' yend='600' >
<switch name='判断接口' xpos='200' ypos='250' xend='200' yend='500' >
<case condition='request.OriginalDocId="JH1301"' >
<sequence name='JH1301手麻测试' xpos='335' ypos='400' xend='200' yend='850' >
<assign name="设定查询参数" property="context.sqlparameter" value="request.GetValueAt(&quot;/REQUEST/KSBM&quot;)" action="set" xpos='200' ypos='250' >
<annotation><![CDATA[设定查询参数]]></annotation>
</assign>
<assign name="设定SQL脚本" property="context.sqlstatement" value="&quot;select * from whkx_oas_operation_dept&quot;" action="set" xpos='200' ypos='350' >
<annotation><![CDATA[设定SQL脚本]]></annotation>
</assign>
<assign name="设定数据库表名" property="context.tablename" value="&quot;whkx_oas_operation_dept&quot;" action="set" xpos='200' ypos='450' >
<annotation><![CDATA[设定数据库表名]]></annotation>
</assign>
<assign name="设定SQL类型" property="context.sqltype" value="&quot;Query&quot;" action="set" xpos='200' ypos='550' >
<annotation><![CDATA[有QUERY、INSERT、UPDATE、DELETE4种]]></annotation>
</assign>
<code name='拼接sql脚本生成xml消息' xpos='200' ypos='650' >
<annotation><![CDATA[拼接sql脚本生成xml消息]]></annotation>
<![CDATA[ 
 Set sqlreq=##class(JHIPLIB.SQL.MSG.SQLMessage).%New()
 Set context.sqlstatement=$replace(context.sqlstatement,"?",context.sqlparameter)
 
 Set sqlreq.sqlreq=context.sqlstatement
 Set sqlreq.sqltype=context.sqltype
 Set sqlreq.tablename=context.tablename
 
 Set context.sql=sqlreq
 ]]>
</code>
<call name='查询手麻视图服务1' target='测试服务BO' async='0' xpos='200' ypos='750' >
<annotation><![CDATA[查询手麻视图服务1]]></annotation>
<request type='Ens.Request' >
<assign property="callrequest" value="context.sql" action="set" />
</request>
<response type='Ens.Response' >
<assign property="response" value="callresponse" action="set" />
</response>
</call>
</sequence>
</case>
<case condition='request.OriginalDocId="JH1302"' >
<sequence name='his测试' xpos='605' ypos='400' xend='200' yend='850' >
<assign name="设定查询参数" property="context.sqlparameter" value="request.GetValueAt(&quot;/REQUEST/KSBM&quot;)" action="set" xpos='200' ypos='250' >
<annotation><![CDATA[设定查询参数]]></annotation>
</assign>
<assign name="设定SQL脚本" property="context.sqlstatement" value="&quot;SELECT DISTINCT ORDERED_EMP_CODE  FROM core_his50.HIS_DEPT_INCOME_MONTH_I_H080 WHERE  HIS_PATIENT_ID = 'ZY010000000039'&quot;" action="set" xpos='200' ypos='350' >
<annotation><![CDATA[设定SQL脚本]]></annotation>
</assign>
<assign name="设定数据库表名" property="context.tablename" value="&quot;HIS_DEPT_INCOME_MONTH_I_H080&quot;" action="set" xpos='200' ypos='450' >
<annotation><![CDATA[设定数据库表名]]></annotation>
</assign>
<assign name="设定SQL类型" property="context.sqltype" value="&quot;Query&quot;" action="set" xpos='200' ypos='550' >
<annotation><![CDATA[有QUERY、INSERT、UPDATE、DELETE4种]]></annotation>
</assign>
<code name='拼接sql脚本生成xml消息' xpos='200' ypos='650' >
<annotation><![CDATA[拼接sql脚本生成xml消息]]></annotation>
<![CDATA[ 
 Set sqlreq=##class(JHIPLIB.SQL.MSG.SQLMessage).%New()
 Set context.sqlstatement=$replace(context.sqlstatement,"?",context.sqlparameter)
 
 Set sqlreq.sqlreq=context.sqlstatement
 Set sqlreq.sqltype=context.sqltype
 Set sqlreq.tablename=context.tablename
 
 Set context.sql=sqlreq
 ]]>
</code>
<call name='查询手麻视图服务2' target='his测试BO' async='0' xpos='200' ypos='750' >
<annotation><![CDATA[查询手麻视图服务1]]></annotation>
<request type='Ens.Request' >
<assign property="callrequest" value="context.sql" action="set" />
</request>
<response type='Ens.Response' >
<assign property="response" value="callresponse" action="set" />
</response>
</call>
</sequence>
</case>
<case condition='request.OriginalDocId="JH0000"' >
<sequence name='JH000001' xpos='875' ypos='400' xend='200' yend='850' >
<assign name="设定查询参数" property="context.sqlparameter" value="request.GetValueAt(&quot;/REQUEST/KSBM&quot;)" action="set" xpos='200' ypos='250' >
<annotation><![CDATA[设定查询参数]]></annotation>
</assign>
<assign name="设定SQL脚本" property="context.sqlstatement" value="&quot;SELECT * FROM core_his50.His_dict_dept_H080&quot;" action="set" xpos='200' ypos='350' >
<annotation><![CDATA[设定SQL脚本]]></annotation>
</assign>
<assign name="设定数据库表名" property="context.tablename" value="&quot;core_his50.His_dict_dept_H080&quot;" action="set" xpos='200' ypos='450' >
<annotation><![CDATA[设定数据库表名]]></annotation>
</assign>
<assign name="设定SQL类型" property="context.sqltype" value="&quot;Query&quot;" action="set" xpos='200' ypos='550' >
<annotation><![CDATA[有QUERY、INSERT、UPDATE、DELETE4种]]></annotation>
</assign>
<code name='拼接sql脚本生成xml消息' xpos='200' ypos='650' >
<annotation><![CDATA[拼接sql脚本生成xml消息]]></annotation>
<![CDATA[ 
 Set sqlreq=##class(JHIPLIB.SQL.MSG.SQLMessage).%New()
 Set context.sqlstatement=$replace(context.sqlstatement,"?",context.sqlparameter)
 
 Set sqlreq.sqlreq=context.sqlstatement
 Set sqlreq.sqltype=context.sqltype
 Set sqlreq.tablename=context.tablename
 
 Set context.sql=sqlreq
 ]]>
</code>
<call name='查询手麻视图服务3' target='his测试BO' async='0' xpos='200' ypos='750' >
<annotation><![CDATA[查询手麻视图服务1]]></annotation>
<request type='Ens.Request' >
<assign property="callrequest" value="context.sql" action="set" />
</request>
<response type='Ens.Response' >
<assign property="response" value="callresponse" action="set" />
</response>
</call>
</sequence>
</case>
<case condition='request.OriginalDocId="JH0000"' >
<sequence name='JH000002' xpos='1145' ypos='400' xend='200' yend='850' disabled="true">
<assign name="设定查询参数" property="context.sqlparameter" value="request.GetValueAt(&quot;/REQUEST/KSBM&quot;)" action="set" xpos='200' ypos='250' >
<annotation><![CDATA[设定查询参数]]></annotation>
</assign>
<assign name="设定SQL脚本" property="context.sqlstatement" value="&quot;SELECT * FROM His_dict_dept_H080&quot;" action="set" xpos='200' ypos='350' >
<annotation><![CDATA[设定SQL脚本]]></annotation>
</assign>
<assign name="设定数据库表名" property="context.tablename" value="&quot;dhis.His_dict_dept_H080&quot;" action="set" xpos='200' ypos='450' >
<annotation><![CDATA[设定数据库表名]]></annotation>
</assign>
<assign name="设定SQL类型" property="context.sqltype" value="&quot;Query&quot;" action="set" xpos='200' ypos='550' >
<annotation><![CDATA[有QUERY、INSERT、UPDATE、DELETE4种]]></annotation>
</assign>
<code name='拼接sql脚本生成xml消息' xpos='200' ypos='650' >
<annotation><![CDATA[拼接sql脚本生成xml消息]]></annotation>
<![CDATA[ 
 Set sqlreq=##class(JHIPLIB.SQL.MSG.SQLMessage).%New()
 Set context.sqlstatement=$replace(context.sqlstatement,"?",context.sqlparameter)
 
 Set sqlreq.sqlreq=context.sqlstatement
 Set sqlreq.sqltype=context.sqltype
 Set sqlreq.tablename=context.tablename
 
 Set context.sql=sqlreq
 ]]>
</code>
<call name='查询手麻视图服务1' target='测试服务BO' async='1' xpos='200' ypos='750' >
<annotation><![CDATA[查询手麻视图服务1]]></annotation>
<request type='Ens.Request' >
<assign property="callrequest" value="context.sql" action="set" />
</request>
<response type='Ens.Response' >
<assign property="response" value="callresponse" action="set" />
</response>
</call>
</sequence>
</case>
<case condition='request.action="JH1401"' >
<call name='HTTP测试' target='测试HTTP样例BO' async='1' xpos='1415' ypos='400' >
<request type='Ens.Request' >
<assign property="callrequest" value="request" action="set" />
</request>
<response type='Ens.Response' >
<assign property="response" value="callresponse" action="set" />
</response>
</call>
</case>
<default name='default' />
</switch>
</sequence>
</process>
}

Storage Default
{
<Type>%Storage.Persistent</Type>
}

}
  • 测试结果

image

  • 参考 image

%XML.TextReader逐个节点地读取和解析文档。 %XML.XPATH.document使用引用文档中特定节点的XPATH表达式来获取数据。 [XMLTools参考链接](%3Cdiv align="justify" style="min-height: 13pt; "%3E%3Ca href="https://docs.intersystems.com/irisforhealth20222/csp/docbook/DocBook.UI.Page.cls?KEY=GXML_intro"%3E%3Cfont face="Calibri" color="#0000ff" size="2"%3E%3Cspan dir="ltr" style=" font-size:10.5pt"%3E%3Cu%3Ehttps://docs.intersystems.com/irisforhealth20222/csp/docbook/DocBook.UI.Page.cls?KEY=GXML_intro%3C/u%3E%3C/span%3E%3C/font%3E%3C/a%3E%3C/div%3E)

三、获取工程下所有BP类型类文件

/// 获取工程下所有BP类型类文件
/// SELECT * FROM %Studio.Project
/// package:包名称
/// w ##class(BOE.TEST.ClassAnalysis).GetClassNameByPackage()			
ClassMethod GetClassNameByPackage(package As %String = "") As %String
{
				
	s $zt="Exception"
	k ^sy //初始化,Global用于存储分支节点相关信息			
	s project=""
	for{
		s project=$o(^oddPROJECT(project))
		q:project=""
		s rs=##class(%Library.ResultSet).%New("%Studio.Project:ProjectItemsList")
		//s columns=rs.GetColumnCount()
		s sc=rs.Execute(project)
		while(rs.Next()){
			s i=0			
			s name=rs.GetData(2) //Item名称			
			s type=rs.GetData(3) //Item类型			
			s tempPackage=rs.GetData(5) //包名			
			if type="CLS"{ //类文件
				s theCompiledClassObj = ##Class(%Dictionary.CompiledClass).%OpenId(name)
				continue:theCompiledClassObj=""
				s primarySuper=theCompiledClassObj.PrimarySuper
				continue:primarySuper'["Ens.BusinessProcess" //只处理BP
				if (package'=""){
					for j=1:1:$L(name,"."){
						if $P(name,".",j)=package s i=1 //过滤包名
					}
					continue:i=0
				}
				s xDataId=""
				&sql(SELECT top 1 ID into :xDataId FROM %Dictionary.CompiledXData WHERE parent=:name)
				if (xDataId'=""){
					//解析XData
					d ##class(BOE.TEST.ClassAnalysis).XDataAnalysisTextReader(xDataId)
				}
			}
		}
	}
	q 1
Exception
	q "-1^"_$ze
}

查询已生成的分支节点数据

/// 查询接口目录
/// d ##class(%Results).RunQuery("BOE.TEST.ClassAnalysis","GetMsgInfo")
Query GetMsgInfo() As %Query(ROWSPEC = "msgCode,msgDesc,callName,callTarget") [ SqlProc ]
{
}

ClassMethod GetMsgInfoExecute(ByRef qHandle As %Binary) As %Status
{
 	s repid=$I(^CacheTemp)
 	s ind=1
 	s qHandle=$lb(0,repid,0)
	s msgCode=""
	for{
		s msgCode=$o(^sy(msgCode)) //接口编码
		q:msgCode=""
		s msgDesc=^sy(msgCode) //接口描述
		s callName="",callTarget=""
		for{
			s callName=$o(^sy(msgCode,"callName",callName))
			q:callName=""
			d OutRow
		}
		
	}
	
	Quit $$$OK

OutRow
	s Data=$lb(msgCode,msgDesc,callName,callTarget)
 	s ^CacheTemp(repid,ind)=Data
 	s ind=ind+1
	quit
}

ClassMethod GetMsgInfoFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = GetBISQCIndexDataExecute ]
{
	s AtEnd=$LIST(qHandle,1)
 	s repid=$LIST(qHandle,2)
 	s ind=$LIST(qHandle,3)
 	s ind=$o(^CacheTemp(repid,ind))
 	If ind="" {				// if there are no more rows, finish fetching
 		s AtEnd=1
 		s Row=""
 	}
 	Else      {			
 		s Row=^CacheTemp(repid,ind)
 	}
 	s qHandle=$lb(AtEnd,repid,ind)
	Quit $$$OK
}

ClassMethod GetMsgInfoClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = GetBISQCIndexDataExecute ]
{
	s repid=$LIST(qHandle,2)
 	Kill ^CacheTemp(repid)
    Quit $$$OK
}

工程分支节点生成及查询测试

  • 测试结果 image

  • 通过存储过程查询

call BOE_TEST.ClassAnalysis_GetMsgInfo()

image

0
0 152
文章 Claire Zheng · 一月 4, 2023 1m read

这是InterSystems 2022年全球峰会上InterSystems 医疗行业负责人 Don Wooklock 的分享,他认为,在数字医疗发展如火如荼的当下,经济、消费主义和技术三股力量正在推动医疗行业快速变革。我们面临着压力,但更多的是机遇,利用好市场能量,在具备变革精神的医疗卫生行业中,全力以赴!

0
0 219
文章 Claire Zheng · 一月 4, 2023 1m read

在InterSystems 2022年全球峰会上,InterSystems 数据平台负责人 Scott Gnau解读了智能数据编织(smart data fabric)及其实现方式。Scott 同时也是一位钢笔收藏家,他分享了自己学习收藏的过程,认为这种过程与智能数据编织有着异曲同工之妙。InterSystems IRIS数据平台的诸多优秀能力可以帮助用户实现智能数据编织,重塑数据利用方式!

0
0 153
文章 Lilian Huang · 十二月 31, 2022 10m read

在上一篇文章中,我们讨论了标准 HL7v2 的起源、结构和消息类型。现在让我们看一下最常用的消息类型之一及其结构示例。我说的是 ADT。

HL7 ADT 消息(入院、出院、转院)用于在医疗机构传达基本患者信息、就诊信息和患者状态。 ADT 消息是使用最广泛且容量最大的 HL7 消息类型之一,因为它为许多触发事件提供信息,包括患者入院、注册、取消、更新、出院、患者数据合并等。

0
0 1215
文章 Michael Lei · 十二月 27, 2022 2m read

一个简单的生产配置,使 FHIR 交易捆绑包能够通过 Box 和 Dropbox 加载到 InterSystems® FHIR® 服务器中。使用包含的 MFT 连接组件和 14 行自定义业务流程,此生产配置会将您的交易捆绑包处理到 FHIR 资源,以便立即使用,就像哈利·波特的魔法一样。

我首先会展示该生产配置的短视频导览、MFT 连接以及 IRIS 上 Box 和 Dropbox 的 Oauth2 应用配置,接下来循序渐进地展示一些步骤,让您使用您喜欢的任何 MFT 供应商以及您选择的任何工作流程、桌面、API 或 Web 控制台拖放操作。

一些陷阱:

  • OAUTH2 回调需要使用 IRIS 的 SSL 端点来提供重定向… 最好在 Health Connect Cloud 上尝试一下!
  • Dropbox for Business 在基于团队的令牌方面面临挑战,个人 Dropbox 则运行良好。 这不是无法忍受的情形,但需要一些耐心。
  • 配置 MFT 连接时,注意 Dropbox 的 baseurl 上的“/”(确保它存在)。
  • 对于 Box 和 DropBox 的路径,MFT 出站适配器都需要具有结尾“/”。

现在,鉴于以上获奖的 OBS 支持的内容可能有不足之处,如果 InterSytems 文档还不够,下面是需要遵循的步骤。

步骤概览:

0
0 187
文章 Michael Lei · 十二月 7, 2022 11m read

Intersystems IRIS for Health 对 FHIR 行业标准提供了出色的支持。主要特点是:
1.FHIR 服务器
2. FHIR数据库
3. REST 和 ObjectScript API 用于 FHIR 资源(患者、问卷、疫苗等)的 CRUD 操作

本文演示了如何使用这些功能,并展示了用于创建和查看表单类型的 FHIR 资源的Angula前端。

第 1 步 - 使用 InterSystems IRIS for Health 部署您的 FHIR 服务器

要创建 FHIR 服务器,您必须将以下说明添加到 iris.script 文件中(来自:https://openexchange.intersystems.com/package/iris-fhir-template

0
0 156
文章 Qiao Peng · 十二月 2, 2022 9m read

1.数据的价值 

数据的核心价值是帮助我们决策。 

我们无时无刻不在决策,大到战略决策——为一家新医院选址,还有战术决策——鉴别产品的目标市场或抵押贷款审批,更频繁的是操作决策——决定患者的手术方案或患者药物的调整。

这些决策要求不同的决策速度,传统的数据中心已经能较好地帮助我们做战略决策、战术决策,甚至一些操作决策。但新的业务需求要求我们的决策速度越来越快,甚至借助机器学习自动为我们做出即时的决策,例如批准还是拒绝一笔信用卡交易或基于算法自动交易。 

无论是人工决策还是基于机器学习的自动决策,决策的依据是数据。数据的速度和质量决定了决策的速度和质量。要支持决策,需要数据具有如下特征: 

(1)完整 :关联且具有完整上下文; 

(2)干净 :数据质量没有问题; 

(3)及时 :在决策点上没有延迟。 

传统数据中心很难在及时性上满足要求。 

2.数据挑战

数字化浪潮下,我们面临更大的数据挑战: 

  • 数据规模:数据量已经完全超出了人工处理能力。 
  • 数据源多样性:数据源不再仅是数据库,流式引擎的消息、物联网、对象存储......它们还带来了越来越多模型种类的数据。
  • 更多的数据孤岛:更多的系统和应用被建设,进一步增加了数据孤岛现象。 
  • 跨部门的数据不一致:统计口径和统计时间的差异,造成财务部门统计的数据,总是和业务部门统计的数据对不上。 
0
0 219
文章 Weiwei Gu · 十二月 1, 2022 3m read

InterSystems 是一家已经深耕数据库平台领域达44年的公司,成立于1978年,现在已经在全球的80多个国家开展相关业务,每天有超过10亿患者的电子病历数据都跑在以我们的数据库平台构建的应用系统之上。

我们的客户遍布国内外,国内的大几百家三甲医院客户,中国复旦排行榜上超过1/3的顶级医院都在使用我们产品(包括北京协和医院,华西医院,湘雅等等),我们的技术合作伙伴,如东华医为,嘉和,和仁等也都是国内医疗信息领域的著名厂商。

   而在国外,我们也有非常多的顶级客户,仅仅以美国举例,美国最顶级的排名前20的所有医院,无一例外全部都是使用的interSystems公司的数据库平台产品。

 美国排名前20的所有顶级医院

2020-2021《美国新闻与世界报道》(U.S. News & World Report)最顶级医院名单(前20家医疗机构)均应用InterSystems公司的数据库平台:

0
0 471
公告 Claire Zheng · 十一月 30, 2022

2022 年 12 月 1 日,中国,北京——致力于帮助客户解决最关键的可扩展性、互操作性和速度问题的创新数据技术提供商 InterSystems 今天宣布,在Forrester日前公布的《The Forrester Wave™:事务分析型数据平台(2022年第4季度)》报告中,InterSystems IRIS® 数据平台被评为领导者。

0
0 147
文章 Lilian Huang · 十一月 30, 2022 5m read

HL7(Health Level 7)是一套技术规范,用于医院信息系统(HIS)之间临床、财务和管理数据的计算机互交换。这些规范被不同程度地被纳入美国(ANSI)和国际(ISO)正式标准的语料库中。

HL7的L7表示它是在OSI模型的第7层,换句话说,在应用层运行的标准。这意味着HL7不需要考虑交换的安全性,也不需要考虑信息传输的安全性(这一点由较低层次的层来保证,例如用于安全的SSL/TLS或用于数据传输的TCP)。更准确地说,第7层支持终端用户进程和应用的通信,以及面向用户的软件应用的数据展示。作为OSI模型的最高层,也是最接近最终用户的层,第7层提供特定的应用功能,如识别通信伙伴和它们之间的服务质量,确定资源可用性,考虑隐私和用户认证,以及同步通信,并将应用与OSI模型的较低层连接起来。

回到HL7标准,HL7第二版标准(也称为Pipehat)最初创建于1989年,但目前仍在使用并定期更新,形成了2.1、2.2、2.3、2.3.1、2.4、2.5、2.5.1、2.6、2.7、2.7.1、2.8、2.8.1、2.8.2和2.9版本。v2.x标准是向后兼容的(例如,基于2.3版本的信息将被支持2.6版本的应用程序所理解),在更高的版本中,你会看到一些字段是专门为它而留的。

0
1 931
文章 Michael Lei · 十一月 2, 2022 1m read

门为医疗行业打造,深度整合国内外医疗行业标准,专有技术服务医疗行业44年,可能是全球最早从事医疗信息化的公司;

耕细做打磨数十年的稳定、可靠、易用、可扩展的数据平台;

色鲜明,不唯技术、终生负责、以解决客户问题为核心的特色企业文化;

一代混合一体化架构,一个平台同时支持混合事务处理、传统架构、容器化、云原生等多种应用场景;

0
0 80