wwh vor 1 Woche
Ursprung
Commit
d9ac0d0613

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

@@ -26,6 +26,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestoc
26 26
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
27 27
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
28 28
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
29
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchTechServicePersonnelVo;
29 30
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchThreeAssetsProblemReportVo;
30 31
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
31 32
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
@@ -422,4 +423,21 @@ public class ResearchOpenApiController
422 423
             return ResearchOpenApiSupport.error(code, ex.getMessage());
423 424
         }
424 425
     }
426
+
427
+    /**
428
+     * 科技服务人员管理详情(单例配置,无查询参数)。
429
+     */
430
+    @GetMapping("/tech-service-personnel")
431
+    public OpenApiResponse<ResearchTechServicePersonnelVo> getTechServicePersonnel()
432
+    {
433
+        try
434
+        {
435
+            return ResearchOpenApiSupport.success(researchOpenApiService.getTechServicePersonnel());
436
+        }
437
+        catch (ServiceException ex)
438
+        {
439
+            int code = ex.getCode() != null ? ex.getCode() : 500;
440
+            return ResearchOpenApiSupport.error(code, ex.getMessage());
441
+        }
442
+    }
425 443
 }

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

@@ -0,0 +1,137 @@
1
+package com.ruoyi.web.modules.industryservice.research.domain.vo;
2
+
3
+/**
4
+ * 科研开放接口 — 科技服务人员管理详情(单例配置;不含操作人)。
5
+ */
6
+public class ResearchTechServicePersonnelVo
7
+{
8
+    /** 科技特派员男性人数 */
9
+    private Integer envoyMaleCount;
10
+
11
+    /** 科技特派员女性人数 */
12
+    private Integer envoyFemaleCount;
13
+
14
+    /** 科技特派员党员人数 */
15
+    private Integer envoyPartyMemberCount;
16
+
17
+    /** 科技特派员总人数(男+女) */
18
+    private Integer envoyTotalCount;
19
+
20
+    /** 农业事业单位初级人数 */
21
+    private Integer agriJuniorCount;
22
+
23
+    /** 农业事业单位员级人数 */
24
+    private Integer agriClerkCount;
25
+
26
+    /** 农业事业单位中级人数 */
27
+    private Integer agriIntermediateCount;
28
+
29
+    /** 农业事业单位副高人数 */
30
+    private Integer agriAssociateSeniorCount;
31
+
32
+    /** 农业事业单位管理级人数 */
33
+    private Integer agriManagementCount;
34
+
35
+    /** 农业事业单位总人数(五级合计) */
36
+    private Integer agriTotalCount;
37
+
38
+    public Integer getEnvoyMaleCount()
39
+    {
40
+        return envoyMaleCount;
41
+    }
42
+
43
+    public void setEnvoyMaleCount(Integer envoyMaleCount)
44
+    {
45
+        this.envoyMaleCount = envoyMaleCount;
46
+    }
47
+
48
+    public Integer getEnvoyFemaleCount()
49
+    {
50
+        return envoyFemaleCount;
51
+    }
52
+
53
+    public void setEnvoyFemaleCount(Integer envoyFemaleCount)
54
+    {
55
+        this.envoyFemaleCount = envoyFemaleCount;
56
+    }
57
+
58
+    public Integer getEnvoyPartyMemberCount()
59
+    {
60
+        return envoyPartyMemberCount;
61
+    }
62
+
63
+    public void setEnvoyPartyMemberCount(Integer envoyPartyMemberCount)
64
+    {
65
+        this.envoyPartyMemberCount = envoyPartyMemberCount;
66
+    }
67
+
68
+    public Integer getEnvoyTotalCount()
69
+    {
70
+        return envoyTotalCount;
71
+    }
72
+
73
+    public void setEnvoyTotalCount(Integer envoyTotalCount)
74
+    {
75
+        this.envoyTotalCount = envoyTotalCount;
76
+    }
77
+
78
+    public Integer getAgriJuniorCount()
79
+    {
80
+        return agriJuniorCount;
81
+    }
82
+
83
+    public void setAgriJuniorCount(Integer agriJuniorCount)
84
+    {
85
+        this.agriJuniorCount = agriJuniorCount;
86
+    }
87
+
88
+    public Integer getAgriClerkCount()
89
+    {
90
+        return agriClerkCount;
91
+    }
92
+
93
+    public void setAgriClerkCount(Integer agriClerkCount)
94
+    {
95
+        this.agriClerkCount = agriClerkCount;
96
+    }
97
+
98
+    public Integer getAgriIntermediateCount()
99
+    {
100
+        return agriIntermediateCount;
101
+    }
102
+
103
+    public void setAgriIntermediateCount(Integer agriIntermediateCount)
104
+    {
105
+        this.agriIntermediateCount = agriIntermediateCount;
106
+    }
107
+
108
+    public Integer getAgriAssociateSeniorCount()
109
+    {
110
+        return agriAssociateSeniorCount;
111
+    }
112
+
113
+    public void setAgriAssociateSeniorCount(Integer agriAssociateSeniorCount)
114
+    {
115
+        this.agriAssociateSeniorCount = agriAssociateSeniorCount;
116
+    }
117
+
118
+    public Integer getAgriManagementCount()
119
+    {
120
+        return agriManagementCount;
121
+    }
122
+
123
+    public void setAgriManagementCount(Integer agriManagementCount)
124
+    {
125
+        this.agriManagementCount = agriManagementCount;
126
+    }
127
+
128
+    public Integer getAgriTotalCount()
129
+    {
130
+        return agriTotalCount;
131
+    }
132
+
133
+    public void setAgriTotalCount(Integer agriTotalCount)
134
+    {
135
+        this.agriTotalCount = agriTotalCount;
136
+    }
137
+}

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

@@ -13,6 +13,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestoc
13 13
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
14 14
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
15 15
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
16
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchTechServicePersonnelVo;
16 17
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchThreeAssetsProblemReportVo;
17 18
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
18 19
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
@@ -153,4 +154,9 @@ public interface IResearchOpenApiService
153 154
     OpenApiPageResult<ResearchThreeAssetsProblemReportVo> listThreeAssetsProblemReports(int pageNum, int pageSize,
154 155
             String townName, String villageName, String problemType,
155 156
             Date beginReportTime, Date endReportTime);
157
+
158
+    /**
159
+     * 科技服务人员管理详情(单例配置,无查询参数)。
160
+     */
161
+    ResearchTechServicePersonnelVo getTechServicePersonnel();
156 162
 }

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

@@ -9,6 +9,7 @@ import com.github.pagehelper.PageHelper;
9 9
 import com.github.pagehelper.PageInfo;
10 10
 import com.ruoyi.common.exception.ServiceException;
11 11
 import com.ruoyi.common.utils.StringUtils;
12
+import com.ruoyi.web.modules.farming.service.IBizTechServicePersonnelService;
12 13
 import com.ruoyi.web.modules.industryservice.domain.BizCooperativeDevelopment;
13 14
 import com.ruoyi.web.modules.industryservice.domain.BizDisposableIncome;
14 15
 import com.ruoyi.web.modules.industryservice.domain.BizFamilyRanch;
@@ -48,6 +49,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestoc
48 49
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
49 50
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
50 51
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
52
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchTechServicePersonnelVo;
51 53
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchThreeAssetsProblemReportVo;
52 54
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
53 55
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
@@ -115,6 +117,9 @@ public class ResearchOpenApiServiceImpl implements IResearchOpenApiService
115 117
     @Autowired
116 118
     private BizThreeAssetsProblemReportMapper bizThreeAssetsProblemReportMapper;
117 119
 
120
+    @Autowired
121
+    private IBizTechServicePersonnelService bizTechServicePersonnelService;
122
+
118 123
     @Override
119 124
     public ResearchTokenVo authenticate(String appKey, String appSecret)
120 125
     {
@@ -512,6 +517,13 @@ public class ResearchOpenApiServiceImpl implements IResearchOpenApiService
512 517
                 rows.stream().map(ResearchOpenApiSupport::toThreeAssetsProblemReportVo).collect(Collectors.toList()));
513 518
     }
514 519
 
520
+    @Override
521
+    public ResearchTechServicePersonnelVo getTechServicePersonnel()
522
+    {
523
+        tokenService.assertEnabled();
524
+        return ResearchOpenApiSupport.toTechServicePersonnelVo(bizTechServicePersonnelService.getCurrentConfig());
525
+    }
526
+
515 527
     private int normalizePageNum(int pageNum)
516 528
     {
517 529
         return pageNum > 0 ? pageNum : 1;

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

@@ -2,6 +2,7 @@ package com.ruoyi.web.modules.industryservice.research.support;
2 2
 
3 3
 import java.time.Instant;
4 4
 import java.util.UUID;
5
+import com.ruoyi.web.modules.farming.domain.vo.TechServicePersonnelVo;
5 6
 import com.ruoyi.web.modules.industryservice.domain.BizCooperativeDevelopment;
6 7
 import com.ruoyi.web.modules.industryservice.domain.BizDisposableIncome;
7 8
 import com.ruoyi.web.modules.industryservice.domain.BizFamilyRanch;
@@ -27,6 +28,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestoc
27 28
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestockProductOutputVo;
28 29
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchPastureVo;
29 30
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
31
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchTechServicePersonnelVo;
30 32
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchThreeAssetsProblemReportVo;
31 33
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
32 34
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakAssetVo;
@@ -481,4 +483,24 @@ public final class ResearchOpenApiSupport
481 483
         vo.setHandleResult(row.getHandleResult());
482 484
         return vo;
483 485
     }
486
+
487
+    public static ResearchTechServicePersonnelVo toTechServicePersonnelVo(TechServicePersonnelVo row)
488
+    {
489
+        if (row == null)
490
+        {
491
+            return null;
492
+        }
493
+        ResearchTechServicePersonnelVo vo = new ResearchTechServicePersonnelVo();
494
+        vo.setEnvoyMaleCount(row.getEnvoyMaleCount());
495
+        vo.setEnvoyFemaleCount(row.getEnvoyFemaleCount());
496
+        vo.setEnvoyPartyMemberCount(row.getEnvoyPartyMemberCount());
497
+        vo.setEnvoyTotalCount(row.getEnvoyTotalCount());
498
+        vo.setAgriJuniorCount(row.getAgriJuniorCount());
499
+        vo.setAgriClerkCount(row.getAgriClerkCount());
500
+        vo.setAgriIntermediateCount(row.getAgriIntermediateCount());
501
+        vo.setAgriAssociateSeniorCount(row.getAgriAssociateSeniorCount());
502
+        vo.setAgriManagementCount(row.getAgriManagementCount());
503
+        vo.setAgriTotalCount(row.getAgriTotalCount());
504
+        return vo;
505
+    }
484 506
 }

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

@@ -31,6 +31,7 @@ import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchLivestoc
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 33
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchRuralThreeAssetsVo;
34
+import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchTechServicePersonnelVo;
34 35
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchThreeAssetsProblemReportVo;
35 36
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchVaccinationDataVo;
36 37
 import com.ruoyi.web.modules.industryservice.research.domain.vo.ResearchYakHerdInventoryVo;
@@ -457,4 +458,21 @@ class ResearchOpenApiControllerApiTest
457 458
                 .andExpect(jsonPath("$.data.records[0].problemType").value("fund"))
458 459
                 .andExpect(jsonPath("$.data.records[0].townName").value("雅安镇"));
459 460
     }
461
+
462
+    @Test
463
+    @DisplayName("GET /tech-service-personnel 成功")
464
+    void getTechServicePersonnel() throws Exception
465
+    {
466
+        ResearchTechServicePersonnelVo row = new ResearchTechServicePersonnelVo();
467
+        row.setEnvoyMaleCount(10);
468
+        row.setEnvoyFemaleCount(8);
469
+        row.setEnvoyTotalCount(18);
470
+        when(researchOpenApiService.getTechServicePersonnel()).thenReturn(row);
471
+
472
+        mockMvc.perform(get("/open-api/v1/research/tech-service-personnel"))
473
+                .andExpect(status().isOk())
474
+                .andExpect(jsonPath("$.code").value(200))
475
+                .andExpect(jsonPath("$.data.envoyTotalCount").value(18))
476
+                .andExpect(jsonPath("$.data.envoyMaleCount").value(10));
477
+    }
460 478
 }

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

@@ -41,6 +41,7 @@
41 41
 | 有无畜户数据列表 | 分页返回村级有无畜户填报 |
42 42
 | 农村三资数据列表 | 分页返回村级农村三资填报 |
43 43
 | 三资具体问题列表 | 分页返回三资具体问题上报 |
44
+| 科技服务人员详情 | 返回科技服务人员管理单例配置 |
44 45
 
45 46
 **本期不实现:**
46 47
 
@@ -309,6 +310,19 @@ sequenceDiagram
309 310
 
310 311
 **不返回**:部门 ID、创建人、备注等内部字段。
311 312
 
313
+### 6.17 科技服务人员详情
314
+
315
+| 项 | 说明 |
316
+| --- | --- |
317
+| 方法 | GET |
318
+| 路径 | `/tech-service-personnel` |
319
+| 鉴权 | Bearer Token |
320
+| 参数 | 无(单例配置) |
321
+
322
+**返回字段**:科技特派员男女/党员/合计人数,农业事业单位初级/员级/中级/副高/管理级/合计人数。
323
+
324
+**不返回**:操作人、更新时间等内部字段。
325
+
312 326
 ---
313 327
 
314 328
 ## 7. 脱敏规则摘要
@@ -359,6 +373,7 @@ sequenceDiagram
359 373
 | 有无畜户数据填报 | 数据源 `biz_livestock_ownership_household` |
360 374
 | 农村三资数据填报 | 数据源 `biz_rural_three_assets` |
361 375
 | 三资具体问题上报 | 数据源 `biz_three_assets_problem_report` |
376
+| 科技服务人员管理 | 数据源 `biz_tech_service_personnel`(单例) |
362 377
 | 若依权限体系 | **无**关联;开放接口走独立 Token |
363 378
 
364 379
 ---
@@ -383,5 +398,6 @@ sequenceDiagram
383 398
 | 有无畜户列表 | §6.14 |
384 399
 | 农村三资列表 | §6.15 |
385 400
 | 三资具体问题列表 | §6.16 |
401
+| 科技服务人员详情 | §6.17 |
386 402
 | 脱敏合规 | §7 |
387 403
 | 本期不实现 | §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`、`biz_rural_three_assets`、`biz_three_assets_problem_report` |
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`、`biz_three_assets_problem_report`、`biz_tech_service_personnel` |
13 13
 | **鉴权** | 独立 JWT + Servlet Filter;`@Anonymous` 绕过若依登录,Filter 校验 Bearer Token |
14 14
 | **响应** | `OpenApiResponse<T>` + `OpenApiPageResult<T>`(与第三方 farming OpenAPI 同结构) |
15 15
 
@@ -299,6 +299,19 @@ Authorization: Bearer <accessToken>
299 299
 
300 300
 实现说明:直接查 `BizThreeAssetsProblemReportMapper`(清空 `params.dataScope`)。
301 301
 
302
+### 3.17 科技服务人员详情
303
+
304
+```
305
+GET /open-api/v1/research/tech-service-personnel
306
+Authorization: Bearer <accessToken>
307
+```
308
+
309
+**查询参数:** 无(单例配置)。
310
+
311
+**`data`(ResearchTechServicePersonnelVo):** 科技特派员与农业事业单位各级人数及合计;**不含**操作人、更新时间。未配置时 `data` 可为 `null`。
312
+
313
+实现说明:复用 `IBizTechServicePersonnelService.getCurrentConfig()`。
314
+
302 315
 ---
303 316
 
304 317
 ## 4. 鉴权流程
@@ -333,8 +346,9 @@ Token 申请:`appKey`/`appSecret` 与配置项精确匹配后签发 JWT(HS51
333 346
 | 有无畜户列表 | `BizLivestockOwnershipHouseholdMapper.selectBizLivestockOwnershipHouseholdList` | `biz_livestock_ownership_household` | 年/月精确;乡镇/村名模糊;清空 `params.dataScope` |
334 347
 | 农村三资列表 | `BizRuralThreeAssetsMapper.selectBizRuralThreeAssetsList` | `biz_rural_three_assets` | 乡镇/村名模糊;清空 `params.dataScope` |
335 348
 | 三资具体问题列表 | `BizThreeAssetsProblemReportMapper.selectBizThreeAssetsProblemReportList` | `biz_three_assets_problem_report` | 乡镇/村名模糊;类型精确;上报起止日期同时有值;清空 `params.dataScope` |
349
+| 科技服务人员详情 | `IBizTechServicePersonnelService.getCurrentConfig` | `biz_tech_service_personnel` | 单例 id=1;无筛选参数 |
336 350
 
337
-实体 → VO:`ResearchOpenApiSupport.toPastureVo` / `toYakAssetVo` / `toYakHerdInventoryVo` / `toYakOutboundReportVo` / `toCooperativeDevelopmentVo` / `toLivestockProductOutputVo` / `toFamilyRanchVo` / `toDisposableIncomeVo` / `toFarmerHouseholdVo` / `toCommonProsperityProjectVo` / `toLargeLivestockFarmerVo` / `toVaccinationDataVo` / `toLivestockOwnershipHouseholdVo` / `toRuralThreeAssetsVo` / `toThreeAssetsProblemReportVo`。
351
+实体 → VO:`ResearchOpenApiSupport.toPastureVo` / `toYakAssetVo` / `toYakHerdInventoryVo` / `toYakOutboundReportVo` / `toCooperativeDevelopmentVo` / `toLivestockProductOutputVo` / `toFamilyRanchVo` / `toDisposableIncomeVo` / `toFarmerHouseholdVo` / `toCommonProsperityProjectVo` / `toLargeLivestockFarmerVo` / `toVaccinationDataVo` / `toLivestockOwnershipHouseholdVo` / `toRuralThreeAssetsVo` / `toThreeAssetsProblemReportVo` / `toTechServicePersonnelVo`
338 352
 
339 353
 ---
340 354
 
@@ -431,6 +445,10 @@ curl "http://localhost:8010/open-api/v1/research/rural-three-assets?pageNum=1&pa
431 445
 # 16. 三资具体问题
432 446
 curl "http://localhost:8010/open-api/v1/research/three-assets-problem-reports?pageNum=1&pageSize=10&problemType=fund&beginReportTime=2026-01-01&endReportTime=2026-12-31" \
433 447
   -H "Authorization: Bearer <accessToken>"
448
+
449
+# 17. 科技服务人员详情
450
+curl "http://localhost:8010/open-api/v1/research/tech-service-personnel" \
451
+  -H "Authorization: Bearer <accessToken>"
434 452
 ```
435 453
 
436 454
 ---
@@ -465,6 +483,7 @@ curl "http://localhost:8010/open-api/v1/research/three-assets-problem-reports?pa
465 483
 | §6.14 有无畜户 | **§3.14**、**§5** BizLivestockOwnershipHousehold |
466 484
 | §6.15 农村三资 | **§3.15**、**§5** BizRuralThreeAssets |
467 485
 | §6.16 三资具体问题 | **§3.16**、**§5** BizThreeAssetsProblemReport |
486
+| §6.17 科技服务人员 | **§3.17**、**§5** IBizTechServicePersonnelService |
468 487
 | §7 脱敏 | **§6** Masking |
469 488
 | §3 不实现机构区分 | 单一 app-key/secret,JWT 无 clientId |
470 489
 
@@ -474,6 +493,7 @@ curl "http://localhost:8010/open-api/v1/research/three-assets-problem-reports?pa
474 493
 
475 494
 | 版本 | 日期 | 说明 |
476 495
 | --- | --- | --- |
496
+| 1.14 | 2026-07-22 | 新增科技服务人员管理详情开放接口(单例、无参) |
477 497
 | 1.13 | 2026-07-22 | 新增三资具体问题开放列表(乡镇村模糊/类型精确/上报起止日期同时有值+分页) |
478 498
 | 1.12 | 2026-07-22 | 新增农村三资开放列表(乡镇村模糊+分页) |
479 499
 | 1.11 | 2026-07-22 | 新增有无畜户开放列表(年/月/乡镇村模糊+分页) |

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

@@ -69,6 +69,7 @@
69 69
 | KYKF-API-036 | 农村三资 | 乡镇村筛选 | 接口测试 | curl | §6.15 | 已知乡镇名片段 | GET 带筛选参数 | 条件生效;名称模糊匹配 |
70 70
 | KYKF-API-037 | 三资具体问题 | 分页列表 | 接口测试 | curl | §6.16 | 有效 Token;库有问题数据 | GET `/three-assets-problem-reports?pageNum=1&pageSize=10` | `code=200`;无部门 ID |
71 71
 | KYKF-API-038 | 三资具体问题 | 乡镇村/类型/上报区间 | 接口测试 | curl | §6.16 | 已知类型与日期区间 | GET 带筛选参数(起止日期均传) | 条件生效;仅起止同时有值时日期过滤生效 |
72
+| KYKF-API-039 | 科技服务人员 | 详情 | 接口测试 | curl | §6.17 | 有效 Token;已配置人员数据 | GET `/tech-service-personnel` | `code=200`;返回各级人数;无操作人 |
72 73
 
73 74
 ---
74 75
 
@@ -92,11 +93,12 @@
92 93
 | §6.14 有无畜户列表 | — | API-033~034 |
93 94
 | §6.15 农村三资列表 | — | API-035~036 |
94 95
 | §6.16 三资具体问题列表 | — | API-037~038 |
96
+| §6.17 科技服务人员详情 | — | API-039 |
95 97
 | §7 脱敏 | UT-001~004 | API-012 |
96 98
 | §2 分页 | — | API-010 |
97 99
 | §3 无机构区分 | UT-005 | API-001(单一凭证) |
98 100
 
99
-**用例统计**:单元 **6**、接口 **38**,合计 **44** 条。
101
+**用例统计**:单元 **6**、接口 **39**,合计 **45** 条。
100 102
 
101 103
 ---
102 104
 
@@ -124,6 +126,7 @@ curl -s "$BASE/vaccination-data?pageNum=1&pageSize=5&statYear=2026" -H "Authoriz
124 126
 curl -s "$BASE/livestock-ownership-households?pageNum=1&pageSize=5&statYear=2026" -H "Authorization: Bearer $TOKEN"
125 127
 curl -s "$BASE/rural-three-assets?pageNum=1&pageSize=5" -H "Authorization: Bearer $TOKEN"
126 128
 curl -s "$BASE/three-assets-problem-reports?pageNum=1&pageSize=5&problemType=fund&beginReportTime=2026-01-01&endReportTime=2026-12-31" -H "Authorization: Bearer $TOKEN"
129
+curl -s "$BASE/tech-service-personnel" -H "Authorization: Bearer $TOKEN"
127 130
 ```
128 131
 
129 132
 (Windows 环境可用 PowerShell `Invoke-RestMethod`,见技术方案 **§8**。)