Kaynağa Gözat

提现失败冻结

(cherry picked from commit 4f52dc53666642cbbc7eed444122f9253db230bd)
xiongzhu 4 yıl önce
ebeveyn
işleme
951b391bd3

+ 9 - 0
src/main/java/com/izouma/nineth/domain/UserBalance.java

@@ -1,17 +1,21 @@
 package com.izouma.nineth.domain;
 
 import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 @Data
 @Entity
 @AllArgsConstructor
 @NoArgsConstructor
+@Builder
 public class UserBalance {
 
     @Id
@@ -21,4 +25,9 @@ public class UserBalance {
 
     private BigDecimal lastBalance;
 
+    private boolean locked = false;
+
+    private String lockReason;
+
+    private LocalDateTime lockTime;
 }

+ 6 - 2
src/main/java/com/izouma/nineth/repo/UserBalanceRepo.java

@@ -3,6 +3,8 @@ package com.izouma.nineth.repo;
 import com.izouma.nineth.domain.UserBalance;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -11,7 +13,9 @@ public interface UserBalanceRepo extends JpaRepository<UserBalance, Long>, JpaSp
 
     List<UserBalance> findByBalanceGreaterThan(BigDecimal balance);
 
-    List<UserBalance> findByBalanceGreaterThanOrderByUserId(BigDecimal balance);
-
+    List<UserBalance> findByLockedFalseAndBalanceGreaterThanOrderByUserId(BigDecimal balance);
 
+    @Query("update UserBalance u set u.locked = false, u.lockTime = null, u.lockReason = null where u.userId = ?1")
+    @Modifying
+    int unlock(Long userId);
 }

+ 16 - 3
src/main/java/com/izouma/nineth/service/UserBalanceService.java

@@ -37,6 +37,7 @@ import java.math.RoundingMode;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.regex.Pattern;
@@ -98,7 +99,8 @@ public class UserBalanceService {
                     .findFirst().orElse(null);
             if (userBalance == null) {
                 userBalance = userBalanceRepo.findById(asset.getUserId())
-                        .orElse(new UserBalance(asset.getUserId(), BigDecimal.ZERO, BigDecimal.ZERO));
+                        .orElse(new UserBalance(asset.getUserId(), BigDecimal.ZERO, BigDecimal.ZERO,
+                                false, null, null));
                 balanceList.add(userBalance);
             }
 
@@ -262,7 +264,8 @@ public class UserBalanceService {
         }
         failWithdraw.parallelStream().forEach(withdraw -> {
             UserBalance userBalance = userBalanceRepo.findById(withdraw.getUserId())
-                    .orElse(new UserBalance(withdraw.getUserId(), BigDecimal.ZERO, BigDecimal.ZERO));
+                    .orElse(new UserBalance(withdraw.getUserId(), BigDecimal.ZERO, BigDecimal.ZERO,
+                            false, null, null));
             userBalance.setLastBalance(userBalance.getBalance());
             userBalance.setBalance(userBalance.getBalance().add(withdraw.getAmount()));
             userBalanceRepo.saveAndFlush(userBalance);
@@ -285,7 +288,7 @@ public class UserBalanceService {
             throw new BusinessException("今日已经提现过");
         });
 
-        List<UserBalance> list = userBalanceRepo.findByBalanceGreaterThanOrderByUserId(BigDecimal.ZERO);
+        List<UserBalance> list = userBalanceRepo.findByLockedFalseAndBalanceGreaterThanOrderByUserId(BigDecimal.ZERO);
 
         AutoWithdrawRecord record = AutoWithdrawRecord.builder()
                 .date(LocalDate.now())
@@ -358,6 +361,16 @@ public class UserBalanceService {
                 record.setProgress(record.getProgress() + 1);
                 record.setCurrentUserId(userBalance.getUserId());
                 autoWithdrawRecordRepo.saveAndFlush(record);
+
+
+                if (!success) {
+                    msg = msg == null ? "" : msg;
+                    if (msg.contains("风控") || Pattern.matches(".*\\[.*\\]", msg)) {
+                        userBalance.setLocked(true);
+                        userBalance.setLockReason(msg);
+                        userBalance.setLockTime(LocalDateTime.now());
+                    }
+                }
             }
         }
 

+ 3 - 0
src/main/java/com/izouma/nineth/service/UserService.java

@@ -88,6 +88,7 @@ public class UserService {
     private RedisTemplate<String, Object> redisTemplate;
     private PasswordEncoder               passwordEncoder;
     private WeakPassRepo                  weakPassRepo;
+    private UserBalanceRepo               userBalanceRepo;
 
     public User update(User user) {
         if (!SecurityUtils.hasRole(AuthorityName.ROLE_ADMIN)) {
@@ -618,6 +619,8 @@ public class UserService {
                 .realName(identityAuth.getRealName())
                 .idNo(identityAuth.getIdNo())
                 .build());
+
+        userBalanceRepo.unlock(userId);
     }
 
     public void removeBankCard(Long userId) throws BaseAdaPayException {

+ 7 - 0
src/main/vue/src/views/UserBalance.vue

@@ -66,6 +66,13 @@
             <el-table-column type="index" label="#"></el-table-column>
             <el-table-column prop="userId" label="用户ID"></el-table-column>
             <el-table-column prop="balance" label="余额"></el-table-column>
+            <el-table-column prop="locked" label="锁定" width="100" align="center">
+                <template v-slot="{ row }">
+                    <el-tag :type="row.locked ? 'danger' : 'info'">{{ row.locked ? '是' : '否' }}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="lockTime" label="锁定时间" width="150"></el-table-column>
+            <el-table-column prop="lockReason" label="锁定原因" show-overflow-tooltip></el-table-column>
             <el-table-column width="100" label="操作" align="center">
                 <template v-slot="{ row }">
                     <el-button size="mini" type="primary" plain @click="showRecords(row.userId)">查看记录</el-button>