|  | @@ -604,7 +604,7 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |      private String getPlayerDataListSql() {
 | 
	
		
			
				|  |  |          return """
 | 
	
		
			
				|  |  |                  SELECT
 | 
	
		
			
				|  |  | -                *
 | 
	
		
			
				|  |  | +                	*
 | 
	
		
			
				|  |  |                  FROM (
 | 
	
		
			
				|  |  |                      select
 | 
	
		
			
				|  |  |                          a.source_system as source_system ,
 | 
	
	
		
			
				|  | @@ -628,7 +628,7 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                          IFNULL(i.amount, 0) as recharge_money ,
 | 
	
		
			
				|  |  |                          IFNULL(i.amount_count, 0) as recharge_count,
 | 
	
		
			
				|  |  |                          IFNULL(b.role_num, 0) as role_count,
 | 
	
		
			
				|  |  | -                        b.create_time as update_time ,
 | 
	
		
			
				|  |  | +                        j.create_time as update_time ,
 | 
	
		
			
				|  |  |                          b.last_recharge_time as last_recharge_time,
 | 
	
		
			
				|  |  |                          a.status as status ,
 | 
	
		
			
				|  |  |                          b.role_name as last_game_role_name ,
 | 
	
	
		
			
				|  | @@ -693,6 +693,14 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                          where status = 2
 | 
	
		
			
				|  |  |                          group by user_id , source_system
 | 
	
		
			
				|  |  |                      ) i on a.id = i.user_id and a.source_system = i.source_system
 | 
	
		
			
				|  |  | +                    LEFT JOIN (
 | 
	
		
			
				|  |  | +                    	SELECT
 | 
	
		
			
				|  |  | +                    		source_system ,
 | 
	
		
			
				|  |  | +                    		user_id ,
 | 
	
		
			
				|  |  | +                    		create_time ,
 | 
	
		
			
				|  |  | +                    		ROW_NUMBER()over(partition by user_id , source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                    	FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                    ) j ON a.id = j.user_id AND a.source_system = j.source_system AND j.num = 1
 | 
	
		
			
				|  |  |                  ) k
 | 
	
		
			
				|  |  |                  """;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -704,7 +712,7 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |      private String getPlayerDataListCountSql() {
 | 
	
		
			
				|  |  |          return """
 | 
	
		
			
				|  |  |                  SELECT
 | 
	
		
			
				|  |  | -                    COUNT(1)
 | 
	
		
			
				|  |  | +                	COUNT(1)
 | 
	
		
			
				|  |  |                  FROM (
 | 
	
		
			
				|  |  |                      select
 | 
	
		
			
				|  |  |                          a.source_system as source_system ,
 | 
	
	
		
			
				|  | @@ -728,7 +736,7 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                          IFNULL(i.amount, 0) as recharge_money ,
 | 
	
		
			
				|  |  |                          IFNULL(i.amount_count, 0) as recharge_count,
 | 
	
		
			
				|  |  |                          IFNULL(b.role_num, 0) as role_count,
 | 
	
		
			
				|  |  | -                        b.create_time as update_time ,
 | 
	
		
			
				|  |  | +                        j.create_time as update_time ,
 | 
	
		
			
				|  |  |                          b.last_recharge_time as last_recharge_time,
 | 
	
		
			
				|  |  |                          a.status as status ,
 | 
	
		
			
				|  |  |                          b.role_name as last_game_role_name ,
 | 
	
	
		
			
				|  | @@ -749,14 +757,14 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                              a.num,
 | 
	
		
			
				|  |  |                              c.role_num
 | 
	
		
			
				|  |  |                              from (
 | 
	
		
			
				|  |  | -                                    select
 | 
	
		
			
				|  |  | -                                        source_system ,
 | 
	
		
			
				|  |  | -                                        user_id ,
 | 
	
		
			
				|  |  | -                                        role_name ,
 | 
	
		
			
				|  |  | -                                        create_time,
 | 
	
		
			
				|  |  | -                                        update_time ,
 | 
	
		
			
				|  |  | -                                        ROW_NUMBER() OVER(PARTITION BY user_id,source_system order by update_time  desc) as num
 | 
	
		
			
				|  |  | -                                    from dm_game_order.t_game_user_role
 | 
	
		
			
				|  |  | +                                select
 | 
	
		
			
				|  |  | +                                    source_system ,
 | 
	
		
			
				|  |  | +                                    user_id ,
 | 
	
		
			
				|  |  | +                                    role_name ,
 | 
	
		
			
				|  |  | +                                    create_time,
 | 
	
		
			
				|  |  | +                                    update_time ,
 | 
	
		
			
				|  |  | +                                    ROW_NUMBER() OVER(PARTITION BY user_id,source_system order by update_time  desc) as num
 | 
	
		
			
				|  |  | +                                from dm_game_order.t_game_user_role
 | 
	
		
			
				|  |  |                                  ) a
 | 
	
		
			
				|  |  |                              left join (
 | 
	
		
			
				|  |  |                                  select
 | 
	
	
		
			
				|  | @@ -793,6 +801,14 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                          where status = 2
 | 
	
		
			
				|  |  |                          group by user_id , source_system
 | 
	
		
			
				|  |  |                      ) i on a.id = i.user_id and a.source_system = i.source_system
 | 
	
		
			
				|  |  | +                    LEFT JOIN (
 | 
	
		
			
				|  |  | +                    	SELECT
 | 
	
		
			
				|  |  | +                    		source_system ,
 | 
	
		
			
				|  |  | +                    		user_id ,
 | 
	
		
			
				|  |  | +                    		create_time ,
 | 
	
		
			
				|  |  | +                    		ROW_NUMBER()over(partition by user_id , source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                    	FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                    ) j ON a.id = j.user_id AND a.source_system = j.source_system AND j.num = 1
 | 
	
		
			
				|  |  |                  ) k
 | 
	
		
			
				|  |  |                  """;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -837,7 +853,7 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  		a.role_vip as role_vip_level, -- 角色vip
 | 
	
		
			
				|  |  |                  		a.os , -- 角色操作系统
 | 
	
		
			
				|  |  |                  		a.create_time as create_time, -- 角色创建时间
 | 
	
		
			
				|  |  | -                		a.update_time, -- 角色最近更新时间
 | 
	
		
			
				|  |  | +                		k.active_time as update_time, -- 角色最近更新时间
 | 
	
		
			
				|  |  |                  		g.pay_time as last_recharge_time, -- 角色最近充值时间
 | 
	
		
			
				|  |  |                  		TIMESTAMPDIFF(SECOND, b.create_time, g.pay_time) as reg_pay_time_diff, -- 最近充值距注册时间差(秒)
 | 
	
		
			
				|  |  |                  		i.active_time as last_login_time, -- 玩家最近登陆时间
 | 
	
	
		
			
				|  | @@ -891,11 +907,11 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  			source_system ,
 | 
	
		
			
				|  |  |                  			user_id,
 | 
	
		
			
				|  |  |                  			game_id,
 | 
	
		
			
				|  |  | -                			active_time,
 | 
	
		
			
				|  |  | +                			create_time as active_time,
 | 
	
		
			
				|  |  |                  			role_id ,
 | 
	
		
			
				|  |  | -                			ROW_NUMBER()over(partition by role_id ,user_id, source_system order by active_time desc) as num
 | 
	
		
			
				|  |  | -                		FROM game_dw.dw_active_log
 | 
	
		
			
				|  |  | -                	) i on a.source_system = i.source_system AND a.role_id = i.role_id AND a.user_id = i.user_id AND a.game_id = i.game_id AND i.num = 1
 | 
	
		
			
				|  |  | +                			ROW_NUMBER()over(partition by user_id, source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                		FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                	) i on a.source_system = i.source_system AND a.user_id = i.user_id AND i.num = 1
 | 
	
		
			
				|  |  |                  	LEFT JOIN (
 | 
	
		
			
				|  |  |                  		SELECT
 | 
	
		
			
				|  |  |                  			-- 累计充值金额、累计充值次数
 | 
	
	
		
			
				|  | @@ -908,6 +924,16 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  		WHERE status =2
 | 
	
		
			
				|  |  |                  		GROUP BY role_id , user_id , source_system
 | 
	
		
			
				|  |  |                  	) j on a.source_system = j.source_system AND a.role_id = j.role_id AND a.user_id = j.user_id
 | 
	
		
			
				|  |  | +                	LEFT JOIN (
 | 
	
		
			
				|  |  | +                		SELECT
 | 
	
		
			
				|  |  | +                			source_system ,
 | 
	
		
			
				|  |  | +                			user_id,
 | 
	
		
			
				|  |  | +                			game_id,
 | 
	
		
			
				|  |  | +                			create_time as active_time,
 | 
	
		
			
				|  |  | +                			role_id ,
 | 
	
		
			
				|  |  | +                			ROW_NUMBER()over(partition by role_id ,user_id, source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                		FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                	) k on a.source_system = k.source_system AND a.user_id = k.user_id AND a.role_id = k.role_id AND k.num = 1
 | 
	
		
			
				|  |  |                  ) a
 | 
	
		
			
				|  |  |                  """;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -952,7 +978,7 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  		a.role_vip as role_vip_level, -- 角色vip
 | 
	
		
			
				|  |  |                  		a.os , -- 角色操作系统
 | 
	
		
			
				|  |  |                  		a.create_time as create_time, -- 角色创建时间
 | 
	
		
			
				|  |  | -                		a.update_time, -- 角色最近更新时间
 | 
	
		
			
				|  |  | +                		k.active_time as update_time, -- 角色最近更新时间
 | 
	
		
			
				|  |  |                  		g.pay_time as last_recharge_time, -- 角色最近充值时间
 | 
	
		
			
				|  |  |                  		TIMESTAMPDIFF(SECOND, b.create_time, g.pay_time) as reg_pay_time_diff, -- 最近充值距注册时间差(秒)
 | 
	
		
			
				|  |  |                  		i.active_time as last_login_time, -- 玩家最近登陆时间
 | 
	
	
		
			
				|  | @@ -1006,11 +1032,11 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  			source_system ,
 | 
	
		
			
				|  |  |                  			user_id,
 | 
	
		
			
				|  |  |                  			game_id,
 | 
	
		
			
				|  |  | -                			active_time,
 | 
	
		
			
				|  |  | +                			create_time as active_time,
 | 
	
		
			
				|  |  |                  			role_id ,
 | 
	
		
			
				|  |  | -                			ROW_NUMBER()over(partition by role_id ,user_id, source_system order by active_time desc) as num
 | 
	
		
			
				|  |  | -                		FROM game_dw.dw_active_log
 | 
	
		
			
				|  |  | -                	) i on a.source_system = i.source_system AND a.role_id = i.role_id AND a.user_id = i.user_id AND a.game_id = i.game_id AND i.num = 1
 | 
	
		
			
				|  |  | +                			ROW_NUMBER()over(partition by user_id, source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                		FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                	) i on a.source_system = i.source_system AND a.user_id = i.user_id AND i.num = 1
 | 
	
		
			
				|  |  |                  	LEFT JOIN (
 | 
	
		
			
				|  |  |                  		SELECT
 | 
	
		
			
				|  |  |                  			-- 累计充值金额、累计充值次数
 | 
	
	
		
			
				|  | @@ -1023,6 +1049,16 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  		WHERE status =2
 | 
	
		
			
				|  |  |                  		GROUP BY role_id , user_id , source_system
 | 
	
		
			
				|  |  |                  	) j on a.source_system = j.source_system AND a.role_id = j.role_id AND a.user_id = j.user_id
 | 
	
		
			
				|  |  | +                	LEFT JOIN (
 | 
	
		
			
				|  |  | +                		SELECT
 | 
	
		
			
				|  |  | +                			source_system ,
 | 
	
		
			
				|  |  | +                			user_id,
 | 
	
		
			
				|  |  | +                			game_id,
 | 
	
		
			
				|  |  | +                			create_time as active_time,
 | 
	
		
			
				|  |  | +                			role_id ,
 | 
	
		
			
				|  |  | +                			ROW_NUMBER()over(partition by role_id ,user_id, source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                		FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                	) k on a.source_system = k.source_system AND a.user_id = k.user_id AND a.role_id = k.role_id AND k.num = 1
 | 
	
		
			
				|  |  |                  ) a
 | 
	
		
			
				|  |  |                  """;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -1068,7 +1104,7 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  		a.role_vip as role_vip_level, -- 角色vip
 | 
	
		
			
				|  |  |                  		a.os , -- 角色操作系统
 | 
	
		
			
				|  |  |                  		a.create_time as create_time, -- 角色创建时间
 | 
	
		
			
				|  |  | -                		a.update_time, -- 角色最近更新时间
 | 
	
		
			
				|  |  | +                		k.active_time as update_time, -- 角色最近更新时间
 | 
	
		
			
				|  |  |                  		g.pay_time as last_recharge_time, -- 角色最近充值时间
 | 
	
		
			
				|  |  |                  		TIMESTAMPDIFF(SECOND, b.create_time, g.pay_time) as reg_pay_time_diff, -- 最近充值距注册时间差(秒)
 | 
	
		
			
				|  |  |                  		i.active_time as last_login_time, -- 玩家最近登陆时间
 | 
	
	
		
			
				|  | @@ -1122,11 +1158,11 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  			source_system ,
 | 
	
		
			
				|  |  |                  			user_id,
 | 
	
		
			
				|  |  |                  			game_id,
 | 
	
		
			
				|  |  | -                			active_time,
 | 
	
		
			
				|  |  | +                			create_time as active_time,
 | 
	
		
			
				|  |  |                  			role_id ,
 | 
	
		
			
				|  |  | -                			ROW_NUMBER()over(partition by role_id ,user_id, source_system order by active_time desc) as num
 | 
	
		
			
				|  |  | -                		FROM game_dw.dw_active_log
 | 
	
		
			
				|  |  | -                	) i on a.source_system = i.source_system AND a.role_id = i.role_id AND a.user_id = i.user_id AND a.game_id = i.game_id AND i.num = 1
 | 
	
		
			
				|  |  | +                			ROW_NUMBER()over(partition by user_id, source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                		FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                	) i on a.source_system = i.source_system AND a.user_id = i.user_id AND i.num = 1
 | 
	
		
			
				|  |  |                  	LEFT JOIN (
 | 
	
		
			
				|  |  |                  		SELECT
 | 
	
		
			
				|  |  |                  			-- 累计充值金额、累计充值次数
 | 
	
	
		
			
				|  | @@ -1139,6 +1175,16 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
 | 
	
		
			
				|  |  |                  		WHERE status =2
 | 
	
		
			
				|  |  |                  		GROUP BY role_id , user_id , source_system
 | 
	
		
			
				|  |  |                  	) j on a.source_system = j.source_system AND a.role_id = j.role_id AND a.user_id = j.user_id
 | 
	
		
			
				|  |  | +                	LEFT JOIN (
 | 
	
		
			
				|  |  | +                		SELECT
 | 
	
		
			
				|  |  | +                			source_system ,
 | 
	
		
			
				|  |  | +                			user_id,
 | 
	
		
			
				|  |  | +                			game_id,
 | 
	
		
			
				|  |  | +                			create_time as active_time,
 | 
	
		
			
				|  |  | +                			role_id ,
 | 
	
		
			
				|  |  | +                			ROW_NUMBER()over(partition by role_id ,user_id, source_system order by create_time desc) as num
 | 
	
		
			
				|  |  | +                		FROM dm_game_order.t_user_login_log
 | 
	
		
			
				|  |  | +                	) k on a.source_system = k.source_system AND a.user_id = k.user_id AND a.role_id = k.role_id AND k.num = 1
 | 
	
		
			
				|  |  |                  ) a
 | 
	
		
			
				|  |  |                  """;
 | 
	
		
			
				|  |  |      }
 |