借 Odoo 的模块契约,不借它的运行时补丁
已启用 7 个模块,33 个对象类型,20 条命令,4 张扩展表。注册表在启动时由 manifest 聚合并校验;本页所有数据来自注册表,不是手写。
正在绘制…
只能依赖箭头指向的模块;反向要说话只能发事件。CI 用 dependency-cruiser 强制:模块之间零源码 import。
正在绘制…
虚线 = 1:1 扩展表,箭头指向被扩展对象的 owner 模块;实线 = 命令钩子,箭头指向命令 owner 模块;粗线 = 事件订阅,箭头从发事件的模块指向订阅者。
持久层 · 阶段 2
下面的数据直接来自 Postgres:每模块一个 schema,迁移按依赖拓扑顺序执行并记进 kernel.module_record;禁用模块只改状态不删数据。 事件与审计表在数据库层拒绝 UPDATE / DELETE。
正在读取持久层…
模块清单
扩展表(1:1,主键 = 被扩展对象的 ObjectId)
| 表 | 扩展者 → owner | 字段 | 说明 |
|---|---|---|---|
| eng.property_ext | eng → party.Property | surveyedAreaSqm: number?, surveyNote: text?, surveyedAt: date? | 工程可补勘测数据,落 eng.property_ext,不改 party 的表。 |
| scm.party_ext | scm → party.Party | supplierRating: number?, leadTimeDays: number? | 落 scm.party_ext。供应商仍是同一个 Party。 |
| fin.party_ext | fin → party.Party | taxNo: string?, invoiceTitle: string?, bankAccount: string? | 落 fin.party_ext。不是第二张客户表:主键就是 Party 的 ObjectId。 |
| fin.contract_ext | fin → crm.Contract | paymentTerms: text?, depositRatio: number? | 落 fin.contract_ext。crm 不需要懂账期。 |
命令与它的管线
主 handler 永远属于对象 owner 模块。别的模块只能在前面否决、在后面追加,或订阅事件。
| 命令 | owner | 钩子 | 事件 → 订阅者 |
|---|---|---|---|
RegisterParty 登记参与方 | party | — | PartyRegistered |
RegisterProperty 登记房屋 | party | — | PropertyRegistered |
UpdateParty 更新参与方 | party | fin:after | PartyUpdated |
GrantPartyRole 授予角色 | party | — | PartyRoleGranted |
MergeParty 合并参与方 | party | — | PartyMerged |
CaptureLead 捕获线索 | crm | — | LeadCaptured → decision |
ProposeScheme 提出方案 | crm | — | SchemeProposed |
IssueQuote 签发报价 | crm | — | QuoteIssued → decision |
DraftContract 起草合同 | crm | fin:after | ContractDrafted |
SignContract 签署合同 | crm | fin:validate, fin:after | ContractSigned → eng, decision |
OpenProject 打开项目 | eng | — | ProjectOpened → decision |
RequestMaterials 要货 | eng | scm:validate | MaterialsRequested → scm, decision |
AssignCrew 召集施工团队 | eng | — | CrewAssigned |
StartNode 开始施工节点 | eng | — | NodeStarted |
CompleteNode 完成施工节点 | eng | — | NodeCompleted → scm, decision |
AcceptHandover 交付验收 | eng | — | HandoverAccepted → fin, decision |
RegisterMaterial 登记材料 | scm | — | MaterialRegistered |
PlacePurchaseOrder 下采购单 | scm | — | PurchaseOrderPlaced → fin, decision |
ReviewContractFinance 财务复核合同 | fin | — | ContractFinanceReviewed |
RecordPayment 登记回款 | fin | — | PaymentRecorded → crm, decision |
正在绘制…
Odoo 里 fin 可以 super() 改写签约;这里 fin 只能 validate 否决、after 追加。审计里每一步都能看到是哪个模块干的。
正在绘制…
任何一步失败进程不起。与 Odoo 的运行时装载相比,不存在「装了一半」的数据库。