当前位置: 首页 > news >正文

广东省级建设主管部门网站linux wordpress 下载

广东省级建设主管部门网站,linux wordpress 下载,网站制作1000元,清欢互联网网站建设文章目录 前言一、创建规则库二、SpringBootDrools程序1.Maven依赖2.application.yml3.Mapper.xml4.Drools配置类5.Service6.Contoller7.测试接口 前言 公司的技术方案想搭建Drools自定义规则库配合大模型进行数据的校验。本篇用来记录使用SpringBoot配合Drools开发Demo程序。… 文章目录 前言一、创建规则库二、SpringBootDrools程序1.Maven依赖2.application.yml3.Mapper.xml4.Drools配置类5.Service6.Contoller7.测试接口 前言 公司的技术方案想搭建Drools自定义规则库配合大模型进行数据的校验。本篇用来记录使用SpringBoot配合Drools开发Demo程序。 初步设计的技术方案为使用数据库存储DRL文件在程序启动时将所有的DRL文件加载到程序。接口传入数据时要带有想要做规则判断的DRL文件key值支持多个key。面对规则库的数据有修改或增添时理想方案是监听数据库的修改然后将增量或修改加载到程序。也可以通过定时任务的方式定时全量重新加载但就没办法实现实时生效。也可以暴露接口手动重新加载。 以上为初步的技术方案很多地方还比较粗糙如果有比较成熟的方案欢迎大家交流。 一、创建规则库 我这里用的MySql数据库 建表语句如下 DROP TABLE IF EXISTS drools_rules; CREATE TABLE drools_rules (id int(11) NOT NULL AUTO_INCREMENT,rule_name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,rule_content text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,version int(11) NULL DEFAULT 1,enabled tinyint(1) NULL DEFAULT 1,last_modified timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0),PRIMARY KEY (id) USING BTREE ) ENGINE InnoDB AUTO_INCREMENT 3 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT Compact;主要就是将DRL文件以文本的格式存到数据库里 DRL例子如下 rule 手术麻醉方式必填校验 BusinessType(diagnosis_check)when$data: org.example.drools.domain.vo.ClinicalData(anesthesiaMethod null || anesthesiaMethod.isEmpty())$result: org.example.drools.domain.vo.ValidationResult()then$result.addError(RULE_001, 手术记录必须包含麻醉方式);end二、SpringBootDrools程序 1.Maven依赖 我这里Java用的11版本 !-- Drools --dependencygroupIdorg.drools/groupIdartifactIddrools-core/artifactIdversion7.69.0.Final/version/dependencydependencygroupIdorg.drools/groupIdartifactIddrools-compiler/artifactIdversion7.69.0.Final/version/dependencydependencygroupIdorg.drools/groupIdartifactIddrools-mvel/artifactIdversion7.69.0.Final/version !-- 确保版本与 drools-core 一致 --/dependency2.application.yml server:port: 9528 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://XXXX:3306/drools_test?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8username: rootpassword: root logging:level:org.springframework: INFOcom.example.drools: DEBUG mybatis-plus:type-aliases-package: com.example.drools.domainmapper-locations: classpath*:mapper/**/*Mapper.xml3.Mapper.xml ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespaceorg.example.drools.mapper.DroolsDemoMapperselect idfindAllEnabledRules resultTypeorg.example.drools.domain.entity.DroolsRulesSELECT *FROM drools_rules rWHERE r.enabled 1ORDER BY r.version DESC/select /mapper获取数据库中所有生效的规则按版本倒排 4.Drools配置类 package org.example.drools.config;import org.example.drools.domain.entity.DroolsRules; import org.example.drools.mapper.DroolsDemoMapper; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; import org.kie.api.builder.KieFileSystem; import org.kie.api.builder.KieModule; import org.kie.api.runtime.KieContainer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import java.util.List;/*** Drools 动态配置*/ Configuration public class DroolsConfig {//操作规则库的MapperAutowiredprivate DroolsDemoMapper droolsDemoMapper;Beanpublic KieContainer kieContainer() {KieServices kieServices KieServices.get();KieFileSystem kieFileSystem kieServices.newKieFileSystem();reloadRules(kieFileSystem); // 初始化加载规则KieBuilder kieBuilder kieServices.newKieBuilder(kieFileSystem);kieBuilder.buildAll();KieModule kieModule kieBuilder.getKieModule();return kieServices.newKieContainer(kieModule.getReleaseId());}// 动态重新加载规则public void reloadRules(KieFileSystem kieFileSystem) {ListDroolsRules rules droolsDemoMapper.findAllEnabledRules();rules.forEach(rule -kieFileSystem.write(String.format(src/main/resources/%s.drl, rule.getRuleName()),rule.getRuleContent()));} } 初始化加载所有规则到Drools的容器中 5.Service package org.example.drools.service;import org.drools.core.base.RuleNameEqualsAgendaFilter; import org.example.drools.config.DroolsConfig; import org.example.drools.domain.vo.ClinicalData; import org.example.drools.domain.vo.ValidationResult; import org.kie.api.KieBase; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; import org.kie.api.builder.KieFileSystem; import org.kie.api.definition.KiePackage; import org.kie.api.definition.rule.Rule; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.AgendaFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service;import javax.annotation.PostConstruct; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map;Service public class DroolsService {Autowiredprivate KieContainer kieContainer;Autowiredprivate DroolsConfig droolsConfig;private static MapString, String ruleMetadataMap new HashMap();/*** 初始化元数据*/PostConstructprivate void init() {KieBase kieBase kieContainer.getKieBase();for (KiePackage pkg : kieBase.getKiePackages()) {for (Rule rule : pkg.getRules()) {org.drools.core.definitions.rule.impl.RuleImpl ruleImpl (org.drools.core.definitions.rule.impl.RuleImpl) rule;// 提取元数据String businessType (String) ruleImpl.getMetaData().get(BusinessType);ruleMetadataMap.put(rule.getName(), businessType);}}}public ValidationResult validate(ClinicalData request) {KieSession kieSession kieContainer.newKieSession();ValidationResult result new ValidationResult();//kieSession.setGlobal(errors, result.getErrors());kieSession.insert(request);kieSession.insert(result);AgendaFilter filter activation - {String ruleName activation.getRule().getName();String businessType ruleMetadataMap.get(ruleName);return request.getRuleTypes().contains(businessType);};kieSession.fireAllRules(filter);kieSession.dispose();return result;}} 当我们将所有的规则初始化加载到Drools的容器中后如果直接使用接口参数执行规则判断那么Drools将使用参数走过所有的规则判断而实际的场景中我这些参数只想执行部分规则那么就引出过滤规则的问题。 当时在处理这个问题的时候也是问了大模型的方案当时大模型给出了一个比较麻烦的方案就是在DRL文件中使用类似自定义注解的东西将DRL的一个业务编码写进去具体写法可以看上面我展示的DRL文件例子BussinessType那个。然后后面就一直研究这个方案如何实现。 后面整理的时候发现其实有很简单的方法就能实现这个问题我先说这个麻烦的方案是如何实现的后面补充上简单的方案 麻烦的方案是在将所有的规则加载到容器中后遍历所有规则将规则的name作为key将DRL文件中的BussinessType的字段取出作为value存在一个Map中然后编写Drools的过滤器 AgendaFilter filter activation - {String ruleName activation.getRule().getName();String businessType ruleMetadataMap.get(ruleName);return request.getRuleTypes().contains(businessType);};简单的方案是接口传参的时候直接传rule_name的集合反正都是定死的传name和bussinessType没区别然后过滤器直接request.getRuleTypes().contains(ruleName)就行了。 6.Contoller RestController RequestMapping(/drools) Api(tags Drools测试 API, description 提供Drools测试相关的 Rest API) public class DroolsController {Autowiredprivate DroolsService droolsService;PostMapping(/test)public ValidationResult validateClinicalData(RequestBody ClinicalData request) {return droolsService.validate(request);} }Data ApiModel(value ClinicalData) public class ClinicalData {ApiModelProperty(麻醉方式)private String anesthesiaMethod;// 门急诊诊断编码ICD-10ApiModelProperty(门急诊诊断编码)private String emergencyDiagnosisCode;ApiModelProperty(规则类型集合)private SetString ruleTypes;public String getAnesthesiaMethod() {return anesthesiaMethod;}public void setAnesthesiaMethod(String anesthesiaMethod) {this.anesthesiaMethod anesthesiaMethod;}public String getEmergencyDiagnosisCode() {return emergencyDiagnosisCode;}public void setEmergencyDiagnosisCode(String emergencyDiagnosisCode) {this.emergencyDiagnosisCode emergencyDiagnosisCode;}public SetString getRuleTypes() {return ruleTypes;}public void setRuleTypes(SetString ruleTypes) {this.ruleTypes ruleTypes;} }7.测试接口 附上结果返回的实体类结构以及我测试使用的两个DRL文件 Data public class ValidationResult {// 校验错误信息列表private ListString errors new ArrayList();// 校验通过标记public boolean isValid() {return errors.isEmpty();}// 添加带错误码的信息public void addError(String errorCode, String message) {errors.add(String.format([%s] %s, errorCode, message));}public ListString getErrors() {return errors;}public void setErrors(ListString errors) {this.errors errors;} }rule 手术麻醉方式必填校验 BusinessType(diagnosis_check)when$data: org.example.drools.domain.vo.ClinicalData(anesthesiaMethod null || anesthesiaMethod.isEmpty())$result: org.example.drools.domain.vo.ValidationResult()then$result.addError(RULE_001, 手术记录必须包含麻醉方式);endfunction Boolean isValidDiagnosisCode(String code) {if (code null || code.isEmpty()) return false;Character firstChar Character.toUpperCase(code.charAt(0));return (firstChar A firstChar U) || firstChar Z; } rule 诊断编码范围校验 BusinessType(code_check)when$data: org.example.drools.domain.vo.ClinicalData(emergencyDiagnosisCode ! null,!isValidDiagnosisCode(emergencyDiagnosisCode))$result: org.example.drools.domain.vo.ValidationResult()then$result.addError(RULE_002, 诊断编码各项编码范围应为AU开头和Z开头的编码);end
http://www.pierceye.com/news/926726/

相关文章:

  • 做资料分享网站有哪些网站设计建设维护与更新
  • 国外开源 企业网站建设网站经营范围
  • 做棋牌游戏网站云南软件开发
  • 广州做网站哪家好福州微信网站开发
  • 网站建设:做网站是不是很麻烦
  • 网站开发合同官司python能开发app吗
  • 福建建设厅网站简历表格 个人简历手机版
  • 重庆企业网站定制开发公司重庆城乡建设子网站
  • 网站地图怎么做html公司文化的建设对个人的意义
  • html网站模板免费下载台州网站制作 外贸
  • 有关建筑网站建设方案案例平台网站建设哪家有
  • 网站域名跳转是怎么做的空间一个数据库可以做几个网站
  • asp网站幻灯片不显示微商刚起步怎么找客源
  • 婚恋网站翻译可以做吗科技局网站建设方案
  • 长沙哪里学网站建设德阳做网站的公司
  • 制作短链接网站做抽奖网站违法吗
  • 网站备案每年审吗做网站做推广
  • 网站名称 规则个人网页模板背景
  • 网站制作方案策划简历网站建设咨询有客诚信网站建设咨询
  • 格尔木市住房和城乡建设局网站能看全景的地图软件
  • 一站式网站建设与运营wordpress后台代码修改
  • 企业品牌类网站有哪些做网站建设的公司是什么类型
  • 自己制作的网站怎么做分页2022建站市场
  • 网贷审核网站怎么做wordpress 文章列表页
  • 搬家网站建设公司西安是哪个省市
  • php 网站 整合 数据库智能建站系统个人网站
  • 福田区罗湖区宝安区龙华区seo上首页排名
  • 网站建设业务员提成企业网站 需求
  • 做淘宝客网站 首选霍常亮国外网页设计
  • 天津小型企业网站设计方案网页升级访问每天自动更新 下载