OrderAutoCancelDelayTask.java 2.61 KB
package com.infoloop.tianting.logic.delay;

import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType;
import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
import com.infoloop.tianting.logic.delay.param.AutoCancelParam;
import com.infoloop.tianting.model.bo.AddSkusSellQuantityBO;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.stream.Collectors;

@Slf4j
@Component
@RequiredArgsConstructor
public class OrderAutoCancelDelayTask {

    private final DelayedQueue<AutoCancelParam> delayedQueue;

    private final OrderServiceRpcClient orderServiceRpcClient;

    public static final String AUTO_CANCEL_ORDER_DELAY_QUEUE = "AUTO_CANCEL_ORDER_QUEUE";

    @PostConstruct
    public void init() {
        delayedQueue.initQueue(AUTO_CANCEL_ORDER_DELAY_QUEUE, this::execute);
    }

    private void execute(AutoCancelParam param) {
        try {
            final var orderById = orderServiceRpcClient.getOrderById(param.getOrderId());
            if (orderById == null) {
                log.error("Order not found, orderId: {}", param.getOrderId());
                return;
            }
            if (orderById.getPayStatus() == PayStatusEnum.PAY_CANCELED) {
                log.info("Order {} already canceled, skipping.", param.getOrderId());
                return;
            }
            if (orderById.getPayStatus() != PayStatusEnum.TO_PAY) {
                log.info("Order {} not to pay, skipping.", param.getOrderId());
                return;
            }
            final var isUpdated = orderServiceRpcClient.updateClientCustomerOrderCancel(orderById.getEnterpriseId(), orderById.getId());
            if (isUpdated && orderById.getCloseTimeType() == CloseTimeType.IMMEDIATELY) {
                // 立即点餐需回滚库存
                final var orderDetails = orderServiceRpcClient.getOrderDetailsByOrderId(orderById.getId());
                final var isSuccess = orderServiceRpcClient.addSkusSellQuantities(orderById.getEnterpriseId(), orderById.getStallId(), orderDetails.stream().map(e -> AddSkusSellQuantityBO.builder()
                        .skuId(e.getSkuId())
                        .quantity(-e.getCount())
                        .build()).collect(Collectors.toList()));
                log.info("Order {} returnSkusSellQuantities result: {}", param.getOrderId(), isSuccess);
            }
        } catch (Exception e) {
            log.error("OrderAutoCancelDelayTask execute error", e);
        }
    }

}