@Override public void complete(Order order, Admin operator) { Assert.notNull(order); Member member = order.getMember(); memberDao.lock(member, LockModeType.PESSIMISTIC_WRITE); if (order.getShippingStatus() == ShippingStatus.partialShipment || order.getShippingStatus() == ShippingStatus.shipped) { member.setPoint(member.getPoint() + order.getPoint()); for (Coupon coupon : order.getCoupons()) { couponCodeDao.build(coupon, member); } } if (order.getShippingStatus() == ShippingStatus.unshipped || order.getShippingStatus() == ShippingStatus.returned) { CouponCode couponCode = order.getCouponCode(); if (couponCode != null) { couponCode.setIsUsed(false); couponCode.setUsedDate(null); couponCodeDao.merge(couponCode); order.setCouponCode(null); orderDao.merge(order); } } member.setAmount(member.getAmount().add(order.getAmountPaid())); if (!member.getMemberRank().getIsSpecial()) { MemberRank memberRank = memberRankDao.findByAmount(member.getAmount()); if (memberRank != null && memberRank.getAmount().compareTo(member.getMemberRank().getAmount()) > 0) { member.setMemberRank(memberRank); } } memberDao.merge(member); if (order.getIsAllocatedStock()) { 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(false); } for (OrderItem orderItem : order.getOrderItems()) { if (orderItem != null) { Product product = orderItem.getProduct(); productDao.lock(product, LockModeType.PESSIMISTIC_WRITE); if (product != null) { Integer quantity = orderItem.getQuantity(); Calendar nowCalendar = Calendar.getInstance(); Calendar weekSalesCalendar = DateUtils.toCalendar(product.getWeekSalesDate()); Calendar monthSalesCalendar = DateUtils.toCalendar(product.getMonthSalesDate()); if (nowCalendar.get(Calendar.YEAR) != weekSalesCalendar.get(Calendar.YEAR) || nowCalendar.get(Calendar.WEEK_OF_YEAR) > weekSalesCalendar.get(Calendar.WEEK_OF_YEAR)) { product.setWeekSales((long) quantity); } else { product.setWeekSales(product.getWeekSales() + quantity); } if (nowCalendar.get(Calendar.YEAR) != monthSalesCalendar.get(Calendar.YEAR) || nowCalendar.get(Calendar.MONTH) > monthSalesCalendar.get(Calendar.MONTH)) { product.setMonthSales((long) quantity); } else { product.setMonthSales(product.getMonthSales() + quantity); } product.setSales(product.getSales() + quantity); product.setWeekSalesDate(new Date()); product.setMonthSalesDate(new Date()); productDao.merge(product); orderDao.flush(); staticService.build(product); } } } order.setOrderStatus(OrderStatus.completed); order.setExpire(null); orderDao.merge(order); OrderLog orderLog = new OrderLog(); orderLog.setType(Type.complete); orderLog.setOperator(operator != null ? operator.getUsername() : null); orderLog.setOrder(order); orderLogDao.persist(orderLog); }