Search in sources :

Example 1 with OrderVO

use of com.wayn.common.core.domain.vo.OrderVO in project waynboot-mall by wayn111.

the class OrderServiceImpl method asyncSubmit.

@Override
public R asyncSubmit(OrderVO orderVO) {
    OrderDTO orderDTO = new OrderDTO();
    MyBeanUtil.copyProperties(orderVO, orderDTO);
    Long userId = orderDTO.getUserId();
    // 获取用户订单商品,为空默认取购物车已选中商品
    List<Long> cartIdArr = orderDTO.getCartIdArr();
    List<Cart> checkedGoodsList;
    if (CollectionUtils.isEmpty(cartIdArr)) {
        checkedGoodsList = iCartService.list(new QueryWrapper<Cart>().eq("checked", true).eq("user_id", userId));
    } else {
        checkedGoodsList = iCartService.listByIds(cartIdArr);
    }
    List<Long> goodsIds = checkedGoodsList.stream().map(Cart::getGoodsId).collect(Collectors.toList());
    List<GoodsProduct> goodsProducts = iGoodsProductService.list(new QueryWrapper<GoodsProduct>().in("goods_id", goodsIds));
    Map<Long, GoodsProduct> goodsIdMap = goodsProducts.stream().collect(Collectors.toMap(GoodsProduct::getId, goodsProduct -> goodsProduct));
    // 商品货品数量减少
    for (Cart checkGoods : checkedGoodsList) {
        Long productId = checkGoods.getProductId();
        Long goodsId = checkGoods.getGoodsId();
        GoodsProduct product = goodsIdMap.get(productId);
        int remainNumber = product.getNumber() - checkGoods.getNumber();
        if (remainNumber < 0) {
            Goods goods = iGoodsService.getById(goodsId);
            String goodsName = goods.getName();
            String[] specifications = product.getSpecifications();
            throw new BusinessException(String.format("%s,%s 库存不足", goodsName, StringUtils.join(specifications, " ")));
        }
        if (!iGoodsProductService.reduceStock(productId, checkGoods.getNumber())) {
            throw new BusinessException("商品货品库存减少失败");
        }
    }
    // 商品费用
    BigDecimal checkedGoodsPrice = new BigDecimal("0.00");
    for (Cart checkGoods : checkedGoodsList) {
        checkedGoodsPrice = checkedGoodsPrice.add(checkGoods.getPrice().multiply(new BigDecimal(checkGoods.getNumber())));
    }
    // 根据订单商品总价计算运费,满足条件(例如88元)则免运费,否则需要支付运费(例如8元);
    BigDecimal freightPrice = new BigDecimal("0.00");
    /*if (checkedGoodsPrice.compareTo(SystemConfig.getFreightLimit()) < 0) {
            freightPrice = SystemConfig.getFreight();
        }*/
    // 可以使用的其他钱,例如用户积分
    BigDecimal integralPrice = new BigDecimal("0.00");
    // 优惠卷抵扣费用
    BigDecimal couponPrice = new BigDecimal("0.00");
    // 团购抵扣费用
    BigDecimal grouponPrice = new BigDecimal("0.00");
    // 订单费用
    BigDecimal orderTotalPrice = checkedGoodsPrice.add(freightPrice).subtract(couponPrice).max(new BigDecimal("0.00"));
    // 最终支付费用
    BigDecimal actualPrice = orderTotalPrice.subtract(integralPrice);
    String orderSn = OrderSnGenUtil.generateOrderSn(userId);
    orderDTO.setOrderSn(orderSn);
    // 异步下单
    String uid = IdUtil.getUid();
    System.out.println(uid);
    CorrelationData correlationData = new CorrelationData(uid);
    Map<String, Object> map = new HashMap<>();
    map.put("order", orderDTO);
    map.put("notifyUrl", WaynConfig.getMobileUrl() + "/message/order/submit");
    try {
        Message message = MessageBuilder.withBody(JSON.toJSONString(map).getBytes(Constants.UTF_ENCODING)).setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN).setDeliveryMode(MessageDeliveryMode.PERSISTENT).build();
        rabbitTemplate.convertAndSend(SysConstants.ORDER_DIRECT_EXCHANGE, SysConstants.ORDER_DIRECT_ROUTING, message, correlationData);
    } catch (UnsupportedEncodingException e) {
        log.error(e.getMessage(), e);
    }
    return R.success().add("actualPrice", actualPrice).add("orderSn", orderSn);
}
Also used : RedisCache(com.wayn.data.redis.manager.RedisCache) MessageBuilder(org.springframework.amqp.core.MessageBuilder) MessageDeliveryMode(org.springframework.amqp.core.MessageDeliveryMode) WxPayMpOrderResult(com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult) Cart(com.wayn.mobile.api.domain.Cart) OrderUtil(com.wayn.common.core.util.OrderUtil) LambdaQueryWrapper(com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper) BeanUtil(cn.hutool.core.bean.BeanUtil) StringUtils(org.apache.commons.lang3.StringUtils) OrderUnpaidTask(com.wayn.mobile.api.task.OrderUnpaidTask) BigDecimal(java.math.BigDecimal) WxPayUnifiedOrderRequest(com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest) AlipayConfig(com.wayn.common.config.AlipayConfig) ServiceImpl(com.baomidou.mybatisplus.extension.service.impl.ServiceImpl) QueryWrapper(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) Wrappers(com.baomidou.mybatisplus.core.toolkit.Wrappers) WxPayService(com.github.binarywang.wxpay.service.WxPayService) com.wayn.common.core.domain.shop(com.wayn.common.core.domain.shop) MobileSecurityUtils(com.wayn.mobile.framework.security.util.MobileSecurityUtils) SysConstants(com.wayn.message.core.constant.SysConstants) R(com.wayn.common.util.R) OrderSnGenUtil(com.wayn.mobile.api.util.OrderSnGenUtil) Collectors(java.util.stream.Collectors) ReturnCodeEnum(com.wayn.common.enums.ReturnCodeEnum) MyBeanUtil(com.wayn.common.util.bean.MyBeanUtil) IOUtils(org.apache.commons.io.IOUtils) OrderGoodsVO(com.wayn.common.core.domain.vo.order.OrderGoodsVO) Slf4j(lombok.extern.slf4j.Slf4j) PayTypeEnum(com.wayn.common.enums.PayTypeEnum) Constants(com.wayn.common.constant.Constants) BusinessException(com.wayn.common.exception.BusinessException) IPage(com.baomidou.mybatisplus.core.metadata.IPage) OrderVO(com.wayn.common.core.domain.vo.OrderVO) UnsupportedEncodingException(java.io.UnsupportedEncodingException) java.util(java.util) OrderDetailVO(com.wayn.common.core.domain.vo.order.OrderDetailVO) IdUtil(com.wayn.common.util.IdUtil) BaseWxPayResult(com.github.binarywang.wxpay.bean.result.BaseWxPayResult) CorrelationData(org.springframework.amqp.rabbit.connection.CorrelationData) LocalDateTime(java.time.LocalDateTime) IOrderService(com.wayn.mobile.api.service.IOrderService) MessageProperties(org.springframework.amqp.core.MessageProperties) CollectionUtils(org.apache.commons.collections4.CollectionUtils) WaynConfig(com.wayn.common.config.WaynConfig) HttpServletRequest(javax.servlet.http.HttpServletRequest) com.wayn.common.core.service.shop(com.wayn.common.core.service.shop) IpUtils(com.wayn.common.util.ip.IpUtils) Service(org.springframework.stereotype.Service) Message(org.springframework.amqp.core.Message) WxPayConstants(com.github.binarywang.wxpay.constant.WxPayConstants) WxPayOrderNotifyResult(com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult) DefaultAlipayClient(com.alipay.api.DefaultAlipayClient) OrderHandleOption(com.wayn.common.core.util.OrderHandleOption) RabbitTemplate(org.springframework.amqp.rabbit.core.RabbitTemplate) AlipayClient(com.alipay.api.AlipayClient) OrderMapper(com.wayn.mobile.api.mapper.OrderMapper) ICartService(com.wayn.mobile.api.service.ICartService) AlipaySignature(com.alipay.api.internal.util.AlipaySignature) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) WxPayException(com.github.binarywang.wxpay.exception.WxPayException) TaskService(com.wayn.common.task.TaskService) OrderDTO(com.wayn.message.core.messsage.OrderDTO) AlipayTradeWapPayRequest(com.alipay.api.request.AlipayTradeWapPayRequest) WxPayNotifyResponse(com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse) JSON(com.alibaba.fastjson.JSON) AllArgsConstructor(lombok.AllArgsConstructor) AlipayApiException(com.alipay.api.AlipayApiException) Transactional(org.springframework.transaction.annotation.Transactional) Message(org.springframework.amqp.core.Message) LambdaQueryWrapper(com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper) QueryWrapper(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) UnsupportedEncodingException(java.io.UnsupportedEncodingException) BigDecimal(java.math.BigDecimal) BusinessException(com.wayn.common.exception.BusinessException) CorrelationData(org.springframework.amqp.rabbit.connection.CorrelationData) OrderDTO(com.wayn.message.core.messsage.OrderDTO) Cart(com.wayn.mobile.api.domain.Cart)

Aggregations

BeanUtil (cn.hutool.core.bean.BeanUtil)1 JSON (com.alibaba.fastjson.JSON)1 AlipayApiException (com.alipay.api.AlipayApiException)1 AlipayClient (com.alipay.api.AlipayClient)1 DefaultAlipayClient (com.alipay.api.DefaultAlipayClient)1 AlipaySignature (com.alipay.api.internal.util.AlipaySignature)1 AlipayTradeWapPayRequest (com.alipay.api.request.AlipayTradeWapPayRequest)1 LambdaQueryWrapper (com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper)1 QueryWrapper (com.baomidou.mybatisplus.core.conditions.query.QueryWrapper)1 IPage (com.baomidou.mybatisplus.core.metadata.IPage)1 Wrappers (com.baomidou.mybatisplus.core.toolkit.Wrappers)1 ServiceImpl (com.baomidou.mybatisplus.extension.service.impl.ServiceImpl)1 WxPayNotifyResponse (com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse)1 WxPayOrderNotifyResult (com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult)1 WxPayMpOrderResult (com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult)1 WxPayUnifiedOrderRequest (com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest)1 BaseWxPayResult (com.github.binarywang.wxpay.bean.result.BaseWxPayResult)1 WxPayConstants (com.github.binarywang.wxpay.constant.WxPayConstants)1 WxPayException (com.github.binarywang.wxpay.exception.WxPayException)1 WxPayService (com.github.binarywang.wxpay.service.WxPayService)1