mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-22 23:31:52 +08:00
mall: 下单的代码 review
This commit is contained in:
parent
952e6aa4a8
commit
67436ea4c6
@ -31,10 +31,11 @@ public interface ProductSkuApi {
|
|||||||
List<ProductSkuRespDTO> getSkuList(Collection<Long> ids);
|
List<ProductSkuRespDTO> getSkuList(Collection<Long> ids);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量扣减sku库存
|
* 批量扣减 SKU 库存
|
||||||
*
|
*
|
||||||
* @param batchReqDTO sku库存信息列表
|
* @param batchReqDTO sku库存信息列表
|
||||||
*/
|
*/
|
||||||
|
// TODO @LeeYan9: decrementSkuStockBatch? 啊哈, 动名词;
|
||||||
void decrementStockBatch(SkuDecrementStockBatchReqDTO batchReqDTO);
|
void decrementStockBatch(SkuDecrementStockBatchReqDTO batchReqDTO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import lombok.NoArgsConstructor;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* TODO @LeeYan9: 1) 类注释; 2) Product 开头哈;
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-08-26
|
* @since 2022-08-26
|
||||||
*/
|
*/
|
||||||
@ -15,7 +16,7 @@ import java.util.List;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class SkuDecrementStockBatchReqDTO {
|
public class SkuDecrementStockBatchReqDTO {
|
||||||
|
|
||||||
|
// TODO @LeeYan9: 参数校验
|
||||||
private List<Item> items;
|
private List<Item> items;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -24,6 +25,7 @@ public class SkuDecrementStockBatchReqDTO {
|
|||||||
/**
|
/**
|
||||||
* 商品 SPU 编号,自增
|
* 商品 SPU 编号,自增
|
||||||
*/
|
*/
|
||||||
|
// TODO @LeeYan9: 是不是不用传递哈
|
||||||
private Long productId;
|
private Long productId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,6 +40,7 @@ public class SkuDecrementStockBatchReqDTO {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @LeeYan9: 构造方法, 是不是可以满足啦
|
||||||
public static SkuDecrementStockBatchReqDTO of(List<Item> items) {
|
public static SkuDecrementStockBatchReqDTO of(List<Item> items) {
|
||||||
return new SkuDecrementStockBatchReqDTO(items);
|
return new SkuDecrementStockBatchReqDTO(items);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import lombok.Data;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
// TODO @LeeYan9: ProductSpuRespDTO
|
||||||
/**
|
/**
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-08-26
|
* @since 2022-08-26
|
||||||
|
@ -16,6 +16,7 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* TODO LeeYan9: 类注释;
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-09-06
|
* @since 2022-09-06
|
||||||
*/
|
*/
|
||||||
@ -28,6 +29,7 @@ public class ProductSkuApiImpl implements ProductSkuApi {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SkuInfoRespDTO> getSkusByIds(Collection<Long> skuIds) {
|
public List<SkuInfoRespDTO> getSkusByIds(Collection<Long> skuIds) {
|
||||||
|
// TODO TODO LeeYan9: AllEmpty?
|
||||||
if (CollectionUtils.isAnyEmpty(skuIds)) {
|
if (CollectionUtils.isAnyEmpty(skuIds)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
@ -38,6 +40,7 @@ public class ProductSkuApiImpl implements ProductSkuApi {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void decrementStockBatch(SkuDecrementStockBatchReqDTO batchReqDTO) {
|
public void decrementStockBatch(SkuDecrementStockBatchReqDTO batchReqDTO) {
|
||||||
|
// TODO @LeeYan9: 最好 Service 去 for 循环;
|
||||||
productSkuMapper.decrementStockBatch(batchReqDTO.getItems());
|
productSkuMapper.decrementStockBatch(batchReqDTO.getItems());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,8 @@ import java.util.Collections;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* TODO LeeYan9: 类注释;
|
||||||
|
*
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-09-06
|
* @since 2022-09-06
|
||||||
*/
|
*/
|
||||||
@ -26,6 +28,7 @@ public class ProductSpuApiImpl implements ProductSpuApi {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SpuInfoRespDTO> getSpuList(Collection<Long> spuIds) {
|
public List<SpuInfoRespDTO> getSpuList(Collection<Long> spuIds) {
|
||||||
|
// TODO TODO LeeYan9: AllEmpty?
|
||||||
if (CollectionUtils.isAnyEmpty(spuIds)) {
|
if (CollectionUtils.isAnyEmpty(spuIds)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
@ -38,5 +38,4 @@ public interface ProductSkuConvert {
|
|||||||
|
|
||||||
List<SkuInfoRespDTO> convertList03(List<ProductSkuDO> list);
|
List<SkuInfoRespDTO> convertList03(List<ProductSkuDO> list);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,5 @@ public interface ProductSpuConvert {
|
|||||||
AppSpuPageRespVO convertAppResp(ProductSpuDO list);
|
AppSpuPageRespVO convertAppResp(ProductSpuDO list);
|
||||||
|
|
||||||
List<SpuInfoRespDTO> convertList2(List<ProductSpuDO> list);
|
List<SpuInfoRespDTO> convertList2(List<ProductSpuDO> list);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,16 +23,13 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
@Api(tags = "用户 App - 交易订单")
|
@Api(tags = "用户 App - 交易订单")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/trade/order")
|
@RequestMapping("/trade/order")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor // TODO @LeeYan9: 先统一使用 @Resource 注入哈; 项目只有三层, 依赖注入会存在, 所以使用 @Resource; 也因此, 最好全局保持一致
|
||||||
@Validated
|
@Validated
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AppTradeOrderController {
|
public class AppTradeOrderController {
|
||||||
|
|
||||||
// TODO 在思考下;
|
|
||||||
|
|
||||||
private final TradeOrderService tradeOrderService;
|
private final TradeOrderService tradeOrderService;
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/get-create-info")
|
@GetMapping("/get-create-info")
|
||||||
@ApiOperation("基于商品,确认创建订单")
|
@ApiOperation("基于商品,确认创建订单")
|
||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
@ -46,15 +43,12 @@ public class AppTradeOrderController {
|
|||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
public CommonResult<Long> createTradeOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO,
|
public CommonResult<Long> createTradeOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO,
|
||||||
HttpServletRequest servletRequest) {
|
HttpServletRequest servletRequest) {
|
||||||
// return success(tradeOrderService.createTradeOrder(UserSecurityContextHolder.getUserId(),
|
|
||||||
// HttpUtil.getIp(servletRequest), createReqVO));
|
|
||||||
// 获取登录用户
|
// 获取登录用户
|
||||||
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
// 获取用户ip地址
|
// 获取用户ip地址
|
||||||
String clientIp = ServletUtil.getClientIP(servletRequest);
|
String clientIp = ServletUtil.getClientIP(servletRequest);
|
||||||
// 创建交易订单,预支付记录
|
// 创建交易订单,预支付记录
|
||||||
Long result = tradeOrderService.createTradeOrder(loginUserId, clientIp, createReqVO);
|
Long result = tradeOrderService.createTradeOrder(loginUserId, clientIp, createReqVO);
|
||||||
|
|
||||||
return CommonResult.success(result);
|
return CommonResult.success(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,16 +8,11 @@ import org.mapstruct.Mapping;
|
|||||||
import org.mapstruct.Mappings;
|
import org.mapstruct.Mappings;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author LeeYan9
|
|
||||||
* @since 2022-08-26
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface TradeOrderConvert {
|
public interface TradeOrderConvert {
|
||||||
|
|
||||||
TradeOrderConvert INSTANCE = Mappers.getMapper(TradeOrderConvert.class);
|
TradeOrderConvert INSTANCE = Mappers.getMapper(TradeOrderConvert.class);
|
||||||
|
|
||||||
|
|
||||||
@Mappings({
|
@Mappings({
|
||||||
@Mapping(source = "order.couponId", target = "couponId"),
|
@Mapping(source = "order.couponId", target = "couponId"),
|
||||||
@Mapping(target = "remark", ignore = true),
|
@Mapping(target = "remark", ignore = true),
|
||||||
@ -25,4 +20,5 @@ public interface TradeOrderConvert {
|
|||||||
@Mapping(source = "createVO.addressId", target = "receiverAreaId")
|
@Mapping(source = "createVO.addressId", target = "receiverAreaId")
|
||||||
})
|
})
|
||||||
TradeOrderDO convert(AppTradeOrderCreateReqVO createVO, PriceCalculateRespDTO.Order order);
|
TradeOrderDO convert(AppTradeOrderCreateReqVO createVO, PriceCalculateRespDTO.Order order);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,18 +7,11 @@ import org.mapstruct.factory.Mappers;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author LeeYan9
|
|
||||||
* @since 2022-08-26
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface TradeOrderItemConvert {
|
public interface TradeOrderItemConvert {
|
||||||
|
|
||||||
TradeOrderItemConvert INSTANCE = Mappers.getMapper(TradeOrderItemConvert.class);
|
TradeOrderItemConvert INSTANCE = Mappers.getMapper(TradeOrderItemConvert.class);
|
||||||
|
|
||||||
/**
|
|
||||||
* @param items sku列表价格
|
|
||||||
* @return 订单项
|
|
||||||
*/
|
|
||||||
List<TradeOrderItemDO> convertList(List<PriceCalculateRespDTO.OrderItem> items);
|
List<TradeOrderItemDO> convertList(List<PriceCalculateRespDTO.OrderItem> items);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,10 +11,6 @@ import org.mapstruct.factory.Mappers;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author LeeYan9
|
|
||||||
* @since 2022-08-26
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface PayOrderConvert {
|
public interface PayOrderConvert {
|
||||||
|
|
||||||
@ -30,4 +26,5 @@ public interface PayOrderConvert {
|
|||||||
default Date convertCreateTimeToPayExpireTime(Date cancelTime) {
|
default Date convertCreateTimeToPayExpireTime(Date cancelTime) {
|
||||||
return DateUtil.offsetMinute(new Date(), 30);
|
return DateUtil.offsetMinute(new Date(), 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,6 @@ import org.mapstruct.Mapping;
|
|||||||
import org.mapstruct.Mappings;
|
import org.mapstruct.Mappings;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author LeeYan9
|
|
||||||
* @since 2022-08-26
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface PriceConvert {
|
public interface PriceConvert {
|
||||||
|
|
||||||
@ -19,5 +15,6 @@ public interface PriceConvert {
|
|||||||
@Mappings(
|
@Mappings(
|
||||||
@Mapping(source = "userId" , target = "userId")
|
@Mapping(source = "userId" , target = "userId")
|
||||||
)
|
)
|
||||||
PriceCalculateReqDTO convert(AppTradeOrderCreateReqVO createReqVO , Long userId);
|
PriceCalculateReqDTO convert(AppTradeOrderCreateReqVO createReqVO, Long userId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,5 +17,6 @@ public interface ProductSkuConvert {
|
|||||||
|
|
||||||
ProductSkuConvert INSTANCE = Mappers.getMapper(ProductSkuConvert.class);
|
ProductSkuConvert INSTANCE = Mappers.getMapper(ProductSkuConvert.class);
|
||||||
|
|
||||||
List<SkuDecrementStockBatchReqDTO.Item> convert(List<TradeOrderItemDO> tradeOrderItems);
|
List<SkuDecrementStockBatchReqDTO.Item> convert(List<TradeOrderItemDO> list);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|||||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author LeeYan9
|
|
||||||
* @since 2022-08-26
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
|
public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|||||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author LeeYan9
|
|
||||||
* @since 2022-08-26
|
|
||||||
*/
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface TradeOrderItemMapper extends BaseMapperX<TradeOrderItemDO> {
|
public interface TradeOrderItemMapper extends BaseMapperX<TradeOrderItemDO> {
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.framework.order.config;
|
|||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
// TODO @LeeYan9: 可以直接给 TradeOrderProperties 一个 @Component生效哈
|
||||||
/**
|
/**
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-09-15
|
* @since 2022-09-15
|
||||||
|
@ -3,15 +3,16 @@ package cn.iocoder.yudao.module.trade.service.order;
|
|||||||
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
|
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* TODO @LeeYan9: 类注释
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-08-26
|
* @since 2022-08-26
|
||||||
*/
|
*/
|
||||||
public interface TradeOrderService {
|
public interface TradeOrderService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建交易订单
|
* 创建交易订单 TODO @LeeYan9: 方法注释, 和参数要空一行
|
||||||
* @param loginUserId 登录用户
|
* @param loginUserId 登录用户
|
||||||
* @param clientIp 用户ip地址
|
* @param clientIp 用户ip地址 // TODO @LeeYan9: 中英文之间, 空一行哈
|
||||||
* @param createReqVO 创建交易订单请求模型
|
* @param createReqVO 创建交易订单请求模型
|
||||||
* @return 交易订单创建结果
|
* @return 交易订单创建结果
|
||||||
*/
|
*/
|
||||||
|
@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.service.order;
|
|||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.text.StrBuilder;
|
import cn.hutool.core.text.StrBuilder;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
|
import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
|
||||||
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
|
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
|
||||||
@ -45,42 +46,41 @@ import java.util.Map;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* TODO @LeeYan9: 注释
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-08-26
|
* @since 2022-08-26
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class TradeOrderServiceImpl implements TradeOrderService {
|
public class TradeOrderServiceImpl implements TradeOrderService {
|
||||||
|
|
||||||
|
// TODO @LeeYan9: 相同类型的, 可以放在一起,不用空行; 例如说 Mapper 和 API 和 Properties
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private TradeOrderMapper tradeOrderMapper;
|
private TradeOrderMapper tradeOrderMapper;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private TradeOrderItemMapper tradeOrderItemMapper;
|
private TradeOrderItemMapper tradeOrderItemMapper;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private PriceApi priceApi;
|
private PriceApi priceApi;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ProductSkuApi productSkuApi;
|
private ProductSkuApi productSkuApi;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private ProductSpuApi productSpuApi;
|
private ProductSpuApi productSpuApi;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private PayOrderApi payOrderApi;
|
private PayOrderApi payOrderApi;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private TradeOrderProperties tradeOrderProperties;
|
private TradeOrderProperties tradeOrderProperties;
|
||||||
|
|
||||||
|
// TODO LeeYan9: 静态变量, 需要在最前面哈; 另外, 静态变量的注释最好写下;
|
||||||
private static final String BLANK_PLACEHOLDER = " ";
|
private static final String BLANK_PLACEHOLDER = " ";
|
||||||
private static final String MULTIPLIER_PLACEHOLDER = "x";
|
private static final String MULTIPLIER_PLACEHOLDER = "x";
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO) {
|
public Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO) {
|
||||||
|
|
||||||
List<Item> items = createReqVO.getItems();
|
List<Item> items = createReqVO.getItems(); // TODO @LeeYan9: 方法第一行, 不用空哈;
|
||||||
// 商品SKU检查 sku可售状态,库存
|
// 商品SKU检查 sku可售状态,库存
|
||||||
List<ProductSkuRespDTO> skuInfos = productSkuApi.getSkuList(CollectionUtils.convertSet(items, Item::getSkuId));
|
List<ProductSkuRespDTO> skuInfos = productSkuApi.getSkuList(CollectionUtils.convertSet(items, Item::getSkuId));
|
||||||
Map<Long, ProductSkuRespDTO> skuInfoMap = CollectionUtils.convertMap(skuInfos, ProductSkuRespDTO::getId);
|
Map<Long, ProductSkuRespDTO> skuInfoMap = CollectionUtils.convertMap(skuInfos, ProductSkuRespDTO::getId);
|
||||||
@ -93,33 +93,38 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|||||||
// 价格计算
|
// 价格计算
|
||||||
PriceCalculateReqDTO priceCalculateReqDTO = PriceConvert.INSTANCE.convert(createReqVO, loginUserId);
|
PriceCalculateReqDTO priceCalculateReqDTO = PriceConvert.INSTANCE.convert(createReqVO, loginUserId);
|
||||||
PriceCalculateRespDTO priceResp = priceApi.calculatePrice(priceCalculateReqDTO);
|
PriceCalculateRespDTO priceResp = priceApi.calculatePrice(priceCalculateReqDTO);
|
||||||
|
// TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来!
|
||||||
|
|
||||||
// 订单信息记录
|
// 订单信息记录
|
||||||
TradeOrderDO tradeOrderDO = TradeOrderConvert.INSTANCE.convert(createReqVO, priceResp.getOrder());
|
TradeOrderDO tradeOrderDO = TradeOrderConvert.INSTANCE.convert(createReqVO, priceResp.getOrder());
|
||||||
fillTradeOrderInfoFromReqInfo(tradeOrderDO,createReqVO,loginUserId, clientIp);
|
fillTradeOrderInfoFromReqInfo(tradeOrderDO,createReqVO,loginUserId, clientIp); // TODO @LeeYan9: tradeOrderDO, createReqVO, loginUserId, clientIp
|
||||||
tradeOrderMapper.insert(tradeOrderDO);
|
tradeOrderMapper.insert(tradeOrderDO);
|
||||||
|
|
||||||
// 订单项信息记录
|
// 订单项信息记录
|
||||||
List<TradeOrderItemDO> tradeOrderItems = TradeOrderItemConvert.INSTANCE.convertList(priceResp.getOrder().getItems());
|
List<TradeOrderItemDO> tradeOrderItems = TradeOrderItemConvert.INSTANCE.convertList(priceResp.getOrder().getItems());
|
||||||
//-填充订单项-SKU信息
|
// 填充订单项-SKU信息
|
||||||
fillItemsInfoFromSkuAndOrder(tradeOrderDO, tradeOrderItems, skuInfoMap);
|
fillItemsInfoFromSkuAndOrder(tradeOrderDO, tradeOrderItems, skuInfoMap);
|
||||||
tradeOrderItemMapper.insertBatch(tradeOrderItems);
|
tradeOrderItemMapper.insertBatch(tradeOrderItems);
|
||||||
|
|
||||||
|
// TODO @LeeYan9: 先扣减库存哈; 可能会扣减失败; 毕竟 get 和 update 之间, 会有并发的可能性
|
||||||
// 库存扣减
|
// 库存扣减
|
||||||
List<SkuDecrementStockBatchReqDTO.Item> skuDecrementStockItems = ProductSkuConvert.INSTANCE.convert(tradeOrderItems);
|
List<SkuDecrementStockBatchReqDTO.Item> skuDecrementStockItems = ProductSkuConvert.INSTANCE.convert(tradeOrderItems);
|
||||||
productSkuApi.decrementStockBatch(SkuDecrementStockBatchReqDTO.of(skuDecrementStockItems));
|
productSkuApi.decrementStockBatch(SkuDecrementStockBatchReqDTO.of(skuDecrementStockItems));
|
||||||
|
|
||||||
// 构建预支付请求参数
|
// 构建预支付请求参数
|
||||||
|
// TODO @LeeYan9: 需要更新到订单上
|
||||||
PayOrderInfoCreateReqDTO payOrderCreateReqDTO = PayOrderConvert.INSTANCE.convert(tradeOrderDO);
|
PayOrderInfoCreateReqDTO payOrderCreateReqDTO = PayOrderConvert.INSTANCE.convert(tradeOrderDO);
|
||||||
fillPayOrderInfoFromItems(payOrderCreateReqDTO, tradeOrderItems);
|
fillPayOrderInfoFromItems(payOrderCreateReqDTO, tradeOrderItems);
|
||||||
// 生成预支付
|
// 生成预支付
|
||||||
return payOrderApi.createPayOrder(payOrderCreateReqDTO);
|
return payOrderApi.createPayOrder(payOrderCreateReqDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @LeeYan9: 填充就好, 不用 from 哈;
|
||||||
private void fillTradeOrderInfoFromReqInfo(TradeOrderDO tradeOrderDO, AppTradeOrderCreateReqVO createReqVO,
|
private void fillTradeOrderInfoFromReqInfo(TradeOrderDO tradeOrderDO, AppTradeOrderCreateReqVO createReqVO,
|
||||||
Long loginUserId, String clientIp) {
|
Long loginUserId, String clientIp) {
|
||||||
tradeOrderDO.setUserId(loginUserId);
|
tradeOrderDO.setUserId(loginUserId);
|
||||||
tradeOrderDO.setUserIp(clientIp);
|
tradeOrderDO.setUserIp(clientIp);
|
||||||
tradeOrderDO.setSn(IdUtil.getSnowflakeNextId() + "");
|
tradeOrderDO.setSn(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的;
|
||||||
tradeOrderDO.setStatus(TradeOrderStatusEnum.WAITING_PAYMENT.getStatus());
|
tradeOrderDO.setStatus(TradeOrderStatusEnum.WAITING_PAYMENT.getStatus());
|
||||||
tradeOrderDO.setType(TradeOrderTypeEnum.NORMAL.getType());
|
tradeOrderDO.setType(TradeOrderTypeEnum.NORMAL.getType());
|
||||||
tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
|
tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
|
||||||
@ -139,7 +144,6 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|||||||
// 填写商品信息
|
// 填写商品信息
|
||||||
StrBuilder subject = new StrBuilder();
|
StrBuilder subject = new StrBuilder();
|
||||||
StrBuilder body = new StrBuilder();
|
StrBuilder body = new StrBuilder();
|
||||||
|
|
||||||
for (TradeOrderItemDO tradeOrderItem : tradeOrderItems) {
|
for (TradeOrderItemDO tradeOrderItem : tradeOrderItems) {
|
||||||
// append subject
|
// append subject
|
||||||
subject.append(BLANK_PLACEHOLDER);
|
subject.append(BLANK_PLACEHOLDER);
|
||||||
@ -151,6 +155,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|||||||
body.append(tradeOrderItem.getCount());
|
body.append(tradeOrderItem.getCount());
|
||||||
}
|
}
|
||||||
// 设置 subject & body
|
// 设置 subject & body
|
||||||
|
// TODO @LeeYan9: 可以抽象一个 StrUtils 方法; 或者看看 hutool 有没自带的哈
|
||||||
payOrderInfoCreateReqDTO.setSubject(StrUtils.maxLength(subject.subString(1), 32));
|
payOrderInfoCreateReqDTO.setSubject(StrUtils.maxLength(subject.subString(1), 32));
|
||||||
payOrderInfoCreateReqDTO.setBody(StrUtils.maxLength(body.subString(1), 128));
|
payOrderInfoCreateReqDTO.setBody(StrUtils.maxLength(body.subString(1), 128));
|
||||||
}
|
}
|
||||||
@ -182,6 +187,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO @LeeYan9: checkSpuXXX 会不会好点哈? ps: 这个貌似是 sku 哈
|
||||||
private void checkSaleableAndStockFromSpu(Map<Long, ProductSkuRespDTO> skuInfoMap,
|
private void checkSaleableAndStockFromSpu(Map<Long, ProductSkuRespDTO> skuInfoMap,
|
||||||
List<Item> items) {
|
List<Item> items) {
|
||||||
// sku 不存在
|
// sku 不存在
|
||||||
|
@ -30,6 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
// TODO @芋艿: 单测的 review; 最后搞;
|
||||||
/**
|
/**
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-09-07
|
* @since 2022-09-07
|
||||||
|
@ -3,12 +3,13 @@ package cn.iocoder.yudao.module.pay.api.order;
|
|||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 支付单 API 接口
|
||||||
|
*
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
* @since 2022-08-26
|
* @since 2022-08-26
|
||||||
*/
|
*/
|
||||||
public interface PayOrderApi {
|
public interface PayOrderApi {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建支付单
|
* 创建支付单
|
||||||
*
|
*
|
||||||
|
@ -9,8 +9,10 @@ import javax.validation.constraints.NotNull;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
// TODO @LeeYan9: 1) 新建一个 dto 包, 然后挪进去哈; 2) 在 order下; Info 可以去掉;
|
||||||
/**
|
/**
|
||||||
* 支付单创建 Request DTO
|
* 支付单创建 Request DTO
|
||||||
|
*
|
||||||
* @author LeeYan9
|
* @author LeeYan9
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@ -53,6 +55,7 @@ public class PayOrderInfoCreateReqDTO implements Serializable {
|
|||||||
* 支付金额,单位:分
|
* 支付金额,单位:分
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "支付金额不能为空")
|
@NotNull(message = "支付金额不能为空")
|
||||||
|
// TODO @LeeYan9: 是不是 @Min 注解呀, 是 Integer 哈
|
||||||
@DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
|
@DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
|
||||||
private Integer amount;
|
private Integer amount;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user