package com.hongqiang.shop.modules.account.service;
import java.util.Date;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.hongqiang.shop.common.service.BaseService;
import com.hongqiang.shop.common.utils.CookieUtils;
import com.hongqiang.shop.common.utils.Principal;
import com.hongqiang.shop.modules.account.dao.CartDao;
import com.hongqiang.shop.modules.account.dao.CartItemDao;
import com.hongqiang.shop.modules.entity.Cart;
import com.hongqiang.shop.modules.entity.CartItem;
import com.hongqiang.shop.modules.entity.Member;
import com.hongqiang.shop.modules.entity.Product;
import com.hongqiang.shop.modules.user.dao.MemberDao;
@Service
public class CartServiceImpl extends BaseService implements CartService {
@Autowired
private CartDao cartDao;
@Autowired
private CartItemDao cartItemDao;
@Autowired
private MemberDao memberDao;
public Cart getCurrent() {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
Principal principal = (Principal) httpServletRequest.getSession().getAttribute(Member.PRINCIPAL_ATTRIBUTE_NAME);
Member member = principal != null ? (Member) this.memberDao.find(principal.getId()) : null;
if (member != null) {
Cart cart = member.getCart();
if (cart != null) {
if (!cart.hasExpired()) {
if (!DateUtils.isSameDay(cart.getUpdateDate(),new Date())) {
cart.setUpdateDate(new Date());
this.cartDao.merge(cart);
}
return cart;
}
this.cartDao.remove(cart);
}
} else {
String cartIdString = CookieUtils.getCookie(httpServletRequest,"cartId");
String cartKeyString = CookieUtils.getCookie(httpServletRequest,"cartKey");
if ((StringUtils.isNotEmpty(cartIdString))
&& (StringUtils.isNumeric(cartIdString))
&& (StringUtils.isNotEmpty(cartKeyString))) {
Cart cart = (Cart) this.cartDao.find(Long.valueOf(cartIdString));
if ((cart != null) && (cart.getMember() == null)
&& (StringUtils.equals(cart.getKey(), cartKeyString))) {
if (!cart.hasExpired()) {
if (!DateUtils.isSameDay(cart.getUpdateDate(),new Date())) {
cart.setUpdateDate(new Date());
this.cartDao.merge(cart);
}
return cart;
}
this.cartDao.remove(cart);
}
}
}
}
return null;
}
public void merge(Member member, Cart cart) {
if ((member != null) && (cart != null) && (cart.getMember() == null)) {
Cart localCart = member.getCart();
if (localCart != null) {
Iterator<CartItem> iterator = cart.getCartItems().iterator();
while (iterator.hasNext()) {
CartItem cartItem = (CartItem) iterator.next();
Product product = cartItem.getProduct();
if (localCart.contains(product)) {
if ((Cart.MAX_PRODUCT_COUNT != null)
&& (localCart.getCartItems().size() > Cart.MAX_PRODUCT_COUNT.intValue()))
continue;
CartItem localCartItem = localCart.getCartItem(product);
localCartItem.add(cartItem.getQuantity().intValue());
this.cartItemDao.merge(localCartItem);
} else {
if ((Cart.MAX_PRODUCT_COUNT != null)
&& (localCart.getCartItems().size() >= Cart.MAX_PRODUCT_COUNT.intValue()))
continue;
iterator.remove();
cartItem.setCart(localCart);
localCart.getCartItems().add(cartItem);
this.cartItemDao.merge(cartItem);
}
}
this.cartDao.remove(cart);
} else {
member.setCart(cart);
cart.setMember(member);
this.cartDao.merge(cart);
}
}
}
public void evictExpired() {
this.cartDao.evictExpired();
}
@Transactional
public void save(Cart cart) {
this.cartDao.persist(cart);
}
@Transactional
public Cart update(Cart cart) {
return (Cart) this.cartDao.merge(cart);
}
@Transactional
public Cart update(Cart cart, String[] ignoreProperties) {
return (Cart) this.cartDao.update(cart, ignoreProperties);
}
@Transactional
public void delete(Long id) {
this.cartDao.delete(id);
}
@Transactional
public void delete(Long[] ids) {
if (ids != null)
for (Long id : ids)
this.cartDao.delete(id);
}
@Transactional
public void delete(Cart cart) {
this.cartDao.delete(cart);
}
}