4.3 业务规则
4.3.1 名词解释
4.3.1.1 什么是业务规则
业务(操作)规则是一个声明式的、由自然语言(BAL)编写的“IF-THEN”语句。它利用在业务对象模型 (BOM) 中预定义的业务术语、运算符和值来构建条件。当该条件在运行时被评估为 true 时,系统将自动执行其动作部分,从而自动化地实施业务策略。

例如,您可以在规则设计器中,创建一个简易操作规则 :
如果
'员工信息' 的 age 大于等于 18
那么
打印 "我成年了";
设置 '我的消息' 为 "我成年了";
一个完整语句的操作规则是由definitions、if、then 和 else这四个部分组成,如下所示:
预定义
指定 'variable1' 为 一个 员工 来自(in) '部门信息' 的 员工集合;
如果
'variable1' 的 age 大于等于 18
那么
打印 "我成年了";
否则
打印 "我未成年!";
预定义 (definitions)
使用 definitions 部分来定义规则的变量,definitions 部分是可选的。
条件 (if)
使用 if 部分来指定用于执行 then 和 else 部分中的操作的条件。 在此示例中,条件为 'variable1' 的 age 大于等于 18。if 部分是可选的。 没有条件的规则将在所有情况下执行其操作。
操作 (then)
使用 then 部分来定义在 if 部分为 true 时要执行的一个或多个操作。 如果 if 部件为 true ,那么示例中的操作将向 打印 "我成年了" 显示,then 部分是必需的。 规则必须至少具有一个操作。
备用操作 (else)
使用 else 部分来定义在 if 部分为 false 时要执行的一个或多个操作。 else 部分表明在 if 部分为 false 时将 打印 "我未成年!",else 部分是可选的。 如果规则的 if 部分为 false,并且没有 else 部分,那么该规则将不执行操作。
4.3.1.2 常见的运算符
运算符 (Operators) 是 用于构建条件表达式和操作语句,在条件表达式中直接使用运算符,在操作(动作)语句中进行设置和值运算等。
| 类别 | 操作符 / 符号 | 用途说明 |
|---|---|---|
| 算术运算 | + |
数值相加;字符串拼接(需类型匹配) |
- |
数值相减 | |
* |
数值相乘 | |
/ |
数值相除 | |
% |
取模(余数) | |
| 比较运算 | == |
判断相等 |
!= |
判断不等 | |
< |
小于 | |
<= |
小于等于 | |
> |
大于 | |
>= |
大于等于 | |
| 逻辑运算 | && |
逻辑“与”,所有条件必须为真 |
![]() |
逻辑“或”,一个条件为真 | |
!或 not |
逻辑“非”,取反 | |
| 集合成员判断 | in |
判断某值是否属于给定集合 |
!in或 not in |
判断某值是否不属于给定集合 |
4.3.1.3 什么是术语
定义:术语是来自 BOM (Business Object Model) 的预定义元素。它们是规则中使用的基本词汇单元,代表了业务领域的实体、属性、方法和值。
(1)它具有如下特点:
- 预定义:必须在 BOM 编辑器中先定义好。
- 强类型:每个术语都有明确的数据类型。
- 上下文感知:在规则编辑器中输入时会有代码补全提示。
(2)它具有如下类型:
| 类型 | 来源 | 说明 |
|---|---|---|
| 类 (Class) | BOM | 业务对象的类型。 |
| 属性 (Attribute) | BOM 类 | 对象的特征或状态。 |
| 方法 (Method) | BOM 类 | 对象可以执行的操作或行为。 |
| 枚举值 (Enumeration Values) | BOM 域 (Domain) | 属性的预定义取值。 |
| 静态字段/常量 | XOM Java 类 | 在 Java XOM 中定义的 public static final 字段。 |
4.3.1.4 什么是短语
定义:短语是由 UDM 语言的关键字、运算符和术语 组合而成的语法结构。它们遵循特定的模式,用于表达完整的逻辑意图,让规则读起来像自然语言。核心短语结构与示例如下所示:
| 短语类型 | 关键词/结构 | 功能 |
|---|---|---|
| 条件-动作框架 | if ... then ... else ... end if |
规则的基本结构。 |
| 对象导航 | the <object>'s <attribute> |
访问关联对象的属性。 |
| 集合操作 | there exists a(n) <element> in <collection> such that <condition> |
检查集合中是否存在满足条件的元素。 |
![]() |
检查集合中所有元素是否都满足条件。 | |
the sum/min/max/average of <collection>'s <attribute> |
对集合进行聚合计算。 | |
| 赋值操作 | set the <attribute> to <value> |
修改事实的状态。 |
| 调用方法 | call <method call> |
执行一个操作。 |
简单来说:您用“术语”来命名事物,用“短语”来描述这些事物之间的关系和要执行的动作。
4.3.2 规则预定义部分
在规则的 definitions 部分中定义变量,并且只能在声明变量的规则的条件和操作部分中使用该变量,规则变量通过简化术语使操作规则更易于构建和理解。
变量的作用域是用于声明该变量的规则,变量的名称在规则中必须唯一。 定义变量后,可以在规则的任何部分中使用该变量
使规则更易于理解
您可能会发现规则的某些部分难以理解,可使用规则变量来缩短此字词链。
预定义
指定 'variable1' 为 '员工信息';
指定 'variable2' 为 {"abcdef"};
指定 'variable3' 为 "abcdef" ;
那么
打印 "abc";
规则变量的类型
规则变量可以表示常量、表达式、业务术语或业务术语集合,通过为规则变量指定名称和值来定义规则变量。 选择名称,值可以是文本、数字或算术表达式。 一旦设置了变量,就可以在声明该变量的规则的任何部分中使用该变量。
规则变量的最简单用法是声明常量值。例如,变量 variable2 使以下规则更易于理解:
预定义
指定 'variable1' 为 一个 数字 来自(from) 1;
指定 'variable2' 为 一个 字符串 来自(from) "abc";
指定 'variable3' 为 一个 对象 来自(from) '员工信息';
指定 'variable4' 为 所有 字符串 来自(from) {"a","b","c"};
如果
'variable1' 大于等于 18 或者 "aa" 是 'variable4' 中的一个 或者 "2" 不是 'variable4' 中的一个
那么
设置 '我的消息' 为 "abc";
否则
打印 'variable4' 中的元素数量 ;
规则变量的限制条件
您可以使用运算符 where 在规则的 definitions 部分中进一步限制变量。在以下规则示例中,符合条件 将筛选出 我的部门 变量的负责人限制为 张三 的员工子集:
预定义
指定 '员工变量' 为 一个 员工 来自(in) '我的部门' 的 员工集合 符合条件: '我的部门' 的部门负责人 是 "张三";
如果
'员工变量' 的 age 大于等于 18
那么
打印 "成立";
否则
打印 "不成立!";
4.3.3 规则条件部分
在规则的 if 部分中定义条件。 规则条件用于测试业务术语,并生成答案 true 或 false。
4.3.3.1 用于比较业务术语和值的条件
您可以构建条件来比较和处理数字值和布尔(true 或 false)值、日期、业务术语和文本字符串。
字符串比较
- 以...开始
您可以使用文本运算符 以...开始 来确定文本字符串是否以特定字符序列开头:
如果
'员工信息' 的 name 以 "韩" 开始
那么
打印 1 ;
- 字符串包含
预定义
指定 'variable1' 为 "abc" ;
如果
'员工信息' 的 name 包含 "a" 或者 'variable1' 包含 "a"
那么
打印 1;
否则
打印 2;
数值比较
可以使用数字运算符 大于 大于等于 等于 小于 小于等于来比较两个数字值的关系。
如果
'员工信息' 的 age 大于等于 18 小于 100
那么
打印 "我成年了";
否则
打印 "我未成年!!!";
数值四则混合运算
预定义
指定 'variable1' 为 一个 数字 来自(from) 123456789;
指定 'variable2' 为 一个 数字 来自(from) 0;
指定 'variable3' 为 一个 数字 来自(from) 100;
那么
设置 'variable2' 为 ('variable1' + '基数' );
打印 'variable2';
打印 'variable2' + 123;
打印 '一个18位数' + 1;
打印 3 + 5 ;
设置 'variable3' 为 'variable3' - 1 ;
打印 'variable3' ;
设置 'variable3' 为 'variable3' + 100 ;
打印 'variable3' ;
日期比较
可以使用日期和时间运算符 after <date> 和 before <date> 来比较两个日期。
4.3.3.2 用于测试集合成员资格的条件
您可以使用条件来测试业务术语是否属于集合。
- 集合包含
如果 {"hans"} 包含 '我的员工' 的name 或者 '我的员工' 的name 包含 "hans"
那么
打印 1;
否则
打印 2 ;
- 添加到集合中
那么
'部门信息' .添加员工到集合中( '员工信息');
打印 '部门信息' ;
- ...是 集合中的一个
如果 '我的员工' 的 sex 是 {"男","女"} 中的一个
那么
打印 "你是正常人";
打印 '我的员工' 的age;
否则
打印 "未知性别!";
4.3.3.3 条件组合
您可以使用逻辑运算符来组合规则的 if 部分中的条件,通常用运算符 and 和 or 链接,以及使用括号等。
and 优先于 or
当逻辑运算符 and 和 or 链接规则的 if 部分中的条件时,and 运算符优先于 or 运算符。
如果
'我的员工' 的sex 是 "男" 或者 '我的员工' 的age 大于等于 18 并且 '我的员工' 的deptCode 是 "001"
那么
打印 "成立";
设置 '返回消息' 为 "成立";
否则
打印 "不成立";
设置 '返回消息' 为 "不成立";
如果以下任一条件为 true,那么该语句为 true:
- '我的员工' 的sex 是 "男"
- '我的员工' 的age 大于等于 18 并且 '我的员工' 的deptCode 是 "001"
使用括号
您可以使用括号来阐明逻辑运算符的优先顺序。
在以下 if 语句中,使用括号对年龄进行限制和所属部门编号进行分组,以下场景中括号非必须:
如果
'我的员工' 的sex 是 "男" 或者 ( '我的员工' 的age 大于等于 18 并且 '我的员工' 的deptCode 是 "001")
那么
打印 "成立";
设置 '返回消息' 为 "成立";
否则
打印 "不成立";
设置 '返回消息' 为 "不成立";
您还可以使用括号来更改条件的解析,在以下 if 语句中,应用括号改变了条件分组逻辑:
如果
('我的员工' 的sex 是 "男" 或者 '我的员工' 的age 大于等于 18 ) 并且 '我的员工' 的deptCode 是 "001"
那么
打印 "成立";
设置 '返回消息' 为 "成立";
否则
打印 "不成立";
设置 '返回消息' 为 "不成立";
同一逻辑运算的条件分组
您可以使用以下语句将条件分组并将同一逻辑运算符应用于组中的所有条件:
如下的所有条件都成立: 此业务术语将组中的所有条件与逻辑运算符and链接。
如果
如下的所有条件都成立:
— '员工信息' 的 sex 是 {"男","女"} 中的一个 或者 '员工信息' 的 sex 是 "未知"
— '员工信息' 的 age 大于等于 1 小于 18
或者
'员工信息' 的 name 是 {"韩","张"} 中的一个
那么
打印 "成立";
否则
打印 "不成立!";
如下的所有条件中任何一个条件成立: 此业务术语组中的所有条件与逻辑运算符or链接。
如果
如下的所有条件中任何一个条件成立:
— '我的员工' 的sex 是 "男"
— '我的员工' 的age 大于等于 18
那么
设置 '返回消息' 为 "成立";
否则
设置 '返回消息' 为 "不成立";
如下的所有条件都不成立:此业务术语组中的所有条件都不满足时
如果
如下的所有条件都不成立:
— '我的员工' 的sex 是 "男"
— '我的员工' 的age 大于等于 18
那么
设置 '返回消息' 为 "成立";
否则
设置 '返回消息' 为 "不成立";
条件求反
您可以将规则设置在条件不成立时执行操作。
如果
'员工信息' 的 age 大于等于 18 不成立
那么
打印 "不成立!!!";
设置 '返回消息' 为 "未成年!";
否则
打印 "成立";
设置 '返回消息' 为 "已成年";
4.3.4 规则操作部分
在规则的 then 和 else 部分中定义操作。 规则操作由至少一个操作短语组成,当规则的 if 部分为 true 时,规则将执行该操作短语。 它还可以包含要在规则的 if 部分为 false 时执行的操作短语,通常操作短语来源于系统内置动作以及用户在BOM中的自定义动作行为。
在规则的以下部分中定义操作:
then:此部分定义当规则的if部分为 true 或不存在任何if部分时规则执行的操作。else:此可选部分定义当规则的if部分为 false 时执行的操作。 不一定要声明规则的else部分。
规则的 then 部分必须至少定义一个操作。 如果 then 或 else 部分包含多个操作,那么规则按其列出顺序执行操作。在UDM中,系统内置动作默认只有打印和设置动作, 若不满足用户需要,需要规则开发者自行扩展。

打印动作
打印动作即在控制台打印一行文本消息,用于开发和规则调试用,不影响规则的执行过程和决策结果。
如果
'员工信息' 的 age 大于等于 18
那么
打印 "我成年了";
否则
打印 "我未成年!!!";
设置动作
设置动作通常是对一个参数或变量集进行赋值操作,会影响的规则执行结果。
如果
'客户' 的高胆固醇血症评点结果 + 工具方法.字符串转成数字( '客户' 的血压寿险评点结果 ) 小于 350
那么
设置 '客户' 的当前总评点结果为 "总评结果是:"+('客户' 的高胆固醇血症评点结果+ 工具方法.字符串转成数字( '客户' 的血压寿险评点结果 )) ;
否则
设置 '客户' 的当前总评点结果为 "拒保";
自定义动作
除了上述系统内置的打印、设置动作外,规则开发者自行扩展的动作行为也会显示在规则动作区,如上图所示“工具类”、’部门信息‘均为用户自定义动作。
那么
打印 员工.hello("世界!");
那么
打印 工具类.字符串转整型( '我的员工' 的msg);
'工具类' .sendMail();
4.3.5 规则编辑错误和警告
在规则编辑器中错误和警告显示在“问题”视图中,常见的错误有:
- 词汇错误,当无法识别规则中的某个单词时,就会发生词汇错误
- 语法错误,如果规则语句格式不正确,那么将报告语法错误
- 语义错误,如果规则文本在语法上正确但其解释错误,那么将报告语义错误
- 一致性错误,一致性错误由一致性校验器在构建时进行报告。 例如,如果规则包含不兼容测试或始终为 false 的测试,那么将引发一致性错误
- 其它错误

4.3.6 规则示例
简单规则
示例说明:用以判断输入的员工的年龄是否已成年
如果 '我的员工' 的age 大于等于 18
那么
设置 '返回消息' 为 "已成年";
否则
设置 '返回消息' 为 "未成年";
集合范围
如果
'员工信息' 的 sex 不是 {"男","女"} 中的一个
那么
打印 "你是第三性别!";
否则
打印 "你是个正常人!";
预定义
预定义
指定 'variable1' 为 一个 数字 来自(from) 1;
指定 'variable2' 为 一个 字符串 来自(from) "abc";
指定 'variable3' 为 一个 对象 来自(from) '员工信息';
指定 'variable4' 为 所有 字符串 来自(from) {"a","b","c"};
如果
'variable1' 大于等于 18 或者 "aa" 是 'variable4' 中的一个 或者 "2" 不是 'variable4' 中的一个
那么
设置 '我的消息' 为 "abc";
否则
打印 'variable4' 中的元素数量 ;

