|  |  |  | 
|---|
|  |  |  | import cc.mrbird.febs.mall.service.IMallMemberWithdrawService; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.service.MallMemberService; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.vo.CashOutSettingVo; | 
|---|
|  |  |  | import cn.hutool.core.util.ObjectUtil; | 
|---|
|  |  |  | import cn.hutool.core.util.StrUtil; | 
|---|
|  |  |  | import cn.hutool.crypto.SecureUtil; | 
|---|
|  |  |  | import com.alibaba.fastjson.JSONObject; | 
|---|
|  |  |  | 
|---|
|  |  |  | import lombok.RequiredArgsConstructor; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.math.BigDecimal; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void withdrawal(WithdrawalDto withdrawalDto) { | 
|---|
|  |  |  | Long memberId = LoginUserUtil.getLoginUser().getId(); | 
|---|
|  |  |  | MallMember mallMember = mallMemberService.getById(memberId); | 
|---|
|  |  |  | 
|---|
|  |  |  | throw new FebsException("支付密码错误"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (withdrawalDto.getAmount().compareTo(BigDecimal.valueOf(100)) < 0) { | 
|---|
|  |  |  | throw new FebsException("最小提现金额为100"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | MallMemberPayment payment = mallMemberPaymentMapper.selectByMemberId(memberId); | 
|---|
|  |  |  | if (payment == null) { | 
|---|
|  |  |  | throw new FebsException("未设置收款方式"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | BigDecimal profit = mallMoneyFlowMapper.selectProfitByDateAndMemberId(memberId); | 
|---|
|  |  |  | MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); | 
|---|
|  |  |  | if (profit != null) { | 
|---|
|  |  |  | // 可提现 | 
|---|
|  |  |  | BigDecimal canMoney = wallet.getCommission().subtract(profit); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(withdrawalDto.getAmount().compareTo(canMoney) > 0) { | 
|---|
|  |  |  | throw new FebsException("提现金额不足"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | CashOutSettingVo cashOutSettingVo = new CashOutSettingVo(); | 
|---|
|  |  |  | DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.CASHOUT_SETTING.getType(), DataDictionaryEnum.CASHOUT_SETTING.getCode()); | 
|---|
|  |  |  | if (dic != null) { | 
|---|
|  |  |  | cashOutSettingVo = JSONObject.parseObject(dic.getValue(), CashOutSettingVo.class); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (withdrawalDto.getAmount().compareTo(cashOutSettingVo.getMinCashOut()) < 0) { | 
|---|
|  |  |  | throw new FebsException("最小提现金额为"+cashOutSettingVo.getMinCashOut()+"元"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | walletService.reduce(withdrawalDto.getAmount(), memberId, "commission"); | 
|---|
|  |  |  | String orderNo = MallUtils.getOrderNum("W"); | 
|---|
|  |  |  | String openId = mallMember.getOpenId(); | 
|---|
|  |  |  | if(StrUtil.isEmpty(openId)){ | 
|---|
|  |  |  | throw new FebsException("没有绑定微信"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); | 
|---|
|  |  |  | if (ObjectUtil.isNotEmpty(wallet)) { | 
|---|
|  |  |  | // 可提现 | 
|---|
|  |  |  | BigDecimal canMoney = wallet.getBalance(); | 
|---|
|  |  |  | if(withdrawalDto.getAmount().compareTo(canMoney) > 0) { | 
|---|
|  |  |  | throw new FebsException("提现金额不足"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | walletService.reduce(withdrawalDto.getAmount(), memberId, "balance"); | 
|---|
|  |  |  | //        String withdrawalNo = "TX_"+MallUtils.getOrderNum(); | 
|---|
|  |  |  | MallMemberWithdraw withdraw = new MallMemberWithdraw(); | 
|---|
|  |  |  | withdraw.setWithdrawNo(orderNo); | 
|---|
|  |  |  | //        withdraw.setWithdrawNo(withdrawalNo); | 
|---|
|  |  |  | withdraw.setMemberId(memberId); | 
|---|
|  |  |  | withdraw.setAmount(withdrawalDto.getAmount()); | 
|---|
|  |  |  | withdraw.setStatus(1); | 
|---|
|  |  |  | withdraw.setAmountFee(cashOutSettingVo.getServiceFee().multiply(withdrawalDto.getAmount())); | 
|---|
|  |  |  | this.baseMapper.insert(withdraw); | 
|---|
|  |  |  | String withdrawalNo = "TX_"+withdraw.getId().toString(); | 
|---|
|  |  |  | withdraw.setWithdrawNo(withdrawalNo); | 
|---|
|  |  |  | this.baseMapper.updateById(withdraw); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | mallMemberService.addMoneyFlow(memberId, withdrawalDto.getAmount().negate(), MoneyFlowTypeEnum.WITHDRAWAL.getValue(), orderNo, null, null, null, 1, FlowTypeEnum.COMMISSION.getValue()); | 
|---|
|  |  |  | mallMemberService.addMoneyFlow(memberId, withdrawalDto.getAmount().negate(), MoneyFlowTypeEnum.WITHDRAWAL.getValue(), withdrawalNo, null, null, null, 1, FlowTypeEnum.BALANCE.getValue()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|