首頁>技術>

這一篇,主要是圍繞,規則配置資料,外置於資料庫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,最終還是執行了折扣的業務邏輯。

10
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 解決最新版K8S V1.20版本映象拉取失敗的問題及指令碼處理