@Override public void returns(Order order, Returns returns, Admin operator) { Assert.notNull(order); Assert.notNull(returns); Assert.notEmpty(returns.getReturnsItems()); orderDao.lock(order, LockModeType.PESSIMISTIC_WRITE); returns.setOrder(order); returnsDao.persist(returns); for (ReturnsItem returnsItem : returns.getReturnsItems()) { OrderItem orderItem = order.getOrderItem(returnsItem.getSn()); if (orderItem != null) { orderItemDao.lock(orderItem, LockModeType.PESSIMISTIC_WRITE); orderItem.setReturnQuantity(orderItem.getReturnQuantity() + returnsItem.getQuantity()); } } if (order.getReturnQuantity() >= order.getShippedQuantity()) { order.setShippingStatus(ShippingStatus.returned); } else if (order.getReturnQuantity() > 0) { order.setShippingStatus(ShippingStatus.partialReturns); } order.setExpire(null); orderDao.merge(order); OrderLog orderLog = new OrderLog(); orderLog.setType(Type.returns); orderLog.setOperator(operator != null ? operator.getUsername() : null); orderLog.setOrder(order); orderLogDao.persist(orderLog); }
@Override public void shipping(Order order, Shipping shipping, Admin operator) { Assert.notNull(order); Assert.notNull(shipping); Assert.notEmpty(shipping.getShippingItems()); orderDao.lock(order, LockModeType.PESSIMISTIC_WRITE); Setting setting = SettingUtils.get(); if (!order.getIsAllocatedStock() && setting.getStockAllocationTime() == StockAllocationTime.ship) { for (OrderItem orderItem : order.getOrderItems()) { if (orderItem != null) { Product product = orderItem.getProduct(); productDao.lock(product, LockModeType.PESSIMISTIC_WRITE); if (product != null && product.getStock() != null) { product.setAllocatedStock( product.getAllocatedStock() + (orderItem.getQuantity() - orderItem.getShippedQuantity())); productDao.merge(product); orderDao.flush(); staticService.build(product); } } } order.setIsAllocatedStock(true); } shipping.setOrder(order); shippingDao.persist(shipping); for (ShippingItem shippingItem : shipping.getShippingItems()) { OrderItem orderItem = order.getOrderItem(shippingItem.getSn()); if (orderItem != null) { Product product = orderItem.getProduct(); productDao.lock(product, LockModeType.PESSIMISTIC_WRITE); if (product != null) { if (product.getStock() != null) { product.setStock(product.getStock() - shippingItem.getQuantity()); if (order.getIsAllocatedStock()) { product.setAllocatedStock(product.getAllocatedStock() - shippingItem.getQuantity()); } } productDao.merge(product); orderDao.flush(); staticService.build(product); } orderItemDao.lock(orderItem, LockModeType.PESSIMISTIC_WRITE); orderItem.setShippedQuantity(orderItem.getShippedQuantity() + shippingItem.getQuantity()); } } if (order.getShippedQuantity() >= order.getQuantity()) { order.setShippingStatus(ShippingStatus.shipped); order.setIsAllocatedStock(false); } else if (order.getShippedQuantity() > 0) { order.setShippingStatus(ShippingStatus.partialShipment); } order.setExpire(null); orderDao.merge(order); OrderLog orderLog = new OrderLog(); orderLog.setType(Type.shipping); orderLog.setOperator(operator != null ? operator.getUsername() : null); orderLog.setOrder(order); orderLogDao.persist(orderLog); }