wwh 2 nedēļas atpakaļ
vecāks
revīzija
33a6edc087

+ 34 - 4
doc/产业数据模型及服务/牦牛出栏数据填报/牦牛出栏数据填报前端技术方案.md

@@ -1,11 +1,41 @@
1 1
 # 牦牛出栏数据填报 — 前端技术方案
2 2
 
3
+> 依据:同目录功能需求、技术方案。
4
+
5
+## 1. 页面与 API
6
+
3 7
 | 项 | 说明 |
4 8
 | --- | --- |
5 9
 | 页面 | `ruoyi-ui/src/views/dataModel/yakOutboundReport/index.vue` |
6 10
 | API | `ruoyi-ui/src/api/dataModel/yakOutboundReport.js` |
7
-| 村树 | Treeselect + `/villageTree`;表单只选村 |
8
-| 列表 | 乡镇、村列;筛选含村 |
9
-| 导入摘要 | 新增条数(全量覆盖无更新计数) |
11
+| i18n | `lang/zh|bo/dataModel.js` → `yakOutboundReport` |
12
+| 村树 | Treeselect + `GET /villageTree`;`disable-branch-nodes` |
13
+
14
+## 2. 列表
15
+
16
+列(顺序):所属年份、所属月份、所属乡镇、所属村、农牧户数、农牧人数、牦牛出栏数、**牲畜总出栏数**、自食牛数、**自食牲畜总数**、操作。
17
+
18
+合计由前端 `sumOutboundTotal` / `sumSelfConsumptionTotal` 按明细加总。
19
+
20
+筛选:年、月、乡镇、村;进入页不默认年月。
21
+
22
+## 3. 新增 / 修改
10 23
 
11
-修订:v2.0 对齐村粒度与全量覆盖导入。
24
+- 必填:年、月、所属村(Treeselect)。  
25
+- 分区录入:农牧户情况、出栏情况(六类)、自食情况(三类)、备注。  
26
+- **不展示**牲畜总出栏数、自食牲畜总数。
27
+
28
+## 4. 详情
29
+
30
+与新增录入项一致的全部明细 + 乡镇(反推结果)+ 两项合计只读 + 备注。
31
+
32
+## 5. 导入 / 导出
33
+
34
+导入摘要仅「新增条数」(全量覆盖无更新计数)。导出选年月后下载 blob。
35
+
36
+## 8. 修订记录
37
+
38
+| 版本 | 说明 |
39
+| --- | --- |
40
+| 2.0 | 村粒度、Treeselect、全量覆盖导入 |
41
+| 2.1 | 列表十数据列;详情含合计;新增/修改隐藏合计 |

+ 61 - 7
doc/产业数据模型及服务/牦牛出栏数据填报/牦牛出栏数据填报功能需求.md

@@ -26,22 +26,75 @@
26 26
 
27 27
 ### 2.5 指标
28 28
 
29
-**录入**:农牧户户数/人数;牦牛、黄牛/奶牛/犏牛、绵羊、山羊、马骡、驴出栏;自食牛/绵羊/山羊
29
+**录入(新增/修改可编辑)**:农牧户数、农牧人数;牦牛、黄牛/奶牛/犏牛、绵羊、山羊、马骡、驴出栏;自食牛、自食绵羊、自食山羊;备注
30 30
 
31
-**导出计算(不入库)**:出栏合计 = 六类出栏之和;自食合计 = 三类自食之和。  
31
+**计算字段(不入库)**:
32
+
33
+| 名称 | 计算规则 | 展示位置 |
34
+| --- | --- | --- |
35
+| 牲畜总出栏数 | 六类出栏之和 | 列表、详情、Excel 导出;**新增/修改不展示** |
36
+| 自食牲畜总数 | 三类自食之和 | 列表、详情、Excel 导出;**新增/修改不展示** |
32 37
 
33 38
 自食大于对应出栏时允许保存,导入可返回警告。
34 39
 
35 40
 ---
36 41
 
37
-## 3~5. 功能要点
42
+## 3. 功能范围
38 43
 
39 44
 | 能力 | 说明 |
40 45
 | --- | --- |
41
-| 列表 | 筛年/月/乡镇/村;列含乡镇、村、户数、人数、牦牛出栏、自食牛 |
42
-| 新增/修改 | 年、月、村必填;乡镇反推;唯一「年+月+村」 |
43
-| 导入 | 选填报年月;解析乡镇+村;失败则不写库;成功则全量覆盖 |
44
-| 导出 | 导出该月已填报村行;合计合并序号+乡镇+村;自户数起按列求和;填表时间为导出当日年月 |
46
+| 分页列表 | 见 **§5.1** |
47
+| 新增 / 修改 | 见 **§5.2** |
48
+| 详情 | 见 **§5.3** |
49
+| 删除 | 物理删除 |
50
+| Excel 导入 / 导出 / 下载模板 | 见 **§5.4~5.5** |
51
+
52
+---
53
+
54
+## 5. 详细功能需求
55
+
56
+### 5.1 列表查询
57
+
58
+**筛选**:所属年份、所属月份、所属乡镇、所属村(均可清空;进入页不默认年月)。
59
+
60
+**列表展示列**
61
+
62
+| 列名 | 说明 |
63
+| --- | --- |
64
+| 所属年份 | `stat_year` |
65
+| 所属月份 | `stat_month`(展示为「N 月」) |
66
+| 所属乡镇 | `town_name` |
67
+| 所属村 | `village_name` |
68
+| 农牧户数 | `farmer_household_count` |
69
+| 农牧人数 | `farmer_population_count` |
70
+| 牦牛出栏数 | `yak_outbound_count` |
71
+| 牲畜总出栏数 | 六类出栏之和(前端计算) |
72
+| 自食牛数 | `self_consumption_cattle_count` |
73
+| 自食牲畜总数 | 三类自食之和(前端计算) |
74
+| 操作 | 查看、修改、删除 |
75
+
76
+### 5.2 新增 / 修改
77
+
78
+| 项 | 要求 |
79
+| --- | --- |
80
+| 必填 | 所属年份、所属月份、所属村 |
81
+| 录入项 | **§2.5** 全部可编辑明细(不含两项合计) |
82
+| 乡镇 | 由村反推,表单不单独选择 |
83
+| 默认值 | 新增时年月默认当前年月 |
84
+| 唯一性 | 同年同月同村已存在则禁止新增 |
85
+| 合计 | **不展示**牲畜总出栏数、自食牲畜总数 |
86
+
87
+### 5.3 详情
88
+
89
+展示与新增录入字段一致的全部明细,并额外展示:**所属乡镇**、**牲畜总出栏数**、**自食牲畜总数**(只读计算)。
90
+
91
+### 5.4 Excel 导入
92
+
93
+选填报年月 → 解析乡镇+村 → 任一行失败则不写库 → 成功则该年月全量覆盖。
94
+
95
+### 5.5 Excel 导出
96
+
97
+导出该月已填报村行;合计行合并序号+乡镇+村;自户数起按列求和;填表时间为导出当日年月。
45 98
 
46 99
 Excel 列:序号、乡镇、村、户数、人数、六类出栏、出栏合计、三类自食、自食合计。
47 100
 
@@ -59,3 +112,4 @@ Excel 列:序号、乡镇、村、户数、人数、六类出栏、出栏合
59 112
 | --- | --- |
60 113
 | 1.0~1.x | 乡镇粒度、按年月、upsert 等历史版本 |
61 114
 | 2.0 | 按村填报;列含村;导入全量覆盖;导出合计按列求和;对齐交接模板 |
115
+| 2.1 | 列表增牲畜总出栏数/自食牲畜总数;详情展示全部明细+合计;新增/修改不展示合计 |

+ 17 - 7
doc/产业数据模型及服务/牦牛出栏数据填报/牦牛出栏数据填报技术方案.md

@@ -8,13 +8,13 @@ Controller `/dataModel/yakOutboundReport` → Service → Mapper;Excel:`YakO
8 8
 
9 9
 ## 2. 表 `biz_yak_outbound_report`
10 10
 
11
-唯一键 `uk_year_month_village (stat_year, stat_month, village_dept_id)`;含 `town_*`、`village_*` 及出栏/自食明细字段。DDL:`sql/biz_yak_outbound_report.sql`(`DROP` 全量重建)。
11
+唯一键 `uk_year_month_village (stat_year, stat_month, village_dept_id)`;含 `town_*`、`village_*` 及出栏/自食明细字段。两项合计**不落库**。DDL:`sql/biz_yak_outbound_report.sql`(`DROP` 全量重建)。
12 12
 
13 13
 ## 3. 接口
14 14
 
15 15
 | URI | 说明 |
16 16
 | --- | --- |
17
-| CRUD `/list` `/{id}` POST/PUT/DELETE | 同常规 |
17
+| CRUD `/list` `/{id}` POST/PUT/DELETE | 同常规;列表/详情返回明细字段 |
18 18
 | `/villageTree` | 县→乡镇→村 |
19 19
 | `/importData` | 年月全量覆盖 |
20 20
 | `/export` | 按年月导出已填报村数据 |
@@ -30,19 +30,29 @@ Controller `/dataModel/yakOutboundReport` → Service → Mapper;Excel:`YakO
30 30
 | 12~14 | 自食牛/绵羊/山羊 |
31 31
 | 15 | 自食合计(导出算) |
32 32
 
33
-数据起始行:`headerRow + 1`(表头为含「乡镇」「村」「户数」「牦牛」的行)
33
+数据起始行:`headerRow + 1`。
34 34
 
35
-## 4. 导入 / 导出
35
+## 4. 前端合计
36
+
37
+| 字段 | 计算 | 使用处 |
38
+| --- | --- | --- |
39
+| 牲畜总出栏数 | 六类出栏 sum | 列表列、详情只读 |
40
+| 自食牲畜总数 | 三类自食 sum | 列表列、详情只读 |
41
+
42
+新增/修改表单**不渲染**上述两项。
43
+
44
+## 5. 导入 / 导出
36 45
 
37 46
 - 导入:校验全部成功 → `deleteByYearMonth` → 批量 insert。  
38
-- 导出:写村行 + 行内小计;合计行合并 0~2 列;自户数起求和;标题年/月与填表人/填表时间更新。
47
+- 导出:写村行 + 行内小计;合计行合并 0~2 列;自户数起求和。
39 48
 
40
-## 5. 大屏
49
+## 6. 大屏
41 50
 
42
-地图乡镇标注对 `biz_yak_outbound_report` / `biz_yak_herd_inventory` 按 `town_dept_id` **聚合 sum** 后再关联。
51
+地图乡镇标注对填报表按 `town_dept_id` **聚合 sum** 后再关联。
43 52
 
44 53
 ## 8. 修订记录
45 54
 
46 55
 | 版本 | 说明 |
47 56
 | --- | --- |
48 57
 | 2.0 | 村粒度全量覆盖;列映射对齐交接模板;大屏按乡镇聚合 |
58
+| 2.1 | 列表/详情合计字段口径;新增修改不展示合计 |

+ 44 - 97
doc/产业数据模型及服务/牦牛出栏数据填报/牦牛出栏数据填报测试用例.md

@@ -1,100 +1,52 @@
1 1
 # 牦牛出栏数据填报 — 测试用例
2 2
 
3 3
 > 依据:`牦牛出栏数据填报功能需求.md`、`牦牛出栏数据填报技术方案.md`  
4
-> **接口 Base Path(示例)**:`/dataModel/yakOutboundReport`  
5
-> **模板文件**:`牲畜数据.xlsx` 第 **6** 个 Sheet(2026 年度出栏及自食统计表)  
6
-> **乡镇样本**:巴青乡、江绵乡、岗切乡、雅安镇、拉西镇、本塔乡、杂色镇、贡日乡、玛如乡、阿秀乡(`sys_dept`,`parent_id=100`,`order_num>12`)
4
+> **接口 Base Path**:`/dataModel/yakOutboundReport`  
5
+> **模板**:`yak_outbound_report_import_template.xlsx` / 测试样例 `yak_outbound_report_2026.xlsx`
7 6
 
8
-**通用前置**:已登录且具备模块权限;`sys_dept` 已执行 `sql/sys_dept_import_town.sql`;测试库无冲突数据或已隔离
7
+**通用前置**:已登录且具备模块权限;`sys_dept` 已导入乡镇与村
9 8
 
10 9
 ---
11 10
 
12
-## 一、单元测试用例
13
-
14
-| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
15
-| --- | --- | --- | --- | --- | --- | --- | --- | --- |
16
-| ZCZX-MYCNCL-UT-001 | 年份 | 可选年份范围 | 单元测试 | JUnit5 | §2.2 | 固定时钟 2026 | `yearOptions` | 返回 2026~2021 共 6 年 |
17
-| ZCZX-MYCNCL-UT-002 | 乡镇 | 字典过滤 | 单元测试 | JUnit5 | §2.3 | Mock dept 表 | `TownDeptSupport.listReportTowns()` | 仅 `parent_id=100` 且 `order_num>12` |
18
-| ZCZX-MYCNCL-UT-003 | 校验 | 必填年份乡镇 | 单元测试 | JUnit5 | §5.2 | 无 | `validate(row)` 缺 `statYear` | 抛 `ServiceException` |
19
-| ZCZX-MYCNCL-UT-004 | 校验 | 负数拒绝 | 单元测试 | JUnit5 | §2.4 | 无 | `yakOutboundCount=-1` | 校验失败 |
20
-| ZCZX-MYCNCL-UT-005 | 唯一性 | 同年同月同乡镇 | 单元测试 | JUnit5+Mockito | §5.2 | 已存在 2026-05+巴青乡 | `insert` 同键 | 失败「该年该月该乡镇已填报」 |
21
-| ZCZX-MYCNCL-UT-006 | 新增 | 新增成功 | 单元测试 | JUnit5+Mockito | §5.2 | 无同年同月同乡镇 | `insert` 最小必填 | 成功 |
22
-| ZCZX-MYCNCL-UT-007 | 导入解析 | 识别第 6 Sheet | 单元测试 | JUnit5 | §5.6 | `牲畜数据.xlsx` | `getSheetAt(5)` | Sheet 标题含「出栏及自食」 |
23
-| ZCZX-MYCNCL-UT-008 | 导入解析 | 识别表头行 | 单元测试 | JUnit5 | §3.9.1 | 模板 | `detectHeaderRow` | 定位含「乡镇」「户数」表头 |
24
-| ZCZX-MYCNCL-UT-009 | 导入解析 | 乡镇名匹配 | 单元测试 | JUnit5 | §5.6 | 行「杂色镇」 | `resolveTownDeptId` | 返回对应 `dept_id` |
25
-| ZCZX-MYCNCL-UT-010 | 导入解析 | 扎色镇别名 | 单元测试 | JUnit5 | §8 | 行「扎色镇」 | `resolveTownDeptId` | 映射为「杂色镇」`dept_id` |
26
-| ZCZX-MYCNCL-UT-011 | 导入解析 | 跳过合计行 | 单元测试 | JUnit5 | §5.6 | 含「合计」行 | `parseRows` | 不写入合计 |
27
-| ZCZX-MYCNCL-UT-012 | 导入解析 | 列映射 | 单元测试 | JUnit5 | §5.6 | 巴青乡样本行 | 解析 | `yakOutboundCount`、`selfConsumptionCattleCount` 等与模板一致 |
28
-| ZCZX-MYCNCL-UT-013 | 导入 | upsert 新增 | 单元测试 | JUnit5+Mockito | §5.6 | DB 无 2026-05+本塔乡 | `importData(2026,5,file)` | `insertCount>=1` |
29
-| ZCZX-MYCNCL-UT-014 | 导入 | upsert 更新 | 单元测试 | JUnit5+Mockito | §5.6 | 已有 2026-05 各乡镇 | 同一文件再导入 | `updateCount=10`;`insertCount=0` |
30
-| ZCZX-MYCNCL-UT-015 | 修改 | 记录不存在 | 单元测试 | JUnit5+Mockito | §5.3 | id 不存在 | `update` | 抛 `ServiceException` |
31
-| ZCZX-MYCNCL-UT-016 | 删除 | 物理删除 | 单元测试 | JUnit5+Mockito | §5.4 | 有效 id | `deleteByIds` | 调用 Mapper 物理删除;无 `del_flag` 更新 |
32
-| ZCZX-MYCNCL-UT-017 | 数据权限 | 乡镇账号过滤 | 单元测试 | JUnit5+Mockito | §6 | 用户 dept=杂色镇 | `selectList` | 仅本乡镇 |
33
-| ZCZX-MYCNCL-UT-018 | 警告 | 自食大于出栏 | 单元测试 | JUnit5 | §2.4 | 自食牛>牦牛出栏 | 校验/导入 | 允许保存;`warnMessages` 含提示 |
34
-| ZCZX-MYCNCL-UT-019 | 导出 | 按年月填充模板 | 单元测试 | JUnit5 | §5.7 | 模板+1 乡镇样本 | `YakOutboundReportExcelExporter.export` | 返回 xlsx;解析含对应出栏数 |
35
-| ZCZX-MYCNCL-UT-020 | 导出 | 全县乡镇行数 | 单元测试 | JUnit5 | §5.7 | 10 乡镇字典 | `export(2026, towns, map)` | 解析 10 数据行;无样例残留数据 |
36
-| ZCZX-MYCNCL-UT-021 | 月份 | 未来月拒绝 | 单元测试 | JUnit5 | §2.2.1 | 当前年 | `validateStatPeriod(2026, 未来月)` | 抛 `ServiceException` |
37
-| ZCZX-MYCNCL-UT-022 | 月份 | 月份选项 | 单元测试 | JUnit5 | §2.2.1 | 无 | `resolveMonthOptions()` | 返回 1~12 |
11
+## 一、单元测试用例(摘要)
12
+
13
+| 用例编号 | 测试项 | 预期结果 |
14
+| --- | --- | --- |
15
+| ZCZX-MYCNCL-UT-001 | 年份选项 | 当年起前 5 年共 6 个 |
16
+| ZCZX-MYCNCL-UT-003 | 缺村校验 | 抛异常 |
17
+| ZCZX-MYCNCL-UT-004 | 负数拒绝 | 校验失败 |
18
+| ZCZX-MYCNCL-UT-005 | 同年同月同村唯一 | 失败「该年该月该村已填报」 |
19
+| ZCZX-MYCNCL-UT-006 | 新增成功 | 乡镇由村反推 |
20
+| ZCZX-MYCNCL-UT-007~011 | 解析表头/村行/跳过合计 | 与新模板列一致 |
21
+| ZCZX-MYCNCL-UT-013 | 导入全量覆盖 | `deleteByYearMonth` 后 insert |
22
+| ZCZX-MYCNCL-UT-018 | 自食大于出栏 | 警告不阻断 |
23
+| ZCZX-MYCNCL-UT-019 | 导出合计求和 | 合计行数值正确 |
38 24
 
39 25
 ---
40 26
 
41
-## 二、接口测试用例
42
-
43
-| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
44
-| --- | --- | --- | --- | --- | --- | --- | --- | --- |
45
-| ZCZX-MYCNCL-API-001 | 列表 | 默认分页 | 接口测试 | Postman | §5.1 | 已登录;有样本 | `GET /list` | `code=200`;含所属年份、**所属月份**、所属乡镇、农牧户户数、农牧户人数、牦牛出栏数、自食情况(牛) |
46
-| ZCZX-MYCNCL-API-002 | 列表 | 按年份筛选 | 接口测试 | Postman | §5.1 | 有 2025、2026 数据 | `statYear=2026` | 仅 2026 |
47
-| ZCZX-MYCNCL-API-002a | 列表 | 按年月筛选 | 接口测试 | Postman | §5.1 | 同 year 多 month | `statYear=2026&statMonth=5` | 仅 2026 年 5 月 |
48
-| ZCZX-MYCNCL-API-003 | 列表 | 按乡镇筛选 | 接口测试 | Postman | §5.1 | 已知 dept_id | `townDeptId=` | 仅该乡镇 |
49
-| ZCZX-MYCNCL-API-004 | 列表 | 组合筛选 | 接口测试 | Postman | §5.1 | 已登录 | 年+月+乡镇 | 交集结果 |
50
-| ZCZX-MYCNCL-API-005 | 详情 | 指定七字段 | 接口测试 | Postman | §5.5 | 有效 id | `GET /{id}` | 含年份、**月份**、乡镇、农牧户户数、农牧户人数、牦牛出栏数、自食牛头数 |
51
-| ZCZX-MYCNCL-API-006 | 新增 | 必填成功 | 接口测试 | Postman | §5.2 | 无重复 | `POST` 含 `statYear`+`statMonth`+`townDeptId` | 成功 |
52
-| ZCZX-MYCNCL-API-007 | 新增 | 缺年份 | 接口测试 | Postman | §5.2 | 已登录 | 缺 `statYear` | 失败 |
53
-| ZCZX-MYCNCL-API-008 | 新增 | 缺乡镇 | 接口测试 | Postman | §5.2 | 已登录 | 缺 `townDeptId` | 失败 |
54
-| ZCZX-MYCNCL-API-009 | 新增 | 重复同年月乡镇 | 接口测试 | Postman | §5.2 | 已有记录 | 再 `POST` 同键 | 失败 |
55
-| ZCZX-MYCNCL-API-010 | 修改 | 更新出栏指标 | 接口测试 | Postman | §5.3 | 有效 id | `PUT` 改 `yakOutboundCount`、绵羊出栏等 | 成功;详情/列表为新值 |
56
-| ZCZX-MYCNCL-API-011 | 删除 | 物理删除 | 接口测试 | Postman | §5.4 | 有效 id | `DELETE /{id}` | 成功;库中无该记录 |
57
-| ZCZX-MYCNCL-API-012 | 下拉 | 年份选项 | 接口测试 | Postman | §2.2 | 已登录 | `GET /yearOptions` | 6 个年份 |
58
-| ZCZX-MYCNCL-API-013 | 下拉 | 乡镇选项 | 接口测试 | Postman | §2.3 | 已登录 | `GET /townOptions` | 10 个乡镇 |
59
-| ZCZX-MYCNCL-API-013a | 下拉 | 月份选项 | 接口测试 | Postman | §2.2.1 | 已登录 | `GET /monthOptions` | 1~12 |
60
-| ZCZX-MYCNCL-API-014 | 导入 | 全量乡镇 | 接口测试 | Postman | §5.6 | 空库 2026-05 | `POST /importData`+第 6 Sheet+`statYear=2026&statMonth=5` | `insertCount=10`;`failCount=0` |
61
-| ZCZX-MYCNCL-API-015 | 导入 | 覆盖更新 | 接口测试 | Postman | §5.6 | 已有 2026-05 全量 | 改 Excel 一行再导入 | `updateCount>=1` |
62
-| ZCZX-MYCNCL-API-016 | 导入 | 缺填报年月 | 接口测试 | Postman | §5.6 | 已登录 | 仅上传文件或缺 `statMonth` | 失败 |
63
-| ZCZX-MYCNCL-API-017 | 导入 | 非 xlsx | 接口测试 | Postman | §5.6 | 已登录 | 上传 `.csv` | 失败 |
64
-| ZCZX-MYCNCL-API-018 | 权限 | 无 add | 接口测试 | Postman | §6 | 仅 list 角色 | `POST /` | 403 |
65
-| ZCZX-MYCNCL-API-019 | 权限 | 无 import | 接口测试 | Postman | §6 | 无 import | `POST /importData` | 403 |
66
-| ZCZX-MYCNCL-API-020 | 端到端 | 导入-查-详情 | 接口测试 | Postman | §4 | 空库 | 导入 2026-05→list→detail | 牦牛出栏数、自食牛与 Excel 一致 |
67
-| ZCZX-MYCNCL-API-021 | 导出 | 按年月导出 | 接口测试 | Postman/MockMvc | §5.7 | 有 2026-05 数据 | `GET /export?statYear=2026&statMonth=5` | `200`;xlsx |
68
-| ZCZX-MYCNCL-API-022 | 导出 | 缺 statMonth | 接口测试 | Postman | §5.7 | 已登录 | `GET /export?statYear=2026` | 失败 |
69
-| ZCZX-MYCNCL-API-023 | 导出 | 非法年份 | 接口测试 | Postman | §5.7 | 已登录 | `statYear=1999` | 失败 |
70
-| ZCZX-MYCNCL-API-024 | 权限 | 无 export | 接口测试 | Postman | §6 | 无 export | `GET /export?statYear=2026&statMonth=5` | 403 |
71
-| ZCZX-MYCNCL-API-025 | 端到端 | 导出-再导入 | 接口测试 | Postman | §5.7 | 有 2026-05 全量 | 导出→改一行→导入 | upsert 成功 |
27
+## 二、接口测试用例(摘要)
28
+
29
+| 用例编号 | 测试项 | 预期结果 |
30
+| --- | --- | --- |
31
+| ZCZX-MYCNCL-API-001 | 列表 | 返回明细字段(合计由前端算) |
32
+| ZCZX-MYCNCL-API-003a | 按村筛选 | `villageDeptId` 精确 |
33
+| ZCZX-MYCNCL-API-005 | 详情 | 含全部明细;乡镇/村齐全 |
34
+| ZCZX-MYCNCL-API-006~009 | 新增 | 必填村;同村重复失败 |
35
+| ZCZX-MYCNCL-API-013a | 村树 | `GET /villageTree` |
36
+| ZCZX-MYCNCL-API-014~015 | 导入 | 全量覆盖;无有效行报错 |
37
+| ZCZX-MYCNCL-API-021 | 导出 | 按年月 xlsx |
72 38
 
73 39
 ---
74 40
 
75
-## 三、界面测试用例(UI)
76
-
77
-**工具**:Playwright + Chrome(与项目其他模块一致)。
78
-
79
-| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
80
-| --- | --- | --- | --- | --- | --- | --- | --- | --- |
81
-| ZCZX-MYCNCL-UI-001 | 列表 | 默认加载 | UI 测试 | Playwright | §5.1 | 有数据 | 进入菜单 | 列含所属年份、**所属月份**、乡镇…;**年月筛选为空** |
82
-| ZCZX-MYCNCL-UI-002 | 列表 | 年月乡镇筛选 | UI 测试 | Playwright | §5.1 | 有数据 | 选择后搜索 | 结果正确 |
83
-| ZCZX-MYCNCL-UI-003 | 列表 | 重置 | UI 测试 | Playwright | §5.1 | 已筛选 | 点重置 | 条件清空 |
84
-| ZCZX-MYCNCL-UI-004 | 新增 | 必填校验 | UI 测试 | Playwright | §5.2 | 有 add 权限 | 不选乡镇提交 | 表单提示 |
85
-| ZCZX-MYCNCL-UI-005 | 新增 | 年份下拉 6 项 | UI 测试 | Playwright | §2.2 | 打开表单 | 查看年份下拉 | 当年起前 5 年 |
86
-| ZCZX-MYCNCL-UI-006 | 新增 | 乡镇下拉 | UI 测试 | Playwright | §2.3 | 打开表单 | 查看乡镇下拉 | 10 个乡镇 |
87
-| ZCZX-MYCNCL-UI-007 | 新增 | 全指标可填 | UI 测试 | Playwright | §5.3 | 打开表单 | 填写绵羊/山羊出栏等 | 可保存 |
88
-| ZCZX-MYCNCL-UI-008 | 修改 | 回显保存 | UI 测试 | Playwright | §5.3 | 有记录 | 修改牦牛出栏数保存 | 列表更新 |
89
-| ZCZX-MYCNCL-UI-009 | 删除 | 二次确认 | UI 测试 | Playwright | §5.4 | 有记录 | 删除确认 | 行消失 |
90
-| ZCZX-MYCNCL-UI-010 | 详情 | 七字段只读 | UI 测试 | Playwright | §5.5 | 有完整数据 | 点查看 | 展示年份、**月份**、乡镇、农牧户户数、农牧户人数、牦牛出栏数、自食情况(牛) |
91
-| ZCZX-MYCNCL-UI-011 | 导入 | 选年月上传 | UI 测试 | Playwright | §5.6 | 有 import 权限 | 默认当前年月→上传第 6 Sheet | 成功摘要 |
92
-| ZCZX-MYCNCL-UI-012 | 导入 | 未选月份 | UI 测试 | Playwright | §5.6 | 有 import 权限 | 缺月份提交 | 表单校验失败 |
93
-| ZCZX-MYCNCL-UI-013 | 权限 | 无导入按钮 | UI 测试 | Playwright | §6 | 无 import | 进入页面 | 无导入入口 |
94
-| ZCZX-MYCNCL-UI-014 | 端到端 | 导入后列表 | UI 集成 | Playwright | §4 | 空库 | 导入→筛选 2026-05 | 10 行乡镇数据 |
95
-| ZCZX-MYCNCL-UI-015 | 导出 | 按年月导出 | UI 测试 | Playwright | §5.7 | 有 export 权限 | 选年月导出 | 下载 `{年}年{月}月牦牛出栏数据.xlsx` |
96
-| ZCZX-MYCNCL-UI-016 | 导出 | 未选月份 | UI 测试 | Playwright | §5.7 | 有 export 权限 | 缺月份点导出 | 表单校验失败 |
97
-| ZCZX-MYCNCL-UI-017 | 权限 | 无导出按钮 | UI 测试 | Playwright | §6 | 无 export | 进入页面 | 无导出入口 |
41
+## 三、界面测试用例(摘要)
42
+
43
+| 用例编号 | 测试项 | 预期结果 |
44
+| --- | --- | --- |
45
+| ZCZX-MYCNCL-UI-001 | 列表列 | 含年/月/乡镇/村/农牧户数/农牧人数/牦牛出栏/牲畜总出栏数/自食牛数/自食牲畜总数 |
46
+| ZCZX-MYCNCL-UI-006 | 新增村树 | 仅可选村叶子 |
47
+| ZCZX-MYCNCL-UI-007 | 新增表单 | 可填全部明细;**不出现**牲畜总出栏数、自食牲畜总数 |
48
+| ZCZX-MYCNCL-UI-010 | 详情 | 全部明细 + 两项合计只读 |
49
+| ZCZX-MYCNCL-UI-011 | 导入 | 全量覆盖成功摘要 |
98 50
 
99 51
 ---
100 52
 
@@ -102,16 +54,11 @@
102 54
 
103 55
 | 需求章节 | 要点 | 主要用例 |
104 56
 | --- | --- | --- |
105
-| §2.2 年份 | 向前 5 年 | UT-001;API-012;UI-005 |
106
-| §2.2.1 月份 | 1~12、非未来月 | UT-021~022;API-013a |
107
-| §2.3 乡镇 | sys_dept 二级 order_num>12 | UT-002;API-013;UI-006 |
108
-| §5.1 列表 | 7 数据列+操作;默认不筛年月 | API-001~004、002a;UI-001~003 |
109
-| §5.2~5.4 CRUD | 必填、唯一、物理删除 | UT-003~006、015~016;API-006~011 |
110
-| §5.5 详情 | 七字段(含月份) | API-005;UI-010 |
111
-| §5.6 导入 | 第 6 Sheet | UT-007~014;API-014~017;UI-011~012 |
112
-| §5.7 导出 | 按年月全县乡镇 | UT-019~020;API-021~025;UI-015~016 |
113
-| §6 权限 | 按钮级 | API-018~019、024;UI-013、017 |
114
-| §8 扎色镇别名 | 导入映射 | UT-010 |
57
+| §2.5 合计 | 不入库;列表/详情展示;表单不展示 | UI-001、007、010 |
58
+| §5.1 列表 | 十数据列 | UI-001;API-001 |
59
+| §5.2 新增修改 | 只选村;无合计输入 | UI-006~007 |
60
+| §5.3 详情 | 明细+合计 | UI-010;API-005 |
61
+| §5.4~5.5 导入导出 | 全量覆盖、合计行 | UT-013、019;API-014、021 |
115 62
 
116 63
 ---
117 64
 
@@ -119,6 +66,6 @@
119 66
 
120 67
 | 版本 | 说明 |
121 68
 | --- | --- |
122
-| 1.0 | 初版:单元 18、接口 20、UI 14;编号前缀 **ZCZX-MYCNCL** |
123
-| 1.1 | 补充按年份导出用例 UT-019~020、API-021~025、UI-015~017 |
124
-| 1.2 | 按年月填报:UT-005/021~022;API-002a/013a/014/021~022;UI 年月筛选与导出;唯一键改为年+月+乡镇 |
69
+| 1.0~1.x | 乡镇粒度、upsert、七列列表等历史版本 |
70
+| 2.0 | 村粒度、全量覆盖、新模板列 |
71
+| 2.1 | 列表十列含两项合计;新增/修改不展示合计;详情含合计 |