|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|