package com.ydd.module.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ydd.common.core.domain.entity.SysUser; import com.ydd.common.enums.DadaDspWithdrawalStatusEnum; import com.ydd.common.exception.CustomException; import com.ydd.common.utils.DateUtils; import com.ydd.module.domain.DadaDsp; import com.ydd.module.domain.DadaDspBankCard; import com.ydd.module.domain.DadaDspWithdrawal; import com.ydd.module.dto.DadaDspAccountDto; import com.ydd.module.dto.DadaDspAccountListDto; import com.ydd.module.dto.DadaDspWithdrawalDto; import com.ydd.module.expection.CustomWebException; import com.ydd.module.mapper.DadaDspWithdrawalMapper; import com.ydd.module.service.IDadaDspBankCardService; import com.ydd.module.service.IDadaDspService; import com.ydd.module.service.IDadaDspWithdrawalService; import com.ydd.third.common.utils.StringUtils; import lombok.RequiredArgsConstructor; import org.apache.commons.compress.utils.Lists; 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.List; /** * 达达配送商-提现管理serviceImpl * * @author 叶君翔 * @date 2021-12-29 */ @RequiredArgsConstructor(onConstructor_ = @Autowired) @Service public class DadaDspWithdrawalServiceImpl extends ServiceImpl implements IDadaDspWithdrawalService { private final IDadaDspService iDadaDspService; private final IDadaDspBankCardService iDadaDspBankCardService; @Override public List queryList(DadaDspAccountListDto accountDto, Long dadaDspId) { if (!StringUtils.isEmpty(accountDto.getStartDate())) { accountDto.setStartDate(DateUtils.parseToBeginTime(accountDto.getStartDate())); } if (!StringUtils.isEmpty(accountDto.getEndDate())) { accountDto.setEndDate(DateUtils.parseToTomorrowBeginTime(accountDto.getEndDate())); } List list = baseMapper.queryList(accountDto, dadaDspId); list.forEach(dto-> { DadaDspBankCard bankCard = iDadaDspBankCardService.getOne(new QueryWrapper().eq("dada_dsp_id", dto.getDadaDspId()) .eq("card_no", dto.getAccount())); if (bankCard != null && StringUtils.isNotBlank(bankCard.getBankName())) { dto.setBankName(bankCard.getBankName()); } }); return CollectionUtils.isNotEmpty(list) ? list : Lists.newArrayList(); } @Override public DadaDspAccountDto getInfo(Long id) { DadaDspAccountDto accountDto = new DadaDspAccountDto(); DadaDsp dadaDsp = iDadaDspService.getById(id); accountDto.setCanWithdrawalAmount(dadaDsp != null ? dadaDsp.getAmount() : BigDecimal.ZERO); BigDecimal inWithdrawalAmount = baseMapper.selectTotalAmountByDadaDspId(id); accountDto.setInWithdrawalAmount(inWithdrawalAmount != null ? inWithdrawalAmount : BigDecimal.ZERO); return accountDto; } @Override public boolean deleteBankCard(Long id) { return false; } @Override @Transactional(rollbackFor = Exception.class) public boolean addWithdrawal(DadaDspWithdrawal withdrawal, SysUser user) { if (StringUtils.isBlank(withdrawal.getAccount())) { throw new CustomWebException("提现账号不可为空!"); } if (StringUtils.isEmpty(withdrawal.getType())) { throw new CustomWebException("提现类型不可为空!"); } if (!StringUtils.isBlank(withdrawal.getAccount()) && withdrawal.getType() == 0 && StringUtils.isBlank(withdrawal.getZfbName())) { throw new CustomWebException("支付宝提现姓名不可为空!"); } if (StringUtils.isEmpty(withdrawal.getAmount()) || withdrawal.getAmount().compareTo(BigDecimal.ZERO) <= 0) { throw new CustomWebException("提现金额必须大于0"); } DadaDsp dadaDsp = iDadaDspService.getById(user.getDadaDspId()); if (dadaDsp == null){ throw new CustomWebException("风险操作,已被系统拦截!"); } // 校验余额是否充足 if (withdrawal.getAmount().compareTo(dadaDsp.getAmount()) > 0){ throw new CustomWebException("余额不足, 发起提现失败!"); } withdrawal.setDadaDspId(dadaDsp.getId()); withdrawal.setStatus(DadaDspWithdrawalStatusEnum.WAIT.getType()); int result1 = baseMapper.insert(withdrawal); if (result1 != 1) { throw new CustomWebException("发起提现失败!"); } dadaDsp.setAmount(dadaDsp.getAmount().subtract(withdrawal.getAmount())); boolean result2 = iDadaDspService.updateById(dadaDsp); if (!result2) { throw new CustomWebException("发起提现失败!"); } return true; } @Override public List withdrawalList(DadaDspAccountListDto accountDto) { if (!StringUtils.isEmpty(accountDto.getStartDate())) { accountDto.setStartDate(DateUtils.parseToBeginTime(accountDto.getStartDate())); } if (!StringUtils.isEmpty(accountDto.getEndDate())) { accountDto.setEndDate(DateUtils.parseToTomorrowBeginTime(accountDto.getEndDate())); } List list = baseMapper.withdrawalList(accountDto); list.forEach(dto-> { DadaDspBankCard bankCard = iDadaDspBankCardService.getOne(new QueryWrapper().eq("dada_dsp_id", dto.getDadaDspId()) .eq("card_no", dto.getAccount())); if (bankCard != null && StringUtils.isNotBlank(bankCard.getBankName())) { dto.setBankName(bankCard.getBankName()); } }); return CollectionUtils.isNotEmpty(list) ? list : Lists.newArrayList(); } @Override public DadaDspWithdrawalDto getDadaWithdrawal(Long id) { DadaDspWithdrawalDto withdrawalDto = new DadaDspWithdrawalDto(); DadaDspWithdrawal withdrawal = baseMapper.selectById(id); BeanUtils.copyProperties(withdrawal, withdrawalDto); DadaDspBankCard bankCard = iDadaDspBankCardService.getOne(new QueryWrapper().eq("deleted", 0) .eq("dada_dsp_id", withdrawalDto.getDadaDspId()) .eq("card_no", withdrawalDto.getAccount())); if (bankCard != null && StringUtils.isNotBlank(bankCard.getBankName())) { withdrawalDto.setBankName(bankCard.getBankName()); } return withdrawalDto; } @Override @Transactional(rollbackFor = Exception.class) public boolean verify(DadaDspWithdrawal withdrawal, SysUser user) { DadaDspWithdrawal dadaDspWithdrawal = this.getById(withdrawal.getId()); if (dadaDspWithdrawal == null) { throw new CustomWebException("提现申请记录不存在"); } if (DadaDspWithdrawalStatusEnum.REFUSE.getType().equals(withdrawal.getStatus()) && StringUtils.isBlank(withdrawal.getRemark())) { throw new CustomWebException("拒绝提现备注必须填写!"); } DadaDsp dadaDsp = iDadaDspService.getById(dadaDspWithdrawal.getDadaDspId()); if (dadaDsp == null){ throw new CustomException("配送商信息不存在"); } dadaDspWithdrawal.setStatus(withdrawal.getStatus()); dadaDspWithdrawal.setRemark(withdrawal.getRemark()); // 拒绝提现 if (DadaDspWithdrawalStatusEnum.REFUSE.getType().equals(withdrawal.getStatus())) { // 还原配送商商账户可提现余额 dadaDsp.setAmount(dadaDsp.getAmount().add(dadaDspWithdrawal.getAmount())); iDadaDspService.updateById(dadaDsp); } this.updateById(dadaDspWithdrawal); return true; } }