在 MetaERP 里,AP 事件 → 资金预算 Cube(CASH_CUBE)不是写 SQL 视图硬算,也不是像 EBS 那样只在 GL 层做 Funds Check,而是走“业务事件注册 → 事件映射器 → 维度解析器 → 金额表达式 → Cube 写入层 → 控制规则绑定” 的元数据配置链。
下面按实施落地口径给你拆,可以直接拿去配。
一、先理清两个 Cube 的边界(别配错地方)
Cube | 用途 | AP 事件是否写 |
|---|---|---|
| 经营预算(费用/成本实际消耗) | 写 Actual(发票验证时) |
| 项目级资源占用 | 按项目维度写 |
| 资金预算/现金流计划 | 写付款排程/净额/实际出款 |
| 合并视角 | 读 CASH_CUBE 投影 |
本题配的是CASH_CUBE,不是 ORG_CUBE。很多人踩坑就是把
InvoiceValidated直接当现金流出写进 CASH_CUBE。
二、配置总链路(MetaERP 控制台路径逻辑)
【1】元数据对象定义 └─ 业务对象:AP_INVOICE / AP_PAYMENT / IC_SETTLEMENT 【2】事件中心注册 Event Catalog └─ 声明 AP 事件及载荷(payload) 【3】事件→Cube 映射 Event-to-Cube Mapping └─ 选 Cube=CASH_CUBE,选 Layer 【4】维度解析器 Dimension Resolver └─ 把 AP 字段解析成 Cube 维度 【5】金额表达式 Amount Expression └─ 原币/本位币/集团币 + 汇率口径 【6】写入规则 Write Rule └─ 增量写 / 重算 / 幂等键 【7】资金控制规则 Fund Control Rule └─ 占额度逻辑、拦截动作 【8】版本与场景 Version Binding └─ BASELINE / FC1 / 汇率压力测试三、AP 关键事件 → CASH_CUBE 映射清单(核心表)
1. 事件注册(Event Catalog)
事件编码 | 触发点 | 是否进 CASH_CUBE | Layer |
|---|---|---|---|
| PO 审批 | 是(预测层) |
|
| 收货暂估 | 是 |
|
| 发票验证通过(多账簿均过) | 是 |
|
| 按付款条件拆到期 | 是(主写入点) |
|
| 预付款发票 | 是(负向占用) |
|
| 预付冲发票 | 冲减 SCHEDULED_PAY | 调整层 |
| 内部往来轧差 | 是(净额覆盖) |
|
| 付款批确认 | 是 |
|
| 银行回盘 | 是 |
|
| 应付重估 | 可选单列 |
|
✅ 经验原则:CASH_CUBE 主口径以
PaymentSchedule.Created为现金基线,Invoice.Validated只做负债校验,不直接当现金流。
2. 事件映射配置样例(控制台 YAML 风格)
mapping_id: AP2CASH_VALIDATED_TO_SCHED cube: CASH_CUBE source_event: AP.PaymentSchedule.Created condition: "invoice.status='VALIDATED' and invoice.holdFlag=false" layers: - name: SCHEDULED_PAY write_mode: UPSERT idempotency_key: "pay_sched_id" dimensions: resolver: ap_dim_resolver measures: - field: schedule_line.amount_orig currency: orig_currency measure_name: ORIG_AMT - field: expr(schedule_line.amount_orig * rate_pred_pay) currency: group_currency measure_name: GROUP_AMT - field: expr(schedule_line.amount_orig * rate_pred_pay) currency: pay_entity_base_ccy measure_name: LE_BASE_AMT period_logic: "by schedule_line.due_date -> YYYYMM"四、维度解析器配置(AP 字段 → CASH_CUBE 维度)
这是配置里最细的一块,决定“钱算到哪个法人、哪个池、哪个项目”。
CASH_CUBE 维度 | AP 来源字段 | 解析逻辑 |
|---|---|---|
| Invoice.LE_Id | 发票所属法人(负债法人) |
| Payment.LE_Id | 出钱法人(代付场景≠LE) |
| Invoice.Book_Id | 中国准则/IFRS/管理账(投影用) |
| Invoice.Currency_Code | 原币池 |
| 折算表达式 | 集团币 |
| 配置项 | 发票日/预测日/银行日 |
| Invoice.Distribution.CostCenter | 分配行派生 |
| Invoice.Distribution.ProjectId | 项目采购 |
| Supplier.Class | 外部/内部 |
| Invoice.IcTrxId is not null | Y/N,参与 netting |
| PayEntity.PoolId | 资金池分组 |
| Payment.BankAcctId | 出款账户 |
| 事件映射指定 | SCHEDULED_PAY / NETTED_IC… |
| due_date / pay_date | 可切日/周/月 |
解析器示例(伪配置)
ap_dim_resolver: LegalEntity = invoice.header.le_id PayEntity = coalesce(payment.le_id, invoice.header.le_id) Currency = invoice.header.currency_code CostCenter = first(invoice.distributions.cost_center) Project = first(invoice.distributions.project_id) IC_Flag = case when invoice.ic_trx_id is not null then 'Y' else 'N' end CashPool = lookup(pay_entity.pool_id)五、金额与汇率配置(多币种关键)
CASH_CUBE 同一条记录通常写三列 measure:
Measure | 取值 | 汇率 |
|---|---|---|
| 付款计划行原币金额 | 无 |
| 出钱法人本位币 | 发票日汇率(锁定) |
| 集团币 | 可配置:预测汇率版 / 期末汇率版 |
配置点:
rate_strategy: VALIDATED_PAYABLE -> INVOICE_DATE_RATE SCHEDULED_PAY -> FORECAST_PAY_RATE # 可滚动更新 ACTUAL_CASH -> BANK_SETTLE_RATE这样同一笔 AP,经营账用发票汇率,资金计划用预测汇率,银行实付用结算汇率,三者差异自动进 FX 层,不污染主现金流。
六、多准则下的映射处理
同一张发票有多账簿分录,但 CASH_CUBE 不按账簿各写一遍现金,而是:
- 写一次现金流事实(按 PayEntity + 原币)
- 用
Ledger维度做投影标签 - 准则差异项打标排除:
- IFRS 准备、折现、暂估调整 →
IS_CASH_ITEM = N - 只进 ORG_CUBE,不进 CASH_CUBE
- IFRS 准备、折现、暂估调整 →
配置片段:
filter: exclude_when: "gl_line.account in (PROVISION_ACCT, DISCOUNT_ACCRUAL) and is_cash_flow=false"七、跨法人资金池 + Netting 映射逻辑
内部 AP 不直接按毛额进 CASH_CUBE,要走 netting 后写:
step1: AP.Invoice.Validated (IC_Flag=Y) -> 写 INTERIM_IC_PAYABLE step2: IC.Netting.Executed -> 按原币轧差 step3: 输出 NETTED_IC 行(净额,原币) step4: 按净额折集团币写 CASH_CUBE配置要点:
- netting 前 Layer:
INTERIM_IC - netting 后 Layer:
NETTED_IC - 毛额不再占资金头寸,仅保留对账视图
八、控制规则绑定(写 Cube 后做什么)
在“资金控制规则”里绑映射结果:
规则 | 配置 |
|---|---|
控制对象 | CASH_CUBE.SCHEDULED_PAY + RESERVED_CASH |
控制维度 | PayEntity + CashPool + Currency + Period |
控制级别 | ABSOLUTE(硬拦)/ ADVISORY(告警) |
超额度动作 | BLOCK / REQUIRE_APPROVAL / LOG |
重算触发 | 事件回放(Event Replay) |
示例:
{ "ruleId": "CASH_POOL_CNY_ABS", "cube": "CASH_CUBE", "filter": "cashPool='CN_POOL' and currency='CNY'", "layer": ["SCHEDULED_PAY","RESERVED_CASH"], "controlLevel": "ABSOLUTE", "onInsufficient": "BLOCK", "exceptionRole": "TREASURY_DIRECTOR" }九、配置顺序(实施 Checklist)
- ✅ 建 CASH_CUBE,声明维度(LE/PayEntity/Ccy/Pool/Period/FlowType)
- ✅ 注册 AP 事件到 Event Catalog(含 payload schema)
- ✅ 配
ap_dim_resolver,字段→维度映射 - ✅ 配金额表达式 + 三币种 measure
- ✅ 配 Layer 映射(COMMITMENT/OBLIGATION/SCHEDULED_PAY/NETTED_IC/ACTUAL)
- ✅ 配汇率策略(发票日/预测日/银行日)
- ✅ 配多准则过滤(排除非现金准则项)
- ✅ 配 IC netting 前置/后置 Layer
- ✅ 绑资金控制规则
- ✅ 建版本(BASELINE / FC / 汇率模拟)
- ✅ 跑事件回放校验历史数据
- ✅ 对账:CASH_CUBE.SCHEDULED_PAY vs AP 付款计划表
十、一个落地对照例子
场景:德国 LE 发票 100万 EUR,Net60,由集团资金中心代付,对 A 法人有内部应收 40万 EUR
事件 | CASH_CUBE 写入 | 金额 |
|---|---|---|
Invoice.Validated | VALIDATED_PAYABLE(负债,不占现) | 100万 EUR |
PaymentSchedule.Created | SCHEDULED_PAY(德国LE负债) | 100万 EUR |
IC.Netting.Executed | NETTED_IC | 净额 60万 EUR |
Payment.Confirmed | RESERVED_CASH(资金中心) | 60万 EUR折CNY |
BANK.Cleared | ACTUAL_CASH | 60万 EUR实付 |
→ 资金池按60万 EUR 备现,不是 100万。
十一、一句话记忆
配置本质 = 把 AP 事件按“现金流语义”投影到 CASH_CUBE:用 PaymentSchedule 当现金基线,用 PayEntity 管出钱口径,用原币 netting 后折集团币,用 Layer 区分预测/排程/占用/实付,用规则引擎做资金额度闸门。