wwh пре 7 часа
родитељ
комит
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 260
     @GetMapping("/breedingEntityQuantities")
261 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 5
  * <p>
6
- * 村×年月键集 = {@code biz_farmer_household} ∪ {@code biz_cooperative_development}
7
- * 左关联家庭牧场 / 养殖大户计数。仅有合作社数据时仍出列,其余数量为 0。
6
+ * 村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户
7
+ * 任一组织形式有数据即可出列,其余数量为 0。
8 8
  */
9 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 241
             @Param("villageDeptId") Long villageDeptId);
242 242
 
243 243
     /**
244
-     * 养殖主体数量明细:村×年月键集 = 农牧户 ∪ 合作社;左关联家庭牧场/养殖大户计数
245
-     * 仅有合作社数据时仍返回行,农牧户/家庭牧场/养殖大户为 0。年月未传不过滤,支持跨多年翻页。
244
+     * 养殖主体数量明细:村×年月键集 = 农牧户 ∪ 合作社 ∪ 家庭牧场 ∪ 养殖大户
245
+     * 任一组织形式有数据即可出列,其余为 0。年月未传不过滤,支持跨多年翻页。
246 246
      */
247 247
     List<HomeScreenBreedingEntityQuantityListItemVo> selectBreedingEntityQuantityList(
248 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 129
     List<HomeScreenBreedingEntityQuantityListItemVo> listBreedingEntityQuantities(
130 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 635
         order by t.stat_year desc, t.stat_month desc, t.town_dept_id asc, t.village_dept_id asc
636 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 643
     <select id="selectBreedingEntityQuantityList"
648 644
             resultType="com.ruoyi.web.modules.screen.domain.vo.HomeScreenBreedingEntityQuantityListItemVo">
649 645
         select k.stat_year as statYear,
650 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 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 651
                coalesce(h.household_count, 0) as farmerHouseholdCount,
656 652
                coalesce(c.cooperative_count, 0) as cooperativeCount,
657 653
                coalesce(f.family_ranch_count, 0) as familyRanchCount,
658 654
                coalesce(l.large_farmer_count, 0) as largeLivestockFarmerCount
659 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 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 663
         ) k
666 664
         left join biz_farmer_household h
667 665
             on h.stat_year = k.stat_year
@@ -682,7 +680,13 @@
682 680
            and c.stat_month = k.stat_month
683 681
            and c.village_dept_id = k.village_dept_id
684 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 690
             from biz_family_ranch
687 691
             group by stat_year, stat_month, village_dept_id
688 692
         ) f
@@ -690,7 +694,13 @@
690 694
            and f.stat_month = k.stat_month
691 695
            and f.village_dept_id = k.village_dept_id
692 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 704
             from biz_large_livestock_farmer
695 705
             group by stat_year, stat_month, village_dept_id
696 706
         ) l
@@ -705,13 +715,14 @@
705 715
                 and k.stat_month = #{statMonth}
706 716
             </if>
707 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 719
             </if>
710 720
             <if test="villageDeptId != null">
711 721
                 and k.village_dept_id = #{villageDeptId}
712 722
             </if>
713 723
         </where>
714 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 727
     </select>
717 728
 </mapper>

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

@@ -69,10 +69,12 @@ class HomeScreenStatsMapperXmlTest
69 69
         assertTrue(xml.contains("selectBreedingEntityQuantityList"));
70 70
         assertTrue(xml.contains("from biz_farmer_household"));
71 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 75
         assertTrue(xml.contains("cooperative_count"));
76
+        assertTrue(xml.contains("family_ranch_count"));
77
+        assertTrue(xml.contains("large_farmer_count"));
76 78
         assertTrue(xml.contains("herdStatMonth"));
77 79
         assertTrue(xml.contains("outboundStatMonth"));
78 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 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 587
         when(homeScreenStatsMapper.selectBreedingEntityQuantityList(eq(2026), eq(5), eq(null), eq(null)))
588
-                .thenReturn(Collections.singletonList(row));
588
+                .thenReturn(Collections.singletonList(coopOnly));
589 589
         List<HomeScreenBreedingEntityQuantityListItemVo> list =
590 590
                 service.listBreedingEntityQuantities(2026, 5, null, null);
591 591
         assertEquals(1, list.size());

Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
doc/大屏/首页/大屏首页功能需求.md


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

@@ -596,11 +596,11 @@
596 596
 | `villageDeptId` | long | N | 所属村 |
597 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 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 605
 #### 响应 `rows[]`
606 606
 

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

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