ソースを参照

Merge branch 'package' into dev

wcc 1 年間 前
コミット
0365700ed9
20 ファイル変更434 行追加41 行削除
  1. 5 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/BackPolicyController.java
  2. 12 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameBackPolicyDTO.java
  3. 14 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameBackPolicy.java
  4. 5 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/BackUnitEnum.java
  5. 12 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameBackPolicyVO.java
  6. 6 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java
  7. 37 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java
  8. 4 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineRoleRegisterLogServiceImpl.java
  9. 36 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java
  10. 4 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameRoleRegisterServiceImpl.java
  11. 37 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java
  12. 4 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentRoleRegisterServiceImpl.java
  13. 29 33
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/utils/BackPolicyUtil.java
  14. 6 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/AdsOrderDetailListDTO.java
  15. 6 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/AdsOrderDetailTotalDTO.java
  16. 7 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/AdsOrderDetailTotalVO.java
  17. 48 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/AdsOrderDetailVO.java
  18. 160 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailService.java
  19. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  20. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfUserServiceImpl.java

+ 5 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/BackPolicyController.java

@@ -88,6 +88,11 @@ public class BackPolicyController {
                 throw new BaseException("首充的大额金额必须大于小额金额");
             }
         }
+        if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+            if (dto.getLargeAmount() == null || dto.getLargeAmount().compareTo(BigDecimal.ZERO) <= 0) {
+                throw new BaseException("大额判定金额错误!!!");
+            }
+        }
         checkDownLevel(dto.getFirstDownLevel());
         checkDownLevel(dto.getRechargeDownLevel());
         checkDownLevel(dto.getMarkUpDownLevel());

+ 12 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameBackPolicyDTO.java

@@ -244,5 +244,17 @@ public class GameBackPolicyDTO implements Serializable {
     @ApiModelProperty("补单-按用户订单数卡单")
     private Integer markUpBackCountOfUser;
 
+    /**
+     * backUnit == 大额、小额时生效
+     * 大额判断金额
+     */
+    private BigDecimal largeAmount;
+
+    /**
+     * backUnit == 大额、小额时生效
+     * 超小额判断金额(小于等于改值不回传)
+     */
+    private BigDecimal supperSmallAmount;
+
 
 }

+ 14 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameBackPolicy.java

@@ -42,6 +42,7 @@ public class GameBackPolicy implements Serializable {
 
     /**
      * 首充/日-小额判定金额(小于等于)
+     * 大额/小额-累充判定金额(小于等于)
      */
     private Long firstMinMoney;
 
@@ -151,7 +152,7 @@ public class GameBackPolicy implements Serializable {
     private Long regPayIntervalTime;
 
     /**
-     * 回传类型(1:首单、次单、2:首日、次日)
+     * BackUnitEnum
      */
     private Integer backUnit;
 
@@ -209,5 +210,17 @@ public class GameBackPolicy implements Serializable {
      */
     private Integer markUpBackCountOfUser;
 
+    /**
+     * backUnit == 大额、小额时生效
+     * 大额判断金额
+     */
+    private Long largeAmount;
+
+    /**
+     * backUnit == 大额、小额时生效
+     * 超小额判断金额(小于等于改值不回传)
+     */
+    private Long supperSmallAmount;
+
 
 }

+ 5 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/BackUnitEnum.java

@@ -21,7 +21,11 @@ public enum BackUnitEnum {
     /**
      * 48、其它时间
      */
-    UNIT_TIME_2DAY(4);
+    UNIT_TIME_2DAY(4),
+    /**
+     * 小额、大额累充回传方式
+     */
+    LARGE_AMOUNT(5);
 
     private final Integer value;
 

+ 12 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameBackPolicyVO.java

@@ -230,6 +230,18 @@ public class GameBackPolicyVO implements Serializable {
     @ApiModelProperty("补单-按用户订单数卡单")
     private Integer markUpBackCountOfUser;
 
+    /**
+     * backUnit == 大额、小额时生效
+     * 大额判断金额
+     */
+    private BigDecimal largeAmount;
+
+    /**
+     * backUnit == 大额、小额时生效
+     * 超小额判断金额(小于等于改值不回传)
+     */
+    private BigDecimal supperSmallAmount;
+
     @Data
     @NoArgsConstructor
     @AllArgsConstructor

+ 6 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java

@@ -119,6 +119,8 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .markUpOrderOtherMoneyRate(dto.getMarkUpOrderOtherMoneyRate())
                 .markUpDownLevel(downLevelToString(dto.getMarkUpDownLevel()))
                 .markUpBackCountOfUser(dto.getMarkUpBackCountOfUser())
+                .largeAmount(dto.getLargeAmount() == null ? null : NumberUtil.multiply100(dto.getLargeAmount()).longValue())
+                .supperSmallAmount(dto.getSupperSmallAmount() == null ? null : NumberUtil.multiply100(dto.getSupperSmallAmount()).longValue())
                 .build();
         return gameBackPolicyService.save(backPolicy);
     }
@@ -169,6 +171,8 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .markUpOrderOtherMoneyRate(dto.getMarkUpOrderOtherMoneyRate())
                 .markUpDownLevel(downLevelToString(dto.getMarkUpDownLevel()))
                 .markUpBackCountOfUser(dto.getMarkUpBackCountOfUser())
+                .largeAmount(dto.getLargeAmount() == null ? null : NumberUtil.multiply100(dto.getLargeAmount()).longValue())
+                .supperSmallAmount(dto.getSupperSmallAmount() == null ? null : NumberUtil.multiply100(dto.getSupperSmallAmount()).longValue())
                 .build();
 
         return gameBackPolicyService.updateById(backPolicy);
@@ -192,6 +196,8 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
             return null;
         }
         GameBackPolicyVO vo = BeanUtil.copy(gameBackPolicy, GameBackPolicyVO.class);
+        vo.setLargeAmount(gameBackPolicy.getLargeAmount() == null ? null : NumberUtil.divide100(new BigDecimal(gameBackPolicy.getLargeAmount())));
+        vo.setSupperSmallAmount(gameBackPolicy.getSupperSmallAmount() == null ? null : NumberUtil.divide100(new BigDecimal(gameBackPolicy.getSupperSmallAmount())));
         vo.setFirstMinMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getFirstMinMoney())));
         vo.setFirstMaxMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getFirstMaxMoney())));
         vo.setRechargeMinMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getRechargeMinMoney())));

+ 37 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.serve.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -139,6 +140,17 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                                         .orderByDesc(GameOceanengineOrderLog::getCreateTime)
                                         .last("limit " + numberOfRound)
                                 ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
+                            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+                                return list(new LambdaQueryWrapper<GameOceanengineOrderLog>()
+                                        .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
+                                        .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
+                                        .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
+                                        .eq(GameOceanengineOrderLog::getBackPolicyId, gameBackPolicy.getId())
+                                        .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .ne(GameOceanengineOrderLog::getOrderNo, orderLog.getOrderNo())
+                                        .orderByDesc(GameOceanengineOrderLog::getCreateTime)
+                                        .last("limit " + numberOfRound)
+                                ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
                             } else {
                                 throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
                             }
@@ -201,6 +213,17 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                                         .apply(!firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) >= 48")
                                         .ne(GameOceanengineOrderLog::getOrderNo, orderLog.getOrderNo())
                                 );
+                            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+                                return count(new LambdaQueryWrapper<GameOceanengineOrderLog>()
+                                        .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
+                                        .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
+                                        .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
+                                        .eq(GameOceanengineOrderLog::getBackPolicyId, gameBackPolicy.getId())
+                                        .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .eq(GameOceanengineOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
+                                        .eq(GameOceanengineOrderLog::getOpenId, userId)
+                                        .ne(GameOceanengineOrderLog::getOrderNo, orderLog.getOrderNo())
+                                );
                             } else {
                                 throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
                             }
@@ -236,6 +259,20 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                                     .ne(GameOceanengineOrderLog::getOrderNo, orderLog.getOrderNo())
                             );
                         }
+
+                        @Override
+                        public Long totalRechargeAmount() {
+                            return getOne(new QueryWrapper<GameOceanengineOrderLog>()
+                                    .select("ifnull(sum(amount), 0) as amount").lambda()
+                                    .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
+                                    .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
+                                    .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
+                                    .eq(GameOceanengineOrderLog::getBackPolicyId, gameBackPolicy.getId())
+                                    .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                    .eq(GameOceanengineOrderLog::getOpenId, orderLog.getOpenId())
+                                    .ne(GameOceanengineOrderLog::getOrderNo, orderLog.getOrderNo())
+                            ).getAmount();
+                        }
                     });
             doBack = backInfo.first;
             backMoney = backInfo.second;

+ 4 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineRoleRegisterLogServiceImpl.java

@@ -118,6 +118,7 @@ public class GameOceanengineRoleRegisterLogServiceImpl extends ServiceImpl<GameO
                 .eq(GameOceanengineUserLog::getAppId, roleRegisterLog.getAppId())
                 .eq(GameOceanengineUserLog::getOpenId, roleRegisterLog.getOpenId())
                 .eq(GameOceanengineUserLog::getAccountId, roleRegisterLog.getAccountId())
+                .orderByDesc(GameOceanengineUserLog::getCreateTime)
                 .last("limit 1")
         );
         if (userLog == null) {
@@ -139,6 +140,9 @@ public class GameOceanengineRoleRegisterLogServiceImpl extends ServiceImpl<GameO
         if (BackStatusEnum.NO.getBackStatus().equals(userLog.getBackStatus())) {
             // 回传用户激活
             gameOceanengineUserLogService.callback(userLog, true);
+        } else {
+            // 注册已回传,则默认认为创角也回传了
+            return BackStatusEnum.NO;
         }
         MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
                 .clue_token(userLog.getClueToken())

+ 36 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java

@@ -145,6 +145,17 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
                                         .orderByDesc(GameTencentMiniGameOrder::getCreateTime)
                                         .last("limit " + numberOfRound)
                                 ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
+                            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+                                return list(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                                        .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
+                                        .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
+                                        .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
+                                        .eq(GameTencentMiniGameOrder::getBackPolicyId, gameBackPolicy.getId())
+                                        .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .ne(GameTencentMiniGameOrder::getOrderId, orderLog.getOrderId())
+                                        .orderByDesc(GameTencentMiniGameOrder::getCreateTime)
+                                        .last("limit " + numberOfRound)
+                                ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
                             } else {
                                 throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
                             }
@@ -207,6 +218,17 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
                                         .apply(!firstPolicy, "TIMESTAMPDIFF(HOUR, recharge_time, pay_time) >= 48")
                                         .ne(GameTencentMiniGameOrder::getOrderId, orderLog.getOrderId())
                                 );
+                            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+                                return count(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                                        .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
+                                        .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
+                                        .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
+                                        .eq(GameTencentMiniGameOrder::getBackPolicyId, gameBackPolicy.getId())
+                                        .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .eq(GameTencentMiniGameOrder::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
+                                        .eq(GameTencentMiniGameOrder::getWechatOpenid, userId)
+                                        .ne(GameTencentMiniGameOrder::getOrderId, orderLog.getOrderId())
+                                );
                             } else {
                                 throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
                             }
@@ -242,6 +264,20 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
                                     .ne(GameTencentMiniGameOrder::getOrderId, orderLog.getOrderId())
                             );
                         }
+
+                        @Override
+                        public Long totalRechargeAmount() {
+                            return getOne(new QueryWrapper<GameTencentMiniGameOrder>()
+                                    .select("ifnull(sum(recharge_money), 0) as recharge_money").lambda()
+                                    .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
+                                    .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
+                                    .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
+                                    .eq(GameTencentMiniGameOrder::getBackPolicyId, gameBackPolicy.getId())
+                                    .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                    .eq(GameTencentMiniGameOrder::getWechatOpenid, orderLog.getWechatOpenid())
+                                    .ne(GameTencentMiniGameOrder::getOrderId, orderLog.getOrderId())
+                            ).getRechargeMoney();
+                        }
                     });
             doBack = backInfo.first;
             backMoney = backInfo.second;

+ 4 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameRoleRegisterServiceImpl.java

@@ -129,11 +129,15 @@ public class GameTencentMiniGameRoleRegisterServiceImpl extends ServiceImpl<Game
                 .eq(GameTencentMiniGameUser::getWechatAppId, roleRegisterLog.getWechatAppId())
                 .eq(GameTencentMiniGameUser::getWechatOpenid, roleRegisterLog.getWechatOpenid())
                 .eq(GameTencentMiniGameUser::getAdAccountId, roleRegisterLog.getAdAccountId())
+                .orderByDesc(GameTencentMiniGameUser::getCreateTime)
                 .last("limit 1")
         );
         if (user != null) {
             if (BackStatusEnum.NO.getBackStatus().equals(user.getBackStatus())) {
                 gameTencentMiniGameUserService.userBack(user, true);
+            } else {
+                // 注册已回传,则默认认为创角也回传了
+                return BackStatusEnum.NO;
             }
         }
         return gameTencentMiniGameBackLogService.roleRegisterBack(roleRegisterLog);

+ 37 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.serve.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -149,6 +150,17 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
                                         .orderByDesc(GameTencentOrder::getCreateTime)
                                         .last("limit " + numberOfRound)
                                 ).stream().filter(log -> log.getIsBack().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
+                            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+                                return list(new LambdaQueryWrapper<GameTencentOrder>()
+                                        .eq(GameTencentOrder::getGameId, orderLog.getGameId())
+                                        .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
+                                        .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
+                                        .eq(GameTencentOrder::getBackPolicyId, gameBackPolicy.getId())
+                                        .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .ne(GameTencentOrder::getOrderId, orderLog.getOrderId())
+                                        .orderByDesc(GameTencentOrder::getCreateTime)
+                                        .last("limit " + numberOfRound)
+                                ).stream().filter(log -> log.getIsBack().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
                             } else {
                                 throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
                             }
@@ -211,6 +223,17 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
                                         .apply(!firstPolicy, "TIMESTAMPDIFF(HOUR, recharge_time, pay_time) >= 48")
                                         .ne(GameTencentOrder::getOrderId, orderLog.getOrderId())
                                 );
+                            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+                                return count(new LambdaQueryWrapper<GameTencentOrder>()
+                                        .eq(GameTencentOrder::getGameId, orderLog.getGameId())
+                                        .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
+                                        .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
+                                        .eq(GameTencentOrder::getBackPolicyId, gameBackPolicy.getId())
+                                        .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                        .eq(GameTencentOrder::getIsBack, BackStatusEnum.SUCCESS.getBackStatus())
+                                        .eq(GameTencentOrder::getWechatOpenid, userId)
+                                        .ne(GameTencentOrder::getOrderId, orderLog.getOrderId())
+                                );
                             } else {
                                 throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
                             }
@@ -246,6 +269,20 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
                                     .ne(GameTencentOrder::getOrderId, orderLog.getOrderId())
                             );
                         }
+
+                        @Override
+                        public Long totalRechargeAmount() {
+                            return count(new QueryWrapper<GameTencentOrder>()
+                                    .select("ifnull(sum(recharge_money), 0) as recharge_money").lambda()
+                                    .eq(GameTencentOrder::getGameId, orderLog.getGameId())
+                                    .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
+                                    .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
+                                    .eq(GameTencentOrder::getBackPolicyId, gameBackPolicy.getId())
+                                    .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                                    .eq(GameTencentOrder::getWechatOpenid, orderLog.getWechatOpenid())
+                                    .ne(GameTencentOrder::getOrderId, orderLog.getOrderId())
+                            );
+                        }
                     });
             doBack = backInfo.first;
             backMoney = backInfo.second;

+ 4 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentRoleRegisterServiceImpl.java

@@ -135,11 +135,15 @@ public class GameTencentRoleRegisterServiceImpl extends ServiceImpl<GameTencentR
                 .eq(GameTencentUser::getWechatAppId, roleRegisterLog.getWechatAppId())
                 .eq(GameTencentUser::getWechatOpenid, roleRegisterLog.getWechatOpenid())
                 .eq(GameTencentUser::getAdAccountId, roleRegisterLog.getAdAccountId())
+                .orderByDesc(GameTencentUser::getCreateTime)
                 .last("limit 1")
         );
         if (user != null) {
             if (BackStatusEnum.NO.getBackStatus().equals(user.getIsBack())) {
                 gameTencentUserService.userBack(user, true);
+            } else {
+                // 注册已回传,则默认认为创角也回传了
+                return BackStatusEnum.NO;
             }
         }
         Map<String, Object> actionParam = new HashMap<>(2);

+ 29 - 33
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/utils/BackPolicyUtil.java

@@ -42,7 +42,16 @@ public class BackPolicyUtil {
             log.error("订单 id[{}]找不到回传策略,默认回传", orderId);
             return Tuples.tuple(Boolean.TRUE, rechargeMoney, "没有回传策略");
         }
+        if (gameBackPolicy.getSupperSmallAmount() != null && gameBackPolicy.getSupperSmallAmount() >= rechargeMoney) {
+            log.error("订单 id[{}]被判定为超小额订单({}),默认不回传", orderId, gameBackPolicy.getSupperSmallAmount());
+            return Tuples.tuple(Boolean.TRUE, rechargeMoney, "超小额订单(<=" + gameBackPolicy.getSupperSmallAmount() + "),不回传");
+        }
         BackUnitEnum backUnit = gameBackPolicy.getBackUnit() == null ? BackUnitEnum.UNIT_ONCE : BackUnitEnum.getByValue(gameBackPolicy.getBackUnit());
+        Long totalRechargeAmount = null;
+        if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+            Long totalAmount = backPolicyCheck.totalRechargeAmount();
+            totalAmount = totalAmount == null ? rechargeMoney : totalAmount + rechargeMoney;
+        }
 
         Boolean firstPolicy = null;
         Long markUpTime = null;
@@ -51,14 +60,15 @@ public class BackPolicyUtil {
         if (gameBackPolicy.getRegPayIntervalTime() != null
                 && ((DateUtil.localDateTimeToSecond(payTime) - DateUtil.localDateTimeToSecond(regTime)) / 60) > gameBackPolicy.getRegPayIntervalTime()) {
             // 补单
-            log.error("订单 id[{}]通过回传策略[{}]判断后,超过注册充值间隔时间,走补单逻辑 {}.", orderId, gameBackPolicy.getId(), gameBackPolicy.getRegPayIntervalTime());
+            log.error("订单 id[{}]通过回传策略[{}]判断后,超过注册充值间隔时间,走补单逻辑 {}, money: {}.", orderId, gameBackPolicy.getId(), gameBackPolicy.getRegPayIntervalTime(), totalRechargeAmount);
             if (gameBackPolicy.getMarkUpOrder() != null && gameBackPolicy.getMarkUpOrder()) {
+                long money = backUnit == BackUnitEnum.LARGE_AMOUNT ? totalRechargeAmount : rechargeMoney;
                 markUpTime = gameBackPolicy.getRegPayIntervalTime();
-                if (rechargeMoney <= gameBackPolicy.getMarkUpOrderMinMoney()) {
+                if (money <= gameBackPolicy.getMarkUpOrderMinMoney()) {
                     // 小额
                     backType = gameBackPolicy.getMarkUpOrderMinMoneyType();
                     backRate = gameBackPolicy.getMarkUpOrderMinMoneyRate();
-                } else if (rechargeMoney >= gameBackPolicy.getMarkUpOrderMaxMoney()) {
+                } else if (money >= gameBackPolicy.getMarkUpOrderMaxMoney()) {
                     // 大额
                     backType = gameBackPolicy.getMarkUpOrderMaxMoneyType();
                     backRate = gameBackPolicy.getMarkUpOrderMaxMoneyRate();
@@ -123,15 +133,19 @@ public class BackPolicyUtil {
         } else if (backUnit == BackUnitEnum.UNIT_TIME_2DAY) {
             long intervalHours = DateUtil.intervalOfHour(regTime, payTime);
             firstPolicy = intervalHours < 48;
+        } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
+            // 是否是小额订单
+            firstPolicy = rechargeMoney < gameBackPolicy.getLargeAmount();
         } else {
             throw new RuntimeException("未知的回传单位:" + backUnit);
         }
         if (firstPolicy) {
-            if (rechargeMoney <= gameBackPolicy.getFirstMinMoney()) {
+            long money = backUnit == BackUnitEnum.LARGE_AMOUNT ? totalRechargeAmount : rechargeMoney;
+            if (money <= gameBackPolicy.getFirstMinMoney()) {
                 // 小额
                 backType = gameBackPolicy.getFirstMinMoneyType();
                 backRate = gameBackPolicy.getFirstMinMoneyRate();
-            } else if (rechargeMoney >= gameBackPolicy.getFirstMaxMoney()) {
+            } else if (money >= gameBackPolicy.getFirstMaxMoney()) {
                 // 大额
                 backType = gameBackPolicy.getFirstMaxMoneyType();
                 backRate = gameBackPolicy.getFirstMaxMoneyRate();
@@ -139,13 +153,14 @@ public class BackPolicyUtil {
                 backType = gameBackPolicy.getFirstOtherMoneyType();
                 backRate = gameBackPolicy.getFirstOtherMoneyRate();
             }
-            log.error("订单 id[{}]通过回传策略[{}]判断后走首日逻辑:backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), backType, backRate);
+            log.error("订单 id[{}]通过回传策略[{}]判断后走首日逻辑:backType: {}, backRate: {}, money: {}", orderId, gameBackPolicy.getId(), backType, backRate, money);
         } else {
-            if (rechargeMoney <= gameBackPolicy.getRechargeMinMoney()) {
+            long money = backUnit == BackUnitEnum.LARGE_AMOUNT ? totalRechargeAmount : rechargeMoney;
+            if (money <= gameBackPolicy.getRechargeMinMoney()) {
                 // 小额
                 backType = gameBackPolicy.getRechargeMinMoneyType();
                 backRate = gameBackPolicy.getRechargeMinMoneyRate();
-            } else if (rechargeMoney >= gameBackPolicy.getRechargeMaxMoney()) {
+            } else if (money >= gameBackPolicy.getRechargeMaxMoney()) {
                 // 大额
                 backType = gameBackPolicy.getRechargeMaxMoneyType();
                 backRate = gameBackPolicy.getRechargeMaxMoneyRate();
@@ -153,7 +168,7 @@ public class BackPolicyUtil {
                 backType = gameBackPolicy.getRechargeOtherMoneyType();
                 backRate = gameBackPolicy.getRechargeOtherMoneyRate();
             }
-            log.error("订单 id[{}]通过回传策略[{}]判断后走次日逻辑, backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), backType, backRate);
+            log.error("订单 id[{}]通过回传策略[{}]判断后走次日逻辑, backType: {}, backRate: {}, money: {}", orderId, gameBackPolicy.getId(), backType, backRate, money);
         }
         Integer maxBackCountOfUser = firstPolicy ? gameBackPolicy.getFirstBackCountOfUser() : gameBackPolicy.getRechargeBackCountOfUser();
         String backMsg = firstPolicy ? "首-" : "次-";
@@ -199,30 +214,6 @@ public class BackPolicyUtil {
         backMsg = backMsg + ",单用户最大回传 " + maxBackCountOfUser + "笔,当前已回传 " + userBackCount + "笔";
         log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{},原因:{}", orderId, gameBackPolicy.getId(), userBackCount < maxBackCountOfUser, backMsg);
         return Tuples.tuple(userBackCount < maxBackCountOfUser, downLevel(rechargeMoney, downLevelString), backMsg);
-        /*if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_FIXED_RATE)) {
-            // 固定比例回传
-            String[] temp = backRate.split(":");
-            int backCount = Integer.parseInt(temp[0]);
-            int ignoreCount = Integer.parseInt(temp[1]);
-            if (backCount == 0) {
-                log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), false);
-                return Tuples.tuple(Boolean.FALSE, rechargeMoney, "按比例回传,回传比例为 0,全部不回传");
-            }
-            if (ignoreCount == 0) {
-                log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), true);
-                return Tuples.tuple(Boolean.TRUE, rechargeMoney, "按比例回传,忽略比例为 0,全部回传");
-            }
-            int isBackCount = lastBackFunction.getLastBackCount(backCount + ignoreCount - 1, firstPolicy, firstDay, markUpTime);
-            log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), (isBackCount < backCount));
-            return isBackCount < backCount;
-        } else if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_RANDOM_RATE)) {
-            // 随机概率回传
-            boolean isBack = RandomUtils.nextInt(0, 100) < NumberUtil.multiply100(new BigDecimal(backRate)).intValue();
-            log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), isBack);
-            return Tuples.tuple(isBack, rechargeMoney, "按概率 " + backRate + "判断");
-        } else {
-            throw new RuntimeException("回传策略[" + gameBackPolicy.getId() + "]配置错误,未知的回传类型:" + backType);
-        }*/
     }
 
     private static Long downLevel(Long rechargeMoney, String downLevelStr) {
@@ -299,5 +290,10 @@ public class BackPolicyUtil {
          * 补单,单个用户已回传订单数
          */
         long markUpForUser(String userId, Long markUpTime);
+
+        /**
+         * 获取用户的累充金额
+         */
+        Long totalRechargeAmount();
     }
 }

+ 6 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/AdsOrderDetailListDTO.java

@@ -228,4 +228,10 @@ public class AdsOrderDetailListDTO extends BasePage {
     @ApiModelProperty(notes = "订单渠道类型:买量 -> buy ; 自然量 -> nature")
     private String orderAgentType;
 
+    /**
+     * 回传状态
+     */
+    @ApiModelProperty(notes = "回传状态: -1 - 回传失败; 0 - 未回传; 1 - 回传成功; 2 - 无回传数据")
+    private Integer backStatus;
+
 }

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

@@ -215,4 +215,10 @@ public class AdsOrderDetailTotalDTO {
     @ApiModelProperty(notes = "订单渠道类型:买量 -> buy ; 自然量 -> nature")
     private String orderAgentType;
 
+    /**
+     * 回传状态
+     */
+    @ApiModelProperty(notes = "回传状态: -1 - 回传失败; 0 - 未回传; 1 - 回传成功; 2 - 无回传数据")
+    private Integer backStatus;
+
 }

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

@@ -20,4 +20,11 @@ public class AdsOrderDetailTotalVO {
     @ApiModelProperty(notes = "订单实付金额")
     private BigDecimal realAmount;
 
+    /**
+     * 回传金额
+     */
+    @ApiModelProperty(notes = "回传金额")
+    private Long backMoney;
+
+
 }

+ 48 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/AdsOrderDetailVO.java

@@ -184,4 +184,52 @@ public class AdsOrderDetailVO {
     @ApiModelProperty(notes = "收款账户名")
     private String merchantName;
 
+    /**
+     * 角色累计充值金额
+     */
+    @ApiModelProperty(notes = "角色累计充值金额")
+    private BigDecimal roleTotalAmount;
+
+    /**
+     * 角色累计充值次数
+     */
+    @ApiModelProperty(notes = "角色累计充值次数")
+    private Long roleTotalAmountCount;
+
+    /**
+     * 回传状态
+     */
+    @ApiModelProperty(notes = "回传状态: -1 - 回传失败; 0 - 未回传; 1 - 回传成功; 2 - 无回传数据")
+    private Integer backStatus;
+
+    /**
+     * 回传金额
+     */
+    @ApiModelProperty(notes = "回传金额")
+    private Long backMoney;
+
+    /**
+     * 回传信息
+     */
+    @ApiModelProperty(notes = "回传信息")
+    private String backMsg;
+
+    /**
+     * 回传表名
+     */
+    @ApiModelProperty(notes = "回传表名")
+    private String backTableName;
+
+    /**
+     * 回传所需id
+     */
+    @ApiModelProperty(notes = "回传所需id")
+    private Long backId;
+
+    /**
+     * 角色注册7日内订单数
+     */
+    @ApiModelProperty(notes = "角色注册7日内订单数")
+    private Long roleOrder7DayTotal;
+
 }

+ 160 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailService.java

@@ -134,6 +134,10 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
             //广告ID
             cri.where().andEquals("project_id", dto.getProjectId());
         }
+        if (dto.getBackStatus() != null) {
+            //回传状态
+            cri.where().andEquals("back_status", dto.getBackStatus());
+        }
         if (StringUtils.isNotBlank(dto.getOrderAgentType())) {
             if ("buy".equals(dto.getOrderAgentType())) {
                 //查询买量数据
@@ -275,6 +279,10 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
             //广告ID
             cri.where().andEquals("project_id", dto.getProjectId());
         }
+        if (dto.getBackStatus() != null) {
+            //回传状态
+            cri.where().andEquals("back_status", dto.getBackStatus());
+        }
         if (StringUtils.isNotBlank(dto.getOrderAgentType())) {
             if ("buy".equals(dto.getOrderAgentType())) {
                 //查询买量数据
@@ -380,6 +388,8 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		a.product_name , -- 充值商品名称
                 		a.amount , -- 订单金额
                 		a.real_amount , -- 订单实付金额
+                		k.amount as role_total_amount, -- 角色累计充值金额
+                		k.amount_count as role_total_amount_count, -- 角色累计充值次数
                 		a.payway , -- 支付方式ID、支付方式名
                 		a.pay_device as pay_scene,-- 支付场景ID、支付场景名
                 		a.status as order_status, -- 支付状态
@@ -402,7 +412,12 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		TIMESTAMPDIFF(SECOND, a.pay_time, NOW()) as pay_until_now, -- 最近充值时间距今(秒)
                 		IF(a.status = 2, IF(a.create_time = i.create_time, 1, 0), 0) as is_first_recharge, -- 是否首充
                 		IF(a.promotion_id = 'null', NULL, a.promotion_id) as promotion_id , -- 计划ID
-                  		IF(a.project_id = 'null' , NULL, a.project_id) as project_id -- 项目ID(广告ID)
+                  		IF(a.project_id = 'null' , NULL, a.project_id) as project_id, -- 项目ID(广告ID)
+                 		IFNULL(l.back_status, 2) as back_status, -- 回传状态:-1-回传失败;0-未回传;1-已回传;2-没有回传数据
+                 		IFNULL(l.back_money / 100, null) as back_money, -- 回传金额
+                 		l.back_msg as back_msg, -- 回传信息
+                 		l.id as back_id, -- 回传id
+                 		l.back_table_name as back_table_name -- 回传表名
                 	FROM dm_game_order.t_game_order a
                 	LEFT JOIN dm_game_order.t_game_user b on a.source_system = b.source_system AND a.user_id = b.id
                 	LEFT JOIN dm_game_order.t_pitcher_agent c on a.source_system = c.source_system AND a.agent_id = c.id
@@ -434,6 +449,45 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		FROM dm_game_order.t_pay_merchant
                 		WHERE is_delete = 0
                 	) j on a.source_system = j.source_system AND a.merchant_no = j.merchant_no
+                	LEFT JOIN (
+                		SELECT
+                			-- 累计充值金额、累计充值次数
+                			role_id,
+                			source_system,
+                			SUM(real_amount) as amount ,
+                			COUNT(user_id) as amount_count
+                		FROM dm_game_order.t_game_order
+                		WHERE status =2
+                		GROUP BY role_id , source_system
+                	) k on a.source_system = k.source_system AND a.role_id = k.role_id
+                	LEFT JOIN (
+                		SELECT
+                			id,
+                			order_no as order_id,
+                			back_status,
+                			back_msg,
+                			back_money,
+                			'byte' as back_table_name
+                		FROM dm_ad_byte.t_game_oceanengine_order_log
+                		UNION ALL
+                		SELECT
+                			id,
+                			order_id ,
+                			back_status,
+                			back_msg,
+                			back_money,
+                			'tencent_mini' as back_table_name
+                		FROM dm_ad_tencent.t_game_tencent_mini_game_order
+                		UNION ALL
+                		SELECT
+                			id,
+                			order_id ,
+                			is_back as back_status,
+                			back_msg,
+                			back_money,
+                			'tencent_h5' as back_table_name
+                		FROM dm_ad_tencent.t_game_tencent_order
+                	) l on a.order_id = l.order_id
                 ) a
                 """;
     }
@@ -475,6 +529,8 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		a.product_name , -- 充值商品名称
                 		a.amount , -- 订单金额
                 		a.real_amount , -- 订单实付金额
+                		k.amount as role_total_amount, -- 角色累计充值金额
+                		k.amount_count as role_total_amount_count, -- 角色累计充值次数
                 		a.payway , -- 支付方式ID、支付方式名
                 		a.pay_device as pay_scene,-- 支付场景ID、支付场景名
                 		a.status as order_status, -- 支付状态
@@ -497,7 +553,12 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		TIMESTAMPDIFF(SECOND, a.pay_time, NOW()) as pay_until_now, -- 最近充值时间距今(秒)
                 		IF(a.status = 2, IF(a.create_time = i.create_time, 1, 0), 0) as is_first_recharge, -- 是否首充
                 		IF(a.promotion_id = 'null', NULL, a.promotion_id) as promotion_id , -- 计划ID
-                  		IF(a.project_id = 'null' , NULL, a.project_id) as project_id -- 项目ID(广告ID)
+                  		IF(a.project_id = 'null' , NULL, a.project_id) as project_id, -- 项目ID(广告ID)
+                 		IFNULL(l.back_status, 2) as back_status, -- 回传状态:-1-回传失败;0-未回传;1-已回传;2-没有回传数据
+                 		IFNULL(l.back_money / 100, null) as back_money, -- 回传金额
+                 		l.back_msg as back_msg, -- 回传信息
+                 		l.id as back_id, -- 回传id
+                 		l.back_table_name as back_table_name -- 回传表名
                 	FROM dm_game_order.t_game_order a
                 	LEFT JOIN dm_game_order.t_game_user b on a.source_system = b.source_system AND a.user_id = b.id
                 	LEFT JOIN dm_game_order.t_pitcher_agent c on a.source_system = c.source_system AND a.agent_id = c.id
@@ -529,6 +590,45 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		FROM dm_game_order.t_pay_merchant
                 		WHERE is_delete = 0
                 	) j on a.source_system = j.source_system AND a.merchant_no = j.merchant_no
+                	LEFT JOIN (
+                		SELECT
+                			-- 累计充值金额、累计充值次数
+                			role_id,
+                			source_system,
+                			SUM(real_amount) as amount ,
+                			COUNT(user_id) as amount_count
+                		FROM dm_game_order.t_game_order
+                		WHERE status =2
+                		GROUP BY role_id , source_system
+                	) k on a.source_system = k.source_system AND a.role_id = k.role_id
+                	LEFT JOIN (
+                		SELECT
+                			id,
+                			order_no as order_id,
+                			back_status,
+                			back_msg,
+                			back_money,
+                			'byte' as back_table_name
+                		FROM dm_ad_byte.t_game_oceanengine_order_log
+                		UNION ALL
+                		SELECT
+                			id,
+                			order_id ,
+                			back_status,
+                			back_msg,
+                			back_money,
+                			'tencent_mini' as back_table_name
+                		FROM dm_ad_tencent.t_game_tencent_mini_game_order
+                		UNION ALL
+                		SELECT
+                			id,
+                			order_id ,
+                			is_back as back_status,
+                			back_msg,
+                			back_money,
+                			'tencent_h5' as back_table_name
+                		FROM dm_ad_tencent.t_game_tencent_order
+                	) l on a.order_id = l.order_id
                 ) a
                 """;
     }
@@ -541,7 +641,8 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
         return """
                 SELECT
                 	SUM(amount) as amount,
-                	SUM(real_amount) as real_amount
+                	SUM(real_amount) as real_amount,
+                	SUM(back_money) / 100 as back_money
                 FROM (
                 	SELECT
                 		a.id, -- 主键id
@@ -571,12 +672,15 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		a.product_name , -- 充值商品名称
                 		a.amount , -- 订单金额
                 		a.real_amount , -- 订单实付金额
+                		k.amount as role_total_amount, -- 角色累计充值金额
+                		k.amount_count as role_total_amount_count, -- 角色累计充值次数
                 		a.payway , -- 支付方式ID、支付方式名
                 		a.pay_device as pay_scene,-- 支付场景ID、支付场景名
                 		a.status as order_status, -- 支付状态
                 		a.cp_status , -- cp通知状态
                 		a.last_notify_time as last_cp_notify_time , -- cp最后通知时间
                 		a.merchant_no as pay_account_id, -- 收款账户
+                		j.merchant_name , -- 收款账户名
                 		a.server_id , -- 角色所属游戏区服ID
                 		IFNULL(h.server_name, a.server_name) as source_server_name , -- 原始区服名
                 		a.server_name , -- 角色所属游戏区服名
@@ -592,7 +696,12 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		TIMESTAMPDIFF(SECOND, a.pay_time, NOW()) as pay_until_now, -- 最近充值时间距今(秒)
                 		IF(a.status = 2, IF(a.create_time = i.create_time, 1, 0), 0) as is_first_recharge, -- 是否首充
                 		IF(a.promotion_id = 'null', NULL, a.promotion_id) as promotion_id , -- 计划ID
-                  		IF(a.project_id = 'null' , NULL, a.project_id) as project_id -- 项目ID(广告ID)
+                  		IF(a.project_id = 'null' , NULL, a.project_id) as project_id, -- 项目ID(广告ID)
+                 		IFNULL(l.back_status, 2) as back_status, -- 回传状态:-1-回传失败;0-未回传;1-已回传;2-没有回传数据
+                 		IFNULL(l.back_money / 100, null) as back_money, -- 回传金额
+                 		l.back_msg as back_msg, -- 回传信息
+                 		l.id as back_id, -- 回传id
+                 		l.back_table_name as back_table_name -- 回传表名
                 	FROM dm_game_order.t_game_order a
                 	LEFT JOIN dm_game_order.t_game_user b on a.source_system = b.source_system AND a.user_id = b.id
                 	LEFT JOIN dm_game_order.t_pitcher_agent c on a.source_system = c.source_system AND a.agent_id = c.id
@@ -616,6 +725,53 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 		FROM dm_game_order.t_game_order
                 		WHERE status = 2
                 	) i on a.source_system = i.source_system AND a.user_id = i.user_id AND i.num = 1
+                	LEFT JOIN (
+                		SELECT
+                			source_system,
+                			merchant_no,
+                			merchant_name
+                		FROM dm_game_order.t_pay_merchant
+                		WHERE is_delete = 0
+                	) j on a.source_system = j.source_system AND a.merchant_no = j.merchant_no
+                	LEFT JOIN (
+                		SELECT
+                			-- 累计充值金额、累计充值次数
+                			role_id,
+                			source_system,
+                			SUM(real_amount) as amount ,
+                			COUNT(user_id) as amount_count
+                		FROM dm_game_order.t_game_order
+                		WHERE status =2
+                		GROUP BY role_id , source_system
+                	) k on a.source_system = k.source_system AND a.role_id = k.role_id
+                	LEFT JOIN (
+                		SELECT
+                			id,
+                			order_no as order_id,
+                			back_status,
+                			back_msg,
+                			back_money,
+                			'byte' as back_table_name
+                		FROM dm_ad_byte.t_game_oceanengine_order_log
+                		UNION ALL
+                		SELECT
+                			id,
+                			order_id ,
+                			back_status,
+                			back_msg,
+                			back_money,
+                			'tencent_mini' as back_table_name
+                		FROM dm_ad_tencent.t_game_tencent_mini_game_order
+                		UNION ALL
+                		SELECT
+                			id,
+                			order_id ,
+                			is_back as back_status,
+                			back_msg,
+                			back_money,
+                			'tencent_h5' as back_table_name
+                		FROM dm_ad_tencent.t_game_tencent_order
+                	) l on a.order_id = l.order_id
                 ) a
                 """;
     }

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

@@ -21,7 +21,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <客服系统, 新增授权接口3> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <客服系统, 新增授权接口4> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfUserServiceImpl.java

@@ -59,7 +59,7 @@ public class KfUserServiceImpl extends ServiceImpl<KfUserMapper, KfUser> impleme
         paramMap.put("Authorization", URIUtil.encodeURIComponent(SecurityUtil.getToken()));
         paramMap.put("appId", gameApplet.getAppId());
         paramMap.put("gameName", gameApplet.getAppName());
-        String uri = URIUtil.fillUrlParams("http://47.99.91.240:9001/scan/code/auto", paramMap, false);
+        String uri = URIUtil.fillUrlParams("http://47.99.157.216:8020/scan/code/auto", paramMap, false);
         return restTemplate.getForObject(uri, String.class);
     }