Forráskód Böngészése

Merge branch 'package' of GameCenter/game-center into dev

zhimo 9 hónapja
szülő
commit
9bdafaea36

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

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

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

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

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

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

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

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

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

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

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

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