xiongzhu пре 3 година
родитељ
комит
ee756ecf90

+ 2 - 0
src/main/java/com/izouma/nineth/repo/TokenHistoryRepo.java

@@ -56,4 +56,6 @@ public interface TokenHistoryRepo extends JpaRepository<TokenHistory, Long>, Jpa
     Optional<TokenHistory> findByToUserIdAndTokenId(Long toUserId, String tokenId);
 
     List<TokenHistory> findAllByPriceIsNotNull();
+
+    List<TokenHistory> findByOperationAndCreatedAtBefore(String operation, LocalDateTime time);
 }

+ 13 - 1
src/main/java/com/izouma/nineth/service/AssetLockService.java

@@ -1,20 +1,32 @@
 package com.izouma.nineth.service;
 
+import com.izouma.nineth.TokenHistory;
 import com.izouma.nineth.domain.AssetLock;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.BalanceType;
 import com.izouma.nineth.repo.AssetLockRepo;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.TokenHistoryRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
 @Service
 @AllArgsConstructor
 public class AssetLockService {
 
-    private AssetLockRepo assetLockRepo;
+    private AssetLockRepo      assetLockRepo;
 
     public Page<AssetLock> all(PageQuery pageQuery) {
         return assetLockRepo.findAll(JpaUtils.toSpecification(pageQuery, AssetLock.class), JpaUtils.toPageRequest(pageQuery));
     }
+
+
 }

+ 17 - 1
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -41,6 +41,7 @@ import java.util.*;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service
@@ -67,7 +68,7 @@ public class AssetService {
     private RockRecordService       rockRecordService;
     private RockRecordRepo          rockRecordRepo;
     private AssetLockRepo           assetLockRepo;
-
+    private UserBalanceService      userBalanceService;
 
     public Page<Asset> all(PageQuery pageQuery) {
         Page<Asset> all = assetRepo
@@ -940,4 +941,19 @@ public class AssetService {
                 .duration(duration)
                 .build());
     }
+
+    @Async
+    public void giveBonus() {
+        List<TokenHistory> list = tokenHistoryRepo.findByOperationAndCreatedAtBefore("销毁", LocalDateTime.of(2022, 7, 23, 21, 0, 0));
+        list.parallelStream().forEach(tokenHistory -> {
+            String name = assetRepo.findFirstByTokenId(tokenHistory.getTokenId()).getName();
+            if (Pattern.matches(".*僵尸动物园SSR #.*", name)) {
+                log.info("SSR奖励 {}", name);
+                userBalanceService.modifyBalance(tokenHistory.getFromUserId(), new BigDecimal("1000"), BalanceType.BONUS, null, false, null);
+            } else if (Pattern.matches(".*僵尸动物园SR #.*", name)) {
+                log.info("SR奖励 {}", name);
+                userBalanceService.modifyBalance(tokenHistory.getFromUserId(), new BigDecimal("25"), BalanceType.BONUS, null, false, null);
+            }
+        });
+    }
 }

+ 6 - 0
src/main/java/com/izouma/nineth/web/AssetController.java

@@ -229,6 +229,12 @@ public class AssetController extends BaseController {
     public void lockAsset(@RequestParam Long assetId, @RequestParam Duration duration) {
         assetService.lockAsset(SecurityUtils.getAuthenticatedUser().getId(), assetId, duration);
     }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/giveBonus")
+    public void giveBonus() {
+        assetService.giveBonus();
+    }
 }
 
 

+ 44 - 0
src/test/java/com/izouma/nineth/service/AssetLockServiceTest.java

@@ -0,0 +1,44 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.ApplicationTests;
+import com.izouma.nineth.TokenHistory;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.TokenHistoryRepo;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ForkJoinPool;
+import java.util.regex.Pattern;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class AssetLockServiceTest extends ApplicationTests {
+    @Autowired
+    private TokenHistoryRepo tokenHistoryRepo;
+    @Autowired
+    private AssetRepo        assetRepo;
+
+    @Test
+    void giveBonus() throws ExecutionException, InterruptedException {
+        List<TokenHistory> list = tokenHistoryRepo.findByOperationAndCreatedAtBefore("销毁", LocalDateTime.of(2022, 7, 23, 21, 0, 0));
+        List<Long> ssr = Collections.synchronizedList(new ArrayList<>());
+        List<Long> sr = Collections.synchronizedList(new ArrayList<>());
+        new ForkJoinPool(1000).submit(() -> {
+            list.parallelStream().forEach(tokenHistory -> {
+                String name = assetRepo.findFirstByTokenId(tokenHistory.getTokenId()).getName();
+                if (Pattern.matches(".*僵尸动物园SSR #.*", name)) {
+                    ssr.add(tokenHistory.getFromUserId());
+                } else if (Pattern.matches(".*僵尸动物园SR #.*", name)) {
+                    sr.add(tokenHistory.getFromUserId());
+                }
+            });
+        }).get();
+        System.out.println(ssr.size());
+        System.out.println(sr.size());
+    }
+}