iBizModel 实体值规则模型(PSDEFVALUERULE)详解与应用
实体值规则模型(PSDEFVALUERULE)详解与应用场景
引言
在iBizModel模型体系中,实体值规则模型(PSDEFVALUERULE)是确保数据质量和业务逻辑完整性的核心组件。作为属性级别的校验机制,值规则模型为实体属性提供了灵活、可配置的数据验证能力,涵盖从简单的非空检查到复杂的业务规则校验。在现代企业级应用开发中,数据校验不再仅仅是前端界面的基础功能,更是后端服务层、数据持久化层的重要保障。PSDEFVALUERULE通过标准化的模型定义,实现了校验逻辑的可复用、可配置和可扩展,为系统开发提供了坚实的质量保障基础。
值规则模型的价值体现在多个层面:在技术层面,它统一了校验逻辑的实现标准;在业务层面,它确保了数据符合业务规范;在维护层面,它使得校验规则的修改无需代码变更,大大提升了系统的可维护性。下面将深入解析PSDEFVALUERULE模型的结构、特性和实际应用。
PSDEFVALUERULE模型详细解析
模型基本属性与结构
PSDEFVALUERULE作为实体属性的附属模型,具有完整的属性定义体系。每个值规则都通过以下关键属性进行定义:
- codename:值规则的代码标识,在所在实体属性中具有唯一性。
- name:值规则的显示名称,用于在建模工具和生成代码中标识规则用途。
- vrtype:值规则类型,分为NORMAL(常规)、FORMITEMS(表单项)和SCRIPT(脚本)三种,决定了规则的实现方式。
- checkdefault:是否启用默认检查,当设置为1时,该规则会在实体的核心服务层(如Service)自动执行,在数据持久化前进行基本校验。
- defaultmode:是否为属性的默认规则,每个属性都有一个默认的值规则,属性上定义的基本值规则(如最大值、最小值等)都会注入到默认值规则中。
值规则类型深度分析
常规类型(NORMAL)
常规类型是值规则中最常用的形式,支持通过条件组合实现复杂的校验逻辑。这种类型的规则通过PSDEFVRCOND成员模型构建条件树,支持AND/OR逻辑组合,能够满足绝大多数业务校验需求。例如,订单金额必须大于0且小于账户余额,这种涉及多个条件关联的校验就可以通过常规类型实现。
表单项类型(FORMITEMS)
这种特殊类型的值规则能够自动从指定的编辑表单(PSDEFORM)中提取非空规则构建属性值规则。当业务需求中表单字段的必填性需要动态调整时,这种机制显得尤为重要。例如,在订单编辑界面中,普通用户只需要填写基本信息,而VIP用户需要填写额外信息,通过FORMITEMS类型可以动态适应这种变化。
脚本类型(SCRIPT)
对于无法通过标准条件表达的复杂业务规则,脚本类型提供了最大的灵活性。通过customcode属性嵌入Groovy脚本,可以访问系统运行时对象(sys)和当前数据对象(entity),实现任意复杂的校验逻辑。例如,校验银行卡号是否符合Luhn算法,或者校验身份证号码的合法性等。
逻辑所有者与执行环境
ruleholder属性定义了值规则的执行环境,包括:
- 后台(1):仅在后端服务中执行
- 前台(2):仅在前端界面中执行
- 后台及前台(3):全栈执行(默认)
这种设计允许开发人员根据业务需求精确控制校验的执行时机和位置。例如,用户体验相关的校验(如输入格式提示)可以仅在前端执行以提升响应速度,而关键业务规则校验则需要在后端重复执行以确保数据安全。
模型关系体系
PSDEFVALUERULE通过外键关系与多个模型建立关联:
- 父模型:PSDATAENTITY(实体)和PSDEFIELD(属性),确保值规则属于特定的实体属性
- 成员模型:PSDEFVRCOND(值规则条件),构建具体的校验条件
- 引用模型:可关联PSDEFORM(编辑表单)、PSSYSDYNAMODEL(动态模型)等
这种关系体系使得值规则能够融入整体的模型架构,与其他模型协同工作。
PSDEFVRCOND条件模型详解
条件类型体系
PSDEFVRCOND提供了丰富的条件类型,覆盖了各种校验场景:
条件组(GROUP)
条件组支持AND和OR两种逻辑操作,可以嵌套构建复杂的条件树。groupnotflag属性支持对整组条件进行逻辑取反,keycondflag标识关键条件,确保在OR逻辑中某些条件必须满足。
数据集范围(VALUERANGE)
校验属性值是否存在于指定数据集中,适用于外键关联校验。例如,校验订单中的客户ID是否存在于有效的客户列表中。
数值范围(VALUERANGE2)
针对数值型属性的范围校验,支持开区间和闭区间设置,参数精细控制包含与否。
值清单范围(VALUERANGE3)
校验属性值是否存在于指定清单中,可自定义分隔符合。
正则表达式(REGEX)
通过正则表达式进行模式匹配,适用于格式校验,如邮箱、电话、身份证号等。
字符长度(STRINGLENGTH)
校验字符串长度的范围,支持最小值和最大值的设置。
查询计数(QUERYCOUNT)
基于数据查询结果的计数校验,适用于存在性检查或数量限制场景。
条件参数系统
不同的条件类型使用不同的参数机制:
- paramtype:定义条件值的来源,如ENTITYFIELD(实体属性)、CURTIME(当前时间)
- psdbvalueopid:定义比较操作符,包括EQ、NOTEQ、GT、LT等
- 条件特定参数:如VALUERANGE2使用param5-param8控制范围边界
条件组合的高级应用
通过条件的嵌套组合,可以实现极其复杂的业务规则。例如,一个订单校验规则可能包含:金额必须为正数(SIMPLE条件)、客户必须有效(VALUERANGE条件)、订单编号格式正确(REGEX条件),这些条件通过AND组合,同时某些条件可能通过OR提供替代校验路径。
应用场景分析
场景一:电商订单系统校验
在电商系统中,订单数据的完整性至关重要。PSDEFVALUERULE可以应用于:
订单金额校验
psdefvaluerule(checkdefault: 1, defaultmode: 1, codename: "OrderAmountRule", name: "订单金额校验", psdefid: "ECommerce.ORDER.AMOUNT", psdeid: "ECommerce.ORDER", vrtype: "NORMAL"
){psdefvrcond(name: "金额正数校验", condtype: "GROUP", groupop: "AND"){psdefvrcond(psdbvalueopid: "GT", condvalue: "0", name: "大于0", condtype: "SIMPLE")psdefvrcond(psdbvalueopid: "LTANDEQ", paramtype: "ENTITYFIELD", condvalue: "ACCOUNT_BALANCE", name: "小于等于账户余额", condtype: "SIMPLE")}
}
库存校验
psdefvaluerule(codename: "InventoryCheck", name: "库存数量校验", psdefid: "ECommerce.ORDER.QUANTITY", psdeid: "ECommerce.ORDER", vrtype: "VALUERANGE"
){psdefvrcond(majorpsdeid: "ECommerce.PRODUCT", majorpsdedsid: "ECommerce.PRODUCT.AvailableInventory",name: "库存可用性检查", condtype: "VALUERANGE")
}
场景二:金融系统风险控制
在金融领域,数据校验涉及严格的合规要求:
交易金额风控
psdefvaluerule(checkdefault: 1,codename: "TransactionRiskControl",name: "交易风控规则",psdefid: "Finance.TRANSACTION.AMOUNT",psdeid: "Finance.TRANSACTION",vrtype: "SCRIPT",customcode: """def amount = entity.get("AMOUNT")def dailyLimit = entity.get("DAILY_LIMIT")def usedAmount = entity.get("TODAY_USED")if(amount <= 0) return "交易金额必须大于0"if(amount + usedAmount > dailyLimit) return "超过每日交易限额"if(amount > 50000) {// 大额交易需要额外验证if(!entity.get("LARGE_APPROVED")) return "大额交易需要审批"}return true"""
)
场景三:医疗信息系统数据质量
在医疗信息系统中,患者数据的准确性关乎生命安全:
患者信息完整性
psdefvaluerule(checkdefault: 1,codename: "PatientInfoIntegrity",name: "患者信息完整性校验",psdefid: "Medical.PATIENT.BIRTHDATE",psdeid: "Medical.PATIENT",vrtype: "NORMAL"
){psdefvrcond(name: "基本信息组", condtype: "GROUP", groupop: "AND"){psdefvrcond(psdbvalueopid: "ISNOTNULL", name: "出生日期必填", condtype: "SIMPLE")psdefvrcond(condvalue: "^\\d{4}-\\d{2}-\\d{2}$", name: "日期格式校验", condtype: "REGEX")psdefvrcond(psdbvalueopid: "LTANDEQ", paramtype: "CURTIME", condvalue: "", name: "出生日期不能晚于当前时间", condtype: "SIMPLE")}
}
模型关系图例
该图展示了PSDEFVALUERULE在iBizModel体系中的位置及其主要关系。值规则模型作为实体属性的扩展,通过条件项构建具体规则,同时可以被行为值规则和表单项值规则引用,形成完整的校验体系。
完整DSL建模示例
综合业务场景:订单管理系统值规则定义
//iBizModelDSL建模指令,目标:定义订单管理系统的完整值规则体系// 定义实体引用
def de_order = "OrderManagement.ORDER"
def de_customer = "OrderManagement.CUSTOMER"
def de_product = "OrderManagement.PRODUCT"// 1. 订单基本信息校验规则
psdefvaluerule(checkdefault: 1,defaultmode: 1,codename: "OrderBasicValidation",name: "订单基本信息校验",psdefid: de_order + ".ORDER_NO",psdeid: de_order,vrtype: "NORMAL"
){psdefvrcond(name: "订单编号规则组", condtype: "GROUP", groupop: "AND"){psdefvrcond(psdbvalueopid: "ISNOTNULL", name: "订单编号必填", condtype: "SIMPLE")psdefvrcond(condvalue: "^ORD\\\\d{10}$", name: "订单编号格式", condtype: "REGEX")psdefvrcond(name: "编号长度校验", condtype: "STRINGLENGTH", param3: 10, param4: 15)}
}// 2. 订单时间校验规则
psdefvaluerule(checkdefault: 1,codename: "OrderTimeValidation",name: "订单时间校验规则",psdefid: de_order + ".ORDER_DATE",psdeid: de_order,vrtype: "NORMAL"
){psdefvrcond(name: "时间逻辑组", condtype: "GROUP", groupop: "AND"){psdefvrcond(psdbvalueopid: "ISNOTNULL", name: "订单日期必填", condtype: "SIMPLE")psdefvrcond(psdbvalueopid: "LTANDEQ", paramtype: "CURTIME", name: "不能晚于当前时间", condtype: "SIMPLE")psdefvrcond(name: "日期范围组", condtype: "GROUP", groupop: "AND"){psdefvrcond(psdbvalueopid: "ISNOTNULL", name: "开始时间必填", condtype: "SIMPLE", customdefname: "START_TIME")psdefvrcond(psdbvalueopid: "ISNOTNULL", name: "结束时间必填", condtype: "SIMPLE", customdefname: "END_TIME")psdefvrcond(paramtype: "ENTITYFIELD", condvalue: "END_TIME", psdbvalueopid: "LTANDEQ", name: "开始时间≤结束时间", condtype: "SIMPLE", psdefid: de_order + ".START_TIME")}}
}// 3. 客户关联校验
psdefvaluerule(checkdefault: 1,codename: "CustomerValidation",name: "客户有效性校验",psdefid: de_order + ".CUSTOMER_ID",psdeid: de_order,vrtype: "NORMAL"
){psdefvrcond(majorpsdeid: de_customer,majorpsdedsid: de_customer + ".ActiveCustomers",name: "客户必须有效",condtype: "VALUERANGE")
}// 4. 金额计算校验
psdefvaluerule(checkdefault: 1,codename: "AmountCalculation",name: "金额计算校验",psdefid: de_order + ".TOTAL_AMOUNT",psdeid: de_order,vrtype: "NORMAL"
){psdefvrcond(name: "金额逻辑组", condtype: "GROUP", groupop: "AND"){psdefvrcond(psdbvalueopid: "GT", condvalue: "0", name: "金额必须大于0", condtype: "SIMPLE")psdefvrcond(name: "计算公式校验", condtype: "GROUP", groupop: "OR"){psdefvrcond(paramtype: "ENTITYFIELD", condvalue: "UNIT_PRICE", psdbvalueopid: "MULTIPLY", paramtype2: "ENTITYFIELD", condvalue2: "PRODUCT_QUANTITY", name: "单价×数量", condtype: "SIMPLE")psdefvrcond(psdbvalueopid: "EQ", paramtype: "ENTITYFIELD", condvalue: "MANUAL_AMOUNT", name: "或等于手动输入金额", condtype: "SIMPLE")}}
}// 5. 状态流转校验
psdefvaluerule(checkdefault: 1,codename: "StatusTransition",name: "状态流转校验",psdefid: de_order + ".STATUS",psdeid: de_order,vrtype: "NORMAL"
){psdefvrcond(name: "状态值范围", condtype: "VALUERANGE3", condvalue: "PENDING;CONFIRMED;SHIPPED;COMPLETED;CANCELLED")
}// 7. 配送信息校验(使用表单驱动)
psdefvaluerule(checkdefault: 0,codename: "DeliveryFormValidation",name: "配送表单校验",psdefid: de_order + ".DELIVERY_ADDRESS",psdeid: de_order,vrtype: "FORMITEMS",psdeformid: "OrderManagement.ORDER.DeliveryForm"
)
高级特性应用示例
// 条件组嵌套与关键条件应用
psdefvaluerule(codename: "AdvancedValidation",name: "高级校验规则",psdefid: de_order + ".PRIORITY",psdeid: de_order,vrtype: "NORMAL"
){psdefvrcond(name: "优先级校验主组", condtype: "GROUP", groupop: "OR"){// 关键条件组:必须满足的条件psdefvrcond(name: "关键条件组", condtype: "GROUP", groupop: "AND", keycondflag: 1){psdefvrcond(psdbvalueopid: "ISNOTNULL", name: "优先级必填", condtype: "SIMPLE")psdefvrcond(name: "优先级范围", condtype: "VALUERANGE2", param7: "1", param8: "5")}// 替代条件组:VIP客户特殊规则psdefvrcond(name: "VIP客户特殊规则", condtype: "GROUP", groupop: "AND"){psdefvrcond(majorpsdeid: de_customer, majorpsdedsid: de_customer + ".VIPCustomers",name: "VIP客户检查", condtype: "VALUERANGE", psdefid: de_order + ".CUSTOMER_ID")psdefvrcond(name: "VIP优先级扩展", condtype: "VALUERANGE2", param7: "1", param8: "10")}}
}// 系统值规则引用示例
psdefvaluerule(codename: "EmailFormatValidation",name: "邮箱格式校验",psdefid: de_customer + ".EMAIL",psdeid: de_customer,vrtype: "NORMAL"
){psdefvrcond(condtype: "SYSVALUERULE", pssysvalueruleid: "GlobalEmailRule")
}
总结
实体值规则模型(PSDEFVALUERULE)是iBizModel体系中确保数据质量的核心组件,通过标准化的模型定义和灵活的条件组合机制,为企业级应用提供了强大的数据校验能力。从简单的格式校验到复杂的业务规则验证,PSDEFVALUERULE都能提供合适的解决方案。
该模型的价值不仅体现在技术实现上,更重要的是它使得业务规则能够以声明式的方式定义和管理,大大提升了系统的可维护性和扩展性。通过与iBizModel其他模型的紧密集成,值规则能够在前端界面、后端服务和数据持久化层形成统一的校验体系,确保数据在整个应用生命周期中的一致性和正确性。
在实际应用中,开发人员应该根据业务需求合理选择值规则类型,充分利用条件组合能力,构建既满足业务要求又保持良好性能的校验体系。同时,通过脚本类型的灵活性和系统值规则的可复用性,可以在保证规范性的前提下应对各种特殊业务场景。