@Override public void merge(Member member, Cart cart) { if (member != null && cart != null && cart.getMember() == null) { Cart memberCart = member.getCart(); if (memberCart != null) { for (Iterator<CartItem> iterator = cart.getCartItems().iterator(); iterator.hasNext(); ) { CartItem cartItem = iterator.next(); Product product = cartItem.getProduct(); if (memberCart.contains(product)) { if (Cart.MAX_PRODUCT_COUNT != null && memberCart.getCartItems().size() > Cart.MAX_PRODUCT_COUNT) { continue; } CartItem item = memberCart.getCartItem(product); item.add(cartItem.getQuantity()); cartItemDao.merge(item); } else { if (Cart.MAX_PRODUCT_COUNT != null && memberCart.getCartItems().size() >= Cart.MAX_PRODUCT_COUNT) { continue; } iterator.remove(); cartItem.setCart(memberCart); memberCart.getCartItems().add(cartItem); cartItemDao.merge(cartItem); } } cartDao.remove(cart); } else { member.setCart(cart); cart.setMember(member); cartDao.merge(cart); } } }
@Override public Cart getCurrent() { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); if (requestAttributes != null) { HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); Principal principal = (Principal) request.getSession().getAttribute(Member.PRINCIPAL_ATTRIBUTE_NAME); Member member = principal != null ? memberDao.find(principal.getId()) : null; if (member != null) { Cart cart = member.getCart(); if (cart != null) { if (!cart.hasExpired()) { if (!DateUtils.isSameDay(cart.getModifyDate(), new Date())) { cart.setModifyDate(new Date()); cartDao.merge(cart); } return cart; } else { cartDao.remove(cart); } } } else { String id = WebUtils.getCookie(request, Cart.ID_COOKIE_NAME); String key = WebUtils.getCookie(request, Cart.KEY_COOKIE_NAME); if (StringUtils.isNotEmpty(id) && StringUtils.isNumeric(id) && StringUtils.isNotEmpty(key)) { Cart cart = cartDao.find(Long.valueOf(id)); if (cart != null && cart.getMember() == null && StringUtils.equals(cart.getKey(), key)) { if (!cart.hasExpired()) { if (!DateUtils.isSameDay(cart.getModifyDate(), new Date())) { cart.setModifyDate(new Date()); cartDao.merge(cart); } return cart; } else { cartDao.remove(cart); } } } } } return null; }
@Override public Order create( Cart cart, Receiver receiver, PaymentMethod paymentMethod, ShippingMethod shippingMethod, CouponCode couponCode, boolean isInvoice, String invoiceTitle, boolean useBalance, String memo, Admin operator) { Assert.notNull(cart); Assert.notNull(cart.getMember()); Assert.notEmpty(cart.getCartItems()); Assert.notNull(receiver); Assert.notNull(paymentMethod); Assert.notNull(shippingMethod); Order order = build( cart, receiver, paymentMethod, shippingMethod, couponCode, isInvoice, invoiceTitle, useBalance, memo); order.setSn(snDao.generate(Sn.Type.order)); if (paymentMethod.getMethod() == PaymentMethod.Method.online) { order.setLockExpire(DateUtils.addSeconds(new Date(), 20)); order.setOperator(operator); } if (order.getCouponCode() != null) { couponCode.setIsUsed(true); couponCode.setUsedDate(new Date()); couponCodeDao.merge(couponCode); } for (Promotion promotion : cart.getPromotions()) { for (Coupon coupon : promotion.getCoupons()) { order.getCoupons().add(coupon); } } Setting setting = SettingUtils.get(); if (setting.getStockAllocationTime() == StockAllocationTime.order || (setting.getStockAllocationTime() == StockAllocationTime.payment && (order.getPaymentStatus() == PaymentStatus.partialPayment || order.getPaymentStatus() == PaymentStatus.paid))) { order.setIsAllocatedStock(true); } else { order.setIsAllocatedStock(false); } orderDao.persist(order); OrderLog orderLog = new OrderLog(); orderLog.setType(Type.create); orderLog.setOperator(operator != null ? operator.getUsername() : null); orderLog.setOrder(order); orderLogDao.persist(orderLog); Member member = cart.getMember(); if (order.getAmountPaid().compareTo(new BigDecimal(0)) > 0) { memberDao.lock(member, LockModeType.PESSIMISTIC_WRITE); member.setBalance(member.getBalance().subtract(order.getAmountPaid())); memberDao.merge(member); Deposit deposit = new Deposit(); deposit.setType(operator != null ? Deposit.Type.adminPayment : Deposit.Type.memberPayment); deposit.setCredit(new BigDecimal(0)); deposit.setDebit(order.getAmountPaid()); deposit.setBalance(member.getBalance()); deposit.setOperator(operator != null ? operator.getUsername() : null); deposit.setMember(member); deposit.setOrder(order); depositDao.persist(deposit); } if (setting.getStockAllocationTime() == StockAllocationTime.order || (setting.getStockAllocationTime() == StockAllocationTime.payment && (order.getPaymentStatus() == PaymentStatus.partialPayment || order.getPaymentStatus() == PaymentStatus.paid))) { 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); } } } } cartDao.remove(cart); return order; }
@Override public void evictExpired() { cartDao.evictExpired(); }