Parcourir la source

Merge remote-tracking branch 'origin/package-data' into package-data

wcc il y a 1 an
Parent
commit
08ec6a6ba7

+ 1 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AccountAgentDayController.java

@@ -37,7 +37,7 @@ public class AccountAgentDayController {
     }
     }
 
 
     @ApiOperation(value = "推广总数据")
     @ApiOperation(value = "推广总数据")
-    @PreAuthorize(permissionKey = "gameData:accountAgent:total")
+//    @PreAuthorize(permissionKey = "gameData:accountAgent:total")
     @PostMapping("/total")
     @PostMapping("/total")
     public ResultVO<Page<GamePromoteTotalVO>> accountAgentTotal(@RequestBody GamePromoteTotalDTO dto) {
     public ResultVO<Page<GamePromoteTotalVO>> accountAgentTotal(@RequestBody GamePromoteTotalDTO dto) {
         return ResultVO.ok(accountAgentDayService.accountAgentTotal(dto));
         return ResultVO.ok(accountAgentDayService.accountAgentTotal(dto));

+ 39 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RankingController.java

@@ -0,0 +1,39 @@
+package com.zanxiang.game.data.serve.controller;
+
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayDTO;
+import com.zanxiang.game.data.serve.pojo.dto.RechargeRankingDTO;
+import com.zanxiang.game.data.serve.pojo.vo.GameRechargeRankingVO;
+import com.zanxiang.game.data.serve.pojo.vo.PlayerRechargeRankingVO;
+import com.zanxiang.game.data.serve.service.IRankingService;
+import com.zanxiang.game.data.serve.utils.Page;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "排行榜")
+@RestController
+@RequestMapping("/ranking")
+public class RankingController {
+    @Autowired
+    private IRankingService rankingService;
+
+    @ApiOperation(value = "游戏充值排行榜")
+//    @PreAuthorize(permissionKey = "gameData:ranking:game")
+    @PostMapping("/game")
+    public ResultVO<Page<GameRechargeRankingVO>> gameRanking(@RequestBody RechargeRankingDTO dto) {
+        return ResultVO.ok(rankingService.gameRanking(dto));
+    }
+
+    @ApiOperation(value = "玩家充值排行榜")
+//    @PreAuthorize(permissionKey = "gameData:ranking:player")
+    @PostMapping("/player")
+    public ResultVO<Page<PlayerRechargeRankingVO>> userRanking(@RequestBody RechargeRankingDTO dto) {
+        return ResultVO.ok(rankingService.playerRanking(dto));
+    }
+}

+ 29 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/RechargeRankingDTO.java

@@ -0,0 +1,29 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
+import com.zanxiang.game.data.serve.pojo.entity.AdsGameRechargeRanking;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class RechargeRankingDTO extends BasePage<AdsGameRechargeRanking> {
+    @ApiModelProperty(notes = "充值开始日期")
+    private LocalDate beginDay;
+    @ApiModelProperty(notes = "充值结束日期")
+    private LocalDate endDay;
+
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
+
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
+}

+ 31 - 13
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalVO.java

@@ -162,14 +162,14 @@ public class GamePromoteTotalVO {
     @ApiModelProperty(notes = "新用户累计充值金额")
     @ApiModelProperty(notes = "新用户累计充值金额")
     private BigDecimal newUserRechargeMoney;
     private BigDecimal newUserRechargeMoney;
 
 
-    @ApiModelProperty(notes = "首日ROI=首日新用户充值金额/实际消耗")
+    @ApiModelProperty(notes = "首日回收率=首日新用户充值金额/实际消耗")
     private BigDecimal firstRecoveryRate;
     private BigDecimal firstRecoveryRate;
 
 
     @ApiModelProperty(notes = "当日回收率=新用户累计充值金额/实际消耗")
     @ApiModelProperty(notes = "当日回收率=新用户累计充值金额/实际消耗")
     private BigDecimal todayRecoveryRate;
     private BigDecimal todayRecoveryRate;
 
 
-    @ApiModelProperty(notes = "买量回收率=新用户累计充值金额/实际消耗")
-    private BigDecimal buyRecoveryRate;
+    @ApiModelProperty(notes = "回收率=新用户充值金额/实际消耗")
+    private BigDecimal recoveryRate;
 
 
     @ApiModelProperty(notes = "毛利额=新用户累计充值金额-实际消耗")
     @ApiModelProperty(notes = "毛利额=新用户累计充值金额-实际消耗")
     private BigDecimal grossMargin;
     private BigDecimal grossMargin;
@@ -201,17 +201,23 @@ public class GamePromoteTotalVO {
     @ApiModelProperty(notes = "首日付费率=首日新用户充值人数/注册人数")
     @ApiModelProperty(notes = "首日付费率=首日新用户充值人数/注册人数")
     private BigDecimal firstRechargeRate;
     private BigDecimal firstRechargeRate;
 
 
-    @ApiModelProperty(notes = "买量用户付费率=新用户累计充值人数/注册人数")
-    private BigDecimal buyUserRechargeRate;
+    @ApiModelProperty(notes = "新用户付费率=新用户充值人数/注册人数")
+    private BigDecimal userRechargeRate;
 
 
-    @ApiModelProperty(notes = "新用户付费比=首日新用户充值人数/账面充值人数")
-    private BigDecimal newUserRechargeRate;
+    @ApiModelProperty(notes = "当天付费率=新用户累计充值人数/注册人数")
+    private BigDecimal todayRechargeRate;
+
+    @ApiModelProperty(notes = "新用户付费比=新用户充值人数/账面充值人数")
+    private BigDecimal newUserRechargeRatio;
 
 
     @ApiModelProperty(notes = "首日客单价=首日新用户充值金额/首日新用户充值次数")
     @ApiModelProperty(notes = "首日客单价=首日新用户充值金额/首日新用户充值次数")
     private BigDecimal avgFirstUserRecharge;
     private BigDecimal avgFirstUserRecharge;
 
 
-    @ApiModelProperty(notes = "买量客单价=新用户累计充值金额/新用户累计充值次数")
-    private BigDecimal avgBuyUserRecharge;
+    @ApiModelProperty(notes = "新用户客单价=新用户充值金额/新用户充值次数")
+    private BigDecimal avgUserRecharge;
+
+    @ApiModelProperty(notes = "当天客单价=新用户累计充值金额/新用户累计充值次数")
+    private BigDecimal avgTodayRecharge;
 
 
     @ApiModelProperty(notes = "账面客单价=账面充值金额/账面充值次数")
     @ApiModelProperty(notes = "账面客单价=账面充值金额/账面充值次数")
     private BigDecimal avgShowUserRecharge;
     private BigDecimal avgShowUserRecharge;
@@ -219,19 +225,31 @@ public class GamePromoteTotalVO {
     @ApiModelProperty(notes = "首日充值成本=实际消耗/首日新用户充值人数")
     @ApiModelProperty(notes = "首日充值成本=实际消耗/首日新用户充值人数")
     private BigDecimal firstRechargeCost;
     private BigDecimal firstRechargeCost;
 
 
-    @ApiModelProperty(notes = "买量充值成本=实际消耗/新用户累计充值人数")
-    private BigDecimal buyUserRechargeCost;
+    @ApiModelProperty(notes = "新用户充值成本=实际消耗/新用户充值人数")
+    private BigDecimal userRechargeCost;
+
+    @ApiModelProperty(notes = "当天充值成本=实际消耗/首日新用户充值人数")
+    private BigDecimal todayRechargeCost;
 
 
-    @ApiModelProperty(notes = "复充率=新用户复充人数/新用户累计充值人数")
+    @ApiModelProperty(notes = "复充率=新用户复充人数/新用户充值人数")
     private BigDecimal repeatRechargeRate;
     private BigDecimal repeatRechargeRate;
 
 
+    @ApiModelProperty(notes = "新用户复充率=新用户复充人数/新用户累计充值人数")
+    private BigDecimal userRepeatRechargeRate;
+
+    @ApiModelProperty(notes = "当天复充率=复充人数/新用户累计充值人数")
+    private BigDecimal todayRepeatRechargeRate;
+
     @ApiModelProperty(notes = "新增注册Arpu=新用户累计充值金额/注册人数")
     @ApiModelProperty(notes = "新增注册Arpu=新用户累计充值金额/注册人数")
     private BigDecimal newRegArpu;
     private BigDecimal newRegArpu;
 
 
     @ApiModelProperty(notes = "首日付费Arpu=首日新用户充值金额/首日新用户充值人数")
     @ApiModelProperty(notes = "首日付费Arpu=首日新用户充值金额/首日新用户充值人数")
     private BigDecimal firstRechargeArpu;
     private BigDecimal firstRechargeArpu;
 
 
-    @ApiModelProperty(notes = "买付费Arpu=新用户累计充值金额/新用户累计充值人数")
+    @ApiModelProperty(notes = "新用户付费Arpu=新用户充值金额/新用户充值人数")
+    private BigDecimal userRechargeArpu;
+
+    @ApiModelProperty(notes = "当天付费Arpu=新用户累计充值金额/新用户累计充值人数")
     private BigDecimal todayRechargeArpu;
     private BigDecimal todayRechargeArpu;
 
 
     @ApiModelProperty(notes = "账面Arpu=账面充值金额/账面充值人数")
     @ApiModelProperty(notes = "账面Arpu=账面充值金额/账面充值人数")

+ 111 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameRechargeRankingVO.java

@@ -0,0 +1,111 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.nutz.dao.entity.annotation.Column;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameRechargeRankingVO {
+    private String id;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 游戏名称
+     */
+    @ApiModelProperty("游戏名称")
+    private String gameName;
+
+    /**
+     * 游戏类别
+     */
+    @ApiModelProperty("游戏类别")
+    private String gameClassify;
+
+    /**
+     * 当天充值金额
+     */
+    @ApiModelProperty("当天充值金额")
+    private BigDecimal todayAmount;
+
+    /**
+     * 当天买量充值金额
+     */
+    @ApiModelProperty("当天买量充值金额")
+    private BigDecimal todayBuyAmount;
+
+    /**
+     * 当天自然量充值金额
+     */
+    @ApiModelProperty("当天自然量充值金额")
+    private BigDecimal todayNatureAmount;
+
+    /**
+     * 累计充值今额
+     */
+    @ApiModelProperty("累计充值金额")
+    private BigDecimal totalAmount;
+
+    /**
+     * 累计买量充值金额
+     */
+    @ApiModelProperty("累计买量充值金额")
+    private BigDecimal totalBuyAmount;
+
+    /**
+     * 累计自然量充值金额
+     */
+    @ApiModelProperty("累计自然量充值金额")
+    private BigDecimal totalNatureAmount;
+
+    /**
+     * 平均单价
+     */
+    @ApiModelProperty("平均单价")
+    private BigDecimal avgAmount;
+
+    /**
+     * 注册人数
+     */
+    @ApiModelProperty("注册人数")
+    private Long regUserCount;
+
+    /**
+     * 累计充值人数
+     */
+    @ApiModelProperty("累计充值人数")
+    private Long totalRechargeUserCount;
+
+    /**
+     * 累计充值次数
+     */
+    @ApiModelProperty("累计充值次数")
+    private Long totalRechargeCount;
+
+    /**
+     * 累计消耗
+     */
+    @ApiModelProperty("累计消耗")
+    private BigDecimal totalCost;
+
+    /**
+     * 回本率
+     */
+    @ApiModelProperty("回本率")
+    private BigDecimal totalRoi;
+
+
+}

+ 103 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PlayerRechargeRankingVO.java

@@ -0,0 +1,103 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.nutz.dao.entity.annotation.Column;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class PlayerRechargeRankingVO {
+    private String id;
+    /**
+     * 玩家ID
+     */
+    @ApiModelProperty("玩家ID")
+    private Long playerId;
+
+    /**
+     * 玩家账号
+     */
+    @ApiModelProperty("玩家账号")
+    private String playerAccountId;
+
+    /**
+     * 注册渠道ID
+     */
+    @ApiModelProperty("注册渠道ID")
+    private Long regAgentId;
+
+    /**
+     * 注册时间
+     */
+    @ApiModelProperty("注册时间")
+    private LocalDateTime regUserTime;
+
+    /**
+     * 注册游戏ID
+     */
+    @ApiModelProperty("注册游戏ID")
+    private Long regGameId;
+
+    /**
+     * 玩家操作系统
+     */
+    @ApiModelProperty("玩家操作系统")
+    private String playerOs;
+
+    /**
+     * 最近充值游戏
+     */
+    @ApiModelProperty("最近充值游戏")
+    private Long lastAmountGameId;
+
+    /**
+     * 最近充值时间
+     */
+    @ApiModelProperty("最近充值时间")
+    private LocalDateTime lastAmountTime;
+
+    /**
+     * 首次充值金额
+     */
+    @ApiModelProperty("首次充值金额")
+    private BigDecimal firstAmount;
+
+    /**
+     * 最近充值金额
+     */
+    @ApiModelProperty("最近充值金额")
+    private BigDecimal lastAmount;
+
+    /**
+     * 累计充值今额
+     */
+    @ApiModelProperty("累计充值今额")
+    private BigDecimal totalAmount;
+
+    /**
+     * 今日累计充值今额
+     */
+    @ApiModelProperty("今日累计充值今额")
+    private BigDecimal todayTotalAmount;
+
+    /**
+     * 平均单价
+     */
+    @ApiModelProperty("平均单价")
+    private BigDecimal avgAmount;
+
+    /**
+     * 累计充值次数
+     */
+    @ApiModelProperty("累计充值次数")
+    private Long totalAmountCount;
+}

+ 12 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IRankingService.java

@@ -0,0 +1,12 @@
+package com.zanxiang.game.data.serve.service;
+
+import com.zanxiang.game.data.serve.pojo.dto.RechargeRankingDTO;
+import com.zanxiang.game.data.serve.pojo.vo.GameRechargeRankingVO;
+import com.zanxiang.game.data.serve.pojo.vo.PlayerRechargeRankingVO;
+import com.zanxiang.game.data.serve.utils.Page;
+
+public interface IRankingService {
+    Page<GameRechargeRankingVO> gameRanking(RechargeRankingDTO dto);
+
+    Page<PlayerRechargeRankingVO> playerRanking(RechargeRankingDTO dto);
+}

+ 84 - 73
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java

@@ -32,6 +32,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashMap;
@@ -132,18 +133,16 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
 
 
     @Override
     @Override
     public Page<GamePromoteTotalVO> accountAgentTotal(GamePromoteTotalDTO dto) {
     public Page<GamePromoteTotalVO> accountAgentTotal(GamePromoteTotalDTO dto) {
-        boolean hasRechargeDate = true;
         Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
         Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
         sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
         sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
         dto.setSysUserId(sysUserId);
         dto.setSysUserId(sysUserId);
-        if (null == dto.getCostEndDay() || null == dto.getCostBeginDay()){
+        if (null == dto.getCostEndDay() || null == dto.getCostBeginDay()) {
             dto.setCostBeginDay(LocalDate.now());
             dto.setCostBeginDay(LocalDate.now());
             dto.setCostEndDay(LocalDate.now());
             dto.setCostEndDay(LocalDate.now());
         }
         }
-        if (null == dto.getRechargeEndDay() || null == dto.getRechargeBeginDay()){
-            hasRechargeDate = false;
-            dto.setRechargeEndDay(dto.getCostEndDay());
-            dto.setRechargeBeginDay(dto.getCostBeginDay());
+        if (null == dto.getRechargeEndDay() || null == dto.getRechargeBeginDay()) {
+            dto.setRechargeEndDay(LocalDate.now());
+            dto.setRechargeBeginDay(LocalDate.now());
         }
         }
         Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
         Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
         // 创建一个 Criteria 接口实例
         // 创建一个 Criteria 接口实例
@@ -178,79 +177,93 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         sql.setPager(pager);
         sql.setPager(pager);
         Entity<GamePromoteTotalVO> entity = dao.getEntity(GamePromoteTotalVO.class);
         Entity<GamePromoteTotalVO> entity = dao.getEntity(GamePromoteTotalVO.class);
         sql.setEntity(entity).setCondition(cri);
         sql.setEntity(entity).setCondition(cri);
-        sql.setParam("rechargeBeginDay",dto.getRechargeBeginDay());
-        sql.setParam("rechargeEndDay",dto.getRechargeEndDay());
+        sql.setParam("rechargeBeginDay", dto.getRechargeBeginDay());
+        sql.setParam("rechargeEndDay", dto.getRechargeEndDay());
         dao.execute(sql);
         dao.execute(sql);
         Sql sqlCount = Sqls.queryEntity("select count(*) from ads_account_agent_day a " + "$condition");
         Sql sqlCount = Sqls.queryEntity("select count(*) from ads_account_agent_day a " + "$condition");
         sqlCount.setCondition(cri);
         sqlCount.setCondition(cri);
-        pager.setRecordCount((int) Daos.queryCount(dao,sqlCount));
+        pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
         List<GamePromoteTotalVO> list = sql.getList(GamePromoteTotalVO.class);
         List<GamePromoteTotalVO> list = sql.getList(GamePromoteTotalVO.class);
 
 
         //存在充值时间,获取表ads_dayn_amount的json数据
         //存在充值时间,获取表ads_dayn_amount的json数据
-        if (hasRechargeDate) {
-            Map<String, Object> dayNMap = new HashMap<>(4);
-            dayNMap.put("beginDay", dto.getRechargeBeginDay());
-            dayNMap.put("endDay", dto.getRechargeEndDay());
+        Map<String, Object> dayNMap = new HashMap<>(4);
+        dayNMap.put("beginDay", dto.getRechargeBeginDay());
+        dayNMap.put("endDay", dto.getRechargeEndDay());
 
 
-            //循环总数据的每条数据
-            List<GamePromoteTotalVO> hasRechargeDayList = list.stream().map(item -> {
-                Sql sqlDayN = Sqls.queryString("select dayN from ads_dayn_amount where " +
-                        "dt>=@beginDay and dt<=@endDay " +
-                        "and account_id = @accountId " +
-                        "and agent_id = @agentId");
-                dayNMap.put("accountId", item.getAccountId());
-                dayNMap.put("agentId", item.getAgentId());
-                sqlDayN.setParams(dayNMap);
-                dao.execute(sqlDayN);
-                List<String> dayNList = sqlDayN.getList(String.class);
-                DayN dayN = null;
-                //ads_dayn_amount存在充值数据
-                if (!CollectionUtils.isEmpty(dayNList)) {
-                    Gson gson = new Gson();
-                    List<Map<String, String>> jsonList = gson.fromJson(dayNList.toString(), ArrayList.class);
+        //循环总数据的每条数据
+        List<GamePromoteTotalVO> hasRechargeDayList = list.stream().map(item -> {
+            Sql sqlDayN = Sqls.queryString("select dayN from ads_dayn_amount where " +
+                    "dt>=@beginDay and dt<=@endDay " +
+                    "and account_id = @accountId " +
+                    "and agent_id = @agentId");
+            dayNMap.put("accountId", item.getAccountId());
+            dayNMap.put("agentId", item.getAgentId());
+            sqlDayN.setParams(dayNMap);
+            dao.execute(sqlDayN);
+            List<String> dayNList = sqlDayN.getList(String.class);
+            DayN dayN = null;
+            //ads_dayn_amount存在充值数据
+            if (!CollectionUtils.isEmpty(dayNList)) {
+                Gson gson = new Gson();
+                List<Map<String, String>> jsonList = gson.fromJson(dayNList.toString(), ArrayList.class);
 
 
-                    Map<String, String> resultMap = new HashMap<>();
-                    resultMap.put("dayN", "0.00-0-0");
-                    for (Map<String, String> jsonMap : jsonList) {
-                        for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
-                            String key = entry.getKey();
-                            String value = entry.getValue();
-                            String[] parts = value.split("-");
-                            if (DateUtil.parseLocalDate(key).compareTo(dto.getRechargeBeginDay()) >= 0
-                                    && DateUtil.parseLocalDate(key).compareTo(dto.getRechargeEndDay()) <= 0) {
-                                String[] existingParts = resultMap.get("dayN").split("-");
-                                BigDecimal money = new BigDecimal(existingParts[0]).add(new BigDecimal(parts[0]));
-                                int count = Integer.parseInt(existingParts[1]) + Integer.parseInt(parts[1]);
-                                int num = Integer.parseInt(existingParts[2]) + Integer.parseInt(parts[2]);
-                                String newValue = money + "-" + count + "-" + num;
-                                resultMap.put("dayN", newValue);
-                            }
+                Map<String, String> resultMap = new HashMap<>();
+                resultMap.put("dayN", "0.00-0-0");
+                for (Map<String, String> jsonMap : jsonList) {
+                    for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
+                        String key = entry.getKey();
+                        String value = entry.getValue();
+                        String[] parts = value.split("-");
+                        if (DateUtil.parseLocalDate(key).compareTo(dto.getRechargeBeginDay()) >= 0
+                                && DateUtil.parseLocalDate(key).compareTo(dto.getRechargeEndDay()) <= 0) {
+                            String[] existingParts = resultMap.get("dayN").split("-");
+                            BigDecimal money = new BigDecimal(existingParts[0]).add(new BigDecimal(parts[0]));
+                            int count = Integer.parseInt(existingParts[1]) + Integer.parseInt(parts[1]);
+                            int num = Integer.parseInt(existingParts[2]) + Integer.parseInt(parts[2]);
+                            String newValue = money + "-" + count + "-" + num;
+                            resultMap.put("dayN", newValue);
                         }
                         }
                     }
                     }
-                    if (!resultMap.isEmpty() && !resultMap.get("dayN").isEmpty()) {
-                        String[] parts = resultMap.get("dayN").split("-");
-                        dayN = DayN.builder()
-                                .rechargeMoney(new BigDecimal(parts[0]))
-                                .rechargeCount(Long.valueOf(parts[1]))
-                                .rechargeNum(Long.valueOf(parts[2]))
-                                .build();
-                    }
                 }
                 }
-                //充值时间范围内存在充值数据
-                if (null != dayN) {
-                    item.setUserRechargeMoney(dayN.getRechargeMoney());
-                    item.setUserRechargeCount(dayN.getRechargeCount());
-                    item.setUserRechargeUser(dayN.getRechargeNum());
-
-                    item.setOldUserRechargeMoney(item.getShowRechargeMoney().subtract(dayN.getRechargeMoney()));
-                    item.setOldUserRechargeCount(item.getShowRechargeCount() - dayN.getRechargeCount());
-                    item.setOldUserRechargeUser(item.getShowRechargeUser() - dayN.getRechargeNum());
+                if (!resultMap.isEmpty() && !resultMap.get("dayN").isEmpty()) {
+                    String[] parts = resultMap.get("dayN").split("-");
+                    dayN = DayN.builder()
+                            .rechargeMoney(new BigDecimal(parts[0]))
+                            .rechargeCount(Long.valueOf(parts[1]))
+                            .rechargeNum(Long.valueOf(parts[2]))
+                            .build();
                 }
                 }
-                return item;
-            }).collect(Collectors.toList());
-            return new Page<>(hasRechargeDayList, pager);
-        }
-        return new Page<>(list, pager);
+            }
+            //充值时间范围内存在充值数据
+            if (null != dayN) {
+                item.setUserRechargeMoney(dayN.getRechargeMoney());
+                item.setUserRechargeCount(dayN.getRechargeCount());
+                item.setUserRechargeUser(dayN.getRechargeNum());
+                item.setUserRechargeArpu(item.getUserRechargeUser() == 0 ?
+                        BigDecimal.ZERO:item.getUserRechargeMoney().divide(BigDecimal.valueOf(item.getUserRechargeUser()),4, RoundingMode.DOWN));
+
+                item.setOldUserRechargeMoney(item.getShowRechargeMoney().subtract(item.getUserRechargeMoney()));
+                item.setOldUserRechargeCount(item.getShowRechargeCount() - item.getUserRechargeCount());
+                item.setOldUserRechargeUser(item.getShowRechargeUser() - item.getUserRechargeUser());
+
+                item.setRecoveryRate(item.getCost().compareTo(BigDecimal.ZERO) == 0 ?
+                        BigDecimal.ZERO:item.getUserRechargeMoney().divide(item.getCost(),4, RoundingMode.DOWN));
+
+                item.setUserRechargeRate(item.getRegUserCount() == 0 ?
+                        BigDecimal.ZERO:BigDecimal.valueOf(item.getUserRechargeUser()).divide(BigDecimal.valueOf(item.getRegUserCount()),4, RoundingMode.DOWN));
+
+                item.setNewUserRechargeRatio(item.getShowRechargeUser() == 0 ?
+                        BigDecimal.ZERO:BigDecimal.valueOf(item.getUserRechargeUser()).divide(BigDecimal.valueOf(item.getShowRechargeUser()),4, RoundingMode.DOWN));
+
+                item.setAvgUserRecharge(item.getUserRechargeCount() == 0 ?
+                        BigDecimal.ZERO:item.getUserRechargeMoney().divide(BigDecimal.valueOf(item.getUserRechargeCount()),4, RoundingMode.DOWN));
+
+                item.setUserRechargeCost(item.getUserRechargeUser() == 0 ?
+                        BigDecimal.ZERO:item.getCost().divide(BigDecimal.valueOf(item.getUserRechargeUser()),4, RoundingMode.DOWN));
+            }
+            return item;
+        }).collect(Collectors.toList());
+        return new Page<>(hasRechargeDayList, pager);
     }
     }
 
 
     /**
     /**
@@ -489,7 +502,6 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	sum(a.new_user_total_amount) as new_user_recharge_money,
                 	sum(a.new_user_total_amount) as new_user_recharge_money,
                 	round(if(sum(a.cost) > 0, sum(a.first_new_user_amount) / sum(a.cost), 0), 4) as first_recovery_rate,
                 	round(if(sum(a.cost) > 0, sum(a.first_new_user_amount) / sum(a.cost), 0), 4) as first_recovery_rate,
                 	round(if(sum(a.cost) > 0, sum(a.new_user_total_amount) / sum(a.cost), 0), 4) as today_recovery_rate,
                 	round(if(sum(a.cost) > 0, sum(a.new_user_total_amount) / sum(a.cost), 0), 4) as today_recovery_rate,
-                	round(if(sum(a.cost) > 0, sum(a.buy_new_user_total_amount) / sum(a.cost), 0), 4) as buy_recovery_rate,
                 	sum(a.gross_profit) as gross_margin,
                 	sum(a.gross_profit) as gross_margin,
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d3, '/', 1)) / sum(a.cost), 0), 4) as roi_day3,
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d3, '/', 1)) / sum(a.cost), 0), 4) as roi_day3,
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d5, '/', 1)) / sum(a.cost), 0), 4) as roi_day5,
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d5, '/', 1)) / sum(a.cost), 0), 4) as roi_day5,
@@ -500,14 +512,13 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m6, '/', 1)) / sum(a.cost), 0), 4) as roi_day180,
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m6, '/', 1)) / sum(a.cost), 0), 4) as roi_day180,
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_y1, '/', 1)) / sum(a.cost), 0), 4) as roi_year1,
                 	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_y1, '/', 1)) / sum(a.cost), 0), 4) as roi_year1,
                 	round(if(sum(a.register_num) > 0, sum(a.first_new_user_amount_num) / sum(a.register_num), 0), 4) as first_recharge_rate,
                 	round(if(sum(a.register_num) > 0, sum(a.first_new_user_amount_num) / sum(a.register_num), 0), 4) as first_recharge_rate,
-                	round(if(sum(a.register_num) > 0, sum(a.buy_new_user_total_amount_num) / sum(a.register_num), 0), 4) as buy_user_recharge_rate,
-                	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as new_user_recharge_rate,
+                	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as today_recharge_rate,
                 	round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
                 	round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
-                	round(if(sum(a.buy_new_user_total_amount_count) > 0, sum(a.buy_new_user_total_amount) / sum(a.buy_new_user_total_amount_count), 0), 4) as avg_buy_user_recharge,
+                	round(if(sum(a.new_user_total_amount_count) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_count), 0), 4) as avg_today_recharge,
                 	round(if(sum(a.amount_count) > 0, sum(a.amount) / sum(a.amount_count), 0), 4) as avg_show_user_recharge,
                 	round(if(sum(a.amount_count) > 0, sum(a.amount) / sum(a.amount_count), 0), 4) as avg_show_user_recharge,
                 	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_cost,
                 	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_cost,
-                	round(if(sum(a.buy_new_user_total_amount_num) > 0, sum(a.cost) / sum(a.buy_new_user_total_amount_num), 0), 4) as buy_user_recharge_cost,
-                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.reg_order_user_again) / sum(a.new_user_total_amount_num), 0), 4) as repeat_recharge_rate,
+                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.cost) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_cost,
+                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.reg_order_user_again) / sum(a.new_user_total_amount_num), 0), 4) as today_repeat_recharge_rate,
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount) / sum(a.register_num), 0), 4) as new_reg_arpu,
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount) / sum(a.register_num), 0), 4) as new_reg_arpu,
                 	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_arpu,
                 	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_arpu,
                 	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_arpu,
                 	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_arpu,

+ 134 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RankingServiceImpl.java

@@ -0,0 +1,134 @@
+package com.zanxiang.game.data.serve.service.impl;
+
+import com.google.common.base.CaseFormat;
+import com.zanxiang.game.data.serve.pojo.dto.RechargeRankingDTO;
+import com.zanxiang.game.data.serve.pojo.vo.GameRechargeRankingVO;
+import com.zanxiang.game.data.serve.pojo.vo.PlayerRechargeRankingVO;
+import com.zanxiang.game.data.serve.service.IRankingService;
+import com.zanxiang.game.data.serve.utils.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.nutz.dao.Cnd;
+import org.nutz.dao.Dao;
+import org.nutz.dao.Sqls;
+import org.nutz.dao.entity.Entity;
+import org.nutz.dao.pager.Pager;
+import org.nutz.dao.sql.Sql;
+import org.nutz.dao.util.Daos;
+import org.nutz.dao.util.cri.SimpleCriteria;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class RankingServiceImpl implements IRankingService {
+    @Autowired
+    private Dao dao;
+
+    private static final String ASC = "asc";
+    private static final String DESC = "desc";
+
+    @Override
+    public Page<GameRechargeRankingVO> gameRanking(RechargeRankingDTO dto) {
+        if (StringUtils.isBlank(dto.getSortFiled())){
+            dto.setSortFiled("totalAmount");
+        }
+        if (StringUtils.isBlank(dto.getSortType())){
+            dto.setSortType(DESC);
+        }
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        // 创建一个 Criteria 接口实例
+        SimpleCriteria cri = Cnd.cri();
+        if (null != dto.getBeginDay() && null != dto.getEndDay()){
+            cri.where().and("dt",">=",dto.getBeginDay()).and("dt","<=",dto.getEndDay());
+        }
+        cri.groupBy("game_id");
+        cri.orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        Sql sql = Sqls.queryEntity(gameRankingSql() + "$condition");
+        sql.setPager(pager);
+        Entity<GameRechargeRankingVO> entity = dao.getEntity(GameRechargeRankingVO.class);
+        sql.setEntity(entity).setCondition(cri);
+        dao.execute(sql);
+
+        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_game_recharge_ranking " + "$condition");
+        sqlCount.setCondition(cri);
+        pager.setRecordCount((int) Daos.queryCount(dao,sqlCount));
+        return new Page<>(sql.getList(GameRechargeRankingVO.class),pager);
+    }
+
+    private String gameRankingSql() {
+        return """
+                select
+                max(game_id) as id,
+                max(game_id) as game_id,
+                max(game_name) as game_name,
+                max(game_classify) as game_classify,
+                sum(today_amount) as today_amount,
+                sum(today_buy_amount) as today_buy_amount,
+                sum(today_nature_amount) as today_nature_amount,
+                sum(total_amount) as total_amount,
+                sum(total_buy_amount) as total_buy_amount,
+                sum(total_nature_amount) as total_nature_amount,
+                round(if(sum(total_recharge_count) > 0, sum(total_amount) / sum(total_recharge_count), 0), 2) as avg_amount,
+                sum(reg_user_count) as reg_user_count,
+                sum(total_recharge_user_count) as total_recharge_user_count,
+                sum(total_recharge_count) as total_recharge_count,
+                sum(total_cost) as total_cost,
+                round(if(sum(total_cost) > 0, sum(total_buy_amount) / sum(total_cost), 0), 4) as total_roi
+                from ads_game_recharge_ranking
+                """;
+    }
+
+    @Override
+    public Page<PlayerRechargeRankingVO> playerRanking(RechargeRankingDTO dto) {
+        if (StringUtils.isBlank(dto.getSortFiled())){
+            dto.setSortFiled("totalAmount");
+        }
+        if (StringUtils.isBlank(dto.getSortType())){
+            dto.setSortType(DESC);
+        }
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        // 创建一个 Criteria 接口实例
+        SimpleCriteria cri = Cnd.cri();
+        if (null != dto.getBeginDay() && null != dto.getEndDay()){
+            cri.where().and("dt",">=",dto.getBeginDay()).and("dt","<=",dto.getEndDay());
+        }
+        cri.groupBy("player_id");
+        cri.orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        Sql sql = Sqls.queryEntity(playerRankingSql() + "$condition");
+        sql.setPager(pager);
+        Entity<PlayerRechargeRankingVO> entity = dao.getEntity(PlayerRechargeRankingVO.class);
+        sql.setEntity(entity).setCondition(cri);
+        dao.execute(sql);
+
+        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_player_recharge_ranking " + "$condition");
+        sqlCount.setCondition(cri);
+        pager.setRecordCount((int) Daos.queryCount(dao,sqlCount));
+        return new Page<>(sql.getList(PlayerRechargeRankingVO.class),pager);
+    }
+
+    private String playerRankingSql() {
+        return """
+                select
+                max(player_id) as id,
+                max(player_id) as player_id,
+                max(player_account_id) as player_account_id,
+                max(reg_agent_id) as reg_agent_id,
+                max(reg_agent_name) as reg_agent_name,
+                max(reg_user_time) as reg_user_time,
+                max(reg_game_id) as reg_game_id,
+                max(reg_game_name) as reg_game_name,
+                max(player_os) as player_os,
+                sum(today_total_amount) as today_total_amount,
+                sum(first_amount) as first_amount,
+                sum(last_amount) as last_amount,
+                sum(total_amount) as total_amount,
+                round(if(sum(total_amount_count) > 0, sum(total_amount) / sum(total_amount_count), 0), 2) as avg_amount,
+                sum(total_amount_count) as total_amount_count,
+                max(last_amount_game_id) as last_amount_game_id,
+                max(last_amount_game_name) as last_amount_game_name,
+                max(last_amount_time) as last_amount_time
+                from ads_player_recharge_ranking
+                """;
+    }
+}