维度与成本中心
日记账行上的标记轴,用于切分总账而无需成倍扩张科目表。
是公司定义的轴,挂在单条日记账行上。维度支持按地点、部门、客户等属性出具报表,而无需为每种组合新增科目。成本中心既可以作为维度,也可以作为成本归属的层级结构。
维度与成本中心属于会计模块,按公司集团定义一次,与科目表放在一起。
维度是什么
维度有一个名称和一个决定其取值的实体类型。它存储在 dimension 表中,按 companyGroupId 划分。一条已过账的日记账行对每个维度最多包含一个值。
Location 维度从你的地点取值,Employee 维度从你的人员取值。你无需输入值——它们从过账已引用的实体解析。entityType 为 Custom。你以 dimensionValue 行自行提供允许值(项目 A、项目 B……)。用于 Carbon 尚未建模为表的轴。完整的实体类型集合(dimensionEntityType,accounting.models.ts:577):CostCenter、Custom、Customer、CustomerType、Department、Employee、FixedAssetClass、Item、ItemPostingGroup、Location、Process、Supplier、SupplierType、WorkCenter。随着过账路径学会解析,它们被逐一加入数据库枚举。
维度带两个标志:启用(停用后不再附加到新过账)和必填。名称在每个公司集团内唯一。
维度按整个公司集团定义,而不是按公司
dimension 和 dimensionValue 按 companyGroupId 划分——你定义的维度在集团内每家公司共享。日记账行上的标记(journalLineDimension)则像日记账本身一样按 companyId 划分。
值如何落到日记账行上
维度存储在连接表 journalLineDimension 中,每个标记一行:journalLineId、dimensionId 和一个 valueId。该 valueId 有意设计为多态——对于 Custom 维度,它指向 dimensionValue.id;对于实体类型维度,它直接指向实体行的 ID(location.id、customer.id、costCenter.id)。它故意不是外键;引用目标取决于维度的实体类型,并由应用代码执行(20260228024512_dimensions.sql:131)。一行对每个维度最多包含一个值(UNIQUE("journalLineId", "dimensionId"))。
业务过账会自动解析维度:
- 它把公司集团中所有启用的维度加载到以实体类型为键的映射中(
postShipment,inventory.service.ts)。 - 构建每条日记账行时,它已经知道来源事实——客户、物料、物料过账组、地点、该行背后的成本中心。
- 对于这些事实中的每一个,如果存在对应实体类型的启用维度,就附加一条
journalLineDimension行,把valueId指向该实体 ID(postShipment,inventory.service.ts)。某个轴没有定义维度,就不会在该轴打标记——定义维度就是开启标记的开关。
例如,Location 维度不需要在每次发货时录入。定义维度后,发货、收货、发票和库存过账会自动附加来源单据上已有的地点。其他过账函数使用相同模式。
手工日记账直接标记其行
手工录入的日记账没有可解析标记的来源单据,因此其行携带你在录入表单中分配的维度值。saveJournalLineDimensions(accounting.service.ts:2647)会整体替换行的标记——清除现有 journalLineDimension 行并插入新集合。
成本中心
成本中心是用于归集成本的具名组织单元——工厂、产线、服务团队。成本中心形成层级:每个都可以指定 parentCostCenterId,从而把子中心汇总到父中心(getCostCentersTree,accounting.service.ts:2212)。每个成本中心带有一个负责的所有者(ownerId,用户)。
成本中心扮演两种角色:
- 独立树(
costCenter表,按companyId划分),可分配到采购行和其他记录,把支出归因到责任单元。 - 维度轴。 定义
entityType: "CostCenter"的维度后,过账会开始用来源单据携带的成本中心标记其日记账行——与其他实体类型维度完全相同。成本中心级损益报表就是这样实现的:成本中心是行上的标记,在过账时从单据解析。
journalLine 本身没有 costCenterId 列。成本中心与其他轴一样通过 journalLineDimension 行进入总账,其 valueId 为 costCenter.id。
在报表中使用维度
基于日记账行的报表可以按维度值分组或筛选,例如按地点统计销货成本、按部门统计费用、按客户统计收入。这样科目表可以保持精简:过账到一个销货成本科目,再用 Location 维度切分。
核心报表不切分;维度驱动分析口径
试算平衡表、资产负债表和利润表(getTrialBalance、getFinancialStatementBalances)报告整个公司的余额——它们不接受维度筛选。维度切分是这些总额之上的分析层:它回答「这个科目的余额中,各地点/部门/成本中心分别占多少」,而不是「为某个项目重述整张资产负债表」。
由于维度切分读取已过账的日记账行,只有期间过账最终确定后才有意义。月度余额如何快照,参见期末结账。