From 9e29c5f32100c01e6c9808daa44e04a1954d0ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=AF=28004796=29?= Date: Sun, 4 Feb 2024 18:52:07 +0800 Subject: [PATCH] 123333 --- .../controller/cai/admin/HomeController.java | 37 +++++ .../com/ruoyi/test/business/NoticeTest.java | 15 ++ .../ruoyi/cai/cache/DynamicTotalCache.java | 3 + .../ruoyi/cai/cache/RechargeTotalCache.java | 60 +++++++ .../ruoyi/cai/cache/WithdrawTotalCache.java | 60 +++++++ .../cache/bean/RechargeTotalCacheBean.java | 11 ++ .../cache/bean/WithdrawTotalCacheBean.java | 11 ++ .../ruoyi/cai/constant/RedisHttpConstant.java | 4 + .../ruoyi/cai/domain/DayIncomeStatistics.java | 5 + .../dto/admin/vo/home/HomeStaticIndexVo.java | 21 +++ .../dto/admin/vo/rank/RankNodeAdminVo.java | 19 +++ .../cai/enums/rank/RankTimeTypeEnum.java | 27 ++++ .../ruoyi/cai/manager/AdminHomeManager.java | 146 +++++++++++++++++ .../ruoyi/cai/manager/ConsumerManager.java | 17 ++ .../cai/mq/handle/LoginNotifyHandle.java | 2 +- .../com/ruoyi/cai/rank/RankAdminManager.java | 148 ++++++++++++++++++ .../ruoyi/cai/rank/bean/RankAdminBean.java | 21 +++ .../ruoyi/cai/rank/bean/RankAdminNode.java | 21 +++ .../service/impl/AccountCashServiceImpl.java | 33 +++- .../impl/DayIncomeStatisticsServiceImpl.java | 10 +- .../java/com/ruoyi/cai/util/CaiNumUtil.java | 17 ++ .../ruoyi/framework/OnlineUserTodayCache.java | 23 ++- 22 files changed, 700 insertions(+), 11 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/HomeController.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/cache/RechargeTotalCache.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/cache/WithdrawTotalCache.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/RechargeTotalCacheBean.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/WithdrawTotalCacheBean.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/home/HomeStaticIndexVo.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/rank/RankNodeAdminVo.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/enums/rank/RankTimeTypeEnum.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/manager/AdminHomeManager.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/rank/RankAdminManager.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminBean.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminNode.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/HomeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/HomeController.java new file mode 100644 index 00000000..7c6e6002 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cai/admin/HomeController.java @@ -0,0 +1,37 @@ +package com.ruoyi.web.controller.cai.admin; + +import com.ruoyi.cai.dto.admin.vo.home.HomeStaticIndexVo; +import com.ruoyi.cai.dto.admin.vo.rank.RankNodeAdminVo; +import com.ruoyi.cai.enums.rank.RankTimeTypeEnum; +import com.ruoyi.cai.manager.AdminHomeManager; +import com.ruoyi.common.core.domain.R; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cai/home") +public class HomeController { + + @Autowired + private AdminHomeManager adminHomeManager; + + @GetMapping("/static/index") + public R staticIndex(){ + HomeStaticIndexVo homeStaticIndexVo = adminHomeManager.staticIndex(); + return R.ok(homeStaticIndexVo); + } + + @GetMapping("/static/rank") + public R> staticRank(Integer rankType,String rankTime){ + List rank = adminHomeManager.rank(rankType, RankTimeTypeEnum.getByCode(rankTime)); + return R.ok(rank); + } +} diff --git a/ruoyi-admin/src/test/java/com/ruoyi/test/business/NoticeTest.java b/ruoyi-admin/src/test/java/com/ruoyi/test/business/NoticeTest.java index b3244816..f31dffdc 100644 --- a/ruoyi-admin/src/test/java/com/ruoyi/test/business/NoticeTest.java +++ b/ruoyi-admin/src/test/java/com/ruoyi/test/business/NoticeTest.java @@ -1,5 +1,7 @@ package com.ruoyi.test.business; +import com.alibaba.fastjson.JSON; +import com.ruoyi.cai.cache.RechargeTotalCache; import com.ruoyi.cai.domain.Gift; import com.ruoyi.cai.domain.User; import com.ruoyi.cai.mq.handle.dto.WindowRechargeNotifyDTO; @@ -23,6 +25,19 @@ public class NoticeTest { @Autowired private YunxinHttpService yunxinHttpService; + @Autowired + private RechargeTotalCache rechargeTotalCache; + + @Test + public void test(){ + System.out.println(JSON.toJSONString(rechargeTotalCache.getToday())); + rechargeTotalCache.add(BigDecimal.valueOf(8123.12D)); + System.out.println(JSON.toJSONString(rechargeTotalCache.getToday())); + rechargeTotalCache.add(BigDecimal.valueOf(123)); + System.out.println(JSON.toJSONString(rechargeTotalCache.getToday())); + + } + /** * 注册赠送消息 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/DynamicTotalCache.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/DynamicTotalCache.java index 7c683f65..33af5d80 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/DynamicTotalCache.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/DynamicTotalCache.java @@ -11,6 +11,9 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.concurrent.TimeUnit; +/** + * 用户每日发送统计 + */ @Component public class DynamicTotalCache { diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/RechargeTotalCache.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/RechargeTotalCache.java new file mode 100644 index 00000000..03a518d9 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/RechargeTotalCache.java @@ -0,0 +1,60 @@ +package com.ruoyi.cai.cache; + +import com.ruoyi.cai.cache.bean.RechargeTotalCacheBean; +import com.ruoyi.cai.constant.RedisHttpConstant; +import com.ruoyi.common.utils.MapGetUtil; +import org.redisson.api.RMap; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.Duration; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Map; + +/** + * 每日充值统计 + */ +@Component +public class RechargeTotalCache { + + @Autowired + private RedissonClient redissonClient; + + public String getKey(LocalDate date){ + String now = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + return String.format(RedisHttpConstant.RECHARGE_TOTAL_CACHE_REDIS,now); + } + + public void add(BigDecimal amount){ + String key = getKey(LocalDate.now()); + RMap map = redissonClient.getMap(key); + map.addAndGet("amount",amount.doubleValue()); + map.addAndGet("num",1); + map.expireAsync(Duration.ofDays(3)); + } + + public RechargeTotalCacheBean get(LocalDate date){ + String key = getKey(date); + RMap map = redissonClient.getMap(key); + Map allMap = map.readAllMap(); + Object amountObj = allMap.getOrDefault("amount", 0.0D); + BigDecimal amount = MapGetUtil.getBigDecimal(amountObj); + Object numObj = allMap.getOrDefault("num", 0); + Long num = MapGetUtil.getLong(numObj); + RechargeTotalCacheBean rechargeTotalCacheBean = new RechargeTotalCacheBean(); + rechargeTotalCacheBean.setAmount(amount); + rechargeTotalCacheBean.setNum(num); + return rechargeTotalCacheBean; + } + + public RechargeTotalCacheBean getToday(){ + return get(LocalDate.now()); + } + + public RechargeTotalCacheBean getLastToday(){ + return get(LocalDate.now().plusDays(-1)); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/WithdrawTotalCache.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/WithdrawTotalCache.java new file mode 100644 index 00000000..cf4b96fc --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/WithdrawTotalCache.java @@ -0,0 +1,60 @@ +package com.ruoyi.cai.cache; + +import com.ruoyi.cai.cache.bean.WithdrawTotalCacheBean; +import com.ruoyi.cai.constant.RedisHttpConstant; +import com.ruoyi.common.utils.MapGetUtil; +import org.redisson.api.RMap; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.Duration; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Map; + +/** + * 每日充值统计 + */ +@Component +public class WithdrawTotalCache { + + @Autowired + private RedissonClient redissonClient; + + public String getKey(LocalDate date){ + String now = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + return String.format(RedisHttpConstant.WITHDRAW_TOTAL_CACHE_REDIS,now); + } + + public void add(BigDecimal amount){ + String key = getKey(LocalDate.now()); + RMap map = redissonClient.getMap(key); + map.addAndGet("amount",amount.doubleValue()); + map.addAndGet("num",1); + map.expireAsync(Duration.ofDays(3)); + } + + public WithdrawTotalCacheBean get(LocalDate date){ + String key = getKey(date); + RMap map = redissonClient.getMap(key); + Map allMap = map.readAllMap(); + Object amountObj = allMap.getOrDefault("amount", 0.0D); + BigDecimal amount = MapGetUtil.getBigDecimal(amountObj); + Object numObj = allMap.getOrDefault("num", 0); + Long num = MapGetUtil.getLong(numObj); + WithdrawTotalCacheBean bean = new WithdrawTotalCacheBean(); + bean.setAmount(amount); + bean.setNum(num); + return bean; + } + + public WithdrawTotalCacheBean getToday(){ + return get(LocalDate.now()); + } + + public WithdrawTotalCacheBean getLastToday(){ + return get(LocalDate.now().plusDays(-1)); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/RechargeTotalCacheBean.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/RechargeTotalCacheBean.java new file mode 100644 index 00000000..8a03cfe6 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/RechargeTotalCacheBean.java @@ -0,0 +1,11 @@ +package com.ruoyi.cai.cache.bean; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RechargeTotalCacheBean { + private BigDecimal amount; + private Long num; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/WithdrawTotalCacheBean.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/WithdrawTotalCacheBean.java new file mode 100644 index 00000000..62f52d4f --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/cache/bean/WithdrawTotalCacheBean.java @@ -0,0 +1,11 @@ +package com.ruoyi.cai.cache.bean; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class WithdrawTotalCacheBean { + private BigDecimal amount; + private Long num; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java index c45b30c4..c1af3bfb 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisHttpConstant.java @@ -6,12 +6,16 @@ public class RedisHttpConstant { public static final String CITY_CACHE_REDIS = REDIS_P + "city"; public static final String CITY_CACHE_ALL_REDIS = REDIS_P + "cityAll"; public static final String DYNAMIC_TOTAL_CACHE_REDIS = REDIS_P + "synamicTotal:%s:%s"; + public static final String RECHARGE_TOTAL_CACHE_REDIS = REDIS_P + "rechargeTotal:%s"; + public static final String WITHDRAW_TOTAL_CACHE_REDIS = REDIS_P + "withdrawTotal:%s"; public static final String CODE_REDIS = REDIS_P + "code:%s:%s"; public static final String USER_GREET_TOTAL_REDIS = REDIS_P + "userGreetTotal:%s:%s"; public static final String USER_GREET_SEND_TIME_REDIS = REDIS_P + "userGreetSendTime:%s"; public static final String FORBID_CACHE_REDIS = REDIS_P + "forbid:%s"; public static final String LOVE_RANK_REDIS = REDIS_P + "loveRank:%s:%s"; public static final String INVITE_RANK_REDIS = REDIS_P + "inviteRank:%s:%s"; + public static final String WITHDRAW_RANK_REDIS = REDIS_P + "withdrawRank:%s:%s"; + public static final String RECHARGE_RANK_REDIS = REDIS_P + "rechargeRank:%s:%s"; public static final String HOME_RECOMMEND_REDIS = REDIS_P + "homeRecommendAnchor"; public static final String HOME_NEW_REDIS = REDIS_P + "homeNewAnchor"; public static final String HOME_ACTIVE_REDIS = REDIS_P + "homeActiveAnchor"; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/DayIncomeStatistics.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/DayIncomeStatistics.java index 8710f7de..1e67b182 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/DayIncomeStatistics.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/DayIncomeStatistics.java @@ -77,6 +77,11 @@ public class DayIncomeStatistics implements Serializable { */ private Long modifyIncomeSub; + /** + * 登陆用户 + */ + private Long loginNum; + private LocalDateTime createTime; private LocalDateTime updateTime; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/home/HomeStaticIndexVo.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/home/HomeStaticIndexVo.java new file mode 100644 index 00000000..925dc58b --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/home/HomeStaticIndexVo.java @@ -0,0 +1,21 @@ +package com.ruoyi.cai.dto.admin.vo.home; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class HomeStaticIndexVo { + private Long todayLoginNum; + private BigDecimal todayLoginDiffLast; + + private Long anchorNum; + + private BigDecimal todayRechargeAmountNum; + private Long todayRechargeNum; + private BigDecimal todayRechargeAmountDiffLast; + + private BigDecimal todayWithdrawAmount; + private Long todayWithdrawNum; + private BigDecimal todayWithdrawAmountDiffLast; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/rank/RankNodeAdminVo.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/rank/RankNodeAdminVo.java new file mode 100644 index 00000000..ae24169a --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/admin/vo/rank/RankNodeAdminVo.java @@ -0,0 +1,19 @@ +package com.ruoyi.cai.dto.admin.vo.rank; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class RankNodeAdminVo { + + @Schema(description = "用户ID") + private Long userId; + @Schema(description = "头像") + private String avatar; + @Schema(description = "昵称") + private String nickname; + @Schema(description = "蜜瓜号") + private String usercode; + @Schema(description = "数值") + private Number value; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/rank/RankTimeTypeEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/rank/RankTimeTypeEnum.java new file mode 100644 index 00000000..7b10ffdc --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/rank/RankTimeTypeEnum.java @@ -0,0 +1,27 @@ +package com.ruoyi.cai.enums.rank; + +import lombok.Getter; + +@Getter +public enum RankTimeTypeEnum { + DAY("Day"), + WEEK("Week"), + MONTH("Month"), + TOTAL("Total"), + ; + private final String code; + + RankTimeTypeEnum(String code) { + this.code = code; + } + + public static RankTimeTypeEnum getByCode(String code){ + RankTimeTypeEnum[] values = RankTimeTypeEnum.values(); + for (RankTimeTypeEnum value : values) { + if(value.getCode().equals(code)){ + return value; + } + } + return null; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/AdminHomeManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/AdminHomeManager.java new file mode 100644 index 00000000..02f3b565 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/AdminHomeManager.java @@ -0,0 +1,146 @@ +package com.ruoyi.cai.manager; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.cai.cache.RechargeTotalCache; +import com.ruoyi.cai.cache.WithdrawTotalCache; +import com.ruoyi.cai.cache.bean.RechargeTotalCacheBean; +import com.ruoyi.cai.cache.bean.WithdrawTotalCacheBean; +import com.ruoyi.cai.domain.User; +import com.ruoyi.cai.dto.admin.vo.home.HomeStaticIndexVo; +import com.ruoyi.cai.dto.admin.vo.rank.RankNodeAdminVo; +import com.ruoyi.cai.enums.rank.RankTimeTypeEnum; +import com.ruoyi.cai.rank.RankAdminManager; +import com.ruoyi.cai.rank.RankManager; +import com.ruoyi.cai.rank.RankNode; +import com.ruoyi.cai.rank.bean.RankAdminNode; +import com.ruoyi.cai.service.AnchorService; +import com.ruoyi.cai.service.UserService; +import com.ruoyi.cai.util.CaiNumUtil; +import com.ruoyi.framework.OnlineUserTodayCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Component +public class AdminHomeManager { + + @Autowired + private OnlineUserTodayCache onlineUserTodayCache; + @Autowired + private AnchorService anchorService; + @Autowired + private RechargeTotalCache rechargeTotalCache; + @Autowired + private WithdrawTotalCache withdrawTotalCache; + @Autowired + private RankAdminManager rankAdminManager; + @Autowired + private RankManager rankManager; + @Autowired + private UserService userService; + + /** + * @param rankType 1-魅力榜 2-邀请榜 3-充值榜 4-提现榜 + * @param rankTimeType + */ + public List rank(Integer rankType, RankTimeTypeEnum rankTimeType){ + if(rankType == null || rankTimeType == null){ + return Collections.emptyList(); + } + List res = new ArrayList<>(); + List rankNodeList; + if(rankType == 1){ + if(rankTimeType == RankTimeTypeEnum.DAY){ + rankNodeList = rankManager.getInviteRankToday(30); + }else if(rankTimeType == RankTimeTypeEnum.WEEK){ + rankNodeList = rankManager.getInviteRankWeek(30); + }else if(rankTimeType == RankTimeTypeEnum.MONTH){ + rankNodeList = rankManager.getInviteRankMonth(30); + }else if(rankTimeType == RankTimeTypeEnum.TOTAL){ + rankNodeList = rankManager.getInviteRankTotal(30); + }else{ + rankNodeList = Collections.emptyList(); + } + res = rankNodeList.stream().map(i -> { + RankNodeAdminVo vo = new RankNodeAdminVo(); + vo.setUserId(i.getUserId()); + vo.setValue(i.getScore()); + return vo; + }).collect(Collectors.toList()); + }else if(rankType == 2){ + if(rankTimeType == RankTimeTypeEnum.DAY){ + rankNodeList = rankManager.getLoveRankToday(30); + }else if(rankTimeType == RankTimeTypeEnum.WEEK){ + rankNodeList = rankManager.getLoveRankWeek(30); + }else if(rankTimeType == RankTimeTypeEnum.MONTH){ + rankNodeList = rankManager.getLoveRankMonth(30); + }else if(rankTimeType == RankTimeTypeEnum.TOTAL){ + rankNodeList = rankManager.getLoveRankTotal(30); + }else{ + rankNodeList = Collections.emptyList(); + } + res = rankNodeList.stream().map(i -> { + RankNodeAdminVo vo = new RankNodeAdminVo(); + vo.setUserId(i.getUserId()); + vo.setValue(i.getScore()); + return vo; + }).collect(Collectors.toList()); + }else if(rankType == 3){ + List rank = rankAdminManager.getRechargeRank(LocalDate.now(), rankTimeType, 30); + res = rank.stream().map(i -> { + RankNodeAdminVo vo = new RankNodeAdminVo(); + vo.setUserId(i.getUserId()); + vo.setValue(i.getScore()); + return vo; + }).collect(Collectors.toList()); + }else if(rankType == 4){ + List rank = rankAdminManager.getWithdrawRank(LocalDate.now(), rankTimeType, 30); + res = rank.stream().map(i -> { + RankNodeAdminVo vo = new RankNodeAdminVo(); + vo.setUserId(i.getUserId()); + vo.setValue(i.getScore()); + return vo; + }).collect(Collectors.toList()); + } + if(CollectionUtils.isEmpty(res)){ + return res; + } + Set userIds = res.stream().map(RankNodeAdminVo::getUserId).collect(Collectors.toSet()); + List userList = userService.listByIds(userIds); + Map userMap = userList.stream().collect(Collectors.toMap(User::getId, Function.identity())); + for (RankNodeAdminVo re : res) { + User user = userMap.get(re.getUserId()); + if(user != null){ + re.setUsercode(user.getUsercode()); + re.setNickname(user.getNickname()); + re.setAvatar(user.getAvatar()); + } + } + return res; + } + + public HomeStaticIndexVo staticIndex(){ + Long onlineTodayNum = onlineUserTodayCache.getOnlineTodayNum(); + Long onlineLastNum = onlineUserTodayCache.getOnlineLastNum(); + HomeStaticIndexVo vo = new HomeStaticIndexVo(); + vo.setTodayLoginNum(onlineTodayNum); + vo.setTodayLoginDiffLast(CaiNumUtil.diffRate(onlineTodayNum,onlineLastNum)); + vo.setAnchorNum(anchorService.count(Wrappers.emptyWrapper())); + RechargeTotalCacheBean todayRecharge = rechargeTotalCache.getToday(); + RechargeTotalCacheBean lastTodayRecharge = rechargeTotalCache.getLastToday(); + vo.setTodayRechargeAmountNum(todayRecharge.getAmount()); + vo.setTodayRechargeNum(todayRecharge.getNum()); + vo.setTodayRechargeAmountDiffLast(CaiNumUtil.diffRate(todayRecharge.getAmount(),lastTodayRecharge.getAmount())); + WithdrawTotalCacheBean todayWithdraw = withdrawTotalCache.getToday(); + WithdrawTotalCacheBean lastTodayWithdraw = withdrawTotalCache.getLastToday(); + vo.setTodayWithdrawAmount(todayWithdraw.getAmount()); + vo.setTodayWithdrawNum(todayWithdraw.getNum()); + vo.setTodayWithdrawAmountDiffLast(CaiNumUtil.diffRate(todayWithdraw.getAmount(),lastTodayWithdraw.getAmount())); + return vo; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java index d282a3c6..9126342c 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/ConsumerManager.java @@ -1,5 +1,6 @@ package com.ruoyi.cai.manager; +import com.ruoyi.cai.cache.RechargeTotalCache; import com.ruoyi.cai.domain.Account; import com.ruoyi.cai.domain.ConsumeLog; import com.ruoyi.cai.domain.Gift; @@ -16,7 +17,9 @@ import com.ruoyi.cai.mq.handle.dto.WindowGiftNotifyDTO; import com.ruoyi.cai.mq.handle.dto.WindowRechargeNotifyDTO; import com.ruoyi.cai.notice.YunxinHttpService; import com.ruoyi.cai.pay.PayTypeEnum; +import com.ruoyi.cai.rank.RankAdminManager; import com.ruoyi.cai.rank.RankManager; +import com.ruoyi.cai.rank.bean.RankAdminBean; import com.ruoyi.cai.service.*; import com.ruoyi.cai.ws.bean.Room; import lombok.extern.slf4j.Slf4j; @@ -123,10 +126,24 @@ public class ConsumerManager { rankManager.sendLoveRankMq(consumeLog.getSourceUserId(),consumeLog.getAnchorAmount(),consumeLog.getTraceId()); return resp; } + @Autowired + private RechargeTotalCache rechargeTotalCache; + @Autowired + private RankAdminManager rankAdminManager; public RechargeConsumerResp rechargeOrderSuccess(String tradeNo, Map params, String appId, PayTypeEnum payTypeEnum){ RechargeConsumerResp resp = rechargeOrderService.orderSuccess(tradeNo,params,appId,payTypeEnum); if(resp.isSuccess()){ + try { + rechargeTotalCache.add(resp.getPrice()); + RankAdminBean rankAdminBean = new RankAdminBean(); + rankAdminBean.setRankType(3); // 充值榜单 + rankAdminBean.setUserId(resp.getUserId()); + rankAdminBean.setPrice(resp.getPrice()); + rankAdminManager.addRank(rankAdminBean); + }catch (Exception e){ + log.error("充值每日实时统计失败",e); + } try { amqpProducer.sendCalculateSales(resp.getConsumeLogId()+""); }catch (Exception e){ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java index 2838b3f8..ac735741 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/handle/LoginNotifyHandle.java @@ -44,7 +44,7 @@ public class LoginNotifyHandle implements IHandle { @Override public void run(String message) { LoginNotifyDTO loginNotify = JSON.parseObject(message, LoginNotifyDTO.class); - boolean todayFirstLogin = onlineUserTodayCache.addOnlineUserId(loginNotify.getUserId(),loginNotify.getHappenTime()); + boolean todayFirstLogin = onlineUserTodayCache.addOnlineUserId(loginNotify.getUserId(),loginNotify.getHappenTime().toLocalDate()); if(todayFirstLogin){ this.updateUserInfoSB(loginNotify.getUserId(),loginNotify.getClientIP(),loginNotify.getImei()); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/RankAdminManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/RankAdminManager.java new file mode 100644 index 00000000..46743b94 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/RankAdminManager.java @@ -0,0 +1,148 @@ +package com.ruoyi.cai.rank; + +import com.ruoyi.cai.constant.RedisHttpConstant; +import com.ruoyi.cai.enums.rank.RankTimeTypeEnum; +import com.ruoyi.cai.rank.bean.RankAdminBean; +import com.ruoyi.cai.rank.bean.RankAdminNode; +import org.redisson.api.RScoredSortedSet; +import org.redisson.api.RedissonClient; +import org.redisson.client.protocol.ScoredEntry; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * 充值和提现 + * 排行榜 后台管理专用, 暂时没有做持久化 + */ +@Component +public class RankAdminManager { + + + @Autowired + private RedissonClient redissonClient; + + public static final String WITHDRAW_RANK_REDIS = RedisHttpConstant.WITHDRAW_RANK_REDIS; + public static final String RECHARGE_RANK_REDIS = RedisHttpConstant.RECHARGE_RANK_REDIS; + + private String dateString(LocalDate time){ + return time.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + } + + /** + * 获取key + * @param time 时间 + * @return + */ + private String getWithdrawKey(LocalDate time, RankTimeTypeEnum rankTimeTypeEnum){ + String typeStr; + if(rankTimeTypeEnum == RankTimeTypeEnum.DAY){ + typeStr = dateString(time); + }else if(rankTimeTypeEnum == RankTimeTypeEnum.WEEK){ + LocalDate monday = time.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); + LocalDate sunday = time.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); + String mondayStr = dateString(monday); + String sundayStr = dateString(sunday); + typeStr = mondayStr+"-"+sundayStr; + }else if(rankTimeTypeEnum == RankTimeTypeEnum.MONTH){ + typeStr = time.format(DateTimeFormatter.ofPattern("yyyyMM")); + }else if(rankTimeTypeEnum == RankTimeTypeEnum.TOTAL){ + typeStr = RankTimeTypeEnum.TOTAL.getCode(); + }else { + return null; + } + return String.format(WITHDRAW_RANK_REDIS,rankTimeTypeEnum.getCode(),typeStr); + } + + private String getRechargeKey(LocalDate time,RankTimeTypeEnum rankTimeTypeEnum){ + String typeStr; + if(rankTimeTypeEnum == RankTimeTypeEnum.DAY){ + typeStr = dateString(time); + }else if(rankTimeTypeEnum == RankTimeTypeEnum.WEEK){ + LocalDate monday = time.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); + LocalDate sunday = time.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); + String mondayStr = dateString(monday); + String sundayStr = dateString(sunday); + typeStr = mondayStr+"-"+sundayStr; + }else if(rankTimeTypeEnum == RankTimeTypeEnum.MONTH){ + typeStr = time.format(DateTimeFormatter.ofPattern("yyyyMM")); + }else if(rankTimeTypeEnum == RankTimeTypeEnum.TOTAL){ + typeStr = RankTimeTypeEnum.TOTAL.getCode(); + }else { + return null; + } + return String.format(RECHARGE_RANK_REDIS,rankTimeTypeEnum.getCode(),typeStr); + } + + public void addRank(RankAdminBean dto){ + if(dto.getRankType() == null){ + return; + } + if(dto.getRankType() == 3){ // 3-充值榜 + LocalDate localDate = dto.getHappenTime().toLocalDate(); + String dayKey = getRechargeKey(localDate,RankTimeTypeEnum.DAY); + RScoredSortedSet daySet = redissonClient.getScoredSortedSet(dayKey); + daySet.addScore(dto.getUserId()+"",dto.getPrice()); + + String weekKey = getRechargeKey(localDate,RankTimeTypeEnum.WEEK); + RScoredSortedSet weekSet = redissonClient.getScoredSortedSet(weekKey); + weekSet.addScore(dto.getUserId()+"",dto.getPrice()); + + String monthKey = getRechargeKey(localDate,RankTimeTypeEnum.MONTH); + RScoredSortedSet monthSet = redissonClient.getScoredSortedSet(monthKey); + monthSet.addScore(dto.getUserId()+"",dto.getPrice()); + + String totalKey = getRechargeKey(localDate,RankTimeTypeEnum.TOTAL); + RScoredSortedSet totalSet = redissonClient.getScoredSortedSet(totalKey); + totalSet.addScore(dto.getUserId()+"",dto.getPrice()); + }else if(dto.getRankType() == 4){ // 4=提现榜 + LocalDate localDate = dto.getHappenTime().toLocalDate(); + String dayKey = getWithdrawKey(localDate,RankTimeTypeEnum.DAY); + RScoredSortedSet daySet = redissonClient.getScoredSortedSet(dayKey); + daySet.addScore(dto.getUserId()+"",dto.getPrice()); + + String weekKey = getWithdrawKey(localDate,RankTimeTypeEnum.WEEK); + RScoredSortedSet weekSet = redissonClient.getScoredSortedSet(weekKey); + weekSet.addScore(dto.getUserId()+"",dto.getPrice()); + + String monthKey = getWithdrawKey(localDate,RankTimeTypeEnum.MONTH); + RScoredSortedSet monthSet = redissonClient.getScoredSortedSet(monthKey); + monthSet.addScore(dto.getUserId()+"",dto.getPrice()); + + String totalKey = getWithdrawKey(localDate,RankTimeTypeEnum.TOTAL); + RScoredSortedSet totalSet = redissonClient.getScoredSortedSet(totalKey); + totalSet.addScore(dto.getUserId()+"",dto.getPrice()); + } + + } + + public List getRechargeRank(LocalDate date, RankTimeTypeEnum rankTimeType, int limit){ + List res = new ArrayList<>(); + String key = getRechargeKey(date,rankTimeType); + RScoredSortedSet daySet = redissonClient.getScoredSortedSet(key); + Collection> entries = daySet.entryRangeReversed(0, limit-1); + for (ScoredEntry entry : entries) { + res.add(RankAdminNode.getNode(entry)); + } + return res; + } + + public List getWithdrawRank(LocalDate date, RankTimeTypeEnum rankTimeType, int limit){ + List res = new ArrayList<>(); + String key = getWithdrawKey(date,rankTimeType); + RScoredSortedSet daySet = redissonClient.getScoredSortedSet(key); + Collection> entries = daySet.entryRangeReversed(0, limit-1); + for (ScoredEntry entry : entries) { + res.add(RankAdminNode.getNode(entry)); + } + return res; + } + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminBean.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminBean.java new file mode 100644 index 00000000..656b67fc --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminBean.java @@ -0,0 +1,21 @@ +package com.ruoyi.cai.rank.bean; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class RankAdminBean { + /** + * // 1-魅力榜 + * // 2-邀请榜 + * 3-充值榜 + * 4-提现榜 + */ + private Integer rankType; + // 受益人ID + private Long userId; + private Number price; + + private LocalDateTime happenTime = LocalDateTime.now(); +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminNode.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminNode.java new file mode 100644 index 00000000..fae79bd7 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/rank/bean/RankAdminNode.java @@ -0,0 +1,21 @@ +package com.ruoyi.cai.rank.bean; + +import lombok.Data; +import org.redisson.client.protocol.ScoredEntry; + +import java.math.BigDecimal; + +@Data +public class RankAdminNode { + private BigDecimal score; + private Long userId; + public RankAdminNode() { + } + + public static RankAdminNode getNode(ScoredEntry entry){ + RankAdminNode rankNode = new RankAdminNode(); + rankNode.setScore(BigDecimal.valueOf(entry.getScore())); + rankNode.setUserId(Long.valueOf(entry.getValue())); + return rankNode; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java index b9274a9b..2fab4399 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountCashServiceImpl.java @@ -3,6 +3,7 @@ package com.ruoyi.cai.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.cache.WithdrawTotalCache; import com.ruoyi.cai.domain.AccountBankcard; import com.ruoyi.cai.domain.AccountCash; import com.ruoyi.cai.domain.WithdrawExchange; @@ -17,6 +18,8 @@ import com.ruoyi.cai.notice.YunxinHttpService; import com.ruoyi.cai.notice.dto.CashSuccessSendMesDTO; import com.ruoyi.cai.pay.OrderNoUtil; import com.ruoyi.cai.pay.OrderTypeEnum; +import com.ruoyi.cai.rank.RankAdminManager; +import com.ruoyi.cai.rank.bean.RankAdminBean; import com.ruoyi.cai.service.AccountCashService; import com.ruoyi.cai.service.AccountBankcardService; import com.ruoyi.cai.service.AccountService; @@ -43,6 +46,10 @@ public class AccountCashServiceImpl extends ServiceImpl set = redissonClient.getSet(getKey(dateTime)); boolean res = set.add(userId); - set.expire(Duration.ofDays(1)); + set.expire(Duration.ofDays(3)); return res; } public Set getAllOnlineToday(){ - RSet set = redissonClient.getSet(getKey(LocalDateTime.now())); + RSet set = redissonClient.getSet(getKey(LocalDate.now())); return set.readAll(); } + + public Long getOnlineNum(LocalDate time){ + RSet set = redissonClient.getSet(getKey(time)); + return (long) set.size(); + } + + public Long getOnlineTodayNum(){ + RSet set = redissonClient.getSet(getKey(LocalDate.now())); + return (long) set.size(); + } + + public Long getOnlineLastNum(){ + RSet set = redissonClient.getSet(getKey(LocalDate.now().plusDays(-1))); + return (long) set.size(); + } }