|
@@ -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 {
|