這一篇,主要是圍繞,規則配置資料,外置於資料庫Mysql的實現。
思路1、Mysql儲存
新建表t_biz_rule、t_biz_rule_compose分別儲存規則定義、規則組合定義
2、構建Rules
Mysql中的Rule、RuleCompose轉換成RuleDefinition物件定義Rules註冊工具類Helper,為每個RuleCompose註冊3、定義Facts以及RulesEngine
實現1、Mysql實現規則配置的CRUD
定義物件BizRule
@Data@Accessors(chain = true)public class BizRule implements Serializable { /** * 主鍵ID */ private Long id; /** * 規則組 */ private String groupCode; /** * 規則名稱 */ private String name; /** * 規則描述 */ private String description; /** * 規則權重 */ private int priority; /** * 規則組合型別(compositeRuleType) * {@link CompositeRuleTypeEnum} */ private Integer compositeType; /** * 狀態 0有效-1無效 */ private Integer status; /** * 建立時間 */ private Date createTime; /** * 變更時間 */ private Date updateTime;}
定義物件BizRuleCompose
@Data@Accessors(chain = true)public class BizRuleCompose implements Serializable { /** * 主鍵ID */ private Long id; /** * 規則ID */ private Long ruleId; /** * 規則名稱 */ private String name; /** * 規則描述 */ private String description; /** * 規則權重 */ private int priority; /** * 規則條件(Java程式碼) */ private String condition; /** * 執行操作 */ private String actions; /** * 狀態 0有效-1無效 */ private Integer status; /** * 建立時間 */ private Date createTime;}
定義CRUD引數Bo
@Datapublic class BizRuleBo implements Serializable { /** * 名稱 */ @NotNull(message = "請輸入規則名稱") @Size(min = 2, max = 50, message = "規則名稱2-50個字元") private String name; /** * 描述 */ @NotNull(message = "請輸入規則描述") @Size(min = 2, max = 20, message = "規則名稱2-10個字元") private String description; /** * 規則組 */ @NotNull(message = "請定義規則組") @Size(min = 2, max = 10, message = "規則名稱2-10個字元") private String groupCode; /** * 許可權 */ private int priority; /** * 組合型別 */ private Integer compositeType; /** * 組合規則 */ private List<BizComposeBo> composingRules;}
API實現
@RestController@RequestMapping("biz_rule")@AllArgsConstructor@Validatedpublic class BizRuleController { private BizRuleService bizRuleService; @AuthIgnore @PostMapping("/add") @OperationLog(value = "業務規則新建", type = LogOperationEnum.ADD) public ResultVo<Integer> add(@RequestBody @Valid BizRuleBo bo) { return ResultVo.success(bizRuleService.addRule(bo)); }}
POST請求結果
規則配置新增操作
2、透過Heler工具類構建Rules物件
定義BizRuleHelper
public class BizRuleHelper extends AbstractRuleFactory { private final ParserContext parserContext; public BizRuleHelper(ParserContext parserContext) { this.parserContext = parserContext; } /** * 建立規則 * @param ruleDefinitions 規則定義 * @return 結果 */ public Rules createRules(List<RuleDefinition> ruleDefinitions) { Rules rules = new Rules(); ruleDefinitions.forEach(ruleDefinition -> rules.register(createRule(ruleDefinition))); return rules; } @Override public Rule createSimpleRule(RuleDefinition ruleDefinition) { MVELRule mvelRule = new MVELRule(parserContext) .name(ruleDefinition.getName()) .description(ruleDefinition.getDescription()) .priority(ruleDefinition.getPriority()) .when(ruleDefinition.getCondition()); for (String action : ruleDefinition.getActions()) { mvelRule.then(action); } return mvelRule; }}
定義RulesConfig
@Component@AllArgsConstructorpublic class BizRulesConfig { private BizRuleService bizRuleService; static String group_code = "order_rule"; /** * 構建rules配置 */ public Rules fetchConfigRules() { //JSON 表示式 BizRuleHelper bizRuleHelper = new BizRuleHelper(new ParserContext()); return bizRuleHelper.createRules(bizRuleService.ruleDefinitions(group_code)); }}
3、API程式碼
@AuthIgnore @OperationLog(value = "easy rules DB測試") @PostMapping("/db") @SneakyThrows public ResultVo<?> dbTest(@RequestBody BizOrder order) { //定義資料 Facts facts = new Facts(); facts.put("param", order); facts.put("OrderService",OrderService.class); //讀取配置 Rules rules = bizRulesConfig.fetchConfigRules(); //引擎配置 RulesEngine rulesEngine = new DefaultRulesEngine(); rulesEngine.fire(rules, facts); return ResultVo.success(); }
4、場景模擬
和前一篇類似,模擬商品1,是打折商品,原價200,折扣7折,計算最後價格。
模擬請求引數
程式碼邏輯處理
我們可以看出,透過呼叫統一介面/order/db,最終還是執行了折扣的業務邏輯。
最新評論