Переглянути джерело

头条回传策略新增创角回传

wcc 1 рік тому
батько
коміт
cb77a8d162
12 змінених файлів з 494 додано та 1 видалено
  1. 50 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterRpcDTO.java
  2. 6 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtMiniGameBackRpc.java
  3. 17 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/NacosDynamicParamConfig.java
  4. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineRoleRegisterLogMapper.java
  5. 47 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineRoleRegisterLogDTO.java
  6. 80 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineRoleRegisterLog.java
  7. 60 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineRoleRegisterLogVO.java
  8. 27 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java
  9. 18 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineRoleRegisterLogService.java
  10. 8 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java
  11. 173 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineRoleRegisterLogServiceImpl.java
  12. 1 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineUserLogServiceImpl.java

+ 50 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterRpcDTO.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TtRoleRegisterRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 小游戏 appId
+     */
+    private String wechatAppId;
+    /**
+     * 小游戏 openId
+     */
+    private String wechatOpenId;
+    /**
+     * 小游戏 unionId
+     */
+    private String wechatUnionId;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+
+    private Long roleId;
+
+    private String roleName;
+    /**
+     * 激活/注册时间
+     */
+    private LocalDateTime registerTime;
+}

+ 6 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtMiniGameBackRpc.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.base.rpc;
 
 import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
 import com.zanxiang.module.util.pojo.ResultVO;
 
@@ -19,4 +20,9 @@ public interface ITtMiniGameBackRpc {
      * 用户下单、支付上报
      */
     ResultVO<Boolean> orderReport(TtOrderRpcDTO dto);
+
+    /**
+     * 创角上报
+     */
+    ResultVO<Boolean> roleRegisterReport(TtRoleRegisterRpcDTO dto);
 }

+ 17 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/NacosDynamicParamConfig.java

@@ -0,0 +1,17 @@
+package com.zanxiang.game.back.serve.config;
+
+import lombok.Getter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Component
+@RefreshScope
+public class NacosDynamicParamConfig {
+    /**
+     * 按关键行为回传的广告账号列表
+     */
+    @Value("${nacos.dynamic.backOfKeyAccountIds:test}")
+    private String backOfKeyAccountIds;
+}

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineRoleRegisterLogMapper.java

@@ -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.GameOceanengineRoleRegisterLog;
+
+public interface GameOceanengineRoleRegisterLogMapper extends BaseMapper<GameOceanengineRoleRegisterLog> {
+}

+ 47 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineRoleRegisterLogDTO.java

@@ -0,0 +1,47 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameOceanengineRoleRegisterLogDTO extends BaseListDTO<GameOceanengineRoleRegisterLog> {
+    @ApiModelProperty("小游戏ID")
+    private String appId;
+
+    @ApiModelProperty("用户OpenID")
+    private String openId;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("回传状态")
+    private Integer backStatus;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerTimeBegin;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerTimeEnd;
+}

+ 80 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineRoleRegisterLog.java

@@ -0,0 +1,80 @@
+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.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_oceanengine_role_register_log")
+public class GameOceanengineRoleRegisterLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 小游戏 id
+     */
+    private String appId;
+    /**
+     * 用户 open_id
+     */
+    private String openId;
+    /**
+     * 用户 union_id
+     */
+    private String unionId;
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 广告账号_id
+     */
+    private Long accountId;
+    /**
+     * 广告回传 token
+     */
+    private String accountReportToken;
+    /**
+     * 广告回传 url
+     */
+    private String accountReportUrl;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+    /**
+     * 角色 id
+     */
+    private Long roleId;
+    /**
+     * 角色名称
+     */
+    private String roleName;
+    /**
+     * 支付时间
+     */
+    private LocalDateTime registerTime;
+    /**
+     * 回传状态
+     */
+    private Integer backStatus;
+    /**
+     * 下单时间
+     */
+    private LocalDateTime createTime;
+
+}

+ 60 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineRoleRegisterLogVO.java

@@ -0,0 +1,60 @@
+package com.zanxiang.game.back.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameOceanengineRoleRegisterLogVO {
+    @ApiModelProperty("主键ID")
+    private Long id;
+
+    @ApiModelProperty("小游戏ID")
+    private String appId;
+
+    @ApiModelProperty("用户OpenID")
+    private String openId;
+
+    @ApiModelProperty("用户UnionID")
+    private String unionId;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("广告回传Token")
+    private String accountReportToken;
+
+    @ApiModelProperty("广告回传URL")
+    private String accountReportUrl;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("渠道名称")
+    private String agentName;
+
+    @ApiModelProperty("角色 id")
+    private Long roleId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("注册/激活时间")
+    private LocalDateTime registerTime;
+
+    @ApiModelProperty("回传状态")
+    private Integer backStatus;
+}

+ 27 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java

@@ -2,13 +2,16 @@ package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.base.rpc.ITtMiniGameBackRpc;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.IGameOceanengineOrderLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineRoleRegisterLogService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineUserLogService;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -26,6 +29,8 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
     private IGameOceanengineUserLogService gameOceanengineUserLogService;
     @Autowired
     private IGameOceanengineOrderLogService gameOceanengineOrderLogService;
+    @Autowired
+    private IGameOceanengineRoleRegisterLogService gameOceanengineRoleRegisterLogService;
 
     @Override
     public ResultVO<Boolean> userActiveReport(TtUserActiveRpcDTO dto) {
@@ -91,4 +96,26 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
         gameOceanengineOrderLogService.save(orderLog);
         return ResultVO.ok(gameOceanengineOrderLogService.callback(orderLog, false, null));
     }
+
+    @Override
+    public ResultVO<Boolean> roleRegisterReport(TtRoleRegisterRpcDTO dto) {
+        log.error("头条小游戏创角回传收到:{}", JsonUtil.toString(dto));
+        GameOceanengineRoleRegisterLog roleRegisterLog = GameOceanengineRoleRegisterLog.builder()
+                .appId(dto.getWechatAppId())
+                .openId(dto.getWechatOpenId())
+                .unionId(dto.getWechatUnionId())
+                .gameId(dto.getGameId())
+                .accountId(dto.getAccountReport().getAccountId())
+                .accountReportToken(dto.getAccountReport().getReportToken())
+                .accountReportUrl(dto.getAccountReport().getReportUrl())
+                .agentKey(dto.getAgentKey())
+                .roleId(dto.getRoleId())
+                .roleName(dto.getRoleName())
+                .registerTime(dto.getRegisterTime())
+                .backStatus(BackStatusEnum.NO.getBackStatus())
+                .createTime(LocalDateTime.now())
+                .build();
+        gameOceanengineRoleRegisterLogService.save(roleRegisterLog);
+        return ResultVO.ok(gameOceanengineRoleRegisterLogService.callback(roleRegisterLog));
+    }
 }

+ 18 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineRoleRegisterLogService.java

@@ -0,0 +1,18 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineRoleRegisterLogDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineRoleRegisterLogVO;
+
+import java.util.List;
+
+public interface IGameOceanengineRoleRegisterLogService extends IService<GameOceanengineRoleRegisterLog> {
+
+    boolean callback(GameOceanengineRoleRegisterLog roleRegisterLog);
+
+    IPage<GameOceanengineRoleRegisterLogVO> oceanengineUserLogList(GameOceanengineRoleRegisterLogDTO dto);
+
+    boolean oceanengineUserReport(List<Long> ids);
+}

+ 8 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java

@@ -8,6 +8,7 @@ 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;
+import com.zanxiang.game.back.serve.config.NacosDynamicParamConfig;
 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;
@@ -37,6 +38,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -59,6 +61,8 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
     private IGameOceanengineBackLogService gameOceanengineBackLogService;
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;
+    @Autowired
+    private NacosDynamicParamConfig dynamicParamConfig;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -341,11 +345,14 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                     .build());
             return 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();
         MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
                 .clue_token(userLog.getClueToken())
                 .open_id(orderLog.getOpenId())
                 .union_id(orderLog.getUnionId())
-                .event_type(String.valueOf(MiniGameCallback.EventType.ACTIVE_PAY.getEventType()))
+                .event_type(String.valueOf(eventType))
                 .props(MiniGameCallback.MiniGameCallbackRequest.MiniGameCallbackRequestProps.builder()
                         .pay_amount(orderLog.getBackMoney())
                         .build())

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

@@ -0,0 +1,173 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineRoleRegisterLogMapper;
+import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
+import com.zanxiang.game.back.serve.oceanengine.OceanengineCallbackException;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineRoleRegisterLogDTO;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineUserLogDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineBackLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineRoleRegisterLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineUserLogVO;
+import com.zanxiang.game.back.serve.service.IGameOceanengineBackLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineRoleRegisterLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineUserLogService;
+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.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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class GameOceanengineRoleRegisterLogServiceImpl extends ServiceImpl<GameOceanengineRoleRegisterLogMapper, GameOceanengineRoleRegisterLog>
+        implements IGameOceanengineRoleRegisterLogService {
+
+    @Autowired
+    private MiniGameCallback miniGameCallback;
+    @Autowired
+    private IGameOceanengineUserLogService gameOceanengineUserLogService;
+    @Autowired
+    private IGameOceanengineBackLogService gameOceanengineBackLogService;
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean callback(GameOceanengineRoleRegisterLog roleRegisterLog) {
+        BackStatusEnum backStatus = doCallback(roleRegisterLog);
+        return update(new LambdaUpdateWrapper<GameOceanengineRoleRegisterLog>()
+                .set(GameOceanengineRoleRegisterLog::getBackStatus, backStatus.getBackStatus())
+                .eq(GameOceanengineRoleRegisterLog::getId, roleRegisterLog.getId())
+        );
+    }
+
+    @Override
+    public IPage<GameOceanengineRoleRegisterLogVO> oceanengineUserLogList(GameOceanengineRoleRegisterLogDTO dto) {
+        IPage<GameOceanengineRoleRegisterLog> page = page(dto.toPage(), new LambdaQueryWrapper<GameOceanengineRoleRegisterLog>()
+                .eq(StringUtils.isNotBlank(dto.getAgentKey()), GameOceanengineRoleRegisterLog::getAgentKey, dto.getAgentKey())
+                .ge(dto.getRegisterTimeBegin() != null, GameOceanengineRoleRegisterLog::getRegisterTime, dto.getRegisterTimeBegin() == null ? null : LocalDateTime.of(dto.getRegisterTimeBegin(), LocalTime.MIDNIGHT))
+                .le(dto.getRegisterTimeEnd() != null, GameOceanengineRoleRegisterLog::getRegisterTime, dto.getRegisterTimeEnd() == null ? null : LocalDateTime.of(dto.getRegisterTimeEnd(), LocalTime.MAX))
+                .eq(null != dto.getGameId(), GameOceanengineRoleRegisterLog::getGameId, dto.getGameId())
+                .eq(null != dto.getAccountId(), GameOceanengineRoleRegisterLog::getAccountId, dto.getAccountId())
+                .eq(StringUtils.isNotBlank(dto.getAppId()), GameOceanengineRoleRegisterLog::getAppId, dto.getAppId())
+                .eq(StringUtils.isNotBlank(dto.getOpenId()), GameOceanengineRoleRegisterLog::getOpenId, dto.getOpenId())
+                .eq(null != dto.getBackStatus(), GameOceanengineRoleRegisterLog::getBackStatus, dto.getBackStatus())
+                .eq(StringUtils.isNotBlank(dto.getRoleName()), GameOceanengineRoleRegisterLog::getRoleName, dto.getRoleName())
+                .orderByDesc(GameOceanengineRoleRegisterLog::getCreateTime)
+        );
+        IPage<GameOceanengineRoleRegisterLogVO> result = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
+        if (CollectionUtils.isEmpty(page.getRecords())) {
+            return result;
+        }
+        result.setRecords(toVOBatch(page.getRecords()));
+        return result;
+    }
+
+    private List<GameOceanengineRoleRegisterLogVO> toVOBatch(List<GameOceanengineRoleRegisterLog> logList) {
+        if (CollectionUtils.isEmpty(logList)) {
+            return Collections.emptyList();
+        }
+        Set<String> agentKeys = logList.stream().map(GameOceanengineRoleRegisterLog::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 -> {
+            GameOceanengineRoleRegisterLogVO vo = BeanUtil.copy(log, GameOceanengineRoleRegisterLogVO.class);
+            if (StringUtils.isNotBlank(log.getAgentKey())) {
+                AgentRpcVO agent = agentMap.get(log.getAgentKey());
+                if (agent != null) {
+                    vo.setAgentName(agent.getAgentName());
+                }
+            }
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean oceanengineUserReport(List<Long> ids) {
+        listByIds(ids).forEach(this::callback);
+        return true;
+    }
+
+    private BackStatusEnum doCallback(GameOceanengineRoleRegisterLog roleRegisterLog) {
+        GameOceanengineUserLog userLog = gameOceanengineUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineUserLog>()
+                .eq(GameOceanengineUserLog::getGameId, roleRegisterLog.getGameId())
+                .eq(GameOceanengineUserLog::getAppId, roleRegisterLog.getAppId())
+                .eq(GameOceanengineUserLog::getOpenId, roleRegisterLog.getOpenId())
+                .eq(GameOceanengineUserLog::getAccountId, roleRegisterLog.getAccountId())
+                .last("limit 1")
+        );
+        if (userLog == null) {
+            gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
+                    .appId(roleRegisterLog.getAppId())
+                    .openId(roleRegisterLog.getOpenId())
+                    .unionId(roleRegisterLog.getUnionId())
+                    .gameId(roleRegisterLog.getGameId())
+                    .accountId(roleRegisterLog.getAccountId())
+                    .clueToken("")
+                    .eventType(String.valueOf(MiniGameCallback.EventType.ACTIVE_REGISTER.getEventType()))
+                    .eventLogId(roleRegisterLog.getId())
+                    .createTime(LocalDateTime.now())
+                    .backStatus(BackStatusEnum.FAILED.getBackStatus())
+                    .errMsg("找不到用户注册信息")
+                    .build());
+            return BackStatusEnum.FAILED;
+        }
+        MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
+                .clue_token(userLog.getClueToken())
+                .open_id(roleRegisterLog.getOpenId())
+                .union_id(roleRegisterLog.getUnionId())
+                .event_type(String.valueOf(MiniGameCallback.EventType.ACTIVE_REGISTER.getEventType()))
+                .build();
+        BackStatusEnum backStatus = BackStatusEnum.SUCCESS;
+        String errMsg = null;
+        try {
+            miniGameCallback.doCallback(userLog.getAccountReportUrl(), userLog.getAccountReportToken(), request);
+        } catch (OceanengineCallbackException e) {
+            log.error(e.getMessage(), e);
+            backStatus = BackStatusEnum.FAILED;
+            errMsg = e.getMsg();
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            backStatus = BackStatusEnum.FAILED;
+            errMsg = "系统异常:" + e.getMessage();
+        }
+        gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
+                .appId(roleRegisterLog.getAppId())
+                .openId(roleRegisterLog.getOpenId())
+                .unionId(roleRegisterLog.getUnionId())
+                .gameId(roleRegisterLog.getGameId())
+                .accountId(roleRegisterLog.getAccountId())
+                .clueToken(userLog.getClueToken())
+                .eventType(request.getEvent_type())
+                .eventLogId(roleRegisterLog.getId())
+                .createTime(LocalDateTime.now())
+                .backStatus(backStatus.getBackStatus())
+                .errMsg(errMsg)
+                .build());
+        return backStatus;
+    }
+}

+ 1 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineUserLogServiceImpl.java

@@ -119,6 +119,7 @@ public class GameOceanengineUserLogServiceImpl extends ServiceImpl<GameOceanengi
                 .eq(GameOceanengineBackLog::getAppId, userLog.getAppId())
                 .eq(GameOceanengineBackLog::getOpenId, userLog.getOpenId())
                 .eq(GameOceanengineBackLog::getAccountId, userLog.getAccountId())
+                .eq(GameOceanengineBackLog::getEventType, MiniGameCallback.EventType.ACTIVE.getEventType())
                 .eq(GameOceanengineBackLog::getBackStatus, BackStatusEnum.SUCCESS)
         ) > 0;
         if (isBack) {