Browse Source

余额恢复

xiongzhu 4 years ago
parent
commit
9bf490bdee

+ 6 - 0
src/main/java/com/izouma/nineth/repo/BalanceRecordRepo.java

@@ -4,5 +4,11 @@ import com.izouma.nineth.domain.BalanceRecord;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 public interface BalanceRecordRepo extends JpaRepository<BalanceRecord, Long>, JpaSpecificationExecutor<BalanceRecord> {
+    List<BalanceRecord> findByUserIdAndCreatedAtBetweenOrderByCreatedAt(Long userId, LocalDateTime start, LocalDateTime end);
+
+    List<BalanceRecord> findByUserIdOrderByCreatedAt(Long userId);
 }

+ 28 - 0
src/main/java/com/izouma/nineth/service/UserBalanceService.java

@@ -40,6 +40,8 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ForkJoinPool;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
@@ -379,4 +381,30 @@ public class UserBalanceService {
 
         redisTemplate.delete("autoWithdraw::" + DateTimeUtils.format(date, "yyyyMMdd"));
     }
+
+    public void revert() throws ExecutionException, InterruptedException {
+        ForkJoinPool customThreadPool = new ForkJoinPool(200);
+        customThreadPool.submit(() -> {
+            LocalDate now = LocalDate.now();
+            userBalanceRepo.findAll().parallelStream().forEach(userBalance -> {
+                List<BalanceRecord> balanceRecords = balanceRecordRepo.findByUserIdOrderByCreatedAt(userBalance.getUserId());
+                List<BalanceRecord> todayRecords = balanceRecords.stream()
+                        .filter(b -> b.getCreatedAt().toLocalDate().equals(now)).collect(Collectors.toList());
+                List<BalanceRecord> oldRecords = balanceRecords.stream()
+                        .filter(b -> !b.getCreatedAt().toLocalDate().equals(now))
+                        .sorted(Comparator.comparing(BaseEntity::getCreatedAt))
+                        .collect(Collectors.toList());
+                if (oldRecords.size() == 0) {
+                    userBalanceRepo.delete(userBalance);
+                } else {
+                    BalanceRecord record = oldRecords.get(oldRecords.size() - 1);
+                    userBalance.setBalance(record.getBalance());
+                    userBalance.setLastBalance(record.getLastBalance());
+                    userBalanceRepo.save(userBalance);
+                }
+                balanceRecordRepo.deleteAll(todayRecords);
+            });
+        }).get();
+
+    }
 }

+ 6 - 0
src/test/java/com/izouma/nineth/service/UserBalanceServiceTest.java

@@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.time.LocalDate;
+import java.util.concurrent.ExecutionException;
 
 import static org.junit.jupiter.api.Assertions.*;
 
@@ -22,4 +23,9 @@ class UserBalanceServiceTest extends ApplicationTests {
     @Test
     void settleFile() {
     }
+
+    @Test
+    public void revert() throws ExecutionException, InterruptedException {
+        userBalanceService.revert();
+    }
 }