Jelajahi Sumber

Merge branch 'package' of GameCenter/game-center into dev

zhimo 1 tahun lalu
induk
melakukan
103d05367a
14 mengubah file dengan 856 tambahan dan 142 penghapusan
  1. 9 7
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsOrderDetailController.java
  2. 14 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsPromotionDayController.java
  3. 172 48
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/AdsOrderDetailListDTO.java
  4. 193 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/AdsOrderDetailTotalDTO.java
  5. 23 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/AdsOrderDetailTotalVO.java
  6. 4 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IAdsOrderDetailService.java
  7. 161 45
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailService.java
  8. 0 33
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java
  9. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  10. 9 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/UserController.java
  11. 184 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameUserRoleExcelVO.java
  12. 9 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserRoleService.java
  13. 70 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserRoleServiceImpl.java
  14. 7 8
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/OrderServiceImpl.java

+ 9 - 7
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsOrderDetailController.java

@@ -2,6 +2,8 @@ package com.zanxiang.game.data.serve.controller;
 
 import com.zanxiang.erp.security.annotation.PreAuthorize;
 import com.zanxiang.game.data.serve.pojo.dto.AdsOrderDetailListDTO;
+import com.zanxiang.game.data.serve.pojo.dto.AdsOrderDetailTotalDTO;
+import com.zanxiang.game.data.serve.pojo.vo.AdsOrderDetailTotalVO;
 import com.zanxiang.game.data.serve.pojo.vo.AdsOrderDetailVO;
 import com.zanxiang.game.data.serve.service.IAdsOrderDetailService;
 import com.zanxiang.game.data.serve.utils.Page;
@@ -11,7 +13,6 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -33,12 +34,13 @@ public class AdsOrderDetailController {
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = AdsOrderDetailVO.class)})
     @PostMapping("/list")
     public ResultVO<Page<AdsOrderDetailVO>> orderList(@Validated @RequestBody AdsOrderDetailListDTO dto) {
-        if (StringUtils.isBlank(dto.getSortFiled())) {
-            dto.setSortFiled("order_create_time");
-        }
-        if (StringUtils.isBlank(dto.getSortType())) {
-            dto.setSortType("desc");
-        }
         return ResultVO.ok(gameOrderService.listOfPage(dto));
     }
+
+    @PreAuthorize(permissionKey = "gameData:order:listTotal")
+    @ApiOperation(value = "订单详情列表总计")
+    @PostMapping("/list/total")
+    public ResultVO<AdsOrderDetailTotalVO> orderTotal(@Validated @RequestBody AdsOrderDetailTotalDTO dto) {
+        return ResultVO.ok(gameOrderService.orderTotal(dto));
+    }
 }

+ 14 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsPromotionDayController.java

@@ -56,6 +56,13 @@ public class AdsPromotionDayController {
         return ResultVO.ok(adsPromotionDayService.getPromotionDayListData(dto));
     }
 
+    @ApiOperation(value = "广告监控每日数据总计")
+    @PreAuthorize(permissionKey = "promotionData:adsPromotionDay:dayListTotal")
+    @PostMapping("/day/listTotal")
+    public ResultVO<PromotionDayTotalVO> getPromotionDayListTotalData(@RequestBody PromotionDayTotalDTO dto) {
+        return ResultVO.ok(adsPromotionDayService.getPromotionDayTotalData(dto));
+    }
+
     @ApiOperation(value = "腾讯广告监控数据")
     @PreAuthorize(permissionKey = "promotionData:adsAdGroupDay:day")
     @PostMapping("/tencent/day")
@@ -77,4 +84,11 @@ public class AdsPromotionDayController {
         return ResultVO.ok(adsPromotionDayService.getTencentPromotionDayListData(dto));
     }
 
+    @ApiOperation(value = "腾讯广告监控每日数据总计")
+    @PreAuthorize(permissionKey = "promotionData:adsAdGroupDay:dayListTotal")
+    @PostMapping("/tencent/day/listTotal")
+    public ResultVO<TencentPromotionDayTotalVO> getTencentPromotionDayListTotalData(@RequestBody TencentPromotionDayTotalDTO dto) {
+        return ResultVO.ok(adsPromotionDayService.getTencentPromotionDayTotalData(dto));
+    }
+
 }

+ 172 - 48
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/AdsOrderDetailListDTO.java

@@ -1,81 +1,205 @@
 package com.zanxiang.game.data.serve.pojo.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.zanxiang.game.data.serve.pojo.base.BasePage;
-import com.zanxiang.game.data.serve.pojo.entity.AdsOrderDetail;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
-import java.time.LocalDateTime;
+import java.time.LocalDate;
 
 @Data
 public class AdsOrderDetailListDTO extends BasePage {
 
-    @ApiModelProperty(notes = "订单创建时间")
-    private LocalDateTime beginOrderTime;
-
-    @ApiModelProperty(notes = "订单创建时间")
-    private LocalDateTime endOrderTime;
-
-    @ApiModelProperty(notes = "数据来源")
-    private String sourceSystem;
-
-    @ApiModelProperty(notes = "订单号")
+    /**
+     * 订单ID
+     */
+    @ApiModelProperty(notes = "订单ID:订单号")
     private String orderId;
 
-    @ApiModelProperty(notes = "CP订单号")
+    /**
+     * cp订单号
+     */
+    @ApiModelProperty(notes = "cp订单号")
     private String cpOrderId;
 
-    @ApiModelProperty(notes = "商户订单号")
+    /**
+     * 第三方支付订单号
+     */
+    @ApiModelProperty(notes = "第三方支付订单号")
     private String merchantOrderNo;
 
-    @ApiModelProperty(notes = "投手 id")
-    private String zxPitcherId;
-
-    @ApiModelProperty(notes = "玩家ID")
-    private String gameUserId;
+    /**
+     * 玩家id
+     */
+    @ApiModelProperty(notes = "玩家id")
+    private String userId;
 
+    /**
+     * 玩家账号
+     */
     @ApiModelProperty(notes = "玩家账号")
     private String username;
 
-    @ApiModelProperty(notes = "父游戏ID")
-    private String parentId;
+    /**
+     * 所在服务器名称
+     */
+    @ApiModelProperty(notes = "所在服务器名称")
+    private String serverName;
+
+    /**
+     * 游戏角色
+     */
+    @ApiModelProperty(notes = "游戏角色")
+    private String roleName;
 
-    @ApiModelProperty(notes = "充值游戏ID")
-    private String orderGameId;
+    /**
+     * cpId cp名称
+     */
+    @ApiModelProperty(notes = "cpId --> cp名称")
+    private String cpName;
 
-    @ApiModelProperty(notes = "用户游戏ID")
+    /**
+     * 充值游戏id
+     */
+    @ApiModelProperty(notes = "充值游戏id")
     private String gameId;
 
-    @ApiModelProperty(notes = "广告账号")
+    /**
+     * 注册渠道对应的id --> agentId
+     */
+    @ApiModelProperty(notes = "注册渠道对应的id")
+    private String channelId;
+
+    /**
+     * 归因推广账号
+     */
+    @ApiModelProperty(notes = "归因推广账号")
     private String accountId;
 
-    @ApiModelProperty(notes = "归属渠道ID")
-    private String agentId;
+    /**
+     * 归因投放人员
+     */
+    @ApiModelProperty(notes = "归因投放人员")
+    private String pitcherId;
 
+    /**
+     * 操作系统os
+     */
     @ApiModelProperty(notes = "操作系统")
-    private String os;
-
-    @ApiModelProperty(notes = "支付状态,1为待处理,2为成功,3为失败")
-    private String orderStatus;
-
-    @ApiModelProperty(notes = "支付方式")
-    private String payway;
-
-    @ApiModelProperty(notes = "角色ID")
-    private String roleId;
-
-    @ApiModelProperty(notes = "角色名称")
-    private String roleName;
-
-    @ApiModelProperty(notes = "用户注册时间")
-    private LocalDateTime beginRegTime;
-
-    @ApiModelProperty(notes = "用户注册时间")
-    private LocalDateTime endRegTime;
+    private String deviceSystem;
+
+    /**
+     * 产品名称(游戏商品名称)
+     */
+    @ApiModelProperty(notes = "产品名称")
+    private String productName;
+
+    /**
+     * 支付方式
+     */
+    @ApiModelProperty(notes = "支付方式名称:wxpaymap;mpay;wxpay...")
+    private String payWay;
+
+    /**
+     * 收款商户号
+     */
+    @ApiModelProperty(notes = "收款商户号")
+    private String merchantNo;
+
+    /**
+     * 支付状态
+     */
+    @ApiModelProperty(notes = "支付状态,1待支付,2 支付成功,-1 已取消")
+    private String status;
+
+    /**
+     * CP通知状态
+     */
+    @ApiModelProperty(notes = "CP通知状态,1为待处理,2为成功,-1为失败")
+    private String cpStatus;
+
+    /**
+     * 是否首充
+     */
+    @ApiModelProperty(notes = "是否首充 0 否 1 是")
+    private String isFirstRecharge;
+
+    /**
+     * 下单时间-开始
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "下单时间-开始")
+    private LocalDate beginDate;
+
+    /**
+     * 下单时间-结束
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "下单时间-结束")
+    private LocalDate endDate;
+
+    /**
+     * 玩家注册时间-开始
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "玩家注册时间-开始")
+    private LocalDate regTimeStart;
+
+    /**
+     * 玩家注册时间-结束
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "玩家注册时间-结束")
+    private LocalDate regTimeEnd;
+
+    /**
+     * 支付时间-开始
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "支付时间-开始")
+    private LocalDate payTimeStart;
+
+    /**
+     * 支付时间-结束
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "支付时间-结束")
+    private LocalDate payTimeEnd;
+
+    /**
+     * 充值到支付的间隔时间(最小分)
+     */
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMin;
+
+    /**
+     * 充值到支付的间隔时间(最大分)
+     */
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMax;
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty("SDK来源")
+    private String sourceSystem;
 
-    @ApiModelProperty(notes = "排序字段")
+    /**
+     * 排序字段
+     */
+    @ApiModelProperty("排序字段")
     private String sortFiled;
 
-    @ApiModelProperty(notes = "排序 ASC/DESC")
+    /**
+     * 排序方式
+     */
+    @ApiModelProperty("排序方式")
     private String sortType;
 }

+ 193 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/AdsOrderDetailTotalDTO.java

@@ -0,0 +1,193 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+@Data
+public class AdsOrderDetailTotalDTO {
+
+    /**
+     * 订单ID
+     */
+    @ApiModelProperty(notes = "订单ID:订单号")
+    private String orderId;
+
+    /**
+     * cp订单号
+     */
+    @ApiModelProperty(notes = "cp订单号")
+    private String cpOrderId;
+
+    /**
+     * 第三方支付订单号
+     */
+    @ApiModelProperty(notes = "第三方支付订单号")
+    private String merchantOrderNo;
+
+    /**
+     * 玩家id
+     */
+    @ApiModelProperty(notes = "玩家id")
+    private String userId;
+
+    /**
+     * 玩家账号
+     */
+    @ApiModelProperty(notes = "玩家账号")
+    private String username;
+
+    /**
+     * 所在服务器名称
+     */
+    @ApiModelProperty(notes = "所在服务器名称")
+    private String serverName;
+
+    /**
+     * 游戏角色
+     */
+    @ApiModelProperty(notes = "游戏角色")
+    private String roleName;
+
+    /**
+     * cpId cp名称
+     */
+    @ApiModelProperty(notes = "cpId --> cp名称")
+    private String cpName;
+
+    /**
+     * 充值游戏id
+     */
+    @ApiModelProperty(notes = "充值游戏id")
+    private String gameId;
+
+    /**
+     * 注册渠道对应的id --> agentId
+     */
+    @ApiModelProperty(notes = "注册渠道对应的id")
+    private String channelId;
+
+    /**
+     * 归因推广账号
+     */
+    @ApiModelProperty(notes = "归因推广账号")
+    private String accountId;
+
+    /**
+     * 归因投放人员
+     */
+    @ApiModelProperty(notes = "归因投放人员")
+    private String pitcherId;
+
+    /**
+     * 操作系统os
+     */
+    @ApiModelProperty(notes = "操作系统")
+    private String deviceSystem;
+
+    /**
+     * 产品名称(游戏商品名称)
+     */
+    @ApiModelProperty(notes = "产品名称")
+    private String productName;
+
+    /**
+     * 支付方式
+     */
+    @ApiModelProperty(notes = "支付方式名称:wxpaymap;mpay;wxpay...")
+    private String payWay;
+
+    /**
+     * 收款商户号
+     */
+    @ApiModelProperty(notes = "收款商户号")
+    private String merchantNo;
+
+    /**
+     * 支付状态
+     */
+    @ApiModelProperty(notes = "支付状态,1待支付,2 支付成功,-1 已取消")
+    private String status;
+
+    /**
+     * CP通知状态
+     */
+    @ApiModelProperty(notes = "CP通知状态,1为待处理,2为成功,-1为失败")
+    private String cpStatus;
+
+    /**
+     * 是否首充
+     */
+    @ApiModelProperty(notes = "是否首充 0 否 1 是")
+    private String isFirstRecharge;
+
+    /**
+     * 下单时间-开始
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "下单时间-开始")
+    private LocalDate beginDate;
+
+    /**
+     * 下单时间-结束
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "下单时间-结束")
+    private LocalDate endDate;
+
+    /**
+     * 玩家注册时间-开始
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "玩家注册时间-开始")
+    private LocalDate regTimeStart;
+
+    /**
+     * 玩家注册时间-结束
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "玩家注册时间-结束")
+    private LocalDate regTimeEnd;
+
+    /**
+     * 支付时间-开始
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "支付时间-开始")
+    private LocalDate payTimeStart;
+
+    /**
+     * 支付时间-结束
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(notes = "支付时间-结束")
+    private LocalDate payTimeEnd;
+
+    /**
+     * 充值到支付的间隔时间(最小分)
+     */
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMin;
+
+    /**
+     * 充值到支付的间隔时间(最大分)
+     */
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMax;
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty("SDK来源")
+    private String sourceSystem;
+
+}

+ 23 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/AdsOrderDetailTotalVO.java

@@ -0,0 +1,23 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class AdsOrderDetailTotalVO {
+
+    /**
+     * 订单金额
+     */
+    @ApiModelProperty(notes = "订单金额")
+    private BigDecimal amount;
+
+    /**
+     * 订单实付金额
+     */
+    @ApiModelProperty(notes = "订单实付金额")
+    private BigDecimal realAmount;
+
+}

+ 4 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IAdsOrderDetailService.java

@@ -1,10 +1,14 @@
 package com.zanxiang.game.data.serve.service;
 
 import com.zanxiang.game.data.serve.pojo.dto.AdsOrderDetailListDTO;
+import com.zanxiang.game.data.serve.pojo.dto.AdsOrderDetailTotalDTO;
+import com.zanxiang.game.data.serve.pojo.vo.AdsOrderDetailTotalVO;
 import com.zanxiang.game.data.serve.pojo.vo.AdsOrderDetailVO;
 import com.zanxiang.game.data.serve.utils.Page;
 
 public interface IAdsOrderDetailService {
 
     Page<AdsOrderDetailVO> listOfPage(AdsOrderDetailListDTO dto);
+
+    AdsOrderDetailTotalVO orderTotal(AdsOrderDetailTotalDTO dto);
 }

+ 161 - 45
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailService.java

@@ -2,7 +2,10 @@ package com.zanxiang.game.data.serve.service.impl;
 
 import com.zanxiang.erp.security.util.SecurityUtil;
 import com.zanxiang.game.data.serve.pojo.dto.AdsOrderDetailListDTO;
+import com.zanxiang.game.data.serve.pojo.dto.AdsOrderDetailTotalDTO;
 import com.zanxiang.game.data.serve.pojo.entity.AdsOrderDetail;
+import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
+import com.zanxiang.game.data.serve.pojo.vo.AdsOrderDetailTotalVO;
 import com.zanxiang.game.data.serve.pojo.vo.AdsOrderDetailVO;
 import com.zanxiang.game.data.serve.service.IAdsOrderDetailService;
 import com.zanxiang.game.data.serve.utils.Page;
@@ -11,8 +14,10 @@ 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.pager.Pager;
-import org.nutz.dao.util.cri.Exps;
+import org.nutz.dao.sql.Criteria;
+import org.nutz.dao.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -28,79 +33,190 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
 
     @Override
     public Page<AdsOrderDetailVO> listOfPage(AdsOrderDetailListDTO dto) {
-        if (StringUtils.isBlank(dto.getZxPitcherId()) && !SecurityUtil.isManager()) {
+        if (StringUtils.isBlank(dto.getPitcherId()) && !SecurityUtil.isManager()) {
             // 只有管理员才能查看全部数据
-            dto.setZxPitcherId(SecurityUtil.getUserId().toString());
+            dto.setPitcherId(SecurityUtil.getUserId().toString());
         }
         Pager pager = dto.toPage();
-        Cnd cnd = Cnd.where("1", "=", "1");
-        if (dto.getBeginOrderTime() != null) {
-            cnd.and(AdsOrderDetail::getOrderCreateTime, ">=", dto.getBeginOrderTime());
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (StringUtils.isNotBlank(dto.getOrderId())) {
+            cri.where().andEquals("order_id", dto.getOrderId());
+        }
+        if (StringUtils.isNotBlank(dto.getCpOrderId())) {
+            cri.where().andEquals("cp_order_id", dto.getCpOrderId());
+        }
+        if (StringUtils.isNotBlank(dto.getMerchantOrderNo())) {
+            cri.where().andEquals("merchant_order_no", dto.getMerchantOrderNo());
+        }
+        if (StringUtils.isNotBlank(dto.getUserId())) {
+            cri.where().andEquals("game_user_id", dto.getUserId());
+        }
+        if (StringUtils.isNotBlank(dto.getUsername())) {
+            cri.where().andEquals("username", dto.getUsername());
+        }
+        if (StringUtils.isNotBlank(dto.getServerName())) {
+            cri.where().andEquals("server_name", dto.getServerName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameId())) {
+            cri.where().andEquals("order_game_id", dto.getGameId());
+        }
+        if (StringUtils.isNotBlank(dto.getChannelId())) {
+            cri.where().andEquals("agent_id", dto.getChannelId());
+        }
+        if (StringUtils.isNotBlank(dto.getAccountId())) {
+            cri.where().andEquals("account_id", dto.getAccountId());
+        }
+        if (StringUtils.isNotBlank(dto.getPitcherId())) {
+            cri.where().andEquals("zx_pitcher_id", dto.getPitcherId());
+        }
+        if (StringUtils.isNotBlank(dto.getDeviceSystem())) {
+            cri.where().andEquals("os", dto.getDeviceSystem());
+        }
+        if (StringUtils.isNotBlank(dto.getProductName())) {
+            cri.where().andEquals("product_name", dto.getProductName());
+        }
+        if (StringUtils.isNotBlank(dto.getPayWay())) {
+            cri.where().andEquals("payway", dto.getPayWay());
+        }
+        if (StringUtils.isNotBlank(dto.getMerchantNo())) {
+            cri.where().andEquals("pay_account_id", dto.getMerchantNo());
+        }
+        if (StringUtils.isNotBlank(dto.getStatus())) {
+            cri.where().andEquals("order_status", dto.getStatus());
+        }
+        if (StringUtils.isNotBlank(dto.getCpStatus())) {
+            cri.where().andEquals("cp_status", dto.getCpStatus());
         }
-        if (dto.getEndOrderTime() != null) {
-            cnd.and(AdsOrderDetail::getOrderCreateTime, "<=", dto.getEndOrderTime());
+        if (StringUtils.isNotBlank(dto.getIsFirstRecharge())) {
+            cri.where().andEquals("is_first_recharge", dto.getIsFirstRecharge());
         }
+        if (dto.getBeginDate() != null && dto.getEndDate() != null) {
+            //下单时间,订单创建时间
+            cri.where().andBetween("day", dto.getBeginDate(), dto.getEndDate());
+        }
+        if (dto.getRegTimeStart() != null && dto.getRegTimeEnd() != null) {
+            //玩家注册时间
+            cri.where().andBetween("reg_time", dto.getRegTimeStart(), dto.getRegTimeEnd());
+        }
+        if (dto.getPayTimeStart() != null && dto.getPayTimeEnd() != null) {
+            //支付时间,订单充值时间
+            cri.where().andBetween("pay_time", dto.getPayTimeStart(), dto.getPayTimeEnd());
+        }
+        if (dto.getRegPayIntervalTimeMin() != null) {
+            cri.where().andGTE("TIMESTAMPDIFF(MINUTE, reg_time, pay_time)", dto.getRegPayIntervalTimeMin());
+        }
+        if (dto.getRegPayIntervalTimeMax() != null) {
+            cri.where().andLTE("TIMESTAMPDIFF(MINUTE, reg_time, pay_time)", dto.getRegPayIntervalTimeMax());
+        }
+        //默认排序方式
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            cri.getOrderBy().orderBy("day", dto.getSortType());
+            cri.getOrderBy().orderBy("order_create_time", dto.getSortType());
+        } else {
+            cri.getOrderBy().orderBy(dto.getSortFiled(), dto.getSortType());
+        }
+        List<AdsOrderDetailVO> records = dao.query(AdsOrderDetail.class, cri, pager).stream().map(this::toVO).collect(Collectors.toList());
+        pager.setRecordCount(dao.count(AdsOrderDetail.class, cri));
+        return new Page<>(records, pager);
+    }
+
+    @Override
+    public AdsOrderDetailTotalVO orderTotal(AdsOrderDetailTotalDTO dto) {
+        if (StringUtils.isBlank(dto.getPitcherId()) && !SecurityUtil.isManager()) {
+            // 只有管理员才能查看全部数据
+            dto.setPitcherId(SecurityUtil.getUserId().toString());
+        }
+        Criteria cri = Cnd.cri();
         if (StringUtils.isNotBlank(dto.getSourceSystem())) {
-            cnd.and(AdsOrderDetail::getSourceSystem, "=", dto.getSourceSystem());
+            cri.where().andEquals("source_system", dto.getSourceSystem());
         }
         if (StringUtils.isNotBlank(dto.getOrderId())) {
-            cnd.and(AdsOrderDetail::getOrderId, "=", dto.getOrderId());
+            cri.where().andEquals("order_id", dto.getOrderId());
         }
         if (StringUtils.isNotBlank(dto.getCpOrderId())) {
-            cnd.and(AdsOrderDetail::getCpOrderId, "=", dto.getCpOrderId());
+            cri.where().andEquals("cp_order_id", dto.getCpOrderId());
         }
         if (StringUtils.isNotBlank(dto.getMerchantOrderNo())) {
-            cnd.and(AdsOrderDetail::getMerchantOrderNo, "=", dto.getMerchantOrderNo());
-        }
-        if (StringUtils.isNotBlank(dto.getZxPitcherId())) {
-            cnd.and(AdsOrderDetail::getZxPitcherId, "=", dto.getZxPitcherId());
+            cri.where().andEquals("merchant_order_no", dto.getMerchantOrderNo());
         }
-        if (StringUtils.isNotBlank(dto.getGameUserId())) {
-            cnd.and(AdsOrderDetail::getGameUserId, "=", dto.getGameUserId());
+        if (StringUtils.isNotBlank(dto.getUserId())) {
+            cri.where().andEquals("game_user_id", dto.getUserId());
         }
         if (StringUtils.isNotBlank(dto.getUsername())) {
-            cnd.and(AdsOrderDetail::getUsername, "like", "%" + dto.getUsername() + "%");
-        }
-        if (StringUtils.isNotBlank(dto.getParentId())) {
-            cnd.and(AdsOrderDetail::getParentId, "=", dto.getParentId());
+            cri.where().andEquals("username", dto.getUsername());
         }
-        if (StringUtils.isNotBlank(dto.getOrderGameId())) {
-            cnd.and(AdsOrderDetail::getOrderGameId, "=", dto.getOrderGameId());
+        if (StringUtils.isNotBlank(dto.getServerName())) {
+            cri.where().andEquals("server_name", dto.getServerName());
         }
         if (StringUtils.isNotBlank(dto.getGameId())) {
-            cnd.and(AdsOrderDetail::getGameId, "=", dto.getGameId());
+            cri.where().andEquals("order_game_id", dto.getGameId());
+        }
+        if (StringUtils.isNotBlank(dto.getChannelId())) {
+            cri.where().andEquals("agent_id", dto.getChannelId());
         }
         if (StringUtils.isNotBlank(dto.getAccountId())) {
-            cnd.and(AdsOrderDetail::getAccountId, "=", dto.getAccountId());
+            cri.where().andEquals("account_id", dto.getAccountId());
         }
-        if (StringUtils.isNotBlank(dto.getAgentId())) {
-            cnd.and(AdsOrderDetail::getAgentId, "=", dto.getAgentId());
+        if (StringUtils.isNotBlank(dto.getPitcherId())) {
+            cri.where().andEquals("zx_pitcher_id", dto.getPitcherId());
         }
-        if (StringUtils.isNotBlank(dto.getOs())) {
-            cnd.and(AdsOrderDetail::getOs, "=", dto.getOs());
+        if (StringUtils.isNotBlank(dto.getDeviceSystem())) {
+            cri.where().andEquals("os", dto.getDeviceSystem());
         }
-        if (StringUtils.isNotBlank(dto.getOrderStatus())) {
-            cnd.and(AdsOrderDetail::getOrderStatus, "=", dto.getOrderStatus());
+        if (StringUtils.isNotBlank(dto.getProductName())) {
+            cri.where().andEquals("product_name", dto.getProductName());
         }
-        if (StringUtils.isNotBlank(dto.getPayway())) {
-            cnd.and(AdsOrderDetail::getPayway, "=", dto.getPayway());
+        if (StringUtils.isNotBlank(dto.getPayWay())) {
+            cri.where().andEquals("payway", dto.getPayWay());
         }
-        if (StringUtils.isNotBlank(dto.getRoleId())) {
-            cnd.and(AdsOrderDetail::getRoleId, "=", dto.getRoleId());
+        if (StringUtils.isNotBlank(dto.getMerchantNo())) {
+            cri.where().andEquals("pay_account_id", dto.getMerchantNo());
         }
-        if (StringUtils.isNotBlank(dto.getRoleName())) {
-            cnd.and(AdsOrderDetail::getRoleName, "=", dto.getRoleName());
+        if (StringUtils.isNotBlank(dto.getStatus())) {
+            cri.where().andEquals("order_status", dto.getStatus());
         }
-        if (dto.getBeginRegTime() != null) {
-            cnd.and(AdsOrderDetail::getRegTime, ">=", dto.getBeginRegTime());
+        if (StringUtils.isNotBlank(dto.getCpStatus())) {
+            cri.where().andEquals("cp_status", dto.getCpStatus());
         }
-        if (dto.getEndRegTime() != null) {
-            cnd.and(AdsOrderDetail::getRegTime, "<=", dto.getEndRegTime());
+        if (StringUtils.isNotBlank(dto.getIsFirstRecharge())) {
+            cri.where().andEquals("is_first_recharge", dto.getIsFirstRecharge());
         }
-        cnd.orderBy(dto.getSortFiled(), dto.getSortType());
-        List<AdsOrderDetailVO> records = dao.query(AdsOrderDetail.class, cnd, pager).stream().map(this::toVO).collect(Collectors.toList());
-        pager.setRecordCount(dao.count(AdsOrderDetail.class, cnd));
-        return new Page<>(records, pager);
+        if (dto.getBeginDate() != null && dto.getEndDate() != null) {
+            //下单时间,订单创建时间
+            cri.where().andBetween("day", dto.getBeginDate(), dto.getEndDate());
+        }
+        if (dto.getRegTimeStart() != null && dto.getRegTimeEnd() != null) {
+            //玩家注册时间
+            cri.where().andBetween("reg_time", dto.getRegTimeStart(), dto.getRegTimeEnd());
+        }
+        if (dto.getPayTimeStart() != null && dto.getPayTimeEnd() != null) {
+            //支付时间,订单充值时间
+            cri.where().andBetween("pay_time", dto.getPayTimeStart(), dto.getPayTimeEnd());
+        }
+        if (dto.getRegPayIntervalTimeMin() != null) {
+            cri.where().andGTE("TIMESTAMPDIFF(MINUTE, reg_time, pay_time)", dto.getRegPayIntervalTimeMin());
+        }
+        if (dto.getRegPayIntervalTimeMax() != null) {
+            cri.where().andLTE("TIMESTAMPDIFF(MINUTE, reg_time, pay_time)", dto.getRegPayIntervalTimeMax());
+        }
+        Sql sql = Sqls.create("""
+                SELECT
+                    IFNULL(SUM(amount), 0) as amount,
+                    IFNULL(SUM(real_amount), 0) as real_amount
+                FROM
+                    game_ads.ads_order_detail
+                """ + cri);
+        sql.setCallback(Sqls.callback.entity());
+        sql.setEntity(dao.getEntity(AdsOrderDetailTotalVO.class));
+        dao.execute(sql);
+
+        return sql.getObject(AdsOrderDetailTotalVO.class);
     }
 
     private AdsOrderDetailVO toVO(AdsOrderDetail gameOrder) {

+ 0 - 33
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java

@@ -27,7 +27,6 @@ import org.springframework.stereotype.Service;
 import java.beans.PropertyDescriptor;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -50,11 +49,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
      * @return
      */
     public Page<PromotionDayVO> getPromotionDayListData(PromotionDayDTO dto) {
-        //不传递查询条件默认查询当天数据
-        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
-            dto.setCostBeginDate(LocalDate.now());
-            dto.setCostEndDate(LocalDate.now());
-        }
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("dt");
@@ -139,12 +133,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
      */
     @Override
     public Page<PromotionDayVO> getPromotionDayData(PromotionDayDTO dto) {
-
-        //不传递查询条件默认查询当天数据
-        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
-            dto.setCostBeginDate(LocalDate.now());
-            dto.setCostEndDate(LocalDate.now());
-        }
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("today_cost");
@@ -225,11 +213,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
      */
     @Override
     public PromotionDayTotalVO getPromotionDayTotalData(PromotionDayTotalDTO dto) {
-        //不传递查询条件默认查询当天数据
-        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
-            dto.setCostBeginDate(LocalDate.now());
-            dto.setCostEndDate(LocalDate.now());
-        }
         //创建查询条件
         Criteria cri = Cnd.cri();
         if (dto.getAccountId() != null) {
@@ -411,11 +394,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
      * @return
      */
     public Page<TencentPromotionDayVO> getTencentPromotionDayListData(TencentPromotionDayDTO dto) {
-        //不传递查询条件默认查询当天数据
-        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
-            dto.setCostBeginDate(LocalDate.now());
-            dto.setCostEndDate(LocalDate.now());
-        }
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("dt");
@@ -500,12 +478,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
      */
     @Override
     public Page<TencentPromotionDayVO> getTencentPromotionDayData(TencentPromotionDayDTO dto) {
-
-        //不传递查询条件默认查询当天数据
-        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
-            dto.setCostBeginDate(LocalDate.now());
-            dto.setCostEndDate(LocalDate.now());
-        }
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("today_cost");
@@ -586,11 +558,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
      */
     @Override
     public TencentPromotionDayTotalVO getTencentPromotionDayTotalData(TencentPromotionDayTotalDTO dto) {
-        //不传递查询条件默认查询当天数据
-        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
-            dto.setCostBeginDate(LocalDate.now());
-            dto.setCostEndDate(LocalDate.now());
-        }
         //创建查询条件
         Criteria cri = Cnd.cri();
         if (dto.getAccountId() != null) {

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -21,7 +21,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <权限修改提交修改完成!!!!!> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <玩家角色新增下载> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 9 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/UserController.java

@@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -121,6 +122,14 @@ public class UserController {
         return ResultVO.ok(gameUserRoleService.list(param));
     }
 
+    @ApiOperation(value = "玩家游戏角色Excel下载")
+    @PostMapping(value = "/role/list/excel")
+    @PreAuthorize(permissionKey = "manage:user:roleListExcel")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功")})
+    public void getGameUserRoleExcel(@Validated @RequestBody GameUserRoleListParam param, HttpServletResponse response) {
+        gameUserRoleService.getGameUserRoleExcel(param, response);
+    }
+
     @ApiOperation(value = "玩家实名认证列表")
     @PostMapping(value = "/card/list")
     @PreAuthorize(permissionKey = "manage:userCard:list")

+ 184 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameUserRoleExcelVO.java

@@ -0,0 +1,184 @@
+package com.zanxiang.game.module.manage.pojo.vo;
+
+import com.zanxiang.module.util.excel.ExcelAnno;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-08-23
+ * @description : 玩家角色表格
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameUserRoleExcelVO {
+
+    /**
+     * 玩家id
+     */
+    @ExcelAnno(title = "玩家id")
+    private Long userId;
+
+    /**
+     * 玩家账号
+     */
+    @ExcelAnno(title = "玩家账号")
+    private String username;
+
+    /**
+     * 玩家昵称
+     */
+    @ExcelAnno(title = "玩家昵称")
+    private String nickname;
+
+    /**
+     * 注册IP
+     */
+    @ExcelAnno(title = "注册IP")
+    private String regIp;
+
+    /**
+     * 玩家注册时间
+     */
+    @ExcelAnno(title = "玩家注册时间")
+    private LocalDateTime regTime;
+
+    /**
+     * 注册渠道名称
+     */
+    @ExcelAnno(title = "注册渠道名称")
+    private String agentName;
+
+    /**
+     * cp名称
+     */
+    @ExcelAnno(title = "cp名称")
+    private String cpName;
+
+    /**
+     * 游戏名称
+     */
+    @ExcelAnno(title = "游戏名称")
+    private String gameName;
+
+    /**
+     * 游戏应用类型名称
+     */
+    @ExcelAnno(title = "游戏应用类型名称")
+    private String gameCategoryName;
+
+    /**
+     * 原始服务器名称
+     */
+    @ExcelAnno(title = "原始服务器名称")
+    private String sourceServerName;
+
+    /**
+     * 游戏区服
+     */
+    @ExcelAnno(title = "游戏区服")
+    private String serverName;
+
+    /**
+     * 游戏角色
+     */
+    @ExcelAnno(title = "游戏角色")
+    private String roleName;
+
+    /**
+     * 游戏角色id
+     */
+    @ExcelAnno(title = "游戏角色id")
+    private String roleId;
+
+    /**
+     * 角色等级
+     */
+    @ExcelAnno(title = "角色等级")
+    private Long roleLevel;
+
+    /**
+     * 游戏战力
+     */
+    @ExcelAnno(title = "游戏战力")
+    private Long rolePower;
+
+    /**
+     * 角色vip
+     */
+    @ExcelAnno(title = "角色vip")
+    private Long roleVipLevel;
+
+    /**
+     * 操作系统
+     */
+    @ExcelAnno(title = "操作系统")
+    private String os;
+
+    /**
+     * 充值金额
+     */
+    @ExcelAnno(title = "充值金额")
+    private BigDecimal rechargeMoney;
+
+    /**
+     * 充值次数
+     */
+    @ExcelAnno(title = "充值次数")
+    private Integer rechargeCount;
+
+    /**
+     * 角色创建时间
+     */
+    @ExcelAnno(title = "角色创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 最近登录时间
+     */
+    @ExcelAnno(title = "最近登录时间")
+    private LocalDateTime lastLoginTime;
+
+    /**
+     * 游戏角色更新时间
+     */
+    @ExcelAnno(title = "游戏角色更新时间")
+    private LocalDateTime updateTime;
+
+    /**
+     * 最近充值时间
+     */
+    @ExcelAnno(title = "最近充值时间")
+    private LocalDateTime lastRechargeTime;
+
+    /**
+     * 归因投放人员名字
+     */
+    @ExcelAnno(title = "归因投放人员名字")
+    private String pitcherName;
+
+    /**
+     * 归因推广账号id
+     */
+    @ExcelAnno(title = "归因推广账号id")
+    private Long accountId;
+
+    /**
+     * 归因推广账号类型(1:腾讯、2:头条)
+     */
+    @ExcelAnno(title = "因推广账号类型(1:腾讯、2:头条)")
+    private Integer accountType;
+
+    /**
+     * 注册充值时间差
+     */
+    @ExcelAnno(title = "注册充值时间差")
+    private Long regPayTimeDiff;
+}

+ 9 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserRoleService.java

@@ -8,6 +8,7 @@ import com.zanxiang.game.module.manage.pojo.vo.GameUserRoleListVO;
 import com.zanxiang.game.module.manage.pojo.vo.GameUserRoleVO;
 import com.zanxiang.game.module.mybatis.entity.GameUserRole;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -51,4 +52,12 @@ public interface IGameUserRoleService extends IService<GameUserRole> {
      * @return {@link IPage}<{@link GameUserRoleListVO}>
      */
     IPage<GameUserRoleListVO> list(GameUserRoleListParam param);
+
+    /**
+     * 游戏用户角色excel
+     *
+     * @param param    参数
+     * @param response 响应
+     */
+    void getGameUserRoleExcel(GameUserRoleListParam param, HttpServletResponse response);
 }

+ 70 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserRoleServiceImpl.java

@@ -6,11 +6,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.erp.security.util.SecurityUtil;
 import com.zanxiang.game.module.base.pojo.enums.GameAuthEnum;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.base.util.DateUtils;
 import com.zanxiang.game.module.manage.pojo.dto.*;
 import com.zanxiang.game.module.manage.pojo.params.GameUserRoleListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameUserRoleExcelVO;
 import com.zanxiang.game.module.manage.pojo.vo.GameUserRoleListVO;
 import com.zanxiang.game.module.manage.pojo.vo.GameUserRoleVO;
 import com.zanxiang.game.module.manage.service.*;
@@ -19,12 +21,16 @@ import com.zanxiang.game.module.mybatis.entity.GameServer;
 import com.zanxiang.game.module.mybatis.entity.GameUserRole;
 import com.zanxiang.game.module.mybatis.mapper.GameUserRoleMapper;
 import com.zanxiang.module.util.bean.BeanUtil;
+import com.zanxiang.module.util.excel.ExcelUtil;
+import com.zanxiang.module.util.exception.BaseException;
+import com.zanxiang.module.web.util.WebExcelUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import reactor.util.function.Tuple2;
 
+import javax.servlet.http.HttpServletResponse;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.*;
@@ -211,4 +217,68 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
         }
         return gameUserRoleListVO;
     }
+
+    @Override
+    public void getGameUserRoleExcel(GameUserRoleListParam param, HttpServletResponse response) {
+        if (!SecurityUtil.isAdmin()) {
+            throw new BaseException("没有下载权限");
+        }
+        //游戏获取
+        Tuple2<String, List<Long>> gameTuple = gameAuthService.getUserGameList(param.getPitcherId());
+        if (CollectionUtils.isEmpty(gameTuple.getT2())) {
+            return;
+        }
+        //游戏条件处理
+        Map<Long, GameDTO> gameMap = gameService.gameCondition(gameTuple.getT2(), param.getCpId(), param.getGameId(), param.getGameCategoryId());
+        //根据条件, 匹配不到游戏
+        if (gameMap != null && gameMap.isEmpty()) {
+            return;
+        }
+        //渠道获取
+        Tuple2<List<Long>, List<AgentDTO>> tuple2 = agentService.getUserAgent(param.getAccountId(), param.getPitcherId(), param.getChannelId());
+        List<Long> agentIdList = tuple2.getT1();
+        List<AgentDTO> agentDTOList = tuple2.getT2();
+        if (Objects.equals(gameTuple.getT1(), GameAuthEnum.PITCHER.getValue()) && CollectionUtils.isEmpty(agentIdList)) {
+            return;
+        }
+        //玩家条件处理
+        Map<Long, UserDTO> userMap = userService.userCondition(param.getUserId(), agentIdList, param.getUserName(),
+                param.getNickname(), param.getRegIp(), param.getRegTimeBeginDate(), param.getRegTimeEndDate());
+        //根据条件, 匹配不到玩家
+        if (userMap != null && userMap.isEmpty()) {
+            return;
+        }
+        //区服筛选
+        List<String> serverIdList = gameServerService.listServerId(param.getGameId(), param.getServerName());
+        Map<Long, CpDTO> cpMap = cpService.cpMap();
+        //相关用户id
+        Map<Long, AgentDTO> agentMap = agentDTOList.stream().collect(Collectors.toMap(AgentDTO::getId, Function.identity()));
+        Set<Long> userIdSet = userMap == null ? null : userMap.keySet();
+        //下载查询
+        WebExcelUtil.httpExport(response, "玩家角色", GameUserRoleExcelVO.class, ((pageNumber, pageSize) -> {
+            //查询订单
+            return page(param.toPage(), new QueryWrapper<GameUserRole>().lambda()
+                    .in(CollectionUtils.isNotEmpty(userIdSet), GameUserRole::getUserId, userIdSet)
+                    .in(CollectionUtils.isNotEmpty(serverIdList), GameUserRole::getServerId, serverIdList)
+                    .in(gameMap != null, GameUserRole::getGameId, gameMap != null ? gameMap.keySet() : null)
+                    .like(Strings.isNotBlank(param.getRoleName()), GameUserRole::getRoleName, param.getRoleName())
+                    .eq(Objects.equals(param.getIsRecharge(), Boolean.FALSE), GameUserRole::getRechargeCount, 0)
+                    .eq(Strings.isNotBlank(param.getOs()), GameUserRole::getOs, param.getOs())
+                    .gt(Objects.equals(param.getIsRecharge(), Boolean.TRUE), GameUserRole::getRechargeCount, 0)
+                    .gt(param.getVipLevel() != null && param.getVipLevel() > 10, GameUserRole::getRoleVipLevel, param.getVipLevel())
+                    .eq(param.getVipLevel() != null && param.getVipLevel() <= 10, GameUserRole::getRoleVipLevel, param.getVipLevel())
+                    .le(param.getEndDate() != null, GameUserRole::getCreateTime, param.getEndDate() == null ? null : LocalDateTime.of(param.getEndDate(), LocalTime.MAX))
+                    .ge(param.getBeginDate() != null, GameUserRole::getCreateTime, param.getBeginDate() == null ? null : LocalDateTime.of(param.getBeginDate(), LocalTime.MIN))
+                    .le(param.getRechargeEndDate() != null, GameUserRole::getLastRechargeTime, param.getRechargeEndDate() == null ? null : LocalDateTime.of(param.getRechargeEndDate(), LocalTime.MAX))
+                    .ge(param.getRechargeBeginDate() != null, GameUserRole::getLastRechargeTime, param.getRechargeBeginDate() == null ? null : LocalDateTime.of(param.getRechargeBeginDate(), LocalTime.MIN))
+                    .le(param.getRoleLevelMax() != null, GameUserRole::getRoleLevel, param.getRoleLevelMax())
+                    .ge(param.getRoleLevelMin() != null, GameUserRole::getRoleLevel, param.getRoleLevelMin())
+                    .apply(param.getRegPayIntervalTimeMax() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, reg_time, last_recharge_time), null) <= {0}", param.getRegPayIntervalTimeMax())
+                    .apply(param.getRegPayIntervalTimeMin() != null, "if(last_recharge_time is not null, TIMESTAMPDIFF(minute, reg_time, last_recharge_time), null) >= {0}", param.getRegPayIntervalTimeMin())
+                    .orderByDesc(GameUserRole::getCreateTime)
+            ).convert(u -> this.toVo(u, userMap, gameMap, cpMap, agentMap)).getRecords()
+                    .stream().map(gameUserRoleListVO -> BeanUtil.copy(gameUserRoleListVO, GameUserRoleExcelVO.class))
+                    .collect(Collectors.toList());
+        }), ExcelUtil.DEFAULT_MAX_DATA_SIZE);
+    }
 }

+ 7 - 8
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/OrderServiceImpl.java

@@ -277,18 +277,23 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         Tuple2<String, List<Long>> gameTuple = gameAuthService.getUserGameList(param.getPitcherId());
         List<Long> gameIdList = gameTuple.getT2();
         if (CollectionUtils.isEmpty(gameIdList)) {
-            throw new BaseException("参数错误, 未配置游戏权限");
+            return;
         }
         //渠道获取
         Tuple2<List<Long>, List<AgentDTO>> tuple2 = agentService.getUserAgent(param.getAccountId(), param.getPitcherId(), param.getChannelId());
         List<Long> agentIds = tuple2.getT1();
-        List<AgentDTO> agentDTOList = tuple2.getT2();
+        //渠道
+        Map<Long, AgentDTO> agentMap = tuple2.getT2().stream().collect(Collectors.toMap(AgentDTO::getId, Function.identity()));
         //查询用户id和名字条件
         List<User> userList = new ArrayList<>();
         if (Strings.isBlank(param.getUserId()) && Strings.isNotBlank(param.getUsername())) {
             userList = userService.list(new LambdaQueryWrapper<User>()
                     .like(User::getUsername, param.getUsername()));
         }
+        //商户列表
+        Map<String, PayMerchantDTO> payMerchantMap = payMerchantService.payMerchantMap();
+        //cp信息
+        Map<Long, CpDTO> cpMap = cpService.cpMap();
         final List<Long> userIds = userList.stream().map(User::getId).collect(Collectors.toList());
         List<String> serverIdList = gameServerService.listServerId(param.getGameId(), param.getServerName());
         //excel下载
@@ -296,17 +301,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //查询订单
             List<OrderVO> orderVOList = page(new Page<>(pageNumber, pageSize), this.getListWrapper(param, gameTuple,
                     agentIds, userIds, serverIdList, "*")).convert(this::toVO).getRecords();
-            //商户列表
-            Map<String, PayMerchantDTO> payMerchantMap = payMerchantService.payMerchantMap();
-            //cp信息
-            Map<Long, CpDTO> cpMap = cpService.cpMap();
             //玩家信息
             List<Long> userIdList = orderVOList.stream().map(OrderVO::getUserId).collect(Collectors.toList());
             Map<Long, UserDTO> userMap = userService.getByUserIds(userIdList);
             //游戏信息
             Map<Long, GameDTO> gameMap = gameService.gameMap(orderVOList.stream().map(OrderVO::getGameId).collect(Collectors.toSet()));
-            //渠道
-            Map<Long, AgentDTO> agentMap = agentDTOList.stream().collect(Collectors.toMap(AgentDTO::getId, Function.identity()));
             //字段信息补充更新
             orderVOList.forEach(vo -> this.toVO(vo, userMap, gameMap, cpMap, agentMap, payMerchantMap));
             //excel字段赋值