package cn.hobbystocks.auc.service.impl; import cn.hobbystocks.auc.common.exception.ServiceException; import cn.hobbystocks.auc.domain.Auction; import cn.hobbystocks.auc.domain.DepositOrder; import cn.hobbystocks.auc.domain.Lot; import cn.hobbystocks.auc.dto.DepositRecordDTO; import cn.hobbystocks.auc.dto.DepositOrderDTO; import cn.hobbystocks.auc.forest.OrderApi; import cn.hobbystocks.auc.mapper.DepositOrderMapper; import cn.hobbystocks.auc.request.DepositRecordRequest; import cn.hobbystocks.auc.service.DepositOrderService; import cn.hobbystocks.auc.service.IAuctionService; import cn.hobbystocks.auc.service.ILotService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; import java.util.List; import java.util.Objects; @Service public class DepositOrderServiceImpl extends ServiceImpl implements DepositOrderService { @Autowired ILotService lotService; @Autowired IAuctionService auctionService; @Resource OrderApi orderApi; final String DEPOSIT_ORDER_PRE = "DT"; private static final String DEPOSIT_TYPE_LOT = "拍品"; private static final String DEPOSIT_TYPE_AUCTION = "拍卖会"; private static final Integer DEPOSIT_STATUS_WAITING_PAYMENT = 0; private static final Integer DEPOSIT_STATUS_PAID = 1; @Override @Transactional public int createDepositOrder(DepositOrderDTO depositOrderDTO) { //查询拍品保证金配置 Long lotId = depositOrderDTO.getLotId(); Lot lot = lotService.selectLotById(lotId); Long deposit = lot.getDeposit(); String name= lot.getName(); String depositType=DEPOSIT_TYPE_LOT; if (deposit ==null){ //如果没有拍品保证金配置,创建拍卖会保证金配置 Auction auction = auctionService.selectAuctionById(lot.getAuctionId()); deposit=auction.getDeposit(); name=auction.getName(); depositType=DEPOSIT_TYPE_AUCTION; } if (hasPaidDeposit(depositOrderDTO.getUserId(), lot, depositType)) { throw new ServiceException("当前已有相关数据保证金订单"); } depositOrderDTO.setAmount(deposit); depositOrderDTO.setAuctionId(lot.getAuctionId()); depositOrderDTO.setName(name); depositOrderDTO.setDepositType(depositType); depositOrderDTO.setLotId(lotId); depositOrderDTO.setMerchantId(lot.getMerchantId()); // OrderVO orderVO = orderApi.createDepositOrder(depositOrderDTO); //保存保证金订单记录 DepositOrder depositOrder=new DepositOrder(); BeanUtils.copyProperties(depositOrderDTO,depositOrder); depositOrder.setStatus(0); //生成订单号 depositOrder.setOrderNo(DEPOSIT_ORDER_PRE + IdUtil.getSnowflakeNextId()); depositOrder.setCreateTime(new Date()); return baseMapper.insert(depositOrder); } private boolean hasPaidDeposit(Integer userId, Lot lot, String depositType) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(DepositOrder::getUserId, userId) .in(DepositOrder::getStatus, CollUtil.newArrayList(DEPOSIT_STATUS_PAID,DEPOSIT_STATUS_WAITING_PAYMENT)) .eq(DepositOrder::getDepositType, depositType); if (Objects.equals(DEPOSIT_TYPE_LOT, depositType)) { queryWrapper.eq(DepositOrder::getLotId, lot.getId()); } else { queryWrapper.eq(DepositOrder::getAuctionId, lot.getAuctionId()); } return baseMapper.selectCount(queryWrapper) > 0; } @Override public void refundDepositOrder(String orderNo) { // OrderVO orderVO=new OrderVO(); // orderVO.setOrderNo(orderNo); // //TODO 执行保证金退款逻辑 // return orderApi.refundDepositOrder(orderVO); this.lambdaUpdate().eq(DepositOrder::getOrderNo,orderNo).set(DepositOrder::getStatus,2); } @Override public void reduceDeposit(String orderNo) { // OrderVO orderVO=new OrderVO(); // orderVO.setOrderNo(orderNo); // //TODO 执行扣减保证金 // // return orderApi.reduceDeposit(orderVO); this.lambdaUpdate().eq(DepositOrder::getOrderNo,orderNo).set(DepositOrder::getStatus,3); } @Override public List selectDepositOrder(DepositOrder depositOrder) { return getBaseMapper().selectDepositList(depositOrder); } @Override public List selectDepositRecordPage(DepositRecordRequest request) { return getBaseMapper().selectDepositRecordPage(request); } }