Search in sources :

Example 1 with StockDeduction

use of com.actionworks.flashsale.domain.model.StockDeduction in project flash-sale by ThoughtsBeta.

the class DefaultFlashOrderAppService method cancelOrder.

@Override
@Transactional
public AppResult cancelOrder(Long userId, Long orderId) {
    logger.info("cancelOrder|取消订单|{},{}", userId, orderId);
    if (userId == null || orderId == null) {
        throw new BizException(INVALID_PARAMS);
    }
    FlashOrder flashOrder = flashOrderDomainService.getOrder(userId, orderId);
    if (flashOrder == null) {
        throw new BizException(ORDER_NOT_FOUND);
    }
    boolean cancelSuccess = flashOrderDomainService.cancelOrder(userId, orderId);
    if (!cancelSuccess) {
        logger.info("cancelOrder|订单取消失败|{}", orderId);
        return AppResult.buildFailure(ORDER_CANCEL_FAILED);
    }
    StockDeduction stockDeduction = new StockDeduction().setItemId(flashOrder.getItemId()).setQuantity(flashOrder.getQuantity());
    boolean stockRecoverSuccess = stockDeductionDomainService.increaseItemStock(stockDeduction);
    if (!stockRecoverSuccess) {
        logger.info("cancelOrder|库存恢复失败|{}", orderId);
        throw new BizException(ORDER_CANCEL_FAILED);
    }
    boolean stockInRedisRecoverSuccess = itemStockCacheService.increaseItemStock(stockDeduction);
    if (!stockInRedisRecoverSuccess) {
        logger.info("cancelOrder|Redis库存恢复失败|{}", orderId);
        throw new BizException(ORDER_CANCEL_FAILED);
    }
    logger.info("cancelOrder|订单取消成功|{}", orderId);
    return AppResult.buildSuccess();
}
Also used : FlashOrder(com.actionworks.flashsale.domain.model.entity.FlashOrder) BizException(com.actionworks.flashsale.app.exception.BizException) StockDeduction(com.actionworks.flashsale.domain.model.StockDeduction) Transactional(org.springframework.transaction.annotation.Transactional)

Example 2 with StockDeduction

use of com.actionworks.flashsale.domain.model.StockDeduction in project flash-sale by ThoughtsBeta.

the class NormalPlaceOrderService method doPlaceOrder.

@Override
public PlaceOrderResult doPlaceOrder(Long userId, FlashPlaceOrderCommand placeOrderCommand) {
    logger.info("placeOrder|开始下单|{},{}", userId, JSON.toJSONString(placeOrderCommand));
    if (userId == null || placeOrderCommand == null || !placeOrderCommand.validateParams()) {
        throw new BizException(INVALID_PARAMS);
    }
    boolean isActivityAllowPlaceOrder = flashActivityAppService.isAllowPlaceOrderOrNot(placeOrderCommand.getActivityId());
    if (!isActivityAllowPlaceOrder) {
        logger.info("placeOrder|秒杀活动下单规则校验未通过|{},{}", userId, placeOrderCommand.getActivityId());
        return PlaceOrderResult.failed(PLACE_ORDER_FAILED);
    }
    boolean isItemAllowPlaceOrder = flashItemAppService.isAllowPlaceOrderOrNot(placeOrderCommand.getItemId());
    if (!isItemAllowPlaceOrder) {
        logger.info("placeOrder|秒杀品下单规则校验未通过|{},{}", userId, placeOrderCommand.getActivityId());
        return PlaceOrderResult.failed(PLACE_ORDER_FAILED);
    }
    AppSimpleResult<FlashItemDTO> flashItemResult = flashItemAppService.getFlashItem(placeOrderCommand.getItemId());
    if (!flashItemResult.isSuccess() || flashItemResult.getData() == null) {
        return PlaceOrderResult.failed(ITEM_NOT_FOUND);
    }
    FlashItemDTO flashItem = flashItemResult.getData();
    Long orderId = orderNoGenerateService.generateOrderNo(new OrderNoGenerateContext());
    FlashOrder flashOrderToPlace = toDomain(placeOrderCommand);
    flashOrderToPlace.setItemTitle(flashItem.getItemTitle());
    flashOrderToPlace.setFlashPrice(flashItem.getFlashPrice());
    flashOrderToPlace.setUserId(userId);
    flashOrderToPlace.setId(orderId);
    StockDeduction stockDeduction = new StockDeduction().setItemId(placeOrderCommand.getItemId()).setQuantity(placeOrderCommand.getQuantity()).setUserId(userId);
    boolean preDecreaseStockSuccess = false;
    try {
        preDecreaseStockSuccess = itemStockCacheService.decreaseItemStock(stockDeduction);
        if (!preDecreaseStockSuccess) {
            logger.info("placeOrder|库存预扣减失败|{},{}", userId, JSON.toJSONString(placeOrderCommand));
            return PlaceOrderResult.failed(PLACE_ORDER_FAILED.getErrCode(), PLACE_ORDER_FAILED.getErrDesc());
        }
        boolean decreaseStockSuccess = stockDeductionDomainService.decreaseItemStock(stockDeduction);
        if (!decreaseStockSuccess) {
            logger.info("placeOrder|库存扣减失败|{},{}", userId, JSON.toJSONString(placeOrderCommand));
            return PlaceOrderResult.failed(PLACE_ORDER_FAILED.getErrCode(), PLACE_ORDER_FAILED.getErrDesc());
        }
        boolean placeOrderSuccess = flashOrderDomainService.placeOrder(userId, flashOrderToPlace);
        if (!placeOrderSuccess) {
            throw new BizException(PLACE_ORDER_FAILED.getErrDesc());
        }
    } catch (Exception e) {
        if (preDecreaseStockSuccess) {
            boolean recoverStockSuccess = itemStockCacheService.increaseItemStock(stockDeduction);
            if (!recoverStockSuccess) {
                logger.error("placeOrder|预扣库存恢复失败|{},{}", userId, JSON.toJSONString(placeOrderCommand), e);
            }
        }
        logger.error("placeOrder|下单失败|{},{}", userId, JSON.toJSONString(placeOrderCommand), e);
        throw new BizException(PLACE_ORDER_FAILED.getErrDesc());
    }
    logger.info("placeOrder|下单成功|{},{}", userId, orderId);
    return PlaceOrderResult.ok(orderId);
}
Also used : FlashOrder(com.actionworks.flashsale.domain.model.entity.FlashOrder) BizException(com.actionworks.flashsale.app.exception.BizException) OrderNoGenerateContext(com.actionworks.flashsale.app.util.OrderNoGenerateContext) FlashItemDTO(com.actionworks.flashsale.app.model.dto.FlashItemDTO) StockDeduction(com.actionworks.flashsale.domain.model.StockDeduction) BizException(com.actionworks.flashsale.app.exception.BizException)

Example 3 with StockDeduction

use of com.actionworks.flashsale.domain.model.StockDeduction in project flash-sale by ThoughtsBeta.

the class QueuedPlaceOrderService method handlePlaceOrderTask.

@Transactional
public void handlePlaceOrderTask(PlaceOrderTask placeOrderTask) {
    try {
        Long userId = placeOrderTask.getUserId();
        boolean isActivityAllowPlaceOrder = flashActivityAppService.isAllowPlaceOrderOrNot(placeOrderTask.getActivityId());
        if (!isActivityAllowPlaceOrder) {
            logger.info("handleOrderTask|秒杀活动下单规则校验未通过|{},{}", placeOrderTask.getPlaceOrderTaskId(), placeOrderTask.getActivityId());
            placeOrderTaskService.updateTaskHandleResult(placeOrderTask.getPlaceOrderTaskId(), false);
            return;
        }
        boolean isItemAllowPlaceOrder = flashItemAppService.isAllowPlaceOrderOrNot(placeOrderTask.getItemId());
        if (!isItemAllowPlaceOrder) {
            logger.info("handleOrderTask|秒杀品下单规则校验未通过|{},{}", placeOrderTask.getPlaceOrderTaskId(), placeOrderTask.getActivityId());
            placeOrderTaskService.updateTaskHandleResult(placeOrderTask.getPlaceOrderTaskId(), false);
            return;
        }
        FlashItem flashItem = flashItemDomainService.getFlashItem(placeOrderTask.getItemId());
        Long orderId = orderNoGenerateService.generateOrderNo(new OrderNoGenerateContext());
        FlashOrder flashOrderToPlace = toDomain(placeOrderTask);
        flashOrderToPlace.setItemTitle(flashItem.getItemTitle());
        flashOrderToPlace.setFlashPrice(flashItem.getFlashPrice());
        flashOrderToPlace.setUserId(userId);
        flashOrderToPlace.setId(orderId);
        StockDeduction stockDeduction = new StockDeduction().setItemId(placeOrderTask.getItemId()).setQuantity(placeOrderTask.getQuantity());
        boolean decreaseStockSuccess = stockDeductionDomainService.decreaseItemStock(stockDeduction);
        if (!decreaseStockSuccess) {
            logger.info("handleOrderTask|库存扣减失败|{},{}", placeOrderTask.getPlaceOrderTaskId(), JSON.toJSONString(placeOrderTask));
            return;
        }
        boolean placeOrderSuccess = flashOrderDomainService.placeOrder(userId, flashOrderToPlace);
        if (!placeOrderSuccess) {
            throw new BizException(PLACE_ORDER_FAILED.getErrDesc());
        }
        placeOrderTaskService.updateTaskHandleResult(placeOrderTask.getPlaceOrderTaskId(), true);
        redisCacheService.put(PLACE_ORDER_TASK_ORDER_ID_KEY + placeOrderTask.getPlaceOrderTaskId(), orderId, HOURS_24);
        logger.info("handleOrderTask|下单任务处理完成|{},{}", placeOrderTask.getPlaceOrderTaskId(), JSON.toJSONString(placeOrderTask));
    } catch (Exception e) {
        placeOrderTaskService.updateTaskHandleResult(placeOrderTask.getPlaceOrderTaskId(), false);
        logger.error("handleOrderTask|下单任务处理错误|{},{}", placeOrderTask.getPlaceOrderTaskId(), JSON.toJSONString(placeOrderTask), e);
        throw new BizException(e.getMessage());
    }
}
Also used : FlashOrder(com.actionworks.flashsale.domain.model.entity.FlashOrder) OrderNoGenerateContext(com.actionworks.flashsale.app.util.OrderNoGenerateContext) BizException(com.actionworks.flashsale.app.exception.BizException) FlashItem(com.actionworks.flashsale.domain.model.entity.FlashItem) StockDeduction(com.actionworks.flashsale.domain.model.StockDeduction) BizException(com.actionworks.flashsale.app.exception.BizException) Transactional(org.springframework.transaction.annotation.Transactional)

Aggregations

BizException (com.actionworks.flashsale.app.exception.BizException)3 StockDeduction (com.actionworks.flashsale.domain.model.StockDeduction)3 FlashOrder (com.actionworks.flashsale.domain.model.entity.FlashOrder)3 OrderNoGenerateContext (com.actionworks.flashsale.app.util.OrderNoGenerateContext)2 Transactional (org.springframework.transaction.annotation.Transactional)2 FlashItemDTO (com.actionworks.flashsale.app.model.dto.FlashItemDTO)1 FlashItem (com.actionworks.flashsale.domain.model.entity.FlashItem)1