# Day 1 - 预算模型与接口契约

## 目标

先把预算中心的数据边界和接口边界定稳，避免后续把预算逻辑散落在申请、报销、审批和付款模块里。

## 开发任务

- [ ] 新增预算模型设计。
- [ ] 新增预算交易台账设计。
- [ ] 新增预算服务边界设计。
- [ ] 新增预算接口契约。
- [ ] 新增预算状态与交易类型常量。
- [ ] 明确申请、报销、付款对预算服务的调用点。

## 建议模型

预算额度：

```text
BudgetAllocation
- id
- budget_no
- fiscal_year
- period_type
- period_key
- department_id
- department_name
- cost_center
- project_code
- subject_code
- subject_name
- original_amount
- adjusted_amount
- status
- warning_threshold
- created_at
- updated_at
```

预算交易：

```text
BudgetTransaction
- id
- transaction_no
- allocation_id
- source_type
- source_id
- source_no
- transaction_type
- amount
- before_available_amount
- after_available_amount
- operator
- reason
- created_at
```

交易类型：

```text
init       初始化
adjust     调整
reserve    预占
release    释放
consume    核销
rollback   回滚
freeze     冻结
unfreeze   解冻
```

预算汇总字段由交易汇总得到：

```text
total_amount = original_amount + adjusted_amount
reserved_amount = reserve - release
consumed_amount = consume - rollback
available_amount = total_amount - reserved_amount - consumed_amount
```

## 接口契约

```text
GET  /api/v1/budgets/allocations
POST /api/v1/budgets/allocations
GET  /api/v1/budgets/allocations/{id}
GET  /api/v1/budgets/allocations/{id}/transactions
POST /api/v1/budgets/allocations/{id}/adjust
POST /api/v1/budgets/check
POST /api/v1/budgets/reserve
POST /api/v1/budgets/release
POST /api/v1/budgets/consume
POST /api/v1/budgets/rollback
GET  /api/v1/budgets/summary
```

## 验收

- [ ] 能创建一条部门月度预算。
- [ ] 能查询预算列表和详情。
- [ ] 能查询预算台账。
- [ ] 能根据部门、成本中心、项目、费用科目定位预算。
- [ ] 预算不足时 `check` 接口能返回明确原因。

