소스 검색

:fix:角色充值排行榜sql优化

zhangxianyu 1 년 전
부모
커밋
174941c8a7

+ 1 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataDayTotalDTO.java

@@ -66,6 +66,6 @@ public class GameDataDayTotalDTO {
      * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
      */
     @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度")
-    private Long gameDimension;
+    private Long gameDimension = 1L;
 
 }

+ 3 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/RechargeTrendVO.java

@@ -26,19 +26,19 @@ public class RechargeTrendVO {
     private BigDecimal rechargeMoney;
 
     /**
-     * 增
+     * 增(第N天减第N-1天金额除总消耗)
      */
     @ApiModelProperty(notes = "增")
     private BigDecimal increase;
 
     /**
-     * 回
+     * 回(第N天的金额除总消耗)
      */
     @ApiModelProperty(notes = "回")
     private BigDecimal back;
 
     /**
-     * 倍
+     * 倍(第N天的金额除第一天的金额)
      */
     @ApiModelProperty(notes = "倍")
     private BigDecimal multiples;

+ 260 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -30,6 +30,7 @@ import org.nutz.dao.sql.Criteria;
 import org.nutz.dao.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StopWatch;
 
 import java.util.*;
 import java.util.function.Function;
@@ -67,10 +68,15 @@ public class RoleManageServiceImpl implements IRoleManageService {
         Criteria criTodayAmount = getDateSqlByQuery(dto);
         //分页对象
         Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+
+        StopWatch watch=new StopWatch();
+        watch.start();
         //查询总记录数
-        Sql countSql = Sqls.create(getCountNumSql(criA, criTodayAmount));
+        Sql countSql = Sqls.create(getCountNumSql2(criA, criTodayAmount));
         countSql.setCallback(Sqls.callback.integer());
         dao.execute(countSql);
+        watch.stop();
+
         pager.setRecordCount(countSql.getInt());
         //主表添加排序条件
         if (StringUtils.isBlank(dto.getSortType())) {
@@ -125,6 +131,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
             updateUserName(map, "customer_service_id", "customer_service_name", userMap);
         }
         //返回结果
+        log.info("查询总记录数耗时:{}",watch.getTotalTimeMillis());
         return new Page<>(list, pager);
     }
 
@@ -2114,6 +2121,258 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 """ + criA;
     }
 
+    /**
+     * 查询记录数
+     * @param criA 主表条件
+     * @param criTodayAmount 今日充值条件
+     * @return String
+     */
+    private String getCountNumSql2(Criteria criA, Criteria criTodayAmount) {
+        return """
+                SELECT
+                    COUNT(1)
+                FROM (
+                    SELECT
+                        a.association_user_id as association_user_id, -- 来源的用户id
+                        a.source_system as source_system, -- sdk来源
+                        a.role_id as role_id, -- 角色id
+                        b.role_name as role_name, -- 角色名
+                        a.create_time as role_create_time, -- 角色创建时间
+                        b.role_level as role_level, -- 角色等级
+                        IFNULL(c.amount, 0) as amount, -- 角色累计充值金额
+                        IFNULL(w.vip_level,
+                        (CASE
+                            WHEN c.amount >= 0 and c.amount < 2000 THEN '1'
+                            WHEN c.amount >= 2000 and c.amount < 5000 THEN '2'
+                            WHEN c.amount >= 5000 and c.amount < 10000 THEN '3'
+                            WHEN c.amount >= 10000 and c.amount < 20000 THEN '4'
+                            WHEN c.amount >= 20000 and c.amount < 50000 THEN '5'
+                            WHEN c.amount >= 50000 THEN '6'
+                            ELSE '0'
+                            END)) as vip_level, -- 角色vip等级
+                        a.game_id as role_reg_game_id, -- 角色注册游戏id
+                        IFNULL(d.parent_id, a.game_id) as role_reg_parent_game_id, -- 角色注册游戏的父游戏id
+                        IFNULL(d.super_game_id, a.game_id) as role_reg_super_game_id, -- 角色注册的超父游戏id
+                        a.server_id as server_id, -- 角色所在区服id
+                        t.server_name as source_server_name, -- 角色所在区服原始名
+                        IFNULL(f.real_amount, 0) as role_last_amount, -- 角色最近充值金额
+                        f.pay_time as role_last_pay_time, -- 角色最近充值时间
+                        g.update_time as role_active_time, -- 角色最近活跃时间
+                        TIMESTAMPDIFF(SECOND, g.update_time, NOW()) as role_active_until_now, -- 角色最近活跃距今
+                        IFNULL(h.real_amount, 0) as role_first_amount, -- 角色首次充值金额
+                        p.today_amount as today_amount, -- 角色当天充值金额
+                        TIMESTAMPDIFF(SECOND, a.create_time, f.pay_time) as role_reg_pay_time, -- 角色创建充值时间差(秒)
+                        TIMESTAMPDIFF(SECOND, f.pay_time, NOW()) as role_pay_until_now, -- 角色最近充值距今(秒)
+                        a.user_id as user_id, -- 玩家id
+                        x.agent_id as agent_id, -- 玩家注册渠道id
+                        IF(x.agent_id = 0 , '自然量', y.agent_name) as agent_name, -- 玩家注册渠道名
+                        y.put_user_id as put_user_id, -- 投手id
+                        IFNULL(j.is_send_mail, 0) as is_send_mail, -- 是否发送邮件
+                        j.send_gift_id as send_gift_id, -- 最新发送礼包id
+                        j.is_change_game_type as is_change_game_type, -- 是否转端 1-是;0-否
+                        j.is_add_corp_wechat as is_add_corp_wechat, -- 是否添加企微 1-是; 0-否
+                     
+                        IF(TIMESTAMPDIFF(HOUR, g.update_time, NOW()) > 72,
+                                        IF(TIMESTAMPDIFF(HOUR, f.pay_time, NOW()) < 72 , 0, 1) , 0) as is_remove_game_for_system, -- 是否退游 1-是;0-否(系统判定)
+                        j.is_remove_game as is_remove_game, -- 是否退游 1-是;0-否;null-代表未操作数据
+                        j.is_wake_up as is_wake_up, -- 是否唤醒 1-是;0-否
+                  
+                        j.gs_id as gs_id, -- GS_ID
+                        j.customer_service_id as customer_service_id, -- 客服ID
+                        j.oper_user_id as oper_user_id, -- 运营ID
+                        j.is_delete as is_delete, -- 是否删除 1-删除;0-正常
+                        ara.role_total_amount as role_total_amount, -- 创角24小时内总充值金额
+                		ara.max_amount as max_amount, -- 创角24小时内单笔最大充值金额
+                		ara.min_amount as min_amount, -- 创角24小时内单笔最小充值金额
+                		ara.role_amount as role_amount -- 角色充值数组
+                    FROM
+                    (
+                        SELECT
+                            *
+                        FROM
+                        (
+                            SELECT
+                                -- 角色所在子游戏id、区服id、合服id、角色id、角色名、角色创建时间、角色操作系统os(取创建时间最早的信息)
+                                b.association_user_id ,
+                                a.source_system,
+                                a.user_id,
+                                a.game_id,
+                                a.server_id,
+                                a.role_id,
+                                a.role_name,
+                                a.create_time,
+                                ROW_NUMBER()over(partition by a.role_id , a.source_system order by a.create_time asc, a.user_id asc) as num
+                            FROM dm_game_order.t_game_user_role a
+                            LEFT JOIN dm_game_order.t_game_user b on a.source_system = b.source_system AND a.user_id = b.id
+                        ) a
+                        WHERE num = 1
+                    ) a
+                    left join(
+                	    SELECT 
+                	        source_system,
+                	        role_id,
+                	        role_total_amount,
+                	        array_min(role_amount) min_amount,
+                	        array_max(role_amount) max_amount,
+                	        role_amount
+                	    FROM game_ads.ads_role_amount 
+                	) ara on a.role_id = ara.role_id and a.source_system = ara.source_system
+                    LEFT JOIN (
+                        SELECT
+                            -- 角色等级、角色攻击力(取最新的信息)
+                            source_system,
+                            role_id,
+                            role_name,
+                            role_level,
+                            ROW_NUMBER()over(partition by role_id , source_system order by update_time desc, user_id desc) as num
+                        FROM dm_game_order.t_game_user_role
+                    ) b on a.source_system = b.source_system AND a.role_id = b.role_id AND b.num = 1
+                    LEFT JOIN (
+                        SELECT
+                            -- 累计充值金额、累计充值次数
+                            role_id,
+                            source_system,
+                            SUM(real_amount) as amount
+                        FROM dm_game_order.t_game_order
+                        WHERE status =2
+                        GROUP BY role_id , source_system
+                    ) c on a.source_system = c.source_system AND a.role_id = c.role_id
+                    LEFT JOIN (
+                        SELECT
+                            -- 游戏名称、游戏类型、父游戏id、超父游戏id
+                            source_system,
+                            id,
+                            parent_id,
+                            super_game_id
+                        FROM dm_game_order.t_game
+                    ) d on a.source_system = d.source_system AND a.game_id = d.id
+                    LEFT JOIN (
+                        SELECT
+                            -- 父游戏名称
+                            source_system,
+                            id,
+                            game_name as parent_game_name
+                        FROM dm_game_order.t_game
+                    ) e on d.source_system = e.source_system AND d.parent_id = e.id
+                    LEFT JOIN (
+                        SELECT
+                            -- 角色最近充值时间、角色最近充值金额
+                            source_system,
+                            role_id,
+                            real_amount,
+                            pay_time,
+                            ROW_NUMBER()over(partition by role_id , source_system order by pay_time desc) as num
+                        FROM dm_game_order.t_game_order
+                        WHERE status =2
+                    ) f on a.source_system = f.source_system AND a.role_id = f.role_id AND f.num = 1
+                    LEFT JOIN (
+                        -- 角色最近活跃时间
+                        SELECT
+                            source_system ,
+                            role_id ,
+                            active_time as update_time ,
+                            ROW_NUMBER()over(partition by role_id , source_system order by active_time desc) as num
+                        FROM game_dw.dw_active_log
+                    ) g on a.source_system = g.source_system AND a.role_id = g.role_id AND g.num = 1
+                    LEFT JOIN (
+                        SELECT
+                            -- 角色首次充值金额
+                            source_system,
+                            role_id,
+                            real_amount,
+                            ROW_NUMBER()over(partition by role_id , source_system order by pay_time asc) as num
+                        FROM dm_game_order.t_game_order  WHERE status =2
+                    ) h on a.source_system = h.source_system AND a.role_id = h.role_id AND h.num = 1
+                    LEFT JOIN (
+                        SELECT
+                            -- 角色当天充值金额
+                            source_system,
+                            role_id,
+                            SUM(real_amount) as today_amount
+                        FROM dm_game_order.t_game_order
+                """ + criTodayAmount +
+                """
+                        GROUP BY role_id ,source_system
+                    ) p on a.source_system = p.source_system AND a.role_id = p.role_id
+                    LEFT JOIN (
+                        SELECT
+                            -- 操作表相关数据
+                            source_system,
+                            user_id,
+                            role_id,
+                            server_id,
+                            game_id,
+                            is_send_mail, -- 是否发送邮件
+                            send_gift_id, -- 最新发送礼包id
+                            is_change_game_type, -- 是否转端 1-是;0-否
+                            is_add_corp_wechat, -- 是否添加企微 1-是; 0-否
+                            is_remove_game, -- 是否退游 1-是;0-否
+                            is_wake_up, -- 是否唤醒 1-是;0-否
+                            gs_id, -- GS_ID
+                            customer_service_id, -- 客服ID
+                            oper_user_id, -- 运营ID
+                            is_delete -- 是否删除 1-删除;0-正常
+                        FROM dm_game_order.t_role_operate
+                    ) j on a.source_system = j.source_system AND a.association_user_id = j.user_id AND
+                    a.role_id = j.role_id AND a.server_id = j.server_id AND a.game_id = j.game_id
+                    LEFT JOIN (
+                        SELECT
+                            source_system ,
+                            id,
+                            name
+                        FROM dm_game_order.t_game_super
+                    ) s on d.source_system = s.source_system AND d.super_game_id = s.id
+                    LEFT JOIN (
+                        SELECT
+                            -- 原始服名
+                            source_system,
+                            game_id,
+                            server_id,
+                            server_name
+                        FROM dm_game_order.t_game_server_merge
+                        WHERE is_delete = 0
+                    ) t on a.source_system = t.source_system AND a.server_id = t.server_id AND d.super_game_id = t.game_id
+                    LEFT JOIN (
+                        SELECT
+                            -- vip等级
+                            source_system ,
+                            super_game_id ,
+                            parent_game_id ,
+                            recharge_money_min ,
+                            recharge_money_max ,
+                            vip_level ,
+                            is_delete
+                        FROM dm_game_order.t_game_vip
+                        WHERE is_delete = 0
+                    ) w on d.source_system = w.source_system AND IFNULL(d.parent_id, a.game_id) = w.parent_game_id
+                    AND IFNULL(d.super_game_id, a.game_id) = w.super_game_id
+                    AND c.amount >= w.recharge_money_min AND c.amount < recharge_money_max
+                    LEFT JOIN (
+                        SELECT
+                            source_system,
+                            id,
+                            create_time,
+                            end_time,
+                            agent_id,
+                            association_user_id
+                        FROM dm_game_order.t_game_user_burst
+                    ) x on a.source_system = x.source_system AND a.association_user_id = x.id
+                    AND a.create_time >= x.create_time AND a.create_time < x.end_time
+                    LEFT JOIN (
+                        SELECT
+                            -- 渠道名称、投手id
+                            source_system,
+                            id,
+                            agent_name,
+                            pitcher_id as put_user_id
+                        FROM dm_game_order.t_pitcher_agent
+                    ) y ON x.agent_id = y.id AND x.source_system = y.source_system
+                ) a
+                """ + criA;
+    }
+
+
+
     /**
      * 原始服-父游戏维度(区服相关信息)
      * @return String