Ver código fonte

feat(statistics): 新增充值、道具和赛事统计功能

- 实现充值流水统计接口及分页查询逻辑
- 增加道具使用记录统计功能,支持按时间范围筛选
- 添加赛事统计列表接口,包含报名人数与奖励信息-优化时间范围查询逻辑,支持日、周、月等快捷选项
- 调整枚举处理方式,避免无效代码异常抛出- 完善统计数据展示字段,增强前端展示能力
fugui001 2 meses atrás
pai
commit
21e7c56359
20 arquivos alterados com 423 adições e 30 exclusões
  1. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/PayOrderController.java
  2. 12 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/PlayersItemsLogController.java
  3. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/TournamentsController.java
  4. 11 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/PayOrderBo.java
  5. 23 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/PlayersItemsLogBo.java
  6. 8 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/TournamentsBo.java
  7. 2 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/ItemsTypeEnum.java
  8. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PayOrderVo.java
  9. 8 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PlayersItemsLogVo.java
  10. 16 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/TournamentsVo.java
  11. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/RewardClaimsMapper.java
  12. 11 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IPayOrderService.java
  13. 11 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IPlayersItemsLogService.java
  14. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/ITournamentsService.java
  15. 59 4
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PayOrderServiceImpl.java
  16. 60 3
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PlayersItemsLogServiceImpl.java
  17. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/StatisticsServiceImpl.java
  18. 139 14
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsServiceImpl.java
  19. 4 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/RewardClaimsMapper.xml
  20. 6 3
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentsMapper.xml

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/PayOrderController.java

@@ -101,4 +101,18 @@ public class PayOrderController extends BaseController {
         return toAjax(payOrderService.deleteWithValidByIds(List.of(ids), true));
     }
 
+
+    /**
+     * 充值统计
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    @SaCheckPermission("business:order:queryStatisticsPageList")
+    @GetMapping("/queryStatisticsPageList")
+    public TableDataInfo<PayOrderVo> queryStatisticsPageList(PayOrderBo bo, PageQuery pageQuery) {
+        return payOrderService.queryStatisticsPageList(bo, pageQuery);
+    }
+
+
 }

+ 12 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/PlayersItemsLogController.java

@@ -102,4 +102,16 @@ public class PlayersItemsLogController extends BaseController {
                           @PathVariable Long[] ids) {
         return toAjax(playersItemsLogService.deleteWithValidByIds(List.of(ids), true));
     }
+
+
+
+    /**
+     * 查询道具使用记录列表  统计
+     */
+    @SaCheckPermission("business:itemsLog:queryStatisticsPageList")
+    @GetMapping("/queryStatisticsPageList")
+    public TableDataInfo<PlayersItemsLogVo> queryStatisticsPageList(PlayersItemsLogBo bo, PageQuery pageQuery) {
+        return playersItemsLogService.queryStatisticsPageList(bo, pageQuery);
+    }
+
 }

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/TournamentsController.java

@@ -168,4 +168,18 @@ public class TournamentsController extends BaseController {
     }
 
 
+
+    /**
+     * 获取赛事统计列表
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    @SaCheckPermission("business:tournaments:getStatisticsPageList")
+    @GetMapping("/getStatisticsPageList")
+    public TableDataInfo<TournamentsVo> queryStatisticsPageList(TournamentsBo bo, PageQuery pageQuery) {
+        return tournamentsService.queryStatisticsPageList(bo, pageQuery);
+    }
+
+
 }

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

@@ -143,5 +143,16 @@ public class PayOrderBo extends BaseEntity {
      */
     private String endTime;
 
+    /**
+     *  日周月 三天  日期
+     */
+    private String flagType;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    private String userName;
 
 }

+ 23 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/PlayersItemsLogBo.java

@@ -1,5 +1,6 @@
 package org.dromara.business.domain.bo;
 
+import cn.idev.excel.annotation.ExcelProperty;
 import org.dromara.business.domain.PlayersItemsLog;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.EditGroup;
@@ -30,7 +31,7 @@ public class PlayersItemsLogBo extends BaseEntity {
     /**
      * 道具ID
      */
-    private Long itermsId;
+    private Long itemId;
 
     /**
      * 现在的数量
@@ -70,7 +71,27 @@ public class PlayersItemsLogBo extends BaseEntity {
     /**
      * 道具获取类型   充值/奖励/报名/比赛
      */
-    private String itermsType;
+    private String itemType;
 
+    /**
+     *  日周月 三天  日期
+     */
+    private String flagType;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+
+    /**
+     * 用户名
+     */
+    private String userName;
 
+    private String beginTime;
 }

+ 8 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/TournamentsBo.java

@@ -44,7 +44,7 @@ public class TournamentsBo extends BaseEntity {
     /**
      * 比赛结束时间
      */
-    private Date endTime;
+    private String endTime;
 
     /**
      * 游戏类型
@@ -149,4 +149,11 @@ public class TournamentsBo extends BaseEntity {
      */
     private Integer actionTime;
 
+
+    /**
+     *  日周月 三天  日期
+     */
+    private String flagType;
+
+
 }

+ 2 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/ItemsTypeEnum.java

@@ -37,7 +37,8 @@ public enum ItemsTypeEnum {
                 return status;
             }
         }
-        throw new IllegalArgumentException("Invalid code: " + code);
+        return null;
+        /*throw new IllegalArgumentException("Invalid code: " + code);*/
     }
 
 

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

@@ -173,6 +173,12 @@ public class PayOrderVo implements Serializable {
     private BigDecimal payOrderAmount;
     private String dates;
 
+    /**
+     * 关联道具text
+     */
+    private String relatedItemIdText;
+
+    private String productText;
 
 
 

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

@@ -108,7 +108,13 @@ public class PlayersItemsLogVo implements Serializable {
      * 道具获取类型   充值/奖励/报名/比赛
      */
     //@ExcelProperty(value = "道具获取类型   充值/奖励/报名/比赛")
-    private String itermsType;
+    private Long itemType;
+    
+
+    /**
+     * 道具获取方式    (充值 1/奖励 2/报名 3/比赛 4  / 核销 5 / 系统赠送  6)',
+     */
+    private String itermTypeWay;
 
     /**
      * 道具ID
@@ -120,5 +126,6 @@ public class PlayersItemsLogVo implements Serializable {
     private Integer sanXiangCardCount;
     private String dates;
 
+    private String statusText;
 
 }

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

@@ -80,6 +80,22 @@ public class TournamentsVo implements Serializable {
     @ExcelProperty(value = "报名要求")
     public String tournamentCondition;
 
+
+    /**
+     * 报名 条件数
+     */
+    public Long tournamentConditionValue;
+
+    /**
+     * 报名价值
+     */
+    private Long signValue;
+
+    /**
+     * 奖励数量
+     */
+    private int rewardClaimsCount;
+
     /**
      * 截止报名级别
      */

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/RewardClaimsMapper.java

@@ -53,4 +53,8 @@ public interface RewardClaimsMapper extends BaseMapperPlus<RewardClaims, RewardC
     @InterceptorIgnore(tenantLine = "true")
     List<RewardClaimsVo> selectByCriteriaExport(@Param("ew") Wrapper<RewardClaims> wrapper);
 
+    @InterceptorIgnore(tenantLine = "true")
+    int selectRewardClaimsCount(@Param("tournamentId") Long tournamentId);
+
+
 }

+ 11 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IPayOrderService.java

@@ -65,4 +65,15 @@ public interface IPayOrderService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+    /**
+     * 充值流水统计
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    TableDataInfo<PayOrderVo> queryStatisticsPageList(PayOrderBo bo, PageQuery pageQuery);
+
+
 }

+ 11 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IPlayersItemsLogService.java

@@ -66,4 +66,15 @@ public interface IPlayersItemsLogService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+    /**
+     * 道具流水统计
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 【请填写功能名称】分页列表
+     */
+    TableDataInfo<PlayersItemsLogVo> queryStatisticsPageList(PlayersItemsLogBo bo, PageQuery pageQuery);
+
 }

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/ITournamentsService.java

@@ -110,4 +110,18 @@ public interface ITournamentsService {
      */
     Boolean closeSendTournament(Long id);
 
+
+
+    /**
+     *  赛事统计
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 【请填写功能名称】分页列表
+     */
+    TableDataInfo<TournamentsVo> queryStatisticsPageList(TournamentsBo bo, PageQuery pageQuery);
+
+
+
+
 }

+ 59 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PayOrderServiceImpl.java

@@ -4,11 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.dromara.business.domain.PayOrder;
 import org.dromara.business.domain.bo.PayOrderBo;
+import org.dromara.business.domain.vo.ItemsVo;
 import org.dromara.business.domain.vo.PayOrderVo;
+import org.dromara.business.domain.vo.RechargeProductsVo;
 import org.dromara.business.domain.vo.UserVo;
+import org.dromara.business.mapper.ItemsMapper;
 import org.dromara.business.mapper.PayOrderMapper;
+import org.dromara.business.mapper.RechargeProductsMapper;
 import org.dromara.business.mapper.UserMapper;
 import org.dromara.business.service.IPayOrderService;
+import org.dromara.business.utils.DateTimeRangeUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -34,6 +39,11 @@ public class PayOrderServiceImpl implements IPayOrderService {
     private final PayOrderMapper baseMapper;
 
     private final UserMapper userMapper;
+
+    private final ItemsMapper itemsMapper;
+
+    private final RechargeProductsMapper rechargeProductsMapper;
+
     /**
      * 查询支付订单
      *
@@ -165,10 +175,16 @@ public class PayOrderServiceImpl implements IPayOrderService {
             wrapper.eq("a.seller_id", bo.getSellerId());
         }
 
-        // a.status
-        if (StringUtils.isNotBlank(bo.getStatus())) {
-            wrapper.eq("a.status", bo.getStatus());
-        }
+        if(StringUtils.isNotBlank(bo.getFlagType())){
+            //查询成功的
+            // a.status
+            wrapper.eq("a.status", "success");
+        }else{
+            // a.status
+            if (StringUtils.isNotBlank(bo.getStatus())) {
+                wrapper.eq("a.status", bo.getStatus());
+            }
+       }
 
         // a.pay_time
         if (bo.getPayTime() != null) {
@@ -260,4 +276,43 @@ public class PayOrderServiceImpl implements IPayOrderService {
         }
         return baseMapper.deletePayOrderById(ids) > 0;
     }
+
+
+    @Override
+    public TableDataInfo<PayOrderVo> queryStatisticsPageList(PayOrderBo bo, PageQuery pageQuery) {
+        String startDate = "";
+        String endDate = "";
+        String flagType = bo.getFlagType();
+        if(StringUtils.isNotBlank(flagType) && (flagType.equals("day") || flagType.equals("week") || flagType.equals("month") || flagType.equals("three"))){
+            startDate = DateTimeRangeUtils.getStartString(flagType);
+            endDate = DateTimeRangeUtils.getEndString(flagType);
+        } else {
+            startDate = bo.getStartTime();
+            endDate = bo.getEndTime();
+        }
+        bo.setBeginTime(startDate);
+        bo.setEndTime(endDate);
+
+        //根据用户名找到userId
+        Wrapper<PayOrder> lqw = buildQueryWrapper(bo);
+        Page<PayOrderVo> result = baseMapper.selectPayOrderAll(pageQuery.build(), lqw);
+        List<PayOrderVo> resultRecords = result.getRecords();
+        for (PayOrderVo resultRecord : resultRecords) {
+            UserVo userVo = userMapper.selectVoByIdInfo(resultRecord.getUserId());
+            if(userVo!=null){
+                resultRecord.setUserName(userVo.getNickName());
+                resultRecord.setPhone(userVo.getPhone());
+            }
+            ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(resultRecord.getRelatedItemId());
+            if(itemsVo!=null){
+                resultRecord.setRelatedItemIdText(itemsVo.getName());
+            }
+            RechargeProductsVo rechargeProductsVo = rechargeProductsMapper.selectRechargeProductsById(resultRecord.getProductId());
+            if(rechargeProductsVo!=null){
+                resultRecord.setProductText(rechargeProductsVo.getQuantity()+"*"+rechargeProductsVo.getProductName());
+            }
+        }
+        return TableDataInfo.build(result);
+    }
+
 }

+ 60 - 3
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PlayersItemsLogServiceImpl.java

@@ -2,6 +2,7 @@ package org.dromara.business.service.impl;
 
 import org.dromara.business.domain.PlayersItemsLog;
 import org.dromara.business.domain.bo.PlayersItemsLogBo;
+import org.dromara.business.domain.enums.ItemsTypeEnum;
 import org.dromara.business.domain.vo.ItemsVo;
 import org.dromara.business.domain.vo.PlayersItemsLogVo;
 import org.dromara.business.domain.vo.UserVo;
@@ -9,6 +10,7 @@ import org.dromara.business.mapper.ItemsMapper;
 import org.dromara.business.mapper.PlayersItemsLogMapper;
 import org.dromara.business.mapper.UserMapper;
 import org.dromara.business.service.IPlayersItemsLogService;
+import org.dromara.business.utils.DateTimeRangeUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -105,14 +107,22 @@ public class PlayersItemsLogServiceImpl implements IPlayersItemsLogService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<PlayersItemsLog> lqw = Wrappers.lambdaQuery();
         lqw.orderByDesc(PlayersItemsLog::getCreatedAt);
-        lqw.eq(bo.getItermsId() != null, PlayersItemsLog::getItemId, bo.getItermsId());
+        lqw.eq(bo.getItemId() != null, PlayersItemsLog::getItemId, bo.getItemId());
         lqw.eq(bo.getScoreNum() != null, PlayersItemsLog::getScoreNum, bo.getScoreNum());
         lqw.eq(bo.getAfterNum() != null, PlayersItemsLog::getAfterNum, bo.getAfterNum());
-        lqw.eq(bo.getCreatedAt() != null, PlayersItemsLog::getCreatedAt, bo.getCreatedAt());
+
         lqw.eq(bo.getUpdatedAt() != null, PlayersItemsLog::getUpdatedAt, bo.getUpdatedAt());
         lqw.eq(bo.getUserId() != null, PlayersItemsLog::getUserId, bo.getUserId());
         lqw.eq(bo.getType() != null, PlayersItemsLog::getType, bo.getType());
-        lqw.eq(StringUtils.isNotBlank(bo.getItermsType()), PlayersItemsLog::getItemType, bo.getItermsType());
+        lqw.eq(StringUtils.isNotBlank(bo.getItemType()), PlayersItemsLog::getItemType, bo.getItemType());
+
+        if (StringUtils.isNotBlank(bo.getBeginTime())) {
+            lqw.ge(PlayersItemsLog::getCreatedAt, bo.getBeginTime());
+        }
+        if (StringUtils.isNotBlank(bo.getEndTime())) {
+            lqw.le(PlayersItemsLog::getCreatedAt, bo.getEndTime());
+        }
+
         return lqw;
     }
 
@@ -167,4 +177,51 @@ public class PlayersItemsLogServiceImpl implements IPlayersItemsLogService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public TableDataInfo<PlayersItemsLogVo> queryStatisticsPageList(PlayersItemsLogBo bo, PageQuery pageQuery) {
+        String startDate = "";
+        String endDate = "";
+        String flagType = bo.getFlagType();
+        if(StringUtils.isNotBlank(flagType) && (flagType.equals("day") || flagType.equals("week") || flagType.equals("month") || flagType.equals("three"))){
+            startDate = DateTimeRangeUtils.getStartString(flagType);
+            endDate = DateTimeRangeUtils.getEndString(flagType);
+        } else {
+            startDate = bo.getStartTime();
+            endDate = bo.getEndTime();
+        }
+        bo.setBeginTime(startDate);
+        bo.setEndTime(endDate);
+
+        //根据用户名找到userId
+        if(StringUtils.isNotBlank(bo.getUserName())){
+            UserVo userVo = userMapper.selUserInfo(bo.getUserName());
+            if(userVo!=null){
+                bo.setUserId(userVo.getId());
+            }
+        }
+        LambdaQueryWrapper<PlayersItemsLog> lqw = buildQueryWrapper(bo);
+        Page<PlayersItemsLogVo> result = baseMapper.selectPlayerItemsLogInfoList(pageQuery.build(), lqw);
+        List<PlayersItemsLogVo> resultRecords = result.getRecords();
+        for (PlayersItemsLogVo resultRecord : resultRecords) {
+            ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(resultRecord.getItemId());
+            resultRecord.setItemName(itemsVo.getName());
+            ItemsTypeEnum itemsTypeEnum = ItemsTypeEnum.fromCode(resultRecord.getItemType());
+            if(itemsTypeEnum!=null){
+                resultRecord.setItermTypeWay(ItemsTypeEnum.fromCode(resultRecord.getItemType()).getDescription());
+            }
+            UserVo userVo = userMapper.selectVoByIdInfo(resultRecord.getUserId());
+            if(userVo!=null){
+                resultRecord.setUserName(userVo.getNickName());
+                resultRecord.setPhone(userVo.getPhone());
+            }
+            resultRecord.setStatusText("成功");
+        }
+        return TableDataInfo.build(result);
+    }
+
+
+
+
+
 }

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

@@ -55,7 +55,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 
         PayOrderVo payOrderVo = payOrderMapper.selectPayOrderCountByTime(startDate, endDate);
         if(payOrderVo!=null){
-            statisticsVo.setPayOrderAmount(payOrderVo.getTotalAmount());
+            statisticsVo.setPayOrderAmount(payOrderVo.getPayOrderAmount());
             statisticsVo.setPayOrderCount(payOrderVo.getPayOrderCount());
         }
 

+ 139 - 14
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsServiceImpl.java

@@ -13,6 +13,7 @@ import org.dromara.business.domain.enums.GameStatus;
 import org.dromara.business.domain.vo.*;
 import org.dromara.business.mapper.*;
 import org.dromara.business.service.IBlindLevelsService;
+import org.dromara.business.utils.DateTimeRangeUtils;
 import org.dromara.business.utils.RedisKeys;
 import org.dromara.business.utils.RedisUtil;
 import org.dromara.common.core.utils.StringUtils;
@@ -76,6 +77,10 @@ public class TournamentsServiceImpl implements ITournamentsService {
 
     private final IBlindLevelsService blindLevelsService;
 
+    private final ItemsMapper itemsMapper;
+
+    private final RewardClaimsMapper rewardClaimsMapper;
+
     @Autowired
     RedisUtil redisUtil;
 
@@ -315,15 +320,31 @@ public class TournamentsServiceImpl implements ITournamentsService {
 
         lqw.like(StringUtils.isNotBlank(bo.getName()), Tournaments::getName, bo.getName());
         lqw.like(bo.getId() != null, Tournaments::getId, bo.getId());
-        lqw.like(bo.getStartTime() != null, Tournaments::getStartTime, bo.getStartTime());
+
         lqw.eq(bo.getGameType() != null, Tournaments::getGameType, bo.getGameType());
         lqw.eq(bo.getStartingChips() != null, Tournaments::getStartingChips, bo.getStartingChips());
         lqw.eq(bo.getLevelDuration() != null, Tournaments::getLevelDuration, bo.getLevelDuration());
         lqw.eq(bo.getLateRegistrationLevel() != null, Tournaments::getLateRegistrationLevel, bo.getLateRegistrationLevel());
         lqw.eq(bo.getMaxPlayers() != null, Tournaments::getMaxPlayers, bo.getMaxPlayers());
-        lqw.eq(bo.getStatus() != null, Tournaments::getStatus, bo.getStatus());
-        lqw.eq(bo.getCreatedAt() != null, Tournaments::getCreatedAt, bo.getCreatedAt());
+
+        /*lqw.eq(bo.getCreatedAt() != null, Tournaments::getCreatedAt, bo.getCreatedAt());*/
         lqw.eq(bo.getUpdatedAt() != null, Tournaments::getUpdatedAt, bo.getUpdatedAt());
+        if(StringUtils.isNotBlank(bo.getFlagType())){
+            // 修改为时间范围查询:
+            if (bo.getStartTime() != null) {
+                lqw.ge(Tournaments::getStartTime, bo.getStartTime()); // 大于等于开始时间
+                lqw.le(Tournaments::getStartTime,  bo.getEndTime()); // 小于等于结束时间
+            }
+        /*    if (bo.getEndTime() != null) {
+                lqw.le(Tournaments::getStartTime,  bo.getEndTime()); // 小于等于结束时间
+            }*/
+            lqw.notIn(Tournaments::getStatus, Arrays.asList(0L, 5L));
+            // 添加 is_delete=false 条件,过滤已删除的记录
+            lqw.eq(Tournaments::getIsDelete, false);
+        }else{
+            lqw.like(bo.getStartTime() != null, Tournaments::getStartTime, bo.getStartTime());
+            lqw.eq(bo.getStatus() != null, Tournaments::getStatus, bo.getStatus());
+        }
         return lqw;
     }
 
@@ -597,6 +618,13 @@ public class TournamentsServiceImpl implements ITournamentsService {
 
     @Override
     public Boolean deleteTournament(Long id) {
+        if(id==null || id==0L){
+            return false;
+        }
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("channelType", "tournament_delete");
+        jsonObject.put("value", id);
+        redisUtil.publish(RedisKeys.CHANNEL_ADMIN, jsonObject);
         return baseMapper.deleteTournament(id)  > 0;
     }
 
@@ -613,23 +641,120 @@ public class TournamentsServiceImpl implements ITournamentsService {
         return true;
     }
 
-
-    private List<ItemsPrizeDto> parsePrizeList(String itemsPrizeListJson, ObjectMapper mapper) throws Exception {
-        if (itemsPrizeListJson == null || itemsPrizeListJson.isBlank()) {
-            throw new IllegalArgumentException("itemsPrizeList 不能为空");
+    @Override
+    public TableDataInfo<TournamentsVo> queryStatisticsPageList(TournamentsBo bo, PageQuery pageQuery) {
+        String startDate = "";
+        String endDate = "";
+        String flagType = bo.getFlagType();
+        if(StringUtils.isNotBlank(flagType) && (flagType.equals("day") || flagType.equals("week") || flagType.equals("month") || flagType.equals("three"))){
+            startDate = DateTimeRangeUtils.getStartString(flagType);
+            endDate = DateTimeRangeUtils.getEndString(flagType);
+
+            // 如果同时传入了自定义时间,则检查是否在flagType范围内
+            String customStartDate = bo.getStartTime();
+            String customEndDate = bo.getEndTime();
+
+            // 如果自定义时间在flagType范围内,则使用自定义时间
+            if (StringUtils.isNotBlank(customStartDate) && StringUtils.isNotBlank(customEndDate)) {
+                // 解析时间字符串
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                LocalDateTime customStart = LocalDateTime.parse(customStartDate, formatter);
+                LocalDateTime customEnd = LocalDateTime.parse(customEndDate, formatter);
+                LocalDateTime flagStart = LocalDateTime.parse(startDate, formatter);
+                LocalDateTime flagEnd = LocalDateTime.parse(endDate, formatter);
+
+                // 验证自定义时间是否在flagType范围内
+                if (!customStart.isBefore(flagStart) && !customEnd.isAfter(flagEnd) && !customStart.isAfter(customEnd)) {
+                    // 自定义时间在有效范围内,使用自定义时间
+                    startDate = customStartDate;
+                    endDate = customEndDate;
+                }
+            }
+        } else {
+            startDate = bo.getStartTime();
+            endDate = bo.getEndTime();
         }
 
-        String cleanedJson = itemsPrizeListJson.trim();
-        if (cleanedJson.startsWith(",")) {
-            cleanedJson = cleanedJson.substring(1);
+        bo.setStartTime(startDate);
+        bo.setEndTime(endDate);
+        LambdaQueryWrapper<Tournaments> lqw = buildQueryWrapper(bo);
+        Page<TournamentsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        for (TournamentsVo record :  result.getRecords()) {
+            Long tournamentId = record.getId();
+            String statusText= GameStatus.getDescriptionFromCode(record.getStatus());
+            record.setStatusText(statusText);
+
+            int totalSignNum = participantsMapper.selectParticipantsTotal(tournamentId);
+            record.setSignNum(totalSignNum);
+
+            //赛事报名条件
+            TournamentEntryConditionsVo tournamentEntryConditionsVo = tournamentEntryConditionsMapper.selectByTournamentInfo(tournamentId);
+            String tournamentCondition="";
+            Long tournamentConditionValue=0L;
+            if(tournamentEntryConditionsVo!=null){
+                record.setItemsId(tournamentEntryConditionsVo.getItemId());
+                record.setItemsNum(tournamentEntryConditionsVo.getRequiredQuantity());
+                record.setItemsName(tournamentEntryConditionsVo.getItemsName());
+                // 绑定报名条件
+                tournamentCondition=tournamentEntryConditionsVo.getItemsName();
+                //计算 条件数
+                ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(tournamentEntryConditionsVo.getItemId());
+                if(itemsVo!=null){
+                    tournamentConditionValue=itemsVo.getItemValue()*tournamentEntryConditionsVo.getRequiredQuantity();
+                }
+            }
+            record.setTournamentCondition(tournamentCondition);
+            record.setTournamentConditionValue(tournamentConditionValue);
+            //总报名价值
+            long signValue = totalSignNum * tournamentConditionValue;
+            record.setSignValue(signValue);
+
+
+            //排名
+            List<PrizeDistributionsVo> prizeDistributionsVos = prizeDistributionsMapper.selectByTournamentId(tournamentId);
+            if(prizeDistributionsVos!=null){
+                List<ItemsPrizeDto> itemsPrizeList=new ArrayList<>();
+                StringBuilder prizeDisplayBuilder = new StringBuilder();
+                // 提取并按排名正序排序后,取出 id 列表
+                List<Long> ids = prizeDistributionsVos.stream()
+                    .sorted(Comparator.comparing(PrizeDistributionsVo::getPaiming))
+                    .map(PrizeDistributionsVo::getId)
+                    .collect(Collectors.toList());
+                int i=0;
+                for (Long id2 : ids) {
+                    i++;
+                    //奖品
+                    PrizeDistributionItemsVo prizeDistributionItemsVos = prizeDistributionItemsMapper.selectByPrizeDistributionId(id2);
+                    if(prizeDistributionItemsVos!=null){
+                        ItemsPrizeDto itemsPrizeBo = new ItemsPrizeDto();
+                        itemsPrizeBo.setRanking(Long.valueOf(i));
+                        itemsPrizeBo.setItemId(prizeDistributionItemsVos.getItemId());
+                        itemsPrizeBo.setQuantity(prizeDistributionItemsVos.getQuantity());
+                        itemsPrizeBo.setItemsName(prizeDistributionItemsVos.getItemsName());
+                        itemsPrizeList.add(itemsPrizeBo);
+                        // 拼接 name*quantity 格式字符串
+                        if (prizeDisplayBuilder.length() > 0) {
+                            prizeDisplayBuilder.append(",");
+                        }
+                        prizeDisplayBuilder.append(prizeDistributionItemsVos.getItemsName())
+                            .append("*")
+                            .append(prizeDistributionItemsVos.getQuantity());
+                    }
+                }
+                record.setItemsPrizeList(itemsPrizeList);
+                record.setPrizeDisplay(prizeDisplayBuilder.toString()); // 假设 TournamentsVo 中有 prizeDisplay 字段
+            }
+            //奖励名次 数量
+            int rewardClaimsCount= rewardClaimsMapper.selectRewardClaimsCount(tournamentId);
+            record.setRewardClaimsCount(rewardClaimsCount);
+
         }
 
-        return mapper.readValue(
-            cleanedJson,
-            mapper.getTypeFactory().constructCollectionType(List.class, ItemsPrizeDto.class)
-        );
+        return TableDataInfo.build(result);
     }
 
+
+
     private Date parseDateTime(String dateTimeStr) throws ParseException {
         if (dateTimeStr == null || dateTimeStr.isBlank()) {
             throw new IllegalArgumentException("startTime 不能为空");

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/RewardClaimsMapper.xml

@@ -146,5 +146,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
 
+    <select id="selectRewardClaimsCount" resultType="int">
+        SELECT count(1)
+        FROM reward_claims where 1=1 AND tournament_id = #{tournamentId} and is_delete =  false
+    </select>
 
 </mapper>

+ 6 - 3
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/TournamentsMapper.xml

@@ -150,9 +150,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 
     <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 ifnull(count(distinct id),0)
+        FROM tournaments
+        WHERE start_time >= #{startTime}
+          AND start_time &lt; #{endTime}
+          AND is_delete=false
+          AND status not in (0,5)
     </select>