|
|
@@ -14,9 +14,11 @@
|
|
14
|
14
|
| **Excel** | Apache POI 或项目已有 EasyExcel(与若依导入规范一致) |
|
|
15
|
15
|
| **组织** | `sys_dept` 乡镇字典;`SysDeptMapper` 查询二级节点 |
|
|
16
|
16
|
|
|
17
|
|
-**分层**:`BizYakHerdInventoryController` → `IBizYakHerdInventoryService` / `BizYakHerdInventoryImportService` → `BizYakHerdInventoryMapper` → `domain`。
|
|
|
17
|
+**分层**:`BizYakHerdInventoryController` → `IBizYakHerdInventoryService` → `BizYakHerdInventoryMapper` → `domain`;Excel 由 `YakHerdInventoryExcelParser`(导入解析)、`YakHerdInventoryExcelExporter`(按年导出)承担。
|
|
18
|
18
|
|
|
19
|
|
-**代码位置(建议)**:`baqing-admin` → `com.ruoyi.web.modules.industryservice`(与产业数据模型同包)。
|
|
|
19
|
+**代码位置**:`baqing-admin` → `com.ruoyi.web.modules.industryservice`(与产业数据模型同包)。
|
|
|
20
|
+
|
|
|
21
|
+**模板文件**:`baqing-admin/src/main/resources/templates/yak_herd_inventory_import_template.xlsx`(导入、导出、下载模板共用)。
|
|
20
|
22
|
|
|
21
|
23
|
---
|
|
22
|
24
|
|
|
|
@@ -50,10 +52,10 @@
|
|
50
|
52
|
|
|
51
|
53
|
**索引与约束**
|
|
52
|
54
|
|
|
53
|
|
-- `UNIQUE uk_year_town (stat_year, town_dept_id, del_flag)` — 仅对有效记录唯一;逻辑删除后 `del_flag=2` 可再插(或采用 `uk_year_town (stat_year, town_dept_id)` + 应用层校验,推荐后者并配合查询 `del_flag=0` 唯一校验)。
|
|
54
|
|
-- **推荐**:`UNIQUE uk_year_town_active (stat_year, town_dept_id)` 且删除时物理保留单行、仅改 `del_flag`;新增前校验无 `del_flag=0` 重复。
|
|
|
55
|
+- 应用层校验:同年同乡镇仅一条 `del_flag='0'` 有效记录(`countActiveByYearAndTownExcludeId`)。
|
|
55
|
56
|
- `KEY idx_stat_year (stat_year)`
|
|
56
|
|
-- `KEY idx_town_dept_id (town_dept_id)`
|
|
|
57
|
+- `KEY idx_town_dept_id (town_dept_id)`
|
|
|
58
|
+- `KEY idx_del_flag (del_flag)`
|
|
57
|
59
|
|
|
58
|
60
|
**DDL 文件**:`sql/biz_yak_herd_inventory.sql`
|
|
59
|
61
|
|
|
|
@@ -98,6 +100,7 @@ for (int y = current; y >= current - 5; y--) { ... }
|
|
98
|
100
|
| 3.7 | 年份下拉 | GET | `/yearOptions` | `list` |
|
|
99
|
101
|
| 3.8 | 导入 | POST | `/importData` | `import` |
|
|
100
|
102
|
| 3.9 | 下载导入模板 | GET | `/importTemplate` | `import` |
|
|
|
103
|
+| 3.10 | 按年份导出 | GET | `/export` | `export` |
|
|
101
|
104
|
|
|
102
|
105
|
#### 3.1.1 列表 Query
|
|
103
|
106
|
|
|
|
@@ -164,25 +167,46 @@ for (int y = current; y >= current - 5; y--) { ... }
|
|
164
|
167
|
| 数据行 | `headerRow + 1` 起至「乡镇」列为空 |
|
|
165
|
168
|
| 列映射(默认,实施对照模板微调) | |
|
|
166
|
169
|
|
|
167
|
|
-| 列号 | 表头关键字 | 实体字段 |
|
|
|
170
|
+| 列号(0-based) | Excel 列 | 实体字段 |
|
|
|
171
|
+| --- | --- | --- |
|
|
|
172
|
+| 1 | B | 乡镇(按 `dept_name` 解析 `townDeptId`) |
|
|
|
173
|
+| 2 | C | `villageCount` |
|
|
|
174
|
+| 3 | D | `herdsmanHouseholdCount` |
|
|
|
175
|
+| 4 | E | `yakTotal`(存栏数) |
|
|
|
176
|
+| 5 | F | 与 E 同值(模板镜像列,导出时同步写入) |
|
|
|
177
|
+| 6 | G | `bullTotal` |
|
|
|
178
|
+| 9 | J | `breedingBullCount` |
|
|
|
179
|
+| 10 | K | `bullCastratedCount` |
|
|
|
180
|
+| 11 | L | `cowTotal` |
|
|
|
181
|
+| 12 | M | `cowUnder1Count` |
|
|
|
182
|
+| 13 | N | `cow13Count` |
|
|
|
183
|
+| 14 | O | `cow312Count` |
|
|
|
184
|
+| 15 | P | `cowOver12Count` |
|
|
|
185
|
+| 16 | Q | `remark` |
|
|
|
186
|
+
|
|
|
187
|
+> 数据区起始行:`headerRow + 3`(表头行由「序号」「乡镇」自动识别)。模板存在合并单元格,列号以代码常量为准。
|
|
|
188
|
+
|
|
|
189
|
+**导入事务**:逐乡镇独立处理,单乡镇失败不影响其余。
|
|
|
190
|
+
|
|
|
191
|
+#### 3.10 按年份导出
|
|
|
192
|
+
|
|
|
193
|
+**请求**:`GET /export?statYear=2026`
|
|
|
194
|
+
|
|
|
195
|
+| 参数 | 必填 | 说明 |
|
|
168
|
196
|
| --- | --- | --- |
|
|
169
|
|
-| B | 乡镇 | `townDeptId`(按名称解析) |
|
|
170
|
|
-| C | 村居数 | `villageCount` |
|
|
171
|
|
-| D | 牧户数 | `herdsmanHouseholdCount` |
|
|
172
|
|
-| E | 总合计 / 牦牛 | `yakTotal` |
|
|
173
|
|
-| F | 公牛-合计 | `bullTotal` |
|
|
174
|
|
-| G | 种公牛 | `breedingBullCount` |
|
|
175
|
|
-| H | 公牛/阉畜 | `bullCastratedCount` |
|
|
176
|
|
-| I | 母牛-合计 | `cowTotal` |
|
|
177
|
|
-| J | 1岁以下 | `cowUnder1Count` |
|
|
178
|
|
-| K | 1-3岁 | `cow13Count` |
|
|
179
|
|
-| L | 3-12岁 | `cow312Count` |
|
|
180
|
|
-| M | 12岁以上 | `cowOver12Count` |
|
|
181
|
|
-| N | 备注 | `remark` |
|
|
182
|
|
-
|
|
183
|
|
-> 模板存在合并单元格时,以**数据区实际列字母**在代码中常量配置;导入单测使用 `2026年.xlsx` 快照校验 10 个乡镇行。
|
|
184
|
|
-
|
|
185
|
|
-**导入事务**:逐乡镇 `REQUIRES_NEW` 或整批单事务;推荐**逐条独立事务**,单乡镇失败不影响其余(与牧场同步模式一致)。
|
|
|
197
|
+| `statYear` | Y | 导出年份,须在 `yearOptions` 范围内 |
|
|
|
198
|
+
|
|
|
199
|
+**响应**:`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` 文件流;文件名 `{statYear}年牦牛存栏数据.xlsx`。
|
|
|
200
|
+
|
|
|
201
|
+**实现**:`BizYakHerdInventoryServiceImpl.exportByYear` → `YakHerdInventoryExcelExporter.export`:
|
|
|
202
|
+
|
|
|
203
|
+1. 加载 classpath 模板 `YakHerdInventoryExcelExporter.TEMPLATE_CLASSPATH`
|
|
|
204
|
+2. 替换表头中的四位年份为 `statYear`
|
|
|
205
|
+3. 查询 `stat_year = statYear` 且 `del_flag='0'` 的全部记录,按 `town_dept_id` 建 Map
|
|
|
206
|
+4. 遍历 `TownDeptSupport.listReportTowns()`,逐乡镇写行;无数据则仅写乡镇名
|
|
|
207
|
+5. 末行写「合计」,对已填报乡镇数值列求和
|
|
|
208
|
+
|
|
|
209
|
+**与 3.9 区别**:`/importTemplate` 返回空白模板;`/export` 返回填充后的全县报表。
|
|
186
|
210
|
|
|
187
|
211
|
---
|
|
188
|
212
|
|
|
|
@@ -196,7 +220,8 @@ for (int y = current; y >= current - 5; y--) { ... }
|
|
196
|
220
|
| **详情** | 抽屉/对话框只读展示全部字段 |
|
|
197
|
221
|
| **表单** | 抽屉或对话框;年份/乡镇下拉;数字 `el-input-number` `:min="0"` `:precision="0"` |
|
|
198
|
222
|
| **导入** | 先选「填报年份」→ 上传 → 展示导入结果摘要 |
|
|
199
|
|
-| **模板下载** | 可提供静态模板副本 `doc/.../templates/2026年-牦牛存栏导入模板.xlsx`(从业务文件复制) |
|
|
|
223
|
+| **模板下载** | `GET /importTemplate`;空白模板 |
|
|
|
224
|
+| **按年份导出** | 列表先选「所属年份」→ `GET /export`;`download('dataModel/yakHerdInventory/export', { statYear })` |
|
|
200
|
225
|
|
|
201
|
226
|
---
|
|
202
|
227
|
|
|
|
@@ -210,8 +235,9 @@ for (int y = current; y >= current - 5; y--) { ... }
|
|
210
|
235
|
| 按钮 | 修改 | `dataModel:yakHerdInventory:edit` |
|
|
211
|
236
|
| 按钮 | 删除 | `dataModel:yakHerdInventory:remove` |
|
|
212
|
237
|
| 按钮 | 导入 | `dataModel:yakHerdInventory:import` |
|
|
|
238
|
+| 按钮 | 导出 | `dataModel:yakHerdInventory:export` |
|
|
213
|
239
|
|
|
214
|
|
-挂载目录:**产业数据模型及服务**。
|
|
|
240
|
+挂载目录:**产业数据模型及服务**。菜单 SQL 见 `sql/biz_sys_menu_yak_herd_inventory.sql`。
|
|
215
|
241
|
|
|
216
|
242
|
---
|
|
217
|
243
|
|
|
|
@@ -223,12 +249,12 @@ for (int y = current; y >= current - 5; y--) { ... }
|
|
223
|
249
|
|
|
224
|
250
|
## 7. 交付清单
|
|
225
|
251
|
|
|
226
|
|
-- [ ] `sql/biz_yak_herd_inventory.sql`
|
|
227
|
|
-- [ ] `BizYakHerdInventory` Domain / Mapper / XML / Service / Controller
|
|
228
|
|
-- [ ] `BizYakHerdInventoryImportService` + 列映射配置
|
|
229
|
|
-- [ ] `TownDeptSupport` 乡镇字典
|
|
230
|
|
-- [ ] 前端列表/表单/导入
|
|
231
|
|
-- [ ] 单元测试 + 导入集成测试(`2026年.xlsx`)
|
|
|
252
|
+- [x] `sql/biz_yak_herd_inventory.sql`
|
|
|
253
|
+- [x] `BizYakHerdInventory` Domain / Mapper / XML / Service / Controller
|
|
|
254
|
+- [x] `YakHerdInventoryExcelParser` + `YakHerdInventoryExcelExporter`
|
|
|
255
|
+- [x] `TownDeptSupport` 乡镇字典
|
|
|
256
|
+- [x] 前端列表/表单/导入/导出
|
|
|
257
|
+- [x] 单元测试 + 导入/导出集成测试(`yak_herd_inventory_2026.xlsx`)
|
|
232
|
258
|
|
|
233
|
259
|
---
|
|
234
|
260
|
|
|
|
@@ -238,3 +264,4 @@ for (int y = current; y >= current - 5; y--) { ... }
|
|
238
|
264
|
| --- | --- |
|
|
239
|
265
|
| 1.0 | 初稿:表结构、CRUD、导入、sys_dept 乡镇、年份前推 5 年 |
|
|
240
|
266
|
| 1.1 | 增加预留字段 `village_dept_id`(非必填) |
|
|
|
267
|
+| 1.2 | 实现按年份导出全县乡镇 Excel;列映射与代码对齐;交付清单勾选 |
|