aviator-rule-engine
aviator-rule-engine copied to clipboard
基于AviatorScript的规则引擎实例
aviator-rule-engine
ä¸ä¸ªåºäºAviatorScriptçç®åè§åå¼æå®ä¾ãå°è§ååå为è§åéãè§åãæ¡ä»¶ä¸ä¸ªç»´åº¦ï¼å¯ä»¥æ»¡è¶³ä¸å¡è§åçéç¨æ§é ç½®ï¼åæ¶ä¹å¯ä»¥è¿è¡æ©å±ã
æ¤é¡¹ç®åæ¶å å«å®æ´çåå°ç®¡ç页é¢ï¼ä½¿ç¨Next.js + Material UIå¼åï¼ï¼ä¹å¯èªè¡æ¿æ¢ã
ä¾èµçæ¬
- AviatorScript 5.4.1
- SpringBoot 2.3.8.RELEASE
å建æ°æ®è¡¨
æ¡ä»¶(t_condition_info)
CREATE TABLE `t_condition_info` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`rule_id` bigint unsigned NOT NULL COMMENT 'æå±è§åid',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'æ¡ä»¶å称',
`remark` varchar(128) DEFAULT NULL COMMENT 'æ¡ä»¶å¤æ³¨',
`variable_name` varchar(32) NOT NULL COMMENT 'åéåï¼ä½ä¸ºåæ°ä¼ å
¥çå¯ä¸æ è¯ç¬¦ï¼',
`reference_value` varchar(256) NOT NULL COMMENT 'åèå¼',
`relation_type` varchar(32) NOT NULL COMMENT 'æ¡ä»¶å
³ç³»è¿ç®ç±»å',
`logic_type` varchar(32) NOT NULL COMMENT 'æ¡ä»¶é»è¾è¿ç®ç±»å',
`priority` smallint unsigned NOT NULL COMMENT 'æ¡ä»¶ä¼å
级ï¼å¼è¶å¤§ä¼å
级è¶é«ï¼',
PRIMARY KEY (`id`),
KEY `ix_rule_id` (`rule_id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = 'æ¡ä»¶';
è§å(t_rule_info)
CREATE TABLE `t_rule_info` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`ruleset_id` bigint NOT NULL COMMENT 'æå±è§åéID',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'è§åå称',
`remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'è§åå¤æ³¨',
`return_values` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'è¿åå¼éå',
`logic_type` varchar(32) NOT NULL COMMENT 'è§åé»è¾è¿ç®ç±»å',
`priority` smallint unsigned NOT NULL COMMENT 'è§åä¼å
级ï¼å¼è¶å¤§ä¼å
级è¶é«ï¼',
PRIMARY KEY (`id`),
KEY `ix_ruleset_id` (`ruleset_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = 'è§å';
è§åé(t_ruleset_info)
CREATE TABLE `t_ruleset_info` (
`id` bigint NOT NULL AUTO_INCREMENT,
`code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'è§åéç¼ç ',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'è§åéå称',
`remark` varchar(128) DEFAULT NULL COMMENT 'è§åéå¤æ³¨',
`default_return_values` varchar(256) DEFAULT NULL COMMENT 'é»è®¤è¿åå¼éå',
`expression` varchar(1024) DEFAULT NULL COMMENT 'è§åé表达å¼',
`mode` tinyint NOT NULL DEFAULT '0' COMMENT '模å¼ï¼0ï¼åå»ºä¸ 1ï¼å·²å建ï¼',
PRIMARY KEY (`id`),
KEY `ix_code` (`code`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = 'è§åé';
æ¯æçæ¡ä»¶é»è¾è¿ç®ç±»å
é»è¾ç±»å | å¼ | æè¿° |
---|---|---|
AND | && | å¦æå½åæ¡ä»¶åå 为çï¼å继ç»ååæ§è¡ï¼å¦åè·³è¿åé¢çæ¡ä»¶åå ï¼ç´æ¥è¿åå |
OR | || | å¦æå½åæ¡ä»¶åå 为çï¼åè·³è¿åé¢çæ¡ä»¶åå ç´æ¥è¿åçï¼å¦å继ç»ååæ§è¡ |
æ¯æçæ¡ä»¶å ³ç³»è¿ç®ç±»å
- å ³ç³»ç±»åæ¡ä»¶
æ¡ä»¶ç±»å | æè¿° |
---|---|
EQUAL | çäºï¼=ï¼ |
NOT_EQUAL | ä¸çäºï¼!=ï¼ |
LESS_EQUAL | å°äºçäºï¼<=ï¼ |
GREATER_EQUAL | 大äºçäºï¼>=ï¼ |
LESS | å°äºï¼<ï¼ |
GREATER | 大äºï¼>ï¼ |
- éåç±»åæ¡ä»¶
æ¡ä»¶ç±»å | æè¿° |
---|---|
INCLUDE_IN_LIST | å表å å«æå®å符串 |
NOT_INCLUDE_IN_LIST | å表ä¸å å«æå®å符串 |
SOME_CONTAINS_IN_LIST | å表å å«æå®å符串çæä¸é¨å |
NONE_CONTAINS_IN_LIST | å表ä¸å å«æå®å符串çä»»ä½é¨å |
æ示: å表ä½ä¸ºåèå¼(
referenceValue
)ä¼ å ¥æ¶ï¼å¤ä¸ªå ç´ ä¹é´ä»¥éå·(,
)è¿è¡åéãä¾å¦ï¼
1,2,3
ï¼å符1,å符2,å符3
ã
- å符类åæ¡ä»¶
æ¡ä»¶ç±»å | æè¿° |
---|---|
STRING_CONTAINS | å å«æå®å符 |
STRING_NOT_CONTAINS | ä¸å å«æå®å符 |
STRING_STARTSWITH | 以æå®å符å¼å§ |
STRING_NOT_STARTSWITH | ä¸ä»¥æå®å符å¼å§ |
STRING_ENDSWITH | 以æå®å符ç»æ |
STRING_NOT_ENDSWITH | ä¸ä»¥æå®å符ç»æ |
- åºé´ç±»åæ¡ä»¶
æ¡ä»¶ç±»å | æè¿° |
---|---|
INTERVAL_NUMBER | æ°å¼åºé´ |
INTERVAL_STRING_LENGTH | å符é¿åº¦åºé´ |
æ示: åºé´ä½ä¸ºåèå¼(
referenceValue
)ä¼ å ¥æ¶ï¼åæ°å¦ä¸çåºé´è¡¨ç¤ºå½¢å¼åå«ä¹ç¸åãä¾å¦ï¼
[1,10]
æ¯éåºé´ï¼è¡¨ç¤ºï¼x >= 1 && x <= 10
ï¼(1,10)
æ¯å¼åºé´ï¼è¡¨ç¤ºï¼x > 1 && x < 10
ï¼[1,10)
æ¯å·¦éå³å¼åºé´ï¼è¡¨ç¤ºï¼x >= 1 && x < 10
ï¼(1,10]
æ¯å·¦å¼å³éåºé´ï¼è¡¨ç¤ºï¼x > 1 && x <= 10
ã
- æ£åç±»åæ¡ä»¶
æ¡ä»¶ç±»å | æè¿° |
---|---|
REGEX | æ£å |
æ示: æ£å表达å¼ä½ä¸ºåèå¼(
referenceValue
)ä¼ å ¥æ¶ï¼è¯æ³åJavaå®å ¨ä¸è´ãä½å½¢å¼ä¸æç¥å¾®å·®å¼ï¼AviatorScriptä¸çæ£å表达å¼éè¦ä»¥/
æ¬èµ·æ¥ï¼å¹¶ä¸å¯¹äºéè¦è½¬ä¹çå符ä¸éè¦è¿ç»çåææ\\
ï¼åªè¦ä¸ä¸ª\
å³å¯ãæ¤å¤åäºå ¼å®¹ï¼å¦æåèå¼é ç½®çæ£å表达å¼é¦å°¾ä¸å å«
/
æ¶ï¼å°èªå¨æ·»å ã
æ¯æçè§åé»è¾è¿ç®ç±»å
é»è¾ç±»å | å¼ | æè¿° |
---|---|---|
AND | && | å ³èç±»åï¼å¨ä¼å 级ç¸é»ç两个è§åä¸ï¼ä¼å 级è¾é«çè§ååä¼å 级è¾ä½çè§ååæ¶å¹é æ¶ï¼æè¿å对åºçè¿åå¼ãå¦åè¿ånullæè§åé设置çé»è®¤è¿åå¼ï¼å¦æ已设置ï¼ã |
XOR | äºæ¥ç±»åï¼å¨ä¼å 级ç¸é»ç两个è§åä¸ï¼ä¼å 级è¾é«çè§åå¹é æ¶ï¼ç´æ¥è¿å对åºçè¿åå¼ï¼ä¸åéªè¯åé¢çè§åï¼å¦åï¼éªè¯ä¼å 级è¾ä½çè§åæ¯å¦æ»¡è¶³ï¼å¦æ满足åè¿å对åºçè¿åå¼ãä¸æ»¡è¶³åè¿ånullæè§åé设置çé»è®¤è¿åå¼ï¼å¦æ已设置ï¼ã |
æ¡ä»¶
æ¡ä»¶æ¯æå°çæ§è¡åå
ï¼ä¾å¦ï¼x >= 99
ã
å¤ä¸ªæ¡ä»¶å¯ä»¥æç
§å
³ç³»è¿ç®ç±»åãé»è¾è¿ç®ç±»åç»åæä¸ä¸ªè§åãä¾å¦ï¼x >= 99 || y < 45
ã
å½ç¶å个æ¡ä»¶æ¬èº«ä¹æ¯ä¸ä¸ªè§åï¼å¯ä»¥è®¤ä¸ºx >= 99
çåäºx >= 99 && true
ã
æ¡ä»¶ä¼å 级
æ¡ä»¶ä¼å 级å³å®äºæ¡ä»¶ä¹é´çç»å次åºåæ§è¡é¡ºåºãåä¸ä¸ªè§åä¸æææ¡ä»¶æä¼å 级è¿è¡æåºï¼ä¼å 级è¶é«ï¼ç»å次åºåæ§è¡é¡ºåºè¶é åãï¼åä¸è§åä¸ï¼ä¸è½åå¨ä¼å 级ç¸åçæ¡ä»¶ï¼ä¿è¯æ§è¡é¡ºåºå¯ä¸ãï¼
ä¾å¦ï¼å®ä¹ä¸ä¸ªè§åä¸çæ¡ä»¶è¡¨è¾¾å¼åä¼å 级å¦ä¸ï¼
æ¡ä»¶è¡¨è¾¾å¼ | æ¡ä»¶é»è¾è¿ç®ç¬¦ | æ¡ä»¶ä¼å 级 |
---|---|---|
x == 1 | || | 8 |
y > 2 | && | 4 |
z <= 3 | && | 2 |
v != 4 | || | 1 |
æåçæçè§å表达å¼ä¸ºï¼
((x ==1 || y>2) && z <= 3) && v != 4
åæ¶æ³¨æï¼å¨æ¯ä¸¤ä¸ªæ¡ä»¶çç»å两侧添å äºæ¬å·ï¼ä¿è¯äºæ¬å·å æ¡ä»¶çä¼å 级ã
æ¡ä»¶é»è¾è¿ç®
æ¯ä¸ªæ¡ä»¶é½é带é»è¾è¿ç®ç±»åï¼å½ä¸¤ä¸ªæ¡ä»¶ä¹é´è¿è¡ç»åæ¶ï¼é«ä¼å 级æ¡ä»¶çé»è¾è¿ç®ä½ç¨äºä½ä¼å 级æ¡ä»¶ï¼èä½ä¼å 级æ¡ä»¶çé»è¾è¿ç®ä½ç¨äºæ¡ä»¶ç»åæ´ä½ã
以å¦ä¸è¡¨è¾¾å¼ä¸ºä¾ï¼
((x == 1 || y > 2) && z <= 3) && v != 4
- æ¡ä»¶
x == 1
é»è¾è¿ç®ç±»å为||
ï¼ä½ç¨äºæ¡ä»¶y > 2
ã - æ¡ä»¶
y > 2
é»è¾è¿ç®ç±»å为&&
ï¼ç±äºå左侧æ¡ä»¶x == 1
è¿è¡ç»åï¼æ以ä½ç¨äºå³ä¾§æ¡ä»¶z <= 3
ã - æ¡ä»¶
z <= 3
é»è¾è¿ç®ç±»å为&&
ï¼ç±äºå左侧æ¡ä»¶ç»å(x == 1 || y> 2)
è¿è¡ç»åï¼æ以ä½ç¨äºå³ä¾§æ¡ä»¶v != 4
ã - æ¡ä»¶
v != 4
ä¼å 级æä½ï¼å¨çæè§å表达å¼æ¶å°ä¼èªå¨å¿½ç¥å ¶é»è¾è¿ç®ç±»åã - å设æ¡ä»¶
v != 4
é»è¾è¿ç®ç±»å为||
ï¼åæ´ä¸ªè¡¨è¾¾å¼çä»·äº(((x == 1 || y > 2) && z <= 3) && v != 4) || false
ï¼å设æ¡ä»¶v != 4
é»è¾è¿ç®ç±»å为&&
ï¼åæ´ä¸ªè¡¨è¾¾å¼çä»·äº(((x == 1 || y > 2) && z <= 3) && v != 4) && true
ã
æ¡ä»¶å ³ç³»è¿ç®
æ¯ä¸ªæ¡ä»¶é½é带æ¡ä»¶å ³ç³»ç±»åï¼ç¨äºååèå¼è¿è¡æ¯è¾ã
ä¾å¦æ¡ä»¶x >= 99
ï¼x
æ¯æ¡ä»¶çåéåï¼ä½ä¸ºåæ°ä¼ å
¥çå¯ä¸æ è¯ç¬¦ï¼>=
æ¯æ¡ä»¶çå
³ç³»è¿ç®ç¬¦ï¼å¯¹åºçå
³ç³»è¿ç®ç±»å为ï¼ConditionRelationType.EQUAL
ï¼ï¼99
æ¯æ¡ä»¶çåèå¼ï¼ç¨äºå以x
为åéåçåæ°å¼è¿è¡å¯¹åºçå
³ç³»è¿ç®ã
è§å
å¤ä¸ªæ¡ä»¶ç»è¿ç»åä¹åå°±æ¯ä¸ä¸ªè§åï¼ä¸ä¸ªè§åä¸é带ä¸ä¸ªæ¡ä»¶å表ï¼å¨çæè§å表达å¼æ¶ï¼æ¡ä»¶å表ä¸çæææ¡ä»¶å°æä¼å 级ä»é«å°ä½è¿è¡ç»åã
è§åä¼å 级
è§åä¼å 级çå«ä¹åæ¡ä»¶ä¼å 级ç¸ä¼¼ãè§åä¼å 级å³å®äºå¤ä¸ªè§åä¹é´çç»å顺åºåç»æã
è§åé»è¾è¿ç®
æ¯æ¡è§åé½é带é»è¾è¿ç®ç±»åï¼ä»¥ä¸¤ä¸ªè§åçç»å为ä¾ï¼è§åé»è¾è¿ç®çä½ç¨æºå¶è¯´æå¦ä¸ï¼
- è¥é«ä¼å
级è§åçé»è¾è¿ç®ç±»å为å
³èç±»åï¼
AND
ï¼ï¼åé«ä¼å 级è§åçé»è¾è¿ç®ä½ç¨äºä½ä¼å 级è§åï¼ä½ä¼å 级è§åçé»è¾è¿ç®ä¸å½±åè§åç»åï¼ä½ä½ä¼å 级è§å设置çè¿åå¼éåå³ä¸ºè§åç»åçè¿åå¼éåï¼é«ä¼å 级è§å设置çè¿åå¼éå被è¦çï¼ï¼ - è¥é«ä¼å
级è§åçé»è¾è¿ç®ç±»å为äºæ¥ç±»åï¼
XOR
ï¼ï¼åé«ä¼å 级è§ååä½ä¼å 级è§åçé»è¾è¿ç®äºä¸å½±åï¼è¿åå¼éåä¹ä¸ä¼è¢«ä»»ä½ä¸æ¹è¦çï¼
以å¦ä¸è¡¨è¾¾å¼ä¸ºä¾ï¼
(a == 1|| b == 2) && (c == 3 || d == 4)
ä»è¡¨é¢ä¸çï¼è¿æ¯ä¸ä¸ªè§å表达å¼ï¼å°å
¶æå为4个æ¡ä»¶ï¼æå°æ§è¡åå
ï¼ååå«ä¸ºa == 1
ãb ==2
ãc ==3
ãd ==4
ï¼åä¸è§åä¸çå¤ä¸ªæ¡ä»¶ç»åæ¶æç
§ä¼å
级ä»é«å°ä½è¿è¡ç»åï¼ç»å顺åºæ¯å¯ä¸çãä½ç»å表达å¼æ¥çï¼æ¤å¤ç表达å¼åºç°äºä¸¤ä¸ªç»å顺åºï¼å³ï¼(a == 1|| b == 2)
å(c == 3 || d == 4)
ï¼å æ¤ä¸è½ä½ä¸ºä¸æ¡è§åè¿è¡ç»åã
æ们å°å
¶ä½ä¸ºä¸¤ä¸ªè§å(R1,R2)
è¿è¡ç»åï¼è¿ä¸¤æ¡è§åä¸çæ¡ä»¶å表åå«ä¸ºa == 1
ãb ==2
åc ==3
ãd ==4
ï¼å¯¹åºç两个è§å表达å¼ä¸ºR1:a == 1|| b == 2
ï¼R2:c == 3 || d == 4
ã
å
¶ä¸R1ä¼å
级设置为100ï¼é»è¾è¿ç®ç±»å设置为å
³èç±»åï¼AND
ï¼ï¼è¿åå¼éååR2ç¸åå³å¯ï¼R1å¨ä¸¤ä¸ªè§åçç»åä¹é´ä¼å
级æé«ï¼è¿åå¼éå被R2è¦çï¼ï¼
R2ä¼å
级设置为98ï¼é»è¾è¿ç®ç±»å为ANDåXORåå¯ï¼R2å¨ä¸¤ä¸ªè§åçç»åä¹é´ä¼å
级æä½ï¼é»è¾è¿ç®ä¸ä½ç¨äºå
¶ä»ä»»ä½è§åï¼ï¼è¿åå¼éå设置为ï¼{'myvariable':true}
ã
å°R1ãR2æ·»å å°ä¸ä¸ªè§åéä¸ï¼æç»çæ表达å¼ä¸º(a == 1|| b == 2) && (c == 3 || d == 4)
ï¼å¯¹åºçæçaviatoræ§è¡èæ¬ä¸ºï¼
let rmap = seq.map('myvariable', false);
if((a == 1 || b == 2) && (c == 3 || d == 4)){
seq.put(rmap, 'myvariable', true);
}
return rmap;
è§åé
è§åéæ¯è§åå¼ææ§è¡ç对象ï¼ä¸ä¸ªè§åéä¸å
å«ä¸ä¸ªæå¤ä¸ªè§åï¼é»è®¤æ·»å çè§åéå¤äºRulesetMode.BUILDING
模å¼ï¼è¡¨ç¤ºå½åçè§åé表达å¼æªçæï¼è§åéå¤äºä¸å¯ç¨ç¶æãå½è§åéä¸åå¨è§åï¼å¹¶ä¸æ¯ä¸ªè§åä¸åå¨æ¡ä»¶æ¶ï¼è§åéèªå¨åæ¢ä¸ºRulesetMode.BUILT
模å¼ï¼å¹¶ä¸çæè§åé表达å¼ã
è§åé设置é»è®¤è¿åå¼éå
è§åéæ¯æ设置é»è®¤è¿åå¼ãå¨è®¾ç½®è§åæ¶ï¼å¯ä»¥è®¾ç½®å½åè§åå¹é
æ¶çè¿åå¼ï¼å¯¹äºè§åéä¸ææè§ååä¸å¹é
çæ
åµï¼å¯ä»¥å¨è§åé设置é»è®¤è¿åå¼defaultReturnValues
ï¼æ°æ®æ ¼å¼åå¨è§åä¸è®¾ç½®è¿åå¼éåç¸åï¼e.g. {'returnVariable1':returnValue1,'returnVariable2':returnValue2}
ï¼ã
使ç¨ç¤ºä¾
ä¸ä¸ªè®¡ç®è´¹ç¨ãè´¹ççç®å示ä¾
å¦ä¸ä¸ºä¸ä¸ªäº§åè´¹ç计ç®è§åï¼
å¹´é¾ï¼AGEï¼ | é¢åº¦ï¼AMTï¼ | è´¹ç¨ï¼PREMï¼ | è´¹çï¼RATEï¼â° |
---|---|---|---|
0~3å² | 1000000 | 67.9 | 0.0679 |
4~11å² | 1000000 | 198.2 | 0.1982 |
12å² | 1000000 | 18 | 0.018 |
éè¦æä¸è¿°è§åï¼éè¿å¹´é¾ãé¢åº¦æ¥å¨æ计ç®0~12å²çå¿ç«¥äº§åçè´¹ç¨åè´¹çã
è§åéæ¯è§åå¼ææ§è¡ç对象ï¼å æ¤é¦å å建ä¸ä¸ªè§åéï¼å¨è§åéæ·»å ä¸æ¡è§åï¼å¨æ¯ä¸ªè§åä¸é 置对åºçæ¡ä»¶ï¼å ·ä½çè¿ç¨å¦ä¸ï¼
- å建è§åé
æå®è§åéç¼ç 为RULEST_RATE_CALC
ï¼åæ°å¦ä¸ï¼
{
"code": "RULEST_RATE_CALC",
"name": "ruleset for rate calculate",
"defaultReturnValues": "{PREM:0.00,RATE:0.00}"
}
å
¶ä¸code
æ¯è§åéç¼ç ï¼ç¨äºæ è¯ä¸ä¸ªè§åéï¼å¿
é¡»å¯ä¸ä¸ä¸å¯éå¤ãname
æ¯è¿ä¸ªè§åéçå称ãdefaultReturnValues
æ¯è¿ä¸ªè§åéå®ä¹çé»è®¤è¿åå¼éåï¼å¦æè§åéä¸é¢çè§åé½ä¸å¹é
ï¼é£ä¹è§åå¼ææ§è¡å½åè§åéçè¿åç»æå°±æ¯å
¶é»è®¤è¿åå¼éåã
è¿åå¼éåçæ ¼å¼æ¯ä¸ä¸ªmapéåçjsonå符串ã
è¿åå¼éåçå«ä¹å°±æ¯è§åå¼ææ¥å£è¿åç对åºçmapéåãå¦æä¸è¿°è§åéä¸ææè§åé½ä¸å¹é ï¼é£ä¹è§åå¼ææç»è¿åçç»æå°±æ¯ï¼
{
"PREM": 0.00,
"RATE": 0.00
}
éè¿è¿åå¼éåä¸å®ä¹çè¿åå¼åéåPREM
åRATE
ï¼å¯ä»¥ä»mapéåä¸è·å对åºçè¿åå¼ã
- å¨å½åè§åéä¸æ·»å è§å
å¨å½åä¾åä¸ï¼éè¦æ·»å ä¸ç»è§åï¼åæ°å¦ä¸ï¼
{
"rulesetId": 2,
"name": "rule for age(0-3)",
"returnValues": "{PREM:67.9,RATE:0.0679}",
"logicType": "XOR",
"priority": 100
}
{
"rulesetId": 2,
"name": "rule for age(4-11)",
"returnValues": "{PREM:198.2,RATE:0.1982}",
"logicType": "XOR",
"priority": 99
}
{
"rulesetId": 2,
"name": "rule for age(12)",
"returnValues": "{PREM:18,RATE:0.018}",
"logicType": "XOR",
"priority": 98
}
å
¶ä¸rulesetId
æ¯å½åè§åæå±è§åéç主é®idï¼name
æ¯è§åçå称ï¼returnValues
æ¯ä¸ºå½åè§åå¹é
æ¶å®ä¹çè¿åå¼éåï¼logicType
æ¯è§åé»è¾è¿ç®ç±»åï¼priority
æ¯è§åçä¼å
级ã
- å¨æ¯ä¸ªå¯¹åºè§åä¸æ·»å æ¡ä»¶
rule for age(0-3)
[
{
"ruleId": 2,
"name": "children age 0~3",
"variableName": "AGE",
"referenceValue": "[0,3]",
"relationType": "INTERVAL_NUMBER",
"logicType": "AND",
"priority": 10
},
{
"ruleId": 2,
"name": "amount total",
"variableName": "AMT",
"referenceValue": "1000000",
"relationType": "EQUAL",
"logicType": "AND",
"priority": 8
}
]
rule for age(4-11)
[
{
"ruleId": 4,
"name": "children age 4~11",
"variableName": "AGE",
"referenceValue": "[4,11]",
"relationType": "INTERVAL_NUMBER",
"logicType": "AND",
"priority": 10
},
{
"ruleId": 4,
"name": "amount total",
"variableName": "AMT",
"referenceValue": "1000000",
"relationType": "EQUAL",
"logicType": "AND",
"priority": 8
}
]
rule for age(12)
[
{
"ruleId": 5,
"name": "children age",
"variableName": "AGE",
"referenceValue": "12",
"relationType": "EQUAL",
"logicType": "AND",
"priority": 10
},
{
"ruleId": 5,
"name": "amount total",
"variableName": "AMT",
"referenceValue": "1000000",
"relationType": "EQUAL",
"logicType": "AND",
"priority": 9
}
]
ruleId
æ¯å½åæ¡ä»¶æå±è§åç主é®idï¼name
为æ¡ä»¶å称ï¼variableName
åreferenceValue
åå«ä¸ºåéåååèå¼ï¼åéåçå«ä¹æ¯å¨è°ç¨è§åå¼ææ¥å£æ¶ï¼ç¨äºæ¥æ¶å¤é¨åæ°çåéå称ï¼åèå¼çä½ç¨æ¯ååéåæ代表çåæ°å¼è¿è¡æ¯è¾ãrelationType
ç¨äºå®ä¹åéåååèå¼ä¹é´çå
³ç³»è¿ç®ç±»å ãlogicType
表示æ¡ä»¶ä¹é´çé»è¾è¿ç®ç±»åãpriority
表示æ¡ä»¶ä¼å
级ã
- çæè§å表达å¼
æ·»å è§åéãè§åãæ¡ä»¶ä¹åï¼èªå¨çæè§åé表达å¼å¦ä¸ï¼
let rmap = seq.map();
if((AGE >= 0 && AGE <= 3) && AMT == 1000000){
seq.put(rmap, 'PREM', 67.9);
seq.put(rmap, 'RATE', 0.0679);
}
elsif((AGE >= 4 && AGE <= 11) && AMT == 1000000){
seq.put(rmap, 'PREM', 198.2);
seq.put(rmap, 'RATE', 0.1982);
}
elsif(AGE == 12 && AMT == 1000000){
seq.put(rmap, 'PREM', 18);
seq.put(rmap, 'RATE', 0.018);
}
return rmap;
ä¸é¢çæçè§åé表达å¼å³ä¸ºAviatorèæ¬è¡¨è¾¾å¼ï¼ä¼ å ¥å¯¹åºçåæ°å°±å¯ä»¥è·åæ§è¡ç»æã
å¦å¤ï¼å¯¹äºæææµ®ç¹æ°ç±»åçå
¥åååºåï¼å¨AviatorScriptå®é
æ§è¡ä¸è¿°è¡¨è¾¾å¼æ¶ï¼ä¼å°æææµ®ç¹æ°é½è§£æ为decimal
ï¼ä¿è¯é«ç²¾åº¦è¿ç®çè¦æ±ãï¼å¨é»è®¤é
ç½®çå¼æå®ä¾ä¸å·²å¼å¯æ¤é
置项Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL
ï¼ã
- æ§è¡è§åé
å设ç°å¨è¦è®¡ç®å¹´é¾ä¸º9å²çå¿ç«¥ï¼é¢åº¦ä¸º1000000æ¶çè´¹ç¨åè´¹çï¼è§åå¼æ请æ±åæ°ä¸ºï¼
{
"rulesetCode": "RULEST_RATE_CALC",
"paraMap": {
"AGE": 9,
"AMT": 1000000
}
}
è§åå¼æè¿åç»æï¼
{
"status": 200,
"success": true,
"message": null,
"body": {
"RATE": 0.1982,
"PREM": 198.2
}
}
- æ¥å£è°ç¨
å¨åºç¨æå¡ä¸ï¼è°ç¨æ¥å£æ¹å¼å¦ä¸ï¼
@Autowired
private RuleCoreService ruleCoreService;
Map<String, Object> paraMap = new HashMap<>();
paraMap.put("AGE", 9);
paraMap.put("AMT", 1000000);
String rulesetCode = "RULEST_RATE_CALC";
Map<String, Object> resultMap = ruleCoreService.executeRuleset(rulesetCode, paraMap);
System.out.println("è´¹ç¨ï¼" + resultMap.get("PREM"));// 198.2
System.out.println("è´¹çï¼" + resultMap.get("RATE"));// 0.1982
æè éè¿å¤é¨è¯·æ±æ¥å£è¿è¡è°ç¨ã
Aviatorç¼è¯æ¨¡å¼
é»è®¤é
ç½®çAviatoræ§è¡å¨å®ä¾(AviatorEvaluatorInstance
)设置çæ¯ç¼è¯ç¼å模å¼ï¼é¿å
å¨æ¯æ¬¡æ§è¡è§åéæ¶é½å¯¹è¡¨è¾¾å¼éæ°ç¼è¯ï¼å½±åæ§è½ã
åæ¶ä¹ä½¿ç¨äºLRUç¼å(Aviator 5.0+)ï¼ç¨äºæå®ç¼åçè§åé表达å¼æ°éï¼é»è®¤æ¯500ï¼å¯ä»¥å¨é
ç½®æ件ä¸å¯¹å±æ§(aviator.expression-cache-capacity
)è¿è¡é
ç½®ã
使ç¨è¯´æ
建议å°æ¬é¡¹ç®é¨ç½²ä¸ºç¬ç«çæå¡ãæ°æ®åºåç¸å ³æå¡é 置请修æ¹é ç½®æ件 ã
å¨æå¡é¨ç½²åï¼è¯·å¨é ç½®çæ°æ®åºä¸å建æ°æ®è¡¨ ã
ç®åè§åç»´æ¤å¯ç´æ¥éè¿çé¢è¿è¡é ç½®ï¼åæ¶ä¹æä¾äºå é¨ç®¡çæ¥å£ã
é»è®¤ç管çåå°è®¿é®å°å为ï¼http://localhost:8000/static