package cn.binux.cart.service.impl; import cn.binux.cart.service.CartService; import cn.binux.constant.Const; import cn.binux.mapper.TbItemMapper; import cn.binux.pojo.CartInfo; import cn.binux.pojo.TbItem; import cn.binux.pojo.TbItemExample; import cn.binux.pojo.XbinResult; import cn.binux.redis.service.JedisClient; import cn.binux.utils.FastJsonConvert; import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.annotation.Service; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; /** * 购物车操作实现 * * @author xubin. * @create 2017-02-22 下午12:51 */ @Service(version = Const.XBIN_STORE_CART_VERSION) @Transactional public class CartServiceImpl implements CartService { private static final Logger logger = LoggerFactory.getLogger(CartServiceImpl.class); @Value("${redisKey.prefix.cart_info_profix}") private String CART_INFO_PROFIX; @Value("${redisKey.prefix.redis_cart_expire_time}") private Integer REDIS_CART_EXPIRE_TIME; @Value("${redisKey.prefix.item_info_profix}") private String ITEM_INFO_PROFIX; @Value("${redisKey.prefix.item_info_base_suffix}") private String ITEM_INFO_BASE_SUFFIX; @Reference(version = Const.XBIN_STORE_REDIS_VERSION) private JedisClient jedisClient; @Autowired private TbItemMapper itemMapper; @Override public XbinResult addCart(Long pid, Integer pcount, String uuid) { String key = CART_INFO_PROFIX + uuid; String cartInfoString = null; try { cartInfoString = jedisClient.get(key); } catch (Exception e) { logger.error("Redis出错!", e); } TbItem item = null; try { String redisItem = jedisClient.get(ITEM_INFO_PROFIX + pid + ITEM_INFO_BASE_SUFFIX); if (StringUtils.isNotBlank(redisItem)) { item = FastJsonConvert.convertJSONToObject(redisItem, TbItem.class); } else { TbItemExample example = new TbItemExample(); TbItemExample.Criteria criteria = example.createCriteria(); criteria.andIdEqualTo(pid); List<TbItem> itemList = itemMapper.selectByExample(example); if (itemList != null && itemList.size() > 0) { item = itemList.get(0); } else { return XbinResult.build(500, "商品查询不到!"); } } } catch (Exception e) { logger.error("Redis出错!", e); } CartInfo cartInfo = new CartInfo(); cartInfo.setId(item.getId()); cartInfo.setName(item.getTitle()); String[] split = item.getImage().split(","); cartInfo.setImageUrl(split[0]); cartInfo.setColour("黑色"); cartInfo.setNum(pcount); cartInfo.setPrice(item.getPrice()); cartInfo.setSize("32GB"); if (StringUtils.isBlank(cartInfoString)) { ArrayList<CartInfo> cartInfos = new ArrayList<>(); cartInfos.add(cartInfo); logger.debug("第一次保存商品到Redis uuid:" + uuid); try { jedisClient.set(key, FastJsonConvert.convertObjectToJSON(cartInfos)); jedisClient.expire(key, REDIS_CART_EXPIRE_TIME); } catch (Exception e) { logger.error("Redis出错!", e); } return XbinResult.build(200, "ok", cartInfo); } else { List<CartInfo> list = FastJsonConvert.convertJSONToArray(cartInfoString, CartInfo.class); if (list != null && list.size() > 0) { boolean flag = true; for (int i = 0; i < list.size(); i++) { CartInfo Info = list.get(i); if (Info.getId().equals(item.getId())) { Info.setNum(Info.getNum() + pcount); list.remove(i); list.add(Info); flag = false; logger.debug("商品已经存在数量加" + pcount + "个 uuid:" + uuid); } } if (flag) { list.add(cartInfo); logger.debug("商品不存在数量为" + pcount + "个 uuid:" + uuid); } } logger.debug("商品添加完成 购物车" + list.size() + "件商品 uuid:" + uuid); try { jedisClient.set(key, FastJsonConvert.convertObjectToJSON(list)); jedisClient.expire(key, REDIS_CART_EXPIRE_TIME); } catch (Exception e) { logger.error("Redis出错!", e); } return XbinResult.build(200, "ok", cartInfo); } } @Override public List<CartInfo> getCartInfoListByCookiesId(String cookieUUID) { String cartInfoString = jedisClient.get(CART_INFO_PROFIX + cookieUUID); if (StringUtils.isNotBlank(cartInfoString)) { List<CartInfo> cartInfos = FastJsonConvert.convertJSONToArray(cartInfoString, CartInfo.class); return cartInfos; } return null; } /** * * 根据商品id和数量对购物车增加商品或减少商品 * * @param pid 商品id * @param pcount 增加数量 * @param type 1 增加 2 减少 * @param index 商品位置 ps:用于直接定位商品 不用遍历整个购物车 * @return */ @Override public XbinResult decreOrIncre(Long pid, Integer pcount, Integer type, Integer index, String cookieUUID) { String key = CART_INFO_PROFIX + cookieUUID; List<CartInfo> cartInfoList = getCartInfoListByCookiesId(cookieUUID); if (cartInfoList == null || cartInfoList.size() == 0) { return XbinResult.build(400, "购物车没有此商品 请不要非法操作!"); } CartInfo cartInfo = cartInfoList.get(index); if (type == 1) { cartInfo.setNum(cartInfo.getNum() + pcount); } else { cartInfo.setNum(cartInfo.getNum() - pcount); } //cartInfoList.remove(index); //cartInfoList.add(index, cartInfo); jedisClient.set(key, FastJsonConvert.convertObjectToJSON(cartInfoList)); jedisClient.expire(key,REDIS_CART_EXPIRE_TIME); return XbinResult.ok(); } }