吵吵   2017-12-03  阅读:2,104

从罗氏的IT3000前处理开始,罗氏的生化免疫分析仪就逐渐向流水线开始靠拢。

无一例外,各个厂家的仪器到了流水线这个层次,传统的LIS双线的接口逐渐被抛弃,取而代之的都是文本类型的数据交互,比如Sysmex的血球和尿液分析仪,比如梅里埃的细菌鉴定一整条流水线。

为什么会变成文本的交互的交互了?因为厂家都做了一个中间的管理系统,有人把它叫做中间件,小型的实验室就可以直接用他们的中间件当作LIS来用,用它来直接发报告。

罗氏的流水线也是这个情况,不过人家中间交互的不是中间件,而是Infinity。因此,LIS与仪器的直接连接模式,就变成了LIS-Infinity-仪器这样的间接模式了。

一、Infinity的连接协议。

Infinity采用HL7协议,交互的模式属于文本类型,服务器共享出文件夹,LIS接口直接通过共享去访问它的文件夹,上传和下载hl7文件。

共享出来的几个文件夹包括:

Orders:这个文件夹是LIS向仪器下单的文件夹,LIS将要做的标本信息整合成HL7格式的文件,然后写入这个文件夹,服务器每隔一段时间进行读取。

Seens:这个是Infinity生成的文件,包括标本上机时候生成的信息,包括返回的架子号信息,包括标本归档的信息。

Results:这个不用说了,是结果了,LIS接口不断去刷新这个文件夹,有文件了就解析,把文件结果回传。

Picture:图片文件夹,当标本在前处理上机的时候,前处理会拍一张标本的图片,用于分析血清是否够。这张图片如果发送到LIS里面,我们可以在报告审核的时候看到标本的质量,比如溶血,脂血等等。

order的格式:

[VT]MSH|^~\&|JWYH-HIS|LIS_Interface|IT3000|IT3000-Receive|20171202190722||OML^O21|X13803848-20171202190722575875|P|2.3|||NE|NE||8859/1
PID|1||000352588||^xxx|||M
ORC|NW|111711013971|517-xxx||||RI||20171203030700
OBR||111711013971||ALB|||20171203030722||||A
OBR||111711013971||ALT|||20171203030722||||A
OBR||111711013971||AST|||20171203030722||||A
OBR||111711013971||CL|||20171203030722||||A
OBR||111711013971||DBIL|||20171203030722||||A
OBR||111711013971||GLU|||20171203030722||||A
OBR||111711013971||K|||20171203030722||||A
OBR||111711013971||NA|||20171203030722||||A
OBR||111711013971||TBIL|||20171203030722||||A
OBR||111711013971||TP|||20171203030722||||A
[FS]

里面的信息包括病人姓名、生日、性别、ID号等等的病人信息,OBR段即是要做的项目,其中的时间戳在各个字段中都要相同。

Seen的格式:

MSH|^~\&|LIS||HOST||20171203070722||ACK^^ACK|2017120307072282905|P|2.5|||NE|NE
EQU||^^^RSA1^^SAMPLEEVENT^SEEN|20171203070722
SAC|||121708046301|121708046301||20171203070710861089|01||P|RSA1|0@0

这个代表条码号121708046301的标本上机扫描了。

Result格式:

质控:

MSH|^~\&|LIS|Roche Diagnostics|HOST||20171203094151||ORU^R01^ORU_R01|Q|P|2.3|||NE|NE||8859/1
PID|1
ORC|Multi1^144514^572-Cobas C8000-2-c502-2-1-R1-CREA|Multi1|||IP||^^^^^^R
OBR|1|Multi1||||||||||||1^^^^^^Q|||||C8K_75.c502-2-1|||||||^^^^^R
OBX|1||CREA||91.00^3|µmol/L|||||F|||20171203092952|^^^C8K_75|QC||C8K_75|201712031934|1

标本结果

MSH|^~\&|LIS||HOST||20171203074127||ORU^R01^ORU_R01|20171203074127494456|P|2.5|||AL|ER
PID|1||000354708||^XXX|||F
PV1|1|U|||||||||||||||||^^^S
ORC|SC|121708041272|||CM||||20171203064700
OBR|1|121708041272|||||50122||||||||||||||||||F
OBX|1|NM|PROCT^PROCT 降钙素原||0.092||||||F|||20171203072016|572.3^e602-1-2@50122|~SYSValDaemon~^System
OBX|2|NM|PRO_BNP^PROBNP 前脑利尿肽||2949.000||||||F|||20171203071955|572.3^e602-1-1@50122|~SYSValDaemon~^System

质控和标本的结果在MSH段用P和Q进行区分。

Pictrue格式:

JPG的图片格式,图片的文件名为121708041272_01.jpg,即代表121708041272条码号标本上机第01次时候拍的图片。

好了,知道了上述的各种格式,我们就可以开始做接口了,真正做的时候,才发现很多蛋疼的问题,比原来一个简单的双线接口麻烦多了!

二、双向变单向。

一个正常的双向LIS接口通讯模式是:标本上机时,仪器扫描到条码,将条码信息发送给LIS,LIS通过条码找到要做的项目发送给仪器,仪器开始工作;结果出来后,仪器直接将给过发送回LIS。

好了,现在中间多了一个Infinity,Infinity在国外的实验室应用广泛,远高于普通设备中间件的地位,在国外很多实验室都是当LIS来用。于是问题来了,Infinity和设备之间的通讯还是双向,但是Infinity和LIS之间的通讯就变成单向了。

前文说的往Orders文件夹下单,需要LIS主动去做,Infinity不会发出一个请求项目的query。这大概有两个原因,一是时间可能来不及,二是可能人家认为它就是LIS系统,只提供与第三方系统之间的接口。

因此LIS就要考虑怎么来主动激活给它下单了,总要选个时间给它下单,要么在标本接收的时候,要么在排样的时候,这个时候记录下来标本的条码和其它基本信息,然后LIS接口去不断去刷新新接收到或者排样的标本,然后主动把要做的标本信息写入Orders文件夹。

由于上传标本信息时间和真正上机时间有间隔,这中间标本做了其它操作,Infinity就不知道,这就带来了一系列的问题。

三、标本回退、取消排样、复查的问题。

当我排样的时候把Order发送给了Infinity,这个时候我取消排样或者标本回退了,上机的话,由于原来发送给Infinity的信息还在,标本会照样继续检测。

解决这个问题的办法需要修改LIS程序,当LIS在做取消排样或者回退的时候,把Cancle的消息发给Infinity。

复查也是同样的解决方法,修改LIS程序,点击复查的时候,再给Infinity下一次单。

四、流水线与其它仪器、多个台流水线数据交互问题。

有一天我们一台免疫流水线坏了,于是把标本转移到我们科其他实验室做,这些标本都是做了一两个项目的,由于转过去做的实验室仪器是双向的,因此做过的项目就不会再做了。过两个小时,流水线修好了,于是把这些标本都拿回来上机,等上完机去看的时候,懵了,在其它实验室已经做出来的项目,又全部都做了一遍。

化学发光法做的HCG、BNP啊这些项目,浪费的试剂真的是令人心疼!

为了解决其它仪器做完了的结果再上流水线不会重复做,只好修改其它仪器的接口,在其它仪器把结果回传到LIS的时候,LIS把结果信息再发一份到Infinity。

再后来,我们有了两条流水线!这下问题就更大了。

1、一个标本两边各做一半的项目怎么搞?

2、一边已经做过的项目,上到另外一台流水线上,怎么避免不会重复的做?

于是就又找出了两种解决方案:

1、多台流水线共用一个Infinity。

2、多个流水线共用一个LIS接口。

围绕这两种方案罗氏和LIS厂商进行了长久的争辩,最终LIS开发败了,谁让人家外企牛逼,不会轻易改动的。

采用第一种方案LIS接口就省事了,只需要与一个Infinity做接口。但是问题也很多:

1、网络的问题。两边得在同一个可以访问,而且连接稳定的局域网。

2、一旦Infinity挂了,两边都不能用了。Infinity采用cache数据开发,某天晚上我们发现它挂了,原来它备份数据的时候出问题了,直接宕机了两个多小时。

3、如果两边项目有交叉而分管、归档等的规则又都不同,那就会有冲突。

那么就做第二种方案吧,采用同一个LIS接口:

1、把两边都做的项目通道号配置成一样。

2、LIS在发送Order的时候,往两边的Orders文件夹都写入一次。这样确保所有的标本信息两边都有,拿到哪里上机都可以。

3、其中一台流水线出了结果,LIS接口负责转发到另外一台流水线。

一开始我猜想Infinity大概比较智能,我直接把一个生成的结果文件拷贝到另外一个的Order文件夹行不行?答案是它很蠢,不行,要用专用的结果转发格式。

ok,那我把它生成的结果文件改一改,改成结果转发的格式行不行?也不行,因为要与前面下单发送的病人信息一致,而结果文件里面是没有病人信息的。

你赢了,我还是重新生成Order文件吧,通过条码号找出病人信息,再把收到的结果写进去,然后转发给另外一个Infinity:

[VT]MSH|^~\&|JWYH-HIS|LIS_Interface|IT3000|IT3000-Receive|20171202162015||R|X13803807-20171202162015253261|P|2.3|||NE|NE||8859/1
PID|1||000138745||^XXX|||M
ORC|NW|121708088730|185-XXX||||S||20171202162015
OBR||121708088730||PROCT|||||||A
OBX|1|NM|PROCT||0.277||||||F|||20171202162015|
[FS]

以上是转发结果的格式,MSH中的R代表结果转发。

4、涉及到手工编号或者质控的问题,只能把所有的仪器都给上一个唯一的标识,在结果文件里面标注清楚,LIS在把结果写到LIS系统的时候,分别写入不同的仪器里面去。

五、真的不能够做成双向么?

有天我盯着前处理看了很久,这玩意明明有扫描条码,为什么就不能发个Query请求呢?而且从扫描条码到最后进标本架中间有那么长的距离,足够LIS把项目发给它的时间了。

我问罗氏的工程师,它扫描的时候不会发Query么?他说不会,但是有消息,那个叫做Seens文件夹里面的就是扫描上机时候发的消息。我突然眼光放亮,大中午的,不睡觉,我找罗氏的工程师做了个实验。找了个那天刚好前处理没有识别的标本(因为该标本原本不在这里做!),再上一次机,Infinity生成了Seen的消息了,我通过这个消息组成Order下单,等标本跑到标本架那边的时候,项目识别了,标本进去了!!!

谁说不能双向的!这不明明可以双向么?于是我屁颠屁颠的写好了双向的程序,准备再次测试!

上个新标本,咦?没有Seen消息,再上个新标本,还是没有Seen消息!再上一次呢?有了,坑爹啊,第二次上机才发Seen消息!总不能我所有标本都上两遍吧!

后来我想了想,以前没有识别到项目的标本直接两盖子都不拔就跑到后面去了,而扫描条码离拔盖的区域又很短,大概真的来不及吧!

还是放弃双向了。

也许哪天可以研究一下,既然Infinity有时间和前处理通讯,那么如果直接在Infinity中加个Hook,然后把请求转移到LIS,那是否就可以实现双向了?至少前处理的双向。当然,以外国佬这德行,底层咋会开放给你们呢?

六、图片传输的问题。

连续几天发现Infinity的Picture文件夹并没有生成JPG图片,而且每次都是凌晨就不行了,于是乎问了下罗氏的工程师。说原来是不提供图片的,后来他们上海的一个工程师自己写了个程序,从前处理通过FTP的模式模式把图片取到Infinity的服务器上去。但是这个程序有个bug,服务莫名奇妙的就会断了。

考虑到每天凌晨就段,估计还是windows任务计划还是啥的没做好。

但是没有关系,我还是改LIS接口吧,直接从前处理上取图片,不通过Infinity了。

c#的话用FtpWebRequest来访问FTP服务器,获取文件列表,下载文件,删除文件都很方便,这个类在using window.Net命名空间下,再把它加入到线程里面隔一秒就去取一下,嗯,图片问题搞定。

七、改进仪器显示样本号。

Cobas系列的仪器电脑,大多数只是现实一个条码号,如果标本凝了,只能看到条码号,我们要通过条码号找到样本号再去找标本很不方便。

采用Infinity后,罗氏帮忙把姓名显示在了仪器连接电脑的Comment列,既然你能显示这个,那不如找另外一个不用的字段,LIS接口发送Order的时候往这个字段写入样本号+姓名,仪器电脑显示出来。

之后找标本明显方便多了。

八、人工双向。

把这些问题都解决了之后,你大概认为这个接口总算是做完了吧?

你呀,还是太年轻!

过几天,又有标本项目不识别了!咋地呢?原来是几个手工编进LIS系统的标本,没走接收排样流程了。还有几个是更换条码,Order发送到了另外一台更老的IT3000上面的!

再改LIS大概所有的LIS流程都要改一遍了,LIS都要玩残了!

没有双向是吧,我写了一个程序,然后在前处理旁边放个电脑和扫描头,识别不了的标本都在这个扫描一下,然后再上机。

嗯,最终我实现了双向,只不过是人工的。

附C#开发的接口图:

注:文中涉及到姓名地方用XXX表示。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

发表评论

电子邮件地址不会被公开。 必填项已用*标注