diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http index 8d2af766f..1a11d4eed 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http @@ -8,27 +8,22 @@ GET {{appApi}}/trade/order/settlement?type=0&items[0].cartId=50&couponId=1 Authorization: Bearer {{appToken}} tenant-id: {{appTenentId}} -### /trade-order/confirm-create-order-info-from-cart 基于购物车,确认创建订单 -GET {{shop-api-base-url}}/trade-order/confirm-create-order-info-from-cart -Content-Type: application/x-www-form-urlencoded -Authorization: Bearer {{user-access-token}} - -### /trade-order/create 基于商品,创建订单 +### /trade-order/create 创建订单(基于商品) POST {{appApi}}/trade/order/create Content-Type: application/json Authorization: Bearer {{appToken}} tenant-id: {{appTenentId}} { + "type": 0, "addressId": 21, - "remark": "我是备注", - "fromCart": false, "items": [ { - "skuId": 29, - "count": 1 + "skuId": 1, + "count": 2 } - ] + ], + "remark": "我是备注" } ### 获得订单交易的分页 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java index a6eb579a5..e3008fdd6 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java @@ -22,7 +22,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.HashMap; import java.util.List; @@ -30,6 +29,7 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "用户 App - 交易订单") @@ -58,15 +58,9 @@ public class AppTradeOrderController { @PostMapping("/create") @Operation(summary = "创建订单") @PreAuthenticated - public CommonResult createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO, - HttpServletRequest servletRequest) { - return success(1L); -// // 获取登录用户、用户 IP 地址 -// Long loginUserId = getLoginUserId(); -// String clientIp = ServletUtils.getClientIP(servletRequest); -// // 创建交易订单,预支付记录 -// Long orderId = tradeOrderService.createOrder(loginUserId, clientIp, createReqVO); -// return success(orderId); + public CommonResult createOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO) { + Long orderId = tradeOrderService.createOrder(getLoginUserId(), getClientIP(), createReqVO); + return success(orderId); } @PostMapping("/update-paid") diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java index 26c48954c..11031a884 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java @@ -3,26 +3,9 @@ package cn.iocoder.yudao.module.trade.controller.app.order.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - @Schema(description = "用户 App - 交易订单创建 Request VO") @Data -public class AppTradeOrderCreateReqVO { - - @Schema(description = "收件地址编号", required = true, example = "1") - @NotNull(message = "收件地址不能为空") - private Long addressId; - - @Schema(description = "优惠劵编号", example = "1024") - private Long couponId; - - @Schema(description = "购物车项的编号数组", required = true, example = "true") - @NotEmpty(message = "购物车项不能为空") - private List cartIds; - - // ========== 非 AppTradeOrderSettlementReqVO 字段 ========== +public class AppTradeOrderCreateReqVO extends AppTradeOrderSettlementReqVO { @Schema(description = "备注", example = "这个是我的订单哟") private String remark; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java index 3ea449f6c..c53ae4d0a 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java @@ -9,11 +9,8 @@ import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; -import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO; -import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO; import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO; import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDetailRespVO; @@ -50,32 +47,32 @@ public interface TradeOrderConvert { @Mapping(source = "createReqVO.couponId", target = "couponId"), @Mapping(target = "remark", ignore = true), @Mapping(source = "createReqVO.remark", target = "userRemark"), + @Mapping(source = "createReqVO.type", target = "type"), + @Mapping(source = "calculateRespBO.price.totalPrice", target = "totalPrice"), + @Mapping(source = "calculateRespBO.price.discountPrice", target = "discountPrice"), + @Mapping(source = "calculateRespBO.price.deliveryPrice", target = "deliveryPrice"), + @Mapping(source = "calculateRespBO.price.couponPrice", target = "couponPrice"), + @Mapping(source = "calculateRespBO.price.pointPrice", target = "pointPrice"), + @Mapping(source = "calculateRespBO.price.payPrice", target = "payPrice"), @Mapping(source = "address.name", target = "receiverName"), @Mapping(source = "address.mobile", target = "receiverMobile"), @Mapping(source = "address.areaId", target = "receiverAreaId"), @Mapping(source = "address.detailAddress", target = "receiverDetailAddress"), }) TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, - PriceCalculateRespDTO.Order order, AddressRespDTO address); + TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address); - @Mappings({ - @Mapping(target = "id", ignore = true), - @Mapping(source = "sku.spuId", target = "spuId"), - }) - TradeOrderItemDO convert(PriceCalculateRespDTO.OrderItem orderItem, ProductSkuRespDTO sku); - - default List convertList(TradeOrderDO tradeOrderDO, - List orderItems, List skus) { - Map skuMap = convertMap(skus, ProductSkuRespDTO::getId); - return CollectionUtils.convertList(orderItems, orderItem -> { - TradeOrderItemDO tradeOrderItemDO = convert(orderItem, skuMap.get(orderItem.getSkuId())); - tradeOrderItemDO.setOrderId(tradeOrderDO.getId()); - tradeOrderItemDO.setUserId(tradeOrderDO.getUserId()); - tradeOrderItemDO.setAfterSaleStatus(TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); // 退款信息 -// tradeOrderItemDO.setCommented(false); - return tradeOrderItemDO; + default List convertList(TradeOrderDO tradeOrderDO, TradePriceCalculateRespBO calculateRespBO) { + return CollectionUtils.convertList(calculateRespBO.getItems(), item -> { + TradeOrderItemDO orderItem = convert(item); + orderItem.setOrderId(tradeOrderDO.getId()); + orderItem.setUserId(tradeOrderDO.getUserId()); + orderItem.setAfterSaleStatus(TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); + orderItem.setCommentStatus(false); + return orderItem; }); } + TradeOrderItemDO convert(TradePriceCalculateRespBO.OrderItem item); @Mapping(source = "userId" , target = "userId") PriceCalculateReqDTO convert(AppTradeOrderCreateReqVO createReqVO, Long userId); @@ -87,19 +84,20 @@ public interface TradeOrderConvert { ProductSkuUpdateStockReqDTO.Item convert(TradeOrderItemDO bean); List convertList(List list); - default PayOrderCreateReqDTO convert(TradeOrderDO tradeOrderDO, List tradeOrderItemDOs, - List spus, TradeOrderProperties tradeOrderProperties) { + default PayOrderCreateReqDTO convert(TradeOrderDO order, List orderItems, + TradePriceCalculateRespBO calculateRespBO, TradeOrderProperties orderProperties) { PayOrderCreateReqDTO createReqDTO = new PayOrderCreateReqDTO() - .setAppId(tradeOrderProperties.getAppId()).setUserIp(tradeOrderDO.getUserIp()); + .setAppId(orderProperties.getAppId()).setUserIp(order.getUserIp()); // 商户相关字段 - createReqDTO.setMerchantOrderId(String.valueOf(tradeOrderDO.getId())); - String subject = spus.get(0).getName(); - if (spus.size() > 1) { + createReqDTO.setMerchantOrderId(String.valueOf(order.getId())); + String subject = calculateRespBO.getItems().get(0).getSpuName(); + if (calculateRespBO.getItems().size() > 1) { subject += " 等多件"; } createReqDTO.setSubject(subject); + createReqDTO.setBody(subject); // TODO 芋艿:临时写死 // 订单相关字段 - createReqDTO.setAmount(tradeOrderDO.getPayPrice()).setExpireTime(addTime(tradeOrderProperties.getExpireTime())); + createReqDTO.setAmount(order.getPayPrice()).setExpireTime(addTime(orderProperties.getExpireTime())); return createReqDTO; } @@ -113,6 +111,7 @@ public interface TradeOrderConvert { .collect(Collectors.toSet()); } + // TODO 芋艿:可简化 default PageResult convertPage(PageResult pageResult, List orderItems, List propertyValueDetails) { Map> orderItemMap = convertMultiMap(orderItems, TradeOrderItemDO::getOrderId); @@ -149,6 +148,7 @@ public interface TradeOrderConvert { TradeOrderPageItemRespVO convert(TradeOrderDO order, List items); ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean); + // TODO 芋艿:可简化 default TradeOrderDetailRespVO convert(TradeOrderDO order, List orderItems, List propertyValueDetails, MemberUserRespDTO user) { TradeOrderDetailRespVO orderVO = convert2(order, orderItems); @@ -179,6 +179,7 @@ public interface TradeOrderConvert { TradeOrderDetailRespVO convert2(TradeOrderDO order, List items); MemberUserRespVO convert(MemberUserRespDTO bean); + // TODO 芋艿:可简化 default PageResult convertPage02(PageResult pageResult, List orderItems, List propertyValueDetails) { Map> orderItemMap = convertMultiMap(orderItems, TradeOrderItemDO::getOrderId); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java index 323389c94..3f071ae2f 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java @@ -166,12 +166,25 @@ public class TradeOrderItemDO extends BaseDO { * 关联 ProductPropertyDO 的 id 编号 */ private Long propertyId; + /** + * 属性名字 + * + * 关联 ProductPropertyDO 的 name 字段 + */ + private String propertyName; + /** * 属性值编号 * * 关联 ProductPropertyValueDO 的 id 编号 */ private Long valueId; + /** + * 属性值名字 + * + * 关联 ProductPropertyValueDO 的 name 字段 + */ + private String valueName; } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java index f60b95899..8e75dd985 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java @@ -1,13 +1,13 @@ package cn.iocoder.yudao.module.trade.service.order; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.TerminalEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.member.api.address.AddressApi; import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; @@ -18,15 +18,9 @@ import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; -import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; -import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; -import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; -import cn.iocoder.yudao.module.promotion.api.price.PriceApi; -import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; @@ -40,6 +34,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; 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.delivery.DeliveryTypeEnum; 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; @@ -55,7 +50,8 @@ 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.*; +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.module.pay.enums.ErrorCodeConstants.PAY_ORDER_NOT_FOUND; import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; @@ -79,13 +75,9 @@ public class TradeOrderServiceImpl implements TradeOrderService { @Resource private TradePriceService tradePriceService; - @Resource - private PriceApi priceApi; @Resource private ProductSkuApi productSkuApi; @Resource - private ProductSpuApi productSpuApi; - @Resource private PayOrderApi payOrderApi; @Resource private AddressApi addressApi; @@ -142,53 +134,29 @@ public class TradeOrderServiceImpl implements TradeOrderService { // 2. 计算价格 TradePriceCalculateReqBO calculateReqBO = TradeOrderConvert.INSTANCE.convert(userId, settlementReqVO, cartList); + calculateReqBO.getItems().forEach(item -> Assert.isTrue(item.getSelected(), // 防御性编程,保证都是选中的 + "商品({}) 未设置为选中", item.getSkuId())); return tradePriceService.calculatePrice(calculateReqBO); } @Override @Transactional(rollbackFor = Exception.class) public Long createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) { - // 商品 SKU 检查:可售状态、库存 -// List skus = validateSkuSaleable(createReqVO.getItems()); // TODO 芋艿,临时关闭。 - List skus = null; - // 商品 SPU 检查:可售状态 - List spus = validateSpuSaleable(convertSet(skus, ProductSkuRespDTO::getSpuId)); - // 用户收件地址的校验 + // 1. 用户收件地址的校验 AddressRespDTO address = validateAddress(userId, createReqVO.getAddressId()); - // 价格计算 - PriceCalculateRespDTO priceResp = priceApi.calculatePrice(TradeOrderConvert.INSTANCE.convert(createReqVO, userId)); + // 2. 价格计算 + TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO); - // 插入 TradeOrderDO 订单 - TradeOrderDO tradeOrderDO = createTradeOrder(userId, userIp, createReqVO, priceResp.getOrder(), address); - // 插入 TradeOrderItemDO 订单项 - List tradeOrderItems = createTradeOrderItems(tradeOrderDO, priceResp.getOrder().getItems(), skus); + // 3.1 插入 TradeOrderDO 订单 + TradeOrderDO order = createTradeOrder(userId, userIp, createReqVO, calculateRespBO, address); + // 3.2 插入 TradeOrderItemDO 订单项 + List orderItems = createTradeOrderItems(order, calculateRespBO); // 订单创建完后的逻辑 - afterCreateTradeOrder(userId, createReqVO, tradeOrderDO, tradeOrderItems, spus); + afterCreateTradeOrder(userId, createReqVO, order, orderItems, calculateRespBO); // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来! - return tradeOrderDO.getId(); - } - - /** - * 校验商品 SPU 是否可出售 - * - * @param spuIds 商品 SPU 编号数组 - * @return 商品 SPU 数组 - */ - private List validateSpuSaleable(Set spuIds) { - List spus = productSpuApi.getSpuList(spuIds); - // SPU 不存在 - if (spus.size() != spuIds.size()) { - throw exception(ORDER_CREATE_SPU_NOT_FOUND); - } - // 校验是否存在禁用的 SPU - ProductSpuRespDTO spu = CollectionUtils.findFirst(spus, - spuDTO -> ObjectUtil.notEqual(ProductSpuStatusEnum.ENABLE.getStatus(), spuDTO.getStatus())); - if (spu != null) { - throw exception(ErrorCodeConstants.ORDER_CREATE_SPU_NOT_SALE); - } - return spus; + return order.getId(); } /** @@ -200,33 +168,35 @@ public class TradeOrderServiceImpl implements TradeOrderService { */ private AddressRespDTO validateAddress(Long userId, Long addressId) { AddressRespDTO address = addressApi.getAddress(addressId, userId); - if (Objects.isNull(address)) { + if (address == null) { throw exception(ErrorCodeConstants.ORDER_CREATE_ADDRESS_NOT_FOUND); } return address; } private TradeOrderDO createTradeOrder(Long userId, String clientIp, AppTradeOrderCreateReqVO createReqVO, - PriceCalculateRespDTO.Order order, AddressRespDTO address) { - TradeOrderDO tradeOrderDO = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, order, address); - tradeOrderDO.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的; - tradeOrderDO.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); - tradeOrderDO.setType(TradeOrderTypeEnum.NORMAL.getType()); - tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); - tradeOrderDO.setProductCount(getSumValue(order.getItems(), PriceCalculateRespDTO.OrderItem::getCount, Integer::sum)); - tradeOrderDO.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源? - tradeOrderDO.setAdjustPrice(0).setPayed(false); // 支付信息 - tradeOrderDO.setDeliveryStatus(TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus()); // 物流信息 - tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); // 退款信息 - tradeOrderMapper.insert(tradeOrderDO); - return tradeOrderDO; + TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address) { + TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO, address); + order.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的; + order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); + order.setType(TradeOrderTypeEnum.NORMAL.getType()); + order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); + order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum)); + order.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源? + // 支付信息 + order.setAdjustPrice(0).setPayed(false); + // 物流信息 TODO 芋艿:暂时写死物流方式;应该是前端选择的 + order.setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode()).setDeliveryStatus(TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus()); + // 退款信息 + order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()).setRefundPrice(0); + tradeOrderMapper.insert(order); + return order; } - private List createTradeOrderItems(TradeOrderDO tradeOrderDO, - List orderItems, List skus) { - List tradeOrderItemDOs = TradeOrderConvert.INSTANCE.convertList(tradeOrderDO, orderItems, skus); - tradeOrderItemMapper.insertBatch(tradeOrderItemDOs); - return tradeOrderItemDOs; + private List createTradeOrderItems(TradeOrderDO tradeOrderDO, TradePriceCalculateRespBO calculateRespBO) { + List orderItems = TradeOrderConvert.INSTANCE.convertList(tradeOrderDO, calculateRespBO); + tradeOrderItemMapper.insertBatch(orderItems); + return orderItems; } /** @@ -237,12 +207,13 @@ public class TradeOrderServiceImpl implements TradeOrderService { * @param userId 用户编号 * @param createReqVO 创建订单请求 * @param tradeOrderDO 交易订单 + * @param calculateRespBO 订单价格计算结果 */ private void afterCreateTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO, - TradeOrderDO tradeOrderDO, List tradeOrderItemDOs, - List spus) { + TradeOrderDO tradeOrderDO, List orderItems, + TradePriceCalculateRespBO calculateRespBO) { // 下单时扣减商品库存 - productSkuApi.updateSkuStock(new ProductSkuUpdateStockReqDTO(TradeOrderConvert.INSTANCE.convertList(tradeOrderItemDOs))); + productSkuApi.updateSkuStock(new ProductSkuUpdateStockReqDTO(TradeOrderConvert.INSTANCE.convertList(orderItems))); // 删除购物车商品 TODO 芋艿:待实现 @@ -255,20 +226,19 @@ public class TradeOrderServiceImpl implements TradeOrderService { } // 生成预支付 - createPayOrder(tradeOrderDO, tradeOrderItemDOs, spus); + createPayOrder(tradeOrderDO, orderItems, calculateRespBO); // 增加订单日志 TODO 芋艿:待实现 } - private void createPayOrder(TradeOrderDO tradeOrderDO, List tradeOrderItemDOs, - List spus) { + private void createPayOrder(TradeOrderDO order, List orderItems, TradePriceCalculateRespBO calculateRespBO) { // 创建支付单,用于后续的支付 PayOrderCreateReqDTO payOrderCreateReqDTO = TradeOrderConvert.INSTANCE.convert( - tradeOrderDO, tradeOrderItemDOs, spus, tradeOrderProperties); + order, orderItems, calculateRespBO, tradeOrderProperties); Long payOrderId = payOrderApi.createOrder(payOrderCreateReqDTO); // 更新到交易单上 - tradeOrderMapper.updateById(new TradeOrderDO().setId(tradeOrderDO.getId()).setPayOrderId(payOrderId)); + tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId)); } @Override