Bläddra i källkod

fix : 新增沉默唤起回传和完成新手引导回传

bilingfeng 5 månader sedan
förälder
incheckning
a9cad89443

+ 17 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/TutorialFinish.java

@@ -0,0 +1,17 @@
+package com.zanxiang.game.back.serve.pojo;
+
+import lombok.Data;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-07
+ * @description : 完成新手引导
+ */
+@Data
+public class TutorialFinish {
+
+    /**
+     * 角色等级
+     */
+    private Long roleLevel;
+}

+ 5 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameBackPolicy.java

@@ -49,6 +49,11 @@ public class GameBackPolicy implements Serializable {
 
     private String typeOfSumRechargeJson;
 
+    /**
+     * 完成新手引导条件
+     */
+    private String tutorialFinishJson;
+
     /**
      * 首充/日-小额判定金额(小于等于)
      * 大额/小额-累充判定金额(小于等于)

+ 25 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameRoleRegister.java

@@ -25,6 +25,7 @@ import java.time.LocalDateTime;
 @Builder
 @TableName("t_game_tencent_mini_game_role_register")
 public class GameTencentMiniGameRoleRegister implements Serializable {
+
     private static final long serialVersionUID = 1L;
 
     @TableId(value = "id", type = IdType.AUTO)
@@ -59,18 +60,39 @@ public class GameTencentMiniGameRoleRegister implements Serializable {
      */
     private String wechatAppId;
 
+    /**
+     * 点击id
+     */
     private String clickId;
+
     /**
      * 回传状态
      */
     private Integer backStatus;
 
+    /**
+     * 回传状态 - 完成新手教程
+     */
+    private Integer tutorialFinishBackStatus;
+
+    /**
+     * 创建时间
+     */
     private LocalDateTime createTime;
 
+    /**
+     * 角色id
+     */
     private String roleId;
 
+    /**
+     * 角色名称
+     */
     private String roleName;
 
+    /**
+     * 角色等级
+     */
     private Long roleLevel;
 
     /**
@@ -78,5 +100,8 @@ public class GameTencentMiniGameRoleRegister implements Serializable {
      */
     private LocalDateTime registerTime;
 
+    /**
+     * 回传信息
+     */
     private String backMsg;
 }

+ 9 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameUser.java

@@ -70,10 +70,19 @@ public class GameTencentMiniGameUser implements Serializable {
      * 点击 id
      */
     private String clickId;
+
     /**
      * 回传状态
      */
     private Integer backStatus;
 
+    /**
+     * 回传状态-沉默唤起
+     */
+    private Integer reActiveBackStatus;
+
+    /**
+     * 创建时间
+     */
     private LocalDateTime createTime;
 }

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/ActionTypeEnum.java

@@ -7,8 +7,10 @@ import lombok.Getter;
 @AllArgsConstructor
 public enum ActionTypeEnum {
     REGISTER("REGISTER","注册"),
+    RE_ACTIVE("RE_ACTIVE","沉默唤起"),
     PURCHASE("PURCHASE","付费"),
     CREATE_ROLE("CREATE_ROLE","创角"),
+    TUTORIAL_FINISH("TUTORIAL_FINISH", "完成新手教程"),
     COMPLETE_ORDER("COMPLETE_ORDER","下单"),
     ACTIVATE_APP("ACTIVATE_APP", "激活应用");
 

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

@@ -14,7 +14,11 @@ public interface IGameTencentMiniGameBackLogService extends IService<GameTencent
 
     Tuple2<BackStatusEnum, String> userBack(GameTencentMiniGameUser userLog);
 
+    Tuple2<BackStatusEnum, String> reActiveBack(GameTencentMiniGameUser userLog);
+
     Tuple2<BackStatusEnum, String> orderBack(GameTencentMiniGameOrder orderLog, LocalDateTime backTime, Long backMoney);
 
     Tuple2<BackStatusEnum, String> roleRegisterBack(GameTencentMiniGameRoleRegister roleRegisterLog);
+
+    Tuple2<BackStatusEnum, String> tutorialFinishBack(GameTencentMiniGameRoleRegister roleRegisterLog);
 }

+ 40 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameBackLogServiceImpl.java

@@ -54,6 +54,26 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
         return backResult;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Tuple2<BackStatusEnum, String> reActiveBack(GameTencentMiniGameUser userLog) {
+        GameTencentMiniGameBackLog backLog = GameTencentMiniGameBackLog.builder()
+                .gameId(userLog.getGameId())
+                .adAccountId(userLog.getAdAccountId())
+                .clickId(userLog.getClickId())
+                .actionTime(LocalDateTime.now())
+                .wechatOpenid(userLog.getWechatOpenid())
+                .wechatAppId(userLog.getWechatAppId())
+                .actionType(ActionTypeEnum.RE_ACTIVE.getActionType())
+                .createTime(LocalDateTime.now())
+                .build();
+        Tuple2<BackStatusEnum, String> backResult = callback(backLog);
+        backLog.setBackStatus(backResult.first.getBackStatus());
+        backLog.setErrMsg(backResult.second);
+        save(backLog);
+        return backResult;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Tuple2<BackStatusEnum, String> orderBack(GameTencentMiniGameOrder orderLog, LocalDateTime backTime, Long backMoney) {
@@ -98,6 +118,26 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
         return backResult;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Tuple2<BackStatusEnum, String> tutorialFinishBack(GameTencentMiniGameRoleRegister roleRegisterLog) {
+        GameTencentMiniGameBackLog backLog = GameTencentMiniGameBackLog.builder()
+                .gameId(roleRegisterLog.getGameId())
+                .adAccountId(roleRegisterLog.getAdAccountId())
+                .clickId(roleRegisterLog.getClickId())
+                .actionTime(roleRegisterLog.getRegisterTime())
+                .wechatOpenid(roleRegisterLog.getWechatOpenid())
+                .wechatAppId(roleRegisterLog.getWechatAppId())
+                .actionType(ActionTypeEnum.TUTORIAL_FINISH.getActionType())
+                .createTime(LocalDateTime.now())
+                .build();
+        Tuple2<BackStatusEnum, String> backResult = callback(backLog);
+        backLog.setBackStatus(backResult.first.getBackStatus());
+        backLog.setErrMsg(backResult.second);
+        save(backLog);
+        return backResult;
+    }
+
     private Tuple2<BackStatusEnum, String> callback(GameTencentMiniGameBackLog backLog) {
         Map<String, Object> actionParam = null;
         if (backLog.getAmount() != null) {

+ 50 - 12
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameRoleRegisterServiceImpl.java

@@ -9,6 +9,7 @@ import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
 import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameRoleRegisterMapper;
+import com.zanxiang.game.back.serve.pojo.TutorialFinish;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameRoleRegisterDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameBackLog;
@@ -24,11 +25,13 @@ import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
 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.JsonUtil;
 import com.zanxiang.module.util.bean.BeanUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -123,14 +126,17 @@ public class GameTencentMiniGameRoleRegisterServiceImpl extends ServiceImpl<Game
     }
 
     private Tuple2<BackStatusEnum, String> doCallback(GameTencentMiniGameRoleRegister roleRegisterLog) {
+        //最近的注册回传记录
         GameTencentMiniGameUser user = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
                 .eq(GameTencentMiniGameUser::getGameId, roleRegisterLog.getGameId())
                 .eq(GameTencentMiniGameUser::getWechatAppId, roleRegisterLog.getWechatAppId())
                 .eq(GameTencentMiniGameUser::getWechatOpenid, roleRegisterLog.getWechatOpenid())
                 .eq(GameTencentMiniGameUser::getAdAccountId, roleRegisterLog.getAdAccountId())
                 .orderByDesc(GameTencentMiniGameUser::getCreateTime)
-                .last("limit 1")
-        );
+                .last("limit 1"));
+        //回传策略
+        GameBackPolicy gameBackPolicy = roleRegisterLog.getBackPolicyId() == null ? null
+                : gameBackPolicyService.getById(roleRegisterLog.getBackPolicyId());
 
         //判断创角是否回传
         if (gameTencentMiniGameBackLogService.count(new LambdaQueryWrapper<GameTencentMiniGameBackLog>()
@@ -141,29 +147,61 @@ public class GameTencentMiniGameRoleRegisterServiceImpl extends ServiceImpl<Game
                 .eq(GameTencentMiniGameBackLog::getActionType, ActionTypeEnum.CREATE_ROLE.getActionType())
                 .eq(GameTencentMiniGameBackLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
         ) > 0) {
+            //新手引导回传
+            this.tutorialFinishBack(roleRegisterLog, gameBackPolicy);
             //创角已回传
             return Tuple2.with(BackStatusEnum.NO, "创角已回传,默认不重复传");
         }
 
         //回传策略等级控制
-        if (roleRegisterLog.getBackPolicyId() != null) {
-            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(roleRegisterLog.getBackPolicyId());
-            if (gameBackPolicy.getRoleLevelMin() != null && roleRegisterLog.getRoleLevel() != null
-                    && roleRegisterLog.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
-                return Tuple2.with(BackStatusEnum.NO, "等级小于回传策略等级 " + gameBackPolicy.getRoleLevelMin() + "。不回传");
-            }
+        if (gameBackPolicy != null && gameBackPolicy.getRoleLevelMin() != null && roleRegisterLog.getRoleLevel() != null
+                && roleRegisterLog.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
+            return Tuple2.with(BackStatusEnum.NO, "等级小于回传策略等级 " + gameBackPolicy.getRoleLevelMin() + "。不回传");
         }
 
-        //判断注册是否回传
-        if (user != null && Objects.equals(BackStatusEnum.NO.getBackStatus(), user.getBackStatus())) {
-            //注册回传
-            gameTencentMiniGameUserService.userBack(user);
+        //判断注册或者沉默唤起是否回传
+        if (user != null) {
+            if (Objects.equals(BackStatusEnum.NO.getBackStatus(), user.getBackStatus())
+                    || Objects.equals(BackStatusEnum.NO.getBackStatus(), user.getReActiveBackStatus())) {
+                //注册或者沉默唤起回传
+                gameTencentMiniGameUserService.userBack(user);
+            }
         }
 
         //创角回传
         return gameTencentMiniGameBackLogService.roleRegisterBack(roleRegisterLog);
     }
 
+    private void tutorialFinishBack(GameTencentMiniGameRoleRegister roleRegisterLog, GameBackPolicy gameBackPolicy) {
+        //角色判断完成新手引导回传
+        if (super.count(new LambdaQueryWrapper<GameTencentMiniGameRoleRegister>()
+                .eq(GameTencentMiniGameRoleRegister::getGameId, roleRegisterLog.getGameId())
+                .eq(GameTencentMiniGameRoleRegister::getRoleId, roleRegisterLog.getRoleId())
+                .eq(GameTencentMiniGameRoleRegister::getTutorialFinishBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
+        ) > 0) {
+            return;
+        }
+        //回传策略不存在, 新手引导回传条件不存在, 不回传
+        if (gameBackPolicy == null || Strings.isBlank(gameBackPolicy.getTutorialFinishJson())) {
+            return;
+        }
+        TutorialFinish tutorialFinish = JsonUtil.toObj(gameBackPolicy.getTutorialFinishJson(), TutorialFinish.class);
+        //条件设置为空, 不回传
+        if (tutorialFinish == null) {
+            return;
+        }
+        //不满足等级条件判断, 不回传
+        if (tutorialFinish.getRoleLevel() != null && tutorialFinish.getRoleLevel() < gameBackPolicy.getRoleLevelMin()) {
+            return;
+        }
+        //执行完成新手引导回传
+        BackStatusEnum backStatusEnum = gameTencentMiniGameBackLogService.tutorialFinishBack(roleRegisterLog).first;
+        //更新新手引导回传状态更新
+        super.update(new LambdaUpdateWrapper<GameTencentMiniGameRoleRegister>()
+                .set(GameTencentMiniGameRoleRegister::getTutorialFinishBackStatus, backStatusEnum.getBackStatus())
+                .eq(GameTencentMiniGameRoleRegister::getId, roleRegisterLog.getId()));
+    }
+
     private GameTencentMiniGameRoleRegisterVO toVOSimple(GameTencentMiniGameRoleRegister roleRegisterLog) {
         if (roleRegisterLog == null) {
             return null;

+ 15 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameUserServiceImpl.java

@@ -115,6 +115,7 @@ public class GameTencentMiniGameUserServiceImpl extends ServiceImpl<GameTencentM
     }
 
     private Tuple2<BackStatusEnum, String> doCallback(GameTencentMiniGameUser userLog) {
+        //注册已回传判断
         if (gameTencentMiniGameBackLogService.count(new LambdaQueryWrapper<GameTencentMiniGameBackLog>()
                 .eq(GameTencentMiniGameBackLog::getGameId, userLog.getGameId())
                 .eq(GameTencentMiniGameBackLog::getWechatAppId, userLog.getWechatAppId())
@@ -123,6 +124,20 @@ public class GameTencentMiniGameUserServiceImpl extends ServiceImpl<GameTencentM
                 .eq(GameTencentMiniGameBackLog::getActionType, ActionTypeEnum.REGISTER.getActionType())
                 .eq(GameTencentMiniGameBackLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
         ) > 0) {
+            //该广告账号渠道未回传, 执行沉默唤起回传
+            if (super.count(new LambdaQueryWrapper<GameTencentMiniGameUser>()
+                    .eq(GameTencentMiniGameUser::getGameId, userLog.getGameId())
+                    .eq(GameTencentMiniGameUser::getWechatAppId, userLog.getWechatAppId())
+                    .eq(GameTencentMiniGameUser::getWechatOpenid, userLog.getWechatOpenid())
+                    .eq(GameTencentMiniGameUser::getAdAccountId, userLog.getAdAccountId())
+                    .eq(GameTencentMiniGameUser::getAgentKey, userLog.getAgentKey())
+            ) <= 0) {
+                BackStatusEnum backStatus = gameTencentMiniGameBackLogService.reActiveBack(userLog).first;
+                super.update(new LambdaUpdateWrapper<GameTencentMiniGameUser>()
+                        .set(GameTencentMiniGameUser::getReActiveBackStatus, backStatus.getBackStatus())
+                        .eq(GameTencentMiniGameUser::getId, userLog.getId()));
+            }
+            //返回注册已回传
             return Tuple2.with(BackStatusEnum.NO, null);
         }
         return gameTencentMiniGameBackLogService.userBack(userLog);