예제 #1
0
  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);
  }
예제 #2
0
  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);
  }