wwh před 16 hodinami
rodič
revize
3b5c57229d

+ 3 - 3
baqing-admin/src/main/java/com/ruoyi/web/modules/screen/controller/HomeScreenController.java

@@ -253,9 +253,9 @@ public class HomeScreenController extends BaseController
253
 
253
 
254
     /**
254
     /**
255
      * 养殖主体数量明细(分页);按年、月倒序。
255
      * 养殖主体数量明细(分页);按年、月倒序。
256
-     * <p>村×年月键集 = 农牧户 ∪ 合作社,左关联家庭牧场/养殖大户计数
257
-     * 仅合作社有数据时仍返回,其余数量为 0。
258
-     * 条件:年/月/乡镇/村均可选;未传年月不过滤以支持跨多年全量翻页(界面默认当前年月)。</p>
256
+     * <p>村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户
257
+     * 任一组织形式有数据即可返回,其余数量为 0。
258
+     * 条件:年/月/乡镇/村均可选;未传年月不过滤以支持跨多年全量翻页(界面默认当前年月)。</p>
259
      */
259
      */
260
     @GetMapping("/breedingEntityQuantities")
260
     @GetMapping("/breedingEntityQuantities")
261
     public TableDataInfo breedingEntityQuantities(
261
     public TableDataInfo breedingEntityQuantities(

+ 2 - 2
baqing-admin/src/main/java/com/ruoyi/web/modules/screen/domain/vo/HomeScreenBreedingEntityQuantityListItemVo.java

@@ -3,8 +3,8 @@ package com.ruoyi.web.modules.screen.domain.vo;
3
 /**
3
 /**
4
  * 大屏首页 — 养殖主体数量明细行。
4
  * 大屏首页 — 养殖主体数量明细行。
5
  * <p>
5
  * <p>
6
- * 村×年月键集 = {@code biz_farmer_household} ∪ {@code biz_cooperative_development}
7
- * 左关联家庭牧场 / 养殖大户计数。仅有合作社数据时仍出列,其余数量为 0。
6
+ * 村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户
7
+ * 任一组织形式有数据即可出列,其余数量为 0。
8
  */
8
  */
9
 public class HomeScreenBreedingEntityQuantityListItemVo
9
 public class HomeScreenBreedingEntityQuantityListItemVo
10
 {
10
 {

+ 2 - 2
baqing-admin/src/main/java/com/ruoyi/web/modules/screen/mapper/HomeScreenStatsMapper.java

@@ -241,8 +241,8 @@ public interface HomeScreenStatsMapper
241
             @Param("villageDeptId") Long villageDeptId);
241
             @Param("villageDeptId") Long villageDeptId);
242
 
242
 
243
     /**
243
     /**
244
-     * 养殖主体数量明细:村×年月键集 = 农牧户 ∪ 合作社;左关联家庭牧场/养殖大户计数
245
-     * 仅有合作社数据时仍返回行,农牧户/家庭牧场/养殖大户为 0。年月未传不过滤,支持跨多年翻页。
244
+     * 养殖主体数量明细:村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户
245
+     * 任一组织形式有数据即可出列,其余为 0。年月未传不过滤,支持跨多年翻页。
246
      */
246
      */
247
     List<HomeScreenBreedingEntityQuantityListItemVo> selectBreedingEntityQuantityList(
247
     List<HomeScreenBreedingEntityQuantityListItemVo> selectBreedingEntityQuantityList(
248
             @Param("statYear") Integer statYear,
248
             @Param("statYear") Integer statYear,

+ 2 - 2
baqing-admin/src/main/java/com/ruoyi/web/modules/screen/service/IHomeScreenService.java

@@ -123,8 +123,8 @@ public interface IHomeScreenService
123
 
123
 
124
     /**
124
     /**
125
      * 养殖主体数量明细(分页;按年、月倒序)。
125
      * 养殖主体数量明细(分页;按年、月倒序)。
126
-     * 村×年月键集来自农牧户 ∪ 合作社;左关联家庭牧场/养殖大户计数
127
-     * 仅合作社有数据时仍可查出,其他数量为 0。年月未传不过滤,支持跨多年全量翻页(前端筛选项可默认当前年月)。
126
+     * 村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户(不同组织形式)
127
+     * 任一形式有数据即可查出,其余数量为 0。年月未传不过滤,支持跨多年全量翻页(界面默认当前年月)。
128
      */
128
      */
129
     List<HomeScreenBreedingEntityQuantityListItemVo> listBreedingEntityQuantities(
129
     List<HomeScreenBreedingEntityQuantityListItemVo> listBreedingEntityQuantities(
130
             Integer statYear, Integer statMonth, Long townDeptId, Long villageDeptId);
130
             Integer statYear, Integer statMonth, Long townDeptId, Long villageDeptId);

+ 28 - 17
baqing-admin/src/main/resources/mapper/screen/HomeScreenStatsMapper.xml

@@ -635,33 +635,31 @@
635
         order by t.stat_year desc, t.stat_month desc, t.town_dept_id asc, t.village_dept_id asc
635
         order by t.stat_year desc, t.stat_month desc, t.town_dept_id asc, t.village_dept_id asc
636
     </select>
636
     </select>
637
 
637
 
638
-    <!--
639
-      养殖主体数量明细:农牧户主表驱动;相关计数用相关子查询(仅对本页行求值,利于跨年分页);
640
-      ORDER BY 对齐 uk(stat_year,stat_month,village_dept_id)。
641
-    -->
642
     <!--
638
     <!--
643
       养殖主体数量明细:
639
       养殖主体数量明细:
644
-      键集 = 农牧户 ∪ 合作社(村×年月);无农牧户仅有合作社时仍出列,农牧户/家庭牧场/养殖大户为 0。
645
-      家庭牧场、养殖大户按同键左关联计数。排序年、月倒序,便于 PageHelper 跨多年翻页。
640
+      键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户(村×年月);
641
+      任一组织形式有数据即可出列,其余数量为 0。排序年、月倒序,PageHelper 支持跨多年翻页。
646
     -->
642
     -->
647
     <select id="selectBreedingEntityQuantityList"
643
     <select id="selectBreedingEntityQuantityList"
648
             resultType="com.ruoyi.web.modules.screen.domain.vo.HomeScreenBreedingEntityQuantityListItemVo">
644
             resultType="com.ruoyi.web.modules.screen.domain.vo.HomeScreenBreedingEntityQuantityListItemVo">
649
         select k.stat_year as statYear,
645
         select k.stat_year as statYear,
650
                k.stat_month as statMonth,
646
                k.stat_month as statMonth,
651
-               coalesce(h.town_dept_id, c.town_dept_id) as townDeptId,
652
-               coalesce(h.town_name, c.town_name) as townName,
647
+               coalesce(h.town_dept_id, c.town_dept_id, f.town_dept_id, l.town_dept_id) as townDeptId,
648
+               coalesce(h.town_name, c.town_name, f.town_name, l.town_name) as townName,
653
                k.village_dept_id as villageDeptId,
649
                k.village_dept_id as villageDeptId,
654
-               coalesce(h.village_name, c.village_name) as villageName,
650
+               coalesce(h.village_name, c.village_name, f.village_name, l.village_name) as villageName,
655
                coalesce(h.household_count, 0) as farmerHouseholdCount,
651
                coalesce(h.household_count, 0) as farmerHouseholdCount,
656
                coalesce(c.cooperative_count, 0) as cooperativeCount,
652
                coalesce(c.cooperative_count, 0) as cooperativeCount,
657
                coalesce(f.family_ranch_count, 0) as familyRanchCount,
653
                coalesce(f.family_ranch_count, 0) as familyRanchCount,
658
                coalesce(l.large_farmer_count, 0) as largeLivestockFarmerCount
654
                coalesce(l.large_farmer_count, 0) as largeLivestockFarmerCount
659
         from (
655
         from (
660
-            select stat_year, stat_month, village_dept_id
661
-            from biz_farmer_household
656
+            select stat_year, stat_month, village_dept_id from biz_farmer_household
662
             union
657
             union
663
-            select stat_year, stat_month, village_dept_id
664
-            from biz_cooperative_development
658
+            select stat_year, stat_month, village_dept_id from biz_cooperative_development
659
+            union
660
+            select stat_year, stat_month, village_dept_id from biz_family_ranch
661
+            union
662
+            select stat_year, stat_month, village_dept_id from biz_large_livestock_farmer
665
         ) k
663
         ) k
666
         left join biz_farmer_household h
664
         left join biz_farmer_household h
667
             on h.stat_year = k.stat_year
665
             on h.stat_year = k.stat_year
@@ -682,7 +680,13 @@
682
            and c.stat_month = k.stat_month
680
            and c.stat_month = k.stat_month
683
            and c.village_dept_id = k.village_dept_id
681
            and c.village_dept_id = k.village_dept_id
684
         left join (
682
         left join (
685
-            select stat_year, stat_month, village_dept_id, count(*) as family_ranch_count
683
+            select stat_year,
684
+                   stat_month,
685
+                   village_dept_id,
686
+                   max(town_dept_id) as town_dept_id,
687
+                   max(town_name) as town_name,
688
+                   max(village_name) as village_name,
689
+                   count(*) as family_ranch_count
686
             from biz_family_ranch
690
             from biz_family_ranch
687
             group by stat_year, stat_month, village_dept_id
691
             group by stat_year, stat_month, village_dept_id
688
         ) f
692
         ) f
@@ -690,7 +694,13 @@
690
            and f.stat_month = k.stat_month
694
            and f.stat_month = k.stat_month
691
            and f.village_dept_id = k.village_dept_id
695
            and f.village_dept_id = k.village_dept_id
692
         left join (
696
         left join (
693
-            select stat_year, stat_month, village_dept_id, count(*) as large_farmer_count
697
+            select stat_year,
698
+                   stat_month,
699
+                   village_dept_id,
700
+                   max(town_dept_id) as town_dept_id,
701
+                   max(town_name) as town_name,
702
+                   max(village_name) as village_name,
703
+                   count(*) as large_farmer_count
694
             from biz_large_livestock_farmer
704
             from biz_large_livestock_farmer
695
             group by stat_year, stat_month, village_dept_id
705
             group by stat_year, stat_month, village_dept_id
696
         ) l
706
         ) l
@@ -705,13 +715,14 @@
705
                 and k.stat_month = #{statMonth}
715
                 and k.stat_month = #{statMonth}
706
             </if>
716
             </if>
707
             <if test="townDeptId != null">
717
             <if test="townDeptId != null">
708
-                and coalesce(h.town_dept_id, c.town_dept_id) = #{townDeptId}
718
+                and coalesce(h.town_dept_id, c.town_dept_id, f.town_dept_id, l.town_dept_id) = #{townDeptId}
709
             </if>
719
             </if>
710
             <if test="villageDeptId != null">
720
             <if test="villageDeptId != null">
711
                 and k.village_dept_id = #{villageDeptId}
721
                 and k.village_dept_id = #{villageDeptId}
712
             </if>
722
             </if>
713
         </where>
723
         </where>
714
         order by k.stat_year desc, k.stat_month desc,
724
         order by k.stat_year desc, k.stat_month desc,
715
-                 coalesce(h.town_dept_id, c.town_dept_id) asc, k.village_dept_id asc
725
+                 coalesce(h.town_dept_id, c.town_dept_id, f.town_dept_id, l.town_dept_id) asc,
726
+                 k.village_dept_id asc
716
     </select>
727
     </select>
717
 </mapper>
728
 </mapper>

+ 5 - 3
baqing-admin/src/test/java/com/ruoyi/web/modules/screen/mapper/HomeScreenStatsMapperXmlTest.java

@@ -69,10 +69,12 @@ class HomeScreenStatsMapperXmlTest
69
         assertTrue(xml.contains("selectBreedingEntityQuantityList"));
69
         assertTrue(xml.contains("selectBreedingEntityQuantityList"));
70
         assertTrue(xml.contains("from biz_farmer_household"));
70
         assertTrue(xml.contains("from biz_farmer_household"));
71
         assertTrue(xml.contains("union"));
71
         assertTrue(xml.contains("union"));
72
-        assertTrue(xml.contains("biz_cooperative_development"));
73
-        assertTrue(xml.contains("biz_family_ranch"));
74
-        assertTrue(xml.contains("biz_large_livestock_farmer"));
72
+        assertTrue(xml.contains("from biz_cooperative_development"));
73
+        assertTrue(xml.contains("from biz_family_ranch"));
74
+        assertTrue(xml.contains("from biz_large_livestock_farmer"));
75
         assertTrue(xml.contains("cooperative_count"));
75
         assertTrue(xml.contains("cooperative_count"));
76
+        assertTrue(xml.contains("family_ranch_count"));
77
+        assertTrue(xml.contains("large_farmer_count"));
76
         assertTrue(xml.contains("herdStatMonth"));
78
         assertTrue(xml.contains("herdStatMonth"));
77
         assertTrue(xml.contains("outboundStatMonth"));
79
         assertTrue(xml.contains("outboundStatMonth"));
78
         assertTrue(xml.contains("status not in (2, 3)"));
80
         assertTrue(xml.contains("status not in (2, 3)"));

+ 13 - 13
baqing-admin/src/test/java/com/ruoyi/web/modules/screen/service/impl/HomeScreenServiceImplTest.java

@@ -572,20 +572,20 @@ class HomeScreenServiceImplTest
572
     }
572
     }
573
 
573
 
574
     @Test
574
     @Test
575
-    @DisplayName("DP-SY-UT-040c 仅合作社有数据时仍返回(农牧户等为0)")
576
-    void ut040c_breedingEntityQuantitiesCooperativeOnly()
577
-    {
578
-        HomeScreenBreedingEntityQuantityListItemVo row = new HomeScreenBreedingEntityQuantityListItemVo();
579
-        row.setStatYear(2026);
580
-        row.setStatMonth(5);
581
-        row.setTownName("巴青乡");
582
-        row.setVillageName("1村");
583
-        row.setFarmerHouseholdCount(0);
584
-        row.setCooperativeCount(2);
585
-        row.setFamilyRanchCount(0);
586
-        row.setLargeLivestockFarmerCount(0);
575
+    @DisplayName("DP-SY-UT-040c 任一组织形式有数据即可返回(其余为0)")
576
+    void ut040c_breedingEntityQuantitiesAnyFormOnly()
577
+    {
578
+        HomeScreenBreedingEntityQuantityListItemVo coopOnly = new HomeScreenBreedingEntityQuantityListItemVo();
579
+        coopOnly.setStatYear(2026);
580
+        coopOnly.setStatMonth(5);
581
+        coopOnly.setTownName("巴青乡");
582
+        coopOnly.setVillageName("1村");
583
+        coopOnly.setFarmerHouseholdCount(0);
584
+        coopOnly.setCooperativeCount(2);
585
+        coopOnly.setFamilyRanchCount(0);
586
+        coopOnly.setLargeLivestockFarmerCount(0);
587
         when(homeScreenStatsMapper.selectBreedingEntityQuantityList(eq(2026), eq(5), eq(null), eq(null)))
587
         when(homeScreenStatsMapper.selectBreedingEntityQuantityList(eq(2026), eq(5), eq(null), eq(null)))
588
-                .thenReturn(Collections.singletonList(row));
588
+                .thenReturn(Collections.singletonList(coopOnly));
589
         List<HomeScreenBreedingEntityQuantityListItemVo> list =
589
         List<HomeScreenBreedingEntityQuantityListItemVo> list =
590
                 service.listBreedingEntityQuantities(2026, 5, null, null);
590
                 service.listBreedingEntityQuantities(2026, 5, null, null);
591
         assertEquals(1, list.size());
591
         assertEquals(1, list.size());

Diff nebyl zobrazen, protože je příliš veliký
+ 1 - 1
doc/大屏/首页/大屏首页功能需求.md


+ 2 - 2
doc/大屏/首页/大屏首页技术方案.md

@@ -596,11 +596,11 @@
596
 | `villageDeptId` | long | N | 所属村 |
596
 | `villageDeptId` | long | N | 所属村 |
597
 | `pageNum` / `pageSize` | int | N | 分页(PageHelper) |
597
 | `pageNum` / `pageSize` | int | N | 分页(PageHelper) |
598
 
598
 
599
-关联:村×年月键集 = `biz_farmer_household` ∪ `biz_cooperative_development`;按 `(stat_year, stat_month, village_dept_id)` 左关联农牧户户数及合作社 / 家庭牧场 / 养殖大户条数(无则 0)。**仅有合作社填报、无农牧户时仍返回该行**,农牧户/家庭牧场/养殖大户为 0
599
+关联:村×年月键集 = `biz_farmer_household` ∪ `biz_cooperative_development` ∪ `biz_family_ranch` ∪ `biz_large_livestock_farmer`(以 `(stat_year, stat_month, village_dept_id)` 为键)。合作社/家庭牧场/养殖大户为农牧户不同组织形式;**任一形式有填报即可出列,其余数量为 0**
600
 
600
 
601
 排序:`stat_year DESC, stat_month DESC, town_dept_id ASC, village_dept_id ASC`。
601
 排序:`stat_year DESC, stat_month DESC, town_dept_id ASC, village_dept_id ASC`。
602
 
602
 
603
-性能:键集 UNION + 分组计数 JOIN(走各表村年月唯一/索引);PageHelper 对结果集分页,支持跨多年全量翻页。
603
+性能:四表键集 UNION + 分组计数 JOIN(走各表村年月唯一/索引);PageHelper 对结果集分页,支持跨多年全量翻页。
604
 
604
 
605
 #### 响应 `rows[]`
605
 #### 响应 `rows[]`
606
 
606
 

+ 6 - 2
ruoyi-screen/src/views/home/BreedingEntityQuantityDialog.vue

@@ -46,6 +46,10 @@ const { syncDialogYearFromGlobal } = useDialogStatYearSync(query, {
46
 
46
 
47
 const monthOptions = Array.from({ length: 12 }, (_, i) => i + 1)
47
 const monthOptions = Array.from({ length: 12 }, (_, i) => i + 1)
48
 
48
 
49
+function currentMonth() {
50
+  return new Date().getMonth() + 1
51
+}
52
+
49
 async function fetchList() {
53
 async function fetchList() {
50
   loading.value = true
54
   loading.value = true
51
   try {
55
   try {
@@ -79,7 +83,7 @@ function handleSearch() {
79
 
83
 
80
 function handleReset() {
84
 function handleReset() {
81
   syncDialogYearFromGlobal()
85
   syncDialogYearFromGlobal()
82
-  query.statMonth = undefined
86
+  query.statMonth = currentMonth()
83
   query.townDeptId = undefined
87
   query.townDeptId = undefined
84
   query.villageDeptId = undefined
88
   query.villageDeptId = undefined
85
   pageNum.value = 1
89
   pageNum.value = 1
@@ -92,7 +96,7 @@ function onTownChange() {
92
 
96
 
93
 function onOpen() {
97
 function onOpen() {
94
   syncDialogYearFromGlobal()
98
   syncDialogYearFromGlobal()
95
-  query.statMonth = undefined
99
+  query.statMonth = currentMonth()
96
   query.townDeptId = undefined
100
   query.townDeptId = undefined
97
   query.villageDeptId = undefined
101
   query.villageDeptId = undefined
98
   pageNum.value = 1
102
   pageNum.value = 1