
大家好,接着上篇本体驱动建模规范的内容。还是用我前面的合同管理需求作为案例,让AI输出完整的本体模型和YAML源代码文件。
首先回顾下上篇文章谈到的本体建模方案关键内容:










具体的原始需求内容如下:
我现在有一个构想,就是对于一个小型的软件系统通过本体建模的思路来进行构建。
核心的本体模型就包括了对象,行为,规则。对象包括了数据和数据间的关系,行为包括了方法和事件,而规则则是可以独立出来的具体业务处理逻辑,参考完整性约束等。任何一个业务场景或功能的实现应该是来源于行为的组合,而行为本身又可能调用相关的规则。而行为本身又来源于某个对象。当然行为本身可能多个子行为形成的复合行为。为了防止长事务处理,需要参考EDA事件驱动架构,构建一个基于消息事件的解耦,通过事件链来实现完整的业务流。
也就是是一个场景可能驱动了某个行为,而行为结束后某个关键对象状态发生变化又触发了事件,而这个事件本身又被其它对象订阅,这些对象接收到消息事件后又触发了新的行为,这样就形成了完整的事件链来完成业务运作。
所以任何本体模型构建,我将其分解为了四个本体模型元文件。
请理解下我上面的思路,如果在不考虑具体的UI交互界面的情况下是否可以覆盖传统的软件需求定义,如果不能覆盖,还欠缺什么东西?












领域:合同管理(Contract Management)建模框架:本体驱动软件建模方案 v1.0建模范围:M1 对象模型 · M2 行为模型 · M3 规则模型 · M4 场景模型 · M5 主体模型文档版本:1.0 | 2026年3月
本次建模的对象是一个聚焦于销售合同生命周期管理的内部系统。系统的核心职责是在合同签字盖章生效之后,对合同档案、付款阶段、开票记录和收款状态进行全程追踪管理。
需要特别说明的是,合同的起草、审批和盖章流程不在本系统范围之内。这一边界决策对建模影响深远:合同在系统中录入即代表生效,不存在"草稿"或"审批中"的过渡状态,合同实体的生命周期因此简化为 生效 和 已关闭 两个状态,大幅降低了状态机设计的复杂度。
梳理业务需求后,识别出如下核心价值链:
合同生效录入 → 按付款阶段开票 → 客户付款 → 登记收款 → 合同关闭
这条价值链贯穿了合同管理的完整履约过程,也是本次建模的主线。围绕这条主线,系统需要支撑四类操作场景:合同信息录入(含付款条款)、开票信息录入、收款信息登记、以及多维度的合同查询。
按照"从业务词汇表出发"的建模原则,从原始需求中提取出所有名词性概念,经过去重、归类和语义澄清,最终识别出 8 个实体,分属两个域:
支撑域(4个,基础数据引用):产品(Product)、客户(Customer)、部门(Department)、人员(Employee)。这四个实体在需求中以"信息表"的形式出现,其数据由外部维护,本系统只做引用。建模时为其定义完整的属性结构,但不定义业务行为,生命周期也保持简单(启用/停用、在职/离职)。
核心域(4个,业务主体):合同(Contract)、付款条款(PaymentTerm)、开票明细(Invoice)、开票付款条款映射(InvoiceTermMapping)。
需求中存在一个典型的多对多结构:一个付款阶段可以分多次开票,多个付款阶段又可以合并为一次开票。这种双向多对多关系在对象模型中无法直接用属性引用表达,需要引入独立的关联实体来承载。
InvoiceTermMapping(开票付款条款映射)因此被识别为一个独立实体,而不是一个简单的外键字段。它包含三个核心字段:invoiceId、contractId、termId,其中 contractId 的冗余存储是有意为之——既便于数据完整性约束的表达(约束映射必须属于同一合同),也为查询提供了直接的过滤条件,避免跨三表联查。
本次建模对四种关联类型做了严格区分,体现了本体建模对语义精度的追求:
cascadeDelete: true。cascadeDelete: false。在参照完整性约束设计中,有两条约束值得特别说明:
付款比例总和约束:SUM(paymentTerm.paymentRatio) WHERE contractId == contract.contractId == 1。这是一条跨行的聚合约束,意味着单个 PaymentTerm 记录在保存时无法独立完成该校验,必须配合所有同合同条款的总和计算。在 M3 规则模型中,这条约束被拆分为两条规则分别处理(单条新增时的上限校验,以及批量录入时的精确等于100%校验)。
累计开票金额约束:SUM(invoice.invoiceAmount) WHERE contractId <= contract.totalAmount。同样是跨行聚合约束,需要实时统计该合同历史开票总额。这类约束在技术实现层面通常需要数据库触发器或应用层拦截器来保障,建模时明确标注 enforcedAt: PERSIST,提示实现层在数据持久化前必须完成校验。
从四类业务功能需求中,共识别出 9 个原子行为,分布在 4 个对象上:
对象 | 行为 | 类型 |
|---|---|---|
合同 | 录入合同、关闭合同 | COMMAND |
合同 | 查询合同列表、查询合同详情 | QUERY |
付款条款 | 创建付款条款、批量创建付款条款 | COMMAND |
开票明细 | 录入开票信息、录入收款信息、查询开票列表 | COMMAND / QUERY |
映射 | 创建开票付款条款映射 | COMMAND |
原子性约束的实践体现在:Contract_Create 行为只负责创建合同主记录,不在其内部内嵌付款条款的创建逻辑。付款条款的创建由独立的 PaymentTerm_BatchCreate 行为承担,两者通过事件链解耦。这一设计避免了"上帝方法"的出现,也让每个行为的职责边界保持清晰。
本次建模中设计了两条事件链,均体现了 EDA(事件驱动架构)的核心价值:
事件链一:合同录入 → 付款条款批量创建
Contract_Create(用户触发)
→ 产生事件 Contract.Created
→ 触发 PaymentTerm_BatchCreate(事件订阅)
→ 产生事件 PaymentTerm.BatchCreated
这条事件链将"合同录入"和"付款条款创建"解耦为两个独立的原子行为。从业务视角看,两者在同一次用户操作中完成;但从系统视角看,它们是独立的状态变更单元,任意一个失败都有明确的边界,便于错误定位和后续补偿(M6 范围)。
事件链二:开票录入 → 映射关系建立
Invoice_Create(用户触发)
→ 产生事件 Invoice.Created
→ 触发 InvoiceTermMapping_Create(事件订阅)
→ 产生事件 InvoiceTermMapping.Created
同理,开票记录的创建与开票-付款条款映射的建立解耦,支持映射关系的灵活扩展(如后续需要修改映射、追加映射等场景,不影响开票记录本身)。
查询类行为(QUERY)虽然不改变系统状态,但在本次建模中同样给予了完整的建模关注:前置条件明确了权限要求,appliedRules 引用了数据权限过滤规则(RULE-CON-004),确保查询行为本身携带了完整的权限语义,而不是依赖隐式的全局过滤。这为后续代码生成和权限审计提供了可追溯的语义基础。
规则模型的核心价值在于"剥离可复用的业务判断逻辑"。本次建模共识别出 7 条业务规则,识别标准为:
RULE-CON-002(税率合规性校验) 是复用价值最高的规则,同时被 Contract_Create 和 Invoice_Create 两个行为引用。这体现了规则模型的核心价值:税率的合规范围(如国家调整增值税率)只需在一处修改,两个行为的校验逻辑自动同步更新。
RULE-CON-003(合同关闭前置条件校验) 是本次建模中设计最为细腻的规则。原始需求没有明确说明"存在未收款开票时是否允许关闭合同",建模时做出了一个合理的业务判断:警告但不阻断。规则的返回类型被设计为 ValidationResult(包含 passed 和 warnings 两个字段),而非简单的 Boolean。这种设计将"是否允许操作"和"是否有风险提示"解耦,让行为层根据业务上下文自主决定处理策略,规则本身保持无状态的纯判断逻辑。
RULE-CON-004(合同数据权限过滤) 的规则类型为 DERIVATION(推导规则),其作用是根据当前用户的角色推导出动态的查询过滤条件,而非简单地返回 true/false。这是对 ABAC(基于属性的访问控制)的一种轻量化实现,将数据权限的"推导逻辑"从代码层提升到了规则模型层,使数据权限的变更有了明确的模型归属。
本次建模严格遵守了规则模型的设计边界:外键约束、唯一性约束等参照完整性约束统一在 M1 对象模型中定义,M3 只承载业务逻辑层面的判断规则。两者的区分标准是:参照完整性约束描述数据结构的静态合法性,业务规则描述业务操作的动态合规性。例如"付款比例总和必须等于100%"属于业务规则,因为它是对一组数据的动态聚合判断;而"付款条款必须引用存在的合同"属于参照完整性约束,因为它描述的是数据间的静态引用关系。
本次共定义 5 个业务用例和 1 个业务流程:
UC-CON-001:录入合同(含付款条款,通过事件链编排)UC-CON-002:录入开票信息(含付款条款关联,通过事件链编排)UC-CON-003:录入收款信息UC-CON-004:查询合同列表(多条件模糊查询)UC-CON-005:查询合同详情(使用 AND_SPLIT/AND_JOIN 并行查询)BP-CON-001:合同履约回款流程(跨用例的完整业务价值链)并行查询的编排:在 UC-CON-005(查询合同详情)中,合同详情页需要同时展示付款条款列表和开票明细列表。场景模型使用 AND_SPLIT → AND_JOIN 结构表达了这两个查询的并行执行语义,避免了串行查询带来的不必要等待,同时在模型层面明确了两者需要聚合后一起返回的约束。
循环结构的表达:BP-CON-001(合同履约回款流程)包含一个业务循环:一个合同可以经历多轮"开票→收款"。场景模型通过 XOR_SPLIT 网关表达了这一循环结构,条件分支判断"是否所有付款阶段均已收款",满足条件则进入合同关闭,否则返回继续执行开票用例。这是 EDA 架构下复杂业务流程编排能力的体现。
每个用例都定义了可预期的异常路径(exceptionFlows)和替代路径(alternativeFlows)。典型的设计是 UC-CON-002 中的"合并多个付款阶段开票"替代路径,使用 AND_SPLIT/AND_JOIN 为每个付款阶段分别建立映射,同时保证所有映射建立完成后才结束用例。这一设计优雅地处理了"一次开票对应多个付款阶段"的业务变体,而不需要修改原子行为本身的定义。
本次识别出 4 个人类参与者,对应 4 个角色:销售人员、财务人员、部门经理、合同管理员。角色之间设计了继承链:
ROLE-SALES(销售)
↓ 继承
ROLE-DEPT-MANAGER(部门经理)
↓ 继承
ROLE-CON-ADMIN(合同管理员)
ROLE-FINANCE(财务) ← 独立分支,专注财务操作
继承设计遵循最小权限原则:下级角色只拥有上级角色的权限子集,上级角色在继承的基础上扩展权限范围,而非重新定义。财务人员被设计为独立角色分支,因为其权限体系与销售线有本质区别——财务对数据的需求是"全范围只读+收款写入",而销售线是"受范围读+本人写入"。
数据权限控制是本次主体模型设计的核心难点。系统中存在三个数据可见范围:本人负责的合同(销售人员)、本部门的合同(部门经理)、全部合同(管理员和财务)。
这三个范围通过 RULE-CON-004(数据权限推导规则)动态生成查询过滤条件,而不是在权限定义中硬编码。这一设计的好处是:当数据范围规则调整时(例如新增"大区经理"角色,可见跨部门数据),只需修改 M3 中的规则逻辑,M5 的权限定义和 M2 的行为定义均无需改动,充分体现了本体建模各层正交分解的优越性。
为便于业务验证,M5 模型末尾附加了权限矩阵速查表,将 5 个核心权限与 4 个角色的关系一目了然地呈现。这不仅是文档工具,也是一种模型内置的完整性检查手段——通过矩阵可以直观地发现权限的"空白区"或"重叠区",确保权限设计既不过度开放也不过度收紧。
原始需求描述了"开票明细"和"开票信息和付款阶段的对应表",但没有明确说明两者之间的关系类型。建模过程中通过分析"一个付款阶段可分多次开票、多个付款阶段可合并一次开票"这两句话,识别出了多对多关系的语义,进而决定引入独立的映射实体。这体现了本体建模的核心价值:将隐性的业务语义转化为显式的模型结构。
本次建模在以下几个维度都做到了边界清晰:参照完整性约束(M1)vs 业务规则(M3)的边界、原子行为(M2)vs 编排逻辑(M4)的边界、角色定义(M5)vs 数据权限推导(M3规则)的边界。每一条边界的清晰,都意味着一个独立的变化维度,使系统各部分可以独立演进而不相互干扰。
将"合同录入"和"付款条款创建"通过事件链解耦,是本次建模中技术价值最为显著的设计决策。表面上增加了事件机制的复杂度,但带来了三个实质性收益:行为边界清晰(每个行为只做一件事)、失败隔离(付款条款创建失败不污染合同录入成功的事实)、以及扩展性(未来如需在合同创建后触发通知、权限初始化等行为,只需订阅 Contract.Created 事件,无需修改合同录入行为本身)。
经过完整的 M1 到 M5 建模,以下事项在本阶段属于已知的未覆盖范围,待后续迭代补充:
Contract_QueryList 支持多维度模糊查询,在数据量增大时可能面临性能压力,建议在 M7 中标注索引策略要求(如合同名称、签订时间、部门 ID 的复合索引)。本次合同管理系统的本体建模,从 8 个实体、9 个行为、7 条规则、5 个用例,到 4 个角色和 5 类权限,系统性地覆盖了原始需求中描述的全部业务功能,同时通过本体框架的正交分层设计,将数据结构、操作逻辑、业务规则、流程编排和权限控制清晰地分离在五个独立的元文件中。
这套模型文件不仅是一份需求文档,更是一份设计契约——它定义了系统的语义边界,为后续的代码生成、数据库设计、接口定义和测试用例编写提供了统一的语义基础,使整个开发过程在同一套业务语言体系下协作推进。
文档生成于 2026年3月 | 基于本体驱动软件建模方案 v1.0
具体源代码文件参考下载:
通过网盘分享的文件:合同管理本体建模.zip 链接:
https://pan.baidu.com/s/1wlGj1oTwI3sOJwM13Wo36w?pwd=249r 提取码: 249r
注:欢迎各位AI 编程爱好者基于这套本体模型去通过AI编程的方式实现整个系统。我自己也正在做这个尝试。