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();
}
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);
}
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());
}
}
Aggregations