Explorar el Código

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

wcc hace 9 meses
padre
commit
c38d5467cd
Se han modificado 14 ficheros con 1554 adiciones y 34 borrados
  1. 6 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentAppApiUserAgentQueryRpcDTO.java
  2. 16 17
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OrderCostMonitorAlarmBySmsServiceImpl.java
  3. 2 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PitcherDataServiceImpl.java
  4. 12 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/controller/GameParentController.java
  5. 2 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/order/GameServerSonMergeMapper.java
  6. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsRoleAmountRateParentMapper.java
  7. 29 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/RolePayDTO.java
  8. 683 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsRoleAmountRateParent.java
  9. 574 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/RolePayVO.java
  10. 20 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsRoleAmountRateParentService.java
  11. 66 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsRoleAmountRateParentServiceImpl.java
  12. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  13. 38 10
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java
  14. 86 4
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java

+ 6 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentAppApiUserAgentQueryRpcDTO.java

@@ -1,11 +1,17 @@
 package com.zanxiang.game.back.base.pojo.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class TencentAppApiUserAgentQueryRpcDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 16 - 17
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OrderCostMonitorAlarmBySmsServiceImpl.java

@@ -6,6 +6,7 @@ import com.zanxiang.game.data.serve.utils.RedisUtil;
 import com.zanxiang.module.sms.pojo.SendResult;
 import com.zanxiang.module.sms.service.impl.AliSmsService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
@@ -59,7 +60,7 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
         if (count == 0) {
             String msg = "前一小时订单表数据为空,请检查";
             log.info(msg);
-            if(!sendSms(msg)){
+            if (!sendSms(msg)) {
                 throw new RuntimeException("短信发送失败");
             }
         }
@@ -74,13 +75,13 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
         int newHeadCostCount = headCostSql.getInt(0);
         //从redis中取旧的消耗值
         String oldHeadCostCount = redisUtil.getCache(HEADLINE_COST_COUNT);
-        if(StringUtils.isNotBlank(oldHeadCostCount)){
+        if (StringUtils.isNotBlank(oldHeadCostCount)) {
             //如果不为空,则比较
             if (newHeadCostCount - Integer.parseInt(oldHeadCostCount) == 0) {
                 //如果没期间没消耗就告警
                 String msg = "前半小时头条广告数据为空,请检查";
                 log.info(msg);
-                if(!sendSms(msg)){
+                if (!sendSms(msg)) {
                     throw new RuntimeException("短信发送失败");
                 }
             }
@@ -99,11 +100,11 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
         int newTencentCostCount = tencentCostSql.getInt(0);
         //从redis中取旧的消耗值
         String oldTencentCostCount = redisUtil.getCache(TENCENT_COST_COUNT);
-        if(StringUtils.isNotBlank(oldTencentCostCount)){
+        if (StringUtils.isNotBlank(oldTencentCostCount)) {
             if (newTencentCostCount - Integer.parseInt(oldTencentCostCount) == 0) {
                 String msg = "前半小时腾讯广告数据为空,请检查";
                 log.info(msg);
-                if(!sendSms(msg)){
+                if (!sendSms(msg)) {
                     throw new RuntimeException("短信发送失败");
                 }
             }
@@ -113,9 +114,9 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
     }
 
 
-
     /**
      * 发送短信
+     *
      * @param content 内容
      * @return 是否发送成功
      */
@@ -124,15 +125,16 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Map<String, String> params = new HashMap<>();
         params.put(smsProperties.getMsgParamName(), content);
-        params.put(smsProperties.getTimeParamName(),formatter.format(date));
+        params.put(smsProperties.getTimeParamName(), formatter.format(date));
         //存储在配置文件
-        Set<String> numberList = new HashSet<>(Arrays.asList(phoneNumber.split(",")));
-
-        Map<String, SendResult> resultMap = aliSmsService.send(smsProperties.getDefaultSignName(), smsProperties.getDefaultStstemErrorTemplate(), params, numberList);
-        for (SendResult next : resultMap.values()) {
-            if (!next.isSuccess()) {
-                log.error("短信发送失败,失败原因:{}", next.getMsg());
-                return false;
+        if (StringUtils.isNotEmpty(phoneNumber)) {
+            Set<String> numberList = new HashSet<>(Arrays.asList(phoneNumber.split(",")));
+            Map<String, SendResult> resultMap = aliSmsService.send(smsProperties.getDefaultSignName(), smsProperties.getDefaultStstemErrorTemplate(), params, numberList);
+            for (SendResult next : resultMap.values()) {
+                if (!next.isSuccess()) {
+                    log.error("短信发送失败,失败原因:{}", next.getMsg());
+                    return false;
+                }
             }
         }
         return true;
@@ -146,7 +148,6 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
     }
 
 
-
     private Sql getSql(String sqlStr) {
         Sql sql = Sqls.create(sqlStr);
         sql.setCallback(Sqls.callback.integer());
@@ -182,6 +183,4 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
     }
 
 
-
-
 }

+ 2 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PitcherDataServiceImpl.java

@@ -2087,7 +2087,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                 //得到需要计算的值
                 String[] temps = ((String) dayNTotalFieldMap.getT1().get(vo)).split("/");
                 //dn的金额总计
-                BigDecimal dNAmount = new BigDecimal(temps[0]);
+                BigDecimal dNAmount = new BigDecimal(temps[0]).setScale(2, RoundingMode.HALF_UP);;;
                 //d1-dn的金额总计
                 BigDecimal d1ToDNTotalAmount = new BigDecimal(temps[1]);
                 //d1-dn的消耗总计(排除了未到时间的cost)
@@ -2163,7 +2163,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                 //得到需要计算的值
                 String[] temps = ((String) dayNTotalFieldMap.getT1().get(vo)).split("/");
                 //dn的金额总计
-                BigDecimal dNAmount = new BigDecimal(temps[0]);
+                BigDecimal dNAmount = new BigDecimal(temps[0]).setScale(2, RoundingMode.HALF_UP);;
                 //d1-dn的金额总计
                 BigDecimal d1ToDNTotalAmount = new BigDecimal(temps[1]);
                 //d1-dn的消耗总计(排除了未到时间的cost)

+ 12 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/controller/GameParentController.java

@@ -2,9 +2,12 @@ package com.zanxiang.game.gs.data.serve.controller;
 
 import com.mybatisflex.core.row.Row;
 import com.zanxiang.game.gs.data.serve.pojo.dto.BigRDTO;
+import com.zanxiang.game.gs.data.serve.pojo.dto.RolePayDTO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.BigRVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.RolePayVO;
 import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountDataParentService;
+import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountRateParentService;
 import com.zanxiang.module.util.pojo.ResultVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -22,6 +25,8 @@ import javax.annotation.Resource;
 public class GameParentController {
     @Resource
     private IAdsRoleAmountDataParentService adsRoleAmountDataParentService;
+    @Resource
+    private IAdsRoleAmountRateParentService adsRoleAmountRateParentService;
 
     @ApiOperation(value = "大R每日充值比")
 //    @PreAuthorize(permissionKey = "gameGs:bigR:list")
@@ -30,4 +35,11 @@ public class GameParentController {
         return ResultVO.ok(adsRoleAmountDataParentService.bigRListOfPage(dto));
     }
 
+    @ApiOperation(value = "GS角色付费留存")
+//    @PreAuthorize(permissionKey = "gameGs:rolePay:list")
+    @PostMapping("/role/pay/retained/listOfPage")
+    public ResultVO<PageVO<RolePayVO, Row>> rolePay(@Validated @RequestBody RolePayDTO dto) {
+        return ResultVO.ok(adsRoleAmountRateParentService.rolePayOfPage(dto));
+    }
+
 }

+ 2 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/order/GameServerSonMergeMapper.java

@@ -1,5 +1,6 @@
 package com.zanxiang.game.gs.data.serve.dao.mapper.game.order;
 
+import com.mybatisflex.annotation.UseDataSource;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServerSonMerge;
 import com.mybatisflex.core.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -11,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper;
  * @since 1.0
  */
 @Mapper
+@UseDataSource("game_order")
 public interface GameServerSonMergeMapper extends BaseMapper<GameServerSonMerge> {
 
 

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/parent/AdsRoleAmountRateParentMapper.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.dao.mapper.game.parent;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountRateParent;
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 游戏GS管理-GS角色付费留存 映射层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Mapper
+@UseDataSource("game_ads_parent")
+public interface AdsRoleAmountRateParentMapper extends BaseMapper<AdsRoleAmountRateParent> {
+
+
+}

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

@@ -0,0 +1,29 @@
+package com.zanxiang.game.gs.data.serve.pojo.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class RolePayDTO extends BaseListDTO {
+    @NotNull(message = "SDK来源必填")
+    @ApiModelProperty(notes = "必填:SDK来源;默认ZX_ONE")
+    private String sourceSystem;
+    @ApiModelProperty("排序字段")
+    private String sortFiled;
+    @ApiModelProperty("排序类型:升序 true;降序 false")
+    private Boolean sortAsc = true;
+
+    @ApiModelProperty("指派日期开始")
+    private LocalDate dtBegin;
+    @ApiModelProperty("指派日期结束")
+    private LocalDate dtEnd;
+    @ApiModelProperty("gs id 列表")
+    private List<Long> gsIdList;
+
+}

+ 683 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsRoleAmountRateParent.java

@@ -0,0 +1,683 @@
+package com.zanxiang.game.gs.data.serve.pojo.entity.game.parent;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.Builder;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.lang.String;
+import java.lang.Integer;
+
+/**
+ * 游戏GS管理-GS角色付费留存 实体类。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "ads_role_amount_rate_parent")
+public class AdsRoleAmountRateParent {
+
+    /**
+     * gsID
+     */
+    @Column(value = "gs_id")
+    private Integer gsId;
+
+    /**
+     * gs开始管理时间
+     */
+    @Column(value = "dt")
+    private LocalDate dt;
+
+    /**
+     * 付费角色数量
+     */
+    @Column(value = "role_amount_num")
+    private Integer roleAmountNum;
+
+    /**
+     * 付费次数
+     */
+    @Column(value = "order_count")
+    private Integer orderCount;
+
+    /**
+     * 付费金额
+     */
+    @Column(value = "total_amount")
+    private BigDecimal totalAmount;
+
+    /**
+     * 指派角色数量
+     */
+    @Column(value = "role_num")
+    private Integer roleNum;
+
+    /**
+     * ARPPU(人均付费金额)=付费金额/付费角色数量
+     */
+    @Column(value = "gs_arppu")
+    private BigDecimal gsArppu;
+
+    /**
+     * 客单价(平均每次付费金额)=付费金额/付费次数
+     */
+    @Column(value = "gs_avg")
+    private BigDecimal gsAvg;
+
+    /**
+     * 付费率=付费角色数量/指派角色数量
+     */
+    @Column(value = "gs_rate")
+    private BigDecimal gsRate;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da1")
+    private String da1;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da2")
+    private String da2;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da3")
+    private String da3;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da4")
+    private String da4;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da5")
+    private String da5;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da6")
+    private String da6;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da7")
+    private String da7;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da8")
+    private String da8;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da9")
+    private String da9;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da10")
+    private String da10;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da11")
+    private String da11;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da12")
+    private String da12;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da13")
+    private String da13;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da14")
+    private String da14;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da15")
+    private String da15;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da16")
+    private String da16;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da17")
+    private String da17;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da18")
+    private String da18;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da19")
+    private String da19;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da20")
+    private String da20;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da21")
+    private String da21;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da22")
+    private String da22;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da23")
+    private String da23;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da24")
+    private String da24;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da25")
+    private String da25;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da26")
+    private String da26;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da27")
+    private String da27;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da28")
+    private String da28;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da29")
+    private String da29;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da30")
+    private String da30;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da31")
+    private String da31;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da32")
+    private String da32;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da33")
+    private String da33;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da34")
+    private String da34;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da35")
+    private String da35;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da36")
+    private String da36;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da37")
+    private String da37;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da38")
+    private String da38;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da39")
+    private String da39;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da40")
+    private String da40;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da41")
+    private String da41;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da42")
+    private String da42;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da43")
+    private String da43;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da44")
+    private String da44;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da45")
+    private String da45;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da46")
+    private String da46;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da47")
+    private String da47;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da48")
+    private String da48;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da49")
+    private String da49;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da50")
+    private String da50;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da51")
+    private String da51;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da52")
+    private String da52;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da53")
+    private String da53;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da54")
+    private String da54;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da55")
+    private String da55;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da56")
+    private String da56;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da57")
+    private String da57;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da58")
+    private String da58;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da59")
+    private String da59;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da60")
+    private String da60;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da61")
+    private String da61;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da62")
+    private String da62;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da63")
+    private String da63;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da64")
+    private String da64;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da65")
+    private String da65;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da66")
+    private String da66;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da67")
+    private String da67;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da68")
+    private String da68;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da69")
+    private String da69;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da70")
+    private String da70;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da71")
+    private String da71;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da72")
+    private String da72;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da73")
+    private String da73;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da74")
+    private String da74;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da75")
+    private String da75;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da76")
+    private String da76;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da77")
+    private String da77;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da78")
+    private String da78;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da79")
+    private String da79;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da80")
+    private String da80;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da81")
+    private String da81;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da82")
+    private String da82;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da83")
+    private String da83;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da84")
+    private String da84;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da85")
+    private String da85;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da86")
+    private String da86;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da87")
+    private String da87;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da88")
+    private String da88;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da89")
+    private String da89;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "da90")
+    private String da90;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m4")
+    private String m4;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m5")
+    private String m5;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m6")
+    private String m6;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m7")
+    private String m7;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m8")
+    private String m8;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m9")
+    private String m9;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m10")
+    private String m10;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m11")
+    private String m11;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "m12")
+    private String m12;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @Column(value = "total")
+    private String total;
+
+
+}

+ 574 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/RolePayVO.java

@@ -0,0 +1,574 @@
+package com.zanxiang.game.gs.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+public class RolePayVO {
+
+    /**
+     * gsID
+     */
+    @ApiModelProperty("gsID")
+    private Long gsId;
+
+    @ApiModelProperty("gs 名称")
+    private String gsName;
+
+    /**
+     * gs开始管理时间
+     */
+    @ApiModelProperty("gs指派日期")
+    private LocalDate dt;
+
+    @ApiModelProperty("至今服务天数:当前时间-指派日期")
+    private long dtDiff;
+
+    /**
+     * 指派角色数量
+     */
+    @ApiModelProperty("指派角色数量")
+    private Integer roleNum;
+
+    /**
+     * 付费角色数量
+     */
+    @ApiModelProperty("付费角色数量")
+    private Integer roleAmountNum;
+
+    /**
+     * 付费次数
+     */
+    @ApiModelProperty("付费次数")
+    private Integer orderCount;
+
+    /**
+     * 付费金额
+     */
+    @ApiModelProperty("付费金额")
+    private BigDecimal totalAmount;
+
+    /**
+     * ARPPU(人均付费金额)=付费金额/付费角色数量
+     */
+    @ApiModelProperty("ARPPU(人均付费金额)")
+    private BigDecimal gsArppu;
+
+    /**
+     * 客单价(平均每次付费金额)=付费金额/付费次数
+     */
+    @ApiModelProperty("客单价(平均每次付费金额)")
+    private BigDecimal gsAvg;
+
+    /**
+     * 付费率=付费角色数量/指派角色数量
+     */
+    @ApiModelProperty("付费率")
+    private BigDecimal gsRate;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    @ApiModelProperty("day1 : 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率")
+    private String da1;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da2;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da3;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da4;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da5;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da6;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da7;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da8;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da9;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da10;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da11;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da12;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da13;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da14;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da15;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da16;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da17;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da18;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da19;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da20;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da21;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da22;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da23;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da24;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da25;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da26;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da27;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da28;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da29;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da30;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da31;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da32;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da33;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da34;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da35;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da36;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da37;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da38;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da39;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da40;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da41;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da42;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da43;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da44;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da45;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da46;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da47;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da48;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da49;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da50;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da51;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da52;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da53;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da54;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da55;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da56;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da57;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da58;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da59;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da60;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da61;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da62;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da63;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da64;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da65;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da66;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da67;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da68;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da69;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da70;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da71;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da72;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da73;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da74;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da75;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da76;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da77;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da78;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da79;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da80;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da81;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da82;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da83;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da84;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da85;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da86;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da87;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da88;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da89;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String da90;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m4;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m5;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m6;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m7;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m8;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m9;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m10;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m11;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String m12;
+
+    /**
+     * 活跃人数/付费人数/付费累计人数/付费金额/付费率/活跃留存率/付费留存率
+     */
+    private String total;
+
+
+}

+ 20 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsRoleAmountRateParentService.java

@@ -0,0 +1,20 @@
+package com.zanxiang.game.gs.data.serve.service;
+
+
+import com.mybatisflex.core.row.Row;
+import com.zanxiang.game.gs.data.serve.pojo.dto.RolePayDTO;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountRateParent;
+import com.mybatisflex.core.service.IService;
+import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.RolePayVO;
+
+/**
+ * 游戏GS管理-GS角色付费留存 服务层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+public interface IAdsRoleAmountRateParentService extends IService<AdsRoleAmountRateParent> {
+
+    PageVO<RolePayVO, Row> rolePayOfPage(RolePayDTO dto);
+}

+ 66 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsRoleAmountRateParentServiceImpl.java

@@ -0,0 +1,66 @@
+package com.zanxiang.game.gs.data.serve.service.impl;
+
+
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.mybatisflex.core.row.Row;
+import com.zanxiang.game.gs.data.serve.pojo.dto.RolePayDTO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
+import com.zanxiang.game.gs.data.serve.pojo.vo.RolePayVO;
+import com.zanxiang.game.gs.data.serve.service.ISysUserService;
+import com.zanxiang.module.util.DateUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.stereotype.Service;
+import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountRateParentService;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountRateParent;
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsRoleAmountRateParentMapper;
+import com.mybatisflex.spring.service.impl.ServiceImpl;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountDataParentTableDef.ADS_ROLE_AMOUNT_DATA_PARENT;
+import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountRateParentTableDef.ADS_ROLE_AMOUNT_RATE_PARENT;
+
+/**
+ * 游戏GS管理-GS角色付费留存 服务层实现。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Service
+public class AdsRoleAmountRateParentServiceImpl extends ServiceImpl<AdsRoleAmountRateParentMapper, AdsRoleAmountRateParent> implements IAdsRoleAmountRateParentService {
+    @Resource
+    private ISysUserService sysUserService;
+
+    @Override
+    public PageVO<RolePayVO, Row> rolePayOfPage(RolePayDTO dto) {
+        QueryWrapper rolePayWrapper = getRolePayWrapper(dto);
+        Page<RolePayVO> paginate = getMapper().paginateAs(dto.getPageNum(), dto.getPageSize(), rolePayWrapper, RolePayVO.class);
+        if (0 == paginate.getTotalRow()) {
+            return PageVO.empty(dto);
+        }
+        List<RolePayVO> records = paginate.getRecords();
+        Set<Long> gsIdList = records.stream().map(RolePayVO::getGsId).collect(Collectors.toSet());
+        //GS名称查询
+        Map<Long, String> sysUserMap = CollectionUtils.isEmpty(gsIdList) ? null : sysUserService.getSysUserMap(gsIdList);
+        records.forEach(item -> {
+            item.setGsName(sysUserMap != null ? sysUserMap.get(item.getGsId()) : null);
+            item.setDtDiff(DateUtil.intervalOfDays(item.getDt(), LocalDate.now()));
+        });
+        return new PageVO<>(paginate);
+    }
+
+    private QueryWrapper getRolePayWrapper(RolePayDTO dto) {
+        return QueryWrapper.create()
+                .select(ADS_ROLE_AMOUNT_RATE_PARENT.ALL_COLUMNS)
+                .ge(AdsRoleAmountRateParent::getDt, dto.getDtBegin(), null != dto.getDtBegin())
+                .le(AdsRoleAmountRateParent::getDt, dto.getDtEnd(), null != dto.getDtEnd())
+                .in(AdsRoleAmountRateParent::getGsId, dto.getGsIdList(), CollectionUtils.isNotEmpty(dto.getGsIdList()))
+                .orderBy(dto.getSortFiled(), dto.getSortAsc());
+    }
+}

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -23,7 +23,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <解决token重复重现的问题> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <兼容腾讯私域APP回传> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 38 - 10
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java

@@ -4,6 +4,11 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
+import com.zanxiang.game.back.base.ServerInfo;
+import com.zanxiang.game.back.base.pojo.dto.TencentAppApiUserAgentQueryRpcDTO;
+import com.zanxiang.game.back.base.rpc.ITencentAppApiBackRpc;
+import com.zanxiang.game.back.base.rpc.ITencentUserActionBackRpc;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.mybatis.mapper.AgentMapper;
@@ -13,6 +18,7 @@ import com.zanxiang.game.module.sdk.service.*;
 import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.module.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -29,6 +35,9 @@ import java.util.*;
 @Service
 public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements IAgentService {
 
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private ITencentAppApiBackRpc tencentAppApiBackRpc;
+
     @Autowired
     private IUserService userService;
 
@@ -169,19 +178,12 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
             Agent agent = super.getOne(new LambdaQueryWrapper<Agent>().eq(Agent::getAgentKey, userData.getChannel()));
             return Tuples.of(agent == null ? 0 : agent.getId(), Collections.singletonMap("agentKey", userData.getChannel()), Strings.EMPTY);
         }
-        //不投放, 不回传, 只归因渠道, -- 不投放, 且回传只存在于导量情况, 导量无注册行为
-        if (Objects.equals(game.getIsPut(), Boolean.FALSE) && Objects.equals(gameExt.getAdCallBackSwitch(), Boolean.FALSE)) {
-            //查询访问记录
-            UserVisitLog userVisitLog = this.getUserVisitLog(userData);
-            //返回渠道信息
-            return Tuples.of(userVisitLog == null ? 0L : userVisitLog.getAgentId(), Collections.emptyMap(), Strings.EMPTY);
-        }
-        //投放, 且回传 -- 投放, 且不回传这种情况不存在
-        if (Objects.equals(game.getIsPut(), Boolean.TRUE) && Objects.equals(gameExt.getAdCallBackSwitch(), Boolean.TRUE)) {
+        //头条私域, 虚拟游戏方式
+        if (Objects.equals(game.getPutType(), 3)) {
             //查询访问记录
             UserVisitLog userVisitLog = this.getUserVisitLog(userData);
             if (userVisitLog == null) {
-                //未匹配到访问信息, 返回自然
+                //未匹配到访问信息, 返回自然量
                 return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);
             }
             //解析访问记录中得请求参数
@@ -191,6 +193,32 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
             //返回渠道信息
             return Tuples.of(agent == null ? 0L : agent.getId(), urlParamMap, Strings.EMPTY);
         }
+        //腾讯私域, 直接加企微方式
+        if (Objects.equals(game.getPutType(), 4)) {
+            TencentAppApiUserAgentQueryRpcDTO tencentAppApiUserAgentQueryRpcDTO = TencentAppApiUserAgentQueryRpcDTO.builder()
+                    .gameId(game.getId())
+                    .regIp(userData.getIp())
+                    .registerTime(LocalDateTime.now())
+                    .imei(userData.getImei())
+                    .oaid(userData.getOaid())
+                    .androidId(userData.getAndroidId())
+                    .idfa(userData.getIdfa())
+                    .caid(userData.getCaid())
+                    .build();
+            Tuple2<String, Long> tuple2 = tencentAppApiBackRpc.queryUserAgentFromCallback(tencentAppApiUserAgentQueryRpcDTO).getData();
+            Map<String, String> map = new HashMap<>(2);
+            map.put("agentKey", tuple2.first);
+            map.put("callbackId", tuple2.second.toString());
+            Agent agent = super.getOne(new LambdaQueryWrapper<Agent>().eq(Agent::getAgentKey, tuple2.first));
+            return Tuples.of(agent == null ? 0 : agent.getId(), map, Strings.EMPTY);
+        }
+        //不投放, 不回传, 只归因渠道, -- 不投放, 且回传只存在于导量情况, 导量无注册行为
+        if (Objects.equals(game.getIsPut(), Boolean.FALSE) && Objects.equals(gameExt.getAdCallBackSwitch(), Boolean.FALSE)) {
+            //查询访问记录
+            UserVisitLog userVisitLog = this.getUserVisitLog(userData);
+            //返回渠道信息
+            return Tuples.of(userVisitLog == null ? 0L : userVisitLog.getAgentId(), Collections.emptyMap(), Strings.EMPTY);
+        }
         //默认返回自然量
         return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);
     }

+ 86 - 4
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java

@@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.zanxiang.game.back.base.ServerInfo;
 import com.zanxiang.game.back.base.pojo.dto.*;
 import com.zanxiang.game.back.base.pojo.vo.OrderBackQueryRpcVO;
-import com.zanxiang.game.back.base.rpc.ITencentMiniGameBackRpc;
-import com.zanxiang.game.back.base.rpc.ITencentUserActionBackRpc;
-import com.zanxiang.game.back.base.rpc.ITtAppBackRpc;
-import com.zanxiang.game.back.base.rpc.ITtMiniGameBackRpc;
+import com.zanxiang.game.back.base.rpc.*;
 import com.zanxiang.game.module.base.pojo.enums.AccountTypeEnum;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.mybatis.entity.*;
@@ -41,6 +38,9 @@ import java.util.stream.Collectors;
 @Service
 public class CallBackServiceImpl implements ICallBackService {
 
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private ITencentAppApiBackRpc tencentAppApiBackRpc;
+
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private ITencentUserActionBackRpc tencentUserActionBackRpc;
 
@@ -218,6 +218,12 @@ public class CallBackServiceImpl implements ICallBackService {
                 tencentMiniGameBackRpc.backUser(tencentUserDTO);
                 gameBackLogService.addLog(user.getId(), null, "腾讯小游戏用户回传提交", JsonUtil.toString(tencentUserDTO));
             }
+            //腾讯APP私域
+            if (Objects.equals(agent.getAccountType(), AccountTypeEnum.TENCENT_APP_API.getValue())) {
+                TencentUserAppApiRpcDTO tencentUserAppApiRpcDTO = this.transform(user, agent, urlParamMap.get("callbackId"));
+                tencentAppApiBackRpc.backUser(tencentUserAppApiRpcDTO);
+                gameBackLogService.addLog(user.getId(), null, "腾讯APP私域用户回传提交", JsonUtil.toString(tencentUserAppApiRpcDTO));
+            }
             //头条回传
             if (CollectionUtils.isNotEmpty(urlParamMap) && Objects.equals(agent.getAccountType(), AccountTypeEnum.BYTE.getValue())) {
                 Game game = gameService.getById(agent.getGameId());
@@ -270,6 +276,12 @@ public class CallBackServiceImpl implements ICallBackService {
                 tencentMiniGameBackRpc.backRoleRegister(tencentRoleRegisterRpcDTO);
                 gameBackLogService.addLog(user.getId(), gameUserRole.getRoleId(), "腾讯小游戏创角回传提交", JsonUtil.toString(tencentRoleRegisterRpcDTO));
             }
+            //腾讯APP私域
+            if (Objects.equals(agent.getAccountType(), AccountTypeEnum.TENCENT_APP_API.getValue())) {
+                TencentRoleRegisterAppApiRpcDTO tencentRoleRegisterAppApiRpcDTO = this.transform(gameUserRole, user, agent);
+                tencentAppApiBackRpc.backRoleRegister(tencentRoleRegisterAppApiRpcDTO);
+                gameBackLogService.addLog(user.getId(), null, "腾讯APP私域创角回传提交", JsonUtil.toString(tencentRoleRegisterAppApiRpcDTO));
+            }
             //头条回传
             if (Objects.equals(agent.getAccountType(), AccountTypeEnum.BYTE.getValue())) {
                 Game game = gameService.getById(agent.getGameId());
@@ -326,6 +338,12 @@ public class CallBackServiceImpl implements ICallBackService {
                 tencentMiniGameBackRpc.backOrder(tencentOrderDTO);
                 gameBackLogService.addLog(user.getId(), platformOrderDTO.getOrderId(), "腾讯小游戏订单回传提交", JsonUtil.toString(tencentOrderDTO));
             }
+            //腾讯APP私域
+            if (Objects.equals(agent.getAccountType(), AccountTypeEnum.TENCENT_APP_API.getValue())) {
+                TencentOrderAppApiRpcDTO tencentOrderAppApiRpcDTO = this.transform(user, agent, platformOrderDTO);
+                tencentAppApiBackRpc.backOrder(tencentOrderAppApiRpcDTO);
+                gameBackLogService.addLog(user.getId(), platformOrderDTO.getOrderId(), "腾讯APP私域订单回传提交", JsonUtil.toString(tencentOrderAppApiRpcDTO));
+            }
             //头条回传
             if (Objects.equals(agent.getAccountType(), AccountTypeEnum.BYTE.getValue())) {
                 //判断游戏类型
@@ -538,4 +556,68 @@ public class CallBackServiceImpl implements ICallBackService {
                 .roleId(roleId)
                 .build();
     }
+
+    private TencentUserAppApiRpcDTO transform(User user, Agent agent, String callbackId) {
+        return TencentUserAppApiRpcDTO.builder()
+                .backPolicyId(agent.getBackPolicyId())
+                .userId(user.getId().toString())
+                .gameId(agent.getGameId())
+                .adAccountId(agent.getAccountId())
+                .registerTime(user.getCreateTime())
+                .channel(agent.getAgentKey())
+                .mac(user.getMac())
+                .imei(user.getImei())
+                .oaid(user.getOaid())
+                .androidId(user.getAndroidId())
+                .idfa(user.getIdfa())
+                .caid(user.getCaid())
+                .regIp(user.getIp())
+                .userActionSetId(agent.getUserActionSetId())
+                .callbackId(Strings.isBlank(callbackId) ? null : Long.valueOf(callbackId))
+                .build();
+    }
+
+    private TencentRoleRegisterAppApiRpcDTO transform(GameUserRole gameUserRole, User user, Agent agent) {
+        return TencentRoleRegisterAppApiRpcDTO.builder()
+                .backPolicyId(agent.getBackPolicyId())
+                .userId(user.getId().toString())
+                .gameId(agent.getGameId())
+                .adAccountId(agent.getAccountId())
+                .registerTime(user.getCreateTime())
+                .channel(agent.getAgentKey())
+                .roleId(gameUserRole.getRoleId())
+                .roleName(gameUserRole.getRoleName())
+                .mac(user.getMac())
+                .imei(user.getImei())
+                .oaid(user.getOaid())
+                .androidId(user.getAndroidId())
+                .idfa(user.getIdfa())
+                .caid(user.getCaid())
+                .build();
+    }
+
+    private TencentOrderAppApiRpcDTO transform(User user, Agent agent, PlatformOrderDTO platformOrderDTO) {
+        return TencentOrderAppApiRpcDTO.builder()
+                .backPolicyId(agent.getBackPolicyId())
+                .userId(user.getId().toString())
+                .gameId(agent.getGameId())
+                .adAccountId(agent.getAccountId())
+                .registerTime(user.getCreateTime())
+                .rechargeMoney(platformOrderDTO.getAmount().multiply(new BigDecimal(100)).longValue())
+                .rechargeTime(platformOrderDTO.getCreateTime())
+                .orderId(platformOrderDTO.getOrderId())
+                .channel(agent.getAgentKey())
+                .orderStatus(platformOrderDTO.getStatus())
+                .payTime(platformOrderDTO.getPayTime())
+                .roleId(platformOrderDTO.getRoleId())
+                .roleName(platformOrderDTO.getRoleName())
+                .mac(user.getMac())
+                .imei(user.getImei())
+                .oaid(user.getOaid())
+                .androidId(user.getAndroidId())
+                .idfa(user.getIdfa())
+                .caid(user.getCaid())
+                .build();
+
+    }
 }