| 
					
				 | 
			
			
				@@ -5,6 +5,7 @@ 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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.github.sd4324530.jtuple.Tuple2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.github.sd4324530.jtuple.Tuple3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAppIdRpcDTO; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -14,30 +15,37 @@ import com.zanxiang.erp.base.ErpServer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.erp.base.rpc.ISysUserRpc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.dto.GameTencentOrderDTO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.zanxiang.game.back.serve.pojo.dto.OrderReportDTO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.entity.GameTencentBackLog; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.dao.mapper.GameTencentOrderMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrderSplitLog; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.enums.BackUnitEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.zanxiang.game.back.serve.pojo.vo.GameTencentOrderSplitLogVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.pojo.vo.GameTencentOrderVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.service.IGameBackPolicyService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.service.IGameTencentBackLogService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.service.IGameTencentOrderService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.zanxiang.game.back.serve.service.IGameTencentOrderSplitLogService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.service.IGameTencentUserService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.utils.BackPolicyUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.game.back.serve.utils.OrderUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 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.NumberUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.module.util.bean.BeanUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.zanxiang.module.util.exception.BaseException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.zanxiang.module.util.pojo.ResultVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.collections4.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.lang3.RandomUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.dubbo.config.annotation.DubboReference; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -53,6 +61,7 @@ import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Objects; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Set; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.atomic.AtomicLong; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.function.Function; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -66,7 +75,8 @@ import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Slf4j 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMapper, GameTencentOrder> implements IGameTencentOrderService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMapper, GameTencentOrder> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        implements IGameTencentOrderService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private IUserActionSetRpc userActionSetRpc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -79,54 +89,85 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private IAgentRpc agentRpc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private IGameTencentUserService gameTencentUserService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private IGameTencentOrderSplitLogService gameTencentOrderSplitLogService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public boolean orderBack(GameTencentOrder orderLog, boolean mustBack, Long backMoneyOfInput) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        boolean doBack; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Long backMoney; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String backMsg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (mustBack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            doBack = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            backMoney = backMoneyOfInput; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            backMsg = "手动触发的回传"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 只要回传 支付行为 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            GameTencentUser userLog = gameTencentUserService.getOne(new LambdaQueryWrapper<GameTencentUser>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .eq(GameTencentUser::getGameId, orderLog.getGameId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .eq(GameTencentUser::getWechatAppId, orderLog.getWechatAppId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .eq(GameTencentUser::getWechatOpenid, orderLog.getWechatOpenid()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .eq(GameTencentUser::getAdAccountId, orderLog.getAdAccountId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .orderByDesc(GameTencentUser::getCreateTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .last("limit 1") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            );if (userLog == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                doBack = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                backMoney = orderLog.getRechargeMoney(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                backMsg = "回传失败!找不到回传用户"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Tuple3<Boolean, Long, String> backInfo = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        orderLog.getIsFirstOrder(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        orderLog.getPayTime(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        // 此处使用用户最近一次的重新染色时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        userLog.getCreateTime(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        orderLog.getWechatOpenid(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        new TencentOrderBackPolicyCheck(this, gameBackPolicy, userLog, orderLog)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                doBack = backInfo.first; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                backMoney = backInfo.second; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                backMsg = backInfo.third; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean orderBack(GameTencentOrder orderLog) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 只要回传 支付行为 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GameTencentUser userLog = gameTencentUserService.getOne(new LambdaQueryWrapper<GameTencentUser>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .eq(GameTencentUser::getGameId, orderLog.getGameId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .eq(GameTencentUser::getWechatAppId, orderLog.getWechatAppId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .eq(GameTencentUser::getWechatOpenid, orderLog.getWechatOpenid()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .eq(GameTencentUser::getAdAccountId, orderLog.getAdAccountId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .orderByDesc(GameTencentUser::getCreateTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .last("limit 1") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (userLog == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return update(new LambdaUpdateWrapper<GameTencentOrder>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getIsBack, BackStatusEnum.FAILED.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getBackMoney, orderLog.getRechargeMoney()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getBackMsg, "回传失败!找不到回传用户") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .eq(GameTencentOrder::getId, orderLog.getId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Tuple3<Boolean, Long, String> backInfo = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                orderLog.getIsFirstOrder(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                orderLog.getPayTime(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 此处使用用户最近一次的重新染色时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                userLog.getCreateTime(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                orderLog.getWechatOpenid(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new TencentOrderBackPolicyCheck(this, gameBackPolicy, userLog, orderLog)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        boolean doBack = backInfo.first; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long backMoney = backInfo.second; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String backMsg = backInfo.third; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!doBack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return update(new LambdaUpdateWrapper<GameTencentOrder>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getIsBack, BackStatusEnum.NO.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getBackMoney, backMoney) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getBackMsg, backMsg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .eq(GameTencentOrder::getId, orderLog.getId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 拆单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Tuple3<Boolean, Long, List<Tuple2<Long, LocalDateTime>>> splitResult = BackPolicyUtil.splitOrder(gameBackPolicy, backMoney); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (splitResult.first) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 需要拆单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<GameTencentOrderSplitLog> 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(GameTencentOrderSplitLog.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .backDay(splitOrder.second.toLocalDate()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .orderNo(orderLog.getOrderId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .backIndex(i + 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .backCount(splitResult.third.size()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .splitMoney(splitOrder.first) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .backTime(splitOrder.second) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .backStatus(BackStatusEnum.NO.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .createTime(LocalDateTime.now()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .build()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            gameTencentOrderSplitLogService.saveBatch(splitOrderLogList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return update(new LambdaUpdateWrapper<GameTencentOrder>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getIsBack, BackStatusEnum.NO.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getBackMoney, splitResult.second) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .set(GameTencentOrder::getBackMsg, backMsg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .eq(GameTencentOrder::getId, orderLog.getId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        BackStatusEnum backStatus = BackStatusEnum.NO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        orderLog.setBackMoney(backMoney); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (doBack) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            backStatus = doCallback(orderLog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Tuple2<BackStatusEnum, String> backResult = doCallback(orderLog, orderLog.getPayTime(), backMoney); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isNotBlank(backResult.second)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            backMsg = backMsg + ("回传失败:" + backResult.second); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return update(new LambdaUpdateWrapper<GameTencentOrder>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .set(GameTencentOrder::getIsBack, backStatus.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .set(GameTencentOrder::getIsBack, backResult.first.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .set(GameTencentOrder::getBackMoney, backMoney) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .set(GameTencentOrder::getBackMsg, backMsg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .eq(GameTencentOrder::getId, orderLog.getId()) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -165,6 +206,7 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (CollectionUtils.isEmpty(logList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return Collections.emptyList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<GameTencentOrderSplitLogVO> orderSplitList = gameTencentOrderSplitLogService.listByOrderNo(logList.stream().map(GameTencentOrder::getOrderId).collect(Collectors.toList())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Set<String> agentKeys = logList.stream().map(GameTencentOrder::getChannel).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())); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -176,6 +218,8 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     vo.setAgentName(agent.getAgentName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<GameTencentOrderSplitLogVO> splitList = orderSplitList.stream().filter(obj -> obj.getOrderNo().equals(log.getOrderId())).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            vo.setSplitOrderList(splitList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return vo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -190,27 +234,77 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public boolean tencentOrderReport(List<Long> ids, Long backMoney) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        listByIds(ids).stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean tencentOrderReport(OrderReportDTO dto) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        listByIds(dto.getOrderIds()).stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .filter(order -> !Objects.equals(order.getIsBack(), BackStatusEnum.SUCCESS.getBackStatus())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .forEach(orderLog -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    log.error("手动回传:{}-{}", orderLog.getId(), backMoney); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    orderBack(orderLog, true, backMoney); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (dto.getSplitOrder()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        AtomicLong total = new AtomicLong(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        dto.getSplitMoney().forEach(money -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            total.addAndGet(NumberUtil.multiply100(money).longValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (!orderLog.getRechargeMoney().equals(total.get())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            throw new BaseException("订单充值金额和回传金额对不上"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        log.error("手动拆单回传:{}-{}", orderLog.getId(), StringUtils.join(dto.getSplitMoney(), ",")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        List<GameTencentOrderSplitLog> splitOrderLogList = new ArrayList<>(dto.getSplitMoney().size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        LocalDateTime beginTime = LocalDateTime.now(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        long backMoneyTotal = 0L; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        for (int i = 0; i < dto.getSplitMoney().size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            long backMoney = NumberUtil.multiply100(dto.getSplitMoney().get(i)).longValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            LocalDateTime backTime = beginTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            backMoneyTotal += backMoney; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            splitOrderLogList.add(GameTencentOrderSplitLog.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .backDay(backTime.toLocalDate()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .orderNo(orderLog.getOrderId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .backIndex(i + 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .backCount(dto.getSplitMoney().size()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .splitMoney(backMoney) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .backTime(backTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .backStatus(BackStatusEnum.NO.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .createTime(LocalDateTime.now()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    .build()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            beginTime = beginTime.plusMinutes(RandomUtils.nextInt(dto.getBetweenMinuteMin(), dto.getBetweenMinuteMax())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        gameTencentOrderSplitLogService.saveBatch(splitOrderLogList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        update(new LambdaUpdateWrapper<GameTencentOrder>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .set(GameTencentOrder::getIsBack, BackStatusEnum.NO.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .set(GameTencentOrder::getBackMoney, backMoneyTotal) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .set(GameTencentOrder::getBackMsg, "手动触发回传(拆单回传)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .eq(GameTencentOrder::getId, orderLog.getId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        log.error("手动直接回传:{}-{}", orderLog.getId(), dto.getBackMoney()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        long backMoney = NumberUtil.multiply100(dto.getBackMoney()).longValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Tuple2<BackStatusEnum, String> backResult = doCallback(orderLog, orderLog.getPayTime(), backMoney); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        String backMsg = "手动触发回传!"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (StringUtils.isNotBlank(backResult.second)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            backMsg += ("回传失败:" + backResult.second); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        update(new LambdaUpdateWrapper<GameTencentOrder>() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .set(GameTencentOrder::getIsBack, backResult.first.getBackStatus()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .set(GameTencentOrder::getBackMoney, backMoney) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .set(GameTencentOrder::getBackMsg, backMsg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                .eq(GameTencentOrder::getId, orderLog.getId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private BackStatusEnum doCallback(GameTencentOrder orderLog) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public Tuple2<BackStatusEnum, String> doCallback(GameTencentOrder orderLog, LocalDateTime backTime, Long backMoney) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String actionType = orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ActionTypeEnum.PURCHASE.getActionType() : ActionTypeEnum.COMPLETE_ORDER.getActionType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<String, Object> actionParam = new HashMap<>(2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         actionParam.put("claim_type", 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        actionParam.put("value", orderLog.getBackMoney()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        actionParam.put("value", backMoney); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .appId(orderLog.getWechatAppId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .userActionSetId(orderLog.getUserActionSetId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .action(UserActionRpcDTO.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        .actionTime(orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ? orderLog.getPayTime() : orderLog.getRechargeTime()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .actionTime(backTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         .actionType(actionType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         .userId(UserActionRpcDTO.UserIdRpcDTO.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 .wechatAppId(orderLog.getWechatAppId()) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -223,7 +317,7 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .gameId(orderLog.getGameId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .adAccountId(orderLog.getAdAccountId()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .actionTime(orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ? orderLog.getPayTime() : orderLog.getRechargeTime()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .actionTime(backTime) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .createTime(LocalDateTime.now()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .actionType(actionType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .orderId(orderLog.getOrderId()) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -242,7 +336,7 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             gameTencentBackLog.setBackLog(result.getMsg()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         gameTencentBackLogService.save(gameTencentBackLog); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return backStatus; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return Tuple2.with(backStatus, gameTencentBackLog.getBackLog()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static class TencentOrderBackPolicyCheck implements BackPolicyUtil.IBackPolicyCheck { 
			 |