Capability:报价计算与项目成本汇总(Supporting 子域) 上游来源:
../../../03-ddd-modeling.md§II 战略@ddd-contextsBillingContext + §III 战术QuoteCalculator责任工件:PricingTable、Quote(VO)、CostRecord
UI SHALL 在用户选择 (type, spec, days) 后于 200ms 内返回 Quote。
PricingTable[gpu-a100] = 100 元/天QuoteCalculator.calc({ type: 'gpu-a100', days: 7 })Quote { unitPrice: 100, days: 7, totalPrice: 700, calculatedAt }PricingTable 中无 (type, spec) 项QuoteCalculator.calcUnknownPricingItemResourceRequest 创建时 SHALL 复制当时 Quote.totalPrice 为不可变 cost。
ResourceRequest R-001 创建时 cost = 700PricingTable[gpu-a100] = 120 元/天cost 仍为 700(IV-5)系统 SHALL 按 projectId 实时汇总已发生与预计成本。
CostRecord[project-X].actual = 0ResourceProvisioned(R-001) 事件,R-001 项目为 X,cost = 700CostRecord[project-X].actual += 按配置至今的天数 × 单价R-001 已配置在项目 XResourceReleased(R-001)actualR-001 status = PROVISIONED,剩余天数 = 5CostRecord[project-X].forecastunitPrice × 剩余天数 之和ResourceRequest 上下文 SHALL NOT 直接持有 PricingTable 引用,仅通过 QuoteCalculator 域服务接口交互。
PricingTable 新增 region 字段| 事件 | 触发条件 | 载荷 |
|---|---|---|
QuoteCalculated |
UI 调用计价 | type, spec, days, totalPrice |
CostRecordUpdated |
已发生/预计变更 | projectId, actual, forecast, updatedAt |
# pricing.yaml(Ops 维护)
- type: gpu-a100
spec: 1x80GB
unitPricePerDay: 100
- type: cpu-large
spec: 16C64G
unitPricePerDay: 30
- type: storage-ssd
spec: 1TB
unitPricePerDay: 5
interface PricingTable {
lookup(type: ResourceType, spec: ResourceSpec): UnitPrice | null;
}
interface CostRecordRepository {
findByProject(projectId: ProjectId): Promise<CostRecord>;
save(record: CostRecord): Promise<void>;
}