|
@@ -1,10 +1,21 @@
|
|
package com.ym.mec.biz.service.impl;
|
|
package com.ym.mec.biz.service.impl;
|
|
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Objects;
|
|
|
|
+
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Lists;
|
|
import com.ym.mec.biz.dal.dao.StudentWithdrawDao;
|
|
import com.ym.mec.biz.dal.dao.StudentWithdrawDao;
|
|
import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
|
|
import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
|
|
import com.ym.mec.biz.dal.dto.CashAccountDetail;
|
|
import com.ym.mec.biz.dal.dto.CashAccountDetail;
|
|
-import com.ym.mec.biz.dal.dto.WithdrawDto;
|
|
|
|
import com.ym.mec.biz.dal.dto.WithdrawInfoDto;
|
|
import com.ym.mec.biz.dal.dto.WithdrawInfoDto;
|
|
import com.ym.mec.biz.dal.entity.StudentWithdraw;
|
|
import com.ym.mec.biz.dal.entity.StudentWithdraw;
|
|
import com.ym.mec.biz.dal.entity.SysUserCashAccount;
|
|
import com.ym.mec.biz.dal.entity.SysUserCashAccount;
|
|
@@ -21,24 +32,9 @@ import com.ym.mec.common.exception.BizException;
|
|
import com.ym.mec.common.page.PageInfo;
|
|
import com.ym.mec.common.page.PageInfo;
|
|
import com.ym.mec.common.service.impl.BaseServiceImpl;
|
|
import com.ym.mec.common.service.impl.BaseServiceImpl;
|
|
import com.ym.mec.util.date.DateUtil;
|
|
import com.ym.mec.util.date.DateUtil;
|
|
-import com.ym.mec.util.string.IdWorker;
|
|
|
|
-import org.apache.commons.lang3.RandomStringUtils;
|
|
|
|
-import org.slf4j.Logger;
|
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
|
-
|
|
|
|
-import java.math.BigDecimal;
|
|
|
|
-import java.util.Date;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Objects;
|
|
|
|
-import java.util.concurrent.locks.Lock;
|
|
|
|
-import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
-public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentWithdraw> implements StudentWithdrawService {
|
|
|
|
|
|
+public class StudentWithdrawServiceImpl extends BaseServiceImpl<Integer, StudentWithdraw> implements StudentWithdrawService {
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private StudentWithdrawDao studentWithdrawDao;
|
|
private StudentWithdrawDao studentWithdrawDao;
|
|
@@ -46,7 +42,7 @@ public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentW
|
|
private SysUserCashAccountDao sysUserCashAccountDao;
|
|
private SysUserCashAccountDao sysUserCashAccountDao;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public BaseDAO<String, StudentWithdraw> getDAO() {
|
|
|
|
|
|
+ public BaseDAO<Integer, StudentWithdraw> getDAO() {
|
|
return studentWithdrawDao;
|
|
return studentWithdrawDao;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -61,50 +57,62 @@ public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentW
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public boolean confirmWithdraw(WithdrawDto withdrawDto) {
|
|
|
|
|
|
+ public boolean confirmWithdraw(Integer id, DealStatusEnum status, String memo, String transNo, TransTypeEnum transType) {
|
|
|
|
+
|
|
|
|
+ StudentWithdraw studentWithdraw = get(id);
|
|
|
|
+
|
|
|
|
+ if (studentWithdraw == null) {
|
|
|
|
+ throw new BizException("提现申请记录不存在");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Date date = new Date();
|
|
|
|
+
|
|
|
|
+ Integer userId = studentWithdraw.getUserId();
|
|
|
|
+ BigDecimal amount = studentWithdraw.getAmount();
|
|
|
|
+
|
|
|
|
+ studentWithdraw.setComment(memo);
|
|
|
|
+ studentWithdraw.setModifyTime(date);
|
|
|
|
+ studentWithdraw.setStatus(status);
|
|
|
|
+ studentWithdraw.setTransNo(transNo);
|
|
|
|
+
|
|
|
|
+ studentWithdrawDao.update(studentWithdraw);
|
|
|
|
+
|
|
try {
|
|
try {
|
|
- SysUserCashAccount sysUserCashAccount = cashAccountService.get(withdrawDto.getUserId().intValue());
|
|
|
|
- if (Objects.isNull(sysUserCashAccount)){
|
|
|
|
|
|
+ SysUserCashAccount sysUserCashAccount = cashAccountService.get(userId);
|
|
|
|
+ if (Objects.isNull(sysUserCashAccount)) {
|
|
throw new BizException("账户不存在!");
|
|
throw new BizException("账户不存在!");
|
|
}
|
|
}
|
|
- //校验银行账户余额
|
|
|
|
- if (sysUserCashAccount.getBalance().compareTo(withdrawDto.getAmount()) < 0) {
|
|
|
|
- throw new BizException("余额不足,提现失败!");
|
|
|
|
|
|
+ // 校验银行账户余额
|
|
|
|
+ if (sysUserCashAccount.getFrozenAmount().compareTo(amount) < 0) {
|
|
|
|
+ throw new BizException("账户冻结金额异常");
|
|
}
|
|
}
|
|
- //第三方提现到用户银行卡
|
|
|
|
- //用户个人虚拟账户金额减少
|
|
|
|
-
|
|
|
|
- //生成提现记录(缺少银行流水号,交易状态,用户承担的费用,平台承担的费用)
|
|
|
|
- Integer withdrawId = saveStudentWithdraw(withdrawDto);
|
|
|
|
|
|
+ sysUserCashAccount.setFrozenAmount(sysUserCashAccount.getFrozenAmount().subtract(amount));
|
|
|
|
+
|
|
|
|
+ if(status == DealStatusEnum.FAilED){
|
|
|
|
+ sysUserCashAccount.setBalance(sysUserCashAccount.getBalance().add(amount));
|
|
|
|
+ }
|
|
|
|
+ sysUserCashAccount.setUpdateTime(date);
|
|
|
|
+ cashAccountService.update(sysUserCashAccount);
|
|
|
|
+
|
|
|
|
+ SysUserCashAccountDetail sysUserCashAccountDetail = new SysUserCashAccountDetail();
|
|
|
|
+ sysUserCashAccountDetail.setUserId(userId);
|
|
|
|
+ sysUserCashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW);
|
|
|
|
+ sysUserCashAccountDetail.setStatus(status);
|
|
|
|
+ sysUserCashAccountDetail.setAmount(amount);
|
|
|
|
+ sysUserCashAccountDetail.setAttribute(id + "");
|
|
|
|
+ sysUserCashAccountDetail.setComment(memo);
|
|
|
|
+ sysUserCashAccountDetail.setTransNo(transNo);
|
|
|
|
+ sysUserCashAccountDetail.setTransType(transType);
|
|
|
|
+ sysUserCashAccountDetail.setBalance(sysUserCashAccount.getBalance());
|
|
|
|
+
|
|
|
|
+ cashAccountDetailService.insert(sysUserCashAccountDetail);
|
|
|
|
|
|
- accountDetailService.addCashAccountDetail(withdrawDto.getUserId(),withdrawDto.getAmount(),withdrawId +"","",
|
|
|
|
- PlatformCashAccountDetailTypeEnum.WITHDRAW,TransTypeEnum.FAST_PAYMENT, DealStatusEnum.ING,"");
|
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
log.error("用户提现出现异常 {}", e.getMessage(), e);
|
|
log.error("用户提现出现异常 {}", e.getMessage(), e);
|
|
throw new BizException(e.getMessage());
|
|
throw new BizException(e.getMessage());
|
|
}
|
|
}
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
- /**
|
|
|
|
- * 修改用户账户余额,保存账户明细
|
|
|
|
- *
|
|
|
|
- * @param withdrawDto
|
|
|
|
- */
|
|
|
|
- private void updateCashAccount(SysUserCashAccount sysUserCashAccount, WithdrawDto withdrawDto) {
|
|
|
|
- BigDecimal balance = sysUserCashAccount.getBalance().subtract(withdrawDto.getAmount());
|
|
|
|
- SysUserCashAccount account = new SysUserCashAccount();
|
|
|
|
- account.setUserId(sysUserCashAccount.getUserId());
|
|
|
|
- account.setBalance(balance);
|
|
|
|
- account.setUpdateTime(new Date());
|
|
|
|
- cashAccountService.update(account);
|
|
|
|
- SysUserCashAccountDetail cashAccountDetail = new SysUserCashAccountDetail();
|
|
|
|
- cashAccountDetail.setUserId(withdrawDto.getUserId());
|
|
|
|
- cashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW);
|
|
|
|
- cashAccountDetail.setAmount(withdrawDto.getAmount());
|
|
|
|
- cashAccountDetail.setBalance(balance);
|
|
|
|
- cashAccountDetail.setCreateTime(new Date());
|
|
|
|
- cashAccountDetailService.insert(cashAccountDetail);
|
|
|
|
- }
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public PageInfo<WithdrawInfoDto> queryWithdrawPage(CashAccountDetail cashAccountDetail) {
|
|
public PageInfo<WithdrawInfoDto> queryWithdrawPage(CashAccountDetail cashAccountDetail) {
|
|
@@ -112,7 +120,7 @@ public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentW
|
|
cashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW.getCode());
|
|
cashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW.getCode());
|
|
PageInfo<SysUserCashAccountDetail> accountDetailPageInfo = accountDetailService.queryPage(cashAccountDetail);
|
|
PageInfo<SysUserCashAccountDetail> accountDetailPageInfo = accountDetailService.queryPage(cashAccountDetail);
|
|
List<WithdrawInfoDto> dataList = Lists.newArrayList();
|
|
List<WithdrawInfoDto> dataList = Lists.newArrayList();
|
|
- accountDetailPageInfo.getRows().forEach(data ->{
|
|
|
|
|
|
+ accountDetailPageInfo.getRows().forEach(data -> {
|
|
WithdrawInfoDto withdrawInfoDto = new WithdrawInfoDto();
|
|
WithdrawInfoDto withdrawInfoDto = new WithdrawInfoDto();
|
|
StudentWithdraw studentWithdraw = studentWithdrawDao.getByUserId(data.getUserId().longValue());
|
|
StudentWithdraw studentWithdraw = studentWithdrawDao.getByUserId(data.getUserId().longValue());
|
|
withdrawInfoDto.setWithdrawId(studentWithdraw.getWithdrawNo());
|
|
withdrawInfoDto.setWithdrawId(studentWithdraw.getWithdrawNo());
|
|
@@ -122,9 +130,9 @@ public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentW
|
|
withdrawInfoDto.setTransTypeName(TransTypeEnum.getDescriptionByCode(data.getTransType().getCode()));
|
|
withdrawInfoDto.setTransTypeName(TransTypeEnum.getDescriptionByCode(data.getTransType().getCode()));
|
|
withdrawInfoDto.setAccountNo(studentWithdraw.getBankCardNo());
|
|
withdrawInfoDto.setAccountNo(studentWithdraw.getBankCardNo());
|
|
withdrawInfoDto.setWithdrawStatus(studentWithdraw.getStatus().getMsg());
|
|
withdrawInfoDto.setWithdrawStatus(studentWithdraw.getStatus().getMsg());
|
|
- //支付账号
|
|
|
|
- dataList.add(withdrawInfoDto);
|
|
|
|
- });
|
|
|
|
|
|
+ // 支付账号
|
|
|
|
+ dataList.add(withdrawInfoDto);
|
|
|
|
+ });
|
|
BeanUtils.copyProperties(accountDetailPageInfo, result);
|
|
BeanUtils.copyProperties(accountDetailPageInfo, result);
|
|
result.setRows(dataList);
|
|
result.setRows(dataList);
|
|
return result;
|
|
return result;
|
|
@@ -132,53 +140,47 @@ public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentW
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public void add(StudentWithdraw withdraw) throws Exception {
|
|
|
|
- SysUserCashAccount account = sysUserCashAccountDao.get(withdraw.getUserId());
|
|
|
|
- //账户状态正常
|
|
|
|
- if(account != null && account.getStatus() == PlatformCashAccountStatusEnum.NORMAL){
|
|
|
|
- //提现金额不大于账户可用余额
|
|
|
|
- if(withdraw.getAmount().compareTo(account.getBalance()) < 1){
|
|
|
|
- //修改账户余额
|
|
|
|
- BigDecimal subtract = account.getBalance().subtract(withdraw.getAmount());
|
|
|
|
- account.setBalance(subtract);
|
|
|
|
- account.setFrozenAmount(account.getFrozenAmount().add(withdraw.getAmount()));
|
|
|
|
|
|
+ public void apply(Integer userId, String bankCardNo, BigDecimal amount) throws Exception {
|
|
|
|
+ SysUserCashAccount account = sysUserCashAccountDao.getLocked(userId);
|
|
|
|
+ // 账户状态正常
|
|
|
|
+ if (account != null && account.getStatus() == PlatformCashAccountStatusEnum.NORMAL) {
|
|
|
|
+ // 提现金额不大于账户可用余额
|
|
|
|
+ if (amount.compareTo(account.getBalance()) < 1) {
|
|
Date date = new Date();
|
|
Date date = new Date();
|
|
|
|
+
|
|
|
|
+ StudentWithdraw withdraw = new StudentWithdraw();
|
|
|
|
+ withdraw.setAmount(amount);
|
|
|
|
+ withdraw.setBankCardNo(bankCardNo);
|
|
|
|
+ withdraw.setCreateTime(date);
|
|
|
|
+ withdraw.setModifyTime(date);
|
|
|
|
+ withdraw.setStatus(DealStatusEnum.ING);
|
|
|
|
+ withdraw.setUserId(userId);
|
|
|
|
+ withdraw.setWithdrawNo(System.currentTimeMillis() + "");
|
|
|
|
+
|
|
|
|
+ // 修改账户余额
|
|
|
|
+ BigDecimal subtract = account.getBalance().subtract(amount);
|
|
|
|
+ account.setBalance(subtract);
|
|
|
|
+ account.setFrozenAmount(account.getFrozenAmount().add(amount));
|
|
account.setUpdateTime(date);
|
|
account.setUpdateTime(date);
|
|
sysUserCashAccountDao.update(account);
|
|
sysUserCashAccountDao.update(account);
|
|
|
|
+
|
|
|
|
+ withdraw.setBalance(subtract);
|
|
|
|
+ studentWithdrawDao.insert(withdraw);
|
|
|
|
+
|
|
SysUserCashAccountDetail cashAccountDetail = new SysUserCashAccountDetail();
|
|
SysUserCashAccountDetail cashAccountDetail = new SysUserCashAccountDetail();
|
|
cashAccountDetail.setUserId(account.getUserId());
|
|
cashAccountDetail.setUserId(account.getUserId());
|
|
cashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW);
|
|
cashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW);
|
|
- cashAccountDetail.setAmount(withdraw.getAmount());
|
|
|
|
|
|
+ cashAccountDetail.setAmount(amount);
|
|
cashAccountDetail.setBalance(subtract);
|
|
cashAccountDetail.setBalance(subtract);
|
|
cashAccountDetail.setCreateTime(date);
|
|
cashAccountDetail.setCreateTime(date);
|
|
|
|
+ cashAccountDetail.setStatus(DealStatusEnum.ING);
|
|
cashAccountDetailService.insert(cashAccountDetail);
|
|
cashAccountDetailService.insert(cashAccountDetail);
|
|
- withdraw.setWithdrawNo(RandomStringUtils.random(8));
|
|
|
|
- studentWithdrawDao.insert(withdraw);
|
|
|
|
- }else {
|
|
|
|
|
|
+ } else {
|
|
throw new Exception("账户余额不足");
|
|
throw new Exception("账户余额不足");
|
|
}
|
|
}
|
|
- }else {
|
|
|
|
|
|
+ } else {
|
|
throw new Exception("账户状态异常");
|
|
throw new Exception("账户状态异常");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 保存提现记录
|
|
|
|
- *
|
|
|
|
- * @param withdrawDto
|
|
|
|
- */
|
|
|
|
- private Integer saveStudentWithdraw(WithdrawDto withdrawDto) {
|
|
|
|
- IdWorker idWorker = new IdWorker(0, 0);
|
|
|
|
- StudentWithdraw studentWithdraw = new StudentWithdraw();
|
|
|
|
- studentWithdraw.setWithdrawNo(idWorker.nextId());
|
|
|
|
- studentWithdraw.setUserId(withdrawDto.getUserId());
|
|
|
|
- studentWithdraw.setBankCardNo(withdrawDto.getBankCardNo());
|
|
|
|
- studentWithdraw.setAmount(withdrawDto.getAmount());
|
|
|
|
- studentWithdraw.setCreateTime(new Date());
|
|
|
|
- insert(studentWithdraw);
|
|
|
|
- return studentWithdraw.getId();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
}
|
|
}
|