|
|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|