|  | @@ -0,0 +1,336 @@
 | 
	
		
			
				|  |  | +package com.zanxiang.game.back.serve.service.impl;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
	
		
			
				|  |  | +import com.github.sd4324530.jtuple.Tuple2;
 | 
	
		
			
				|  |  | +import com.github.sd4324530.jtuple.Tuple3;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppOrderLogMapper;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.serve.pojo.entity.*;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.serve.pojo.enums.BackUnitEnum;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.serve.service.*;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
 | 
	
		
			
				|  |  | +import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  | +import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | +import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | +import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | +import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.time.LocalDateTime;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@Slf4j
 | 
	
		
			
				|  |  | +@Service
 | 
	
		
			
				|  |  | +public class GameOceanengineAppOrderLogServiceImpl extends ServiceImpl<GameOceanengineAppOrderLogMapper, GameOceanengineAppOrderLog>
 | 
	
		
			
				|  |  | +implements IGameOceanengineAppOrderLogService {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IGameBackPolicyService gameBackPolicyService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IGameOceanengineAppUserLogService gameOceanengineAppUserLogService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IGameOceanengineAppBackLogService gameOceanengineAppBackLogService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public boolean callback(GameOceanengineAppOrderLog orderLog) {
 | 
	
		
			
				|  |  | +        if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) {
 | 
	
		
			
				|  |  | +            // 头条只要回传支付订单
 | 
	
		
			
				|  |  | +            return true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        GameOceanengineAppUserLog userLog = userLog(orderLog);
 | 
	
		
			
				|  |  | +        if (userLog == null) {
 | 
	
		
			
				|  |  | +            // 找不到用户
 | 
	
		
			
				|  |  | +            return update(new LambdaUpdateWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                    .set(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.NO.getBackStatus())
 | 
	
		
			
				|  |  | +                    .set(GameOceanengineAppOrderLog::getBackMoney, orderLog.getAmount())
 | 
	
		
			
				|  |  | +                    .set(GameOceanengineAppOrderLog::getBackMsg, "回传失败!找不到回传用户")
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getId, orderLog.getId())
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
 | 
	
		
			
				|  |  | +        Tuple3<Boolean, Long, String> backInfo = BackPolicyUtil.backOrder(orderLog.getOrderNo(), gameBackPolicy, orderLog.getAmount(),
 | 
	
		
			
				|  |  | +                orderLog.getIsFirstOrder(),
 | 
	
		
			
				|  |  | +                orderLog.getPayTime(),
 | 
	
		
			
				|  |  | +                // 此处使用用户最近一次的重新染色时间
 | 
	
		
			
				|  |  | +                userLog.getCreateTime(),
 | 
	
		
			
				|  |  | +                orderLog.getUserId(),
 | 
	
		
			
				|  |  | +                new OceanengineOrderBackPolicyCheck(this, userLog, orderLog, gameBackPolicy)
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        boolean doBack = backInfo.first;
 | 
	
		
			
				|  |  | +        Long backMoney = backInfo.second;
 | 
	
		
			
				|  |  | +        String backMsg = backInfo.third;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (!doBack) {
 | 
	
		
			
				|  |  | +            // 不回传
 | 
	
		
			
				|  |  | +            return update(new LambdaUpdateWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                    .set(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.NO.getBackStatus())
 | 
	
		
			
				|  |  | +                    .set(GameOceanengineAppOrderLog::getBackMoney, backMoney)
 | 
	
		
			
				|  |  | +                    .set(GameOceanengineAppOrderLog::getBackMsg, backMsg)
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getId, orderLog.getId())
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Tuple2<BackStatusEnum, String> backResult = doCallback(orderLog, orderLog.getPayTime(), backMoney);
 | 
	
		
			
				|  |  | +        if (StringUtils.isNotBlank(backResult.second)) {
 | 
	
		
			
				|  |  | +            backMsg = backMsg + ("回传失败:" + backResult.second);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return update(new LambdaUpdateWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                .set(GameOceanengineAppOrderLog::getBackStatus, backResult.first.getBackStatus())
 | 
	
		
			
				|  |  | +                .set(GameOceanengineAppOrderLog::getBackMoney, backMoney)
 | 
	
		
			
				|  |  | +                .set(GameOceanengineAppOrderLog::getBackMsg, backMsg)
 | 
	
		
			
				|  |  | +                .eq(GameOceanengineAppOrderLog::getId, orderLog.getId())
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public Tuple2<BackStatusEnum, String> doCallback(GameOceanengineAppOrderLog orderLog, LocalDateTime backTime, Long backMoney) {
 | 
	
		
			
				|  |  | +        GameOceanengineAppUserLog userLog = userLog(orderLog);
 | 
	
		
			
				|  |  | +        if (userLog == null) {
 | 
	
		
			
				|  |  | +            gameOceanengineAppBackLogService.save(GameOceanengineAppBackLog.builder()
 | 
	
		
			
				|  |  | +                    .userId(orderLog.getUserId())
 | 
	
		
			
				|  |  | +                    .mac(orderLog.getMac())
 | 
	
		
			
				|  |  | +                    .imei(orderLog.getImei())
 | 
	
		
			
				|  |  | +                    .oaid(orderLog.getOaid())
 | 
	
		
			
				|  |  | +                    .androidId(orderLog.getAndroidId())
 | 
	
		
			
				|  |  | +                    .idfa(orderLog.getIdfa())
 | 
	
		
			
				|  |  | +                    .caid(orderLog.getCaid())
 | 
	
		
			
				|  |  | +                    .gameId(orderLog.getGameId())
 | 
	
		
			
				|  |  | +                    .accountId(orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                    .eventType(String.valueOf(MiniGameCallback.EventType.ACTIVE_PAY.getEventType()))
 | 
	
		
			
				|  |  | +                    .eventLogId(orderLog.getId())
 | 
	
		
			
				|  |  | +                    .createTime(LocalDateTime.now())
 | 
	
		
			
				|  |  | +                    .payAmount(backMoney)
 | 
	
		
			
				|  |  | +                    .backStatus(BackStatusEnum.FAILED.getBackStatus())
 | 
	
		
			
				|  |  | +                    .errMsg("找不到用户注册信息")
 | 
	
		
			
				|  |  | +                    .build());
 | 
	
		
			
				|  |  | +            return Tuple2.with(BackStatusEnum.FAILED, "找不到用户注册信息");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Integer eventType = MiniGameCallback.EventType.ACTIVE_PAY.getEventType();
 | 
	
		
			
				|  |  | +        BackStatusEnum backStatus = BackStatusEnum.SUCCESS;
 | 
	
		
			
				|  |  | +        String errMsg = null;
 | 
	
		
			
				|  |  | +        gameOceanengineAppBackLogService.save(GameOceanengineAppBackLog.builder()
 | 
	
		
			
				|  |  | +                .userId(orderLog.getUserId())
 | 
	
		
			
				|  |  | +                .mac(orderLog.getMac())
 | 
	
		
			
				|  |  | +                .imei(orderLog.getImei())
 | 
	
		
			
				|  |  | +                .oaid(orderLog.getOaid())
 | 
	
		
			
				|  |  | +                .androidId(orderLog.getAndroidId())
 | 
	
		
			
				|  |  | +                .idfa(orderLog.getIdfa())
 | 
	
		
			
				|  |  | +                .caid(orderLog.getCaid())
 | 
	
		
			
				|  |  | +                .gameId(orderLog.getGameId())
 | 
	
		
			
				|  |  | +                .accountId(orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                .eventType(String.valueOf(eventType))
 | 
	
		
			
				|  |  | +                .eventLogId(orderLog.getId())
 | 
	
		
			
				|  |  | +                .createTime(LocalDateTime.now())
 | 
	
		
			
				|  |  | +                .payAmount(backMoney)
 | 
	
		
			
				|  |  | +                .backStatus(backStatus.getBackStatus())
 | 
	
		
			
				|  |  | +                .errMsg(errMsg)
 | 
	
		
			
				|  |  | +                .build());
 | 
	
		
			
				|  |  | +        return Tuple2.with(backStatus, errMsg);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private GameOceanengineAppUserLog userLog(GameOceanengineAppOrderLog orderLog) {
 | 
	
		
			
				|  |  | +        return gameOceanengineAppUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppUserLog>()
 | 
	
		
			
				|  |  | +                .eq(GameOceanengineAppUserLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                .eq(GameOceanengineAppUserLog::getUserId, orderLog.getUserId())
 | 
	
		
			
				|  |  | +                .eq(GameOceanengineAppUserLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                .orderByDesc(GameOceanengineAppUserLog::getCreateTime)
 | 
	
		
			
				|  |  | +                .last("limit 1")
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public static class OceanengineOrderBackPolicyCheck implements BackPolicyUtil.IBackPolicyCheck {
 | 
	
		
			
				|  |  | +        private final IGameOceanengineAppOrderLogService gameOceanengineAppOrderLogService;
 | 
	
		
			
				|  |  | +        private final GameBackPolicy gameBackPolicy;
 | 
	
		
			
				|  |  | +        private final GameOceanengineAppUserLog userLog;
 | 
	
		
			
				|  |  | +        private final GameOceanengineAppOrderLog orderLog;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public OceanengineOrderBackPolicyCheck(IGameOceanengineAppOrderLogService gameOceanengineAppOrderLogService, GameOceanengineAppUserLog userLog, GameOceanengineAppOrderLog orderLog, GameBackPolicy gameBackPolicy) {
 | 
	
		
			
				|  |  | +            this.gameOceanengineAppOrderLogService = gameOceanengineAppOrderLogService;
 | 
	
		
			
				|  |  | +            this.gameBackPolicy = gameBackPolicy;
 | 
	
		
			
				|  |  | +            this.userLog = userLog;
 | 
	
		
			
				|  |  | +            this.orderLog = orderLog;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        @Override
 | 
	
		
			
				|  |  | +        public long backCountForFixedRate(int numberOfRound, BackUnitEnum backUnit, Boolean firstPolicy) {
 | 
	
		
			
				|  |  | +            numberOfRound = numberOfRound - 1;
 | 
	
		
			
				|  |  | +            if (backUnit == BackUnitEnum.UNIT_ONCE) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getIsFirstOrder, firstPolicy)
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                        .orderByDesc(GameOceanengineAppOrderLog::getCreateTime)
 | 
	
		
			
				|  |  | +                        .last("limit " + numberOfRound)
 | 
	
		
			
				|  |  | +                ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.UNIT_DAY) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .apply(firstPolicy, "date(reg_time) = date(pay_time)")
 | 
	
		
			
				|  |  | +                        .apply(!firstPolicy, "date(reg_time) != date(pay_time)")
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                        .orderByDesc(GameOceanengineAppOrderLog::getCreateTime)
 | 
	
		
			
				|  |  | +                        .last("limit " + numberOfRound)
 | 
	
		
			
				|  |  | +                ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.UNIT_TIME_DAY) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .apply(firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) < 24")
 | 
	
		
			
				|  |  | +                        .apply(!firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) >= 24")
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                        .orderByDesc(GameOceanengineAppOrderLog::getCreateTime)
 | 
	
		
			
				|  |  | +                        .last("limit " + numberOfRound)
 | 
	
		
			
				|  |  | +                ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.UNIT_TIME_2DAY) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .apply(firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) < 48")
 | 
	
		
			
				|  |  | +                        .apply(!firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) >= 48")
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                        .orderByDesc(GameOceanengineAppOrderLog::getCreateTime)
 | 
	
		
			
				|  |  | +                        .last("limit " + numberOfRound)
 | 
	
		
			
				|  |  | +                ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                        .orderByDesc(GameOceanengineAppOrderLog::getCreateTime)
 | 
	
		
			
				|  |  | +                        .last("limit " + numberOfRound)
 | 
	
		
			
				|  |  | +                ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        @Override
 | 
	
		
			
				|  |  | +        public long backCountForUser(BackUnitEnum backUnit, String userId, Boolean firstPolicy) {
 | 
	
		
			
				|  |  | +            if (backUnit == BackUnitEnum.UNIT_ONCE) {
 | 
	
		
			
				|  |  | +                if (firstPolicy) {
 | 
	
		
			
				|  |  | +                    // 首单直接返回 0,必定回传
 | 
	
		
			
				|  |  | +                    return 0;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.count(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getUserId, userId)
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getIsFirstOrder, firstPolicy)
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                );
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.UNIT_DAY) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.count(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getUserId, userId)
 | 
	
		
			
				|  |  | +                        .apply(firstPolicy, "date(reg_time) = date(pay_time)")
 | 
	
		
			
				|  |  | +                        .apply(!firstPolicy, "date(reg_time) != date(pay_time)")
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                );
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.UNIT_TIME_DAY) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.count(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getUserId, userId)
 | 
	
		
			
				|  |  | +                        .apply(firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) < 24")
 | 
	
		
			
				|  |  | +                        .apply(!firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) >= 24")
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                );
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.UNIT_TIME_2DAY) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.count(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getUserId, userId)
 | 
	
		
			
				|  |  | +                        .apply(firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) < 48")
 | 
	
		
			
				|  |  | +                        .apply(!firstPolicy, "TIMESTAMPDIFF(HOUR, reg_time, pay_time) >= 48")
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                );
 | 
	
		
			
				|  |  | +            } else if (backUnit == BackUnitEnum.LARGE_AMOUNT) {
 | 
	
		
			
				|  |  | +                return gameOceanengineAppOrderLogService.count(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
 | 
	
		
			
				|  |  | +                        .eq(GameOceanengineAppOrderLog::getUserId, userId)
 | 
	
		
			
				|  |  | +                        .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                );
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                throw new RuntimeException("不支持的回传单位[" + backUnit.getValue() + "]");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        @Override
 | 
	
		
			
				|  |  | +        public long markUpOfFixedRate(int numberOfRound, Long markUpTime) {
 | 
	
		
			
				|  |  | +            numberOfRound = numberOfRound - 1;
 | 
	
		
			
				|  |  | +            return gameOceanengineAppOrderLogService.list(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                    .apply("TIMESTAMPDIFF(MINUTE, reg_time, pay_time) > {0}", markUpTime)
 | 
	
		
			
				|  |  | +                    .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +                    .orderByDesc(GameOceanengineAppOrderLog::getCreateTime)
 | 
	
		
			
				|  |  | +                    .last("limit " + numberOfRound)
 | 
	
		
			
				|  |  | +            ).stream().filter(log -> log.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        @Override
 | 
	
		
			
				|  |  | +        public long markUpForUser(String userId, Long markUpTime) {
 | 
	
		
			
				|  |  | +            return gameOceanengineAppOrderLogService.count(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getUserId, userId)
 | 
	
		
			
				|  |  | +                    .apply("TIMESTAMPDIFF(MINUTE, reg_time, pay_time) > {0}", markUpTime)
 | 
	
		
			
				|  |  | +                    .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        @Override
 | 
	
		
			
				|  |  | +        public Long totalRechargeAmount() {
 | 
	
		
			
				|  |  | +            return gameOceanengineAppOrderLogService.getOne(new QueryWrapper<GameOceanengineAppOrderLog>()
 | 
	
		
			
				|  |  | +                    .select("ifnull(sum(amount), 0) as amount").lambda()
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getGameId, orderLog.getGameId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getAccountId, orderLog.getAccountId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getBackPolicyId, gameBackPolicy.getId())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
 | 
	
		
			
				|  |  | +                    .eq(GameOceanengineAppOrderLog::getUserId, userLog.getUserId())
 | 
	
		
			
				|  |  | +                    .ne(GameOceanengineAppOrderLog::getOrderNo, orderLog.getOrderNo())
 | 
	
		
			
				|  |  | +            ).getAmount();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |