|
|
@@ -1,294 +1,48 @@
|
|
1
|
1
|
# 牦牛出栏数据填报 — 技术方案
|
|
2
|
2
|
|
|
3
|
|
-> 依据:同目录 `牦牛出栏数据填报功能需求.md`;模板 `E:\luhao\工作交接\巴青项目\农牧数据\农业农村和科技水利局-业务办\牲畜数据.xlsx` 第 **6** 个 Sheet(2026 年度出栏及自食统计表)。
|
|
|
3
|
+> 依据:同目录功能需求;模板 `baqing-admin/src/main/resources/templates/yak_outbound_report_import_template.xlsx`。
|
|
4
|
4
|
|
|
5
|
|
----
|
|
|
5
|
+## 1. 架构
|
|
6
|
6
|
|
|
7
|
|
-## 1. 技术架构
|
|
|
7
|
+Controller `/dataModel/yakOutboundReport` → Service → Mapper;Excel:`YakOutboundReportExcelParser` / `YakOutboundReportExcelExporter`;校验:`YakOutboundReportValidation`(村反推乡镇)。
|
|
8
|
8
|
|
|
9
|
|
-| 项 | 说明 |
|
|
10
|
|
-| --- | --- |
|
|
11
|
|
-| **后端** | RuoYi **v3.9.2**(springboot2):JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
|
|
12
|
|
-| **数据库** | MySQL **5.7.39**,InnoDB,`utf8mb4` |
|
|
13
|
|
-| **前端** | 若依 Vue2 + Element UI |
|
|
14
|
|
-| **Excel** | Apache POI(与「牦牛存栏数据填报」一致) |
|
|
15
|
|
-| **组织** | `sys_dept` 乡镇字典;复用 `TownDeptSupport` |
|
|
16
|
|
-
|
|
17
|
|
-**分层**:`BizYakOutboundReportController` → `IBizYakOutboundReportService` → `BizYakOutboundReportMapper` → `domain`;Excel 由 `YakOutboundReportExcelParser`(导入解析)、`YakOutboundReportExcelExporter`(按年月导出)承担。
|
|
18
|
|
-
|
|
19
|
|
-**代码位置**:`baqing-admin` → `com.ruoyi.web.modules.industryservice`(与产业数据模型同包)。
|
|
20
|
|
-
|
|
21
|
|
-**模板文件**:`baqing-admin/src/main/resources/templates/yak_outbound_report_import_template.xlsx`(导入、导出、下载模板共用)。
|
|
22
|
|
-
|
|
23
|
|
-**参考实现**:`BizYakHerdInventory*`、`YakHerdInventoryMonthSupport`、`TownDeptSupport`(存栏填报模块,年月模式一致)。
|
|
24
|
|
-
|
|
25
|
|
----
|
|
26
|
|
-
|
|
27
|
|
-## 2. 数据库设计
|
|
28
|
|
-
|
|
29
|
|
-### 2.1 表 `biz_yak_outbound_report`(牦牛出栏数据填报)
|
|
30
|
|
-
|
|
31
|
|
-| 字段 | 类型 | 非空 | 说明 |
|
|
32
|
|
-| --- | --- | --- | --- |
|
|
33
|
|
-| `id` | `bigint(20)` | Y | 主键 |
|
|
34
|
|
-| `stat_year` | `int(11)` | Y | 所属年份(自然年) |
|
|
35
|
|
-| `stat_month` | `int(11)` | Y | 所属月份(1~12) |
|
|
36
|
|
-| `town_dept_id` | `bigint(20)` | Y | 所属乡镇,`sys_dept.dept_id` |
|
|
37
|
|
-| `town_name` | `varchar(64)` | Y | 乡镇名称冗余 |
|
|
38
|
|
-| `farmer_household_count` | `int(11)` | N | 农牧户户数 |
|
|
39
|
|
-| `farmer_population_count` | `int(11)` | N | 农牧户人数 |
|
|
40
|
|
-| `yak_outbound_count` | `int(11)` | N | 牦牛出栏数(头) |
|
|
41
|
|
-| `cattle_outbound_count` | `int(11)` | N | 黄牛/奶牛/犏牛出栏数(头) |
|
|
42
|
|
-| `sheep_outbound_count` | `int(11)` | N | 绵羊出栏数(只) |
|
|
43
|
|
-| `goat_outbound_count` | `int(11)` | N | 山羊出栏数(只) |
|
|
44
|
|
-| `horse_mule_outbound_count` | `int(11)` | N | 马骡出栏数(匹) |
|
|
45
|
|
-| `donkey_outbound_count` | `int(11)` | N | 驴出栏数(头) |
|
|
46
|
|
-| `self_consumption_cattle_count` | `int(11)` | N | 自食牛头数(头) |
|
|
47
|
|
-| `self_consumption_sheep_count` | `int(11)` | N | 自食绵羊只数(只) |
|
|
48
|
|
-| `self_consumption_goat_count` | `int(11)` | N | 自食山羊只数(只) |
|
|
49
|
|
-| `create_by` / `create_time` | — | — | 审计 |
|
|
50
|
|
-| `update_by` / `update_time` | — | — | 审计 |
|
|
51
|
|
-| `remark` | `varchar(500)` | N | 备注 |
|
|
52
|
|
-
|
|
53
|
|
-**说明**:本表**不使用逻辑删除**,无 `del_flag`;删除为物理 `DELETE`。
|
|
54
|
|
-
|
|
55
|
|
-**索引与约束**
|
|
56
|
|
-
|
|
57
|
|
-- `UNIQUE uk_year_month_town (stat_year, stat_month, town_dept_id)` — 年月+乡镇唯一,支撑导入 upsert。
|
|
58
|
|
-- `KEY idx_stat_year_month (stat_year, stat_month)`
|
|
59
|
|
-- `KEY idx_town_dept_id (town_dept_id)`
|
|
60
|
|
-
|
|
61
|
|
-**DDL 文件**:`sql/biz_yak_outbound_report.sql`(新库,已含 `stat_month`)。
|
|
62
|
|
-**已有库升级**(v1.1 按年表 `uk_year_town`):增加 `stat_month` 列(历史行默认 **12**),调整唯一键为 `uk_year_month_town`(实施阶段提供迁移 SQL,模式同存栏模块)。
|
|
63
|
|
-
|
|
64
|
|
-### 2.2 乡镇字典(复用)
|
|
65
|
|
-
|
|
66
|
|
-```sql
|
|
67
|
|
-SELECT dept_id, dept_name, order_num
|
|
68
|
|
-FROM sys_dept
|
|
69
|
|
-WHERE parent_id = 100
|
|
70
|
|
- AND order_num > 12
|
|
71
|
|
- AND del_flag = '0'
|
|
72
|
|
- AND status = '0'
|
|
73
|
|
-ORDER BY order_num;
|
|
74
|
|
-```
|
|
75
|
|
-
|
|
76
|
|
-封装:`TownDeptSupport.listReportTowns()`、`requireReportTown(deptId)`。
|
|
77
|
|
-
|
|
78
|
|
-**乡镇别名(导入)**:模板「扎色镇」→ `sys_dept`「杂色镇」,在 `YakOutboundReportExcelParser.resolveTownDeptId` 或 `TownDeptSupport` 扩展 `normalizeTownName`。
|
|
|
9
|
+## 2. 表 `biz_yak_outbound_report`
|
|
79
|
10
|
|
|
80
|
|
-### 2.3 可选年份
|
|
|
11
|
+唯一键 `uk_year_month_village (stat_year, stat_month, village_dept_id)`;含 `town_*`、`village_*` 及出栏/自食明细字段。DDL:`sql/biz_yak_outbound_report.sql`(`DROP` 全量重建)。
|
|
81
|
12
|
|
|
82
|
|
-与存栏模块一致:复用 `YakHerdInventoryYearSupport.resolveYearOptions()`,返回当前年起向前 5 年共 6 个年份。
|
|
|
13
|
+## 3. 接口
|
|
83
|
14
|
|
|
84
|
|
-### 2.4 可选月份
|
|
85
|
|
-
|
|
86
|
|
-复用 `YakHerdInventoryMonthSupport.resolveMonthOptions()` 返回 **1~12**;`validateStatPeriod(year, month)` 校验年份在 **§2.3** 范围内、月份合法且**非未来月**。出栏校验类 `YakOutboundReportValidation` 亦调用该 Support。
|
|
87
|
|
-
|
|
88
|
|
----
|
|
89
|
|
-
|
|
90
|
|
-## 3. 接口设计
|
|
91
|
|
-
|
|
92
|
|
-**Base Path**:`/dataModel/yakOutboundReport`
|
|
93
|
|
-
|
|
94
|
|
-**权限前缀**:`dataModel:yakOutboundReport`
|
|
95
|
|
-
|
|
96
|
|
-| # | 说明 | Method | URI | 权限 |
|
|
97
|
|
-| --- | --- | --- | --- | --- |
|
|
98
|
|
-| 3.1 | 分页列表 | GET | `/list` | `list` |
|
|
99
|
|
-| 3.2 | 详情 | GET | `/{id}` | `query` |
|
|
100
|
|
-| 3.3 | 新增 | POST | `/` | `add` |
|
|
101
|
|
-| 3.4 | 修改 | PUT | `/` | `edit` |
|
|
102
|
|
-| 3.5 | 删除 | DELETE | `/{ids}` | `remove` |
|
|
103
|
|
-| 3.6 | 乡镇下拉 | GET | `/townOptions` | `list` |
|
|
104
|
|
-| 3.7 | 年份下拉 | GET | `/yearOptions` | `list` |
|
|
105
|
|
-| 3.8 | 月份下拉 | GET | `/monthOptions` | `list` |
|
|
106
|
|
-| 3.9 | 导入 | POST | `/importData` | `import` |
|
|
107
|
|
-| 3.10 | 下载导入模板 | GET | `/importTemplate` | `import` |
|
|
108
|
|
-| 3.11 | 按年月导出 | GET | `/export` | `export` |
|
|
109
|
|
-
|
|
110
|
|
-#### 3.1.1 列表 Query
|
|
111
|
|
-
|
|
112
|
|
-| 参数 | 类型 | 说明 |
|
|
113
|
|
-| --- | --- | --- |
|
|
114
|
|
-| `pageNum` / `pageSize` | int | 默认 1 / 20 |
|
|
115
|
|
-| `statYear` | int | 所属年份,精确 |
|
|
116
|
|
-| `statMonth` | int | 所属月份(1~12),精确 |
|
|
117
|
|
-| `townDeptId` | long | 所属乡镇 dept_id,精确 |
|
|
118
|
|
-
|
|
119
|
|
-**列表 VO**
|
|
120
|
|
-
|
|
121
|
|
-| 列标题 | 字段 |
|
|
|
15
|
+| URI | 说明 |
|
|
122
|
16
|
| --- | --- |
|
|
123
|
|
-| 所属年份 | `statYear` |
|
|
124
|
|
-| 所属月份 | `statMonth` |
|
|
125
|
|
-| 所属乡镇 | `townName` |
|
|
126
|
|
-| 农牧户户数 | `farmerHouseholdCount` |
|
|
127
|
|
-| 农牧户人数 | `farmerPopulationCount` |
|
|
128
|
|
-| 牦牛出栏数 | `yakOutboundCount` |
|
|
129
|
|
-| 自食情况(牛) | `selfConsumptionCattleCount` |
|
|
130
|
|
-
|
|
131
|
|
-#### 3.2.1 详情
|
|
132
|
|
-
|
|
133
|
|
-返回需求 **§5.5** 指定字段(驼峰):
|
|
134
|
|
-
|
|
135
|
|
-`statYear`、`statMonth`、`townName`、`farmerHouseholdCount`、`farmerPopulationCount`、`yakOutboundCount`、`selfConsumptionCattleCount`
|
|
136
|
|
-
|
|
137
|
|
-可选附带 `id`、`townDeptId` 供前端跳转修改。
|
|
138
|
|
-
|
|
139
|
|
-#### 3.3.1 新增/修改 Body
|
|
140
|
|
-
|
|
141
|
|
-| 字段 | 必填 | 校验 |
|
|
142
|
|
-| --- | --- | --- |
|
|
143
|
|
-| `statYear` | Y | 在 `yearOptions` 范围内 |
|
|
144
|
|
-| `statMonth` | Y | 1~12;非未来月 |
|
|
145
|
|
-| `townDeptId` | Y | 须在乡镇字典内 |
|
|
146
|
|
-| `farmerHouseholdCount` 等数量字段 | N | `>= 0` 整数 |
|
|
147
|
|
-| `id` | 修改必填 | — |
|
|
148
|
|
-
|
|
149
|
|
-**唯一性(手工新增)**:`countByYearMonthAndTownExcludeId > 0` 则拒绝,提示「该年该月该乡镇已填报」。**导入**走 upsert。
|
|
|
17
|
+| CRUD `/list` `/{id}` POST/PUT/DELETE | 同常规 |
|
|
|
18
|
+| `/villageTree` | 县→乡镇→村 |
|
|
|
19
|
+| `/importData` | 年月全量覆盖 |
|
|
|
20
|
+| `/export` | 按年月导出已填报村数据 |
|
|
150
|
21
|
|
|
151
|
|
-#### 3.5.1 删除
|
|
|
22
|
+### Excel 列(0-based)
|
|
152
|
23
|
|
|
153
|
|
-`DELETE FROM biz_yak_outbound_report WHERE id IN (...)`,物理删除。
|
|
154
|
|
-
|
|
155
|
|
-#### 3.9 导入
|
|
156
|
|
-
|
|
157
|
|
-**请求**:`multipart/form-data`
|
|
158
|
|
-
|
|
159
|
|
-| 参数 | 必填 | 说明 |
|
|
160
|
|
-| --- | --- | --- |
|
|
161
|
|
-| `file` | Y | `.xlsx` |
|
|
162
|
|
-| `statYear` | Y | 填报年份 |
|
|
163
|
|
-| `statMonth` | Y | 填报月份(1~12) |
|
|
164
|
|
-
|
|
165
|
|
-**Upsert**(`BizYakOutboundReportServiceImpl.upsertImportRow`):
|
|
166
|
|
-
|
|
167
|
|
-1. `selectByYearMonthAndTown(statYear, statMonth, townDeptId)`
|
|
168
|
|
-2. 无记录 → `insert`;有记录 → `update` 全字段覆盖
|
|
169
|
|
-
|
|
170
|
|
-同一文件对**同一填报年月**多次导入:各乡镇行均为更新,不产生重复有效记录。
|
|
171
|
|
-
|
|
172
|
|
-**响应 `data`**:`insertCount`、`updateCount`、`failCount`、`failMessages`、`warnMessages`(自食大于出栏等)
|
|
173
|
|
-
|
|
174
|
|
-#### 3.9.1 Excel 第 6 Sheet 解析约定
|
|
175
|
|
-
|
|
176
|
|
-| 项 | 约定 |
|
|
|
24
|
+| 列 | 字段 |
|
|
177
|
25
|
| --- | --- |
|
|
178
|
|
-| Sheet | `workbook.getSheetAt(5)`(第 6 个 Sheet,0-based 索引 5) |
|
|
179
|
|
-| 表头识别 | 扫描含「乡镇」且同行含「户数」「牦牛」的行;数据自 `headerRow + 1` 起 |
|
|
180
|
|
-| 终止行 | 乡镇为空,或乡镇名为「合计」 |
|
|
181
|
|
-| 列映射(0-based) | |
|
|
182
|
|
-
|
|
183
|
|
-| 列号 | 实体字段 |
|
|
184
|
|
-| --- | --- |
|
|
185
|
|
-| 1 | 乡镇 → `townDeptId` / `townName` |
|
|
186
|
|
-| 2 | `farmerHouseholdCount` |
|
|
187
|
|
-| 3 | `farmerPopulationCount` |
|
|
188
|
|
-| 4 | `yakOutboundCount` |
|
|
189
|
|
-| 5 | `cattleOutboundCount` |
|
|
190
|
|
-| 6 | `sheepOutboundCount` |
|
|
191
|
|
-| 7 | `goatOutboundCount` |
|
|
192
|
|
-| 8 | `horseMuleOutboundCount` |
|
|
193
|
|
-| 9 | `donkeyOutboundCount` |
|
|
194
|
|
-| 10 | **跳过**(出栏小计) |
|
|
195
|
|
-| 11 | `selfConsumptionCattleCount` |
|
|
196
|
|
-| 12 | `selfConsumptionSheepCount` |
|
|
197
|
|
-| 13 | `selfConsumptionGoatCount` |
|
|
198
|
|
-| 14 | **跳过**(自食小计) |
|
|
199
|
|
-| 15 | `remark` |
|
|
200
|
|
-
|
|
201
|
|
-> 模板存在合并单元格,部分行 POI 读列可能错位;解析器宜按表头行固定列号读取,并对空单元格按 0 或 null 处理(与存栏导入一致)。
|
|
202
|
|
-
|
|
203
|
|
-**导入事务**:逐乡镇独立处理,单乡镇失败不影响其余。
|
|
204
|
|
-
|
|
205
|
|
-#### 3.11 按年月导出
|
|
206
|
|
-
|
|
207
|
|
-**请求**:`GET /export?statYear=2026&statMonth=7`
|
|
208
|
|
-
|
|
209
|
|
-| 参数 | 必填 | 说明 |
|
|
210
|
|
-| --- | --- | --- |
|
|
211
|
|
-| `statYear` | Y | 导出年份,须在 `yearOptions` 范围内 |
|
|
212
|
|
-| `statMonth` | Y | 导出月份(1~12);须通过 `validateStatPeriod` |
|
|
213
|
|
-
|
|
214
|
|
-**响应**:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` 文件流;文件名 `{statYear}年{statMonth}月牦牛出栏数据.xlsx`。
|
|
215
|
|
-
|
|
216
|
|
-**实现**:`BizYakOutboundReportServiceImpl.exportByYearMonth` → `YakOutboundReportExcelExporter.export`:
|
|
217
|
|
-
|
|
218
|
|
-1. 加载 classpath 模板 `YakOutboundReportExcelExporter.TEMPLATE_CLASSPATH`
|
|
219
|
|
-2. 解析出栏 Sheet(`YakOutboundReportExcelParser.resolveSheet`)
|
|
220
|
|
-3. 替换表头中的四位年份为 `statYear`(含标题行与「年牲畜出栏数」表头区块;年份与「年」之间允许空格)
|
|
221
|
|
-4. 将 Sheet 名称更新为 `{年份后两位}年出栏`(如 2024 → `24年出栏`)
|
|
222
|
|
-5. 查询 `stat_year = statYear AND stat_month = statMonth` 的全部记录,按 `town_dept_id` 建 Map
|
|
223
|
|
-6. 遍历 `TownDeptSupport.listReportTowns()`,逐乡镇写行;无数据则仅写乡镇名
|
|
224
|
|
-7. 末行写「合计」,对已填报乡镇数值列求和;K/O 列写入出栏/自食小计
|
|
225
|
|
-
|
|
226
|
|
-**与 3.10 区别**:`/importTemplate` 返回空白模板;`/export` 返回填充后的全县报表。
|
|
227
|
|
-
|
|
228
|
|
----
|
|
229
|
|
-
|
|
230
|
|
-## 4. 前端设计(要点)
|
|
231
|
|
-
|
|
232
|
|
-| 项 | 说明 |
|
|
233
|
|
-| --- | --- |
|
|
234
|
|
-| **路径** | `ruoyi-ui/src/views/dataModel/yakOutboundReport/index.vue` |
|
|
235
|
|
-| **API** | `ruoyi-ui/src/api/dataModel/yakOutboundReport.js` |
|
|
236
|
|
-| **列表** | 年份、**月份**、乡镇筛选;**进入页面不默认年月**;列:所属年份、**所属月份**、所属乡镇、农牧户户数、农牧户人数、牦牛出栏数、自食情况(牛) |
|
|
237
|
|
-| **详情** | 对话框只读,展示 **§5.5** 七字段(含月份) |
|
|
238
|
|
-| **表单** | 新增/修改展示全部数量字段;年份/月份/乡镇下拉;**新增默认当前年月**;`el-input-number` `:min="0"` `:precision="0"` |
|
|
239
|
|
-| **导入** | 先选「填报年份」「填报月份」(**默认当前年月**)→ 上传 → 展示导入结果摘要 |
|
|
240
|
|
-| **模板下载** | `GET /importTemplate`;空白模板 |
|
|
241
|
|
-| **导出** | 弹窗选年月(**默认当前年月**)→ `GET /export?statYear=&statMonth=` |
|
|
242
|
|
-
|
|
243
|
|
----
|
|
244
|
|
-
|
|
245
|
|
-## 5. 菜单与权限(示例)
|
|
246
|
|
-
|
|
247
|
|
-| 类型 | 名称 | 权限标识 |
|
|
248
|
|
-| --- | --- | --- |
|
|
249
|
|
-| 菜单 | 牦牛出栏数据填报 | `dataModel:yakOutboundReport:list` |
|
|
250
|
|
-| 按钮 | 查询 | `dataModel:yakOutboundReport:query` |
|
|
251
|
|
-| 按钮 | 新增 | `dataModel:yakOutboundReport:add` |
|
|
252
|
|
-| 按钮 | 修改 | `dataModel:yakOutboundReport:edit` |
|
|
253
|
|
-| 按钮 | 删除 | `dataModel:yakOutboundReport:remove` |
|
|
254
|
|
-| 按钮 | 导入 | `dataModel:yakOutboundReport:import` |
|
|
255
|
|
-| 按钮 | 导出 | `dataModel:yakOutboundReport:export` |
|
|
256
|
|
-
|
|
257
|
|
-挂载目录:**产业数据模型及服务**。菜单 SQL:`sql/biz_sys_menu_yak_outbound_report.sql`(实施阶段)。
|
|
258
|
|
-
|
|
259
|
|
----
|
|
260
|
|
-
|
|
261
|
|
-## 6. 与存栏填报模块的关系
|
|
262
|
|
-
|
|
263
|
|
-| 模块 | 表 | 模板 Sheet | 业务含义 |
|
|
264
|
|
-| --- | --- | --- | --- |
|
|
265
|
|
-| 牦牛存栏数据填报 | `biz_yak_herd_inventory` | `牲畜数据.xlsx` 第 1 Sheet(畜群结构) | 月末存栏结构 |
|
|
266
|
|
-| 牦牛出栏数据填报 | `biz_yak_outbound_report` | `牲畜数据.xlsx` 第 6 Sheet | 月度出栏及自食 |
|
|
267
|
|
-
|
|
268
|
|
-两模块共用 `TownDeptSupport`、年份范围规则、`YakHerdInventoryMonthSupport` 年月校验、导入 upsert 模式;**本期不实现**跨表校验(如出栏数不大于存栏数)。
|
|
269
|
|
-
|
|
270
|
|
-### 6.1 与大屏 / 养殖看板(暂不改)
|
|
|
26
|
+| 1~2 | 乡镇、村 |
|
|
|
27
|
+| 3~4 | 户数、人数 |
|
|
|
28
|
+| 5~10 | 六类出栏 |
|
|
|
29
|
+| 11 | 出栏合计(导出算) |
|
|
|
30
|
+| 12~14 | 自食牛/绵羊/山羊 |
|
|
|
31
|
+| 15 | 自食合计(导出算) |
|
|
271
|
32
|
|
|
272
|
|
-产业总览中「牦牛出栏数」「农牧户户数」等字段当前仍通过 `HomeScreenStatsMapper.sumOutboundReport*ByStatYear` **仅按 `stat_year` 汇总**,不按月份过滤。同一年存在多个月份填报时可能重复累加;**后续单独设计看板口径**,本模块按年月维护明细。
|
|
|
33
|
+数据起始行:`headerRow + 1`(表头为含「乡镇」「村」「户数」「牦牛」的行)。
|
|
273
|
34
|
|
|
274
|
|
----
|
|
|
35
|
+## 4. 导入 / 导出
|
|
275
|
36
|
|
|
276
|
|
-## 7. 交付清单
|
|
|
37
|
+- 导入:校验全部成功 → `deleteByYearMonth` → 批量 insert。
|
|
|
38
|
+- 导出:写村行 + 行内小计;合计行合并 0~2 列;自户数起求和;标题年/月与填表人/填表时间更新。
|
|
277
|
39
|
|
|
278
|
|
-- [x] `sql/biz_yak_outbound_report.sql`(含 `stat_month`)
|
|
279
|
|
-- [x] `BizYakOutboundReport` Domain / Mapper / XML / Service / Controller
|
|
280
|
|
-- [x] `YakOutboundReportExcelParser` + `YakOutboundReportExcelExporter` + 导入模板 xlsx(第 6 Sheet)
|
|
281
|
|
-- [x] 复用 `TownDeptSupport`、`YakHerdInventoryYearSupport`、`YakHerdInventoryMonthSupport`
|
|
282
|
|
-- [ ] 前端列表/表单/导入/导出(年月 UI,对齐存栏模块)
|
|
283
|
|
-- [x] 单元测试 + 接口测试
|
|
284
|
|
-- [ ] `sql/biz_sys_menu_yak_outbound_report.sql`
|
|
|
40
|
+## 5. 大屏
|
|
285
|
41
|
|
|
286
|
|
----
|
|
|
42
|
+地图乡镇标注对 `biz_yak_outbound_report` / `biz_yak_herd_inventory` 按 `town_dept_id` **聚合 sum** 后再关联。
|
|
287
|
43
|
|
|
288
|
44
|
## 8. 修订记录
|
|
289
|
45
|
|
|
290
|
46
|
| 版本 | 说明 |
|
|
291
|
47
|
| --- | --- |
|
|
292
|
|
-| 1.0 | 初稿:表结构、CRUD、第 6 Sheet 导入、物理删除、乡镇字典 |
|
|
293
|
|
-| 1.1 | 实现按年份导出全县乡镇 Excel;`YakOutboundReportExcelExporter` |
|
|
294
|
|
-| 1.2 | 按年月填报:`stat_month`;`uk_year_month_town`;`/monthOptions`;导入/导出/CRUD 支持月份;复用 `YakHerdInventoryMonthSupport` |
|
|
|
48
|
+| 2.0 | 村粒度全量覆盖;列映射对齐交接模板;大屏按乡镇聚合 |
|