|
@@ -34,6 +34,7 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageRe
|
|
|
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO;
|
|
|
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO;
|
|
|
import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
|
|
|
+import cn.iocoder.yudao.module.trade.dal.dataobject.cart.TradeCartDO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
|
|
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
|
|
@@ -41,6 +42,10 @@ import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
|
|
|
import cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants;
|
|
|
import cn.iocoder.yudao.module.trade.enums.order.*;
|
|
|
import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
|
|
|
+import cn.iocoder.yudao.module.trade.service.cart.TradeCartService;
|
|
|
+import cn.iocoder.yudao.module.trade.service.price.TradePriceService;
|
|
|
+import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
|
|
|
+import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -50,8 +55,7 @@ import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
|
|
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
|
|
|
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
|
|
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_ORDER_NOT_FOUND;
|
|
|
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
|
|
|
|
|
@@ -70,6 +74,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|
|
@Resource
|
|
|
private TradeOrderItemMapper tradeOrderItemMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private TradeCartService tradeCartService;
|
|
|
+ @Resource
|
|
|
+ private TradePriceService tradePriceService;
|
|
|
+
|
|
|
@Resource
|
|
|
private PriceApi priceApi;
|
|
|
@Resource
|
|
@@ -92,7 +101,48 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|
|
|
|
|
@Override
|
|
|
public AppTradeOrderSettlementRespVO settlementOrder(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) {
|
|
|
- return null;
|
|
|
+ // 1. 获得收货地址
|
|
|
+ AddressRespDTO address = getAddress(userId, settlementReqVO.getAddressId());
|
|
|
+ if (address != null) {
|
|
|
+ settlementReqVO.setAddressId(address.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 计算价格
|
|
|
+ TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, settlementReqVO);
|
|
|
+
|
|
|
+ // 3. 拼接返回
|
|
|
+ return TradeOrderConvert.INSTANCE.convert(calculateRespBO, address);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得用户地址
|
|
|
+ *
|
|
|
+ * @param userId 用户编号
|
|
|
+ * @param addressId 地址编号
|
|
|
+ * @return 地址
|
|
|
+ */
|
|
|
+ private AddressRespDTO getAddress(Long userId, Long addressId) {
|
|
|
+ if (addressId != null) {
|
|
|
+ return addressApi.getAddress(addressId, userId);
|
|
|
+ }
|
|
|
+ return addressApi.getDefaultAddress(userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算订单价格
|
|
|
+ *
|
|
|
+ * @param userId 用户编号
|
|
|
+ * @param settlementReqVO 结算信息
|
|
|
+ * @return 订单价格
|
|
|
+ */
|
|
|
+ private TradePriceCalculateRespBO calculatePrice(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) {
|
|
|
+ // 1. 如果来自购物车,则获得购物车的商品
|
|
|
+ List<TradeCartDO> cartList = tradeCartService.getCartList(userId,
|
|
|
+ convertSet(settlementReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId));
|
|
|
+
|
|
|
+ // 2. 计算价格
|
|
|
+ TradePriceCalculateReqBO calculateReqBO = TradeOrderConvert.INSTANCE.convert(userId, settlementReqVO, cartList);
|
|
|
+ return tradePriceService.calculatePrice(calculateReqBO);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -120,29 +170,6 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|
|
return tradeOrderDO.getId();
|
|
|
}
|
|
|
|
|
|
-// /**
|
|
|
-// * 校验商品 SKU 是否可出售
|
|
|
-// *
|
|
|
-// * @param items 商品 SKU
|
|
|
-// * @return 商品 SKU 数组
|
|
|
-// */
|
|
|
-// private List<ProductSkuRespDTO> validateSkuSaleable(List<Item> items) {
|
|
|
-// List<ProductSkuRespDTO> skus = productSkuApi.getSkuList(convertSet(items, Item::getSkuId));
|
|
|
-// // SKU 不存在
|
|
|
-// if (items.size() != skus.size()) {
|
|
|
-// throw exception(ORDER_CREATE_SKU_NOT_FOUND);
|
|
|
-// }
|
|
|
-// // 校验库存不足
|
|
|
-// Map<Long, ProductSkuRespDTO> skuMap = convertMap(skus, ProductSkuRespDTO::getId);
|
|
|
-// items.forEach(item -> {
|
|
|
-// ProductSkuRespDTO sku = skuMap.get(item.getSkuId());
|
|
|
-// if (item.getCount() > sku.getStock()) {
|
|
|
-// throw exception(ErrorCodeConstants.ORDER_CREATE_SKU_STOCK_NOT_ENOUGH);
|
|
|
-// }
|
|
|
-// });
|
|
|
-// return skus;
|
|
|
-// }
|
|
|
-
|
|
|
/**
|
|
|
* 校验商品 SPU 是否可出售
|
|
|
*
|