/* * Copyright 2008-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ssbusy.controller.app; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.broadleafcommerce.common.media.domain.Media; import org.broadleafcommerce.core.catalog.domain.Product; import org.broadleafcommerce.core.catalog.domain.Sku; import org.broadleafcommerce.core.offer.domain.OrderAdjustment; import org.broadleafcommerce.core.order.domain.NullOrderImpl; import org.broadleafcommerce.core.order.domain.Order; import org.broadleafcommerce.core.order.domain.OrderItem; import org.broadleafcommerce.core.order.domain.SkuAccessor; import org.broadleafcommerce.core.order.service.OrderService; import org.broadleafcommerce.core.order.service.exception.AddToCartException; import org.broadleafcommerce.core.pricing.service.exception.PricingException; import org.broadleafcommerce.core.web.order.CartState; import org.broadleafcommerce.core.web.order.model.AddToCartItemEx; import org.broadleafcommerce.profile.web.core.CustomerState; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.ssbusy.controller.cart.CartController; import com.ssbusy.core.offer.domain.MyOfferCode; import com.ssbusy.core.offer.service.MyOfferService; /** * mobile app request controller. all with jsonp support. * * @author Ju */ @Controller public class AppCartController { private static final Log LOG = LogFactory.getLog(CartController.class); @Resource(name = "ssbCartController") private CartController ssbCartController; @Resource(name = "blOfferService") protected MyOfferService offerService; @Resource(name = "blOrderService") protected OrderService orderService; @RequestMapping("/app/cart") @ResponseBody public Map<String, Object> readCart(@RequestParam("detail") boolean detail) { Order cart = CartState.getCart(); return wrapCart(cart, detail); } @RequestMapping("/app/cart/add") @ResponseBody public Map<String, Object> add2Cart(HttpServletRequest request, HttpServletResponse response, Model model, @ModelAttribute("addToCartItem") AddToCartItemEx addToCartItem) throws IOException, PricingException, AddToCartException { addToCartItem.validateLocationId(); // FIXME exception handle return ssbCartController.addJson(request, response, model, addToCartItem); } private Map<String, Object> wrapCart(Order cart, boolean detail) { if (cart == null || cart instanceof NullOrderImpl) { return Collections.emptyMap(); } Map<String, Object> ret = new HashMap<String, Object>(); ret.put("cartItemCount", cart.getItemCount()); if (detail) { ret.put("currencyCode", cart.getCurrency() == null ? null : cart .getCurrency().getCurrencyCode()); ret.put("total", cart.getTotal()); List<OrderAdjustment> oadjusts = cart.getOrderAdjustments(); if (oadjusts != null && oadjusts.size() > 0) { List<Map<String, Object>> adjusts = new ArrayList<Map<String, Object>>( oadjusts.size()); ret.put("adjusts", adjusts); for (OrderAdjustment oa : oadjusts) { Map<String, Object> adjust = new HashMap<String, Object>(1); adjusts.add(adjust); adjust.put("marketingMessage", oa.getOffer() .getMarketingMessage()); } } List<OrderItem> oitems = cart.getOrderItems(); if (oitems != null && oitems.size() > 0) { List<Map<String, Object>> items = new ArrayList<Map<String, Object>>( oitems.size()); ret.put("items", items); for (OrderItem oi : oitems) { Map<String, Object> item = new HashMap<String, Object>(7); items.add(item); item.put("id", oi.getId()); item.put("name", oi.getName()); item.put("price", oi.getPriceBeforeAdjustments(true)); item.put("quantity", oi.getQuantity()); if (oi instanceof SkuAccessor) { Product p = null; Sku sku = ((SkuAccessor) oi).getSku(); if (sku != null) p = sku.getProduct(); if (p != null) { item.put("pid", p.getId()); item.put("url", p.getUrl()); Map<String, Media> media = p.getMedia(); if (media != null) { item.put("media", media.get("primary")); } } } else { throw new UnsupportedOperationException( "unsupported orderItem type: " + oi.getClass().getName()); } } } List<MyOfferCode> myOfferCodes = offerService .listOfferCodeByOwner(CustomerState.getCustomer().getId()); if (myOfferCodes != null && myOfferCodes.size() > 0) { List<Map<String, Object>> offerCodes = new ArrayList<Map<String, Object>>( myOfferCodes.size()); ret.put("offercodes", offerCodes); for (MyOfferCode moc : myOfferCodes) { Map<String, Object> offerscodes = new HashMap<String, Object>( 2); offerCodes.add(offerscodes); offerscodes.put("offerCode", moc.getOfferCode()); offerscodes.put("marketingMessage", moc.getOffer() .getMarketingMessage()); } } } return ret; } @RequestMapping("/app/cart/updateQuantity") @ResponseBody public Map<String, Object> updateQuantityApp( @ModelAttribute("addToCartItem") AddToCartItemEx addToCartItem) { addToCartItem.validateLocationId(); Map<String, Object> ret = new HashMap<String, Object>(); Order cart = CartState.getCart(); try { cart = orderService.updateItemQuantity(cart.getId(), addToCartItem, true); cart = orderService.save(cart, false); CartState.setCart(cart); ret.put("cartItemCount", cart.getItemCount()); ret.put("subTotal", cart.getSubTotal()); } catch (Exception e) { LOG.error("error updating cart quantity, cartId=" + cart.getId() + ", itemId=" + addToCartItem.getOrderItemId(), e); ret.put("error", Boolean.TRUE); ret.put("errorMessage", "抱歉,更新购物车数量失败。。"); } return ret; } }