用户下单
需求分析:
移动端用户将菜品或者套餐加入购物车后,可以点击购物车中的【去结算】按钮,页面跳转到订单确认页面,点击【去支付】按钮则完成下单操作
数据模型:
orders:订单表
order_detail:订单明细表
梳理交互过程:
1、在购物车中点击【去结算】按钮,页面跳到订单确认页面
2、在订单确认页面,发送ajax请求,请求服务端或者当前登录用户的默认地址
3、在订单确认页面,发送ajax请求,请求服务端获取当前登录用户的购物车数据
4、在订单确认页面点击【去支付】按钮,发送ajax请求,请求服务端完成下单操作
package com.itheima.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.itheima.common.BaseContext; import com.itheima.common.CustomException; import com.itheima.entity.*; import com.itheima.mapper.OrderMapper; import com.itheima.service.*; import net.sf.jsqlparser.expression.DateTimeLiteralExpression; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @Service public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService { @Autowired private ShoppingCartService shoppingCartService; @Autowired private UserService userService; @Autowired private AddressBookService addressBookService; @Autowired private OrderDetailService orderDetailService; /** * 用户下单 * @param orders */ @Transactional @Override public void submit(Orders orders) { //获取当前用户id long userId = BaseContext.getCurrentId(); //查询当前用户购物车数据 LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ShoppingCart::getUserId, userId); List<ShoppingCart> shoppingCarts = shoppingCartService.list(queryWrapper); if(shoppingCarts==null || shoppingCarts.size()==0){ throw new CustomException("购物车为空,不能下单"); } //查询用户数据 User user = userService.getById(userId); //查询地址数据 AddressBook addressBook = addressBookService.getById(orders.getAddressBookId()); if(addressBook==null){ throw new CustomException("用户地址信息有误,不能下单"); } //订单号 long orderId = IdWorker.getId(); AtomicInteger amount = new AtomicInteger(0); List<OrderDetail> orderDetails = shoppingCarts.stream().map((item) -> { OrderDetail orderDetail = new OrderDetail(); BeanUtils.copyProperties(item, orderDetail); orderDetail.setOrderId(orderId); amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue()); return orderDetail; }).collect(Collectors.toList()); //向订单表插入数据,一条数据 orders.setId(orderId); orders.setOrderTime(LocalDateTime.now()); orders.setCheckoutTime(LocalDateTime.now()); orders.setStatus(2); orders.setAmount(new BigDecimal(amount.get())); //总金额 orders.setUserId(userId); orders.setNumber(String.valueOf(orderId)); orders.setUserName(user.getName()); orders.setConsignee(addressBook.getConsignee()); orders.setPhone(addressBook.getPhone()); orders.setAddress((addressBook.getProvinceName() == null?"":addressBook.getProvinceName()) + (addressBook.getCityName() == null?"":addressBook.getCityName()) + (addressBook.getDistrictName() == null?"":addressBook.getDistrictName()) + (addressBook.getDetail() == null?"":addressBook.getDetail())); this.save(orders); //向订单明细表插入数据,多条数据 orderDetailService.saveBatch(orderDetails); //清空购物车数据 shoppingCartService.remove(queryWrapper); } }
/** * 用户下单 * @param orders * @return */ @PostMapping("/submit") public R<String> submit(@RequestBody Orders orders){ log.info("订单数据:{}", orders); orderService.submit(orders); return R.success("下单成功"); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构