licailing před 3 roky
rodič
revize
0b3cb786d2

+ 3 - 3
src/main/java/com/izouma/nineth/repo/AuctionActivityRepo.java

@@ -43,12 +43,12 @@ public interface AuctionActivityRepo extends JpaRepository<AuctionActivity, Long
 
     List<AuctionActivity> findAllByStatus(AuctionStatus auctionStatus);
 
-    AuctionActivity findByAssetId(Long assetId);
+    List<AuctionActivity> findByAssetId(Long assetId);
 
     List<AuctionActivity> findByStartTimeBeforeAndStatusIn(LocalDateTime startTime, Collection<AuctionStatus> status);
 
     @Modifying
     @Transactional
-    @Query("update AuctionActivity set onShelf = ?2 where id = ?1")
-    void updateOnShelf(Long id, boolean onShelf);
+    @Query("update AuctionActivity set onShelf = ?2 where assetId = ?1 and onShelf <> ?2")
+    void updateOnShelf(Long assetId, boolean onShelf);
 }

+ 34 - 26
src/main/java/com/izouma/nineth/service/AuctionActivityService.java

@@ -1,5 +1,6 @@
 package com.izouma.nineth.service;
 
+import cn.hutool.core.collection.CollUtil;
 import com.izouma.nineth.annotations.Debounce;
 import com.izouma.nineth.config.RedisKeys;
 import com.izouma.nineth.domain.Asset;
@@ -9,7 +10,10 @@ import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.auction.AuctionInputDTO;
 import com.izouma.nineth.enums.*;
 import com.izouma.nineth.exception.BusinessException;
-import com.izouma.nineth.repo.*;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.AuctionActivityRepo;
+import com.izouma.nineth.repo.TokenHistoryRepo;
+import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
@@ -139,13 +143,13 @@ public class AuctionActivityService {
             }
 
             //是否二次拍卖
-            AuctionActivity activity = auctionActivityRepo.findByAssetId(asset.getId());
-            if (ObjectUtils.isNotEmpty(activity)) {
-                if (!AuctionStatus.PASS.equals(activity.getStatus())) {
+            List<AuctionActivity> activity = auctionActivityRepo.findByAssetId(asset.getId());
+            if (CollUtil.isNotEmpty(activity)) {
+                if (activity.stream().anyMatch(ac -> !AuctionStatus.PASS.equals(ac.getStatus()))) {
                     throw new BusinessException("已有拍卖");
                 }
-                log.info("下架流拍拍卖:id-{},assetId-{}", activity.getId(), activity.getAssetId());
-                auctionActivityRepo.updateOnShelf(activity.getId(), false);
+                log.info("下架流拍拍卖:assetId-{}", asset.getId());
+                auctionActivityRepo.updateOnShelf(asset.getId(), false);
             }
 
             asset.setStatus(AssetStatus.AUCTIONING);
@@ -185,6 +189,7 @@ public class AuctionActivityService {
         }
     }
 
+
     private void onShelfTask(AuctionActivity record) {
         ScheduledFuture<?> task = tasks.get(record.getId());
         if (task != null) {
@@ -196,45 +201,46 @@ public class AuctionActivityService {
             if (record.getStartTime().minusSeconds(2).isAfter(LocalDateTime.now())) {
                 Date date = Date.from(record.getStartTime().atZone(ZoneId.systemDefault()).toInstant());
                 ScheduledFuture<?> future = taskScheduler.schedule(() -> {
-                    AuctionActivity recordNew1 = auctionActivityRepo.findById(record.getId())
-                            .orElseThrow(new BusinessException("无数据"));
-                    auctionActivityRepo.scheduleOnShelf(record.getId(), AuctionStatus.ONGOING);
+//                    AuctionActivity recordNew1 = auctionActivityRepo.findById(record.getId())
+//                            .orElseThrow(new BusinessException("无数据"));
+                    this.changeStatus(record.getId(), AuctionStatus.ONGOING);
                     tasks.remove(record.getId());
-                    offShelfTask(recordNew1);
+                    offShelfTask(auctionActivityRepo.findById(record.getId()).orElseThrow(new BusinessException("无数据")));
                 }, date);
                 tasks.put(record.getId(), future);
             } else {
-                auctionActivityRepo.scheduleOnShelf(record.getId(), AuctionStatus.ONGOING);
-                offShelfTask(record);
+                this.changeStatus(record.getId(), AuctionStatus.ONGOING);
+                offShelfTask(auctionActivityRepo.findById(record.getId()).orElseThrow(new BusinessException("无数据")));
             }
         }
     }
 
     public void offShelfTask(AuctionActivity record) {
-        ScheduledFuture<?> task = tasks.get(record.getId());
+        Long id = record.getId();
+        ScheduledFuture<?> task = tasks.get(id);
         if (task != null) {
             if (!task.cancel(true)) {
                 return;
             }
         }
-//        AuctionActivity recordNew1 = auctionActivityRepo.findById(record.getId())
+//        AuctionActivity recordNew = auctionActivityRepo.findById(id)
 //                .orElseThrow(new BusinessException("无数据"));
         if (record.getStatus().equals(AuctionStatus.ONGOING)) {
             if (record.getEndTime().minusSeconds(2).isAfter(LocalDateTime.now())) {
                 Date date = Date.from(record.getEndTime().atZone(ZoneId.systemDefault()).toInstant());
                 ScheduledFuture<?> future = taskScheduler.schedule(() -> {
-                    AuctionActivity recordNew1 = auctionActivityRepo.findById(record.getId())
+                    AuctionActivity recordNew1 = auctionActivityRepo.findById(id)
                             .orElseThrow(new BusinessException("无数据"));
 
                     if (ObjectUtils.isNotEmpty(recordNew1.getPurchasePrice())) {
                         log.info("拍卖成交{}", recordNew1.getId());
-                        auctionActivityRepo.scheduleOffShelf(recordNew1.getId(), AuctionStatus.PURCHASED);
+                        this.changeStatus(recordNew1.getId(), AuctionStatus.PURCHASED);
                     } else {
                         //没有成交价,无人出价过
                         log.info("拍卖流拍Task-else{}", recordNew1.getId());
                         auctionActivityRepo.scheduleOffShelf(recordNew1.getId(), AuctionStatus.PASS);
 
-                        if (record.getAuctionType().equals(AuctionType.NFT)) {
+                        if (AuctionSource.TRANSFER.equals(recordNew1.getSource())) {
                             Asset asset = assetRepo.findById(recordNew1.getAssetId())
                                     .orElseThrow(new BusinessException("暂无"));
                             asset.setStatus(AssetStatus.NORMAL);
@@ -243,19 +249,21 @@ public class AuctionActivityService {
                             assetRepo.save(asset);
                         }
                     }
-                    tasks.remove(record.getId());
+                    tasks.remove(id);
                 }, date);
-                tasks.put(record.getId(), future);
+                tasks.put(id, future);
             } else {
-                if (ObjectUtils.isNotEmpty(record.getPurchasePrice())) {
-                    log.info("拍卖成交{}", record.getId());
-                    auctionActivityRepo.scheduleOffShelf(record.getId(), AuctionStatus.PURCHASED);
+                AuctionActivity recordNew1 = auctionActivityRepo.findById(id)
+                        .orElseThrow(new BusinessException("无数据"));
+                if (ObjectUtils.isNotEmpty(recordNew1.getPurchasePrice())) {
+                    log.info("拍卖成交{}", id);
+                    auctionActivityRepo.scheduleOffShelf(id, AuctionStatus.PURCHASED);
                 } else {
-                    log.info("拍卖流拍Task-else-else{}", record.getId());
-                    auctionActivityRepo.scheduleOffShelf(record.getId(), AuctionStatus.PASS);
+                    log.info("拍卖流拍Task-else-else{}", id);
+                    auctionActivityRepo.scheduleOffShelf(id, AuctionStatus.PASS);
 
-                    if (record.getAuctionType().equals(AuctionType.NFT)) {
-                        Asset asset = assetRepo.findById(record.getAssetId())
+                    if (AuctionSource.TRANSFER.equals(recordNew1.getSource())) {
+                        Asset asset = assetRepo.findById(recordNew1.getAssetId())
                                 .orElseThrow(new BusinessException("暂无"));
                         asset.setStatus(AssetStatus.NORMAL);
                         asset.setConsignment(false);