吵吵   2019-04-04  阅读:4,887

现在大家都在讲信息系统的智能化、自动化,说到LIS系统,最火的就是自动审核。

于是我们定义一套自动审核的规则,包括数值的比较、差值检查、逻辑关系与关联性分析等等。

具体到系统里面就设计了一张表,昨边是项目代码,右边就是值的上限、下限等等信息,然后对照着一个个项目自己去设置。

这样的系统并不智能。

比如某天我们想设置一个规则,肾病中心的把肌酐范围上限提高到200,面对这个问题,要么你在表中再加一个科室的字段,但是这意味着非这个科室的其它所有科室你还要再建立一条规则,那就多了很多的重复设置内容,把自己忙死;要么你让程序员帮帮忙,直接就在系统里面写死,但可扩充性就下降,下次再有其它的问题怎么办?

是时候建立一套可用的系统,来让检验工作人员和开发人员都能好好工作,愉快工作了。

于是我们参考平常文献查询系统建立了一套逻辑判断和普通运算的简单语言,让检验工作人员实现简单的编码和逻辑控制能力。

1、建立标签模板,把常用的一些函数用标签模板来定义,这样就可以取出来我们常用的一些内容,如果结果、历史结果、诊断等等。标签模板用$字符开头,用{}来包含要传入的参数,具体定义如下

$Result{code} 返回项目代码为code的结果值
$ResultExist{code} 判断代码为code的项目是否存在”$True” “$False”
$Result2{code} 返回项目代码为code的结果2值
$Result2Exist{code} 判断代码为code的项目2是否存在”$True” “$False”
$HistoryResult{code,day} 返回项目代码为code,day天内的历史结果值
$HistoryResultExist{code,day}是否存在”$True” “$False”
$DepartmentCode{} 返回科室代码
$DepartmentName{} 返回科室名称
$Sex 返回性别 “男” “女” “其它”
$Age{type} 返回type为“年、月、日” 的年龄
$Diagnosis 返回诊断
$SerumQuality 返回血清质量

$UserDefine{arg} 用户自定义返回的标签

2、建立加减乘除等等常用的计算,并且用()来区分计算优先程度,这样就基本能够实现差值、比值等等计算了,括号内或者没有括号的从左到右运算。
+ 加法
– 减法
* 乘法
/ 除法

>= 大于等于
<= 小于等于 > 大于
< 小于 = 等于 ! 不等于 # 包含 3、考虑到条件有多个,因此我们还需要建立逻辑运算,把这些条件串联起来,用逻辑AND OR来串联这些条件,用[]来区分计算优先程度,同样没有[]或者中括号内的从左到右计算。 好了,建立这样一套系统后,我们测试这样一条规则:AST/ALT>1,并且球蛋白加白蛋白大于总蛋白,并且年龄大于11岁:

s cls=##class(lab.RuleParser).%New()
s error=””
s condition=”$ResultExist{99} = $False”
s content=”[($Result{AST}/$Result{ALT})>1] AND [($Result{G}+$Result{ALB})>$Result{TP}] AND [$Age{年} >11]”
w cls.Excute(content,condition,.error)
w error

这样就能够输出这条规则是否通过与不通过了。

我们希望建立这样一套语言表达方式能够实现LIS规则的通用化表达,而且和各厂家的LIS无关。

这样一个规则系统,不仅用来做自动审核,也可以用来做智能提示,比如WBC>20的进行提示,或者直接强制不能审核通过。

最后讲讲编程思路,核心就是用递归函数不断计算括号内的内容,逐级进行合并,最后输出True or False。

//返回0:false不通过 1:true通过 2:condition false条件不满足 3:项目不存在 4:标签模板函数不存在 5:语法错误 6:其它错误

Method Excute(pContent As %String, pCondition As %String = “”, Output pError As %String) As %Integer

建立好了语法分析器后,重载上面的标签函数和LIS匹配,最后就是建立Rule的数据表,把这些规则记录下来了。

一个智能的、强大的规则判断系统就实现了。

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

吵吵 吵吵

2条回应:“自动审核与智能提示规则系统设计”

  1. 1说道:

    在新版的东华系统里面早就实现了你所说的功能,而且界面很友好。

发表评论

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