wwh hai 1 semana
pai
achega
921c80adaa

+ 23 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/research/controller/ResearchOpenApiController.java

@@ -23,6 +23,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLargeLiv
23 23
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockOwnershipHouseholdVo;
24 24
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
25 25
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
26
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
26 27
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
27 28
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
28 29
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakHerdInventoryVo;
@@ -369,4 +370,26 @@ public class ResearchOpenApiController
369 370
             return ResearchOpenApiSupport.error(code, ex.getMessage());
370 371
         }
371 372
     }
373
+
374
+    /**
375
+     * 农村三资数据列表(村级)。
376
+     */
377
+    @GetMapping("/rural-three-assets")
378
+    public OpenApiResponse<OpenApiPageResult<ResearchRuralThreeAssetsVo>> listRuralThreeAssets(
379
+            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
380
+            @RequestParam(value = "pageSize", defaultValue = "20") int pageSize,
381
+            @RequestParam(value = "townName", required = false) String townName,
382
+            @RequestParam(value = "villageName", required = false) String villageName)
383
+    {
384
+        try
385
+        {
386
+            return ResearchOpenApiSupport.success(
387
+                    researchOpenApiService.listRuralThreeAssets(pageNum, pageSize, townName, villageName));
388
+        }
389
+        catch (ServiceException ex)
390
+        {
391
+            int code = ex.getCode() != null ? ex.getCode() : 500;
392
+            return ResearchOpenApiSupport.error(code, ex.getMessage());
393
+        }
394
+    }
372 395
 }

+ 87 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/research/domain/vo/ResearchRuralThreeAssetsVo.java

@@ -0,0 +1,87 @@
1
+package com.ruoyi.web.modules.industryservice.research.domain.vo;
2
+
3
+import java.math.BigDecimal;
4
+
5
+/**
6
+ * 科研开放接口 — 农村三资填报记录(村级;不含部门 ID / 备注)。
7
+ */
8
+public class ResearchRuralThreeAssetsVo
9
+{
10
+    /** 农村三资记录 ID */
11
+    private Long assetsId;
12
+
13
+    /** 所属乡镇名称 */
14
+    private String townName;
15
+
16
+    /** 所属村名称 */
17
+    private String villageName;
18
+
19
+    /** 经营性固定资产(万元) */
20
+    private BigDecimal operatingFixedAssets;
21
+
22
+    /** 非经营性固定资产(万元) */
23
+    private BigDecimal nonOperatingFixedAssets;
24
+
25
+    /** 固定资产(万元;派生:经营性 + 非经营性) */
26
+    private BigDecimal fixedAssets;
27
+
28
+    public Long getAssetsId()
29
+    {
30
+        return assetsId;
31
+    }
32
+
33
+    public void setAssetsId(Long assetsId)
34
+    {
35
+        this.assetsId = assetsId;
36
+    }
37
+
38
+    public String getTownName()
39
+    {
40
+        return townName;
41
+    }
42
+
43
+    public void setTownName(String townName)
44
+    {
45
+        this.townName = townName;
46
+    }
47
+
48
+    public String getVillageName()
49
+    {
50
+        return villageName;
51
+    }
52
+
53
+    public void setVillageName(String villageName)
54
+    {
55
+        this.villageName = villageName;
56
+    }
57
+
58
+    public BigDecimal getOperatingFixedAssets()
59
+    {
60
+        return operatingFixedAssets;
61
+    }
62
+
63
+    public void setOperatingFixedAssets(BigDecimal operatingFixedAssets)
64
+    {
65
+        this.operatingFixedAssets = operatingFixedAssets;
66
+    }
67
+
68
+    public BigDecimal getNonOperatingFixedAssets()
69
+    {
70
+        return nonOperatingFixedAssets;
71
+    }
72
+
73
+    public void setNonOperatingFixedAssets(BigDecimal nonOperatingFixedAssets)
74
+    {
75
+        this.nonOperatingFixedAssets = nonOperatingFixedAssets;
76
+    }
77
+
78
+    public BigDecimal getFixedAssets()
79
+    {
80
+        return fixedAssets;
81
+    }
82
+
83
+    public void setFixedAssets(BigDecimal fixedAssets)
84
+    {
85
+        this.fixedAssets = fixedAssets;
86
+    }
87
+}

+ 10 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/research/service/IResearchOpenApiService.java

@@ -11,6 +11,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLargeLiv
11 11
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockOwnershipHouseholdVo;
12 12
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
13 13
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
14
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
14 15
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
15 16
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
16 17
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakHerdInventoryVo;
@@ -128,4 +129,13 @@ public interface IResearchOpenApiService
128 129
      */
129 130
     OpenApiPageResult<ResearchLivestockOwnershipHouseholdVo> listLivestockOwnershipHouseholds(int pageNum, int pageSize,
130 131
             Integer statYear, Integer statMonth, String townName, String villageName);
132
+
133
+    /**
134
+     * 农村三资填报列表。
135
+     *
136
+     * @param townName 所属乡镇名称模糊匹配
137
+     * @param villageName 所属村名称模糊匹配
138
+     */
139
+    OpenApiPageResult<ResearchRuralThreeAssetsVo> listRuralThreeAssets(int pageNum, int pageSize,
140
+            String townName, String villageName);
131 141
 }

+ 31 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/research/service/impl/ResearchOpenApiServiceImpl.java

@@ -16,6 +16,7 @@ import com.ruoyi.web.modules.industryservice.domain.BizLargeLivestockFarmer;
16 16
 import com.ruoyi.web.modules.industryservice.domain.BizLivestockOwnershipHousehold;
17 17
 import com.ruoyi.web.modules.industryservice.domain.BizLivestockProductOutput;
18 18
 import com.ruoyi.web.modules.industryservice.domain.BizPasture;
19
+import com.ruoyi.web.modules.industryservice.domain.BizRuralThreeAssets;
19 20
 import com.ruoyi.web.modules.industryservice.domain.BizVaccinationData;
20 21
 import com.ruoyi.web.modules.industryservice.domain.BizYakAsset;
21 22
 import com.ruoyi.web.modules.industryservice.domain.BizYakHerdInventory;
@@ -28,6 +29,7 @@ import com.ruoyi.web.modules.industryservice.mapper.BizFarmerHouseholdMapper;
28 29
 import com.ruoyi.web.modules.industryservice.mapper.BizLargeLivestockFarmerMapper;
29 30
 import com.ruoyi.web.modules.industryservice.mapper.BizLivestockOwnershipHouseholdMapper;
30 31
 import com.ruoyi.web.modules.industryservice.mapper.BizLivestockProductOutputMapper;
32
+import com.ruoyi.web.modules.industryservice.mapper.BizRuralThreeAssetsMapper;
31 33
 import com.ruoyi.web.modules.industryservice.mapper.BizVaccinationDataMapper;
32 34
 import com.ruoyi.web.modules.industryservice.mapper.BizYakHerdInventoryMapper;
33 35
 import com.ruoyi.web.modules.industryservice.mapper.BizYakOutboundReportMapper;
@@ -42,6 +44,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLargeLiv
42 44
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockOwnershipHouseholdVo;
43 45
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
44 46
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
47
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
45 48
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
46 49
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
47 50
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakHerdInventoryVo;
@@ -102,6 +105,9 @@ public class ResearchOpenApiServiceImpl implements IResearchOpenApiService
102 105
     @Autowired
103 106
     private BizLivestockOwnershipHouseholdMapper bizLivestockOwnershipHouseholdMapper;
104 107
 
108
+    @Autowired
109
+    private BizRuralThreeAssetsMapper bizRuralThreeAssetsMapper;
110
+
105 111
     @Override
106 112
     public ResearchTokenVo authenticate(String appKey, String appSecret)
107 113
     {
@@ -437,6 +443,31 @@ public class ResearchOpenApiServiceImpl implements IResearchOpenApiService
437 443
                 rows.stream().map(ResearchOpenApiSupport::toLivestockOwnershipHouseholdVo).collect(Collectors.toList()));
438 444
     }
439 445
 
446
+    @Override
447
+    public OpenApiPageResult<ResearchRuralThreeAssetsVo> listRuralThreeAssets(int pageNum, int pageSize,
448
+            String townName, String villageName)
449
+    {
450
+        tokenService.assertEnabled();
451
+        int safePageNum = normalizePageNum(pageNum);
452
+        int safePageSize = normalizePageSize(pageSize);
453
+        BizRuralThreeAssets query = new BizRuralThreeAssets();
454
+        if (StringUtils.isNotEmpty(townName))
455
+        {
456
+            query.setTownName(townName.trim());
457
+        }
458
+        if (StringUtils.isNotEmpty(villageName))
459
+        {
460
+            query.setVillageName(villageName.trim());
461
+        }
462
+        // 开放接口无登录上下文,清空 dataScope,避免走填报部门权限
463
+        query.getParams().put("dataScope", "");
464
+        PageHelper.startPage(safePageNum, safePageSize);
465
+        List<BizRuralThreeAssets> rows = bizRuralThreeAssetsMapper.selectBizRuralThreeAssetsList(query);
466
+        PageInfo<BizRuralThreeAssets> page = new PageInfo<>(rows);
467
+        return toPageResult(safePageNum, safePageSize, page.getTotal(),
468
+                rows.stream().map(ResearchOpenApiSupport::toRuralThreeAssetsVo).collect(Collectors.toList()));
469
+    }
470
+
440 471
     private int normalizePageNum(int pageNum)
441 472
     {
442 473
         return pageNum > 0 ? pageNum : 1;

+ 18 - 0
baqing-admin/src/main/java/com/ruoyi/web/modules/industryservice/research/support/ResearchOpenApiSupport.java

@@ -10,6 +10,7 @@ import com.ruoyi.web.modules.industryservice.domain.BizLargeLivestockFarmer;
10 10
 import com.ruoyi.web.modules.industryservice.domain.BizLivestockOwnershipHousehold;
11 11
 import com.ruoyi.web.modules.industryservice.domain.BizLivestockProductOutput;
12 12
 import com.ruoyi.web.modules.industryservice.domain.BizPasture;
13
+import com.ruoyi.web.modules.industryservice.domain.BizRuralThreeAssets;
13 14
 import com.ruoyi.web.modules.industryservice.domain.BizVaccinationData;
14 15
 import com.ruoyi.web.modules.industryservice.domain.BizYakAsset;
15 16
 import com.ruoyi.web.modules.industryservice.domain.BizYakHerdInventory;
@@ -24,6 +25,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLargeLiv
24 25
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockOwnershipHouseholdVo;
25 26
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
26 27
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
28
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
27 29
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
28 30
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
29 31
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakHerdInventoryVo;
@@ -443,4 +445,20 @@ public final class ResearchOpenApiSupport
443 445
         vo.setWithoutLivestockLaborCount(row.getWithoutLivestockLaborCount());
444 446
         return vo;
445 447
     }
448
+
449
+    public static ResearchRuralThreeAssetsVo toRuralThreeAssetsVo(BizRuralThreeAssets row)
450
+    {
451
+        if (row == null)
452
+        {
453
+            return null;
454
+        }
455
+        ResearchRuralThreeAssetsVo vo = new ResearchRuralThreeAssetsVo();
456
+        vo.setAssetsId(row.getId());
457
+        vo.setTownName(row.getTownName());
458
+        vo.setVillageName(row.getVillageName());
459
+        vo.setOperatingFixedAssets(row.getOperatingFixedAssets());
460
+        vo.setNonOperatingFixedAssets(row.getNonOperatingFixedAssets());
461
+        vo.setFixedAssets(row.getFixedAssets());
462
+        return vo;
463
+    }
446 464
 }

+ 6 - 0
baqing-admin/src/main/resources/mapper/industryservice/BizRuralThreeAssetsMapper.xml

@@ -53,6 +53,12 @@
53 53
             <if test="villageDeptId != null">
54 54
                 and r.village_dept_id = #{villageDeptId}
55 55
             </if>
56
+            <if test="townName != null and townName != ''">
57
+                and r.town_name like concat('%', #{townName}, '%')
58
+            </if>
59
+            <if test="villageName != null and villageName != ''">
60
+                and r.village_name like concat('%', #{villageName}, '%')
61
+            </if>
56 62
             ${params.dataScope}
57 63
         </where>
58 64
         order by d.order_num asc, r.village_dept_id asc, r.id desc

+ 25 - 0
baqing-admin/src/test/java/com/ruoyi/web/modules/industryservice/research/controller/ResearchOpenApiControllerApiTest.java

@@ -30,6 +30,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLargeLiv
30 30
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockOwnershipHouseholdVo;
31 31
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
32 32
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
33
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
33 34
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
34 35
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakHerdInventoryVo;
35 36
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakOutboundReportVo;
@@ -402,4 +403,28 @@ class ResearchOpenApiControllerApiTest
402 403
                 .andExpect(jsonPath("$.data.records[0].townName").value("雅安镇"))
403 404
                 .andExpect(jsonPath("$.data.records[0].villageName").value("荣嘎村"));
404 405
     }
406
+
407
+    @Test
408
+    @DisplayName("GET /rural-three-assets 成功")
409
+    void listRuralThreeAssets() throws Exception
410
+    {
411
+        ResearchRuralThreeAssetsVo row = new ResearchRuralThreeAssetsVo();
412
+        row.setAssetsId(1L);
413
+        row.setTownName("雅安镇");
414
+        row.setVillageName("荣嘎村");
415
+        OpenApiPageResult<ResearchRuralThreeAssetsVo> page = new OpenApiPageResult<>();
416
+        page.setPageNum(1);
417
+        page.setPageSize(20);
418
+        page.setTotal(1L);
419
+        page.setRecords(Collections.singletonList(row));
420
+        when(researchOpenApiService.listRuralThreeAssets(anyInt(), anyInt(), any(), any())).thenReturn(page);
421
+
422
+        mockMvc.perform(get("/open-api/v1/research/rural-three-assets")
423
+                .param("townName", "雅安")
424
+                .param("villageName", "荣嘎"))
425
+                .andExpect(status().isOk())
426
+                .andExpect(jsonPath("$.code").value(200))
427
+                .andExpect(jsonPath("$.data.records[0].townName").value("雅安镇"))
428
+                .andExpect(jsonPath("$.data.records[0].villageName").value("荣嘎村"));
429
+    }
405 430
 }

+ 17 - 0
doc/产业数据模型及服务/科研开放数据接口/科研开放数据接口功能需求.md

@@ -39,6 +39,7 @@
39 39
 | 养殖大户数据列表 | 分页返回养殖大户填报;法人姓名脱敏 |
40 40
 | 疫苗接种数据列表 | 分页返回村级疫苗接种填报 |
41 41
 | 有无畜户数据列表 | 分页返回村级有无畜户填报 |
42
+| 农村三资数据列表 | 分页返回村级农村三资填报 |
42 43
 
43 44
 **本期不实现:**
44 45
 
@@ -279,6 +280,20 @@ sequenceDiagram
279 280
 
280 281
 **不返回**:部门 ID、创建人、备注等内部字段。
281 282
 
283
+### 6.15 农村三资数据列表
284
+
285
+| 项 | 说明 |
286
+| --- | --- |
287
+| 方法 | GET |
288
+| 路径 | `/rural-three-assets` |
289
+| 鉴权 | Bearer Token |
290
+| 分页 | 同 §6.2 |
291
+| 筛选 | `townName`(乡镇模糊)、`villageName`(村模糊) |
292
+
293
+**返回字段**:`assetsId`、乡镇村、`operatingFixedAssets`、`nonOperatingFixedAssets`、`fixedAssets`。
294
+
295
+**不返回**:部门 ID、创建人、备注等内部字段。
296
+
282 297
 ---
283 298
 
284 299
 ## 7. 脱敏规则摘要
@@ -327,6 +342,7 @@ sequenceDiagram
327 342
 | 养殖大户数据填报 | 数据源 `biz_large_livestock_farmer` |
328 343
 | 疫苗接种数据填报 | 数据源 `biz_vaccination_data` |
329 344
 | 有无畜户数据填报 | 数据源 `biz_livestock_ownership_household` |
345
+| 农村三资数据填报 | 数据源 `biz_rural_three_assets` |
330 346
 | 若依权限体系 | **无**关联;开放接口走独立 Token |
331 347
 
332 348
 ---
@@ -349,5 +365,6 @@ sequenceDiagram
349 365
 | 养殖大户列表 | §6.12 |
350 366
 | 疫苗接种列表 | §6.13 |
351 367
 | 有无畜户列表 | §6.14 |
368
+| 农村三资列表 | §6.15 |
352 369
 | 脱敏合规 | §7 |
353 370
 | 本期不实现 | §3 |

+ 22 - 2
doc/产业数据模型及服务/科研开放数据接口/科研开放数据接口技术方案.md

@@ -9,7 +9,7 @@
9 9
 | 项 | 说明 |
10 10
 | --- | --- |
11 11
 | **后端** | RuoYi **v3.9.2**(**springboot2** 分支):JDK 8、Spring MVC、MyBatis |
12
-| **数据库** | 只读查询既有表 `biz_pasture`、`biz_yak_asset`、`biz_yak_herd_inventory`、`biz_yak_outbound_report`、`biz_cooperative_development`、`biz_livestock_product_output`、`biz_family_ranch`、`biz_disposable_income`、`biz_farmer_household`、`biz_common_prosperity_project`、`biz_large_livestock_farmer`、`biz_vaccination_data`、`biz_livestock_ownership_household` |
12
+| **数据库** | 只读查询既有表 `biz_pasture`、`biz_yak_asset`、`biz_yak_herd_inventory`、`biz_yak_outbound_report`、`biz_cooperative_development`、`biz_livestock_product_output`、`biz_family_ranch`、`biz_disposable_income`、`biz_farmer_household`、`biz_common_prosperity_project`、`biz_large_livestock_farmer`、`biz_vaccination_data`、`biz_livestock_ownership_household`、`biz_rural_three_assets` |
13 13
 | **鉴权** | 独立 JWT + Servlet Filter;`@Anonymous` 绕过若依登录,Filter 校验 Bearer Token |
14 14
 | **响应** | `OpenApiResponse<T>` + `OpenApiPageResult<T>`(与第三方 farming OpenAPI 同结构) |
15 15
 
@@ -273,6 +273,19 @@ Authorization: Bearer <accessToken>
273 273
 
274 274
 实现说明:直接查 `BizLivestockOwnershipHouseholdMapper`(清空 `params.dataScope`)。
275 275
 
276
+### 3.15 农村三资数据列表
277
+
278
+```
279
+GET /open-api/v1/research/rural-three-assets?pageNum=1&pageSize=20&townName=&villageName=
280
+Authorization: Bearer <accessToken>
281
+```
282
+
283
+**查询参数:** `townName` / `villageName`(模糊);分页同前。
284
+
285
+**`records[]` 元素(ResearchRuralThreeAssetsVo):** 固定资产相关字段;**不含**部门 ID、操作人、备注。
286
+
287
+实现说明:直接查 `BizRuralThreeAssetsMapper`(清空 `params.dataScope`)。
288
+
276 289
 ---
277 290
 
278 291
 ## 4. 鉴权流程
@@ -305,8 +318,9 @@ Token 申请:`appKey`/`appSecret` 与配置项精确匹配后签发 JWT(HS51
305 318
 | 养殖大户列表 | `BizLargeLivestockFarmerMapper.selectBizLargeLivestockFarmerList` | `biz_large_livestock_farmer` | 年/月精确;乡镇/村/企业名模糊;清空 `params.dataScope` |
306 319
 | 疫苗接种列表 | `BizVaccinationDataMapper.selectBizVaccinationDataList` | `biz_vaccination_data` | 年/月精确;乡镇/村名模糊;清空 `params.dataScope` |
307 320
 | 有无畜户列表 | `BizLivestockOwnershipHouseholdMapper.selectBizLivestockOwnershipHouseholdList` | `biz_livestock_ownership_household` | 年/月精确;乡镇/村名模糊;清空 `params.dataScope` |
321
+| 农村三资列表 | `BizRuralThreeAssetsMapper.selectBizRuralThreeAssetsList` | `biz_rural_three_assets` | 乡镇/村名模糊;清空 `params.dataScope` |
308 322
 
309
-实体 → VO:`ResearchOpenApiSupport.toPastureVo` / `toYakAssetVo` / `toYakHerdInventoryVo` / `toYakOutboundReportVo` / `toCooperativeDevelopmentVo` / `toLivestockProductOutputVo` / `toFamilyRanchVo` / `toDisposableIncomeVo` / `toFarmerHouseholdVo` / `toCommonProsperityProjectVo` / `toLargeLivestockFarmerVo` / `toVaccinationDataVo` / `toLivestockOwnershipHouseholdVo`。
323
+实体 → VO:`ResearchOpenApiSupport.toPastureVo` / `toYakAssetVo` / `toYakHerdInventoryVo` / `toYakOutboundReportVo` / `toCooperativeDevelopmentVo` / `toLivestockProductOutputVo` / `toFamilyRanchVo` / `toDisposableIncomeVo` / `toFarmerHouseholdVo` / `toCommonProsperityProjectVo` / `toLargeLivestockFarmerVo` / `toVaccinationDataVo` / `toLivestockOwnershipHouseholdVo` / `toRuralThreeAssetsVo`
310 324
 
311 325
 ---
312 326
 
@@ -395,6 +409,10 @@ curl "http://localhost:8010/open-api/v1/research/vaccination-data?pageNum=1&page
395 409
 # 14. 有无畜户
396 410
 curl "http://localhost:8010/open-api/v1/research/livestock-ownership-households?pageNum=1&pageSize=10&statYear=2026&townName=雅安" \
397 411
   -H "Authorization: Bearer <accessToken>"
412
+
413
+# 15. 农村三资
414
+curl "http://localhost:8010/open-api/v1/research/rural-three-assets?pageNum=1&pageSize=10&townName=雅安" \
415
+  -H "Authorization: Bearer <accessToken>"
398 416
 ```
399 417
 
400 418
 ---
@@ -427,6 +445,7 @@ curl "http://localhost:8010/open-api/v1/research/livestock-ownership-households?
427 445
 | §6.12 养殖大户 | **§3.12**、**§5** BizLargeLivestockFarmer |
428 446
 | §6.13 疫苗接种 | **§3.13**、**§5** BizVaccinationData |
429 447
 | §6.14 有无畜户 | **§3.14**、**§5** BizLivestockOwnershipHousehold |
448
+| §6.15 农村三资 | **§3.15**、**§5** BizRuralThreeAssets |
430 449
 | §7 脱敏 | **§6** Masking |
431 450
 | §3 不实现机构区分 | 单一 app-key/secret,JWT 无 clientId |
432 451
 
@@ -436,6 +455,7 @@ curl "http://localhost:8010/open-api/v1/research/livestock-ownership-households?
436 455
 
437 456
 | 版本 | 日期 | 说明 |
438 457
 | --- | --- | --- |
458
+| 1.12 | 2026-07-22 | 新增农村三资开放列表(乡镇村模糊+分页) |
439 459
 | 1.11 | 2026-07-22 | 新增有无畜户开放列表(年/月/乡镇村模糊+分页) |
440 460
 | 1.10 | 2026-07-22 | 新增疫苗接种开放列表(年/月/乡镇村模糊+分页) |
441 461
 | 1.9 | 2026-07-22 | 新增养殖大户开放列表(年/月/乡镇村/企业名模糊+分页;法人脱敏) |

+ 5 - 1
doc/产业数据模型及服务/科研开放数据接口/科研开放数据接口测试用例.md

@@ -65,6 +65,8 @@
65 65
 | KYKF-API-032 | 疫苗接种 | 年/月/乡镇村筛选 | 接口测试 | curl | §6.13 | 已知年月与乡镇名片段 | GET 带筛选参数 | 条件生效;名称模糊匹配 |
66 66
 | KYKF-API-033 | 有无畜户 | 分页列表 | 接口测试 | curl | §6.14 | 有效 Token;库有畜户数据 | GET `/livestock-ownership-households?pageNum=1&pageSize=10` | `code=200`;无部门 ID |
67 67
 | KYKF-API-034 | 有无畜户 | 年/月/乡镇村筛选 | 接口测试 | curl | §6.14 | 已知年月与乡镇名片段 | GET 带筛选参数 | 条件生效;名称模糊匹配 |
68
+| KYKF-API-035 | 农村三资 | 分页列表 | 接口测试 | curl | §6.15 | 有效 Token;库有三资数据 | GET `/rural-three-assets?pageNum=1&pageSize=10` | `code=200`;无部门 ID |
69
+| KYKF-API-036 | 农村三资 | 乡镇村筛选 | 接口测试 | curl | §6.15 | 已知乡镇名片段 | GET 带筛选参数 | 条件生效;名称模糊匹配 |
68 70
 
69 71
 ---
70 72
 
@@ -86,11 +88,12 @@
86 88
 | §6.12 养殖大户列表 | — | API-029~030 |
87 89
 | §6.13 疫苗接种列表 | — | API-031~032 |
88 90
 | §6.14 有无畜户列表 | — | API-033~034 |
91
+| §6.15 农村三资列表 | — | API-035~036 |
89 92
 | §7 脱敏 | UT-001~004 | API-012 |
90 93
 | §2 分页 | — | API-010 |
91 94
 | §3 无机构区分 | UT-005 | API-001(单一凭证) |
92 95
 
93
-**用例统计**:单元 **6**、接口 **34**,合计 **40** 条。
96
+**用例统计**:单元 **6**、接口 **36**,合计 **42** 条。
94 97
 
95 98
 ---
96 99
 
@@ -116,6 +119,7 @@ curl -s "$BASE/common-prosperity-projects?pageNum=1&pageSize=5&implYear=2025" -H
116 119
 curl -s "$BASE/large-livestock-farmers?pageNum=1&pageSize=5&statYear=2026" -H "Authorization: Bearer $TOKEN"
117 120
 curl -s "$BASE/vaccination-data?pageNum=1&pageSize=5&statYear=2026" -H "Authorization: Bearer $TOKEN"
118 121
 curl -s "$BASE/livestock-ownership-households?pageNum=1&pageSize=5&statYear=2026" -H "Authorization: Bearer $TOKEN"
122
+curl -s "$BASE/rural-three-assets?pageNum=1&pageSize=5" -H "Authorization: Bearer $TOKEN"
119 123
 ```
120 124
 
121 125
 (Windows 环境可用 PowerShell `Invoke-RestMethod`,见技术方案 **§8**。)