AuctionServiceImpl.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package cn.hobbystocks.auc.service.impl;
  2. import cn.hobbystocks.auc.cache.CacheMap;
  3. import cn.hobbystocks.auc.domain.Lot;
  4. import cn.hobbystocks.auc.service.ILotService;
  5. import cn.hobbystocks.auc.common.constant.Constants;
  6. import cn.hobbystocks.auc.common.core.redis.RedisCache;
  7. import cn.hobbystocks.auc.common.core.text.Convert;
  8. import cn.hobbystocks.auc.common.utils.DateUtils;
  9. import cn.hobbystocks.auc.domain.Auction;
  10. import cn.hobbystocks.auc.mapper.AuctionMapper;
  11. import cn.hobbystocks.auc.service.IAuctionService;
  12. import cn.hobbystocks.auc.vo.AuctionVO;
  13. import com.baomidou.mybatisplus.core.metadata.IPage;
  14. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  15. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.TransactionDefinition;
  21. import org.springframework.transaction.TransactionStatus;
  22. import org.springframework.transaction.annotation.Isolation;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import org.springframework.transaction.support.DefaultTransactionDefinition;
  25. import org.springframework.util.CollectionUtils;
  26. import javax.annotation.Resource;
  27. import java.util.Date;
  28. import java.util.List;
  29. import java.util.Objects;
  30. @Service
  31. @Slf4j
  32. public class AuctionServiceImpl extends ServiceImpl<AuctionMapper,Auction> implements IAuctionService
  33. {
  34. @Autowired
  35. private ILotService lotService;
  36. @Autowired
  37. private RedisCache redisCache;
  38. @Resource
  39. private DataSourceTransactionManager transactionManager;
  40. @Autowired(required = false)
  41. private CacheMap cacheMap;
  42. @Override
  43. public Auction selectAuctionById(Long id)
  44. {
  45. return getBaseMapper().selectAuctionById(id);
  46. }
  47. @Override
  48. public Auction selectAuctionByNo(String no) {
  49. return getBaseMapper().selectAuctionByNo(no);
  50. }
  51. @Override
  52. public List<Auction> selectAuctionList(Auction auction) {
  53. IPage<Auction> page=new Page<>(auction.getPageNum(),auction.getPageSize());
  54. List<Auction> auctions = getBaseMapper().selectAuctionList(page, auction);
  55. // 过滤掉时间已结束的拍品
  56. auctions.removeIf(po -> System.currentTimeMillis() > po.getEndTime().getTime());
  57. // 返回
  58. return auctions;
  59. }
  60. @Override
  61. public int insertAuction(Auction auction) {
  62. auction.setCreateTime(DateUtils.getNowDate());
  63. return getBaseMapper().insertAuction(auction);
  64. }
  65. @Override
  66. public int updateAuction(Auction auction) {
  67. auction.setUpdateTime(DateUtils.getNowDate());
  68. return getBaseMapper().updateAuction(auction);
  69. }
  70. @Override
  71. public int deleteAuctionByIds(String ids)
  72. {
  73. return getBaseMapper().deleteAuctionByIds(Convert.toLongArray(ids));
  74. }
  75. @Override
  76. public int deleteAuctionById(Long id)
  77. {
  78. return getBaseMapper().deleteAuctionById(id);
  79. }
  80. @Override
  81. @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
  82. public boolean pubAuction(AuctionVO auction) {
  83. if (Objects.equals(Constants.PUB_STATUS_PUBLISHED, auction.getPubStatus())) {
  84. auction.setPubTime(new Date());
  85. auction.setStatus(Constants.LOT_STATUS_WAITING);
  86. Auction db = getBaseMapper().selectAuctionById(auction.getId());
  87. redisCache.setCacheObject(String.format(Constants.REDIS_AUC_TEMPLATE, auction.getId()), db);
  88. }else if (Objects.equals(Constants.PUB_STATUS_CANCEL_PUBLISHED, auction.getPubStatus())){
  89. //判断是否有正在竞拍的拍品,如果有,下架失败
  90. List<Lot> lots = lotService.selectBiddingLotByAucId(auction.getId());
  91. if (!CollectionUtils.isEmpty(lots))
  92. return false;
  93. auction.setUpdateTime(new Date());
  94. auction.setStatus(Constants.LOT_STATUS_CANCELLED);
  95. redisCache.deleteObject(String.format(Constants.REDIS_AUC_TEMPLATE, auction.getId()));
  96. }
  97. getBaseMapper().updateAuction(auction);
  98. /*if (auction.getPubLots()) {
  99. lotService.pubLots(auction);
  100. }*/
  101. return true;
  102. }
  103. @Override
  104. public void auctionLive() {
  105. getBaseMapper().selectNeedStart().forEach(auction -> updateAuction(auction, Constants.GROUP_STATUS_STARTING));
  106. getBaseMapper().selectNeedEnd().forEach(auction -> updateAuction(auction, Constants.GROUP_STATUS_FINISH));
  107. }
  108. @Override
  109. public List<Auction> live() {
  110. return getBaseMapper().selectLive();
  111. }
  112. private void updateAuction(Auction auction, String status) {
  113. auction.setUpdateTime(new Date());
  114. auction.setStatus(status);
  115. TransactionStatus transaction = null;
  116. try {
  117. DefaultTransactionDefinition def = new DefaultTransactionDefinition();
  118. def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  119. def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
  120. transaction = transactionManager.getTransaction(def);
  121. getBaseMapper().updateAuction(auction);
  122. if (status.equals(Constants.GROUP_STATUS_FINISH)) {
  123. redisCache.deleteObject(String.format(Constants.REDIS_AUC_TEMPLATE, auction.getId()));
  124. redisCache.deleteObject(String.format(Constants.REDIS_MAP_AUC_LOT_TEMPLATE, auction.getId()));
  125. cacheMap.end(auction.getId());
  126. }else {
  127. redisCache.setCacheObject(String.format(Constants.REDIS_AUC_TEMPLATE, auction.getId()), auction);
  128. }
  129. transactionManager.commit(transaction);
  130. }catch (Exception e){
  131. log.error("auction end error, {}", auction, e);
  132. if(Objects.nonNull(transaction)){
  133. transactionManager.rollback(transaction);
  134. }
  135. }
  136. }
  137. @Override
  138. public List<Auction> selectBannerList() {
  139. List<Auction> auctions = getBaseMapper().selectAucBannerList();
  140. // 过滤掉时间已结束(如拍卖会id:5)时间未开始(如拍卖会id:4)
  141. auctions.removeIf(auction -> System.currentTimeMillis() > auction.getEndTime().getTime()
  142. || System.currentTimeMillis() < auction.getStartTime().getTime());
  143. // 返回
  144. return auctions;
  145. }
  146. }