From dce5a34e89123f487cd22b9a4e5254ffc8a5df75 Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期四, 17 九月 2026 20:31:34 +0800
Subject: [PATCH] feat&bug:运营商数据统计修改

---
 cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java |   79 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
index 266c167..8dafa9e 100644
--- a/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
+++ b/cloud-server-competition/src/main/java/com/dsh/competition/controller/CompetitionController.java
@@ -1128,11 +1128,75 @@
         return map;
     }
 
+    /** 门店活动统计:仅统计指定门店的赛事及其报名记录。 */
+    @ResponseBody
+    @PostMapping("/base/competition/actStore")
+    public HashMap<String, Object> actStore(@RequestBody CompetionVO vo) {
+        HashMap<String, Object> map = new HashMap<>();
+        if (vo.getStoreIds() == null || vo.getStoreIds().isEmpty()) {
+            vo.setStoreIds(Collections.singletonList(-1));
+        }
+        ArrayList<Integer> years = new ArrayList<>();
+        ArrayList<Integer> yearsUser = new ArrayList<>();
+        int year = DateUtil.year(new Date());
+        for (int statisticYear = year - 9; statisticYear <= year; statisticYear++) {
+            String dateText = String.valueOf(statisticYear);
+            List<Integer> competitionIds = listStoreCompetitionIds(vo, dateText);
+            years.add(competitionIds.size());
+            yearsUser.add(countStoreUserCompetitions(dateText, competitionIds));
+        }
+        map.put("yearData", years);
+        map.put("yearsUser", yearsUser);
+
+        ArrayList<Integer> months = new ArrayList<>();
+        ArrayList<Integer> monthsUser = new ArrayList<>();
+        for (int month = 1; month <= 12; month++) {
+            String dateText = String.format("%d-%02d", year, month);
+            List<Integer> competitionIds = listStoreCompetitionIds(vo, dateText);
+            months.add(competitionIds.size());
+            monthsUser.add(countStoreUserCompetitions(dateText, competitionIds));
+        }
+        map.put("monthData", months);
+        map.put("monthsUser", monthsUser);
+        return map;
+    }
+
     private List<Integer> listCompetitionIds(CompetionVO vo, String dateText) {
         return cttService.list(buildCompetitionCountWrapper(vo, dateText))
                 .stream()
                 .map(Competition::getId)
                 .collect(Collectors.toList());
+    }
+
+    private List<Integer> listStoreCompetitionIds(CompetionVO vo, String dateText) {
+        Set<String> storeIds = vo.getStoreIds().stream()
+                .filter(Objects::nonNull)
+                .map(String::valueOf)
+                .collect(Collectors.toSet());
+        return cttService.list(new LambdaQueryWrapper<Competition>()
+                        .like(Competition::getInsertTime, dateText))
+                .stream()
+                .filter(competition -> containsStoreId(competition.getStoreId(), storeIds))
+                .map(Competition::getId)
+                .collect(Collectors.toList());
+    }
+
+    private boolean containsStoreId(String competitionStoreIds, Set<String> storeIds) {
+        if (competitionStoreIds == null || competitionStoreIds.trim().isEmpty()) {
+            return false;
+        }
+        return Arrays.stream(competitionStoreIds.split(","))
+                .map(String::trim)
+                .anyMatch(storeIds::contains);
+    }
+
+    private int countStoreUserCompetitions(String dateText, List<Integer> competitionIds) {
+        if (competitionIds.isEmpty()) {
+            return 0;
+        }
+        return ucttService.count(new LambdaQueryWrapper<UserCompetition>()
+                .in(UserCompetition::getCompetitionId, competitionIds)
+                .like(UserCompetition::getInsertTime, dateText));
     }
 
     private int countUserCompetitions(CompetionVO vo, String dateText, List<Integer> competitionIds) {
@@ -1147,8 +1211,11 @@
 
     private LambdaQueryWrapper<Competition> buildCompetitionCountWrapper(CompetionVO vo, String dateText) {
         LambdaQueryWrapper<Competition> wrapper = new LambdaQueryWrapper<Competition>()
-                .like(Competition::getInsertTime, dateText)
-                .eq(Competition::getOperatorId, vo.getOperatorId());
+                .like(Competition::getInsertTime, dateText);
+        // 平台统计由平台门店范围决定,历史平台赛事的 operatorId 可能为空或为 0。
+        if (vo.getOperatorId() != null && !Integer.valueOf(0).equals(vo.getOperatorId())) {
+            wrapper.eq(Competition::getOperatorId, vo.getOperatorId());
+        }
         appendStoreIdFilter(wrapper, vo.getStoreIds());
         return wrapper;
     }
@@ -1177,7 +1244,13 @@
     @ResponseBody
     @PostMapping("/base/competition/queryAppUserId")
     public List<Integer> queryAppUserId(@RequestBody List<Integer> storeIds){
-        List<Competition> list = competitionService.list(new QueryWrapper<Competition>().in("storeId", storeIds).eq("auditStatus", 2).eq("state", 1));
+        if (storeIds == null || storeIds.isEmpty()) {
+            return new ArrayList<>();
+        }
+        LambdaQueryWrapper<Competition> wrapper = new LambdaQueryWrapper<Competition>()
+                .eq(Competition::getAuditStatus, 2).eq(Competition::getState, 1);
+        appendStoreIdFilter(wrapper, storeIds);
+        List<Competition> list = competitionService.list(wrapper);
         List<Integer> collect = list.stream().map(Competition::getId).collect(Collectors.toList());
         if(collect.size() == 0){
             return new ArrayList<>();

--
Gitblit v1.7.1