package cn.hobbystocks.auc.service.impl; import cn.hobbystocks.auc.common.exception.ServiceException; import cn.hobbystocks.auc.common.utils.DateUtils; import cn.hobbystocks.auc.domain.Auction; import cn.hobbystocks.auc.domain.Lot; import cn.hobbystocks.auc.domain.Order; import cn.hobbystocks.auc.dto.OrderApiResponse; import cn.hobbystocks.auc.dto.SkuOrderDTO; import cn.hobbystocks.auc.forest.OrderApi; import cn.hobbystocks.auc.mapper.OrderMapper; import cn.hobbystocks.auc.service.IAuctionService; import cn.hobbystocks.auc.service.ILotService; import cn.hobbystocks.auc.service.IOrderService; import cn.hobbystocks.auc.vo.OrderVO; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.List; import java.util.Objects; @Service public class OrderServiceImpl extends ServiceImpl implements IOrderService { @Autowired ILotService lotService; @Autowired IAuctionService auctionService; @Resource OrderApi orderApi; @Value("${hobbystocks.host.orderUrl}") private String orderUrl; @Override @Transactional public OrderVO createSkuOrder(Order order) { Lot lot = lotService.selectLotById(order.getLotId()); Auction auction = auctionService.selectAuctionById(lot.getAuctionId()); BigDecimal serviceTariff = lot.getServiceTariff(); Integer payTimeLimit = lot.getPayTimeLimit(); if (serviceTariff == null) { serviceTariff = auction.getServiceTariff(); } if (payTimeLimit == null) { payTimeLimit = auction.getPayTimeLimit(); } if (Objects.isNull(order.getAmount())) { throw new ServiceException("创建订单失败:成交金额为空"); } BigDecimal amount = BigDecimal.valueOf(order.getAmount()); BigDecimal serviceExpense = serviceTariff.multiply(amount) .divide(BigDecimal.valueOf(100), 0, RoundingMode.HALF_UP); order.setServiceExpense(serviceExpense); Date expireTime = DateUtils.addHours(new Date(), payTimeLimit); order.setExpireTime(expireTime); save(order); OrderApiResponse response = orderApi.createSkuOrder(orderUrl, buildSkuOrderDTO(order, lot, auction)); OrderVO orderVO = response.toOrderVO(); order.setOrderId(orderVO.getOrderId()); order.setOrderNo(orderVO.getOrderNo()); order.setStatus(orderVO.getStatus()); updateById(order); return orderVO; } SkuOrderDTO buildSkuOrderDTO(Order order, Lot lot, Auction auction) { SkuOrderDTO skuOrderDTO = new SkuOrderDTO(); skuOrderDTO.setLotId(order.getLotId()); skuOrderDTO.setSpuId(order.getSkuId()); skuOrderDTO.setUserId(order.getUserId()); skuOrderDTO.setAuctionId(lot.getAuctionId()); skuOrderDTO.setAuctionName(auction.getName()); skuOrderDTO.setLotName(lot.getName()); skuOrderDTO.setLotImage(lot.getImgs()); skuOrderDTO.setMerchantId(Objects.isNull(order.getMerchantId()) ? lot.getMerchantId() : order.getMerchantId()); skuOrderDTO.setPaymentAmount(order.getAmount()); skuOrderDTO.setServiceExpense(order.getServiceExpense().longValue()); skuOrderDTO.setTotalAmount(BigDecimal.valueOf(order.getAmount()).add(order.getServiceExpense()).longValue()); skuOrderDTO.setExpireTime(order.getExpireTime()); return skuOrderDTO; } @Override public int modifyOrder(Order order) { return getBaseMapper().updateOrderStatus(order); } @Override public List getOrderListByUserAndAuction(Long auctionId, Integer userId) { return getBaseMapper().selectOrderByAuctionId(auctionId, userId); } }