@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 购物车 - 删除商品与更新购买数量相关推荐

  1. php商品在最少购买,ECSHOP给商品设置最少购买数量的方法

    ecshop后台默认没有给商品设置最小起订量或者最少购买量的功能.保哥在使用ecshop做一个商城时,要给商品设置包邮来吸引买家,但又不想买家购买一件产品也给包邮,这样很容易亏本.对于价值较高的商品有 ...

  2. Java 实现循环输入商品编号和购买数量,当输入n时结账,结账时计算应付金额并且找零

    问题描述 循环输入商品编号和购买数量,当输入n时结账,结账时计算应付金额并且找零. 目录 问题描述 (一)定义初始变量 (二)问题分析 (1)循环语句的选择 1. for语句 2. while语句 3 ...

  3. c#实现循环输入商品编号和购买数量,结账时应付金额并找零

    循环输入商品编号和购买数量,系统自动计算每种商品的价钱(单价X数量),并累加总金额. 当输入n时结账(假设享受8折优惠)结账时,根据折扣计算应付金额,输入实付金额,并找零 下面展示一些 内联代码片. ...

  4. Vue3简易购物车--添加和删除商品,计算购买商品总价

    简易购物车 文章目录 简易购物车 v-model双向数据绑定 && 表单提交 计算属性computed v-for渲染数据和标签 添加和删除功能 效果图: v-model双向数据绑定 ...

  5. ECSHOP 如何删除商品列表页 购买弹出 商品属性框后面的价格

    场景如图: 商品列表页 购买弹出 商品属性框是由js文件控制的. 打开JS文件js/common.js 问题一.弹出后属性多时,看不到[购买][取消]按钮 搜索代码: newDiv.style.hei ...

  6. 购物车案例模块(全选,增减商品数量,修改商品小计,计算总计和面额,删除商品,选中商品添加背景)

    一. 全选按钮分析: 里面3个小的复选框按钮(j-checkbox)选中状态(checked)跟着全选按钮(checkall)走. 因为checked是复选框的固有属性,此时我们需要利用prop()方 ...

  7. ECSHOP产品详情页修改商品购买数量并实时更新商品总价的实现与优化

    当用户购买产品时,可能有时候不仅仅买一件商品,那么当客户购买多个当前产品时如果能同时显示总价,那么无疑将增加我们网站的亲和度!实现这个办法并不难,就是增加一个即时计算商品总价的js代码,这个网络有一篇 ...

  8. 基于Redis优化购物车 - 添加商品

    @ApiOperation(value = "添加商品到购物车", notes = "添加商品到购物车", httpMethod = "POST&qu ...

  9. Android 中编写一个简易购物车,商品包括商品名称,单价,数量,可以对商品进行增删改查功能。(ArrayList,SQLite)

    Android 中编写一个简易购物车,商品包括商品名称,单价,数量,可以对商品进行增删改查功能.(ArrayList,SQLite) 布局(activity_main.xml): <?xml v ...

最新文章

  1. 计算机金融交叉学科考研,22考研:交叉学科可能成为新选择!它有哪些优势?
  2. [学习笔记]stm32
  3. 【CF#801 A.】 Vicious Keyboard(字符串查找,水题)
  4. php 一键登录插件,FastAdmin一键管理插件
  5. 机器学习速成课程 | 练习 | Google Development——编程练习:验证
  6. centos7 dns配置_Linux Sever简单笔记(第十三堂课)之linux下的网络管理及DHCP配置的相关操作 - 我杨晓东太难了...
  7. Cannot set property 'onclick' of null报错
  8. linux中,使用cat、head、tail命令显示文件指定行
  9. python腾训面试_Google资深工程师推荐Python面试必须要看的15个问题
  10. 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校排名
  11. winfrom DotNetBar sideNav控件使用问题
  12. CentOS7下fdisk分区工具和LVM的简单使用
  13. 一例信息窃取木马分析报告
  14. java设计模式之组合设计模式
  15. 路由入口与vue布局入口
  16. 为什么只有涨价才能救小米?
  17. RGMII_PHY测试笔记1 基于开发板MiS603-X25
  18. 【软件测试技术期末复习选择题】
  19. 【问题解决】Springboot中@Value()读取不到配置文件属性解决方法
  20. UE_Visibility Buffer Deferred Material

热门文章

  1. NOVO Nordisk IT SOP List
  2. Android源代码解析之(四)--gt;HandlerThread
  3. 如何实现文字在图片中间的效果
  4. Everything(速度快的文件搜索软件) 1.4.1.801b 汉化绿色版
  5. CYQ.Data V5 MDataTable 专属篇介绍
  6. Spring与Quartz的整合实现定时任务调度
  7. 省常中模拟 Test3 Day2
  8. poj 3517
  9. [Erlang-0003][OTP] Efficiency Guide User's Guide - Common Caveats
  10. 实现Java集合迭代的高性能