jxTMS使用示例--降低合规性检查时的规则复杂度

110 篇文章 0 订阅
44 篇文章 0 订阅

使用本示例需通过docker容器,请先下拉jxTMS的docker镜像并按说明启动tms容器,并从helloWorld开始尝试。

降低合规性检查时的规则复杂度

大家应该理解什么是业务规则了:其实就是对业务当前状态的判断条件与处置逻辑,等价于开发人员的直接编程。只不过我们用容易理解的、经过可靠实现的机制将其实现为业务人员容易理解与编写的文本。

但业务不可能都是我们上一节中这么简单的,对于复杂业务则其状态判断与处置也自然会复杂起来,那么由业务人员来编写复杂的规则检测逻辑,可能就超出了业务人员的能力范围。

所以在上一节介绍合规性保证时,笔者说的是:让业务人员在开发者配合下自行编写业务规则。即业务人员和业务系统的开发人员是相互分工配合的,在业务规则的编写上就体现为将复杂的单点逻辑交给更专业的开发人员来实现,以简化业务人员编写业务规则的难度。

为了实现这个双方配合下降低业务规则的编写难度,jxTMS在业务规则中引入了调用函数的能力。这样一来,就可以把复杂的单点逻辑抽离由开发人员编程,然后业务人员直接在规则调用就实现了规则编写的简化。

大家是否还记得我们前面用excel导入过销售折扣权限,如果我们的业务规则是销售订单审批时查验申请人的权限,如果超权限则标红。我们现在就演示如何实现这个稍有点复杂的业务规则。

相关界面、入口等都是常规性的,所以我们就不再制作了,就利用之前的成果,主要是模拟一下,让大家知道该如何实现在业务规则中使用权限类似的功能。

还是老样子,我们先看效果再来讲解。

修改业务规则

在capa.py文件中修改demoRule规则表为:

@myModule.rule('demoRule')
def demoRule():
	'''
	/* 根据输入的名称,获取产品品类名,然后保存到临时存储区中的productName变量中 */
	如果 true 则 cache.productName = getProductName (input.demoName) ;
	/* 根据品类名获取权限值,并和预设门限进行比较,做出动作 */
	如果 getRight(cache.productName,'user1') >50 则 outAttr.demoName.boder = '红',local.disp = '超出权限' 否则 outAttr.demoName.boder = '绿',local.disp = '授权许可',result.productName = cache.productName  ;
	'''
	pass

然后增加两个函数:

@myModule.request('dataGet', 'restrict','getRight')
def getRight(self, db, ctx,productName,peopleName):
	return ctx.getAuthorizeValue(db,peopleName,'discount',productName)

@myModule.request('dataGet', 'restrict','getProductName')
def getProductName(self, db, ctx,dn):
	if dn == 'p1':
		return '洗眼器'.decode('utf-8')
	if dn == 'p2':
		return '安全存储系列'.decode('utf-8')

我们还是先看效果,然后再来讲解。将capa.py等文件按用sftp管理jxTMS的代码所述更新到/home/tms/codeDefine/demo/demo/demo1目录中。

然后执行一次热机刷新后,然后点击快捷栏中的【演示->发起申请】,然后在名称栏中填入p1,然后点击工具条中的【用规则表检测】;然后在名称栏中填入p2,然后点击工具条中的【用规则表检测】。比较一下两次有什么区别。

新的demoRule规则表包含了两条规则,第一条:

如果 true 则 cache.productName = getProductName (input.demoName) ;

条件直接写了就是true,也就是说,条件永远成立,所以这句话的意思就是明确要求一定要执行则分支中的语句。既然一定要执行,那我们也可以直接将条件省略掉:

cache.productName = getProductName (input.demoName) ;

这个语句的意思非常简单,就是调用运行规则表的功能模块中的getProductName函数,而这个函数有一个参数:来自demoName的输入。需要在规则中执行的取值函数和流程的节点处理函数一样,被request修饰一下:

@myModule.request('dataGet', 'restrict','函数名')
def 函数名(self, db, ctx,参数1,参数2......):
	#函数执行语句

request修饰的函数除self、db、ctx之外又指定了几个参数,在规则中调用时,就必须送入几个参数。如,getProductName额外定义了dn一个参数,则规则中就送入了一个值;getRight函数额外定义了两个参数,则规则中就送入了两个值。

getProductName函数取到的值被放入到了cache.productName中,上一节说过,cache是本次运行中的临时变量区,即取出的产品品类名,被放入临时变量区暂存。

第二条规则:

如果 getRight(cache.productName,'user1') >50 则 outAttr.demoName.boder = '红',local.disp = '超出权限' 否则 outAttr.demoName.boder = '绿',local.disp = '授权许可',result.productName = cache.productName  ;

条件成立的则分支以及不成立时的否则分支,上一节都说过了,所以我们重点讲下其条件部分:

getRight(cache.productName,'user1') >50

即将cache.productName中暂存的值和一个user1的字符串,作为参数来调用getRight函数,getRight函数返回的折扣值和门限50进行比较,看是否超出权限。

大家看到这两条规则中,cache.productName作为一个中转器,在两条规则之间进行了数据交换,这就是cache的主要作用,甚至是唯一作用,因为一旦规则表执行完毕,cache即会被清除,其中所有的临时变量都将被丢弃。

结语

因为表达式都是静态的,处理能力有限,所以jxTMS引入了动态的、处理能力近乎无限的函数,以便于在复杂业务的处理时,由开发人员来降低业务人员编写业务规则的难度。

注:大家要不要试一下中文函数名,即把规则中的函数名修改为中文,来试一下吧:

  • 把三个getRight其中的两个改为【获取折扣权限】

  • 把三个getProductName其中的两个改为【获取品类品】

哪一个不用改呢?当然是具体的函数名。好,看下我改好的:

@myModule.rule('testDemoRule')
def testDemoRule():
	'''
	/* 根据输入的名称,获取产品品类名,然后保存到临时存储区中的productName变量中 */
	如果 true 则 cache.品类品 = 获取品类品 (input.demoName) ;
	/* 根据品类名获取权限值,并和预设门限进行比较,做出动作 */
	如果 获取折扣权限(cache.品类品,'user1') >50 则 outAttr.demoName.boder = '红',local.disp = '超出权限' 否则 outAttr.demoName.boder = '绿',local.disp = '授权许可',result.品类品 = cache.productName  ;
	'''
	pass

@myModule.request('dataGet', 'restrict','获取折扣权限'.decode('utf-8'))
def getRight(self, db, ctx,productName,peopleName):
	return ctx.getAuthorizeValue(db,peopleName,'discount',productName)

@myModule.request('dataGet', 'restrict','获取品类品'.decode('utf-8'))
def getProductName(self, db, ctx,dn):
	if dn == 'p1':
		return '洗眼器'.decode('utf-8')
	if dn == 'p2':
		return '安全存储系列'.decode('utf-8')

注1:别忘了:出现在python代码中的中文字符串要执行decode(‘utf-8’)来正确转码!

注2:规则文本中的中文不需要转码,因为这些规则是jxTMS通过__doc__直接读取,在读到后jxTMS已经对其进行了转码。而request(‘dataGet’, ‘restrict’,‘获取折扣权限’.decode(‘utf-8’))这样作为request函数的参数的中文字符串,是被python所加载,然后传入java中的,而python和java两者的字符集是不同的,所以需要用decode(‘utf-8’)进行转码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值