购物车里面有两个商品,每次只能把其中一个商品添加到订单,另一个还需要再执行一次,怎么改
来源:8-4 创建订单-状态枚举与自测
杨清川
2021-08-28 14:35:36
相关代码:
package com.imooc.mall.controller;
import com.imooc.mall.common.ApIRestResponse;
import com.imooc.mall.model.request.CreateOrderRequest;
import com.imooc.mall.service.OrderService;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
/*
*订单
*/
@RestController
public class OrderController {
@Resource
OrderService orderService;
/**
* 创建订单
* @param createOrderRequest
* @return
*/
@ApiOperation("创建订单")
@PostMapping("/order/create")
public ApIRestResponse create(@Valid @RequestBody CreateOrderRequest createOrderRequest) {
String orderNo = orderService.create(createOrderRequest);
return ApIRestResponse.success(orderNo);
}
}
相关代码:
package com.imooc.mall.service;
import com.imooc.mall.model.request.CreateOrderRequest;
import com.imooc.mall.vo.CartVO;
import java.util.List;
/**
* 订单service
*/
public interface OrderService {
String create(CreateOrderRequest createOrderRequest);
}
相关代码:
package com.imooc.mall.service.impl;
import com.imooc.mall.common.Constant;
import com.imooc.mall.exception.MoocExceptionEnum;
import com.imooc.mall.exception.MoocMallException;
import com.imooc.mall.filter.UserFilter;
import com.imooc.mall.model.dao.CartMapper;
import com.imooc.mall.model.dao.OrderItemMapper;
import com.imooc.mall.model.dao.OrderMapper;
import com.imooc.mall.model.dao.ProductMapper;
import com.imooc.mall.model.pojo.Order;
import com.imooc.mall.model.pojo.OrderItem;
import com.imooc.mall.model.pojo.Product;
import com.imooc.mall.model.request.CreateOrderRequest;
import com.imooc.mall.service.CartService;
import com.imooc.mall.service.OrderService;
import com.imooc.mall.utils.OrderCodeFactory;
import com.imooc.mall.vo.CartVO;
import com.imooc.mall.vo.CategoryVo;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 订单Service实现类
*/
@Service("orderService")
public class OrderServiceImpl implements OrderService {
@Resource
CartService cartService;
@Resource
ProductMapper productMapper;
@Resource
CartMapper cartMapper;
@Resource
OrderMapper orderMapper;
@Resource
OrderItemMapper orderItemMapper;
/**
* 创建订单
* @param createOrderRequest
* @return
*/
@Override
public String create(CreateOrderRequest createOrderRequest){
//拿到用户id
Integer userId = UserFilter.currentUser.getId();
//从购物车查找已经勾选的商品,得到购物车列表
List<CartVO> cartVOList = cartService.list(userId);//现在是购物车中所有商品
//创建一个保存被选中商品的列表
ArrayList<CartVO> cartVOListTemp = new ArrayList<>();
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(i);
if (cartVO.getSelected().equals(Constant.Cart.CHECKED)){
//得到已选中的商品
cartVOListTemp.add(cartVO);
}
}
cartVOList = cartVOListTemp;
//如果购物车勾选为空返回异常
if (CollectionUtils.isEmpty(cartVOList)){
throw new MoocMallException(MoocExceptionEnum.CART_EMPTY);
}
//判断商品是否存在,上下架状态,库存
ValidSaleStatusAndStock(cartVOList);
//把购物车对象转换成item订单对象
List<OrderItem> orderItemList = cartVOListToOrderItemList(cartVOList);
//扣除出售的商品库存--->更新操作
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
Product product = productMapper.selectByPrimaryKey(orderItem.getProductId());
int stock = product.getStock() - orderItem.getQuantity();
if (stock < 0){
throw new MoocMallException(MoocExceptionEnum.NOT_ENOUGH);
}
product.setStock(stock);
productMapper.updateByPrimaryKeySelective(product);
}
//把购物车中已经勾选的商品删除
cleanCart(cartVOList);
//生成订单
Order order = new Order();
//生成订单号,独立规则
String orderNo = OrderCodeFactory.getOrderCode(Long.valueOf(userId));
order.setOrderNo(orderNo);
order.setUserId(userId);
order.setTotalPrice(totalPrice(orderItemList));
order.setReceiverName(createOrderRequest.getReceiverName());
order.setReceiverMobile(createOrderRequest.getReceiverMobile());
order.setReceiverAddress(createOrderRequest.getReceiverAddress());
order.setOrderStatus(Constant.OrderStatusEnum.NOT_PAID.getCode());
order.setPostage(0);
order.setPaymentType(1);
//写入到order表
orderMapper.insertSelective(order);
//循环保存每个商品到order_item表
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
orderItem.setOrderNo(order.getOrderNo());
orderItemMapper.insertSelective(orderItem);
}
return orderNo;
}
private Integer totalPrice(List<OrderItem> orderItemList) {
Integer totalPrice = 0;
for (int i = 0; i < orderItemList.size(); i++) {
OrderItem orderItem = orderItemList.get(i);
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
private void ValidSaleStatusAndStock(List<CartVO> cartVOList ){
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(0);
//先查询此次添加的商品是否已经存在于数据库,是否上架
Product product = productMapper.selectByPrimaryKey(cartVO.getProductId());
//当商品不存在或者已经下架抛出异常
if (product == null || product.getStatus().equals(Constant.sellStatus.NOT_SELL)){
throw new MoocMallException(MoocExceptionEnum.NOT_SELL);
}
//判断商品库存
if (cartVO.getQuantity() > product.getStock()){
throw new MoocMallException(MoocExceptionEnum.NOT_ENOUGH);
}
}
}
private List<OrderItem> cartVOListToOrderItemList(List<CartVO> cartVOList ){
List<OrderItem> orderItemList = new ArrayList<>();
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(0);
OrderItem orderItem = new OrderItem();
orderItem.setProductId(cartVO.getProductId());
//记录商品快照信息
orderItem.setProductName(cartVO.getProductName());
orderItem.setProductImg(cartVO.getProductImage());
orderItem.setUnitPrice(cartVO.getPrice());
orderItem.setQuantity(cartVO.getQuantity());
orderItem.setTotalPrice(cartVO.getTotalPrice());
orderItemList.add(orderItem);
}
return orderItemList;
}
public void cleanCart(List<CartVO> cartVOList){
for (int i = 0; i < cartVOList.size(); i++) {
CartVO cartVO = cartVOList.get(0);
cartMapper.deleteByPrimaryKey(cartVO.getId());
}
}
}
相关代码:
package com.imooc.mall.model.request;
import javax.validation.constraints.NotNull;
public class CreateOrderRequest {
@NotNull(message = "收件人不能为空")
private String receiverName;
@NotNull(message = "收件人电话不能为空")
private String receiverMobile;
@NotNull(message = "收件人地址不能为空")
private String receiverAddress;
private Integer postage = 0;
private Integer paymentType =1;
public String getReceiverName() {
return receiverName;
}
public void setReceiverName(String receiverName) {
this.receiverName = receiverName;
}
public String getReceiverMobile() {
return receiverMobile;
}
public void setReceiverMobile(String receiverMobile) {
this.receiverMobile = receiverMobile;
}
public String getReceiverAddress() {
return receiverAddress;
}
public void setReceiverAddress(String receiverAddress) {
this.receiverAddress = receiverAddress;
}
public Integer getPostage() {
return postage;
}
public void setPostage(Integer postage) {
this.postage = postage;
}
public Integer getPaymentType() {
return paymentType;
}
public void setPaymentType(Integer paymentType) {
this.paymentType = paymentType;
}
}
相关代码:
package com.imooc.mall.common;
import com.google.common.collect.Sets;
import com.imooc.mall.exception.MoocExceptionEnum;
import com.imooc.mall.exception.MoocMallException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.Set;
/**
* 常量类
*/
@Component
public class Constant {
/**
* 盐值常量
*/
public static final String SALT = "dwq&&*180jfweKSNc.,>[}0snGGh@5~`";
/**
* 登录信息常量名
*/
public static final String IMOOC_MALL_USER = "imooc_mall_user";
//上传文件的地址
public static String FILE_UPLOAD_DIR ;
@Value("${file.upload.dir}")
public void setFileUploadDir(String fileUploadDir){
FILE_UPLOAD_DIR = fileUploadDir;
}
/**
* 规定排序内容
*/
public interface ProductListOrderBy{
Set<String> PRICE_ASC_DESC = Sets.newHashSet("price desc", "price asc");
}
/**
* 定义商品上下架状态
*/
public interface sellStatus{
int NOT_SELL = 0;//商品下架
int SELL = 1;//商品上架
}
/**
*设置购物车选中状态
*/
public interface Cart{
int UN_CHECKED = 0;//购物车未选中状态
int CHECKED = 1;//购物车选中状态
}
/**
* 设置订单状态
*/
public enum OrderStatusEnum{
CANCELED(0, "用户已取消"),
NOT_PAID(10, "未付款"),
PAID(20, "已付款"),
DELIVERED(30, "已发货"),
FINISHED(40, "交易完成");
private String value;
private int code;
OrderStatusEnum(int code,String value) {
this.value = value;
this.code = code;
}
public static OrderStatusEnum codeOf(int code){
for(OrderStatusEnum orderStatusEnum : values()){
if (orderStatusEnum.getCode() == code){
return orderStatusEnum;
}
}
throw new MoocMallException(MoocExceptionEnum.NO_ENUM);
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
}
相关代码:
package com.imooc.mall.utils;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* 生成订单号工具类
*/
public class OrderCodeFactory {
//获取当前时间转换为字符串
private static String getDateTime(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
return sdf.format(new Date());
}
//获取5位随机数
private static int getRandom(Long n){
Random random = new Random();
int num = (int)(random.nextDouble() * (90000)) + 10000;
return num;
}
public static String getOrderCode(Long userId){
return getDateTime() + getRandom(userId);
}
}
1回答
好帮手慕小脸
2021-08-28
同学你好,同学是课程中演示的功能没有实现吗?如果是,经测试结合上述贴出代码进行源码的拼接,是可以正确将多个商品一起添加到订单的,如下所示:


建议同学下载课程源码将添加这部分的功能进行一一比对,看一下是否存在单词或方法调用错误的情况~
祝学习愉快~
相似问题