소스 검색

feat(statistics): 新增统计数据功能模块

- 添加 DateTimeRangeUtils 工具类,支持按日、三天、周、月获取时间范围
- 实现 StatisticsController 控制器,提供统计信息和图表数据接口
- 创建 StatisticsVo 和 StatisticsGraphVo 数据传输对象- 在 PayOrderMapper、PlayersItemsLogMapper、TournamentsMapper 和 UserCheckRecordMapper 中添加统计相关查询方法
- 扩展 PayOrderVo、PlayersItemsLogVo 和 UserCheckRecordVo,增加统计字段
- 实现 StatisticsServiceImpl 服务类,处理统计逻辑并整合各数据源
- 添加 StatisticsBo 业务对象用于接收前端参数- Mapper XML 文件中新增统计相关的 SQL 查询语句
fugui001 2 달 전
부모
커밋
a5c3e1245a
18개의 변경된 파일637개의 추가작업 그리고 0개의 파일을 삭제
  1. 35 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/StatisticsController.java
  2. 33 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/StatisticsBo.java
  3. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PayOrderVo.java
  4. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PlayersItemsLogVo.java
  5. 46 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/StatisticsGraphVo.java
  6. 46 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/StatisticsVo.java
  7. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/UserCheckRecordVo.java
  8. 8 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PayOrderMapper.java
  9. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PlayersItemsLogMapper.java
  10. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentsMapper.java
  11. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/UserCheckRecordMapper.java
  12. 19 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IStatisticsService.java
  13. 152 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/StatisticsServiceImpl.java
  14. 195 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/utils/DateTimeRangeUtils.java
  15. 24 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PayOrderMapper.xml
  16. 26 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PlayersItemsLogMapper.xml
  17. 10 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentsMapper.xml
  18. 19 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/UserCheckRecordMapper.xml

+ 35 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/StatisticsController.java

@@ -0,0 +1,35 @@
+package org.dromara.business.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.business.domain.bo.StatisticsBo;
+import org.dromara.business.domain.vo.StatisticsGraphVo;
+import org.dromara.business.domain.vo.StatisticsVo;
+import org.dromara.business.service.IStatisticsService;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/statistics")
+public class StatisticsController extends BaseController {
+
+    private final IStatisticsService statisticsService;
+
+    //@SaCheckPermission("business:items:query")
+    @GetMapping("/getStatisticsInfo")
+    public R<StatisticsVo> getStatisticsInfo(StatisticsBo statisticsBo) {
+        return R.ok(statisticsService.getStatisticsInfo(statisticsBo.getFlagType(), statisticsBo.getStartTime(), statisticsBo.getEndTime()));
+    }
+
+
+    @GetMapping("/getStatisticsGraphInfo")
+    public R<StatisticsGraphVo> getStatisticsGraphInfo(StatisticsBo statisticsBo) {
+        return R.ok(statisticsService.getStatisticsGraphInfo(statisticsBo.getFlagType(), statisticsBo.getStartTime(), statisticsBo.getEndTime()));
+    }
+
+}

+ 33 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/StatisticsBo.java

@@ -0,0 +1,33 @@
+package org.dromara.business.domain.bo;
+
+import lombok.Data;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 道具业务对象 items
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+public class StatisticsBo extends BaseEntity {
+
+
+    /**
+     *  日周月 三天  日期
+     */
+    private String flagType;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+
+
+}

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PayOrderVo.java

@@ -169,6 +169,9 @@ public class PayOrderVo implements Serializable {
     private String nickName;
 
 
+    private Integer payOrderCount;
+    private BigDecimal payOrderAmount;
+    private String dates;
 
 
 

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PlayersItemsLogVo.java

@@ -117,5 +117,8 @@ public class PlayersItemsLogVo implements Serializable {
     private Long itemId;
 
 
+    private Integer sanXiangCardCount;
+    private String dates;
+
 
 }

+ 46 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/StatisticsGraphVo.java

@@ -0,0 +1,46 @@
+package org.dromara.business.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ *顶部统计数据
+ * @date 2025-06-26
+ */
+@Data
+public class StatisticsGraphVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 充值数
+     */
+    private List<Integer> payOrderCountIds;
+
+    /**
+     * 充值金额
+     */
+    private List<BigDecimal> payOrderAmountIds;
+
+
+    /**
+     * 三湘杯参赛资格发放数
+     */
+    private List<Integer> sanXiangCardCountIds;
+
+    /**
+     * 三湘杯参赛资格 核销数
+     */
+    private List<Integer> selectCheckRecordSanXiangCountIds;
+
+
+    private List<String> dates;
+
+
+}

+ 46 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/StatisticsVo.java

@@ -0,0 +1,46 @@
+package org.dromara.business.domain.vo;
+
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+/**
+ *顶部统计数据
+ * @date 2025-06-26
+ */
+@Data
+public class StatisticsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 赛事数量
+     */
+    private Integer tournamentCount;
+
+    /**
+     * 充值数
+     */
+    private Integer payOrderCount;
+
+    /**
+     * 充值金额
+     */
+    private BigDecimal payOrderAmount;
+
+
+    /**
+     * 三湘杯参赛资格发放数
+     */
+    private Integer sanXiangCardCount;
+
+    /**
+     * 三湘杯参赛资格 核销数
+     */
+    private Integer selectCheckRecordSanXiangCount;
+
+
+}

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/UserCheckRecordVo.java

@@ -97,6 +97,9 @@ public class UserCheckRecordVo implements Serializable {
     private String createUserName;
 
 
+    private Integer checkRecordSanXiangCount;
+    private String dates;
+
 
 
 

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PayOrderMapper.java

@@ -38,5 +38,13 @@ public interface PayOrderMapper extends BaseMapperPlus<PayOrder, PayOrderVo> {
     @InterceptorIgnore(tenantLine = "true")
     List<PayOrderVo> selectPayOrderList(@Param("ew") Wrapper<PayOrder> wrapper);
 
+    @InterceptorIgnore(tenantLine = "true")
+    PayOrderVo selectPayOrderCountByTime(@Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<PayOrderVo> selectPayOrderGraphByTime(@Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
+
 
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PlayersItemsLogMapper.java

@@ -33,4 +33,10 @@ public interface PlayersItemsLogMapper extends BaseMapperPlus<PlayersItemsLog, P
     @InterceptorIgnore(tenantLine = "true")
     List<PlayersItemsLogVo> selectPlayerItemsLogInfoListInfo(@Param("ew") Wrapper<PlayersItemsLog> wrapper);
 
+    @InterceptorIgnore(tenantLine = "true")
+    int selectPlayerItermSanXianCardByTime(@Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<PlayersItemsLogVo> selectPlayerItermGraphSanXianCardByTime(@Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
 }

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/TournamentsMapper.java

@@ -56,5 +56,8 @@ public interface TournamentsMapper extends BaseMapperPlus<Tournaments, Tournamen
     @InterceptorIgnore(tenantLine = "true")
     int deleteTournament(@Param("tournamentId") Long tournamentId);
 
+    @InterceptorIgnore(tenantLine = "true")
+    int selectTournamentsCountByTime(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
 }
 

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/UserCheckRecordMapper.java

@@ -39,4 +39,10 @@ public interface UserCheckRecordMapper extends BaseMapperPlus<UserCheckRecord, U
     @InterceptorIgnore(tenantLine = "true")
     List<UserCheckRecordVo> selectCheckRecordAllList(@Param("ew") Wrapper<UserCheckRecord> wrapper);
 
+    @InterceptorIgnore(tenantLine = "true")
+    int selectCheckRecordSanXiangCount(@Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<UserCheckRecordVo> selectCheckRecordGraphSanXiangCount(@Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
 }

+ 19 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IStatisticsService.java

@@ -0,0 +1,19 @@
+package org.dromara.business.service;
+
+
+import org.dromara.business.domain.vo.StatisticsGraphVo;
+import org.dromara.business.domain.vo.StatisticsVo;
+
+/**
+ *  统计数据
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+public interface IStatisticsService {
+
+    StatisticsVo getStatisticsInfo(String flagType,String startTime,String endTime);
+
+    StatisticsGraphVo getStatisticsGraphInfo(String flagType, String startTime, String endTime);
+
+}

+ 152 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/StatisticsServiceImpl.java

@@ -0,0 +1,152 @@
+package org.dromara.business.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.business.domain.vo.*;
+import org.dromara.business.mapper.PayOrderMapper;
+import org.dromara.business.mapper.PlayersItemsLogMapper;
+import org.dromara.business.mapper.TournamentsMapper;
+import org.dromara.business.mapper.UserCheckRecordMapper;
+import org.dromara.business.service.IStatisticsService;
+import org.dromara.business.utils.DateTimeRangeUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 统计数据
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class StatisticsServiceImpl implements IStatisticsService {
+
+
+    private final TournamentsMapper tournamentsMapper;
+
+    private final PayOrderMapper payOrderMapper;
+
+    private final PlayersItemsLogMapper playersItemsLogMapper;
+
+    private final UserCheckRecordMapper userCheckRecordMapper;
+
+
+    @Override
+    public StatisticsVo getStatisticsInfo(String flagType,String startTime,String endTime) {
+        StatisticsVo statisticsVo = new StatisticsVo();
+        String startDate= "";
+        String endDate= "";
+
+        if(flagType.equals("day") || flagType.equals("week") || flagType.equals("month") || flagType.equals("three")){
+             startDate = DateTimeRangeUtils.getStartString(flagType);
+             endDate = DateTimeRangeUtils.getEndString(flagType);
+        }else{
+            startDate = startTime;
+            endDate = endTime;
+        }
+
+        int tournamentCount = tournamentsMapper.selectTournamentsCountByTime(startDate, endDate);
+        statisticsVo.setTournamentCount(tournamentCount);
+
+        PayOrderVo payOrderVo = payOrderMapper.selectPayOrderCountByTime(startDate, endDate);
+        if(payOrderVo!=null){
+            statisticsVo.setPayOrderAmount(payOrderVo.getTotalAmount());
+            statisticsVo.setPayOrderCount(payOrderVo.getPayOrderCount());
+        }
+
+        int sanXiangCardCount = playersItemsLogMapper.selectPlayerItermSanXianCardByTime(startDate, endDate);
+        statisticsVo.setSanXiangCardCount(sanXiangCardCount);
+
+        int selectCheckRecordSanXiangCount = userCheckRecordMapper.selectCheckRecordSanXiangCount(startDate, endDate);
+        statisticsVo.setSelectCheckRecordSanXiangCount(selectCheckRecordSanXiangCount);
+
+
+        return statisticsVo;
+    }
+
+    @Override
+    public StatisticsGraphVo getStatisticsGraphInfo(String flagType, String startTime, String endTime) {
+        StatisticsGraphVo statisticsGraphVo = new StatisticsGraphVo();
+        String startDate = "";
+        String endDate = "";
+
+        if(flagType.equals("day") || flagType.equals("week") || flagType.equals("month") || flagType.equals("three")){
+            startDate = DateTimeRangeUtils.getStartString(flagType);
+            endDate = DateTimeRangeUtils.getEndString(flagType);
+        } else {
+            startDate = startTime;
+            endDate = endTime;
+        }
+
+        // x轴日期
+        List<String> dates = DateTimeRangeUtils.getDatesBetween(startDate, endDate, false);
+
+        // 初始化各指标列表,默认值为0
+        List<Integer> payOrderCountIds = new ArrayList<>(dates.size());
+        List<BigDecimal> payOrderAmountIds = new ArrayList<>(dates.size());
+        List<Integer> sanXiangCardCountIds = new ArrayList<>(dates.size());
+        List<Integer> selectCheckRecordSanXiangCountIds = new ArrayList<>(dates.size());
+
+        // 填充默认值
+        for (int i = 0; i < dates.size(); i++) {
+            payOrderCountIds.add(0);
+            payOrderAmountIds.add(BigDecimal.ZERO);
+            sanXiangCardCountIds.add(0);
+            selectCheckRecordSanXiangCountIds.add(0);
+        }
+
+        // 获取数据库查询结果
+        List<PayOrderVo> payOrderVoList = payOrderMapper.selectPayOrderGraphByTime(startDate, endDate);
+        List<PlayersItemsLogVo> playersItemsLogVoList = playersItemsLogMapper.selectPlayerItermGraphSanXianCardByTime(startDate, endDate);
+        List<UserCheckRecordVo> userCheckRecordVoList = userCheckRecordMapper.selectCheckRecordGraphSanXiangCount(startDate, endDate);
+
+        // 建立日期到索引的映射
+        Map<String, Integer> dateIndexMap = new HashMap<>();
+        for (int i = 0; i < dates.size(); i++) {
+            dateIndexMap.put(dates.get(i), i);
+        }
+
+        // 填充实际数据(如果有)
+        for (PayOrderVo payOrderVo : payOrderVoList) {
+            String dateStr = payOrderVo.getDates(); // 需要根据实际日期格式调整
+            Integer index = dateIndexMap.get(dateStr);
+            if (index != null) {
+                // 确保计数为非空值
+                int count = payOrderVo.getPayOrderCount() != null ? payOrderVo.getPayOrderCount() : 0;
+                BigDecimal amount = payOrderVo.getTotalAmount() != null ? payOrderVo.getTotalAmount() : BigDecimal.ZERO;
+
+                payOrderCountIds.set(index, count);
+                payOrderAmountIds.set(index, amount);
+            }
+        }
+
+        for (PlayersItemsLogVo playersItemsLogVo : playersItemsLogVoList) {
+            String dateStr = playersItemsLogVo.getDates();
+            Integer index = dateIndexMap.get(dateStr);
+            if (index != null) {
+                sanXiangCardCountIds.set(index, playersItemsLogVo.getSanXiangCardCount());
+            }
+        }
+
+        for (UserCheckRecordVo userCheckRecordVo : userCheckRecordVoList) {
+            String dateStr = userCheckRecordVo.getDates();
+            Integer index = dateIndexMap.get(dateStr);
+            if (index != null) {
+                selectCheckRecordSanXiangCountIds.set(index, userCheckRecordVo.getCheckRecordSanXiangCount());
+            }
+        }
+
+        statisticsGraphVo.setPayOrderAmountIds(payOrderAmountIds);
+        statisticsGraphVo.setSanXiangCardCountIds(sanXiangCardCountIds);
+        statisticsGraphVo.setSelectCheckRecordSanXiangCountIds(selectCheckRecordSanXiangCountIds);
+        statisticsGraphVo.setPayOrderCountIds(payOrderCountIds);
+        statisticsGraphVo.setDates(dates);
+        return statisticsGraphVo;
+    }
+
+}

+ 195 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/utils/DateTimeRangeUtils.java

@@ -0,0 +1,195 @@
+package org.dromara.business.utils;
+
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *  获取开始时间和结束时间 工具类
+ */
+public class DateTimeRangeUtils {
+
+    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 获取指定类型的开始时间(LocalDateTime)
+     *
+     * @param type 支持: "day", "three", "week", "month"
+     * @return 开始时间
+     */
+    public static LocalDateTime getStartLocalDateTime(String type) {
+        LocalDate today = LocalDate.now();
+        LocalDateTime start;
+
+        switch (type.toLowerCase()) {
+            case "day":
+                start = today.atStartOfDay(); // 今天 00:00:00
+                break;
+
+            case "three":
+                start = today.minusDays(3).atStartOfDay(); // 3天前 00:00:00
+                break;
+
+            case "week":
+                start = today.minusDays(7).atStartOfDay(); // 7天前 00:00:00
+                break;
+
+            case "month":
+                start = today.withDayOfMonth(1).atStartOfDay(); // 本月第一天 00:00:00
+                break;
+
+            default:
+                throw new IllegalArgumentException("不支持的时间类型: " + type);
+        }
+
+        return start;
+    }
+
+    /**
+     * 获取指定类型的结束时间(LocalDateTime)
+     *
+     * @param type 支持: "day", "three", "week", "month"
+     * @return 结束时间
+     */
+    /**
+     * 获取指定类型的结束时间(不包含)—— 用于 < 查询
+     */
+    public static LocalDateTime getEndLocalDateTime(String type) {
+        LocalDate today = LocalDate.now();
+
+        return switch (type.toLowerCase()) {
+            case "day" -> today.plusDays(1).atStartOfDay(); // 明天 00:00:00
+            case "three", "week", "month" -> today.atStartOfDay(); // 今天 00:00:00
+            default -> throw new IllegalArgumentException("不支持的时间类型: " + type);
+        };
+    }
+    /**
+     * 获取开始时间字符串(格式:yyyy-MM-dd HH:mm:ss)
+     */
+    public static String getStartString(String type) {
+        return getStartLocalDateTime(type).format(FORMATTER);
+    }
+
+    /**
+     * 获取结束时间字符串(格式:yyyy-MM-dd HH:mm:ss)
+     */
+    public static String getEndString(String type) {
+        return getEndLocalDateTime(type).format(FORMATTER);
+    }
+
+    /**
+     * (可选)转换为 java.util.Date(如果你还在用老日期)
+     */
+    public static java.util.Date getStartDate(String type) {
+        return java.util.Date.from(getStartLocalDateTime(type).atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    public static java.util.Date getEndDate(String type) {
+        return java.util.Date.from(getEndLocalDateTime(type).atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    // ================== 测试用例 ==================
+    public static void main(String[] args) {
+        System.out.println("今天是: " + LocalDate.now());
+
+        String[] types = {"day", "three", "week", "month"};
+        for (String type : types) {
+            System.out.println("\n--- " + type.toUpperCase() + " ---");
+            System.out.println("开始: " + getStartString(type));
+            System.out.println("结束: " + getEndString(type));
+        }
+    }
+
+
+
+
+    // 默认输入时间格式(支持时分秒)
+    private static final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    // 默认输出日期格式
+    private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    /**
+     * 计算两个字符串表示的时间之间的所有日期(返回 yyyy-MM-dd 格式的字符串列表)
+     *
+     * @param startStr   开始时间字符串,格式:yyyy-MM-dd HH:mm:ss
+     * @param endStr     结束时间字符串,格式:yyyy-MM-dd HH:mm:ss
+     * @param includeEnd 是否包含结束日
+     * @return List<String> 如 ["2025-04-05", "2024-04-06", ...]
+     * @throws IllegalArgumentException 如果时间格式错误或参数为空
+     */
+    public static List<String> getDatesBetween(String startStr, String endStr, boolean includeEnd) {
+        return getDatesBetween(startStr, endStr, includeEnd, OUTPUT_FORMATTER);
+    }
+
+    /**
+     * 计算两个字符串时间之间的日期范围,并指定输出格式
+     *
+     * @param startStr    开始时间字符串
+     * @param endStr      结束时间字符串
+     * @param includeEnd  是否包含结束日
+     * @param outputFormatter 输出日期格式化器(如 DateTimeFormatter.ofPattern("MM/dd"))
+     * @return List<String>
+     */
+    public static List<String> getDatesBetween(
+        String startStr,
+        String endStr,
+        boolean includeEnd,
+        DateTimeFormatter outputFormatter) {
+
+        // 校验输入
+        if (startStr == null || endStr == null || startStr.trim().isEmpty() || endStr.trim().isEmpty()) {
+            throw new IllegalArgumentException("开始时间和结束时间不能为空");
+        }
+
+        LocalDateTime start;
+        LocalDateTime end;
+
+        try {
+            start = LocalDateTime.parse(startStr.trim(), INPUT_FORMATTER);
+        } catch (DateTimeParseException e) {
+            throw new IllegalArgumentException("开始时间格式错误,正确格式: yyyy-MM-dd HH:mm:ss", e);
+        }
+
+        try {
+            end = LocalDateTime.parse(endStr.trim(), INPUT_FORMATTER);
+        } catch (DateTimeParseException e) {
+            throw new IllegalArgumentException("结束时间格式错误,正确格式: yyyy-MM-dd HH:mm:ss", e);
+        }
+
+        if (outputFormatter == null) {
+            throw new IllegalArgumentException("输出格式化器不能为空");
+        }
+
+        // 提取日期部分
+        LocalDate startDate = start.toLocalDate();
+        LocalDate endDate = end.toLocalDate();
+
+        // 确定结束边界
+        LocalDate endInclusive = includeEnd ? endDate : endDate.minusDays(1);
+
+        // 如果开始日期 > 结束边界,返回空
+        if (startDate.isAfter(endInclusive)) {
+            return new ArrayList<>();
+        }
+
+        // 生成日期字符串列表
+        List<String> result = new ArrayList<>();
+        LocalDate current = startDate;
+
+        while (!current.isAfter(endInclusive)) {
+            result.add(current.format(outputFormatter));
+            current = current.plusDays(1);
+        }
+
+        return result;
+    }
+
+
+
+}

+ 24 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PayOrderMapper.xml

@@ -167,4 +167,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
 
+
+    <select id="selectPayOrderCountByTime" resultType="org.dromara.business.domain.vo.PayOrderVo">
+        SELECT
+            ifnull(count(distinct trade_no),0) as payOrderCount,
+            ifnull(sum(total_amount),0) as payOrderAmount
+        FROM pay_order  where status= 'success' and pay_time >= #{beginTime} and pay_time &lt; #{endTime}
+    </select>
+
+
+    <select id="selectPayOrderGraphByTime" resultType="org.dromara.business.domain.vo.PayOrderVo">
+        SELECT
+            DATE(pay_time) as dates,
+            COUNT(DISTINCT trade_no) as payOrderCount,
+            IFNULL(SUM(total_amount), 0) as payOrderAmount
+        FROM pay_order
+        WHERE status = 'success'
+          AND pay_time >= #{beginTime}
+          AND pay_time &lt; #{endTime}
+        GROUP BY DATE(pay_time)
+        ORDER BY dates
+    </select>
+
+
+
 </mapper>

+ 26 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PlayersItemsLogMapper.xml

@@ -112,4 +112,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 
 
+
+    <select id="selectPlayerItermSanXianCardByTime" resultType="int">
+        SELECT
+             ifnull(count(score_num),0) as sanXiangCardCount
+        FROM
+            players_items_log
+        where  created_at >= #{beginTime} and created_at &lt; #{endTime}
+        and item_id=1001
+    </select>
+
+    <select id="selectPlayerItermGraphSanXianCardByTime" resultType="org.dromara.business.domain.vo.PlayersItemsLogVo">
+        SELECT
+            DATE(created_at) as dates,
+            IFNULL(COUNT(score_num), 0) as sanXiangCardCount
+        FROM
+            players_items_log
+        WHERE
+            created_at >= #{beginTime}
+          AND created_at &lt; #{endTime}
+          AND item_id = 1001
+        GROUP BY
+            DATE(created_at)
+        ORDER BY
+            dates
+    </select>
+
 </mapper>

+ 10 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentsMapper.xml

@@ -148,4 +148,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          update tournaments set is_delete=true where id=#{tournamentId}
     </delete>
 
+
+    <select id="selectTournamentsCountByTime" resultType="int">
+      SELECT  ifnull(count(distinct id),0)
+        FROM tournaments   where  created_at >= #{startTime} and created_at &lt; #{endTime}
+      and is_delete=false  and status not in (0,5)
+    </select>
+
+
+
+
 </mapper>

+ 19 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/UserCheckRecordMapper.xml

@@ -88,4 +88,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
 
+
+    <select id="selectCheckRecordSanXiangCount"  resultType="int">
+        select
+            ifnull(sum(num),0)
+        from user_check_record
+        where  created_at >= #{beginTime} and created_at &lt; #{endTime} and item_id = 1001
+    </select>
+
+
+    <select id="selectCheckRecordGraphSanXiangCount" resultType="org.dromara.business.domain.vo.UserCheckRecordVo">
+        SELECT
+            DATE(created_at) as dates,
+            IFNULL(SUM(num), 0) as checkRecordSanXiangCount
+        FROM user_check_record
+        WHERE created_at >= #{beginTime} AND created_at &lt; #{endTime} and item_id = 1001
+        GROUP BY DATE(created_at)
+        ORDER BY dates
+    </select>
+
 </mapper>