|
@@ -0,0 +1,140 @@
|
|
|
+package com.zanxiang.game.back.serve.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineOrderLogMapper;
|
|
|
+import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
|
|
|
+import com.zanxiang.game.back.serve.oceanengine.OceanengineCallbackException;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineBackLog;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
|
|
|
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameOceanengineBackLogService;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameOceanengineOrderLogService;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameOceanengineUserLogService;
|
|
|
+import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+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.List;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceanengineOrderLogMapper, GameOceanengineOrderLog>
|
|
|
+ implements IGameOceanengineOrderLogService {
|
|
|
+ @Autowired
|
|
|
+ private MiniGameCallback miniGameCallback;
|
|
|
+ @Autowired
|
|
|
+ private IGameBackPolicyService gameBackPolicyService;
|
|
|
+ @Autowired
|
|
|
+ private IGameOceanengineUserLogService gameOceanengineUserLogService;
|
|
|
+ @Autowired
|
|
|
+ private IGameOceanengineBackLogService gameOceanengineBackLogService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean callback(GameOceanengineOrderLog orderLog, boolean mustBack) {
|
|
|
+ boolean doBack = false;
|
|
|
+ if (mustBack) {
|
|
|
+ doBack = true;
|
|
|
+ } else {
|
|
|
+ if (orderLog.getOrderStatus() != 2) {
|
|
|
+ // 头条只要回传支付订单
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ List<GameBackPolicy> gameBackPolicyList = gameBackPolicyService.list(new LambdaQueryWrapper<GameBackPolicy>()
|
|
|
+ .eq(GameBackPolicy::getAccountId, orderLog.getAccountId())
|
|
|
+ .or().eq(GameBackPolicy::getGameId, orderLog.getGameId())
|
|
|
+ );
|
|
|
+ if (CollectionUtils.isEmpty(gameBackPolicyList)) {
|
|
|
+ // 没有回传策略,则直接全量回传
|
|
|
+ doBack = true;
|
|
|
+ } else {
|
|
|
+ GameBackPolicy gameBackPolicy = gameBackPolicyList.get(0);
|
|
|
+ if (gameBackPolicyList.size() > 1) {
|
|
|
+ GameBackPolicy temp = gameBackPolicyList.get(1);
|
|
|
+ if (temp.getAccountId() != null && temp.getAccountId() > 0) {
|
|
|
+ gameBackPolicy = temp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ doBack = BackPolicyUtil.isBackOrder(gameBackPolicy, orderLog.getAmount());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (doBack) {
|
|
|
+ BackStatusEnum backStatus = doCallback(orderLog);
|
|
|
+ update(new LambdaUpdateWrapper<GameOceanengineOrderLog>()
|
|
|
+ .set(GameOceanengineOrderLog::getBackStatus, backStatus.getBackStatus())
|
|
|
+ .eq(GameOceanengineOrderLog::getId, orderLog.getId())
|
|
|
+ );
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private BackStatusEnum doCallback(GameOceanengineOrderLog orderLog) {
|
|
|
+ GameOceanengineUserLog userLog = gameOceanengineUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineUserLog>()
|
|
|
+ .eq(GameOceanengineUserLog::getGameId, orderLog.getGameId())
|
|
|
+ .eq(GameOceanengineUserLog::getAppId, orderLog.getAppId())
|
|
|
+ .eq(GameOceanengineUserLog::getOpenId, orderLog.getOpenId())
|
|
|
+ .eq(GameOceanengineUserLog::getAccountId, orderLog.getAccountId())
|
|
|
+ .last("limit 1")
|
|
|
+ );
|
|
|
+ if (userLog == null) {
|
|
|
+ gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
|
|
|
+ .appId(orderLog.getAppId())
|
|
|
+ .openId(orderLog.getOpenId())
|
|
|
+ .unionId(orderLog.getUnionId())
|
|
|
+ .gameId(orderLog.getGameId())
|
|
|
+ .accountId(orderLog.getAccountId())
|
|
|
+ .clueToken("")
|
|
|
+ .eventType(String.valueOf(MiniGameCallback.EventType.ACTIVE_PAY.getEventType()))
|
|
|
+ .eventLogId(orderLog.getId())
|
|
|
+ .createTime(LocalDateTime.now())
|
|
|
+ .backStatus(GameOceanengineBackLog.BACK_STATUS_FAILED)
|
|
|
+ .errMsg("找不到用户注册信息")
|
|
|
+ .build());
|
|
|
+ return BackStatusEnum.FAILED;
|
|
|
+ }
|
|
|
+ MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
|
|
|
+ .clue_token(userLog.getClueToken())
|
|
|
+ .open_id(orderLog.getOpenId())
|
|
|
+ .union_id(orderLog.getUnionId())
|
|
|
+ .event_type(String.valueOf(MiniGameCallback.EventType.ACTIVE_PAY.getEventType()))
|
|
|
+ .props(MiniGameCallback.MiniGameCallbackRequest.MiniGameCallbackRequestProps.builder()
|
|
|
+ .pay_amount(orderLog.getAmount())
|
|
|
+ .build())
|
|
|
+ .build();
|
|
|
+ Integer backStatus = GameOceanengineBackLog.BACK_STATUS_SUCCESS;
|
|
|
+ String errMsg = null;
|
|
|
+ try {
|
|
|
+ miniGameCallback.doCallback(userLog.getAccountReportUrl(), userLog.getAccountReportToken(), request);
|
|
|
+ } catch (OceanengineCallbackException e) {
|
|
|
+ backStatus = GameOceanengineBackLog.BACK_STATUS_FAILED;
|
|
|
+ errMsg = e.getMsg();
|
|
|
+ } catch (Exception e) {
|
|
|
+ backStatus = GameOceanengineBackLog.BACK_STATUS_FAILED;
|
|
|
+ errMsg = "系统异常:" + e.getMessage();
|
|
|
+ }
|
|
|
+ gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
|
|
|
+ .appId(orderLog.getAppId())
|
|
|
+ .openId(orderLog.getOpenId())
|
|
|
+ .unionId(orderLog.getUnionId())
|
|
|
+ .gameId(orderLog.getGameId())
|
|
|
+ .accountId(orderLog.getAccountId())
|
|
|
+ .clueToken(userLog.getClueToken())
|
|
|
+ .eventType(request.getEvent_type())
|
|
|
+ .eventLogId(orderLog.getId())
|
|
|
+ .createTime(LocalDateTime.now())
|
|
|
+ .backStatus(backStatus)
|
|
|
+ .errMsg(errMsg)
|
|
|
+ .build());
|
|
|
+ return backStatus.equals(GameOceanengineBackLog.BACK_STATUS_SUCCESS) ? BackStatusEnum.SUCCESS : BackStatusEnum.FAILED;
|
|
|
+ }
|
|
|
+}
|