Administrator
2025-05-19 9b51a95fa8bc9b3a86108c6900e17fc55f8db467
src/main/java/cc/mrbird/febs/mall/service/impl/MallMemberWithdrawServiceImpl.java
@@ -3,6 +3,7 @@
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.MallUtils;
@@ -14,16 +15,24 @@
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.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
/**
 * @author wzy
@@ -42,6 +51,7 @@
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void withdrawal(WithdrawalDto withdrawalDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = mallMemberService.getById(memberId);
@@ -59,9 +69,23 @@
        if (dic != null) {
            cashOutSettingVo = JSONObject.parseObject(dic.getValue(), CashOutSettingVo.class);
        }
        DataDictionaryCustom withdrawalCnt = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MEMBER_WITHDRAWAL_CNT.getType(), DataDictionaryEnum.MEMBER_WITHDRAWAL_CNT.getCode());
        if (withdrawalDto.getAmount().compareTo(cashOutSettingVo.getMinCashOut()) < 0) {
            throw new FebsException("最小提现金额为"+withdrawalCnt.getValue()+"元");
            throw new FebsException("最小提现金额为"+cashOutSettingVo.getMinCashOut()+"元");
        }
        DateTime dateTime = DateUtil.beginOfDay(new Date());
        List<MallMemberWithdraw> mallMemberWithdraws = this.baseMapper.selectList(
                new LambdaQueryWrapper<MallMemberWithdraw>()
                        .ge(MallMemberWithdraw::getCreatedTime, dateTime)
        );
        if(CollUtil.isNotEmpty(mallMemberWithdraws)){
            //stream流操作mallMemberWithdraws,获取amount的总和
            BigDecimal sum = mallMemberWithdraws.stream().map(MallMemberWithdraw::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal sumTotal = sum.add(withdrawalDto.getAmount());
            BigDecimal allCashOut = cashOutSettingVo.getAllCashOut();
            if(sumTotal.compareTo(allCashOut) > 0){
                BigDecimal subtract = allCashOut.subtract(sum).setScale(2, RoundingMode.HALF_DOWN);
                throw new FebsException("今日还能提现"+subtract);
            }
        }
        String openId = mallMember.getOpenId();
@@ -79,14 +103,27 @@
        }
        walletService.reduce(withdrawalDto.getAmount(), memberId, "balance");
        String withdrawalNo = "TX_"+MallUtils.getOrderNum();
//        String withdrawalNo = "TX_"+MallUtils.getOrderNum();
        MallMemberWithdraw withdraw = new MallMemberWithdraw();
        withdraw.setWithdrawNo(withdrawalNo);
//        withdraw.setWithdrawNo(withdrawalNo);
        withdraw.setMemberId(memberId);
        withdraw.setAmount(withdrawalDto.getAmount());
        withdraw.setStatus(1);
        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(), withdrawalNo, null, null, null, 1, FlowTypeEnum.BALANCE.getValue());
        mallMemberService.addMoneyFlow(
                memberId,
                withdrawalDto.getAmount().negate(),
                ScoreFlowTypeEnum.WITHDRAWAL.getValue(),
                withdrawalNo,
                StrUtil.format(ScoreFlowTypeEnum.WITHDRAWAL.getDesc(),withdrawalDto.getAmount()),
                StrUtil.format(ScoreFlowTypeEnum.WITHDRAWAL.getDesc(),withdrawalDto.getAmount()),
                null,
                1,
                FlowTypeEnum.BALANCE.getValue()
        );
    }
}