xiongzhu 3 vuotta sitten
vanhempi
commit
bc151c7461

+ 8 - 0
src/main/java/com/izouma/nineth/service/SysConfigService.java

@@ -142,6 +142,14 @@ public class SysConfigService {
                     .value("0")
                     .build());
         }
+        if (list.stream().anyMatch(i -> i.getName().equals("min_withdraw_amount"))) {
+            sysConfigRepo.save(SysConfig.builder()
+                    .name("min_withdraw_amount")
+                    .desc("最小提现金额")
+                    .type(SysConfig.ValueType.NUMBER)
+                    .value("100")
+                    .build());
+        }
         SearchMode searchMode = SearchMode.valueOf(sysConfigRepo.findByName("default_search_mode").get().getValue());
         JpaUtils.setDefaultSearchMode(searchMode);
 

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

@@ -27,6 +27,7 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.apache.poi.util.TempFile;
+import org.springframework.core.env.Environment;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -64,6 +65,8 @@ public class UserBalanceService {
     private final SandPayService                sandPayService;
     private final RedisTemplate<String, Object> redisTemplate;
     private final RechargeOrderRepo             rechargeOrderRepo;
+    private final SysConfigService              sysConfigService;
+    private final Environment                   env;
 
     public void settle(LocalDate start, LocalDate end) {
         for (long i = 0; i <= ChronoUnit.DAYS.between(start, end); i++) {
@@ -464,4 +467,71 @@ public class UserBalanceService {
         }
 
     }
+
+    @RedisLock("#userId")
+    public void withdraw(Long userId) {
+        UserBalance userBalance = userBalanceRepo.findById(userId).orElseThrow(new BusinessException("余额不足"));
+        BigDecimal minWithdrawAmount = sysConfigService.getBigDecimal("min_withdraw_amount");
+        if (userBalance.getBalance().compareTo(minWithdrawAmount) < 0) {
+            throw new BusinessException("最小提现金额为" + minWithdrawAmount);
+        }
+        UserBankCard userBankCard = userBankCardRepo.findByUserId(userBalance.getUserId())
+                .stream().findFirst().orElseThrow(new BusinessException("请先绑定银行卡"));
+
+        BigDecimal amount = userBalance.getBalance();
+        userBalance.setLastBalance(userBalance.getBalance());
+        userBalance.setBalance(BigDecimal.ZERO);
+        userBalanceRepo.saveAndFlush(userBalance);
+
+        String withdrawId = snowflakeIdWorker.nextId() + "";
+        balanceRecordRepo.save(BalanceRecord.builder()
+                .time(LocalDateTime.now())
+                .userId(userBalance.getUserId())
+                .amount(amount.negate())
+                .balance(BigDecimal.ZERO)
+                .lastBalance(userBalance.getLastBalance())
+                .type(BalanceType.WITHDRAW)
+                .withdrawId(withdrawId)
+                .build());
+
+        boolean success = false;
+        String msg = null;
+        try {
+            if (Arrays.asList(env.getActiveProfiles()).contains("prod")) {
+                JSONObject res = sandPayService.transfer(withdrawId, userBankCard.getRealName(), userBankCard.getBankNo(), amount);
+                if ("0000".equals(res.getString("respCode"))) {
+                    success = true;
+                } else {
+                    msg = res.getString("respDesc");
+                }
+            } else {
+                success = true;
+            }
+        } catch (Exception e) {
+            msg = e.getMessage();
+        }
+
+        if (!success) {
+            userBalance.setLastBalance(userBalance.getBalance());
+            userBalance.setBalance(userBalance.getBalance().add(amount));
+            userBalanceRepo.saveAndFlush(userBalance);
+
+            balanceRecordRepo.save(BalanceRecord.builder()
+                    .time(LocalDateTime.now())
+                    .userId(userBalance.getUserId())
+                    .amount(amount)
+                    .balance(userBalance.getBalance())
+                    .lastBalance(userBalance.getLastBalance())
+                    .type(BalanceType.RETURN)
+                    .withdrawId(withdrawId)
+                    .remark(msg)
+                    .build());
+        }
+        if (!success) {
+            userBalance.setLocked(true);
+            userBalance.setLockReason(msg);
+            userBalance.setLockTime(LocalDateTime.now());
+            userBalanceRepo.saveAndFlush(userBalance);
+        }
+    }
 }

+ 5 - 0
src/main/java/com/izouma/nineth/web/UserBalanceController.java

@@ -103,4 +103,9 @@ public class UserBalanceController extends BaseController {
     public Page<BalanceRecord> myRecord(Pageable pageable) {
         return balanceRecordRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId(), pageable);
     }
+
+//    @PostMapping("/withdraw")
+//    public void withdraw() {
+//        userBalanceService.withdraw(SecurityUtils.getAuthenticatedUser().getId());
+//    }
 }