@@ -9,9 +9,4 @@ import org.springframework.stereotype.Component;
@Component
@RefreshScope
public class NacosDynamicParamConfig {
- /**
- * 按关键行为回传的广告账号列表
- */
- @Value("${nacos.dynamic.backOfKeyAccountIds:test}")
- private String backOfKeyAccountIds;
}
@@ -96,6 +96,7 @@ public class BackPolicyController {
checkDownLevel(dto.getFirstDownLevel());
checkDownLevel(dto.getRechargeDownLevel());
checkDownLevel(dto.getMarkUpDownLevel());
+ checkSplitStrategy(dto.getSplitStrategy());
if (dto.getFirstBackCountOfUser() != null && dto.getFirstBackCountOfUser() < 1) {
throw new BaseException("单用户最大回传次数不能小于 1");
@@ -136,4 +137,37 @@ public class BackPolicyController {
+
+ private void checkSplitStrategy(List<GameBackPolicyVO.SplitStrategy> splitStrategyList) {
+ if (CollectionUtils.isEmpty(splitStrategyList)) {
+ return;
+ }
+ splitStrategyList.sort((val1, val2) -> val1.getPayMoney().compareTo(val2.getPayMoney()));
+ BigDecimal compareMoney = null;
+ for (GameBackPolicyVO.SplitStrategy splitStrategy : splitStrategyList) {
+ if (splitStrategy.getPayMoney() == null
+ || CollectionUtils.isEmpty(splitStrategy.getSplitList())
+ || splitStrategy.getBetweenMinuteMin() == null
+ || splitStrategy.getBetweenMinuteMax() == null) {
+ throw new BaseException("拆单策略参数错误");
+ if (splitStrategy.getPayMoney().compareTo(BigDecimal.ZERO) <= 0) {
+ throw new BaseException("拆单策略支付金额错误![" + splitStrategy.getPayMoney() + "]");
+ splitStrategy.getSplitList().forEach(splitMoney -> {
+ if (splitMoney == null || splitMoney.compareTo(BigDecimal.ZERO) <= 0) {
+ throw new BaseException("拆单策略拆分金额错误![" + splitMoney + "]");
+ });
+ if (splitStrategy.getBetweenMinuteMin() < 1 || splitStrategy.getBetweenMinuteMin() >= 60) {
+ throw new BaseException("拆单策略间隔时间错误![" + splitStrategy.getBetweenMinuteMin() + "]");
+ if (splitStrategy.getBetweenMinuteMax() < 1 || splitStrategy.getBetweenMinuteMax() >= 60) {
+ throw new BaseException("拆单策略间隔时间错误![" + splitStrategy.getBetweenMinuteMax() + "]");
+ if (splitStrategy.getBetweenMinuteMin().compareTo(splitStrategy.getBetweenMinuteMax()) >= 0) {
+ throw new BaseException("拆单策略间隔时间错误![" + splitStrategy.getBetweenMinuteMin() + ">=" + splitStrategy.getBetweenMinuteMax() + "]");
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zanxiang.erp.security.annotation.PreAuthorize;
import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineOrderLogDTO;
import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineUserLogDTO;
+import com.zanxiang.game.back.serve.pojo.dto.OrderReportDTO;
import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineOrderLogVO;
import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineUserLogVO;
import com.zanxiang.game.back.serve.service.IGameOceanengineOrderLogService;
@@ -13,7 +14,9 @@ import com.zanxiang.module.util.exception.BaseException;
import com.zanxiang.module.util.pojo.ResultVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -43,10 +46,35 @@ public class OceanengineLogController {
@PostMapping("/orderReport/{ids}/{backMoney}")
@ApiOperation(value = "头条订单手动上报")
public ResultVO<Boolean> oceanengineOrderReport(@PathVariable("ids") List<Long> ids, @PathVariable("backMoney") BigDecimal backMoney) {
- if (backMoney.compareTo(BigDecimal.ZERO) <= 0) {
- throw new BaseException("回传金额错误!");
+ OrderReportDTO dto = new OrderReportDTO();
+ dto.setOrderIds(ids);
+ dto.setSplitOrder(false);
+ dto.setBackMoney(backMoney);
+ return oceanengineOrderReport(dto);
+ @PreAuthorize(permissionKey = "gameBack:oceanengine:orderReport")
+ @PostMapping("/orderReport")
+ @ApiOperation(value = "头条订单手动上报")
+ public ResultVO<Boolean> oceanengineOrderReport(@Validated @RequestBody OrderReportDTO dto) {
+ if (CollectionUtils.isEmpty(dto.getOrderIds())) {
+ throw new BaseException("参数错误!");
+ if (dto.getSplitOrder()) {
+ if (CollectionUtils.isEmpty(dto.getSplitMoney())) {
+ throw new BaseException("回传金额错误!");
+ dto.getSplitMoney().forEach(backMoney -> {
+ if (backMoney.compareTo(BigDecimal.ZERO) <= 0) {
+ } else {
+ if (dto.getBackMoney().compareTo(BigDecimal.ZERO) <= 0) {
- return ResultVO.ok(oceanengineOrderLogService.oceanengineOrderReport(ids, NumberUtil.multiply100(backMoney).longValue()));
+ return ResultVO.ok(oceanengineOrderLogService.oceanengineOrderReport(dto));
@PreAuthorize(permissionKey = "gameBack:oceanengine:userLogs")
import com.zanxiang.game.back.serve.pojo.dto.GameTencentOrderDTO;
import com.zanxiang.game.back.serve.pojo.dto.GameTencentUserDTO;
import com.zanxiang.game.back.serve.pojo.vo.GameTencentOrderVO;
import com.zanxiang.game.back.serve.pojo.vo.GameTencentUserVO;
import com.zanxiang.game.back.serve.service.IGameTencentOrderService;
@@ -43,10 +46,35 @@ public class TencentLogController {
@ApiOperation(value = "腾讯订单手动上报")
public ResultVO<Boolean> tencentOrderReport(@PathVariable("ids") List<Long> ids, @PathVariable("backMoney") BigDecimal backMoney) {
- if(backMoney.compareTo(BigDecimal.ZERO) <= 0) {
+ return tencentOrderReport(dto);
+ @PreAuthorize(permissionKey = "gameBack:tencent:orderReport")
+ @ApiOperation(value = "腾讯订单手动上报")
+ public ResultVO<Boolean> tencentOrderReport(@Validated @RequestBody OrderReportDTO dto) {
- return ResultVO.ok(tencentOrderService.tencentOrderReport(ids, NumberUtil.multiply100(backMoney).longValue()));
+ return ResultVO.ok(tencentOrderService.tencentOrderReport(dto));
@PreAuthorize(permissionKey = "gameBack:tencent:userLogs")
import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameOrderDTO;
import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameUserDTO;
import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameOrderVO;
import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameUserVO;
import com.zanxiang.game.back.serve.service.IGameTencentMiniGameOrderService;
@@ -43,10 +46,35 @@ public class TencentMiniGameLogController {
+ @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:orderReport")
- return ResultVO.ok(gameTencentMiniGameOrderService.doReport(ids, NumberUtil.multiply100(backMoney).longValue()));
+ return ResultVO.ok(gameTencentMiniGameOrderService.doReport(dto));
@PreAuthorize(permissionKey = "gameBack:tencentMiniGame:userLogs")
@@ -0,0 +1,7 @@
+package com.zanxiang.game.back.serve.dao.mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderSplitLog;
+public interface GameOceanengineOrderSplitLogMapper extends BaseMapper<GameOceanengineOrderSplitLog> {
+}
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrderSplitLog;
+public interface GameTencentMiniGameOrderSplitLogMapper extends BaseMapper<GameTencentMiniGameOrderSplitLog> {
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrderSplitLog;
+public interface GameTencentOrderSplitLogMapper extends BaseMapper<GameTencentOrderSplitLog> {
@@ -256,5 +256,7 @@ public class GameBackPolicyDTO implements Serializable {
*/
private BigDecimal supperSmallAmount;
+ private List<GameBackPolicyVO.SplitStrategy> splitStrategy;
@@ -0,0 +1,21 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+import lombok.Data;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+@Data
+public class OrderReportDTO {
+ @NotNull(message = "订单列表不能为空")
+ private List<Long> orderIds;
+ @NotNull(message = "参数错误!")
+ private Boolean splitOrder;
+ private BigDecimal backMoney;
+ private List<BigDecimal> splitMoney;
@@ -222,5 +222,10 @@ public class GameBackPolicy implements Serializable {
private Long supperSmallAmount;
+ /**
+ * 拆单策略
+ */
+ private String splitStrategy;
@@ -0,0 +1,50 @@
+package com.zanxiang.game.back.serve.pojo.entity;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+/**
+ * 拆单回传
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_oceanengine_order_split_log")
+public class GameOceanengineOrderSplitLog implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+ private LocalDate backDay;
+ private String orderNo;
+ private Integer backIndex;
+ private Integer backCount;
+ private Long splitMoney;
+ private LocalDateTime backTime;
+ private LocalDateTime executeTime;
+ private Integer backStatus;
+ private String backErrorMsg;
+ private LocalDateTime createTime;
+@TableName("t_game_tencent_mini_game_order_split_log")
+public class GameTencentMiniGameOrderSplitLog implements Serializable {
+@TableName("t_game_tencent_order_split_log")
+public class GameTencentOrderSplitLog implements Serializable {
@@ -14,6 +14,10 @@ public enum BackStatusEnum {
* 回传成功
SUCCESS(1),
+ * 部分成功
+ SUCCESS_PART(2),
/**
* 回传失败
@@ -242,6 +242,11 @@ public class GameBackPolicyVO implements Serializable {
+ private List<SplitStrategy> splitStrategy;
@Data
@NoArgsConstructor
@AllArgsConstructor
@@ -255,5 +260,28 @@ public class GameBackPolicyVO implements Serializable {
private BigDecimal backMoney;
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Builder
+ public static class SplitStrategy {
+ * 支付金额
+ private BigDecimal payMoney;
+ * 拆分金额
+ private List<BigDecimal> splitList;
+ * 回传间隔时间(/分钟)
+ private Integer betweenMinuteMin;
+ private Integer betweenMinuteMax;
@@ -7,6 +7,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
* 头条订单上报日志
@@ -78,4 +79,7 @@ public class GameOceanengineOrderLogVO {
@ApiModelProperty("回传日志")
private String backMsg;
+ @ApiModelProperty("回传拆分订单")
+ private List<GameOceanengineOrderSplitLogVO> splitOrderList;
@@ -0,0 +1,33 @@
+package com.zanxiang.game.back.serve.pojo.vo;
+public class GameOceanengineOrderSplitLogVO {
+ private BigDecimal splitMoney;
* <p>
@@ -118,4 +119,7 @@ public class GameTencentMiniGameOrderVO {
+ private List<GameTencentMiniOrderSplitLogVO> splitOrderList;
+public class GameTencentMiniOrderSplitLogVO {
+public class GameTencentOrderSplitLogVO {
@@ -9,6 +9,7 @@ import lombok.NoArgsConstructor;
import java.io.Serializable;
@@ -134,4 +135,7 @@ public class GameTencentOrderVO {
+ private List<GameTencentOrderSplitLogVO> splitOrderList;
@@ -85,7 +85,7 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
log.error("腾讯小游戏订单回传失败,找不到回传的用户 orderId: {}", orderLog.getOrderId());
return ResultVO.fail("找不到回传用户");
} else {
- return ResultVO.ok(gameTencentMiniGameOrderService.orderBack(orderLog, false, null));
+ return ResultVO.ok(gameTencentMiniGameOrderService.orderBack(orderLog));
@@ -74,7 +74,7 @@ public class TencentUserActionBackRpcImpl implements ITencentUserActionBackRpc {
.isFirstOrder(isFirstOrder)
.build();
gameTencentOrderService.save(gameTencentOrder);
- return ResultVO.ok(gameTencentOrderService.orderBack(gameTencentOrder, false, null));
+ return ResultVO.ok(gameTencentOrderService.orderBack(gameTencentOrder));
@Override
@@ -96,7 +96,7 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
) == null;
orderLog.setIsFirstOrder(isFirstOrder);
gameOceanengineOrderLogService.save(orderLog);
- return ResultVO.ok(gameOceanengineOrderLogService.callback(orderLog, false, null));
+ return ResultVO.ok(gameOceanengineOrderLogService.callback(orderLog));
@@ -2,17 +2,21 @@ package com.zanxiang.game.back.serve.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.sd4324530.jtuple.Tuple2;
import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
import java.util.List;
public interface IGameOceanengineOrderLogService extends IService<GameOceanengineOrderLog> {
- boolean callback(GameOceanengineOrderLog orderLog, boolean mustBack, Long backMoneyOfInput);
+ boolean callback(GameOceanengineOrderLog orderLog);
IPage<GameOceanengineOrderLogVO> oceanengineOrderLogList(GameOceanengineOrderLogDTO dto);
+ boolean oceanengineOrderReport(OrderReportDTO dto);
- boolean oceanengineOrderReport(List<Long> ids, Long backMoney);
+ Tuple2<BackStatusEnum, String> doCallback(GameOceanengineOrderLog orderLog, Long backMoney);
@@ -0,0 +1,13 @@
+package com.zanxiang.game.back.serve.service;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineOrderSplitLogVO;
+import java.util.Collection;
+public interface IGameOceanengineOrderSplitLogService extends IService<GameOceanengineOrderSplitLog> {
+ List<GameOceanengineOrderSplitLogVO> listByOrderNo(Collection<String> orderNos);
@@ -1,6 +1,7 @@
package com.zanxiang.game.back.serve.service;
import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameBackLog;
import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameRoleRegister;
@@ -9,9 +10,9 @@ import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
public interface IGameTencentMiniGameBackLogService extends IService<GameTencentMiniGameBackLog> {
- BackStatusEnum userBack(GameTencentMiniGameUser userLog);
+ Tuple2<BackStatusEnum, String> userBack(GameTencentMiniGameUser userLog);
- BackStatusEnum orderBack(GameTencentMiniGameOrder orderLog);
+ Tuple2<BackStatusEnum, String> orderBack(GameTencentMiniGameOrder orderLog, Long backMoney);
BackStatusEnum roleRegisterBack(GameTencentMiniGameRoleRegister roleRegisterLog);
@@ -3,6 +3,7 @@ package com.zanxiang.game.back.serve.service;
@@ -10,9 +11,9 @@ import java.util.List;
public interface IGameTencentMiniGameOrderService extends IService<GameTencentMiniGameOrder> {
- boolean orderBack(GameTencentMiniGameOrder orderLog, boolean mustBack, Long backMoneyOfInput);
+ boolean orderBack(GameTencentMiniGameOrder orderLog);
IPage<GameTencentMiniGameOrderVO> listOfPage(GameTencentMiniGameOrderDTO dto);
- boolean doReport(List<Long> orderLogIds, Long backMoney);
+ boolean doReport(OrderReportDTO dto);
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniOrderSplitLogVO;
+public interface IGameTencentMiniGameOrderSplitLogService extends IService<GameTencentMiniGameOrderSplitLog> {
+ List<GameTencentMiniOrderSplitLogVO> listByOrderNo(Collection<String> orderNos);
@@ -1,10 +1,13 @@
import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyListDTO;
import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
@@ -19,9 +22,11 @@ import java.util.List;
public interface IGameTencentOrderService extends IService<GameTencentOrder> {
- boolean orderBack(GameTencentOrder tencentOrder, boolean mustBack, Long backMoneyOfInput);
+ boolean orderBack(GameTencentOrder tencentOrder);
IPage<GameTencentOrderVO> tencentOrderLogList(GameTencentOrderDTO dto);
- boolean tencentOrderReport(List<Long> ids, Long backMoney);
+ boolean tencentOrderReport(OrderReportDTO dto);
+ Tuple2<BackStatusEnum, String> doCallback(GameTencentOrder orderLog, Long backMoney);
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentOrderSplitLogVO;
+public interface IGameTencentOrderSplitLogService extends IService<GameTencentOrderSplitLog> {
+ List<GameTencentOrderSplitLogVO> listByOrderNo(Collection<String> orderNos);
@@ -17,6 +17,7 @@ import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
import com.zanxiang.game.back.serve.service.IGameTencentBackLogService;
import com.zanxiang.game.back.serve.service.IGameTencentUserService;
+import com.zanxiang.module.util.JsonUtil;
import com.zanxiang.module.util.NumberUtil;
import com.zanxiang.module.util.bean.BeanUtil;
import com.zanxiang.module.util.exception.BaseException;
@@ -121,6 +122,7 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
.markUpBackCountOfUser(dto.getMarkUpBackCountOfUser())
.largeAmount(dto.getLargeAmount() == null ? null : NumberUtil.multiply100(dto.getLargeAmount()).longValue())
.supperSmallAmount(dto.getSupperSmallAmount() == null ? null : NumberUtil.multiply100(dto.getSupperSmallAmount()).longValue())
+ .splitStrategy(CollectionUtils.isEmpty(dto.getSplitStrategy()) ? null : JsonUtil.toString(dto.getSplitStrategy()))
return gameBackPolicyService.save(backPolicy);
@@ -173,6 +175,7 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
return gameBackPolicyService.updateById(backPolicy);
@@ -226,6 +229,9 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
.collect(Collectors.toList())
);
+ if (StringUtils.isNotBlank(gameBackPolicy.getSplitStrategy())) {
+ vo.setSplitStrategy((List<GameBackPolicyVO.SplitStrategy>) JsonUtil.toList(gameBackPolicy.getSplitStrategy(), List.class, GameBackPolicyVO.SplitStrategy.class));
return vo;
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.sd4324530.jtuple.Tuple3;
import com.github.sd4324530.jtuple.Tuples;
import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
@@ -14,28 +15,35 @@ import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineOrderLogMapper;
import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
import com.zanxiang.game.back.serve.oceanengine.OceanengineCallbackException;
import com.zanxiang.game.back.serve.pojo.entity.*;
import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
import com.zanxiang.game.back.serve.pojo.enums.BackUnitEnum;
import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
import com.zanxiang.game.back.serve.service.IGameOceanengineBackLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineOrderSplitLogService;
import com.zanxiang.game.back.serve.service.IGameOceanengineUserLogService;
import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
import com.zanxiang.game.back.serve.utils.OrderUtil;
import com.zanxiang.game.module.base.ServerInfo;
import com.zanxiang.game.module.base.pojo.vo.AgentRpcVO;
import com.zanxiang.game.module.base.rpc.IAgentRpc;
+import com.zanxiang.module.util.NumberUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalTime;
import java.util.ArrayList;
@@ -64,50 +72,83 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
private IAgentRpc agentRpc;
@Autowired
private NacosDynamicParamConfig dynamicParamConfig;
+ @Autowired
+ private IGameOceanengineOrderSplitLogService gameOceanengineOrderSplitLogService;
@Transactional(rollbackFor = Exception.class)
- public boolean callback(GameOceanengineOrderLog orderLog, boolean mustBack, Long backMoneyOfInput) {
- boolean doBack;
- Long backMoney;
- String backMsg;
- if (mustBack) {
- doBack = true;
- backMoney = backMoneyOfInput;
- backMsg = "手动触发的回传";
- } else {
- if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) {
- // 头条只要回传支付订单
- return true;
- }
- // 用户回传失败
- GameOceanengineUserLog userLog = userLog(orderLog);
- if (userLog == null) {
- doBack = false;
- backMoney = orderLog.getAmount();
- backMsg = "回传失败!找不到回传用户";
- GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
- Tuple3<Boolean, Long, String> backInfo = BackPolicyUtil.backOrder(orderLog.getOrderNo(), gameBackPolicy, orderLog.getAmount(),
- orderLog.getIsFirstOrder(),
- orderLog.getPayTime(),
- // 此处使用用户最近一次的重新染色时间
- userLog.getCreateTime(),
- orderLog.getOpenId(),
- new OceanengineOrderBackPolicyCheck(this, userLog, orderLog, gameBackPolicy)
+ public boolean callback(GameOceanengineOrderLog orderLog) {
+ if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) {
+ // 头条只要回传支付订单
+ return true;
+ GameOceanengineUserLog userLog = userLog(orderLog);
+ if (userLog == null) {
+ // 找不到用户
+ return update(new LambdaUpdateWrapper<GameOceanengineOrderLog>()
+ .set(GameOceanengineOrderLog::getBackStatus, BackStatusEnum.NO)
+ .set(GameOceanengineOrderLog::getBackMoney, orderLog.getAmount())
+ .set(GameOceanengineOrderLog::getBackMsg, "回传失败!找不到回传用户")
+ .eq(GameOceanengineOrderLog::getId, orderLog.getId())
+ );
+ GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
+ Tuple3<Boolean, Long, String> backInfo = BackPolicyUtil.backOrder(orderLog.getOrderNo(), gameBackPolicy, orderLog.getAmount(),
+ orderLog.getIsFirstOrder(),
+ orderLog.getPayTime(),
+ // 此处使用用户最近一次的重新染色时间
+ userLog.getCreateTime(),
+ orderLog.getOpenId(),
+ new OceanengineOrderBackPolicyCheck(this, userLog, orderLog, gameBackPolicy)
+ boolean doBack = backInfo.first;
+ Long backMoney = backInfo.second;
+ String backMsg = backInfo.third;
+ if (!doBack) {
+ // 不回传
+ .set(GameOceanengineOrderLog::getBackStatus, BackStatusEnum.NO.getBackStatus())
+ .set(GameOceanengineOrderLog::getBackMoney, backMoney)
+ .set(GameOceanengineOrderLog::getBackMsg, backMsg)
+ // 拆单
+ Tuple3<Boolean, Long, List<Tuple2<Long, LocalDateTime>>> splitResult = BackPolicyUtil.splitOrder(gameBackPolicy, backMoney);
+ if (splitResult.first) {
+ // 需要拆单
+ List<GameOceanengineOrderSplitLog> splitOrderLogList = new ArrayList<>(splitResult.third.size());
+ for (int i = 0; i < splitResult.third.size(); i++) {
+ Tuple2<Long, LocalDateTime> splitOrder = splitResult.third.get(i);
+ splitOrderLogList.add(GameOceanengineOrderSplitLog.builder()
+ .backDay(splitOrder.second.toLocalDate())
+ .orderNo(orderLog.getOrderNo())
+ .backIndex(i + 1)
+ .backCount(splitResult.third.size())
+ .splitMoney(splitOrder.first)
+ .backTime(splitOrder.second)
+ .backStatus(BackStatusEnum.NO.getBackStatus())
+ .createTime(LocalDateTime.now())
+ .build()
- doBack = backInfo.first;
- backMoney = backInfo.second;
- backMsg = backInfo.third;
+ gameOceanengineOrderSplitLogService.saveBatch(splitOrderLogList);
+ .set(GameOceanengineOrderLog::getBackMoney, splitResult.second)
- BackStatusEnum backStatus = BackStatusEnum.NO;
- orderLog.setBackMoney(backMoney);
- if (doBack) {
- backStatus = doCallback(orderLog);
+ Tuple2<BackStatusEnum, String> backResult = doCallback(orderLog, backMoney);
+ if (StringUtils.isNotBlank(backResult.second)) {
+ backMsg = backMsg + ("回传失败:" + backResult.second);
return update(new LambdaUpdateWrapper<GameOceanengineOrderLog>()
- .set(GameOceanengineOrderLog::getBackStatus, backStatus.getBackStatus())
+ .set(GameOceanengineOrderLog::getBackStatus, backResult.first.getBackStatus())
.set(GameOceanengineOrderLog::getBackMoney, backMoney)
.set(GameOceanengineOrderLog::getBackMsg, backMsg)
.eq(GameOceanengineOrderLog::getId, orderLog.getId())
@@ -141,47 +182,62 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
return result;
- private List<GameOceanengineOrderLogVO> toVOBatch(List<GameOceanengineOrderLog> logList) {
- if (CollectionUtils.isEmpty(logList)) {
- return Collections.emptyList();
- Set<String> agentKeys = logList.stream().map(GameOceanengineOrderLog::getAgentKey).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
- Map<String, AgentRpcVO> agentMap = CollectionUtils.isEmpty(agentKeys) ? Collections.emptyMap() : agentRpc.getByAgentKeys(new ArrayList<>(agentKeys))
- .getData().stream().collect(Collectors.toMap(AgentRpcVO::getAgentKey, Function.identity()));
- return logList.stream().map(log -> {
- GameOceanengineOrderLogVO vo = toVOSimple(log);
- if (StringUtils.isNotBlank(log.getAgentKey())) {
- AgentRpcVO agent = agentMap.get(log.getAgentKey());
- if (agent != null) {
- vo.setAgentName(agent.getAgentName());
- return vo;
- }).collect(Collectors.toList());
-
- private GameOceanengineOrderLogVO toVOSimple(GameOceanengineOrderLog log) {
- if (log == null) {
- return null;
- GameOceanengineOrderLogVO vo = BeanUtil.copy(log, GameOceanengineOrderLogVO.class);
- vo.setRegPayIntervalTime(OrderUtil.regPayIntervalTime(log.getPayTime(), log.getRegTime()));
- public boolean oceanengineOrderReport(List<Long> ids, Long backMoney) {
- listByIds(ids).stream()
+ public boolean oceanengineOrderReport(OrderReportDTO dto) {
+ listByIds(dto.getOrderIds()).stream()
.filter(order -> !Objects.equals(order.getBackStatus(), BackStatusEnum.SUCCESS.getBackStatus()))
.forEach(orderLog -> {
- log.error("手动回传:{}-{}", orderLog.getId(), backMoney);
- callback(orderLog, true, backMoney);
+ log.error("手动拆单回传:{}-{}", orderLog.getId(), StringUtils.join(dto.getSplitMoney(), ","));
+ List<GameOceanengineOrderSplitLog> splitOrderLogList = new ArrayList<>(dto.getSplitMoney().size());
+ LocalDateTime beginTime = LocalDateTime.now();
+ long backMoneyTotal = 0L;
+ for (int i = 0; i < dto.getSplitMoney().size(); i++) {
+ long backMoney = NumberUtil.multiply100(dto.getSplitMoney().get(i)).longValue();
+ backMoneyTotal += backMoney;
+ LocalDateTime backTime = beginTime;
+ .backDay(backTime.toLocalDate())
+ .backCount(dto.getSplitMoney().size())
+ .splitMoney(backMoney)
+ .backTime(backTime)
+ beginTime = beginTime.plusMinutes(RandomUtils.nextInt(3, 10));
+ update(new LambdaUpdateWrapper<GameOceanengineOrderLog>()
+ .set(GameOceanengineOrderLog::getBackMoney, backMoneyTotal)
+ .set(GameOceanengineOrderLog::getBackMsg, "手动触发回传(拆单回传)")
+ log.error("手动直接回传:{}-{}", orderLog.getId(), dto.getBackMoney());
+ long backMoney = NumberUtil.multiply100(dto.getBackMoney()).longValue();
+ String backMsg = "手动触发回传";
+ backMsg += ("回传失败:" + backResult.second);
});
return true;
- private BackStatusEnum doCallback(GameOceanengineOrderLog orderLog) {
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Tuple2<BackStatusEnum, String> doCallback(GameOceanengineOrderLog orderLog, Long backMoney) {
GameOceanengineUserLog userLog = userLog(orderLog);
if (userLog == null) {
gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
@@ -197,18 +253,16 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
.backStatus(BackStatusEnum.FAILED.getBackStatus())
.errMsg("找不到用户注册信息")
.build());
- return BackStatusEnum.FAILED;
+ return Tuple2.with(BackStatusEnum.FAILED, "找不到用户注册信息");
- Set<Long> keyAccountIds = StringUtils.isBlank(dynamicParamConfig.getBackOfKeyAccountIds()) ? Collections.emptySet() :
- Arrays.stream(dynamicParamConfig.getBackOfKeyAccountIds().split(",")).map(Long::parseLong).collect(Collectors.toSet());
- Integer eventType = keyAccountIds.contains(orderLog.getAccountId()) ? MiniGameCallback.EventType.GAME_ADDICTION.getEventType() : MiniGameCallback.EventType.ACTIVE_PAY.getEventType();
+ Integer eventType = MiniGameCallback.EventType.ACTIVE_PAY.getEventType();
MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
.clue_token(userLog.getClueToken())
.open_id(orderLog.getOpenId())
.union_id(orderLog.getUnionId())
.event_type(String.valueOf(eventType))
.props(MiniGameCallback.MiniGameCallbackRequest.MiniGameCallbackRequestProps.builder()
- .pay_amount(orderLog.getBackMoney())
+ .pay_amount(backMoney)
.build())
BackStatusEnum backStatus = BackStatusEnum.SUCCESS;
@@ -237,7 +291,40 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
.backStatus(backStatus.getBackStatus())
.errMsg(errMsg)
- return backStatus;
+ return Tuple2.with(backStatus, errMsg);
+ private List<GameOceanengineOrderLogVO> toVOBatch(List<GameOceanengineOrderLog> logList) {
+ if (CollectionUtils.isEmpty(logList)) {
+ return Collections.emptyList();
+ List<GameOceanengineOrderSplitLogVO> orderSplitList = gameOceanengineOrderSplitLogService.listByOrderNo(logList.stream().map(GameOceanengineOrderLog::getOrderNo).collect(Collectors.toSet()));
+ Set<String> agentKeys = logList.stream().map(GameOceanengineOrderLog::getAgentKey).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
+ Map<String, AgentRpcVO> agentMap = CollectionUtils.isEmpty(agentKeys) ? Collections.emptyMap() : agentRpc.getByAgentKeys(new ArrayList<>(agentKeys))
+ .getData().stream().collect(Collectors.toMap(AgentRpcVO::getAgentKey, Function.identity()));
+ return logList.stream().map(log -> {
+ GameOceanengineOrderLogVO vo = toVOSimple(log);
+ if (StringUtils.isNotBlank(log.getAgentKey())) {
+ AgentRpcVO agent = agentMap.get(log.getAgentKey());
+ if (agent != null) {
+ vo.setAgentName(agent.getAgentName());
+ List<GameOceanengineOrderSplitLogVO> splitList = orderSplitList.stream().filter(obj -> obj.getOrderNo().equals(log.getOrderNo())).collect(Collectors.toList());
+ vo.setSplitOrderList(splitList);
+ return vo;
+ }).collect(Collectors.toList());
+ private GameOceanengineOrderLogVO toVOSimple(GameOceanengineOrderLog log) {
+ if (log == null) {
+ return null;
+ GameOceanengineOrderLogVO vo = BeanUtil.copy(log, GameOceanengineOrderLogVO.class);
+ vo.setRegPayIntervalTime(OrderUtil.regPayIntervalTime(log.getPayTime(), log.getRegTime()));
private GameOceanengineUserLog userLog(GameOceanengineOrderLog orderLog) {
@@ -0,0 +1,47 @@
+package com.zanxiang.game.back.serve.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineOrderSplitLogMapper;
+import com.zanxiang.module.util.bean.BeanUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import java.util.Collections;
+import java.util.stream.Collectors;
+@Slf4j
+@Service
+public class GameOceanengineOrderSplitLogServiceImpl extends ServiceImpl<GameOceanengineOrderSplitLogMapper, GameOceanengineOrderSplitLog>
+ implements IGameOceanengineOrderSplitLogService {
+ public List<GameOceanengineOrderSplitLogVO> listByOrderNo(Collection<String> orderNos) {
+ if (CollectionUtils.isEmpty(orderNos)) {
+ return list(new LambdaQueryWrapper<GameOceanengineOrderSplitLog>()
+ .eq(GameOceanengineOrderSplitLog::getOrderNo, orderNos)
+ .orderByAsc(GameOceanengineOrderSplitLog::getBackIndex)
+ ).stream().map(this::toVOSimple).collect(Collectors.toList());
+ private GameOceanengineOrderSplitLogVO toVOSimple(GameOceanengineOrderSplitLog log) {
+ GameOceanengineOrderSplitLogVO vo = BeanUtil.copy(log, GameOceanengineOrderSplitLogVO.class);
+ if (log.getSplitMoney() != null) {
+ vo.setSplitMoney(NumberUtil.divide100(new BigDecimal(log.getSplitMoney())));
package com.zanxiang.game.back.serve.service.impl;
import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameBackLogMapper;
@@ -40,7 +41,7 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
- public BackStatusEnum userBack(GameTencentMiniGameUser userLog) {
+ public Tuple2<BackStatusEnum, String> userBack(GameTencentMiniGameUser userLog) {
GameTencentMiniGameBackLog backLog = GameTencentMiniGameBackLog.builder()
.gameId(userLog.getGameId())
.adAccountId(userLog.getAdAccountId())
@@ -51,14 +52,16 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
.actionType(ActionTypeEnum.REGISTER.getActionType())
.createTime(LocalDateTime.now())
- callback(backLog);
+ Tuple2<BackStatusEnum, String> backResult = callback(backLog);
+ backLog.setBackStatus(backResult.first.getBackStatus());
+ backLog.setErrMsg(backResult.second);
save(backLog);
- return BackStatusEnum.getByValue(backLog.getBackStatus());
+ return backResult;
- public BackStatusEnum orderBack(GameTencentMiniGameOrder orderLog) {
+ public Tuple2<BackStatusEnum, String> orderBack(GameTencentMiniGameOrder orderLog, Long backMoney) {
String actionType = orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ?
ActionTypeEnum.PURCHASE.getActionType() : ActionTypeEnum.COMPLETE_ORDER.getActionType();
@@ -69,13 +72,15 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
.wechatOpenid(orderLog.getWechatOpenid())
.wechatAppId(orderLog.getWechatAppId())
.actionType(actionType)
- .amount(orderLog.getBackMoney())
+ .amount(backMoney)
.orderId(orderLog.getOrderId())
@@ -96,7 +101,7 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
return BackStatusEnum.getByValue(backLog.getBackStatus());
- private void callback(GameTencentMiniGameBackLog backLog) {
+ private Tuple2<BackStatusEnum, String> callback(GameTencentMiniGameBackLog backLog) {
Map<String, Object> actionParam = null;
if (backLog.getAmount() != null) {
actionParam = new HashMap<>(2);
@@ -119,16 +124,13 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
log.error("腾讯小游戏回传完成:{}", JsonUtil.toString(response.getBody()));
if (response.getStatusCode().is2xxSuccessful()) {
if (Objects.equals(response.getBody().get("code").toString(), "0")) {
- backLog.setBackStatus(BackStatusEnum.SUCCESS.getBackStatus());
- return;
+ return Tuple2.with(BackStatusEnum.SUCCESS, null);
- backLog.setBackStatus(BackStatusEnum.FAILED.getBackStatus());
- backLog.setErrMsg(JsonUtil.toString(response.getBody()));
+ return Tuple2.with(BackStatusEnum.FAILED, JsonUtil.toString(response.getBody()));
} catch (Exception e) {
log.error(e.getMessage(), e);
- backLog.setErrMsg(e.getMessage());
+ return Tuple2.with(BackStatusEnum.FAILED, e.getMessage());
import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
@@ -14,24 +15,31 @@ import com.zanxiang.erp.base.rpc.ISysUserRpc;
import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameOrderMapper;
import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameOrderSplitLogService;
import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
@@ -66,60 +74,91 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
private IGameBackPolicyService gameBackPolicyService;
@DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+ private IGameTencentMiniGameOrderSplitLogService gameTencentMiniGameOrderSplitLogService;
- public boolean orderBack(GameTencentMiniGameOrder orderLog, boolean mustBack, Long backMoneyOfInput) {
+ public boolean orderBack(GameTencentMiniGameOrder orderLog) {
if (StringUtils.isBlank(orderLog.getClickId())) {
// 没有点击 id(之后做监测链接,从监测链接里面找)
return false;
- // 只要回传 支付行为
- GameTencentMiniGameUser userLog = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
- .eq(GameTencentMiniGameUser::getGameId, orderLog.getGameId())
- .eq(GameTencentMiniGameUser::getWechatAppId, orderLog.getWechatAppId())
- .eq(GameTencentMiniGameUser::getWechatOpenid, orderLog.getWechatOpenid())
- .eq(GameTencentMiniGameUser::getAdAccountId, orderLog.getAdAccountId())
- .orderByDesc(GameTencentMiniGameUser::getCreateTime)
- .last("limit 1")
+ // 只要回传 支付行为
+ GameTencentMiniGameUser userLog = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
+ .eq(GameTencentMiniGameUser::getGameId, orderLog.getGameId())
+ .eq(GameTencentMiniGameUser::getWechatAppId, orderLog.getWechatAppId())
+ .eq(GameTencentMiniGameUser::getWechatOpenid, orderLog.getWechatOpenid())
+ .eq(GameTencentMiniGameUser::getAdAccountId, orderLog.getAdAccountId())
+ .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+ .last("limit 1")
+ return update(new LambdaUpdateWrapper<GameTencentMiniGameOrder>()
+ .set(GameTencentMiniGameOrder::getBackStatus, BackStatusEnum.FAILED.getBackStatus())
+ .set(GameTencentMiniGameOrder::getBackMoney, orderLog.getRechargeMoney())
+ .set(GameTencentMiniGameOrder::getBackMsg, "回传失败!找不到回传用户")
+ .eq(GameTencentMiniGameOrder::getId, orderLog.getId())
- backMoney = orderLog.getRechargeMoney();
- // 此处是否是首单用 limit 2。因为在执行判断之前订单已入库,所以库里只有一笔才是首单
- Tuple3<Boolean, Long, String> backInfo = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(),
- orderLog.getWechatOpenid(),
- new TencentMiniGameOrderBackPolicyCheck(this, gameBackPolicy, userLog, orderLog));
+ // 此处是否是首单用 limit 2。因为在执行判断之前订单已入库,所以库里只有一笔才是首单
+ Tuple3<Boolean, Long, String> backInfo = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(),
+ orderLog.getWechatOpenid(),
+ new TencentMiniGameOrderBackPolicyCheck(this, gameBackPolicy, userLog, orderLog));
+ .set(GameTencentMiniGameOrder::getBackStatus, BackStatusEnum.NO.getBackStatus())
+ .set(GameTencentMiniGameOrder::getBackMoney, backMoney)
+ .set(GameTencentMiniGameOrder::getBackMsg, backMsg)
+ List<GameTencentMiniGameOrderSplitLog> splitOrderLogList = new ArrayList<>(splitResult.third.size());
+ splitOrderLogList.add(GameTencentMiniGameOrderSplitLog.builder()
+ .orderNo(orderLog.getOrderId())
+ .build());
+ gameTencentMiniGameOrderSplitLogService.saveBatch(splitOrderLogList);
+ .set(GameTencentMiniGameOrder::getBackMoney, splitResult.second)
- backStatus = gameTencentMiniGameBackLogService.orderBack(orderLog);
+ Tuple2<BackStatusEnum, String> backResult = gameTencentMiniGameBackLogService.orderBack(orderLog, backMoney);
return update(new LambdaUpdateWrapper<GameTencentMiniGameOrder>()
- .set(GameTencentMiniGameOrder::getBackStatus, backStatus.getBackStatus())
+ .set(GameTencentMiniGameOrder::getBackStatus, backResult.first.getBackStatus())
.set(GameTencentMiniGameOrder::getBackMoney, backMoney)
.set(GameTencentMiniGameOrder::getBackMsg, backMsg)
.eq(GameTencentMiniGameOrder::getId, orderLog.getId())
@@ -154,12 +193,53 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
- public boolean doReport(List<Long> orderLogIds, Long backMoney) {
- listByIds(orderLogIds).stream()
+ public boolean doReport(OrderReportDTO dto) {
- orderBack(orderLog, true, backMoney);
+ List<GameTencentMiniGameOrderSplitLog> splitOrderLogList = new ArrayList<>(dto.getSplitMoney().size());
+ update(new LambdaUpdateWrapper<GameTencentMiniGameOrder>()
+ .set(GameTencentMiniGameOrder::getBackMoney, backMoneyTotal)
+ .set(GameTencentMiniGameOrder::getBackMsg, "手动触发回传(拆单回传)")
+ String backMsg = "手动触发回传!";
@@ -168,6 +248,7 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
if (CollectionUtils.isEmpty(logList)) {
return Collections.emptyList();
+ List<GameTencentMiniOrderSplitLogVO> orderSplitList = gameTencentMiniGameOrderSplitLogService.listByOrderNo(logList.stream().map(GameTencentMiniGameOrder::getOrderId).collect(Collectors.toList()));
Set<String> agentKeys = logList.stream().map(GameTencentMiniGameOrder::getAgentKey).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
Map<String, AgentRpcVO> agentMap = CollectionUtils.isEmpty(agentKeys) ? Collections.emptyMap() : agentRpc.getByAgentKeys(new ArrayList<>(agentKeys))
.getData().stream().collect(Collectors.toMap(AgentRpcVO::getAgentKey, Function.identity()));
@@ -179,6 +260,8 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
vo.setAgentName(agent.getAgentName());
+ List<GameTencentMiniOrderSplitLogVO> splitList = orderSplitList.stream().filter(obj -> obj.getOrderNo().equals(log.getOrderId())).collect(Collectors.toList());
}).collect(Collectors.toList());
+import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameOrderSplitLogMapper;
+public class GameTencentMiniGameOrderSplitLogServiceImpl extends ServiceImpl<GameTencentMiniGameOrderSplitLogMapper, GameTencentMiniGameOrderSplitLog>
+ implements IGameTencentMiniGameOrderSplitLogService {
+ public List<GameTencentMiniOrderSplitLogVO> listByOrderNo(Collection<String> orderNos) {
+ return list(new LambdaQueryWrapper<GameTencentMiniGameOrderSplitLog>()
+ .eq(GameTencentMiniGameOrderSplitLog::getOrderNo, orderNos)
+ .orderByAsc(GameTencentMiniGameOrderSplitLog::getBackIndex)
+ private GameTencentMiniOrderSplitLogVO toVOSimple(GameTencentMiniGameOrderSplitLog log) {
+ GameTencentMiniOrderSplitLogVO vo = BeanUtil.copy(log, GameTencentMiniOrderSplitLogVO.class);
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAppIdRpcDTO;
@@ -14,30 +15,36 @@ import com.zanxiang.erp.base.ErpServer;
import com.zanxiang.erp.base.rpc.ISysUserRpc;
import com.zanxiang.game.back.serve.pojo.entity.GameTencentBackLog;
import com.zanxiang.game.back.serve.dao.mapper.GameTencentOrderMapper;
import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum;
+import com.zanxiang.game.back.serve.service.IGameTencentOrderSplitLogService;
@@ -66,7 +73,8 @@ import java.util.stream.Collectors;
@Slf4j
@Service
-public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMapper, GameTencentOrder> implements IGameTencentOrderService {
+public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMapper, GameTencentOrder>
+ implements IGameTencentOrderService {
@DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
private IUserActionSetRpc userActionSetRpc;
@DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
@@ -79,54 +87,85 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
private IGameTencentUserService gameTencentUserService;
+ private IGameTencentOrderSplitLogService gameTencentOrderSplitLogService;
- public boolean orderBack(GameTencentOrder orderLog, boolean mustBack, Long backMoneyOfInput) {
- return false;
- GameTencentUser userLog = gameTencentUserService.getOne(new LambdaQueryWrapper<GameTencentUser>()
- .eq(GameTencentUser::getGameId, orderLog.getGameId())
- .eq(GameTencentUser::getWechatAppId, orderLog.getWechatAppId())
- .eq(GameTencentUser::getWechatOpenid, orderLog.getWechatOpenid())
- .eq(GameTencentUser::getAdAccountId, orderLog.getAdAccountId())
- .orderByDesc(GameTencentUser::getCreateTime)
- );if (userLog == null) {
- new TencentOrderBackPolicyCheck(this, gameBackPolicy, userLog, orderLog));
+ public boolean orderBack(GameTencentOrder orderLog) {
+ return false;
+ GameTencentUser userLog = gameTencentUserService.getOne(new LambdaQueryWrapper<GameTencentUser>()
+ .eq(GameTencentUser::getGameId, orderLog.getGameId())
+ .eq(GameTencentUser::getWechatAppId, orderLog.getWechatAppId())
+ .eq(GameTencentUser::getWechatOpenid, orderLog.getWechatOpenid())
+ .eq(GameTencentUser::getAdAccountId, orderLog.getAdAccountId())
+ .orderByDesc(GameTencentUser::getCreateTime)
+ return update(new LambdaUpdateWrapper<GameTencentOrder>()
+ .set(GameTencentOrder::getIsBack, BackStatusEnum.FAILED.getBackStatus())
+ .set(GameTencentOrder::getBackMoney, orderLog.getRechargeMoney())
+ .set(GameTencentOrder::getBackMsg, "回传失败!找不到回传用户")
+ .eq(GameTencentOrder::getId, orderLog.getId())
+ new TencentOrderBackPolicyCheck(this, gameBackPolicy, userLog, orderLog));
+ .set(GameTencentOrder::getIsBack, BackStatusEnum.NO.getBackStatus())
+ .set(GameTencentOrder::getBackMoney, backMoney)
+ .set(GameTencentOrder::getBackMsg, backMsg)
+ List<GameTencentOrderSplitLog> splitOrderLogList = new ArrayList<>(splitResult.third.size());
+ splitOrderLogList.add(GameTencentOrderSplitLog.builder()
+ gameTencentOrderSplitLogService.saveBatch(splitOrderLogList);
+ .set(GameTencentOrder::getBackMoney, splitResult.second)
return update(new LambdaUpdateWrapper<GameTencentOrder>()
- .set(GameTencentOrder::getIsBack, backStatus.getBackStatus())
+ .set(GameTencentOrder::getIsBack, backResult.first.getBackStatus())
.set(GameTencentOrder::getBackMoney, backMoney)
.set(GameTencentOrder::getBackMsg, backMsg)
.eq(GameTencentOrder::getId, orderLog.getId())
@@ -165,6 +204,7 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
+ List<GameTencentOrderSplitLogVO> orderSplitList = gameTencentOrderSplitLogService.listByOrderNo(logList.stream().map(GameTencentOrder::getOrderId).collect(Collectors.toList()));
Set<String> agentKeys = logList.stream().map(GameTencentOrder::getChannel).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
@@ -176,6 +216,8 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
+ List<GameTencentOrderSplitLogVO> splitList = orderSplitList.stream().filter(obj -> obj.getOrderNo().equals(log.getOrderId())).collect(Collectors.toList());
@@ -190,22 +232,65 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
- public boolean tencentOrderReport(List<Long> ids, Long backMoney) {
+ public boolean tencentOrderReport(OrderReportDTO dto) {
.filter(order -> !Objects.equals(order.getIsBack(), BackStatusEnum.SUCCESS.getBackStatus()))
+ List<GameTencentOrderSplitLog> splitOrderLogList = new ArrayList<>(dto.getSplitMoney().size());
+ update(new LambdaUpdateWrapper<GameTencentOrder>()
+ .set(GameTencentOrder::getBackMoney, backMoneyTotal)
+ .set(GameTencentOrder::getBackMsg, "手动触发回传(拆单回传)")
- private BackStatusEnum doCallback(GameTencentOrder orderLog) {
+ public Tuple2<BackStatusEnum, String> doCallback(GameTencentOrder orderLog, Long backMoney) {
Map<String, Object> actionParam = new HashMap<>(2);
actionParam.put("claim_type", 0);
- actionParam.put("value", orderLog.getBackMoney());
+ actionParam.put("value", backMoney);
DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
.appId(orderLog.getWechatAppId())
.userActionSetId(orderLog.getUserActionSetId())
@@ -242,7 +327,7 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
gameTencentBackLog.setBackLog(result.getMsg());
gameTencentBackLogService.save(gameTencentBackLog);
+ return Tuple2.with(backStatus, gameTencentBackLog.getBackLog());
public static class TencentOrderBackPolicyCheck implements BackPolicyUtil.IBackPolicyCheck {
+import com.zanxiang.game.back.serve.dao.mapper.GameTencentOrderSplitLogMapper;
+public class GameTencentOrderSplitLogServiceImpl extends ServiceImpl<GameTencentOrderSplitLogMapper, GameTencentOrderSplitLog>
+ implements IGameTencentOrderSplitLogService {
+ public List<GameTencentOrderSplitLogVO> listByOrderNo(Collection<String> orderNos) {
+ return list(new LambdaQueryWrapper<GameTencentOrderSplitLog>()
+ .eq(GameTencentOrderSplitLog::getOrderNo, orderNos)
+ .orderByAsc(GameTencentOrderSplitLog::getBackIndex)
+ private GameTencentOrderSplitLogVO toVOSimple(GameTencentOrderSplitLog log) {
+ GameTencentOrderSplitLogVO vo = BeanUtil.copy(log, GameTencentOrderSplitLogVO.class);
@@ -0,0 +1,112 @@
+package com.zanxiang.game.back.serve.task;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.zanxiang.game.back.base.ServerInfo;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
+import com.zanxiang.game.back.serve.service.IGameOceanengineOrderLogService;
+import com.zanxiang.module.redis.service.IDistributedLockComponent;
+import com.zanxiang.module.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+ * 头条订单拆分回传任务
+@Component
+public class OceanengineOrderSplitBackTask {
+ public static final String KEY = ServerInfo.SERVER_NAME + ":oceanengineOrderSplitBack:";
+ private IGameOceanengineOrderLogService gameOceanengineOrderLogService;
+ private IDistributedLockComponent distributedLockComponent;
+ @Scheduled(cron = "0 * * * * ?")
+ public void execute() {
+ LocalDateTime now = LocalDateTime.now().withSecond(0).withNano(0);
+ if (!distributedLockComponent.doLock(KEY + DateUtil.formatLocalDateTime(now))) {
+ List<GameOceanengineOrderSplitLog> orderSplitLogList = gameOceanengineOrderSplitLogService.list(new LambdaQueryWrapper<GameOceanengineOrderSplitLog>()
+ .in(GameOceanengineOrderSplitLog::getBackDay, Arrays.asList(LocalDate.now().minusDays(1), LocalDate.now()))
+ .lt(GameOceanengineOrderSplitLog::getBackTime, now.plusMinutes(1))
+ .eq(GameOceanengineOrderSplitLog::getBackStatus, BackStatusEnum.NO.getBackStatus())
+ .orderByAsc(GameOceanengineOrderSplitLog::getOrderNo)
+ .orderByAsc(GameOceanengineOrderSplitLog::getBackTime)
+ if (CollectionUtils.isEmpty(orderSplitLogList)) {
+ log.error("准备回传分拆订单:{}", orderSplitLogList.size());
+ List<GameOceanengineOrderLog> orderList = gameOceanengineOrderLogService.list(new LambdaQueryWrapper<GameOceanengineOrderLog>()
+ .in(GameOceanengineOrderLog::getOrderNo, orderSplitLogList.stream().map(GameOceanengineOrderSplitLog::getOrderNo).collect(Collectors.toSet()))
+ Map<String, GameOceanengineOrderLog> orderMap = new HashMap<>(orderList.size());
+ orderList.forEach(order -> orderMap.put(order.getOrderNo(), order));
+ orderSplitLogList.forEach(orderSplitLog -> {
+ callback(orderMap.get(orderSplitLog.getOrderNo()), orderSplitLog);
+ private void callback(GameOceanengineOrderLog order, GameOceanengineOrderSplitLog orderSplitLog) {
+ log.error("开始回传拆分订单:{}-{}", orderSplitLog.getOrderNo(), orderSplitLog.getBackIndex());
+ try {
+ Tuple2<BackStatusEnum, String> backResult = gameOceanengineOrderLogService.doCallback(order, orderSplitLog.getSplitMoney());
+ gameOceanengineOrderSplitLogService.update(new LambdaUpdateWrapper<GameOceanengineOrderSplitLog>()
+ .set(GameOceanengineOrderSplitLog::getExecuteTime, LocalDateTime.now())
+ .set(GameOceanengineOrderSplitLog::getBackStatus, backResult.first.getBackStatus())
+ .set(GameOceanengineOrderSplitLog::getBackErrorMsg, backResult.second)
+ .eq(GameOceanengineOrderSplitLog::getId, orderSplitLog.getId())
+ if (backResult.first == BackStatusEnum.SUCCESS) {
+ gameOceanengineOrderLogService.update(new LambdaUpdateWrapper<GameOceanengineOrderLog>()
+ .eq(GameOceanengineOrderLog::getId, order.getId())
+ .set(GameOceanengineOrderLog::getBackStatus, BackStatusEnum.SUCCESS_PART.getBackStatus())
+ log.error("订单回传完成:{}-{}, {}-{}", orderSplitLog.getOrderNo(), orderSplitLog.getBackIndex(), backResult.first, backResult.second);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ .set(GameOceanengineOrderSplitLog::getBackStatus, BackStatusEnum.FAILED.getBackStatus())
+ .set(GameOceanengineOrderSplitLog::getBackErrorMsg, e.getMessage())
+ } catch (Exception ex) {
+ log.error(ex.getMessage(), ex);
@@ -0,0 +1,115 @@
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameOrderService;
+public class TencentMiniOrderSplitBackTask {
+ public static final String KEY = ServerInfo.SERVER_NAME + ":tencentMiniOrderSplitBack:";
+ private IGameTencentMiniGameOrderService gameTencentMiniGameOrderService;
+ private IGameTencentMiniGameBackLogService gameTencentMiniGameBackLogService;
+ List<GameTencentMiniGameOrderSplitLog> orderSplitLogList = gameTencentMiniGameOrderSplitLogService.list(new LambdaQueryWrapper<GameTencentMiniGameOrderSplitLog>()
+ .in(GameTencentMiniGameOrderSplitLog::getBackDay, Arrays.asList(LocalDate.now().minusDays(1), LocalDate.now()))
+ .lt(GameTencentMiniGameOrderSplitLog::getBackTime, now.plusMinutes(1))
+ .eq(GameTencentMiniGameOrderSplitLog::getBackStatus, BackStatusEnum.NO.getBackStatus())
+ .orderByAsc(GameTencentMiniGameOrderSplitLog::getOrderNo)
+ .orderByAsc(GameTencentMiniGameOrderSplitLog::getBackTime)
+ List<GameTencentMiniGameOrder> orderList = gameTencentMiniGameOrderService.list(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+ .in(GameTencentMiniGameOrder::getOrderId, orderSplitLogList.stream().map(GameTencentMiniGameOrderSplitLog::getOrderNo).collect(Collectors.toSet()))
+ Map<String, GameTencentMiniGameOrder> orderMap = new HashMap<>(orderList.size());
+ orderList.forEach(order -> orderMap.put(order.getOrderId(), order));
+ private void callback(GameTencentMiniGameOrder order, GameTencentMiniGameOrderSplitLog orderSplitLog) {
+ Tuple2<BackStatusEnum, String> backResult = gameTencentMiniGameBackLogService.orderBack(order, orderSplitLog.getSplitMoney());
+ gameTencentMiniGameOrderSplitLogService.update(new LambdaUpdateWrapper<GameTencentMiniGameOrderSplitLog>()
+ .set(GameTencentMiniGameOrderSplitLog::getExecuteTime, LocalDateTime.now())
+ .set(GameTencentMiniGameOrderSplitLog::getBackStatus, backResult.first.getBackStatus())
+ .set(GameTencentMiniGameOrderSplitLog::getBackErrorMsg, backResult.second)
+ .eq(GameTencentMiniGameOrderSplitLog::getId, orderSplitLog.getId())
+ gameTencentMiniGameOrderService.update(new LambdaUpdateWrapper<GameTencentMiniGameOrder>()
+ .eq(GameTencentMiniGameOrder::getId, order.getId())
+ .set(GameTencentMiniGameOrder::getBackStatus, BackStatusEnum.SUCCESS_PART.getBackStatus())
+ .set(GameTencentMiniGameOrderSplitLog::getBackStatus, BackStatusEnum.FAILED.getBackStatus())
+ .set(GameTencentMiniGameOrderSplitLog::getBackErrorMsg, e.getMessage())
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
+import com.zanxiang.game.back.serve.service.IGameTencentOrderService;
+public class TencentOrderSplitBackTask {
+ public static final String KEY = ServerInfo.SERVER_NAME + ":tencentOrderSplitBack:";
+ private IGameTencentOrderService gameTencentOrderService;
+ List<GameTencentOrderSplitLog> orderSplitLogList = gameTencentOrderSplitLogService.list(new LambdaQueryWrapper<GameTencentOrderSplitLog>()
+ .in(GameTencentOrderSplitLog::getBackDay, Arrays.asList(LocalDate.now().minusDays(1), LocalDate.now()))
+ .lt(GameTencentOrderSplitLog::getBackTime, now.plusMinutes(1))
+ .eq(GameTencentOrderSplitLog::getBackStatus, BackStatusEnum.NO.getBackStatus())
+ .orderByAsc(GameTencentOrderSplitLog::getOrderNo)
+ .orderByAsc(GameTencentOrderSplitLog::getBackTime)
+ List<GameTencentOrder> orderList = gameTencentOrderService.list(new LambdaQueryWrapper<GameTencentOrder>()
+ .in(GameTencentOrder::getOrderId, orderSplitLogList.stream().map(GameTencentOrderSplitLog::getOrderNo).collect(Collectors.toSet()))
+ Map<String, GameTencentOrder> orderMap = new HashMap<>(orderList.size());
+ private void callback(GameTencentOrder order, GameTencentOrderSplitLog orderSplitLog) {
+ Tuple2<BackStatusEnum, String> backResult = gameTencentOrderService.doCallback(order, orderSplitLog.getSplitMoney());
+ gameTencentOrderSplitLogService.update(new LambdaUpdateWrapper<GameTencentOrderSplitLog>()
+ .set(GameTencentOrderSplitLog::getExecuteTime, LocalDateTime.now())
+ .set(GameTencentOrderSplitLog::getBackStatus, backResult.first.getBackStatus())
+ .set(GameTencentOrderSplitLog::getBackErrorMsg, backResult.second)
+ .eq(GameTencentOrderSplitLog::getId, orderSplitLog.getId())
+ gameTencentOrderService.update(new LambdaUpdateWrapper<GameTencentOrder>()
+ .eq(GameTencentOrder::getId, order.getId())
+ .set(GameTencentOrder::getIsBack, BackStatusEnum.SUCCESS_PART.getBackStatus())
+ .set(GameTencentOrderSplitLog::getBackStatus, BackStatusEnum.FAILED.getBackStatus())
+ .set(GameTencentOrderSplitLog::getBackErrorMsg, e.getMessage())
@@ -16,7 +16,10 @@ import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.function.Function;
@@ -216,6 +219,30 @@ public class BackPolicyUtil {
return Tuples.tuple(userBackCount < maxBackCountOfUser, downLevel(rechargeMoney, downLevelString), backMsg);
+ * 拆单逻辑
+ public static Tuple3<Boolean, Long, List<Tuple2<Long, LocalDateTime>>> splitOrder(GameBackPolicy gameBackPolicy, Long backMoney) {
+ if (gameBackPolicy == null || StringUtils.isBlank(gameBackPolicy.getSplitStrategy())) {
+ return Tuple3.with(false, backMoney, null);
+ Collection<GameBackPolicyVO.SplitStrategy> splitStrategyList = JsonUtil.toList(gameBackPolicy.getSplitStrategy(), List.class, GameBackPolicyVO.SplitStrategy.class);
+ List<Tuple2<Long, LocalDateTime>> result = new ArrayList<>();
+ Long sumMoney = 0L;
+ long money = NumberUtil.multiply100(splitStrategy.getPayMoney()).longValue();
+ sumMoney += money;
+ result.add(Tuple2.with(money, beginTime));
+ int randomMinute = RandomUtils.nextInt(splitStrategy.getBetweenMinuteMin(), splitStrategy.getBetweenMinuteMax());
+ beginTime = beginTime.minusMinutes(randomMinute);
+ return Tuple3.with(true, sumMoney, result);
private static Long downLevel(Long rechargeMoney, String downLevelStr) {
if (StringUtils.isBlank(downLevelStr)) {
return rechargeMoney;
@@ -62,7 +62,9 @@ public class DataPowerComponent {
throw new BaseException("服务异常,获取用户列表失败!!");
if (subUserIds.size() == 1) {
- if (gameAuth == GameAuthEnum.OPERATE || gameAuth == GameAuthEnum.CUSTOMER || gameAuth == GameAuthEnum.GS) {
+ if (gameAuth == GameAuthEnum.MANAGE) {
+ return Tuple2.with(null, null);
+ } else if (gameAuth == GameAuthEnum.OPERATE || gameAuth == GameAuthEnum.CUSTOMER || gameAuth == GameAuthEnum.GS) {
// 运营
return Tuple2.with(null, userGameInfo.getGameIdList());
@@ -70,8 +72,9 @@ public class DataPowerComponent {
return Tuple2.with(new ArrayList<>(subUserIds), userGameInfo.getGameIdList());
- // 组长
// 运营组长
import java.time.LocalDate;
* @author tianhua
@@ -31,7 +32,7 @@ public class GameDataTotalDTO extends BasePage {
* 游戏ID
@ApiModelProperty(notes = "游戏ID")
- private Long gameId;
+ private List<Long> gameId;
* 推广游戏应用类别
@@ -87,4 +88,10 @@ public class GameDataTotalDTO extends BasePage {
@ApiModelProperty(notes = "选择展示数据种类:buy -> 买量 ; nature -> 自然量 ; total -> 总量")
private String tableTypes;
+ * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+ @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+ private Long gameDimension;
@@ -29,7 +30,7 @@ public class GameDataTotalTotalDTO {
@@ -73,4 +74,10 @@ public class GameDataTotalTotalDTO {
@@ -28,7 +29,7 @@ public class GameDataWaterDTO extends BasePage {
private String gameName;
@ApiModelProperty(notes = "游戏id")
@ApiModelProperty(notes = "SDK来源")
private String sourceSystem;
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -36,7 +37,7 @@ public class GameMediaDataDayDTO extends BasePage {
@ApiModelProperty(value = "游戏ID")
- private String gameId;
* 游戏CP方
@@ -68,4 +69,10 @@ public class GameMediaDataDayDTO extends BasePage {
@ApiModelProperty(notes = "排序方式:升序asc;降序desc")
private String sortType;
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
@@ -35,7 +36,7 @@ public class GameMediaDataDayTotalDTO {
@@ -55,4 +56,10 @@ public class GameMediaDataDayTotalDTO {
@ApiModelProperty(value = "推广媒体")
private String accountType;
@@ -48,7 +49,7 @@ public class GameMediaDataTotalDTO extends BasePage {
@@ -80,4 +81,10 @@ public class GameMediaDataTotalDTO extends BasePage {
@@ -47,7 +48,7 @@ public class GameMediaDataTotalSumDTO {
@@ -67,4 +68,10 @@ public class GameMediaDataTotalSumDTO {
@@ -18,7 +18,7 @@ public class GamePromoteDayDTO extends BasePage {
@ApiModelProperty(notes = "投手id")
- private Long sysUserId;
+ private String sysUserId;
@ApiModelProperty(notes = "推广账号类型")
@ApiModelProperty(notes = "推广账号ID")
@@ -31,7 +31,7 @@ public class GamePromoteDayDTO extends BasePage {
private String cpName;
@ApiModelProperty(notes = "游戏名")
@ApiModelProperty(notes = "游戏应用类型")
@@ -48,4 +48,10 @@ public class GamePromoteDayDTO extends BasePage {
@@ -17,7 +17,7 @@ public class GamePromoteDayTotalDTO {
private String accountId;
@@ -29,7 +29,7 @@ public class GamePromoteDayTotalDTO {
@@ -40,4 +40,11 @@ public class GamePromoteDayTotalDTO {
private LocalDate beginDay;
@ApiModelProperty(notes = "消耗结束日期")
private LocalDate endDay;
@@ -8,6 +8,7 @@ import lombok.Data;
@@ -36,7 +37,7 @@ public class GameServerDayDTO extends BasePage {
* 区服ID
@@ -77,4 +78,10 @@ public class GameServerDayDTO extends BasePage {
""")
private String activeTypes;
@@ -35,7 +36,7 @@ public class GameServerDayTotalDTO {
@@ -63,4 +64,10 @@ public class GameServerDayTotalDTO {
@@ -36,7 +37,7 @@ public class GameServerSumDayDTO extends BasePage {
* SDK来源
@@ -56,4 +57,10 @@ public class GameServerSumDayDTO extends BasePage {
@@ -35,7 +36,7 @@ public class GameServerSumDayTotalDTO {
@@ -43,4 +44,10 @@ public class GameServerSumDayTotalDTO {
@ApiModelProperty(value = "SDK来源")
@@ -42,7 +43,7 @@ public class PitcherDataDayDTO extends BasePage {
* 投手ID
@ApiModelProperty(value = "投手ID")
- private Long pitcherId;
+ private List<Long> pitcherId;
* 排序字段
@@ -56,4 +57,10 @@ public class PitcherDataDayDTO extends BasePage {
@@ -41,6 +42,12 @@ public class PitcherDataDayTotalDTO {
@@ -54,7 +55,7 @@ public class PitcherDataTotalDTO extends BasePage {
@@ -68,4 +69,10 @@ public class PitcherDataTotalDTO extends BasePage {
@@ -53,6 +54,12 @@ public class PitcherDataTotalSumDTO {
@@ -75,5 +75,11 @@ public class PitcherGameDataDayDTO extends BasePage {
@@ -62,4 +62,10 @@ public class PitcherGameDataDayTotalDTO {
@ApiModelProperty(value = "游戏类型")
private Long gameType;
@@ -54,13 +55,13 @@ public class PitcherGameDataTotalDTO extends BasePage {
@@ -86,4 +87,10 @@ public class PitcherGameDataTotalDTO extends BasePage {
@@ -53,13 +54,13 @@ public class PitcherGameDataTotalSumDTO {
@@ -73,4 +74,10 @@ public class PitcherGameDataTotalSumDTO {
@@ -36,13 +37,13 @@ public class PitcherGameMediaDataDayDTO extends BasePage {
@@ -74,4 +75,10 @@ public class PitcherGameMediaDataDayDTO extends BasePage {
@@ -35,13 +36,13 @@ public class PitcherGameMediaDataDayTotalDTO {
@@ -61,4 +62,10 @@ public class PitcherGameMediaDataDayTotalDTO {
@@ -48,13 +49,13 @@ public class PitcherGameMediaDataTotalDTO extends BasePage {
@@ -86,4 +87,10 @@ public class PitcherGameMediaDataTotalDTO extends BasePage {
@@ -47,13 +48,13 @@ public class PitcherGameMediaDataTotalSumDTO {
@@ -73,4 +74,10 @@ public class PitcherGameMediaDataTotalSumDTO {
@@ -36,7 +37,7 @@ public class PitcherMediaDataDayDTO extends BasePage {
* 推广媒体
@@ -56,4 +57,10 @@ public class PitcherMediaDataDayDTO extends BasePage {
@@ -35,7 +36,7 @@ public class PitcherMediaDataDayTotalDTO {
@@ -43,4 +44,10 @@ public class PitcherMediaDataDayTotalDTO {
@@ -48,7 +49,7 @@ public class PitcherMediaDataTotalDTO extends BasePage {
@@ -68,4 +69,10 @@ public class PitcherMediaDataTotalDTO extends BasePage {
@@ -47,7 +48,7 @@ public class PitcherMediaDataTotalSumDTO {
@@ -55,4 +56,10 @@ public class PitcherMediaDataTotalSumDTO {
@@ -0,0 +1,931 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+ * <p>
+ * 推广渠道每日数据
+ * </p>
+ *
+ * @author auto
+ * @since 2023-07-28
+@Table(AdsAccountAgentDayParent.TABLE_NAME)
+@PK({"dt","sourceSystem", "accountId", "agentId"})
+public class AdsAccountAgentDayParent implements Serializable {
+ public static final String TABLE_NAME = "game_ads_parent.ads_account_agent_day_parent";
+ * 日期(充值时间)
+ private LocalDate dt;
+ * SDK来源
+ private String sourceSystem;
+ * 推广账号
+ private Long accountId;
+ * 渠道ID
+ private Long agentId;
+ * 渠道名称
+ @Column
+ private String agentName;
+ * 推广账号类型
+ private String accountType;
+ * 投手ID
+ private String pitcherId;
+ * 投手名称
+ private String pitcher;
+ * 推广游戏CP名称
+ private String gameCp;
+ * 推广游戏ID
+ private Long parentGameId;
+ * 推广游戏名称
+ private String parentGameName;
+ * 推广游戏类型
+ private String parentGameType;
+ * 注册时间(消耗时间)
+ private LocalDateTime regTime;
+ * 消耗
+ private BigDecimal cost;
+ * 推广计划数量
+ private Long planCount;
+ * 曝光数量
+ private Long viewCount;
+ * 点击数量
+ private Long clickCount;
+ * 转化数量
+ private Long changeCount;
+ * 转化率
+ private BigDecimal changeRate;
+ * 平均转化成本
+ private BigDecimal avgChangePrice;
+ * 深度转化数量
+ private Long depthChangeCount;
+ * 深度转化率
+ private BigDecimal depthChangeRate;
+ * 深度转化成本
+ private BigDecimal avgDepthChangePrice;
+ * 千次曝光成本
+ private BigDecimal thousandDisplayPrice;
+ * 点击率
+ private BigDecimal clickRate;
+ * 平均点击均价
+ private BigDecimal avgClickPrice;
+ * 应用下载开始量
+ private Long downloadStart;
+ * 应用下载开始成本
+ private BigDecimal downloadStartCost;
+ * 应用下载开始率
+ private BigDecimal downloadStartRate;
+ * 应用下载完成量
+ private Long downloadFinish;
+ * 应用下载完成成本
+ private BigDecimal downloadFinishCost;
+ * 应用下载完成率
+ private BigDecimal downloadFinishRate;
+ * 应用安装完成量
+ private Long installFinish;
+ * 应用安装完成成本
+ private BigDecimal installFinishCost;
+ * 应用安装完成率
+ private BigDecimal installFinishRate;
+ * 应用激活量
+ private Long active;
+ * 应用激活成本
+ private BigDecimal activeCost;
+ * 应用激活率
+ private BigDecimal activeRate;
+ * 注册人数-通过广告首次登录小游戏的独立用户数
+ private Long registerNum;
+ * 注册成本=实际消耗/注册人数
+ private BigDecimal registerCost;
+ * 新增付费次数
+ private Long firstNewUserAmountCount;
+ * 新增付费人数
+ private Long firstNewUserAmountNum;
+ * 新增付费金额
+ private BigDecimal firstNewUserAmount;
+ * 账面充值次数
+ private Long amountCount;
+ * 账面充值人数
+ private Long amountNum;
+ * 账面充值金额
+ private BigDecimal amount;
+ * 老用户充值次数(每日)
+ private Long oldAmountCount;
+ * 老用户充值人数(每日)
+ private Long oldAmountNum;
+ * 老用户充值金额(每日)
+ private BigDecimal oldAmount;
+ * 至今充值次数
+ private Long newUserTotalAmountCount;
+ * 至今充值人数
+ private Long newUserTotalAmountNum;
+ * 至今充值金额
+ private BigDecimal newUserTotalAmount;
+ * 首日回收率
+ private BigDecimal firstRoi;
+ * 买量回收率
+ private BigDecimal buyRoi;
+ * 当日回收率
+ private BigDecimal todayRoi;
+ * 毛利额,毛利=新用户-实际消耗
+ private BigDecimal grossProfit;
+ * 1日roi
+ private BigDecimal roi1;
+ * 2日roi
+ private BigDecimal roi2;
+ * 3日roi
+ private BigDecimal roi3;
+ * 4日roi
+ private BigDecimal roi4;
+ * 5日roi
+ private BigDecimal roi5;
+ * 6日roi
+ private BigDecimal roi6;
+ * 7日roi
+ private BigDecimal roi7;
+ * 8日roi
+ private BigDecimal roi8;
+ * 9日roi
+ private BigDecimal roi9;
+ * 10日roi
+ private BigDecimal roi10;
+ * 11日roi
+ private BigDecimal roi11;
+ * 12日roi
+ private BigDecimal roi12;
+ * 13日roi
+ private BigDecimal roi13;
+ * 14日roi
+ private BigDecimal roi14;
+ * 15日roi
+ private BigDecimal roi15;
+ * 16日roi
+ private BigDecimal roi16;
+ * 17日roi
+ private BigDecimal roi17;
+ * 18日roi
+ private BigDecimal roi18;
+ * 19日roi
+ private BigDecimal roi19;
+ * 20日roi
+ private BigDecimal roi20;
+ * 21日roi
+ private BigDecimal roi21;
+ * 22日roi
+ private BigDecimal roi22;
+ * 23日roi
+ private BigDecimal roi23;
+ * 24日roi
+ private BigDecimal roi24;
+ * 25日roi
+ private BigDecimal roi25;
+ * 26日roi
+ private BigDecimal roi26;
+ * 27日roi
+ private BigDecimal roi27;
+ * 28日roi
+ private BigDecimal roi28;
+ * 29日roi
+ private BigDecimal roi29;
+ * 30日roi
+ private BigDecimal roi30;
+ * 60日ROI
+ private BigDecimal roi60;
+ * 90日ROI
+ private BigDecimal roi90;
+ * 180日ROI
+ private BigDecimal roi180;
+ * 1年ROI
+ private BigDecimal roi1yaer;
+ * 总ROI
+ private BigDecimal roiTotal;
+ * 首日付费率
+ private BigDecimal firstRate;
+ * 买量用户付费率
+ private BigDecimal buyUserRate;
+ * 当天付费率
+ private BigDecimal todayRate;
+ * 首日客单价
+ private BigDecimal firstAvg;
+ * 买量客单价
+ private BigDecimal buyAvg;
+ * 当天客单价
+ private BigDecimal todayAvg;
+ * 账面客单价
+ private BigDecimal paperAvg;
+ * 首日充值成本
+ private BigDecimal firstAmountCost;
+ * 买量充值成本
+ private BigDecimal buyAmountCost;
+ * 当天充值成本
+ private BigDecimal todayAmountCost;
+ * 当天复充率
+ private BigDecimal todayAgainRate;
+ * 新增注册ARPU
+ private BigDecimal newRegArpu;
+ * 首日付费ARPU
+ private BigDecimal firstArpu;
+ * 当天付费ARPU
+ private BigDecimal todayArpu;
+ * 账面arpu
+ private BigDecimal paperArpu;
+ * 付费趋势第1日总:金额/人数/增/回/倍
+ private String amountD1;
+ * 付费趋势第2日总:金额/人数/增/回/倍
+ private String amountD2;
+ * 付费趋势第3日总:金额/人数/增/回/倍
+ private String amountD3;
+ * 付费趋势第4日总:金额/人数/增/回/倍
+ private String amountD4;
+ * 付费趋势第5日总:金额/人数/增/回/倍
+ private String amountD5;
+ * 付费趋势第6日总:金额/人数/增/回/倍
+ private String amountD6;
+ * 付费趋势第7日总:金额/人数/增/回/倍
+ private String amountD7;
+ * 付费趋势第8日总:金额/人数/增/回/倍
+ private String amountD8;
+ * 付费趋势第9日总:金额/人数/增/回/倍
+ private String amountD9;
+ * 付费趋势第10日总:金额/人数/增/回/倍
+ private String amountD10;
+ * 付费趋势第11日总:金额/人数/增/回/倍
+ private String amountD11;
+ * 付费趋势第12日总:金额/人数/增/回/倍
+ private String amountD12;
+ * 付费趋势第13日总:金额/人数/增/回/倍
+ private String amountD13;
+ * 付费趋势第14日总:金额/人数/增/回/倍
+ private String amountD14;
+ * 付费趋势第15日总:金额/人数/增/回/倍
+ private String amountD15;
+ * 付费趋势第16日总:金额/人数/增/回/倍
+ private String amountD16;
+ * 付费趋势第17日总:金额/人数/增/回/倍
+ private String amountD17;
+ * 付费趋势第18日总:金额/人数/增/回/倍
+ private String amountD18;
+ * 付费趋势第19日总:金额/人数/增/回/倍
+ private String amountD19;
+ * 付费趋势第20日总:金额/人数/增/回/倍
+ private String amountD20;
+ * 付费趋势第21日总:金额/人数/增/回/倍
+ private String amountD21;
+ * 付费趋势第22日总:金额/人数/增/回/倍
+ private String amountD22;
+ * 付费趋势第23日总:金额/人数/增/回/倍
+ private String amountD23;
+ * 付费趋势第24日总:金额/人数/增/回/倍
+ private String amountD24;
+ * 付费趋势第25日总:金额/人数/增/回/倍
+ private String amountD25;
+ * 付费趋势第26日总:金额/人数/增/回/倍
+ private String amountD26;
+ * 付费趋势第27日总:金额/人数/增/回/倍
+ private String amountD27;
+ * 付费趋势第28日总:金额/人数/增/回/倍
+ private String amountD28;
+ * 付费趋势第29日总:金额/人数/增/回/倍
+ private String amountD29;
+ * 付费趋势第30日总:金额/人数/增/回/倍
+ private String amountM1;
+ * 付费趋势第二月总:金额/人数/增/回/倍
+ private String amountM2;
+ * 付费趋势第三月总:金额/人数/增/回/倍
+ private String amountM3;
+ * 付费趋势六月总:金额/人数/增/回/倍
+ private String amountM6;
+ * 付费趋势一年总:金额/人数/增/回/倍
+ private String amountY1;
+ * 付费趋势总:增/回/倍
+ private String amountSum;
+ * 单日付费100+人数
+ private Long hundredUserNum;
+ * 单日付费100+成本
+ private BigDecimal hundredUserNumCost;
+ * 买量新用户累计充值金额
+ private BigDecimal buyNewUserTotalAmount;
+ * 买量新用户累计充值人数
+ private Long buyNewUserTotalAmountNum;
+ * 买量新用户累计充值次数
+ private Long buyNewUserTotalAmountCount;
+ * 复充人数
+ private Long regOrderUserAgain;
+ * 首日创角人数
+ private Long firstRoleNum;
+ * 新用户累计创角人数
+ private Long newUserTotalRoleNum;
+ * 创角人数
+ private Long roleNum;
@@ -0,0 +1,2392 @@
+ * 游戏媒体数据表
+@Table(AdsGameAcctypeDayParent.TABLE_NAME)
+@PK({"dt", "parentGameId", "accountType", "sourceSystem"})
+public class AdsGameAcctypeDayParent implements Serializable {
+ public static final String TABLE_NAME = "game_ads_parent.ads_game_acctype_day_parent";
+ * 游戏ID
+ private String parentGameId;
+ * 推广媒体
+ * 游戏
+ * 游戏CP方
+ private String parentGameCp;
+ * 游戏类型
+ private Long parentGameType;
+ * 推广账号数量
+ private Long accountCount;
+ * 推广渠道数量
+ private Long agentCount;
+ * 付费趋势第N日总:金额/人数/增/回/倍
+ private String amountD30;
+ private String amountD31;
+ private String amountD32;
+ private String amountD33;
+ private String amountD34;
+ private String amountD35;
+ private String amountD36;
+ private String amountD37;
+ private String amountD38;
+ private String amountD39;
+ private String amountD40;
+ private String amountD41;
+ private String amountD42;
+ private String amountD43;
+ private String amountD44;
+ private String amountD45;
+ private String amountD46;
+ private String amountD47;
+ private String amountD48;
+ private String amountD49;
+ private String amountD50;
+ private String amountD51;
+ private String amountD52;
+ private String amountD53;
+ private String amountD54;
+ private String amountD55;
+ private String amountD56;
+ private String amountD57;
+ private String amountD58;
+ private String amountD59;
+ private String amountD60;
+ private String amountD61;
+ private String amountD62;
+ private String amountD63;
+ private String amountD64;
+ private String amountD65;
+ private String amountD66;
+ private String amountD67;
+ private String amountD68;
+ private String amountD69;
+ private String amountD70;
+ private String amountD71;
+ private String amountD72;
+ private String amountD73;
+ private String amountD74;
+ private String amountD75;
+ private String amountD76;
+ private String amountD77;
+ private String amountD78;
+ private String amountD79;
+ private String amountD80;
+ private String amountD81;
+ private String amountD82;
+ private String amountD83;
+ private String amountD84;
+ private String amountD85;
+ private String amountD86;
+ private String amountD87;
+ private String amountD88;
+ private String amountD89;
+ private String amountD90;
+ * 付费趋势4六月总:金额/人数/增/回/倍
+ private String amountM4;
+ * 付费趋势5六月总:金额/人数/增/回/倍
+ private String amountM5;
+ * 付费趋势6六月总:金额/人数/增/回/倍
+ * 付费趋势7六月总:金额/人数/增/回/倍
+ private String amountM7;
+ * 付费趋势8六月总:金额/人数/增/回/倍
+ private String amountM8;
+ * 付费趋势9六月总:金额/人数/增/回/倍
+ private String amountM9;
+ * 付费趋势10六月总:金额/人数/增/回/倍
+ private String amountM10;
+ * 付费趋势11六月总:金额/人数/增/回/倍
+ private String amountM11;
+ * 付费趋势12六月总:金额/人数/增/回/倍
+ private String amountM12;
+ * 投手游戏第1天新用户充值
+ private BigDecimal da1;
+ * 投手游戏第2天新用户充值
+ private BigDecimal da2;
+ * 投手游戏第3天新用户充值
+ private BigDecimal da3;
+ * 投手游戏第4天新用户充值
+ private BigDecimal da4;
+ * 投手游戏第5天新用户充值
+ private BigDecimal da5;
+ * 投手游戏第6天新用户充值
+ private BigDecimal da6;
+ * 投手游戏第7天新用户充值
+ private BigDecimal da7;
+ * 投手游戏第8天新用户充值
+ private BigDecimal da8;
+ * 投手游戏第9天新用户充值
+ private BigDecimal da9;
+ * 投手游戏第10天新用户充值
+ private BigDecimal da10;
+ * 投手游戏第11天新用户充值
+ private BigDecimal da11;
+ * 投手游戏第12天新用户充值
+ private BigDecimal da12;
+ * 投手游戏第13天新用户充值
+ private BigDecimal da13;
+ * 投手游戏第14天新用户充值
+ private BigDecimal da14;
+ * 投手游戏第15天新用户充值
+ private BigDecimal da15;
+ * 投手游戏第16天新用户充值
+ private BigDecimal da16;
+ * 投手游戏第17天新用户充值
+ private BigDecimal da17;
+ * 投手游戏第18天新用户充值
+ private BigDecimal da18;
+ * 投手游戏第19天新用户充值
+ private BigDecimal da19;
+ * 投手游戏第20天新用户充值
+ private BigDecimal da20;
+ * 投手游戏第21天新用户充值
+ private BigDecimal da21;
+ * 投手游戏第22天新用户充值
+ private BigDecimal da22;
+ * 投手游戏第23天新用户充值
+ private BigDecimal da23;
+ * 投手游戏第24天新用户充值
+ private BigDecimal da24;
+ * 投手游戏第25天新用户充值
+ private BigDecimal da25;
+ * 投手游戏第26天新用户充值
+ private BigDecimal da26;
+ * 投手游戏第27天新用户充值
+ private BigDecimal da27;
+ * 投手游戏第28天新用户充值
+ private BigDecimal da28;
+ * 投手游戏第29天新用户充值
+ private BigDecimal da29;
+ * 投手游戏第30天新用户充值
+ private BigDecimal da30;
+ * 投手游戏第N天新用户充值
+ private BigDecimal da31;
+ private BigDecimal da32;
+ private BigDecimal da33;
+ private BigDecimal da34;
+ private BigDecimal da35;
+ private BigDecimal da36;
+ private BigDecimal da37;
+ private BigDecimal da38;
+ private BigDecimal da39;
+ private BigDecimal da40;
+ private BigDecimal da41;
+ private BigDecimal da42;
+ private BigDecimal da43;
+ private BigDecimal da44;
+ private BigDecimal da45;
+ private BigDecimal da46;
+ private BigDecimal da47;
+ private BigDecimal da48;
+ private BigDecimal da49;
+ private BigDecimal da50;
+ private BigDecimal da51;
+ private BigDecimal da52;
+ private BigDecimal da53;
+ private BigDecimal da54;
+ private BigDecimal da55;
+ private BigDecimal da56;
+ private BigDecimal da57;
+ private BigDecimal da58;
+ private BigDecimal da59;
+ private BigDecimal da60;
+ private BigDecimal da61;
+ private BigDecimal da62;
+ private BigDecimal da63;
+ private BigDecimal da64;
+ private BigDecimal da65;
+ private BigDecimal da66;
+ private BigDecimal da67;
+ private BigDecimal da68;
+ private BigDecimal da69;
+ private BigDecimal da70;
+ private BigDecimal da71;
+ private BigDecimal da72;
+ private BigDecimal da73;
+ private BigDecimal da74;
+ private BigDecimal da75;
+ private BigDecimal da76;
+ private BigDecimal da77;
+ private BigDecimal da78;
+ private BigDecimal da79;
+ private BigDecimal da80;
+ private BigDecimal da81;
+ private BigDecimal da82;
+ private BigDecimal da83;
+ private BigDecimal da84;
+ private BigDecimal da85;
+ private BigDecimal da86;
+ private BigDecimal da87;
+ private BigDecimal da88;
+ private BigDecimal da89;
+ private BigDecimal da90;
+ private BigDecimal m4;
+ private BigDecimal m5;
+ private BigDecimal m6;
+ private BigDecimal m7;
+ private BigDecimal m8;
+ private BigDecimal m9;
+ private BigDecimal m10;
+ private BigDecimal m11;
+ private BigDecimal m12;
+ private BigDecimal total;
+ * 投手游戏第1天新用户人数
+ private Long da1Num;
+ * 投手游戏第2天新用户人数
+ private Long da2Num;
+ * 投手游戏第3天新用户人数
+ private Long da3Num;
+ * 投手游戏第4天新用户人数
+ private Long da4Num;
+ * 投手游戏第5天新用户人数
+ private Long da5Num;
+ * 投手游戏第6天新用户人数
+ private Long da6Num;
+ * 投手游戏第7天新用户人数
+ private Long da7Num;
+ * 投手游戏第8天新用户人数
+ private Long da8Num;
+ * 投手游戏第9天新用户人数
+ private Long da9Num;
+ * 投手游戏第10天新用户人数
+ private Long da10Num;
+ * 投手游戏第11天新用户人数
+ private Long da11Num;
+ * 投手游戏第12天新用户人数
+ private Long da12Num;
+ * 投手游戏第13天新用户人数
+ private Long da13Num;
+ * 投手游戏第14天新用户人数
+ private Long da14Num;
+ * 投手游戏第15天新用户人数
+ private Long da15Num;
+ * 投手游戏第16天新用户人数
+ private Long da16Num;
+ * 投手游戏第17天新用户人数
+ private Long da17Num;
+ * 投手游戏第18天新用户人数
+ private Long da18Num;
+ * 投手游戏第19天新用户人数
+ private Long da19Num;
+ * 投手游戏第20天新用户人数
+ private Long da20Num;
+ * 投手游戏第21天新用户人数
+ private Long da21Num;
+ * 投手游戏第22天新用户人数
+ private Long da22Num;
+ * 投手游戏第23天新用户人数
+ private Long da23Num;
+ * 投手游戏第24天新用户人数
+ private Long da24Num;
+ * 投手游戏第25天新用户人数
+ private Long da25Num;
+ * 投手游戏第26天新用户人数
+ private Long da26Num;
+ * 投手游戏第27天新用户人数
+ private Long da27Num;
+ * 投手游戏第28天新用户人数
+ private Long da28Num;
+ * 投手游戏第29天新用户人数
+ private Long da29Num;
+ * 投手游戏第N天新用户充值人数
+ private Long da30Num;
+ private Long da31Num;
+ private Long da32Num;
+ private Long da33Num;
+ private Long da34Num;
+ private Long da35Num;
+ private Long da36Num;
+ private Long da37Num;
+ private Long da38Num;
+ private Long da39Num;
+ private Long da40Num;
+ private Long da41Num;
+ private Long da42Num;
+ private Long da43Num;
+ private Long da44Num;
+ private Long da45Num;
+ private Long da46Num;
+ private Long da47Num;
+ private Long da48Num;
+ private Long da49Num;
+ private Long da50Num;
+ private Long da51Num;
+ private Long da52Num;
+ private Long da53Num;
+ private Long da54Num;
+ private Long da55Num;
+ private Long da56Num;
+ private Long da57Num;
+ private Long da58Num;
+ private Long da59Num;
+ private Long da60Num;
+ private Long da61Num;
+ private Long da62Num;
+ private Long da63Num;
+ private Long da64Num;
+ private Long da65Num;
+ private Long da66Num;
+ private Long da67Num;
+ private Long da68Num;
+ private Long da69Num;
+ private Long da70Num;
+ private Long da71Num;
+ private Long da72Num;
+ private Long da73Num;
+ private Long da74Num;
+ private Long da75Num;
+ private Long da76Num;
+ private Long da77Num;
+ private Long da78Num;
+ private Long da79Num;
+ private Long da80Num;
+ private Long da81Num;
+ private Long da82Num;
+ private Long da83Num;
+ private Long da84Num;
+ private Long da85Num;
+ private Long da86Num;
+ private Long da87Num;
+ private Long da88Num;
+ private Long da89Num;
+ private Long da90Num;
+ private Long m4Num;
+ private Long m5Num;
+ private Long m6Num;
+ private Long m7Num;
+ private Long m8Num;
+ private Long m9Num;
+ private Long m10Num;
+ private Long m11Num;
+ private Long m12Num;
+ private Long totalNum;
+ * 首日创角成本
+ private BigDecimal firstRoleCost;
+ * 新用户累计创角成本
+ private BigDecimal newUserTotalRoleCost;
+ * 创角成本
+ private BigDecimal roleNumCost;
+ * 首日创角率
+ private BigDecimal firstRoleRate;
+ * 新用户累计创角率
+ private BigDecimal newUserTotalRoleRate;
+ * 创角率
+ private BigDecimal roleNumRate;
+ * 新用户付费比
+ private BigDecimal newUserAmountRatio;
@@ -0,0 +1,2402 @@
+ * 推广媒体数据表
+@Table(AdsGamePitcherAcctypeDayParent.TABLE_NAME)
+@PK({"dt", "parentGameId", "pitcherId", "sourceSystem"})
+public class AdsGamePitcherAcctypeDayParent implements Serializable {
+ public static final String TABLE_NAME = "game_ads_parent.ads_game_pitcher_acctype_day_parent";
+ private Long pitcherId;
+ * 投手
@@ -0,0 +1,357 @@
+@Table(AdsGameServerDayParent.TABLE_NAME)
+@PK({"dt", "sourceSystem", "serverId", "serverName", "parentGameId", "parentGameName"})
+public class AdsGameServerDayParent implements Serializable {
+ public static final String TABLE_NAME = "game_ads_parent.ads_game_server_day_parent";
+ * 开服时间
+ * 区服ID
+ private Long serverId;
+ * 区服名称
+ private String serverName;
+ * 游戏名称
+ * 游戏类别
+ private Long classify;
+ * 滚服人数
+ private Long outTotalNum;
+ * 滚服付费人数
+ private Long outTotalAmountNum;
+ * 滚服付费金额
+ private BigDecimal outTotalAmount;
+ * 滚服付费占比
+ private BigDecimal outTotalRate;
+ private Long totalRoleNum;
+ * 注册人数
+ private Long totalRegNum;
+ * 付费人数
+ private Long totalAmountNum;
+ * 付费金额
+ private BigDecimal totalAmount;
+ * 区服第1天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da1;
+ * 区服在第2天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da2;
+ * 区服在第3天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da3;
+ * 区服在第4天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da4;
+ * 区服在第5天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da5;
+ * 区服在第6天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da6;
+ * 区服在第7天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da7;
+ * 区服在第8天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da8;
+ * 区服在第9天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da9;
+ * 区服在第10天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da10;
+ * 区服在第11天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da11;
+ * 区服在第12天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da12;
+ * 区服在第13天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da13;
+ * 区服在第14天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da14;
+ * 区服在第15天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da15;
+ * 区服在第16天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da16;
+ * 区服在第17天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da17;
+ * 区服在第18天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da18;
+ * 区服在第19天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da19;
+ * 区服在第20天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da20;
+ * 区服在第21天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da21;
+ * 区服在第22天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da22;
+ * 区服在第23天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da23;
+ * 区服在第24天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da24;
+ * 区服在第25天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da25;
+ * 区服在第26天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da26;
+ * 区服在第27天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da27;
+ * 区服在第28天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da28;
+ * 区服在第29天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da29;
+ * 区服在第30天:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String da30;
+ * 区服在第2月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m2;
+ * 区服在第3月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m3;
+ * 区服在第4月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m4;
+ * 区服在第5月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m5;
+ * 区服在第6月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m6;
+ * 区服在第7月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m7;
+ * 区服在第8月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m8;
+ * 区服在第9月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m9;
+ * 区服在第10月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m10;
+ * 区服在第11月:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String m11;
+ * 区服在第1年:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String y1;
+ * 区服至今:注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/滚服付费占比
+ private String total;
@@ -0,0 +1,368 @@
+@Table(AdsGameServerSumDayParent.TABLE_NAME)
+@PK({"id"})
+public class AdsGameServerSumDayParent implements Serializable {
+ public static final String TABLE_NAME = "game_ads_parent.ads_game_server_day_sum_parent";
+ * 主键id
+ private String id;
+ private String serverId;
+ private Long parentGameClassify;
@@ -0,0 +1,2378 @@
+ * 投手媒体数据表
+@Table(AdsPitcherAcctypeDayParent.TABLE_NAME)
+@PK({"dt", "pitcherId", "accountType", "sourceSystem"})
+public class AdsPitcherAcctypeDayParent implements Serializable {
+ public static final String TABLE_NAME = "game_ads_parent.ads_pitcher_acctype_day_parent";
+ * 注册人数-通过广告首次登录小媒体的独立用户数
+ * 投手媒体第1天新用户充值
+ * 投手媒体第2天新用户充值
+ * 投手媒体第3天新用户充值
+ * 投手媒体第4天新用户充值
+ * 投手媒体第5天新用户充值
+ * 投手媒体第6天新用户充值
+ * 投手媒体第7天新用户充值
+ * 投手媒体第8天新用户充值
+ * 投手媒体第9天新用户充值
+ * 投手媒体第10天新用户充值
+ * 投手媒体第11天新用户充值
+ * 投手媒体第12天新用户充值
+ * 投手媒体第13天新用户充值
+ * 投手媒体第14天新用户充值
+ * 投手媒体第15天新用户充值
+ * 投手媒体第16天新用户充值
+ * 投手媒体第17天新用户充值
+ * 投手媒体第18天新用户充值
+ * 投手媒体第19天新用户充值
+ * 投手媒体第20天新用户充值
+ * 投手媒体第21天新用户充值
+ * 投手媒体第22天新用户充值
+ * 投手媒体第23天新用户充值
+ * 投手媒体第24天新用户充值
+ * 投手媒体第25天新用户充值
+ * 投手媒体第26天新用户充值
+ * 投手媒体第27天新用户充值
+ * 投手媒体第28天新用户充值
+ * 投手媒体第29天新用户充值
+ * 投手媒体第30天新用户充值
+ * 投手媒体第N天新用户充值
+ * 投手媒体第1天新用户人数
+ * 投手媒体第2天新用户人数
+ * 投手媒体第3天新用户人数
+ * 投手媒体第4天新用户人数
+ * 投手媒体第5天新用户人数
+ * 投手媒体第6天新用户人数
+ * 投手媒体第7天新用户人数
+ * 投手媒体第8天新用户人数
+ * 投手媒体第9天新用户人数
+ * 投手媒体第10天新用户人数
+ * 投手媒体第11天新用户人数
+ * 投手媒体第12天新用户人数
+ * 投手媒体第13天新用户人数
+ * 投手媒体第14天新用户人数
+ * 投手媒体第15天新用户人数
+ * 投手媒体第16天新用户人数
+ * 投手媒体第17天新用户人数
+ * 投手媒体第18天新用户人数
+ * 投手媒体第19天新用户人数
+ * 投手媒体第20天新用户人数
+ * 投手媒体第21天新用户人数
+ * 投手媒体第22天新用户人数
+ * 投手媒体第23天新用户人数
+ * 投手媒体第24天新用户人数
+ * 投手媒体第25天新用户人数
+ * 投手媒体第26天新用户人数
+ * 投手媒体第27天新用户人数
+ * 投手媒体第28天新用户人数
+ * 投手媒体第29天新用户人数
+ * 投手媒体第N天新用户充值人数
@@ -0,0 +1,1158 @@
+@Table(AdsPitcherDayParent.TABLE_NAME)
+@PK({"dt", "sourceSystem", "pitcherId"})
+public class AdsPitcherDayParent implements Serializable {
+ public static final String TABLE_NAME = "game_ads_parent.ads_pitcher_day_parent";
+ private Double cost;
+ private Double firstNewUserAmount;
+ private Double amount;
+ private Double oldAmount;
+ private Double newUserTotalAmount;
+ private Double buyNewUserTotalAmount;
+ private Double registerCost;
+ private Double firstRoi;
+ private Double buyRoi;
+ private Double todayRoi;
+ private Double grossProfit;
+ private Double firstRate;
+ private Double buyUserRate;
+ private Double todayRate;
+ private Double firstAvg;
+ private Double buyAvg;
+ private Double todayAvg;
+ private Double paperAvg;
+ private Double firstAmountCost;
+ private Double buyAmountCost;
+ private Double todayAmountCost;
+ private Double todayAgainRate;
+ private Double newRegArpu;
+ private Double firstArpu;
+ private Double todayArpu;
+ private Double paperArpu;
+ private Double hundredUserNumCost;
+ private Double roi1;
+ private Double roi2;
+ private Double roi3;
+ private Double roi4;
+ private Double roi5;
+ private Double roi6;
+ private Double roi7;
+ private Double roi8;
+ private Double roi9;
+ private Double roi10;
+ private Double roi11;
+ private Double roi12;
+ private Double roi13;
+ private Double roi14;
+ private Double roi15;
+ private Double roi16;
+ private Double roi17;
+ private Double roi18;
+ private Double roi19;
+ private Double roi20;
+ private Double roi21;
+ private Double roi22;
+ private Double roi23;
+ private Double roi24;
+ private Double roi25;
+ private Double roi26;
+ private Double roi27;
+ private Double roi28;
+ private Double roi29;
+ private Double roi30;
+ private Double roi60;
+ private Double roi90;
+ private Double roi180;
+ private Double roi1yaer;
+ private Double roiTotal;
+ private Double da1;
+ private Double da2;
+ private Double da3;
+ private Double da4;
+ private Double da5;
+ private Double da6;
+ private Double da7;
+ private Double da8;
+ private Double da9;
+ private Double da10;
+ private Double da11;
+ private Double da12;
+ private Double da13;
+ private Double da14;
+ private Double da15;
+ private Double da16;
+ private Double da17;
+ private Double da18;
+ private Double da19;
+ private Double da20;
+ private Double da21;
+ private Double da22;
+ private Double da23;
+ private Double da24;
+ private Double da25;
+ private Double da26;
+ private Double da27;
+ private Double da28;
+ private Double da29;
+ private Double da30;
+ * 投手游戏第2月新用户充值
+ private Double m2;
+ * 投手游戏第3月新用户充值
+ private Double m3;
+ * 投手游戏第6月新用户充值
+ private Double m6;
+ * 投手游戏第1年新用户充值
+ private Double y1;
+ private Double total;
+ * 投手游戏第30天新用户人数
+ * 投手游戏第2月新用户人数
+ private Long m2Num;
+ * 投手游戏第3月新用户人数
+ private Long m3Num;
+ * 投手游戏第6月新用户人数
+ * 投手游戏第1年新用户人数
+ private Long y1Num;
@@ -6,6 +6,7 @@ import com.google.gson.Gson;
import com.zanxiang.game.data.serve.component.DataPowerComponent;
import com.zanxiang.game.data.serve.pojo.dto.*;
import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
+import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDayParent;
import com.zanxiang.game.data.serve.pojo.entity.AdsAgentDayAgain;
import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
import com.zanxiang.game.data.serve.pojo.vo.*;
@@ -18,6 +19,7 @@ import lombok.Builder;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
@@ -30,7 +32,6 @@ import org.nutz.dao.util.Daos;
import org.nutz.dao.util.cri.SimpleCriteria;
-import org.springframework.util.CollectionUtils;
import java.lang.reflect.Method;
@@ -52,21 +53,32 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
public Page<GamePromoteDayVO> accountAgentDay(GamePromoteDayDTO dto) {
Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo(dto.getSourceSystem());
- List<Long> userIds = dto.getSysUserId() == null ? poerInfo.first : Collections.singletonList(dto.getSysUserId());
- List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+ List<Long> userIds = StringUtils.isBlank(dto.getSysUserId()) ? poerInfo.first : List.of(Long.valueOf(dto.getSysUserId()));
+ List<Long> gameIds = CollectionUtils.isEmpty(dto.getGameId()) ? poerInfo.second : dto.getGameId();
- /*Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
- sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
- dto.setSysUserId(sysUserId);*/
if (null == dto.getBeginDay() || null == dto.getEndDay()) {
dto.setBeginDay(LocalDate.now());
dto.setEndDay(LocalDate.now());
+ if (dto.getGameDimension() == null) {
+ //默认查询子游戏维度
+ dto.setGameDimension(1L);
+ String gameColumn = "game_id";
+ String gameNameColumn = "game_name";
+ String gameTypeColumn = "game_type";
+ Class<?> clazz = AdsAccountAgentDay.class;
+ if (dto.getGameDimension() == 2L) {
+ gameColumn = "parent_game_id";
+ gameNameColumn = "parent_game_name";
+ gameTypeColumn = "parent_game_type";
+ clazz = AdsAccountAgentDayParent.class;
Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
// 创建一个 Criteria 接口实例
SimpleCriteria cri = Cnd.cri();
// 组装条件
- if (userIds != null) {
+ if (CollectionUtils.isNotEmpty(userIds)) {
cri.where().andInList("pitcher_id", userIds);
if (StringUtils.isNotBlank(dto.getAccountId())) {
@@ -82,13 +94,13 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
cri.where().andLike("game_cp", dto.getCpName());
if (StringUtils.isNotBlank(dto.getGameName())) {
- cri.where().andLike("game_name", dto.getGameName());
+ cri.where().andLike(gameNameColumn, dto.getGameName());
- if (gameIds != null) {
- cri.where().andInList("game_id", gameIds);
+ if (CollectionUtils.isNotEmpty(gameIds)) {
+ cri.where().andInList(gameColumn, gameIds);
if (StringUtils.isNotBlank(dto.getGameType())) {
- cri.where().andEquals("game_type", dto.getGameType());
+ cri.where().andEquals(gameTypeColumn, dto.getGameType());
if (null != dto.getBeginDay()) {
cri.where().and("dt", ">=", dto.getBeginDay());
@@ -108,12 +120,17 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
cri.orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
- Sql sql = Sqls.queryEntity(accountAgentDaySql() + "$condition");
+ Sql sql;
+ if (dto.getGameDimension() == 1L) {
+ sql = Sqls.queryEntity(accountAgentDaySql() + "$condition");
+ sql = Sqls.queryEntity(accountAgentDaySqlForParent() + "$condition");
sql.setPager(pager);
Entity<GamePromoteDayVO> entity = dao.getEntity(GamePromoteDayVO.class);
sql.setEntity(entity).setCondition(cri);
dao.execute(sql);
- pager.setRecordCount(dao.count(AdsAccountAgentDay.class, cri));
+ pager.setRecordCount(dao.count(clazz, cri));
List<GamePromoteDayVO> collect = sql.getList(GamePromoteDayVO.class).stream().map(item -> {
setDayRechargeTrend(item);
return item;
@@ -247,20 +264,29 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
public GamePromoteDayTotalVO accountAgentDayTotal(GamePromoteDayTotalDTO dto) {
- if (null != userIds) {
@@ -276,13 +302,13 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
@@ -1468,6 +1494,234 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
""";
+ * 推广每日数据SQL- 父游戏维度
+ * @return
+ private String accountAgentDaySqlForParent() {
+ return """
+ select
+ dt,
+ concat( dt, account_id, agent_id ) AS id,
+ source_system,
+ agent_id,
+ agent_name,
+ account_type,
+ account_id,
+ pitcher AS sys_user_name,
+ game_cp AS cp_name,
+ parent_game_id as game_id,
+ parent_game_name as game_name,
+ parent_game_type as game_type,
+ dt AS cost_day,
+ pitcher_id AS sys_user_id,
+ cost,
+ plan_count AS ad_plan_count,
+ view_count,
+ click_count,
+ change_count AS convert_count,
+ change_rate AS convert_rate,
+ avg_change_price AS avg_convert_cost,
+ depth_change_count AS deep_convert_count,
+ depth_change_rate AS deep_convert_rate,
+ avg_depth_change_price AS deep_convert_cost,
+ thousand_display_price AS thousand_view_cost,
+ click_rate,
+ avg_click_price AS avg_click_cost,
+ download_start AS app_download_count,
+ download_start_cost AS app_download_cost,
+ download_start_rate AS app_download_rate,
+ download_finish,
+ download_finish_cost,
+ download_finish_rate,
+ install_finish AS app_install_count,
+ install_finish_cost AS app_install_cost,
+ install_finish_rate AS app_install_rate,
+ active AS app_active_count,
+ active_cost AS app_active_cost,
+ active_rate AS app_active_rate,
+ register_num AS reg_user_count,
+ register_cost AS reg_cost,
+ first_new_user_amount_count AS first_user_recharge_count,
+ first_new_user_amount_num AS first_user_recharge_user,
+ first_new_user_amount AS first_user_recharge_money,
+ amount_count AS show_recharge_count,
+ amount_num AS show_recharge_user,
+ amount AS show_recharge_money,
+ old_amount_count AS old_user_recharge_count,
+ old_amount_num AS old_user_recharge_user,
+ old_amount AS old_user_recharge_money,
+ new_user_total_amount_count AS new_user_recharge_count,
+ new_user_total_amount_num AS new_user_recharge_user,
+ new_user_total_amount AS new_user_recharge_money,
+ today_roi AS today_recovery_rate,
+ first_roi AS first_recovery_rate,
+ buy_roi AS buy_recovery_rate,
+ gross_profit AS gross_margin,
+ roi1 AS roi_day1,
+ roi2 AS roi_day2,
+ roi3 AS roi_day3,
+ roi4 AS roi_day4,
+ roi5 AS roi_day5,
+ roi6 AS roi_day6,
+ roi7 AS roi_day7,
+ roi8 AS roi_day8,
+ roi9 AS roi_day9,
+ roi10 AS roi_day10,
+ roi11 AS roi_day11,
+ roi12 AS roi_day12,
+ roi13 AS roi_day13,
+ roi14 AS roi_day14,
+ roi15 AS roi_day15,
+ roi16 AS roi_day16,
+ roi17 AS roi_day17,
+ roi18 AS roi_day18,
+ roi19 AS roi_day19,
+ roi20 AS roi_day20,
+ roi21 AS roi_day21,
+ roi22 AS roi_day22,
+ roi23 AS roi_day23,
+ roi24 AS roi_day24,
+ roi25 AS roi_day25,
+ roi26 AS roi_day26,
+ roi27 AS roi_day27,
+ roi28 AS roi_day28,
+ roi29 AS roi_day29,
+ roi30 AS roi_day30,
+ roi60 AS roi_day60,
+ roi90 AS roi_day90,
+ roi180 AS roi_day180,
+ roi1yaer AS roi_year1,
+ roi_total AS roi_total,
+ first_rate AS first_recharge_rate,
+ buy_user_rate AS buy_user_recharge_rate,
+ today_rate AS new_user_recharge_rate,
+ first_avg AS avg_first_user_recharge,
+ buy_avg AS avg_buy_user_recharge,
+ paper_avg AS avg_show_user_recharge,
+ first_amount_cost AS first_recharge_cost,
+ buy_amount_cost AS buy_user_recharge_cost,
+ today_again_rate AS repeat_recharge_rate,
+ new_reg_arpu,
+ first_arpu AS first_recharge_arpu,
+ today_arpu AS today_recharge_arpu,
+ paper_arpu AS show_recharge_arpu,
+ amount_d1 AS trend_day1,
+ amount_d2 AS trend_day2,
+ amount_d3 AS trend_day3,
+ amount_d4 AS trend_day4,
+ amount_d5 AS trend_day5,
+ amount_d6 AS trend_day6,
+ amount_d7 AS trend_day7,
+ amount_d8 AS trend_day8,
+ amount_d9 AS trend_day9,
+ amount_d10 AS trend_day10,
+ amount_d11 AS trend_day11,
+ amount_d12 AS trend_day12,
+ amount_d13 AS trend_day13,
+ amount_d14 AS trend_day14,
+ amount_d15 AS trend_day15,
+ amount_d16 AS trend_day16,
+ amount_d17 AS trend_day17,
+ amount_d18 AS trend_day18,
+ amount_d19 AS trend_day19,
+ amount_d20 AS trend_day20,
+ amount_d21 AS trend_day21,
+ amount_d22 AS trend_day22,
+ amount_d23 AS trend_day23,
+ amount_d24 AS trend_day24,
+ amount_d25 AS trend_day25,
+ amount_d26 AS trend_day26,
+ amount_d27 AS trend_day27,
+ amount_d28 AS trend_day28,
+ amount_d29 AS trend_day29,
+ amount_d30 AS trend_day30,
+ amount_d31 AS trend_day31,
+ amount_d32 AS trend_day32,
+ amount_d33 AS trend_day33,
+ amount_d34 AS trend_day34,
+ amount_d35 AS trend_day35,
+ amount_d36 AS trend_day36,
+ amount_d37 AS trend_day37,
+ amount_d38 AS trend_day38,
+ amount_d39 AS trend_day39,
+ amount_d40 AS trend_day40,
+ amount_d41 AS trend_day41,
+ amount_d42 AS trend_day42,
+ amount_d43 AS trend_day43,
+ amount_d44 AS trend_day44,
+ amount_d45 AS trend_day45,
+ amount_d46 AS trend_day46,
+ amount_d47 AS trend_day47,
+ amount_d48 AS trend_day48,
+ amount_d49 AS trend_day49,
+ amount_d50 AS trend_day50,
+ amount_d51 AS trend_day51,
+ amount_d52 AS trend_day52,
+ amount_d53 AS trend_day53,
+ amount_d54 AS trend_day54,
+ amount_d55 AS trend_day55,
+ amount_d56 AS trend_day56,
+ amount_d57 AS trend_day57,
+ amount_d58 AS trend_day58,
+ amount_d59 AS trend_day59,
+ amount_d60 AS trend_day60,
+ amount_d61 AS trend_day61,
+ amount_d62 AS trend_day62,
+ amount_d63 AS trend_day63,
+ amount_d64 AS trend_day64,
+ amount_d65 AS trend_day65,
+ amount_d66 AS trend_day66,
+ amount_d67 AS trend_day67,
+ amount_d68 AS trend_day68,
+ amount_d69 AS trend_day69,
+ amount_d70 AS trend_day70,
+ amount_d71 AS trend_day71,
+ amount_d72 AS trend_day72,
+ amount_d73 AS trend_day73,
+ amount_d74 AS trend_day74,
+ amount_d75 AS trend_day75,
+ amount_d76 AS trend_day76,
+ amount_d77 AS trend_day77,
+ amount_d78 AS trend_day78,
+ amount_d79 AS trend_day79,
+ amount_d80 AS trend_day80,
+ amount_d81 AS trend_day81,
+ amount_d82 AS trend_day82,
+ amount_d83 AS trend_day83,
+ amount_d84 AS trend_day84,
+ amount_d85 AS trend_day85,
+ amount_d86 AS trend_day86,
+ amount_d87 AS trend_day87,
+ amount_d88 AS trend_day88,
+ amount_d89 AS trend_day89,
+ amount_d90 AS trend_day90,
+ amount_m4 AS trend_month4,
+ amount_m5 AS trend_month5,
+ amount_m6 AS trend_month6,
+ amount_m7 AS trend_month7,
+ amount_m8 AS trend_month8,
+ amount_m9 AS trend_month9,
+ amount_m10 AS trend_month10,
+ amount_m11 AS trend_month11,
+ amount_m12 AS trend_month12,
+ amount_sum AS trend_total,
+ round(if(first_new_user_amount_count > 0, cost / first_new_user_amount_count, 0), 4) as first_recharge_count_cost,
+ round(if(old_amount_count > 0, cost / old_amount_count, 0), 4) as old_user_recharge_count_cost,
+ round(if(amount_count > 0, cost / amount_count, 0), 4) as show_recharge_count_cost,
+ round(if(new_user_total_amount_count > 0, cost / new_user_total_amount_count, 0), 4) as new_user_recharge_count_cost,
+ hundred_user_num,
+ hundred_user_num_cost,
+ first_role_num,
+ new_user_total_role_num,
+ role_num
+ from
+ game_ads_parent.ads_account_agent_day_parent
+ """;
* 推广每日数据总计SQL
*
@@ -258,7 +258,7 @@ public class GameDataServiceImpl implements IGameDataService {
cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
- //编写sql语句 拼接查询条件
+ //编写sql语句 拼接查询条件1
Sql sql = Sqls.create(gameDataDayForSonSql(dto.getTableTypes()) + cri);
//设置自定义回显对象
sql.setCallback(Sqls.callback.entities());
@@ -626,7 +626,12 @@ public class GameDataServiceImpl implements IGameDataService {
public Page<GameDataTotalVO> getGameDataTotal(GameDataTotalDTO dto) {
com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo(dto.getSourceSystem());
//如果注册时间参数为空,默认设置查询当天数据
if (dto.getRegisteredBeginDate() == null || dto.getRegisteredEndDate() == null) {
dto.setRegisteredBeginDate(LocalDate.now());
@@ -662,7 +667,12 @@ public class GameDataServiceImpl implements IGameDataService {
orderByCri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
//创建sql语句 执行sql
- Sql sql = Sqls.create(getGameDataTotalSql(dto.getTableTypes(), criA, criB, criAmount, criNewUser, criRoleNum) + orderByCri);
+ sql = Sqls.create(getGameDataTotalSql(dto.getTableTypes(), criA, criB, criAmount, criNewUser, criRoleNum) + orderByCri);
+ sql = Sqls.create(getGameDataTotalSqlForParent(dto.getTableTypes(), criA, criB, criAmount, criNewUser, criRoleNum) + orderByCri);
sql.setEntity(dao.getEntity(GameDataTotalVO.class));
@@ -673,16 +683,30 @@ public class GameDataServiceImpl implements IGameDataService {
//得到结果集list
List<GameDataTotalVO> list = sql.getList(GameDataTotalVO.class);
//设置查询总数
- Sql sqlCount = Sqls.queryEntity("select count(*) from ads_game_day" + criA);
+ Sql sqlCount;
+ sqlCount = Sqls.queryEntity("select count(*) from ads_game_day" + criA);
+ sqlCount = Sqls.queryEntity("select count(*) from game_ads_parent.ads_game_day_parent" + criA);
pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
//不同类型的数据查询不同的dayN表
Map<String, DayN> dayNMap;
- switch (dto.getTableTypes()) {
- case "buy" -> dayNMap = tempDayNData(dto, "ads_dayn_game_buy");
- case "nature" -> dayNMap = tempDayNData(dto, "ads_dayn_game_nature");
- case "total" -> dayNMap = tempDayNData(dto, "ads_dayn_game");
- default -> dayNMap = tempDayNData(dto, "ads_dayn_game");
+ switch (dto.getTableTypes()) {
+ case "buy" -> dayNMap = tempDayNData(dto, "ads_dayn_game_buy");
+ case "nature" -> dayNMap = tempDayNData(dto, "ads_dayn_game_nature");
+ case "total" -> dayNMap = tempDayNData(dto, "ads_dayn_game");
+ default -> dayNMap = tempDayNData(dto, "ads_dayn_game");
+ case "buy" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_buy_parent");
+ case "nature" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_nature_parent");
+ case "total" -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_parent");
+ default -> dayNMap = tempDayNData(dto, "game_ads_parent.ads_dayn_game_parent");
//根据充值时间修改值
@@ -748,7 +772,16 @@ public class GameDataServiceImpl implements IGameDataService {
public GameDataTotalTotalVO getGameDataTotalTotal(GameDataTotalTotalDTO dto) {
+ String tableName = "game_ads.ads_game_day";
+ if (dto.getGameDimension() == 2L){
+ tableName = "game_ads_parent.ads_game_day_parent";
@@ -777,7 +810,7 @@ public class GameDataServiceImpl implements IGameDataService {
//创角人数查询条件
Criteria criRoleNum = myCriRole(gameIds, totalDTO);
- Sql sql = Sqls.create(gameDataTotalTotalSql(dto.getTableTypes()) + criA);
+ Sql sql = Sqls.create(gameDataTotalTotalSql(dto.getTableTypes(), tableName) + criA);
sql.setCallback(Sqls.callback.entity());
sql.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
@@ -786,7 +819,7 @@ public class GameDataServiceImpl implements IGameDataService {
//得到含有部分总数据总计结果的GameDataTotalTotalVO
GameDataTotalTotalVO vo = sql.getObject(GameDataTotalTotalVO.class);
//处理账面、新用户充值人数、新用户复充人数、创角人数相关数据
- GameDataTotalTotalVO tempVO = getGameDataTotalSumAmountData(dto.getTableTypes(), criB, criAmount, criNewUser, criRoleNum);
+ GameDataTotalTotalVO tempVO = getGameDataTotalSumAmountData(dto, criB, criAmount, criNewUser, criRoleNum);
//将两个处理的对象合并
copyNullProperties(tempVO, vo);
//得到dayN相关数据
@@ -801,19 +834,24 @@ public class GameDataServiceImpl implements IGameDataService {
* @return PitcherDataTotalSumVO
- private GameDataTotalTotalVO getGameDataTotalSumAmountData(String tableType, Criteria criB, Criteria criAmount, Criteria criNewUser, Criteria criRoleNum) {
+ private GameDataTotalTotalVO getGameDataTotalSumAmountData(GameDataTotalTotalDTO dto, Criteria criB, Criteria criAmount, Criteria criNewUser, Criteria criRoleNum) {
//不同类型的数据需要额外添加条件
- if ("buy".equals(tableType)) {
+ if ("buy".equals(dto.getTableTypes())) {
criAmount.where().andNotEquals("agent_id", 0);
criNewUser.where().andNotEquals("agent_id", 0);
criRoleNum.where().andNotEquals("user_agent_id", 0);
- } else if ("nature".equals(tableType)) {
+ } else if ("nature".equals(dto.getTableTypes())) {
criAmount.where().andEquals("agent_id", 0);
criNewUser.where().andEquals("agent_id", 0);
criRoleNum.where().andEquals("user_agent_id", 0);
+ //默认查询的表-子游戏维度
//得到账面相关数据
- Sql sqlAmountData = Sqls.create(gameDataTotalSumAmountSql(tableType) + criB);
+ Sql sqlAmountData = Sqls.create(gameDataTotalSumAmountSql(dto.getTableTypes(), tableName) + criB);
//设置回传对象
sqlAmountData.setCallback(Sqls.callback.entity());
sqlAmountData.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
@@ -906,19 +944,29 @@ public class GameDataServiceImpl implements IGameDataService {
dayNMap.put("rechargeBeginDate", dto.getRechargeBeginDate());
dayNMap.put("rechargeEndDate", dto.getRechargeEndDate());
dayNMap.put("gameId", dto.getGameId());
+ dayNMap.put("gameDimension", dto.getGameDimension());
if (StringUtils.isNotBlank(dto.getSourceSystem())) {
dayNMap.put("sourceSystem", dto.getSourceSystem());
//得到dayN数据
DayN dayN;
- case "buy" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game_buy");
- case "nature" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game_nature");
- case "total" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
- default -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
+ case "buy" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game_buy");
+ case "nature" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game_nature");
+ case "total" -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
+ default -> dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
+ //父游戏维度
+ case "buy" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_buy_parent");
+ case "nature" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_nature_parent");
+ case "total" -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_parent");
+ default -> dayN = getDayNByTableName(dayNMap, "game_ads_parent.ads_dayn_game_parent");
//设置总量数据
//新用户充值次数、金额
vo.setNewUserAmount(dayN == null ? BigDecimal.ZERO : dayN.getRechargeMoney());
@@ -968,7 +1016,7 @@ public class GameDataServiceImpl implements IGameDataService {
public Page<GameDataWaterVO> getGameDataWater(GameDataWaterDTO dto) {
com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
- List<Long> userGameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+ List<Long> userGameIds = CollectionUtils.isEmpty(dto.getGameId()) ? poerInfo.second : dto.getGameId();
if (dto.getGameDimension() == null) {
//默认查询子游戏维度
@@ -1040,7 +1088,12 @@ public class GameDataServiceImpl implements IGameDataService {
SimpleCriteria templateCri = Cnd.cri();
templateCri.where().and("dt", "=", dto.getRechargeDate());
templateCri.where().andInList(gameColumn, gameIds);
- Sql templateSql = Sqls.queryEntity(waterTemplateSql() + "$condition");
+ Sql templateSql;
+ templateSql = Sqls.queryEntity(waterTemplateSql() + "$condition");
+ templateSql = Sqls.queryEntity(waterTemplateSqlForParent() + "$condition");
Entity<AdsEverydayWater> everydayWaterEntity = dao.getEntity(AdsEverydayWater.class);
templateSql.setEntity(everydayWaterEntity).setCondition(templateCri);
dao.execute(templateSql);
@@ -1249,23 +1302,28 @@ public class GameDataServiceImpl implements IGameDataService {
* @return Map
private Map<String, DayN> tempDayNData(GameDataTotalDTO dto, String tableName) {
//创建查询条件
Criteria cri = Cnd.cri();
if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
//拼接注册时间查询条件
cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
- if (dto.getGameId() != null) {
+ if (CollectionUtils.isNotEmpty(dto.getGameId())) {
//拼接游戏ID查询条件
- cri.where().andEquals("game_id", dto.getGameId());
+ cri.where().andInList(gameColumn, dto.getGameId());
//拼接SDK来源查询条件
cri.where().andEquals("source_system", dto.getSourceSystem());
- Sql dayNSql = Sqls.create("""
+ Sql dayNSql;
+ dayNSql = Sqls.create("""
SELECT
dt,
game_id,
@@ -1274,7 +1332,17 @@ public class GameDataServiceImpl implements IGameDataService {
FROM
$tableName
""" + cri);
+ SELECT
+ dayN as day_n
+ FROM
+ $tableName
+ """ + cri);
//给定查询的表名
dayNSql.vars().set("tableName", tableName);
//设置回传
@@ -1364,31 +1432,40 @@ public class GameDataServiceImpl implements IGameDataService {
* @return 查询条件
private Criteria myCri(List<Long> gameIds, GameDataTotalDTO dto, String type, Boolean needGroupBy) {
+ String classifyColumn = "game_classify";
+ classifyColumn = "parent_game_name_classify";
//根据传入的dto拼接查询参数
//拼接游戏名称查询条件
- cri.where().andEquals("game_name", dto.getGameName());
+ cri.where().andEquals(gameNameColumn, dto.getGameName());
//拼接游戏id查询条件
if (dto.getGameClassify() != null) {
//拼接游戏类型查询条件
- cri.where().andEquals("game_classify", dto.getGameClassify());
+ cri.where().andEquals(classifyColumn, dto.getGameClassify());
//拼接SDK来源
//根据type拼接不同的时间查询条件
- if (type.equals("criA")) {
+ if ("criA".equals(type)) {
//拼接注册日期查询条件
- } else if (type.equals("criB")) {
+ } else if ("criB".equals(type)) {
if (dto.getRechargeBeginDate() != null && dto.getRechargeEndDate() != null) {
//拼接充值日期查询条件
cri.where().andBetween("dt", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
@@ -1396,7 +1473,7 @@ public class GameDataServiceImpl implements IGameDataService {
if (needGroupBy) {
//拼接分组条件
- cri.getGroupBy().groupBy("game_id", "game_classify", "source_system");
+ cri.getGroupBy().groupBy(gameColumn, classifyColumn, "source_system");
return cri;
@@ -1410,15 +1487,22 @@ public class GameDataServiceImpl implements IGameDataService {
private Criteria myCriRecharge(List<Long> gameIds, GameDataTotalDTO dto, Boolean needRegTime) {
+ String classifyColumn = "classify";
+ classifyColumn = "parent_game_classify";
- cri.where().andEquals("classify", dto.getGameClassify());
@@ -1444,11 +1528,15 @@ public class GameDataServiceImpl implements IGameDataService {
private Criteria myCriRole(List<Long> gameIds, GameDataTotalDTO dto) {
+ String gameColumn = "user_game_id";
- cri.where().andInList("user_game_id", gameIds);
@@ -1511,6 +1599,8 @@ public class GameDataServiceImpl implements IGameDataService {
* @return DayN数据
private DayN getDayNByTableName(Map<String, Object> dayNMap, String tableName) {
+ //查询的游戏维度
+ Long gameDimension = (Long) dayNMap.get("gameDimension");
@@ -1518,9 +1608,14 @@ public class GameDataServiceImpl implements IGameDataService {
cri.where().andBetween("dt", dayNMap.get("registerBeginDate"), dayNMap.get("registerEndDate"));
- if (dayNMap.get("gameId") != null) {
- //拼接游戏ID查询条件
- cri.where().andEquals("game_id", dayNMap.get("gameId"));
+ if (CollectionUtils.isNotEmpty((List<?>)dayNMap.get("gameId"))) {
+ if (gameDimension == 1L) {
+ // 子游戏维度
+ cri.where().andInList("game_id", (List<Long>) dayNMap.get("gameId"));
+ // 父游戏维度
+ cri.where().andInList("parent_game_id", (List<Long>) dayNMap.get("gameId"));
if (dayNMap.get("sourceSystem") != null) {
@@ -3760,13 +3855,403 @@ public class GameDataServiceImpl implements IGameDataService {
+ * 游戏总数据SQL-父游戏维度
+ * @param tableType 查询类型
+ * @param criA 主表查询条件
+ * @param criB 账面相关查询条件
+ * @param criAmount 账面充值人数查询条件
+ * @param criNewUser 新用户相关查询条件
+ * @param criRoleNum 创角人数相关查询条件
+ * @return String
+ private String getGameDataTotalSqlForParent(String tableType, Criteria criA, Criteria criB, Criteria criAmount, Criteria criNewUser, Criteria criRoleNum) {
+ if ("buy".equals(tableType)) {
+ a.*,
+ IFNULL(amount_count, 0) amount_count,
+ IFNULL(amount, 0) amount,
+ IFNULL(avg_amount, 0) avg_amount,
+ IFNULL(new_user_amount_num, 0) new_user_amount_num,
+ IFNULL(new_user_again_num, 0) new_user_again_num,
+ IFNULL(amount_num, 0) amount_num,
+ IFNULL(role_num, 0) role_num
+ FROM(
+ MAX(parent_game_name) as game_name,
+ parent_game_name_classify as game_classify,
+ sum(buy_reg_num) reg_num,
+ sum(cost) cost,
+ sum(buy_first_new_user_amount_count) first_new_user_amount_count,
+ sum(buy_first_new_user_amount_num) first_new_user_amount_num,
+ sum(buy_first_new_user_amount) first_new_user_amount,
+ sum(buy_new_user_total_amount_count) new_user_total_amount_count,
+ sum(buy_new_user_total_amount_num) new_user_total_amount_num,
+ sum(buy_new_user_total_amount) new_user_total_amount,
+ round(if(SUM(cost) > 0 , SUM(buy_first_new_user_amount) / SUM(cost) , 0), 4) first_roi,
+ round(if(sum(buy_reg_num) > 0 , sum(buy_first_new_user_amount_num) / sum(buy_reg_num), 0), 4) first_amount_rate,
+ round(if(sum(buy_reg_num) > 0, sum(buy_new_user_total_amount_num) / sum(buy_reg_num), 0), 4) today_amount_rate,
+ round(if(sum(buy_first_new_user_amount_count) > 0, sum(buy_first_new_user_amount) / sum(buy_first_new_user_amount_count), 0), 2) first_avg_amount,
+ round(if(sum(buy_new_user_total_amount_count) > 0, sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_count), 0), 2) today_avg_amount,
+ round(if(sum(buy_new_user_total_amount_num) > 0 , sum(buy_reg_order_user_again) / sum(buy_new_user_total_amount_num), 0), 4) today_again_rate,
+ round(if(sum(buy_reg_num) > 0 , sum(buy_new_user_total_amount) / sum(buy_reg_num), 0), 2) reg_user_arpu,
+ round(if(sum(buy_first_new_user_amount_num) > 0 , sum(buy_first_new_user_amount) / sum(buy_first_new_user_amount_num), 0), 2) first_amount_arpu,
+ round(if(sum(buy_new_user_total_amount_num) > 0 , sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_num), 0), 2) today_amount_arpu,
+ round(if(SUM(buy_reg_num) > 0, SUM(cost) / SUM(buy_reg_num), 0), 2) reg_cost,
+ round(if(SUM(cost) > 0 , SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) total_roi,
+ round(if(SUM(buy_first_new_user_amount_num) > 0, SUM(cost) / SUM(buy_first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
+ round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) total_recharge_cost,
+ IFNULL(SUM(buy_hundred_user_num), 0) hundred_user_num,
+ round(IF(SUM(buy_hundred_user_num) > 0, SUM(cost) / SUM(buy_hundred_user_num), 0), 2) hundred_user_num_cost,
+ IFNULL(SUM(buy_first_role_num), 0) first_role_num,
+ IFNULL(SUM(buy_new_user_total_role_num), 0) new_user_total_role_num,
+ round(IF(SUM(buy_first_role_num) > 0, SUM(cost) / SUM(buy_first_role_num), 0), 2) first_role_num_cost,
+ round(IF(SUM(buy_new_user_total_role_num) >0, SUM(cost) / SUM(buy_new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
+ round(IF(SUM(buy_reg_num) >0, SUM(buy_first_role_num) / SUM(buy_reg_num), 0), 4) first_role_num_rate,
+ round(IF(SUM(buy_reg_num) >0, SUM(buy_new_user_total_role_num) / SUM(buy_reg_num), 0), 4) new_user_total_role_num_rate
+ game_ads_parent.ads_game_day_parent
+ """ + criA +
+ """
+ ) a
+ LEFT JOIN (
+ source_system as b_source_system,
+ parent_game_id as b_game_id,
+ MAX(parent_game_name) as b_game_name,
+ IFNULL(sum(buy_amount_count), 0) amount_count,
+ IFNULL(sum(buy_amount), 0) amount,
+ round(if(sum(buy_amount_count) > 0, sum(buy_amount) / sum(buy_amount_count), 0), 2) avg_amount
+ """ + criB +
+ ) b
+ ON a.game_id = b.b_game_id and a.game_name = b.b_game_name and a.source_system = b.b_source_system
+ LEFT JOIN(
+ source_system as d_source_system,
+ parent_game_id as d_game_id,
+ IFNULL(COUNT(DISTINCT user_id), 0) amount_num
+ game_ads.ads_information
+ """ + criAmount +
+ AND NOT agent_id = 0
+ GROUP BY parent_game_id, source_system) d
+ ON a.game_id = d.d_game_id and a.source_system = d.d_source_system
+ source_system as f_source_system,
+ parent_game_id as f_game_id,
+ COUNT(DISTINCT user_id) new_user_amount_num
+ """ + criNewUser +
+ GROUP BY parent_game_id, source_system) f
+ ON a.game_id = f.f_game_id and a.source_system = f.f_source_system
+ source_system as g_source_system,
+ parent_game_id as g_game_id,
+ COUNT(tempA.num) as new_user_again_num
+ FROM (
+ parent_game_id,
+ COUNT(user_id) num
+ GROUP BY
+ user_id,
+ source_system
+ HAVING
+ COUNT(user_id) > 1 ) tempA
+ GROUP BY tempA.parent_game_id, tempA.source_system) g
+ ON a.game_id = g.g_game_id and a.source_system = g.g_source_system
+ source_system as n_source_system,
+ parent_game_id ,
+ COUNT(DISTINCT role_user_id) as role_num
+ dw_create_role_detail
+ """ + criRoleNum +
+ AND NOT user_agent_id = 0
+ GROUP BY parent_game_id,source_system
+ ) n
+ ON a.game_id = n.parent_game_id and a.source_system = n.n_source_system
+ } else if ("nature".equals(tableType)) {
+ sum(nature_reg_num) reg_num,
+ sum(nature_first_new_user_amount_count) first_new_user_amount_count,
+ sum(nature_first_new_user_amount_num) first_new_user_amount_num,
+ sum(nature_first_new_user_amount) first_new_user_amount,
+ sum(nature_new_user_total_amount_count) new_user_total_amount_count,
+ sum(nature_new_user_total_amount_num) new_user_total_amount_num,
+ sum(nature_new_user_total_amount) new_user_total_amount,
+ round(if(SUM(cost) > 0 , SUM(nature_first_new_user_amount) / SUM(cost) , 0), 4) first_roi,
+ round(if(sum(nature_reg_num) > 0 , sum(nature_first_new_user_amount_num) / sum(nature_reg_num), 0), 4) first_amount_rate,
+ round(if(sum(nature_reg_num) > 0, sum(nature_new_user_total_amount_num) / sum(nature_reg_num), 0), 4) today_amount_rate,
+ round(if(sum(nature_first_new_user_amount_count) > 0, sum(nature_first_new_user_amount) / sum(nature_first_new_user_amount_count), 0), 2) first_avg_amount,
+ round(if(sum(nature_new_user_total_amount_count) > 0, sum(nature_new_user_total_amount) / sum(nature_new_user_total_amount_count), 0), 2) today_avg_amount,
+ round(if(sum(nature_new_user_total_amount_num) > 0 , sum(nature_reg_order_user_again) / sum(nature_new_user_total_amount_num), 0), 4) today_again_rate,
+ round(if(sum(nature_reg_num) > 0 , sum(nature_new_user_total_amount) / sum(nature_reg_num), 0), 2) reg_user_arpu,
+ round(if(sum(nature_first_new_user_amount_num) > 0 , sum(nature_first_new_user_amount) / sum(nature_first_new_user_amount_num), 0), 2) first_amount_arpu,
+ round(if(sum(nature_new_user_total_amount_num) > 0 , sum(nature_new_user_total_amount) / sum(nature_new_user_total_amount_num), 0), 2) today_amount_arpu,
+ round(if(SUM(nature_reg_num) > 0, SUM(cost) / SUM(nature_reg_num), 0), 2) reg_cost,
+ round(if(SUM(cost) > 0 , SUM(nature_new_user_total_amount) / SUM(cost), 0), 4) total_roi,
+ round(if(SUM(nature_first_new_user_amount_num) > 0, SUM(cost) / SUM(nature_first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
+ round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(cost) / SUM(nature_new_user_total_amount_num), 0), 2) total_recharge_cost,
+ IFNULL(SUM(nature_hundred_user_num), 0) hundred_user_num,
+ round(IF(SUM(nature_hundred_user_num) > 0, SUM(cost) / SUM(nature_hundred_user_num), 0), 2) hundred_user_num_cost,
+ SUM(nature_first_role_num) first_role_num,
+ SUM(nature_new_user_total_role_num) new_user_total_role_num,
+ round(IF(SUM(nature_first_role_num) > 0, SUM(cost) / SUM(nature_first_role_num), 0), 2) first_role_num_cost,
+ round(IF(SUM(nature_new_user_total_role_num) >0, SUM(cost) / SUM(nature_new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
+ round(IF(SUM(nature_reg_num) >0, SUM(nature_first_role_num) / SUM(nature_reg_num), 0), 4) first_role_num_rate,
+ round(IF(SUM(nature_reg_num) >0, SUM(nature_new_user_total_role_num) / SUM(nature_reg_num), 0), 4) new_user_total_role_num_rate
+ IFNULL(sum(nature_amount_count), 0) amount_count,
+ IFNULL(sum(nature_amount), 0) amount,
+ round(if(sum(nature_amount_count) > 0, sum(nature_amount) / sum(nature_amount_count), 0), 2) avg_amount
+ source_system as e_source_system,
+ parent_game_id as e_game_id,
+ AND agent_id = 0
+ GROUP BY parent_game_id, source_system ) e
+ ON a.game_id = e.e_game_id and a.source_system = e.e_source_system
+ source_system as h_source_system,
+ parent_game_id as h_game_id,
+ COUNT(DISTINCT user_id) as new_user_amount_num
+ GROUP BY parent_game_id, source_system) h
+ ON a.game_id = h.h_game_id and a.source_system = h.h_source_system
+ source_system as i_source_system,
+ parent_game_id as i_game_id,
+ COUNT(tempB.num) as new_user_again_num
+ COUNT(user_id) > 1 ) tempB
+ GROUP BY tempB.parent_game_id, tempB.source_system ) i
+ ON a.game_id = i.i_game_id and a.source_system = i.i_source_system
+ source_system as m_source_system,
+ AND user_agent_id = 0
+ GROUP BY parent_game_id, source_system
+ ) m
+ ON a.game_id = m.parent_game_id and a.source_system = m.m_source_system
+ //总量
+ sum(reg_num) reg_num,
+ sum(first_new_user_amount_count) first_new_user_amount_count,
+ sum(first_new_user_amount_num) first_new_user_amount_num,
+ sum(first_new_user_amount) first_new_user_amount,
+ sum(new_user_total_amount_count) new_user_total_amount_count,
+ sum(new_user_total_amount_num) new_user_total_amount_num,
+ sum(new_user_total_amount) new_user_total_amount,
+ round(if(SUM(cost) > 0 , SUM(first_new_user_amount) / SUM(cost) , 0), 4) first_roi,
+ round(if(sum(reg_num) > 0 , sum(first_new_user_amount_num) / sum(reg_num), 0), 4) first_amount_rate,
+ round(if(sum(reg_num) > 0, sum(new_user_total_amount_num) / sum(reg_num), 0), 4) today_amount_rate,
+ round(if(sum(first_new_user_amount_count) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_count), 0), 2) first_avg_amount,
+ round(if(sum(new_user_total_amount_count) > 0, sum(new_user_total_amount) / sum(new_user_total_amount_count), 0), 2) today_avg_amount,
+ round(if(sum(new_user_total_amount_num) > 0 , sum(reg_order_user_again) / sum(new_user_total_amount_num), 0), 4) today_again_rate,
+ round(if(sum(reg_num) > 0 , sum(new_user_total_amount) / sum(reg_num), 0), 2) reg_user_arpu,
+ round(if(sum(first_new_user_amount_num) > 0 , sum(first_new_user_amount) / sum(first_new_user_amount_num), 0), 2) first_amount_arpu,
+ round(if(sum(new_user_total_amount_num) > 0 , sum(new_user_total_amount) / sum(new_user_total_amount_num), 0), 2) today_amount_arpu,
+ round(if(SUM(reg_num) > 0, SUM(cost) / SUM(reg_num), 0), 2) reg_cost,
+ round(if(SUM(cost) > 0 , SUM(new_user_total_amount) / SUM(cost), 0), 4) total_roi,
+ round(if(SUM(first_new_user_amount_num) > 0, SUM(cost) / SUM(first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
+ round(if(SUM(new_user_total_amount_num) > 0, SUM(cost) / SUM(new_user_total_amount_num), 0), 2) total_recharge_cost,
+ SUM(hundred_user_num) hundred_user_num,
+ round(IF(SUM(hundred_user_num) > 0, SUM(cost) / SUM(hundred_user_num), 0), 2) hundred_user_num_cost,
+ SUM(first_role_num) first_role_num,
+ SUM(new_user_total_role_num) new_user_total_role_num,
+ round(IF(SUM(first_role_num) > 0, SUM(cost) / SUM(first_role_num), 0), 2) first_role_num_cost,
+ round(IF(SUM(new_user_total_role_num) >0, SUM(cost) / SUM(new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
+ round(IF(SUM(reg_num) >0, SUM(first_role_num) / SUM(reg_num), 0), 4) first_role_num_rate,
+ round(IF(SUM(reg_num) >0, SUM(new_user_total_role_num) / SUM(reg_num), 0), 4) new_user_total_role_num_rate
+ IFNULL(sum(amount_count), 0) amount_count,
+ IFNULL(sum(amount), 0) amount,
+ round(if(sum(amount_count) > 0, sum(amount) / sum(amount_count), 0), 2) avg_amount
+ source_system as c_source_system,
+ parent_game_id as c_game_id,
+ GROUP BY parent_game_id, source_system) c
+ ON a.game_id = c.c_game_id and a.source_system = c.c_source_system
+ source_system as j_source_system,
+ parent_game_id as j_game_id,
+ + criNewUser +
+ GROUP BY parent_game_id, source_system) j
+ ON a.game_id = j.j_game_id and a.source_system = j.j_source_system
+ source_system as k_source_system,
+ parent_game_id as k_game_id,
+ COUNT(tempC.num) as new_user_again_num
+ COUNT(user_id) > 1 ) tempC
+ GROUP BY tempC.parent_game_id, tempC.source_system ) k
+ ON a.game_id = k.k_game_id and a.source_system = k.k_source_system
+ source_system as l_source_system,
+ ) l
+ ON a.game_id = l.parent_game_id and a.source_system = l.l_source_system
* 游戏总数据总计一栏sql
* @param tableType 查询的类型
* @return String
- private String gameDataTotalTotalSql(String tableType) {
+ private String gameDataTotalTotalSql(String tableType, String tableName) {
if ("buy".equals(tableType)) {
return """
@@ -3799,9 +4284,8 @@ public class GameDataServiceImpl implements IGameDataService {
round(IF(SUM(buy_new_user_total_role_num) >0, SUM(cost) / SUM(buy_new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
round(IF(SUM(buy_reg_num) >0, SUM(buy_first_role_num) / SUM(buy_reg_num), 0), 4) first_role_num_rate,
round(IF(SUM(buy_reg_num) >0, SUM(buy_new_user_total_role_num) / SUM(buy_reg_num), 0), 4) new_user_total_role_num_rate
- FROM
- game_ads.ads_game_day
- """;
+ """ + tableName;
} else if ("nature".equals(tableType)) {
@@ -3834,9 +4318,8 @@ public class GameDataServiceImpl implements IGameDataService {
round(IF(SUM(nature_new_user_total_role_num) >0, SUM(cost) / SUM(nature_new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
round(IF(SUM(nature_reg_num) >0, SUM(nature_first_role_num) / SUM(nature_reg_num), 0), 4) first_role_num_rate,
round(IF(SUM(nature_reg_num) >0, SUM(nature_new_user_total_role_num) / SUM(nature_reg_num), 0), 4) new_user_total_role_num_rate
//总量数据
@@ -3870,9 +4353,8 @@ public class GameDataServiceImpl implements IGameDataService {
round(IF(SUM(new_user_total_role_num) >0, SUM(cost) / SUM(new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
round(IF(SUM(reg_num) >0, SUM(first_role_num) / SUM(reg_num), 0), 4) first_role_num_rate,
round(IF(SUM(reg_num) >0, SUM(new_user_total_role_num) / SUM(reg_num), 0), 4) new_user_total_role_num_rate
@@ -3881,25 +4363,23 @@ public class GameDataServiceImpl implements IGameDataService {
- private String gameDataTotalSumAmountSql(String tableType) {
+ private String gameDataTotalSumAmountSql(String tableType, String tableName) {
IFNULL(sum(buy_amount_count),0) amount_count,
IFNULL(sum(buy_amount),0) amount,
round(if(sum(buy_amount_count) > 0, sum(buy_amount) / sum(buy_amount_count), 0), 2) avg_amount
IFNULL(sum(nature_amount_count),0) amount_count,
IFNULL(sum(nature_amount),0) amount,
round(if(sum(nature_amount_count) > 0, sum(nature_amount) / sum(nature_amount_count), 0), 2) avg_amount
@@ -3907,9 +4387,8 @@ public class GameDataServiceImpl implements IGameDataService {
IFNULL(sum(amount_count),0) amount_count,
IFNULL(sum(amount),0) amount,
round(if(sum(amount_count) > 0, sum(amount) / sum(amount_count), 0), 2) avg_amount
@@ -4547,11 +5026,11 @@ public class GameDataServiceImpl implements IGameDataService {
queryStr.append(" INTERVAL 0 day)");
//拼接sourceSystem条件
- if (againTrendVO.getSourceSystem() != null) {
+ if (StringUtils.isNotBlank(againTrendVO.getSourceSystem())) {
queryStr.append(" and source_system = '")
.append(againTrendVO.getSourceSystem())
.append("'");
- } else if (dto.getSourceSystem() != null) {
+ } else if (StringUtils.isNotBlank(dto.getSourceSystem())) {
.append(dto.getSourceSystem())
@@ -8902,6 +9381,29 @@ public class GameDataServiceImpl implements IGameDataService {
+ * 流水临时sql-父游戏维度
+ private String waterTemplateSqlForParent() {
+ user_order_by,
+ user_name,
+ user_amount,
+ amount_order_by,
+ amount_post,
+ amount_count,
+ role_name,
+ server_name,
+ amount_num
+ from game_ads_parent.ads_everyday_water_parent
* 用户详情sql-子游戏维度
@@ -4,7 +4,9 @@ import com.google.common.base.CaseFormat;
import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerDay;
+import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerDayParent;
import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerSumDay;
+import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerSumDayParent;
import com.zanxiang.game.data.serve.service.IGameServerService;
@@ -198,13 +200,22 @@ public class GameServerServiceImpl implements IGameServerService {
public Page<GameServerDayVO> getGameServerDataDay(GameServerDayDTO dto) {
+ List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : dto.getGameId();
+ //默认查询子游戏维度字段
if (dto.getServerId() != null) {
//拼接区服ID查询条件
@@ -233,18 +244,25 @@ public class GameServerServiceImpl implements IGameServerService {
+ //设置分页对象
+ Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
//创建sql语句查询数据
- Sql sql = Sqls.create(gameServerDaySql() + cri);
+ sql = Sqls.create(gameServerDaySql() + cri);
+ //设置总记录数
+ pager.setRecordCount(dao.count(AdsGameServerDay.class, cri));
+ sql = Sqls.create(gameServerDaySqlForParent() + cri);
+ pager.setRecordCount(dao.count(AdsGameServerDayParent.class, cri));
//设置自定义回传对象
sql.setEntity(dao.getEntity(GameServerDayVO.class));
- //设置分页对象
- Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
//执行sql
- //设置总记录数
- pager.setRecordCount(dao.count(AdsGameServerDay.class, cri));
List<GameServerDayVO> tempList = sql.getList(GameServerDayVO.class);
List<GameServerDayVO> list = tempList.stream().map(vo -> {
formatDayN(vo);
@@ -263,16 +281,26 @@ public class GameServerServiceImpl implements IGameServerService {
public GameServerDayTotalVO getGameServerDataDayTotal(GameServerDayTotalDTO dto) {
//默认查询注册留存数据
if (StringUtils.isBlank(dto.getActiveTypes())) {
dto.setActiveTypes("reg");
@@ -291,7 +319,12 @@ public class GameServerServiceImpl implements IGameServerService {
- Sql sql = Sqls.create(gameServerDayTotalSql(dto.getActiveTypes()) + cri);
+ sql = Sqls.create(gameServerDayTotalSql(dto.getActiveTypes()) + cri);
+ sql = Sqls.create(gameServerDayTotalSqlForParent(dto.getActiveTypes()) + cri);
sql.setEntity(dao.getEntity(GameServerDayTotalVO.class));
@@ -315,12 +348,22 @@ public class GameServerServiceImpl implements IGameServerService {
public Page<GameServerSumDayVO> getGameServerDataSumDay(GameServerSumDayDTO dto) {
//添加权限
if (dto.getBeginDate() != null && dto.getEndDate() != null) {
//拼接开服时间查询条件
@@ -341,18 +384,25 @@ public class GameServerServiceImpl implements IGameServerService {
- Sql sql = Sqls.create(gameServerSumDaySql() + cri);
+ sql = Sqls.create(gameServerSumDaySql() + cri);
+ pager.setRecordCount(dao.count(AdsGameServerSumDay.class, cri));
+ sql = Sqls.create(gameServerSumDaySqlForParent() + cri);
+ pager.setRecordCount(dao.count(AdsGameServerSumDayParent.class, cri));
sql.setEntity(dao.getEntity(GameServerSumDayVO.class));
- pager.setRecordCount(dao.count(AdsGameServerSumDay.class, cri));
List<GameServerSumDayVO> tempList = sql.getList(GameServerSumDayVO.class);
List<GameServerSumDayVO> list = tempList.stream().map(vo -> {
formatDayNForServerDay(vo);
@@ -371,13 +421,23 @@ public class GameServerServiceImpl implements IGameServerService {
public GameServerSumDayTotalVO getGameServerDataSumDayTotal(GameServerSumDayTotalDTO dto) {
@@ -388,7 +448,12 @@ public class GameServerServiceImpl implements IGameServerService {
- Sql sql = Sqls.create(gameServerSumDayTotalSql() + cri);
+ sql = Sqls.create(gameServerSumDayTotalSql() + cri);
+ sql = Sqls.create(gameServerSumDayTotalSqlForParent() + cri);
sql.setEntity(dao.getEntity(GameServerSumDayTotalVO.class));
@@ -1003,6 +1068,133 @@ public class GameServerServiceImpl implements IGameServerService {
+ * 游戏区服数据SQL-父游戏维度
+ private String gameServerDaySqlForParent() {
+ server_id,
+ parent_game_classify as classify,
+ out_total_num,
+ out_total_amount_num,
+ out_total_amount,
+ out_total_rate,
+ total_role_num,
+ total_reg_num,
+ total_amount_num,
+ total_amount,
+ da1,
+ da2,
+ da3,
+ da4,
+ da5,
+ da6,
+ da7,
+ da8,
+ da9,
+ da10,
+ da11,
+ da12,
+ da13,
+ da14,
+ da15,
+ da16,
+ da17,
+ da18,
+ da19,
+ da20,
+ da21,
+ da22,
+ da23,
+ da24,
+ da25,
+ da26,
+ da27,
+ da28,
+ da29,
+ da30,
+ da31,
+ da32,
+ da33,
+ da34,
+ da35,
+ da36,
+ da37,
+ da38,
+ da39,
+ da40,
+ da41,
+ da42,
+ da43,
+ da44,
+ da45,
+ da46,
+ da47,
+ da48,
+ da49,
+ da50,
+ da51,
+ da52,
+ da53,
+ da54,
+ da55,
+ da56,
+ da57,
+ da58,
+ da59,
+ da60,
+ da61,
+ da62,
+ da63,
+ da64,
+ da65,
+ da66,
+ da67,
+ da68,
+ da69,
+ da70,
+ da71,
+ da72,
+ da73,
+ da74,
+ da75,
+ da76,
+ da77,
+ da78,
+ da79,
+ da80,
+ da81,
+ da82,
+ da83,
+ da84,
+ da85,
+ da86,
+ da87,
+ da88,
+ da89,
+ da90,
+ m4,
+ m5,
+ m6,
+ m7,
+ m8,
+ m9,
+ m10,
+ m11,
+ m12,
+ total
+ game_ads_parent.ads_game_server_day_parent
* 游戏区服每日数据SQL
@@ -1132,118 +1324,246 @@ public class GameServerServiceImpl implements IGameServerService {
- * 游戏区服数据总计SQL
- * @param activeType 查询的留存类型 reg -> 注册留存 ; role -> 角色留存 ; amount -> 付费留存
- *
+ * 游戏区服每日数据SQL-父游戏维度
- private String gameServerDayTotalSql(String activeType) {
+ private String gameServerSumDaySqlForParent() {
- IFNULL(SUM(out_total_num), 0) as out_total_num,
- IFNULL(SUM(out_total_amount_num), 0) as out_total_amount_num,
- IFNULL(SUM(out_total_amount), 0) as out_total_amount,
- ROUND(IF(SUM(total_amount) > 0, SUM(out_total_amount) / SUM(total_amount), 0), 4) as out_total_rate,
- IFNULL(SUM(total_role_num), 0) as total_role_num,
- IFNULL(SUM(total_reg_num), 0) as total_reg_num,
- IFNULL(SUM(total_amount_num), 0) as total_amount_num,
- IFNULL(SUM(total_amount), 0) as total_amount,
- """ + trendDay(activeType) +
- """
- FROM (
- SELECT
- dt,
- source_system,
- server_id,
- server_name,
- game_id,
- game_name,
- classify,
- out_total_num,
- out_total_amount_num,
- out_total_amount,
- out_total_rate,
- total_role_num,
- total_reg_num,
- total_amount_num,
- total_amount,
- SPLIT(da1, '/') as da1,
- SPLIT(da2, '/') as da2,
- SPLIT(da3, '/') as da3,
- SPLIT(da4, '/') as da4,
- SPLIT(da5, '/') as da5,
- SPLIT(da6, '/') as da6,
- SPLIT(da7, '/') as da7,
- SPLIT(da8, '/') as da8,
- SPLIT(da9, '/') as da9,
- SPLIT(da10, '/') as da10,
- SPLIT(da11, '/') as da11,
- SPLIT(da12, '/') as da12,
- SPLIT(da13, '/') as da13,
- SPLIT(da14, '/') as da14,
- SPLIT(da15, '/') as da15,
- SPLIT(da16, '/') as da16,
- SPLIT(da17, '/') as da17,
- SPLIT(da18, '/') as da18,
- SPLIT(da19, '/') as da19,
- SPLIT(da20, '/') as da20,
- SPLIT(da21, '/') as da21,
- SPLIT(da22, '/') as da22,
- SPLIT(da23, '/') as da23,
- SPLIT(da24, '/') as da24,
- SPLIT(da25, '/') as da25,
- SPLIT(da26, '/') as da26,
- SPLIT(da27, '/') as da27,
- SPLIT(da28, '/') as da28,
- SPLIT(da29, '/') as da29,
- SPLIT(da30, '/') as da30,
- SPLIT(da31, '/') as da31,
- SPLIT(da32, '/') as da32,
- SPLIT(da33, '/') as da33,
- SPLIT(da34, '/') as da34,
- SPLIT(da35, '/') as da35,
- SPLIT(da36, '/') as da36,
- SPLIT(da37, '/') as da37,
- SPLIT(da38, '/') as da38,
- SPLIT(da39, '/') as da39,
- SPLIT(da40, '/') as da40,
- SPLIT(da41, '/') as da41,
- SPLIT(da42, '/') as da42,
- SPLIT(da43, '/') as da43,
- SPLIT(da44, '/') as da44,
- SPLIT(da45, '/') as da45,
- SPLIT(da46, '/') as da46,
- SPLIT(da47, '/') as da47,
- SPLIT(da48, '/') as da48,
- SPLIT(da49, '/') as da49,
- SPLIT(da50, '/') as da50,
- SPLIT(da51, '/') as da51,
- SPLIT(da52, '/') as da52,
- SPLIT(da53, '/') as da53,
- SPLIT(da54, '/') as da54,
- SPLIT(da55, '/') as da55,
- SPLIT(da56, '/') as da56,
- SPLIT(da57, '/') as da57,
- SPLIT(da58, '/') as da58,
- SPLIT(da59, '/') as da59,
- SPLIT(da60, '/') as da60,
- SPLIT(da61, '/') as da61,
- SPLIT(da62, '/') as da62,
- SPLIT(da63, '/') as da63,
- SPLIT(da64, '/') as da64,
- SPLIT(da65, '/') as da65,
- SPLIT(da66, '/') as da66,
- SPLIT(da67, '/') as da67,
- SPLIT(da68, '/') as da68,
- SPLIT(da69, '/') as da69,
- SPLIT(da70, '/') as da70,
- SPLIT(da71, '/') as da71,
- SPLIT(da72, '/') as da72,
- SPLIT(da73, '/') as da73,
- SPLIT(da74, '/') as da74,
- SPLIT(da75, '/') as da75,
- SPLIT(da76, '/') as da76,
- SPLIT(da77, '/') as da77,
+ id,
+ game_ads_parent.ads_game_server_day_sum_parent
+ * 游戏区服数据总计SQL
+ * @param activeType 查询的留存类型 reg -> 注册留存 ; role -> 角色留存 ; amount -> 付费留存
+ private String gameServerDayTotalSql(String activeType) {
+ IFNULL(SUM(out_total_num), 0) as out_total_num,
+ IFNULL(SUM(out_total_amount_num), 0) as out_total_amount_num,
+ IFNULL(SUM(out_total_amount), 0) as out_total_amount,
+ ROUND(IF(SUM(total_amount) > 0, SUM(out_total_amount) / SUM(total_amount), 0), 4) as out_total_rate,
+ IFNULL(SUM(total_role_num), 0) as total_role_num,
+ IFNULL(SUM(total_reg_num), 0) as total_reg_num,
+ IFNULL(SUM(total_amount_num), 0) as total_amount_num,
+ IFNULL(SUM(total_amount), 0) as total_amount,
+ """ + trendDay(activeType) +
+ game_id,
+ game_name,
+ classify,
+ SPLIT(da1, '/') as da1,
+ SPLIT(da2, '/') as da2,
+ SPLIT(da3, '/') as da3,
+ SPLIT(da4, '/') as da4,
+ SPLIT(da5, '/') as da5,
+ SPLIT(da6, '/') as da6,
+ SPLIT(da7, '/') as da7,
+ SPLIT(da8, '/') as da8,
+ SPLIT(da9, '/') as da9,
+ SPLIT(da10, '/') as da10,
+ SPLIT(da11, '/') as da11,
+ SPLIT(da12, '/') as da12,
+ SPLIT(da13, '/') as da13,
+ SPLIT(da14, '/') as da14,
+ SPLIT(da15, '/') as da15,
+ SPLIT(da16, '/') as da16,
+ SPLIT(da17, '/') as da17,
+ SPLIT(da18, '/') as da18,
+ SPLIT(da19, '/') as da19,
+ SPLIT(da20, '/') as da20,
+ SPLIT(da21, '/') as da21,
+ SPLIT(da22, '/') as da22,
+ SPLIT(da23, '/') as da23,
+ SPLIT(da24, '/') as da24,
+ SPLIT(da25, '/') as da25,
+ SPLIT(da26, '/') as da26,
+ SPLIT(da27, '/') as da27,
+ SPLIT(da28, '/') as da28,
+ SPLIT(da29, '/') as da29,
+ SPLIT(da30, '/') as da30,
+ SPLIT(da31, '/') as da31,
+ SPLIT(da32, '/') as da32,
+ SPLIT(da33, '/') as da33,
+ SPLIT(da34, '/') as da34,
+ SPLIT(da35, '/') as da35,
+ SPLIT(da36, '/') as da36,
+ SPLIT(da37, '/') as da37,
+ SPLIT(da38, '/') as da38,
+ SPLIT(da39, '/') as da39,
+ SPLIT(da40, '/') as da40,
+ SPLIT(da41, '/') as da41,
+ SPLIT(da42, '/') as da42,
+ SPLIT(da43, '/') as da43,
+ SPLIT(da44, '/') as da44,
+ SPLIT(da45, '/') as da45,
+ SPLIT(da46, '/') as da46,
+ SPLIT(da47, '/') as da47,
+ SPLIT(da48, '/') as da48,
+ SPLIT(da49, '/') as da49,
+ SPLIT(da50, '/') as da50,
+ SPLIT(da51, '/') as da51,
+ SPLIT(da52, '/') as da52,
+ SPLIT(da53, '/') as da53,
+ SPLIT(da54, '/') as da54,
+ SPLIT(da55, '/') as da55,
+ SPLIT(da56, '/') as da56,
+ SPLIT(da57, '/') as da57,
+ SPLIT(da58, '/') as da58,
+ SPLIT(da59, '/') as da59,
+ SPLIT(da60, '/') as da60,
+ SPLIT(da61, '/') as da61,
+ SPLIT(da62, '/') as da62,
+ SPLIT(da63, '/') as da63,
+ SPLIT(da64, '/') as da64,
+ SPLIT(da65, '/') as da65,
+ SPLIT(da66, '/') as da66,
+ SPLIT(da67, '/') as da67,
+ SPLIT(da68, '/') as da68,
+ SPLIT(da69, '/') as da69,
+ SPLIT(da70, '/') as da70,
+ SPLIT(da71, '/') as da71,
+ SPLIT(da72, '/') as da72,
+ SPLIT(da73, '/') as da73,
+ SPLIT(da74, '/') as da74,
+ SPLIT(da75, '/') as da75,
+ SPLIT(da76, '/') as da76,
+ SPLIT(da77, '/') as da77,
SPLIT(da78, '/') as da78,
SPLIT(da79, '/') as da79,
SPLIT(da80, '/') as da80,
@@ -1273,6 +1593,148 @@ public class GameServerServiceImpl implements IGameServerService {
+ * 游戏区服数据总计SQL-父游戏维度
+ private String gameServerDayTotalSqlForParent(String activeType) {
+ parent_game_name,
+ parent_game_classify,
+ SPLIT(da78, '/') as da78,
+ SPLIT(da79, '/') as da79,
+ SPLIT(da80, '/') as da80,
+ SPLIT(da81, '/') as da81,
+ SPLIT(da82, '/') as da82,
+ SPLIT(da83, '/') as da83,
+ SPLIT(da84, '/') as da84,
+ SPLIT(da85, '/') as da85,
+ SPLIT(da86, '/') as da86,
+ SPLIT(da87, '/') as da87,
+ SPLIT(da88, '/') as da88,
+ SPLIT(da89, '/') as da89,
+ SPLIT(da90, '/') as da90,
+ SPLIT(m4, '/') as m4,
+ SPLIT(m5, '/') as m5,
+ SPLIT(m6, '/') as m6,
+ SPLIT(m7, '/') as m7,
+ SPLIT(m8, '/') as m8,
+ SPLIT(m9, '/') as m9,
+ SPLIT(m10, '/') as m10,
+ SPLIT(m11, '/') as m11,
+ SPLIT(m12, '/') as m12,
+ SPLIT(total, '/') as total
* 游戏区服每日数据总计SQL
@@ -1414,6 +1876,147 @@ public class GameServerServiceImpl implements IGameServerService {
+ * 游戏区服每日数据总计SQL-父游戏维度
+ private String gameServerSumDayTotalSqlForParent() {
+ """ + trendDayForServerDay() +
* 获取所有区服sql
* @return