Redis 购物车 - 删除商品与更新购买数量
生活随笔
收集整理的這篇文章主要介紹了
Redis 购物车 - 删除商品与更新购买数量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
@ApiOperation(value = "從購物車中刪除商品", notes = "從購物車中刪除商品", httpMethod = "POST")
@PostMapping("/del")
public JSONResult del(@RequestParam String userId,@RequestParam String itemSpecId,HttpServletRequest request,HttpServletResponse response
) {if (StringUtils.isBlank(userId) || StringUtils.isBlank(itemSpecId)) {return JSONResult.errorMsg("參數不能為空");}// 用戶在頁面刪除購物車中的商品數據,如果此時用戶已經登錄,則需要同步刪除redis購物車中的商品String shopcartJson = redisOperator.get(FOODIE_SHOPCART + ":" + userId);if (StringUtils.isNotBlank(shopcartJson)) {// redis中已經有購物車了List<ShopcartBO> shopcartList = JsonUtils.jsonToList(shopcartJson, ShopcartBO.class);// 判斷購物車中是否存在已有商品,如果有的話則刪除for (ShopcartBO sc: shopcartList) {String tmpSpecId = sc.getSpecId();if (tmpSpecId.equals(itemSpecId)) {shopcartList.remove(sc);break;}}// 覆蓋現有redis中的購物車redisOperator.set(FOODIE_SHOPCART + ":" + userId, JsonUtils.objectToJson(shopcartList));}return JSONResult.ok();
}
@ApiOperation(value = "用戶下單", notes = "用戶下單", httpMethod = "POST")
@PostMapping("/create")
public JSONResult create(@RequestBody SubmitOrderBO submitOrderBO,HttpServletRequest request,HttpServletResponse response) {if (submitOrderBO.getPayMethod() != PayMethod.WEIXIN.type&& submitOrderBO.getPayMethod() != PayMethod.ALIPAY.type ) {return JSONResult.errorMsg("支付方式不支持!");}// System.out.println(submitOrderBO.toString());String shopcartJson = redisOperator.get(FOODIE_SHOPCART + ":" + submitOrderBO.getUserId());if (StringUtils.isBlank(shopcartJson)) {return JSONResult.errorMsg("購物數據不正確");}List<ShopcartBO> shopcartList = JsonUtils.jsonToList(shopcartJson, ShopcartBO.class);// 1. 創建訂單OrderVO orderVO = orderService.createOrder(shopcartList, submitOrderBO);String orderId = orderVO.getOrderId();// 2. 創建訂單以后,移除購物車中已結算(已提交)的商品/*** 1001* 2002 -> 用戶購買* 3003 -> 用戶購買* 4004*/// 清理覆蓋現有的redis匯總的購物數據shopcartList.removeAll(orderVO.getToBeRemovedShopcatdList());redisOperator.set(FOODIE_SHOPCART + ":" + submitOrderBO.getUserId(), JsonUtils.objectToJson(shopcartList));// 整合redis之后,完善購物車中的已結算商品清除,并且同步到前端的cookieCookieUtils.setCookie(request, response, FOODIE_SHOPCART, JsonUtils.objectToJson(shopcartList), true);// 3. 向支付中心發送當前訂單,用于保存支付中心的訂單數據MerchantOrdersVO merchantOrdersVO = orderVO.getMerchantOrdersVO();merchantOrdersVO.setReturnUrl(payReturnUrl);// 為了方便測試購買,所以所有的支付金額都統一改為1分錢merchantOrdersVO.setAmount(1);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.add("UserId","");headers.add("password","");HttpEntity<MerchantOrdersVO> entity =new HttpEntity<>(merchantOrdersVO, headers);ResponseEntity<JSONResult> responseEntity =restTemplate.postForEntity(paymentUrl,entity,JSONResult.class);JSONResult paymentResult = responseEntity.getBody();if (paymentResult.getStatus() != 200) {logger.error("發送錯誤:{}", paymentResult.getMsg());return JSONResult.errorMsg("支付中心訂單創建失敗,請聯系管理員!");}return JSONResult.ok(orderId);
}
/*** 用于創建訂單相關信息* @param submitOrderBO*/
public OrderVO createOrder(List<ShopcartBO> shopcartList, SubmitOrderBO submitOrderBO);
@Transactional(propagation = Propagation.REQUIRED)
@Override
public OrderVO createOrder(List<ShopcartBO> shopcartList, SubmitOrderBO submitOrderBO) {String userId = submitOrderBO.getUserId();String addressId = submitOrderBO.getAddressId();String itemSpecIds = submitOrderBO.getItemSpecIds();Integer payMethod = submitOrderBO.getPayMethod();String leftMsg = submitOrderBO.getLeftMsg();// 包郵費用設置為0Integer postAmount = 0;String orderId = sid.nextShort();UserAddress address = addressService.queryUserAddres(userId, addressId);// 1. 新訂單數據保存Orders newOrder = new Orders();newOrder.setId(orderId);newOrder.setUserId(userId);newOrder.setReceiverName(address.getReceiver());newOrder.setReceiverMobile(address.getMobile());newOrder.setReceiverAddress(address.getProvince() + " "+ address.getCity() + " "+ address.getDistrict() + " "+ address.getDetail());// newOrder.setTotalAmount();
// newOrder.setRealPayAmount();newOrder.setPostAmount(postAmount);newOrder.setPayMethod(payMethod);newOrder.setLeftMsg(leftMsg);newOrder.setIsComment(YesOrNo.NO.type);newOrder.setIsDelete(YesOrNo.NO.type);newOrder.setCreatedTime(new Date());newOrder.setUpdatedTime(new Date());// 2. 循環根據itemSpecIds保存訂單商品信息表String itemSpecIdArr[] = itemSpecIds.split(",");Integer totalAmount = 0; // 商品原價累計Integer realPayAmount = 0; // 優惠后的實際支付價格累計List<ShopcartBO> toBeRemovedShopcatdList = new ArrayList<>();for (String itemSpecId : itemSpecIdArr) {ShopcartBO cartItem = getBuyCountsFromShopcart(shopcartList, itemSpecId);// 整合redis后,商品購買的數量重新從redis的購物車中獲取int buyCounts = cartItem.getBuyCounts();toBeRemovedShopcatdList.add(cartItem);// 2.1 根據規格id,查詢規格的具體信息,主要獲取價格ItemsSpec itemSpec = itemService.queryItemSpecById(itemSpecId);totalAmount += itemSpec.getPriceNormal() * buyCounts;realPayAmount += itemSpec.getPriceDiscount() * buyCounts;// 2.2 根據商品id,獲得商品信息以及商品圖片String itemId = itemSpec.getItemId();Items item = itemService.queryItemById(itemId);String imgUrl = itemService.queryItemMainImgById(itemId);// 2.3 循環保存子訂單數據到數據庫String subOrderId = sid.nextShort();OrderItems subOrderItem = new OrderItems();subOrderItem.setId(subOrderId);subOrderItem.setOrderId(orderId);subOrderItem.setItemId(itemId);subOrderItem.setItemName(item.getItemName());subOrderItem.setItemImg(imgUrl);subOrderItem.setBuyCounts(buyCounts);subOrderItem.setItemSpecId(itemSpecId);subOrderItem.setItemSpecName(itemSpec.getName());subOrderItem.setPrice(itemSpec.getPriceDiscount());orderItemsMapper.insert(subOrderItem);// 2.4 在用戶提交訂單以后,規格表中需要扣除庫存itemService.decreaseItemSpecStock(itemSpecId, buyCounts);}newOrder.setTotalAmount(totalAmount);newOrder.setRealPayAmount(realPayAmount);ordersMapper.insert(newOrder);// 3. 保存訂單狀態表OrderStatus waitPayOrderStatus = new OrderStatus();waitPayOrderStatus.setOrderId(orderId);waitPayOrderStatus.setOrderStatus(OrderStatusEnum.WAIT_PAY.type);waitPayOrderStatus.setCreatedTime(new Date());orderStatusMapper.insert(waitPayOrderStatus);// 4. 構建商戶訂單,用于傳給支付中心MerchantOrdersVO merchantOrdersVO = new MerchantOrdersVO();merchantOrdersVO.setMerchantOrderId(orderId);merchantOrdersVO.setMerchantUserId(userId);merchantOrdersVO.setAmount(realPayAmount + postAmount);merchantOrdersVO.setPayMethod(payMethod);// 5. 構建自定義訂單voOrderVO orderVO = new OrderVO();orderVO.setOrderId(orderId);orderVO.setMerchantOrdersVO(merchantOrdersVO);orderVO.setToBeRemovedShopcatdList(toBeRemovedShopcatdList);return orderVO;
}
/*** 從redis中的購物車里獲取商品,目的:counts* @param shopcartList* @param specId* @return*/
private ShopcartBO getBuyCountsFromShopcart(List<ShopcartBO> shopcartList, String specId) {for (ShopcartBO cart : shopcartList) {if (cart.getSpecId().equals(specId)) {return cart;}}return null;
}
?
總結
以上是生活随笔為你收集整理的Redis 购物车 - 删除商品与更新购买数量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Redis优化购物车 - 添加商品
- 下一篇: 实现Redis用户会话 - 1