• 千峰商城-springboot项目搭建-79-保存订单接口实现


    一、流程分析(基础版本):

     二、数据库实现

    1.数据库操作:

    • 根据收货地址ID,获取收货地址信息(tkMapper)
    • 根据购物车ID,查询购物车详情(需要关联查询商品名称、sku名称、库存、商品图片、商品价格)——>获取生成商品快照的参数
    • 保存订单(tkMapper)
    • 修改库存(tkMapper)
    • 保存商品快照(tkMapper)

    (1)库存

    改造shoopingCart:

    ShoppingCartVO:
    
        private int skuStock;//库存
    
    1. <resultMap id="ShoppingCartVOMap2" type="com.qfedu.fmmall.entity.ShoppingCartVO">
    2. <id column="cart_id" jdbcType="INTEGER" property="cartId" />
    3. <result column="product_id" jdbcType="VARCHAR" property="productId" />
    4. <result column="sku_id" jdbcType="VARCHAR" property="skuId" />
    5. <result column="user_id" jdbcType="VARCHAR" property="userId" />
    6. <result column="cart_num" jdbcType="VARCHAR" property="cartNum" />
    7. <result column="cart_time" jdbcType="VARCHAR" property="cartTime" />
    8. <result column="product_price" jdbcType="DECIMAL" property="productPrice" />
    9. <result column="sku_props" jdbcType="VARCHAR" property="skuProps" />
    10. <result column="product_name" jdbcType="VARCHAR" property="productName" />
    11. <result column="url" jdbcType="VARCHAR" property="productImg" />
    12. <result column="original_price" jdbcType="VARCHAR" property="originalPrice" />
    13. <result column="sell_price" jdbcType="VARCHAR" property="sellPrice" />
    14. <result column="sku_name" jdbcType="VARCHAR" property="skuName" />
    15. <result column="stock" property="skuStock" />
    16. resultMap>
    17. <select id="selectShopcartByCids" resultMap="ShoppingCartVOMap2">
    18. SELECT c.cart_id,
    19. c.product_id,
    20. c.sku_id,
    21. c.user_id,
    22. c.cart_num,
    23. c.cart_time,
    24. c.product_price,
    25. c.sku_props,
    26. p.product_name,
    27. i.url,
    28. s.original_price,
    29. s.sell_price,
    30. s.sku_name,
    31. s.stock
    32. FROM shopping_cart c
    33. INNER JOIN product p
    34. INNER JOIN product_img i
    35. INNER JOIN product_sku s
    36. ON c.product_id=p.product_id
    37. AND i.item_id=p.product_id
    38. AND c.sku_id=s.sku_id
    39. WHERE i.is_main=1 and c.cart_id IN
    40. <foreach collection="cids" item="cid" separator="," open="(" close=")">
    41. #{cid}
    42. foreach>
    43. select>
      OrderService:
    1. public interface OrderService {
    2. public ResultVO addOrder();
    3. }
      OrderServiceImpl:
    1. @Service
    2. public class OrderServiceImpl implements OrderService {
    3. @Autowired
    4. private ShoppingCartMapper shoppingCartMapper;
    5. @Autowired
    6. private OrdersMapper ordersMapper;
    7. @Autowired
    8. private OrderItemMapper orderItemMapper;
    9. public ResultVO addOrder(String cids,Orders order) {
    10. //1.根据cids查询当前订单中关联的购物车记录详情(包括库存)
    11. String[] arr = cids.split(",");
    12. List<Integer> cidsList = new ArrayList<>();
    13. for (int i=0; ilength;i++){
    14. cidsList.add(Integer.parseInt(arr[i]));
    15. }
    16. List<ShoppingCartVO> list = shoppingCartMapper.selectShopcartByCids(cidsList);
    17. //2.校验库存
    18. boolean f = true;
    19. String untitled = "";
    20. for (ShoppingCartVO sc:list){
    21. if (Integer.parseInt( sc.getCartNum() )>sc.getSkuStock()){
    22. f=false;
    23. //break;
    24. }
    25. //获取所有商品的名称,以“,”分割拼接成字符串
    26. untitled = untitled + sc.getProductName() + ",";
    27. }
    28. if (f){
    29. //3.表示用户充足----------保存订单
    30. order.setUntitled(untitled);
    31. order.setCreateTime(new Date());
    32. //生成订单编号
    33. String orderId = UUID.randomUUID().toString().replace("-", "");
    34. order.setOrderId(orderId);
    35. //4.保存订单
    36. int i = ordersMapper.insert(order);
    37. if (i>0){
    38. //生成商品快照
    39. List<OrderItem> orderItems = new ArrayList<>();
    40. for (ShoppingCartVO sc:list){
    41. String itemId = System.currentTimeMillis()+""+ (new Random().nextInt(89999)+10000 );
    42. OrderItem orderItem = new OrderItem(itemId, orderId, sc.getProductId(), sc.getProductName(), sc.getProductImg(),
    43. sc.getSkuId(), sc.getSkuName(),new BigDecimal(sc.getSellPrice()) , Integer.parseInt(sc.getCartNum()),
    44. new BigDecimal(sc.getSellPrice() * Integer.parseInt(sc.getCartNum())) , new Date(), new Date(), 0);
    45. orderItems.add(orderItem);
    46. }
    47. int j = orderItemMapper.insertList(orderItems);
    48. //扣减库存
    49. }
    50. }else {
    51. //表示库存不足
    52. return new ResultVO(ResStatus.NO,"库存不足,下单失败!",null);
    53. }
    54. return null;
    55. }
    56. }
    (2)保存订单
     OrderServiceImpl:
    1. @Service
    2. public class OrderServiceImpl implements OrderService {
    3. @Autowired
    4. private ShoppingCartMapper shoppingCartMapper;
    5. @Autowired
    6. private OrdersMapper ordersMapper;
    7. @Autowired
    8. private OrderItemMapper orderItemMapper;
    9. @Autowired
    10. private ProductSkuMapper productSkuMapper;
    11. public ResultVO addOrder(String cids,Orders order) {
    12. //1.根据cids查询当前订单中关联的购物车记录详情(包括库存)
    13. String[] arr = cids.split(",");
    14. List cidsList = new ArrayList<>();
    15. for (int i=0; i
    16. cidsList.add(Integer.parseInt(arr[i]));
    17. }
    18. List list = shoppingCartMapper.selectShopcartByCids(cidsList);
    19. //2.校验库存
    20. boolean f = true;
    21. String untitled = "";
    22. for (ShoppingCartVO sc:list){
    23. if (Integer.parseInt( sc.getCartNum() )>sc.getSkuStock()){
    24. f=false;
    25. //break;
    26. }
    27. //获取所有商品的名称,以“,”分割拼接成字符串
    28. untitled = untitled + sc.getProductName() + ",";
    29. }
    30. if (f){
    31. //3.表示用户充足----------保存订单
    32. order.setUntitled(untitled);
    33. order.setCreateTime(new Date());
    34. order.setStatus("1");
    35. //生成订单编号
    36. String orderId = UUID.randomUUID().toString().replace("-", "");
    37. order.setOrderId(orderId);
    38. //4.保存订单
    39. int i = ordersMapper.insert(order);
    40. //if (i>0){
    41. //生成商品快照
    42. //List orderItems = new ArrayList<>();
    43. for (ShoppingCartVO sc:list){
    44. int cnum = Integer.parseInt(sc.getCartNum());
    45. String itemId = System.currentTimeMillis()+""+ (new Random().nextInt(89999)+10000 );
    46. OrderItem orderItem = new OrderItem(itemId, orderId, sc.getProductId(), sc.getProductName(), sc.getProductImg(),
    47. sc.getSkuId(), sc.getSkuName(),new BigDecimal(sc.getSellPrice()) , cnum,
    48. new BigDecimal(sc.getSellPrice() * cnum) , new Date(), new Date(), 0);
    49. //orderItems.add(orderItem);
    50. int m = orderItemMapper.insert(orderItem);
    51. }
    52. //int j = orderItemMapper.insertList(orderItems);
    53. //5.扣减库存
    54. for (ShoppingCartVO sc:list){
    55. String skuId = sc.getSkuId();
    56. int newStock = sc.getSkuStock() - Integer.parseInt(sc.getCartNum());
    57. // Example example = new Example(ProductSku.class);
    58. // Example.Criteria criteria = example.createCriteria();
    59. // criteria.andEqualTo("skuId",skuId);
    60. // ProductSku productSku = productSkuMapper.selectByPrimaryKey(skuId);
    61. // //ProductSku productSku = new ProductSku();
    62. // productSku.setStock(newStock);
    63. // int k = productSkuMapper.updateByPrimaryKey(productSku);
    64. ProductSku productSku = new ProductSku();
    65. productSku.setSkuId(skuId);
    66. productSku.setStock(newStock);
    67. int k = productSkuMapper.updateByPrimaryKeySelective(productSku);
    68. }
    69. return new ResultVO(ResStatus.OK,"下单成功!",orderId);
    70. }else {
    71. //表示库存不足
    72. return new ResultVO(ResStatus.NO,"库存不足,下单失败!",null);
    73. }
    74. }
    75. }
      OrderController:
    1. @RestController
    2. @CrossOrigin
    3. @RequestMapping("/order")
    4. @Api(value = "提供订单相关的操作接口",tags = "订单管理")
    5. public class OrderController {
    6. @Autowired
    7. private OrderService orderService;
    8. @PostMapping("/add")
    9. public ResultVO add(String cids,@RequestBody Orders order){
    10. ResultVO resultVO = orderService.addOrder(cids, order);
    11. return resultVO;
    12. }
    13. }
     
     (3)事务管理
    OrderServiceImpl:
    
    1. //保存订单业务
    2. @Transactional //事务
    3. public ResultVO addOrder(String cids,Orders order) {
    4. ...
    5. }
     (4)删除购物车记录
    OrderServiceImpl:
    
    1. //6.删除购物车:当购物车中的记录购买成功后,购物车对应做删除操作
    2. for (int cid:cidsList){
    3. shoppingCartMapper.deleteByPrimaryKey(cid);
    4. }
     OrderServiceImpl抛出sq异常:
    1. @Service
    2. public class OrderServiceImpl implements OrderService {
    3. @Autowired
    4. private ShoppingCartMapper shoppingCartMapper;
    5. @Autowired
    6. private OrdersMapper ordersMapper;
    7. @Autowired
    8. private OrderItemMapper orderItemMapper;
    9. @Autowired
    10. private ProductSkuMapper productSkuMapper;
    11. //保存订单业务
    12. @Transactional//事务
    13. public ResultVO addOrder(String cids,Orders order) throws SQLException{
    14. //1.根据cids查询当前订单中关联的购物车记录详情(包括库存)
    15. String[] arr = cids.split(",");
    16. List cidsList = new ArrayList<>();
    17. for (int i=0; i
    18. cidsList.add(Integer.parseInt(arr[i]));
    19. }
    20. List list = shoppingCartMapper.selectShopcartByCids(cidsList);
    21. //2.校验库存
    22. boolean f = true;
    23. String untitled = "";
    24. for (ShoppingCartVO sc:list){
    25. if (Integer.parseInt( sc.getCartNum() )>sc.getSkuStock()){
    26. f=false;
    27. //break;
    28. }
    29. //获取所有商品的名称,以“,”分割拼接成字符串
    30. untitled = untitled + sc.getProductName() + ",";
    31. }
    32. if (f){
    33. //3.表示用户充足----------保存订单
    34. order.setUntitled(untitled);
    35. order.setCreateTime(new Date());
    36. order.setStatus("1");
    37. //生成订单编号
    38. String orderId = UUID.randomUUID().toString().replace("-", "");
    39. order.setOrderId(orderId);
    40. //4.保存订单
    41. ordersMapper.insert(order);
    42. //if (i>0){
    43. //生成商品快照
    44. //List orderItems = new ArrayList<>();
    45. for (ShoppingCartVO sc:list){
    46. int cnum = Integer.parseInt(sc.getCartNum());
    47. String itemId = System.currentTimeMillis()+""+ (new Random().nextInt(89999)+10000 );
    48. OrderItem orderItem = new OrderItem(itemId, orderId, sc.getProductId(), sc.getProductName(), sc.getProductImg(),
    49. sc.getSkuId(), sc.getSkuName(),new BigDecimal(sc.getSellPrice()) , cnum,
    50. new BigDecimal(sc.getSellPrice() * cnum) , new Date(), new Date(), 0);
    51. //orderItems.add(orderItem);
    52. orderItemMapper.insert(orderItem);
    53. }
    54. //int j = orderItemMapper.insertList(orderItems);
    55. //5.扣减库存
    56. for (ShoppingCartVO sc:list){
    57. String skuId = sc.getSkuId();
    58. int newStock = sc.getSkuStock() - Integer.parseInt(sc.getCartNum());
    59. // Example example = new Example(ProductSku.class);
    60. // Example.Criteria criteria = example.createCriteria();
    61. // criteria.andEqualTo("skuId",skuId);
    62. // ProductSku productSku = productSkuMapper.selectByPrimaryKey(skuId);
    63. // //ProductSku productSku = new ProductSku();
    64. // productSku.setStock(newStock);
    65. // int k = productSkuMapper.updateByPrimaryKey(productSku);
    66. ProductSku productSku = new ProductSku();
    67. productSku.setSkuId(skuId);
    68. productSku.setStock(newStock);
    69. productSkuMapper.updateByPrimaryKeySelective(productSku);
    70. }
    71. //6.删除购物车:当购物车中的记录购买成功后,购物车对应做删除操作
    72. for (int cid:cidsList){
    73. shoppingCartMapper.deleteByPrimaryKey(cid);
    74. }
    75. return new ResultVO(ResStatus.OK,"下单成功!",orderId);
    76. }else {
    77. //表示库存不足
    78. return new ResultVO(ResStatus.NO,"库存不足,下单失败!",null);
    79. }
    80. }
    81. }
      OrderController:
    1. @RestController
    2. @CrossOrigin
    3. @RequestMapping("/order")
    4. @Api(value = "提供订单相关的操作接口",tags = "订单管理")
    5. public class OrderController {
    6. @Autowired
    7. private OrderService orderService;
    8. @PostMapping("/add")
    9. public ResultVO add(String cids,@RequestBody Orders order) {
    10. ResultVO resultVO = null;
    11. try {
    12. resultVO = orderService.addOrder(cids, order);
    13. }catch (SQLException e){
    14. resultVO = new ResultVO(ResStatus.NO,"提交订单失败",null);
    15. }
    16. return resultVO;
    17. }
    18. }
  • 相关阅读:
    【CQF Math Class 数学笔记】
    Android Datastore 动态创建与源码解析
    29、CSS进阶——美化表单元素
    EI/知网检索高录用国际学术会议推荐
    如何在Centos8中添加附加的IP
    LeetCode 2512. 奖励最顶尖的 K 名学生:哈希表设计
    如何监控公司电脑上网记录(员工上网行为监控软件有哪些?)
    计算机毕业设计Java校园新闻网站(系统+源码+mysql数据库+lw文档)
    产品经理就业喜报:沉舟侧畔终迎万木春
    酒店公共广播背景音乐-基于互联网+的酒店IP网络广播系统设计
  • 原文地址:https://blog.csdn.net/LYly_B/article/details/126073954