购物车里面有两个商品,每次只能把其中一个商品添加到订单,另一个还需要再执行一次,怎么改

来源: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

同学你好,同学是课程中演示的功能没有实现吗?如果是,经测试结合上述贴出代码进行源码的拼接,是可以正确将多个商品一起添加到订单的,如下所示:

http://img.mukewang.com/climg/612a04e709e1309714460235.jpg

http://img.mukewang.com/climg/612a04ef0902201d13790156.jpg

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

祝学习愉快~



0

0 学习 · 9886 问题

查看课程