Преглед изворни кода

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

zhimo пре 9 месеци
родитељ
комит
f5f75bf692

+ 2 - 1
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/vo/OrderBackQueryRpcVO.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.util.List;
 
 @Data
 @NoArgsConstructor
@@ -16,7 +17,7 @@ public class OrderBackQueryRpcVO implements Serializable {
 
     private Boolean doBack;
 
-    private Long backMoney;
+    private List<Long> backMoney;
 
     /**
      * 回传信息

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineAppOrderSplitLogMapper.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.GameOceanengineAppOrderSplitLog;
+
+public interface GameOceanengineAppOrderSplitLogMapper extends BaseMapper<GameOceanengineAppOrderSplitLog> {
+}

+ 50 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppOrderSplitLog.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.back.serve.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 拆单回传
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_oceanengine_app_order_split_log")
+public class GameOceanengineAppOrderSplitLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private LocalDate backDay;
+
+    private String orderNo;
+
+    private Integer backIndex;
+
+    private Integer backCount;
+
+    private Long splitMoney;
+
+    private LocalDateTime backTime;
+
+    private LocalDateTime executeTime;
+
+    private Integer backStatus;
+
+    private String backErrorMsg;
+
+    private LocalDateTime createTime;
+
+
+}

+ 11 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java

@@ -14,14 +14,18 @@ import com.zanxiang.module.redis.service.IDistributedLockComponent;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
 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.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Slf4j
 @DubboService
@@ -38,6 +42,8 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
     @Autowired
     private IGameOceanengineAppOrderLogService gameOceanengineAppOrderLogService;
     @Autowired
+    private IGameOceanengineAppOrderSplitLogService gameOceanengineAppOrderSplitLogService;
+    @Autowired
     private IDistributedLockComponent distributedLockComponent;
     @Autowired
     private IGameOceanengineAppCallbackService gameOceanengineAppCallbackService;
@@ -239,9 +245,13 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
                             .backMsg("回传异常,找不到订单:" + dto.getOrderId())
                     .build());
         }
+        List<Long> splitMoney = gameOceanengineAppOrderSplitLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderSplitLog>()
+                .eq(GameOceanengineAppOrderSplitLog::getOrderNo, orderLog.getOrderNo())
+                .orderByAsc(GameOceanengineAppOrderSplitLog::getBackIndex)
+        ).stream().map(GameOceanengineAppOrderSplitLog::getSplitMoney).collect(Collectors.toList());
         return ResultVO.ok(OrderBackQueryRpcVO.builder()
                         .doBack(BackStatusEnum.getByValue(orderLog.getBackStatus()) ==  BackStatusEnum.SUCCESS)
-                        .backMoney(orderLog.getBackMoney())
+                        .backMoney(CollectionUtils.isEmpty(splitMoney) ? Collections.singletonList(orderLog.getBackMoney()) : splitMoney)
                         .backMsg(orderLog.getBackMsg())
                 .build());
     }

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppOrderSplitLogService.java

@@ -0,0 +1,7 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderSplitLog;
+
+public interface IGameOceanengineAppOrderSplitLogService extends IService<GameOceanengineAppOrderSplitLog> {
+}

+ 29 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppOrderLogServiceImpl.java

@@ -34,6 +34,8 @@ implements IGameOceanengineAppOrderLogService {
     private IGameOceanengineAppUserLogService gameOceanengineAppUserLogService;
     @Autowired
     private IGameOceanengineAppBackLogService gameOceanengineAppBackLogService;
+    @Autowired
+    private IGameOceanengineAppOrderSplitLogService gameOceanengineAppOrderSplitLogService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -75,6 +77,33 @@ implements IGameOceanengineAppOrderLogService {
                     .eq(GameOceanengineAppOrderLog::getId, orderLog.getId())
             );
         }
+        // 拆单
+        Tuple3<Boolean, Long, List<Tuple2<Long, LocalDateTime>>> splitResult = BackPolicyUtil.splitOrder(gameBackPolicy, backMoney);
+        if (splitResult.first) {
+            // 需要拆单
+            List<GameOceanengineAppOrderSplitLog> splitOrderLogList = new ArrayList<>(splitResult.third.size());
+            for (int i = 0; i < splitResult.third.size(); i++) {
+                Tuple2<Long, LocalDateTime> splitOrder = splitResult.third.get(i);
+                splitOrderLogList.add(GameOceanengineAppOrderSplitLog.builder()
+                        .backDay(splitOrder.second.toLocalDate())
+                        .orderNo(orderLog.getOrderNo())
+                        .backIndex(i + 1)
+                        .backCount(splitResult.third.size())
+                        .splitMoney(splitOrder.first)
+                        .backTime(splitOrder.second)
+                        .backStatus(BackStatusEnum.SUCCESS.getBackStatus())
+                        .createTime(LocalDateTime.now())
+                        .build()
+                );
+            }
+            gameOceanengineAppOrderSplitLogService.saveBatch(splitOrderLogList);
+            return update(new LambdaUpdateWrapper<GameOceanengineAppOrderLog>()
+                    .set(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
+                    .set(GameOceanengineAppOrderLog::getBackMoney, splitResult.second)
+                    .set(GameOceanengineAppOrderLog::getBackMsg, backMsg)
+                    .eq(GameOceanengineAppOrderLog::getId, orderLog.getId())
+            );
+        }
 
         Tuple2<BackStatusEnum, String> backResult = doCallback(orderLog, orderLog.getPayTime(), backMoney);
         if (StringUtils.isNotBlank(backResult.second)) {

+ 14 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppOrderSplitLogServiceImpl.java

@@ -0,0 +1,14 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppOrderSplitLogMapper;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderSplitLog;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppOrderSplitLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class GameOceanengineAppOrderSplitLogServiceImpl extends ServiceImpl<GameOceanengineAppOrderSplitLogMapper, GameOceanengineAppOrderSplitLog>
+implements IGameOceanengineAppOrderSplitLogService {
+}

+ 113 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/task/TencentAppApiOrderSplitBackTask.java

@@ -0,0 +1,113 @@
+package com.zanxiang.game.back.serve.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.github.sd4324530.jtuple.Tuple2;
+import com.zanxiang.game.back.base.ServerInfo;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppApiOrder;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppApiOrderSplitLog;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.service.*;
+import com.zanxiang.module.redis.service.IDistributedLockComponent;
+import com.zanxiang.module.util.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 头条订单拆分回传任务
+ */
+@Slf4j
+@Component
+public class TencentAppApiOrderSplitBackTask {
+    public static final String KEY = ServerInfo.SERVER_NAME + ":tencentAppApiOrderSplitBack:";
+
+    @Autowired
+    private IGameTencentAppApiOrderService gameTencentAppApiOrderService;
+    @Autowired
+    private IGameTencentAppApiOrderSplitLogService gameTencentAppApiOrderSplitLogService;
+
+    @Autowired
+    private IDistributedLockComponent distributedLockComponent;
+    @Autowired
+    private IGameTencentAppApiBackLogService gameTencentAppApiBackLogService;
+
+    @Scheduled(cron = "0 * * * * ?")
+    public void execute() {
+        LocalDateTime now = LocalDateTime.now().withSecond(0).withNano(0);
+        if (!distributedLockComponent.doLock(KEY + DateUtil.formatLocalDateTime(now))) {
+            return;
+        }
+        List<GameTencentAppApiOrderSplitLog> orderSplitLogList = gameTencentAppApiOrderSplitLogService.list(new LambdaQueryWrapper<GameTencentAppApiOrderSplitLog>()
+                .in(GameTencentAppApiOrderSplitLog::getBackDay, Arrays.asList(LocalDate.now().minusDays(1), LocalDate.now()))
+                .lt(GameTencentAppApiOrderSplitLog::getBackTime, now.plusMinutes(1))
+                .eq(GameTencentAppApiOrderSplitLog::getBackStatus, BackStatusEnum.NO.getBackStatus())
+                .orderByAsc(GameTencentAppApiOrderSplitLog::getOrderNo)
+                .orderByAsc(GameTencentAppApiOrderSplitLog::getBackTime)
+        );
+        if (CollectionUtils.isEmpty(orderSplitLogList)) {
+            return;
+        }
+        log.error("准备回传分拆订单:{}", orderSplitLogList.size());
+        List<GameTencentAppApiOrder> orderList = gameTencentAppApiOrderService.list(new LambdaQueryWrapper<GameTencentAppApiOrder>()
+                .in(GameTencentAppApiOrder::getOrderId, orderSplitLogList.stream().map(GameTencentAppApiOrderSplitLog::getOrderNo).collect(Collectors.toSet()))
+        );
+        Map<String, GameTencentAppApiOrder> orderMap = new HashMap<>(orderList.size());
+        orderList.forEach(order -> orderMap.put(order.getOrderId(), order));
+
+        orderSplitLogList.forEach(orderSplitLog -> {
+            callback(orderMap.get(orderSplitLog.getOrderNo()), orderSplitLog);
+        });
+    }
+
+    private void callback(GameTencentAppApiOrder order, GameTencentAppApiOrderSplitLog orderSplitLog) {
+        log.error("开始回传拆分订单:{}-{}", orderSplitLog.getOrderNo(), orderSplitLog.getBackIndex());
+        try {
+            Tuple2<BackStatusEnum, String> backResult = gameTencentAppApiOrderService.doCallback(order, orderSplitLog.getBackTime(), orderSplitLog.getSplitMoney());
+            gameTencentAppApiOrderSplitLogService.update(new LambdaUpdateWrapper<GameTencentAppApiOrderSplitLog>()
+                    .set(GameTencentAppApiOrderSplitLog::getExecuteTime, LocalDateTime.now())
+                    .set(GameTencentAppApiOrderSplitLog::getBackStatus, backResult.first.getBackStatus())
+                    .set(GameTencentAppApiOrderSplitLog::getBackErrorMsg, backResult.second)
+                    .eq(GameTencentAppApiOrderSplitLog::getId, orderSplitLog.getId())
+            );
+            if (backResult.first == BackStatusEnum.SUCCESS) {
+                gameTencentAppApiOrderService.update(new LambdaUpdateWrapper<GameTencentAppApiOrder>()
+                        .set(GameTencentAppApiOrder::getIsBack, backResult.first.getBackStatus())
+                        .eq(GameTencentAppApiOrder::getId, order.getId())
+                );
+            } else {
+                gameTencentAppApiOrderService.update(new LambdaUpdateWrapper<GameTencentAppApiOrder>()
+                        .set(GameTencentAppApiOrder::getIsBack, BackStatusEnum.SUCCESS_PART.getBackStatus())
+                        .eq(GameTencentAppApiOrder::getId, order.getId())
+                );
+            }
+            log.error("订单回传完成:{}-{}, {}-{}", orderSplitLog.getOrderNo(), orderSplitLog.getBackIndex(), backResult.first, backResult.second);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            try {
+                gameTencentAppApiOrderSplitLogService.update(new LambdaUpdateWrapper<GameTencentAppApiOrderSplitLog>()
+                        .set(GameTencentAppApiOrderSplitLog::getExecuteTime, LocalDateTime.now())
+                        .set(GameTencentAppApiOrderSplitLog::getBackStatus, BackStatusEnum.FAILED.getBackStatus())
+                        .set(GameTencentAppApiOrderSplitLog::getBackErrorMsg, e.getMessage())
+                        .eq(GameTencentAppApiOrderSplitLog::getId, orderSplitLog.getId())
+                );
+                gameTencentAppApiOrderService.update(new LambdaUpdateWrapper<GameTencentAppApiOrder>()
+                        .set(GameTencentAppApiOrder::getIsBack, BackStatusEnum.SUCCESS_PART.getBackStatus())
+                        .eq(GameTencentAppApiOrder::getId, order.getId())
+                );
+            } catch (Exception ex) {
+                log.error(ex.getMessage(), ex);
+            }
+        }
+    }
+}

+ 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服务启动成功 <回传拆单更改结构02> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <回传拆单更改结构05> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

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

@@ -26,10 +26,10 @@ import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @author : lingfeng
@@ -83,21 +83,17 @@ public class CallBackServiceImpl implements ICallBackService {
         resultMap.put("callBackTypeEnum", param.getCallBackTypeEnum().getValue());
         resultMap.put("userId", userData.getUserId());
         resultMap.put("gameId", userData.getGameId());
-
-
-        List<BigDecimal> amountList = new ArrayList<>();
-        amountList.add(new BigDecimal("10.00"));
-        amountList.add(new BigDecimal("20.00"));
-        amountList.add(new BigDecimal("30.00"));
-        resultMap.put("amount", amountList);
-
-
         //事件类型枚举
         CallBackTypeEnum callBackTypeEnum = param.getCallBackTypeEnum();
         Game game = gameService.getById(userData.getGameId());
         //判断游戏状态, 对接上包过程中, 全量回传
         if (Objects.equals(game.getStatus(), 2)) {
             resultMap.put("callBack", Boolean.TRUE);
+            List<Long> amountList = new ArrayList<>();
+            amountList.add(10L);
+            amountList.add(20L);
+            amountList.add(30L);
+            resultMap.put("amount", amountList);
             if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_PAY_ORDER)) {
                 PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(param.getOrderId());
                 resultMap.put("amount", Collections.singletonList(platformOrderDTO.getAmount()));
@@ -174,7 +170,11 @@ public class CallBackServiceImpl implements ICallBackService {
                 resultMap.put("callBack", orderBackQueryRpcVO.getDoBack());
                 resultMap.put("backMsg", orderBackQueryRpcVO.getBackMsg());
                 if (Objects.equals(orderBackQueryRpcVO.getDoBack(), Boolean.TRUE)) {
-                    resultMap.put("amount", orderBackQueryRpcVO.getBackMoney());
+                    //传过来的金额是分, 换算成元, 存在小数直接舍弃
+                    List<Long> backMoney = orderBackQueryRpcVO.getBackMoney()
+                            .stream().map(money -> money / 100)
+                            .collect(Collectors.toList());
+                    resultMap.put("amount", backMoney);
                 }
                 break;
             default: