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