wangjinhao_branch
wangjinhao 10 months ago
parent a597835462
commit 3d62bf54e6

@ -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<ShopCartOrderMergerDto> 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<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderParam.getOrderItem(), userId);
if (CollectionUtil.isEmpty(shopCartItems)) {
throw new YamiShopBindException("请选择您需要的商品加入购物车");
}
// 根据店铺组装购物车中的商品信息
List<ShopCartDto> shopCarts = basketService.getShopCarts(shopCartItems);
// 生成完整的订单信息
ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto();
shopCartOrderMergerDto.setUserAddr(userAddrDto);
List<ShopCartOrderDto> 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<ShopCartItemDiscountDto> shopCartItemDiscounts = shopCart.getShopCartItemDiscounts();
List<ShopCartItemDto> shopAllShopCartItems = new ArrayList<>();
for (ShopCartItemDiscountDto shopCartItemDiscount : shopCartItemDiscounts) {
List<ShopCartItemDto> 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<OrderNumbersDto> submitOrders(@Valid @RequestBody SubmitOrderParam submitOrderParam) {
String userId = SecurityUtils.getUser().getUserId();
ShopCartOrderMergerDto mergerOrder = orderService.getConfirmOrderCache(userId);
if (mergerOrder == null) {
throw new YamiShopBindException("订单已过期,请重新下单");
}
List<OrderShopParam> orderShopParams = submitOrderParam.getOrderShopParam();
List<ShopCartOrderDto> 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<Order> 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()));
}
}
Loading…
Cancel
Save