9.3 KiB
9.3 KiB
领域事件清单(P19 / P19+IM-1 / P19+ERP-3 / P19+AI-1)
快照日期:2026-03-10
目标:冻结 hyb-oa 当前采购与资产域的标准领域事件名,并补充 P19+IM-1 已实际消费的 IM 通知类型清单,以及 P19+ERP-1 / ERP-3 / AI-1 已实际落地的消费映射,作为后续 ERP / IM / AI 适配的事实源。
1. 使用原则
- 本文档同时维护两类事实:
- 领域事件名(长期稳定边界)
- IM 一期已消费的通知类型(当前运行时实现)
- 未来若继续扩展 Outbox / webhook / MQ,领域事件名与最小载荷必须保持向后兼容。
- 领域事件只表达“已经发生的业务事实”,不表达待办命令。
2. 标准领域事件清单
| 事件名 | 触发时机 | 领域对象 | 最小载荷字段 | 推荐消费者 | 备注 |
|---|---|---|---|---|---|
purchase_request.submitted |
采购申请提交成功后 | purchase_request |
purchaseRequestId, requestNo, applicantId, departmentId, legalEntityId, costCenterId, supplierId, budgetPoolId, totalAmount, status |
IM、ERP、AI | 表示进入 reviewing |
purchase_request.approved |
采购申请审批通过后 | purchase_request |
purchaseRequestId, requestNo, approvedBy, legalEntityId, costCenterId, supplierId, budgetPoolId, totalAmount, status |
ERP、IM、AI | 对应预算 confirm 已完成 |
purchase_request.rejected |
采购申请审批驳回后 | purchase_request |
purchaseRequestId, requestNo, actorId, reason, status |
IM、AI | 若存在预算预留,应已释放 |
purchase_request.withdrawn |
申请人撤回采购申请后 | purchase_request |
purchaseRequestId, requestNo, actorId, status |
IM、AI、ERP 补偿 | 表示由 reviewing 回到 draft |
purchase_order.archived |
PO/合同归档保存成功后 | purchase_order_archive |
purchaseOrderArchiveId, purchaseRequestId, requestNo, poNo, contractNo, archivedAt, totalAmount |
ERP、AI | ERP-2 以此驱动 accrual journal 与 archive summary |
asset.card.created |
资产卡片创建成功后 | asset_card |
assetId, assetNo, name, categoryId, legalEntityId, costCenterId, purchaseRequestId, status |
ERP、IM、AI | 资产域不接 workflow |
asset.assigned |
资产领用成功后 | asset_card |
assetId, assetNo, employeeId, assignedAt, location, status |
IM、AI | 对应新增 open assignment |
asset.returned |
资产归还成功后 | asset_card |
assetId, assetNo, employeeId, returnedAt, location, status |
IM、AI | 对应关闭 open assignment |
asset.transferred |
资产调拨成功后 | asset_card |
assetId, assetNo, fromEmployeeId, toEmployeeId, fromLocation, toLocation, transferredAt, status |
IM、AI | 可只改位置,不一定改归属人;ERP-3 一期不消费 |
inventory_check.completed |
盘点任务完成后 | inventory_check |
inventoryCheckId, checkNo, scopeType, scopeRefId, completedAt, itemCount, summary |
ERP、IM、AI | summary 建议包含 matched / missing / extra / damaged 计数 |
3. 事件名与运行时对象映射
| entityType | 推荐事件前缀 | 当前事实源 |
|---|---|---|
purchase_request |
purchase_request.* |
P17A / P17B |
purchase_order_archive |
purchase_order.* |
P17B / P19+ERP-2 |
asset_card |
asset.* |
P18A / P18B |
inventory_check |
inventory_check.* |
P18B |
4. 最小 Envelope 建议
未来若继续扩展事件投递,建议统一使用如下 envelope:
{
"eventName": "purchase_request.submitted",
"eventId": "uuid",
"occurredAt": "2026-03-08T12:18:10+08:00",
"actorId": "user-id",
"entityType": "purchase_request",
"entityId": "entity-id",
"payloadVersion": 1,
"payload": {}
}
5. 兼容性规则
- 事件一旦对外承诺,名称不得随意修改。
- 新增字段必须保持向后兼容;删除字段需要单独版本升级。
- 载荷字段命名应与 HTTP camelCase 输出保持一致,不直接暴露数据库 snake_case 列名。
6. 明确不纳入当前事件主表的事项
purchase_order.cancelled:待未来采购撤销 / 作废专项再冻结inventory_check.started:当前不是对外关键事实源asset.repaired/asset.retired:待未来维修 / 报废专项后再定义
7. 推荐消费场景
- IM:采购审批结果、报销结果、资产领用归还、盘点完成提醒
- ERP:采购审批 commitment、PO/合同归档 accrual / summary、资产卡片 ledger summary、盘点完成摘要
- AI:审批摘要、异常提示、主数据重复建议、盘点结果总结
8. P19+IM-1 已消费通知类型
说明:IM 一期运行时并未新增新的领域事件名,而是基于现有业务事实统一沉淀为通知类型,再通过
notification.imOutbox 异步派发。
| 通知类型 | 当前来源事实 | 默认 targetType | 默认 targetPath | 说明 |
|---|---|---|---|---|
workflow.task_assigned |
workflow 新待办 / 转审待办 | workflow_task |
/workflow/tasks/:taskId |
当前唯一待办类通知 |
reimbursement.approved |
报销审批通过 | reimbursement_form |
/reimbursements/:id |
结果通知 |
reimbursement.rejected |
报销驳回 | reimbursement_form |
/reimbursements/:id |
结果通知 |
reimbursement.returned |
报销退回 | reimbursement_form |
/reimbursements/:id |
结果通知 |
reimbursement.paid |
报销付款完成 | reimbursement_form |
/reimbursements/:id |
财务结果通知 |
leave.approved |
请假审批通过 | leave_request |
/leave-requests |
结果通知 |
leave.rejected |
请假驳回 | leave_request |
/leave-requests |
结果通知 |
purchase_request.approved |
采购审批通过 | purchase_request |
/purchase-requests |
结果通知 |
purchase_request.rejected |
采购驳回 | purchase_request |
/purchase-requests |
结果通知 |
asset.assigned |
资产领用成功 | asset_card |
/assets |
通知新领用人 |
asset.returned |
资产归还成功 | asset_card |
/assets |
通知原持有人 |
asset.transferred |
资产调拨成功 | asset_card |
/assets |
通知归属变更涉及人员 |
inventory_check.completed |
盘点完成 | inventory_check |
/inventory-checks |
通知创建人与 finance_mgr 角色 |
9. 当前仍未接入 IM 的冻结事件
purchase_request.submittedpurchase_request.withdrawninventory_check.started
这些事件名称仍保留在长期蓝图中,但不属于 P19+IM-1 的首批协同覆盖范围。
10. P19+ERP-1 / ERP-3 已实现消费映射
P19+ERP-1没有新增新的领域事件名;ERP 一期真正落地消费的既有业务事实是reimbursement.paid,运行时会先构建标准化ReimbursementJournalSlice,再通过erp.journal.export写入IntegrationOutbox异步派发。ReimbursementJournalSlice.sourceEventName固定为reimbursement.paid,用于标记该凭证切片来源于“报销付款完成”这一既有业务事实;历史erp.reimbursement.paidoutbox 仍继续兼容。P19+ERP-2正式冻结新增领域事件名purchase_order.archived,并消费两类采购事实:purchase_request.approved→PurchaseCommitmentJournalSlice→erp.journal.exportpurchase_order.archived→PurchaseAccrualJournalSlice+purchase_order_archivesummary →erp.journal.export/erp.procurement.export
- 采购 ERP 成功派发后,运行时统一把外部 ERP 编号回写到
integration_bindings,分别对应purchase_request_commitment_journal、purchase_order_accrual_journal、purchase_order_po、purchase_order_contract。 - ERP 主数据同步(
LegalEntity/CostCenter/Supplier)仍属于主动 Pull,不作为新的领域事件名纳入本表;IntegrationSyncState也继续只承载主数据资源级同步状态,而不承载采购或资产单据轨道。 P19+ERP-3一期已落地资产消费映射:asset.card.created→AssetLedgerSummaryPayload→erp.asset.exportPATCH /api/assets/:id导致legalEntityId / costCenterId / status(retired|archived)变化 → 资产 ERP 内部集成事实 →erp.asset.export
- 资产 ERP 成功派发后,运行时统一把外部 ERP 资产编号回写到
integration_bindings(provider=erp, entity_type=asset_erp_card);领用 / 归还 / 位置调拨仍不进入 ERP 消费映射。
11. P19+AI-1 已实现消费说明
P19+AI-1不新增新的公开领域事件名;AI 一期只消费既有报销、采购、资产事实,并保持同步只读建议形态。- 报销详情 AI 建议消费的事实锚点为
reimbursement_form当前详情、预算提示与待办节点;采购详情 AI 建议消费purchase_request当前详情、归档摘要与资产候选信息;资产详情 AI 建议消费asset_card当前卡片摘要与财务维度信息。 - AI 一期的三条建议接口均采用白名单快照,不提升为长期公共事件,也不改变
asset.card.created、purchase_request.*、purchase_order.archived等既有事件名的稳定性承诺。 - AI 输出仅形成
summary / riskHints / nextActions结构化建议,并通过审计动作AI_SUGGESTION_REQUESTED记录请求摘要;不写库、不派发 Outbox、不回写业务状态。