|
|
|
@ -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()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|