From 3d62bf54e669a47b8e55e12bcb7b9309863cdb0c Mon Sep 17 00:00:00 2001 From: wangjinhao Date: Tue, 17 Dec 2024 10:41:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/api/controller/OrderController.java | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java new file mode 100644 index 0000000..3dca831 --- /dev/null +++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ + +package com.yami.shop.api.controller; // 定义类所在的包 + +import cn.hutool.core.collection.CollectionUtil; // 引入Hutool工具类库中的CollectionUtil工具类 +import com.yami.shop.bean.app.dto.*; // 引入各种DTO类 +import com.yami.shop.bean.app.param.OrderParam; // 引入订单参数类 +import com.yami.shop.bean.app.param.OrderShopParam; // 引入订单店铺参数类 +import com.yami.shop.bean.app.param.SubmitOrderParam; // 引入提交订单参数类 +import com.yami.shop.bean.event.ConfirmOrderEvent; // 引入确认订单事件类 +import com.yami.shop.bean.model.Order; // 引入订单模型类 +import com.yami.shop.bean.model.UserAddr; // 引入用户地址模型类 +import com.yami.shop.common.exception.YamiShopBindException; // 引入自定义异常类 +import com.yami.shop.common.util.Arith; // 引入算术工具类 +import com.yami.shop.security.api.util.SecurityUtils; // 引入安全工具类 +import com.yami.shop.service.*; // 引入各种服务类 +import io.swagger.v3.oas.annotations.tags.Tag; // 引入Swagger的Tag注解 +import io.swagger.v3.oas.annotations.Operation; // 引入Swagger的Operation注解 +import cn.hutool.core.bean.BeanUtil; // 引入Hutool工具类库中的BeanUtil工具类 +import org.springframework.beans.factory.annotation.Autowired; // 引入Spring的@Autowired注解 +import org.springframework.context.ApplicationContext; // 引入Spring的ApplicationContext类 +import com.yami.shop.common.response.ServerResponseEntity; // 引入服务器响应实体类 +import org.springframework.web.bind.annotation.*; // 引入Spring Web的注解 + +import jakarta.validation.Valid; // 引入Jakarta Validation的Valid注解 +import java.util.ArrayList; // 引入Java的ArrayList类 +import java.util.List; // 引入Java的List接口 +import java.util.Objects; // 引入Java的Objects工具类 + +/** + * OrderController类,用于管理订单操作,包括生成订单和提交订单等功能。 + * @作者 lanhai + */ +@RestController // 标注这是一个控制器类,并且其返回结果直接写入HTTP响应体中,而不是视图名称 +@RequestMapping("/p/order") // 定义请求路径的根地址为/p/order +@Tag(name = "订单接口") // 给API文档添加标签,描述这个控制器的功能 +public class OrderController { + + @Autowired + private OrderService orderService; // 自动注入订单服务类 + @Autowired + private SkuService skuService; // 自动注入SKU服务类 + @Autowired + private ProductService productService; // 自动注入商品服务类 + @Autowired + private UserAddrService userAddrService; // 自动注入用户地址服务类 + @Autowired + private BasketService basketService; // 自动注入购物车服务类 + @Autowired + private ApplicationContext applicationContext; // 自动注入Spring应用上下文 + + /** + * 生成订单 + * @param orderParam 订单参数 + * @return 服务器响应实体,包含生成的订单信息 + */ + @PostMapping("/confirm") + @Operation(summary = "结算,生成订单信息" , description = "传入下单所需要的参数进行下单") + public ServerResponseEntity confirm(@Valid @RequestBody OrderParam orderParam) { + String userId = SecurityUtils.getUser().getUserId(); + + // 获取订单的地址信息 + UserAddr userAddr = userAddrService.getUserAddrByUserId(orderParam.getAddrId(), userId); + UserAddrDto userAddrDto = BeanUtil.copyProperties(userAddr, UserAddrDto.class); + + // 获取用户提交的购物车商品项 + List shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderParam.getOrderItem(), userId); + if (CollectionUtil.isEmpty(shopCartItems)) { + throw new YamiShopBindException("请选择您需要的商品加入购物车"); + } + + // 根据店铺组装购物车中的商品信息 + List shopCarts = basketService.getShopCarts(shopCartItems); + + // 生成完整的订单信息 + ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto(); + shopCartOrderMergerDto.setUserAddr(userAddrDto); + List shopCartOrders = new ArrayList<>(); + double actualTotal = 0.0; + double total = 0.0; + int totalCount = 0; + double orderReduce = 0.0; + + for (ShopCartDto shopCart : shopCarts) { + ShopCartOrderDto shopCartOrder = new ShopCartOrderDto(); + shopCartOrder.setShopId(shopCart.getShopId()); + shopCartOrder.setShopName(shopCart.getShopName()); + + List shopCartItemDiscounts = shopCart.getShopCartItemDiscounts(); + List shopAllShopCartItems = new ArrayList<>(); + for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) { + List discountShopCartItems = shopCartItemDiscount.getShopCartItems(); + shopAllShopCartItems.addAll(discountShopCartItems); + } + + shopCartOrder.setShopCartItemDiscounts(shopCartItemDiscounts); + applicationContext.publishEvent(new ConfirmOrderEvent(shopCartOrder, orderParam, shopAllShopCartItems)); + + actualTotal = Arith.add(actualTotal, shopCartOrder.getActualTotal()); + total = Arith.add(total, shopCartOrder.getTotal()); + totalCount += shopCartOrder.getTotalCount(); + orderReduce = Arith.add(orderReduce, shopCartOrder.getShopReduce()); + shopCartOrders.add(shopCartOrder); + } + + shopCartOrderMergerDto.setActualTotal(actualTotal); + shopCartOrderMergerDto.setTotal(total); + shopCartOrderMergerDto.setTotalCount(totalCount); + shopCartOrderMergerDto.setShopCartOrders(shopCartOrders); + shopCartOrderMergerDto.setOrderReduce(orderReduce); + + shopCartOrderMergerDto = orderService.putConfirmOrderCache(userId, shopCartOrderMergerDto); + + return ServerResponseEntity.success(shopCartOrderMergerDto); + } + + /** + * 提交订单,根据店铺拆单 + * @param submitOrderParam 提交订单参数 + * @return 服务器响应实体,包含支付流水号 + */ + @PostMapping("/submit") + @Operation(summary = "提交订单,返回支付流水号" , description = "根据传入的参数判断是否为购物车提交订单,同时对购物车进行删除,用户开始进行支付") + public ServerResponseEntity submitOrders(@Valid @RequestBody SubmitOrderParam submitOrderParam) { + String userId = SecurityUtils.getUser().getUserId(); + ShopCartOrderMergerDto mergerOrder = orderService.getConfirmOrderCache(userId); + if (mergerOrder == null) { + throw new YamiShopBindException("订单已过期,请重新下单"); + } + + List orderShopParams = submitOrderParam.getOrderShopParam(); + List shopCartOrders = mergerOrder.getShopCartOrders(); + + // 设置备注 + if (CollectionUtil.isNotEmpty(orderShopParams)) { + for (ShopCartOrderDto shopCartOrder : shopCartOrders) { + for (OrderShopParam orderShopParam : orderShopParams) { + if (Objects.equals(shopCartOrder.getShopId(), orderShopParam.getShopId())) { + shopCartOrder.setRemarks(orderShopParam.getRemarks()); + } + } + } + } + + List orders = orderService.submit(userId, mergerOrder); + + StringBuilder orderNumbers = new StringBuilder(); + for (Order order : orders) { + orderNumbers.append(order.getOrderNumber()).append(","); + } + orderNumbers.deleteCharAt(orderNumbers.length() - 1); + + boolean isShopCartOrder = false; + // 移除缓存 + for (ShopCartOrderDto shopCartOrder : shopCartOrders) { + for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartOrder.getShopCartItemDiscounts()) { + for (ShopCartItemDto shopCartItem : shopCartItemDiscount.getShopCartItems()) { + Long basketId = shopCartItem.getBasketId(); + if (basketId != null && basketId != 0) { + isShopCartOrder = true; + } + skuService.removeSkuCacheBySkuId(shopCartItem.getSkuId(), shopCartItem.getProdId()); + productService.removeProductCacheByProdId(shopCartItem.getProdId()); + } + } + } + // 购物车提交订单时(即有购物车ID时) + if (isShopCartOrder) { + basketService.removeShopCartItemsCacheByUserId(userId); + } + orderService.removeConfirmOrderCache(userId); + return ServerResponseEntity.success(new OrderNumbersDto(orderNumbers.toString())); + } + +}