Browse Source

修改内容:角色充值排行榜

lth 1 year ago
parent
commit
9fa3b0eaf6

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

@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -41,7 +40,7 @@ public class RoleManageController {
     @ApiOperation(value = "角色战力排行榜")
     //@PreAuthorize(permissionKey = "roleManage:combat:role")
     @PostMapping("/combatRanking")
-    public ResultVO<Page<List<Map<String, Object>>>> getRoleCombatRanking(@RequestBody RoleCombatRankingDTO dto) {
+    public ResultVO<Page<Map>> getRoleCombatRanking(@RequestBody RoleCombatRankingDTO dto) {
         return ResultVO.ok(roleManageService.getRoleCombatRanking(dto));
     }
 

+ 17 - 89
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/RoleCombatRankingDTO.java

@@ -15,29 +15,23 @@ import java.util.List;
 public class RoleCombatRankingDTO {
 
     /**
-     * 充值开始时间
+     * 开服时间(开始)
      */
-    @ApiModelProperty(value = "充值开始时间")
-    private LocalDate rechargeBeginDate;
+    @ApiModelProperty(value = "开服时间(开始)")
+    private LocalDate beginDate;
 
     /**
-     * 充值结束时间
+     * 开服时间(结束)
      */
-    @ApiModelProperty(value = "充值结束时间")
-    private LocalDate rechargeEndDate;
+    @ApiModelProperty(value = "开服时间(结束)")
+    private LocalDate endDate;
 
     /**
-     * 游戏ID
+     * 游戏ID
      */
-    @ApiModelProperty(value = "游戏ID")
+    @ApiModelProperty(value = "游戏ID")
     private Long gameId;
 
-    /**
-     * 父游戏ID
-     */
-    @ApiModelProperty(value = "父游戏ID")
-    private Long parentGameId;
-
     /**
      * 区服ID(列表)
      */
@@ -45,87 +39,21 @@ public class RoleCombatRankingDTO {
     private List<Long> serverIds;
 
     /**
-     * 角色名
-     */
-    @ApiModelProperty(value = "角色名")
-    private String roleName;
-
-    /**
-     * 角色ID
-     */
-    @ApiModelProperty(value = "角色ID")
-    private String roleId;
-
-    /**
-     * 角色创建时间(开始)
-     */
-    @ApiModelProperty(value = "角色创建时间(开始)")
-    private LocalDate createRoleBeginDate;
-
-    /**
-     * 角色创建时间(结束)
-     */
-    @ApiModelProperty(value = "角色创建时间(结束)")
-    private LocalDate createRoleEndDate;
-
-    /**
-     * 角色VIP等级
-     */
-    @ApiModelProperty(value = "角色VIP等级")
-    private Integer vipLevel;
-
-    /**
-     * 邮件是否发送
-     */
-    @ApiModelProperty(value = "邮件是否发送")
-    private Integer isSendMail;
-
-    /**
-     * 是否转端
-     */
-    @ApiModelProperty(value = "是否转端")
-    private Integer isChange;
-
-    /**
-     * 企业微信号
-     */
-    @ApiModelProperty(value = "企业微信号")
-    private String weChatCompany;
-
-    /**
-     * 客户微信
-     */
-    @ApiModelProperty(value = "客户微信号")
-    private String weChat;
-
-    /**
-     * 客户手机
-     */
-    @ApiModelProperty(value = "客户手机号")
-    private String phone;
-
-    /**
-     * GS
-     */
-    @ApiModelProperty(value = "GS_ID")
-    private Long gsId;
-
-    /**
-     * 客服
+     * 排名的范围
      */
-    @ApiModelProperty(value = "客服ID")
-    private Long customerServerId;
+    @ApiModelProperty(value = "排名的范围")
+    private Long rankingNum;
 
     /**
-     * 投手
+     * 排序字段
      */
-    @ApiModelProperty(value = "投手ID")
-    private Long pitcherId;
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
 
     /**
-     * 运营
+     * 排序方式:升序asc;降序desc
      */
-    @ApiModelProperty(value = "运营ID")
-    private Long operatorId;
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
 
 }

+ 1 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IRoleManageService.java

@@ -4,13 +4,12 @@ import com.zanxiang.game.data.serve.pojo.dto.RoleCombatRankingDTO;
 import com.zanxiang.game.data.serve.pojo.dto.RoleRechargeRankingDTO;
 import com.zanxiang.game.data.serve.utils.Page;
 
-import java.util.List;
 import java.util.Map;
 
 public interface IRoleManageService {
 
     Page<Map> getRoleRechargeRanking(RoleRechargeRankingDTO dto);
 
-    Page<List<Map<String, Object>>> getRoleCombatRanking(RoleCombatRankingDTO dto);
+    Page<Map> getRoleCombatRanking(RoleCombatRankingDTO dto);
 
 }

+ 399 - 16
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -1,5 +1,7 @@
 package com.zanxiang.game.data.serve.service.impl;
 
+import com.zanxiang.erp.base.ErpServer;
+import com.zanxiang.erp.base.rpc.ISysUserRpc;
 import com.zanxiang.game.data.serve.pojo.dto.RoleCombatRankingDTO;
 import com.zanxiang.game.data.serve.pojo.dto.RoleRechargeRankingDTO;
 import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
@@ -7,6 +9,7 @@ import com.zanxiang.game.data.serve.service.IRoleManageService;
 import com.zanxiang.game.data.serve.utils.Page;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
 import org.nutz.dao.Sqls;
@@ -18,6 +21,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author tianhua
@@ -31,6 +35,9 @@ public class RoleManageServiceImpl implements IRoleManageService {
     @Autowired
     private Dao dao;
 
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+
     /**
      * 角色充值排行榜
      * @param dto RoleRechargeRankingDTO
@@ -86,11 +93,6 @@ public class RoleManageServiceImpl implements IRoleManageService {
         if (dto.getCustomerServerId() != null) {
             criA.where().andEquals("customer_server_id", dto.getCustomerServerId());
         }
-
-        //查询总记录数
-        Sql countSql = Sqls.create("""
-                """ + criA);
-
         //给充值时间查询条件
         Criteria criTodayAmount = Cnd.cri();
         //查询充值成功的
@@ -99,6 +101,13 @@ public class RoleManageServiceImpl implements IRoleManageService {
             //充值时间限制
             criTodayAmount.where().andBetween("DATE(pay_time)", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
         }
+        //分页对象
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        //查询总记录数
+        Sql countSql = Sqls.create(getCountNumSql(criA, criTodayAmount));
+        countSql.setCallback(Sqls.callback.integer());
+        dao.execute(countSql);
+        pager.setRecordCount(countSql.getInt());
         //主表添加排序条件
         if (StringUtils.isBlank(dto.getSortType())) {
             dto.setSortType(OrderByEnum.DESC.getOrderType());
@@ -108,14 +117,12 @@ public class RoleManageServiceImpl implements IRoleManageService {
         } else {
             criA.getOrderBy().orderBy(dto.getSortFiled(), dto.getSortType());
         }
-        //分页对象
-        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
         //创建sql
         Sql sql = Sqls.create(getRoleRechargeRankingSql(criA, criTodayAmount));
         sql.setCallback(Sqls.callback.maps());
         sql.setPager(pager);
         dao.execute(sql);
-        List<Map> list = sql.getList(Map.class);
+        List<Map> list = sql.getList(Map.class).stream().map(map -> getNameById(map)).collect(Collectors.toList());
 
         //返回结果
         return new Page<>(list, pager);
@@ -127,10 +134,40 @@ public class RoleManageServiceImpl implements IRoleManageService {
      * @return Page<List<Map<String, Object>>>
      */
     @Override
-    public Page<List<Map<String, Object>>> getRoleCombatRanking(RoleCombatRankingDTO dto) {
+    public Page<Map> getRoleCombatRanking(RoleCombatRankingDTO dto) {
         return null;
     }
 
+    /**
+     * 通过id获取 GS、运营、客服人员、投手名字
+     * @param dataMap dataMap
+     * @return String
+     */
+    private Map<String, Object> getNameById(Map<String, Object> dataMap){
+        //投手名
+        if (dataMap.get("put_user_id") != null) {
+            dataMap.put("put_user_name",
+                    sysUserRpc.getById(Long.valueOf((String) dataMap.get("put_user_id"))).getData().getNickname());
+        }
+        //运营人员名
+        if (dataMap.get("oper_user_id") != null) {
+            dataMap.put("oper_user_name",
+                    sysUserRpc.getById(Long.valueOf((String) dataMap.get("oper_user_id"))).getData().getNickname());
+        }
+        //GS人员名
+        if (dataMap.get("gs_id") != null) {
+            dataMap.put("gs_name",
+                    sysUserRpc.getById(Long.valueOf((String) dataMap.get("gs_id"))).getData().getNickname());
+        }
+        //客服人员名
+        if (dataMap.get("customer_service_id") != null) {
+            dataMap.put("customer_service_name",
+                    sysUserRpc.getById(Long.valueOf((String) dataMap.get("customer_service_id"))).getData().getNickname());
+        }
+
+        return dataMap;
+    }
+
     /**
      * 查询角色充值排行榜sql
      * @param criA 主表查询条件
@@ -188,12 +225,31 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 	    i.user_reg_game_name as user_reg_game_name, -- 玩家注册游戏名
                 	    i.agent_id as agent_id, -- 玩家注册渠道id
                 	    IF(i.agent_id = 0 , '自然量', i.agent_name) as agent_name, -- 玩家注册渠道名
+                	    i.put_user_id as put_user_id, -- 投手id
                 	    i.user_active_time as user_active_time, -- 玩家最近活跃时间
                 	    i.user_last_recharge_game_id as user_last_recharge_game_id, -- 玩家最近充值游戏id
                 	    i.user_last_recharge_game_name as user_last_recharge_game_name, -- 玩家最近充值游戏名
                 		i.user_pay_time as user_pay_time, -- 玩家最近充值时间
                 		TIMESTAMPDIFF(SECOND, i.user_create_time, i.user_pay_time) as user_reg_pay_time, -- 玩家注册充值时间差(秒)
-                		TIMESTAMPDIFF(SECOND, i.user_pay_time, NOW()) as user_pay_until_now -- 玩家最近充值距今(秒)
+                		TIMESTAMPDIFF(SECOND, i.user_pay_time, NOW()) as user_pay_until_now, -- 玩家最近充值距今(秒)
+                		j.is_send_mail 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-否
+                		j.add_corp_user_id as add_corp_user_id, -- 企微号
+                		j.user_wechat as user_wechat, -- 客户微信号
+                		j.user_phone as user_phone, -- 客户手机号
+                		j.is_remove_game as is_remove_game, -- 是否退游 1-是;0-否
+                		j.is_wake_up as is_wake_up, -- 是否唤醒 1-是;0-否
+                		j.remark as remark, -- 备注
+                		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.create_time as create_time, -- 创建时间
+                		j.create_by as create_by, -- 创建者
+                		j.update_time as update_time, -- 更新时间
+                		j.update_by as update_by, -- 更新者
+                		j.is_delete as is_delete -- 是否删除 1-删除;0-正常
                 	FROM
                 	(
                 		SELECT
@@ -298,7 +354,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 	) p on a.source_system = p.source_system AND a.role_id = p.role_id
                 	LEFT JOIN (
                 		SELECT
-                		    -- 角色所在区服名
+                			-- 区服名
                 			source_system ,
                 			game_id,
                 			server_id,
@@ -321,6 +377,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 	        k.game_name as user_reg_game_name,
                 	        i.agent_id as agent_id,
                 	        IF(i.agent_id = 0 , '自然量', j.agent_name) as agent_name,
+                	        j.pitcher_id as put_user_id,
                 	        l.active_time as user_active_time,
                 	        m.user_last_recharge_game_id as user_last_recharge_game_id,
                 	        n.game_name as user_last_recharge_game_name, --
@@ -351,7 +408,8 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 				-- 渠道名称
                 				source_system,
                 				id,
-                				agent_name
+                				agent_name,
+                				pitcher_id
                 			FROM dm_game_order.t_pitcher_agent
                 		) j ON i.agent_id = j.id AND i.source_system  = j.source_system
                 		LEFT JOIN (
@@ -405,15 +463,340 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 			FROM dm_game_order.t_game
                 		) n ON m.user_last_recharge_game_id = n.id AND m.source_system = n.source_system
                 	) i on a.source_system = i.source_system AND a.association_user_id = i.association_user_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-否
+                            add_corp_user_id, -- 企微号
+                            user_wechat, -- 客户微信号
+                            user_phone, -- 客户手机号
+                            is_remove_game, -- 是否退游 1-是;0-否
+                            is_wake_up, -- 是否唤醒 1-是;0-否
+                            remark, -- 备注
+                            gs_id, -- GS_ID
+                            customer_service_id, -- 客服ID
+                            oper_user_id, -- 运营ID
+                            create_time, -- 创建时间
+                            create_by, -- 创建者
+                            update_time, -- 更新时间
+                            update_by, -- 更新者
+                            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
                 ) a
                 """ + criA;
     }
 
-
-    private String getCountNumSql(Criteria criA) {
+    /**
+     * 查询记录数
+     * @param criA 主表条件
+     * @param criTodayAmount 今日充值条件
+     * @return String
+     */
+    private String getCountNumSql(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
+                		a.role_name as role_name, -- 角色名
+                		a.create_time as role_create_time, -- 角色创建时间
+                		a.os as os, -- 角色操作系统
+                		b.role_level as role_level, -- 角色等级
+                		b.combat_num as combat_num, -- 角色攻击力
+                		IFNULL(c.amount, 0) as amount, -- 角色累计充值金额
+                		IFNULL(c.amount_count, 0) as amount_count, -- 角色累计充值次数
+                		ROUND(IF(c.amount_count > 0, c.amount / c.amount_count, 0), 2) as avg_amount, -- 平均单价
+                		(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
+                		d.game_name as role_reg_game_name, -- 角色注册游戏名
+                		d.classify as role_reg_game_classify, -- 角色注册游戏类型
+                		IFNULL(d.parent_id, a.game_id) as role_reg_parent_game_id, -- 角色注册游戏的父游戏id
+                		IFNULL(e.parent_game_name, d.game_name) as role_reg_parent_game_name, -- 角色注册游戏的父游戏名
+                		a.server_id as server_id, -- 角色所在区服id
+                		q.server_name as server_name, -- 角色所在区服名
+                		IFNULL(f.real_amount, 0) as role_last_amount, -- 角色最近充值金额
+                		f.pay_time as role_last_pay_time, -- 角色最近充值时间
+                		g.active_time as role_active_time, -- 角色最近活跃时间
+                		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
+                	    i.username as username, -- 玩家名称
+                	    i.nickname as nickname, -- 玩家昵称
+                	    i.reg_mobile as reg_mobile, -- 玩家注册手机
+                	    i.reg_email as reg_email, -- 玩家注册邮箱
+                	    i.user_create_time as user_create_time, -- 玩家注册时间
+                	    i.user_reg_game_id as user_reg_game_id, -- 玩家注册游戏id
+                	    i.user_reg_game_name as user_reg_game_name, -- 玩家注册游戏名
+                	    i.agent_id as agent_id, -- 玩家注册渠道id
+                	    IF(i.agent_id = 0 , '自然量', i.agent_name) as agent_name, -- 玩家注册渠道名
+                	    i.user_active_time as user_active_time, -- 玩家最近活跃时间
+                	    i.user_last_recharge_game_id as user_last_recharge_game_id, -- 玩家最近充值游戏id
+                	    i.user_last_recharge_game_name as user_last_recharge_game_name, -- 玩家最近充值游戏名
+                		i.user_pay_time as user_pay_time, -- 玩家最近充值时间
+                		TIMESTAMPDIFF(SECOND, i.user_create_time, i.user_pay_time) as user_reg_pay_time, -- 玩家注册充值时间差(秒)
+                		TIMESTAMPDIFF(SECOND, i.user_pay_time, NOW()) as user_pay_until_now, -- 玩家最近充值距今(秒)
+                		j.is_send_mail 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-否
+                		j.add_corp_user_id as add_corp_user_id, -- 企微号
+                		j.user_wechat as user_wechat, -- 客户微信号
+                		j.user_phone as user_phone, -- 客户手机号
+                		j.is_remove_game as is_remove_game, -- 是否退游 1-是;0-否
+                		j.is_wake_up as is_wake_up, -- 是否唤醒 1-是;0-否
+                		j.remark as remark, -- 备注
+                		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.put_user_id as put_user_id, -- 投手ID
+                		j.create_time as create_time, -- 创建时间
+                		j.create_by as create_by, -- 创建者
+                		j.update_time as update_time, -- 更新时间
+                		j.update_by as update_by, -- 更新者
+                		j.is_delete as is_delete -- 是否删除 1-删除;0-正常
+                	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,
+                				a.os,
+                				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_level,
+                			combat_num,
+                			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 ,
+                	    	COUNT(user_id) as amount_count
+                		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
+                			source_system,
+                			id,
+                			game_name,
+                			classify,
+                			parent_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,
+                			ROW_NUMBER()over(partition by role_id , source_system order by active_time desc) as num
+                		FROM dm_game_order.t_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 ,
+                			game_id,
+                			server_id,
+                			server_name
+                		FROM dm_game_order.t_game_server
+                	) q on a.source_system = q.source_system AND a.game_id = q.game_id AND a.server_id = q.server_id
+                	LEFT JOIN (
+                		-- 玩家信息
+                		-- 玩家ID、玩家账号、玩家昵称、注册电话、注册邮箱、注册时间、注册游戏、注册渠道
+                		SELECT
+                			i.source_system as source_system,
+                	        i.association_user_id as association_user_id, -- 来源用户id
+                	        i.id as id, -- 玩家id
+                	        i.username as username,
+                	        i.nickname as nickname,
+                	        i.reg_mobile as reg_mobile,
+                	        i.reg_email as reg_email,
+                	        i.user_create_time as user_create_time,
+                	        i.user_reg_game_id as user_reg_game_id,
+                	        k.game_name as user_reg_game_name,
+                	        i.agent_id as agent_id,
+                	        IF(i.agent_id = 0 , '自然量', j.agent_name) as agent_name,
+                	        l.active_time as user_active_time,
+                	        m.user_last_recharge_game_id as user_last_recharge_game_id,
+                	        n.game_name as user_last_recharge_game_name, --
+                			m.pay_time as user_pay_time -- 玩家最近充值时间
+                		FROM
+                		(
+                			SELECT
+                				*
+                			FROM
+                			(
+                				SELECT
+                					source_system,
+                					association_user_id, -- 来源用户id
+                					id , -- 玩家id
+                					username ,
+                					nickname ,
+                					reg_mobile ,
+                					reg_email ,
+                					create_time as user_create_time,
+                					game_id as user_reg_game_id,
+                					agent_id ,
+                					ROW_NUMBER()over(partition by association_user_id, source_system order by create_time desc, id asc) as num
+                				FROM dm_game_order.t_game_user
+                			) z WHERE z.num = 1
+                		) i
+                		LEFT JOIN (
+                			SELECT
+                				-- 渠道名称
+                				source_system,
+                				id,
+                				agent_name
+                			FROM dm_game_order.t_pitcher_agent
+                		) j ON i.agent_id = j.id AND i.source_system  = j.source_system
+                		LEFT JOIN (
+                			SELECT
+                				-- 玩家注册游戏名
+                				source_system,
+                				id,
+                				game_name
+                			FROM dm_game_order.t_game
+                		) k ON i.user_reg_game_id = k.id AND i.source_system = k.source_system
+                		LEFT JOIN (
+                			-- 玩家最近活跃时间
+                			SELECT
+                				association_user_id,
+                				b.source_system,
+                				b.active_time,
+                				ROW_NUMBER()over(partition by association_user_id, b.source_system order by active_time desc) as num
+                			FROM dm_game_order.t_game_user a
+                			RIGHT JOIN (
+                				SELECT
+                					source_system,
+                					user_id,
+                					active_time
+                				FROM dm_game_order.t_active_log
+                			) b ON a.source_system = b.source_system AND a.id = b.user_id
+                		) l ON i.association_user_id = l.association_user_id AND i.source_system = l.source_system AND l.num = 1
+                		LEFT JOIN (
+                			-- 玩家最近充值游戏、玩家最近充值时间
+                			SELECT
+                				association_user_id,
+                				b.*,
+                				ROW_NUMBER()over(partition by association_user_id, b.source_system order by pay_time desc) as num
+                			FROM dm_game_order.t_game_user a
+                			RIGHT JOIN (
+                				-- 玩家最近充值游戏id、最近充值时间
+                				SELECT
+                					source_system,
+                					user_id,
+                					game_id as user_last_recharge_game_id,
+                					pay_time
+                				FROM dm_game_order.t_game_order
+                				WHERE status = 2
+                			) b on a.id = b.user_id AND a.source_system = b.source_system
+                		) m on i.association_user_id = m.association_user_id AND i.source_system = m.source_system AND m.num = 1
+                		LEFT JOIN (
+                			SELECT
+                				-- 玩家最近充值游戏名
+                				source_system,
+                				id,
+                				game_name
+                			FROM dm_game_order.t_game
+                		) n ON m.user_last_recharge_game_id = n.id AND m.source_system = n.source_system
+                	) i on a.source_system = i.source_system AND a.association_user_id = i.association_user_id
+                	LEFT JOIN (
+                		SELECT
+                			*
+                		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
+                ) a
+                """ + criA;
     }
 
 }