# 可支配收入数据填报 — 技术方案

## 1. 接口

| 方法 | 路径 | 权限 |
| --- | --- | --- |
| GET | `/dataModel/disposableIncome/list` | list |
| GET | `/dataModel/disposableIncome/{id}` | query |
| POST | `/dataModel/disposableIncome` | add |
| PUT | `/dataModel/disposableIncome` | edit |
| DELETE | `/dataModel/disposableIncome/{ids}` | remove |
| GET | `/dataModel/disposableIncome/yearOptions` | list |

年份选项：与存栏等模块一致，当前年起向前 5 年共 6 个（`YakHerdInventoryYearSupport`）。

---

## 2. 表结构

表名：`biz_disposable_income`（见 `sql/biz_disposable_income.sql`）

| 字段 | 说明 |
| --- | --- |
| stat_year | 所属年份，唯一 |
| rural_disposable_income | 农村居民人均可支配收入（元） |
| income_increase | 增幅（元），可选可空 |
| income_growth_rate | 增速（百分数值，如 12.28），可选可空 |
| poverty_net_income | 脱贫人口人均纯收入（元） |
| remark | 备注 |

---

## 3. 增幅 / 增速计算

实现：`DisposableIncomeGrowthSupport`、`BizDisposableIncomeServiceImpl.applyGrowthForSave`

| 场景 | 行为 |
| --- | --- |
| 新增，增幅/增速未填 | `fillMissingGrowth`：有上年则补齐 |
| 修改，年份与可支配收入未变 | `fillMissingGrowth`：仅补齐未填项，保留手工值 |
| 修改，年份或可支配收入变更 | `recalculateGrowth`：清空后按公式强制重算 |
| 无上年 / 上年可支配收入为 0 | 增幅可算则写入；增速在除零场景保持 `null` |

公式：

- 增幅 = 本年 `rural_disposable_income` − 上年同字段
- 增速 = (增幅 ÷ 上年 `rural_disposable_income`) × 100，保留 2 位小数

---

## 4. 后端要点

| 项 | 路径 |
| --- | --- |
| Domain | `BizDisposableIncome` |
| Mapper | `BizDisposableIncomeMapper` / XML |
| Service | `IBizDisposableIncomeService` / `BizDisposableIncomeServiceImpl` |
| Controller | `BizDisposableIncomeController` → `/dataModel/disposableIncome` |
| 校验 | `DisposableIncomeValidation` |
| 单元测试 | `DisposableIncomeGrowthSupportTest`、`DisposableIncomeValidationTest` |

---

## 5. 前端

| 项 | 说明 |
| --- | --- |
| 页面 | `ruoyi-ui/src/views/dataModel/disposableIncome/index.vue` |
| API | `ruoyi-ui/src/api/dataModel/disposableIncome.js` |
| i18n | `ruoyi-ui/src/lang/zh/dataModel.js`、`bo/dataModel.js` → `disposableIncome` |
| 菜单组件路径 | `dataModel/disposableIncome/index` |
| 增幅/增速表单 | 普通输入框（支持空值）；提交空 → `null`，避免 `el-input-number` 把 null 显示/提交成 0 |
| 改年份或可支配收入 | 前端清空增幅/增速，后端强制重算 |
| 列表 / 详情展示 | `formatIncrease` / `formatGrowthRate`：库中 `null` 显示为 `0.00` / `0.00%` |
