陶杰
2024-10-28 66f57ebef36c03353609ad3b2b6623396b5061a4
1.供应商-钱包创建并发控制
已修改5个文件
75 ■■■■ 文件已修改
src/main/java/com/mzl/flower/constant/LockConstants.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/impl/wallet/WalletBillRecordServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/impl/wallet/WalletServiceImpl.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/impl/wallet/WalletWithdrawRecordServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/wallet/WalletService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/constant/LockConstants.java
@@ -3,6 +3,8 @@
public class LockConstants {
    // 钱包ID锁
    public static final String WALLET_ID_KEY = "WALLET_ID_KEY:%s";
    public static final String WALLET_ID_KEY = "com:mzl:flower:constant:WALLET_ID_KEY:%s";
    public static final String WALLET_SUPPLIER_ID_KEY = "com:mzl:flower:constant:WALLET_SUPPLIER_ID_KEY:%s";
}
src/main/java/com/mzl/flower/service/impl/wallet/WalletBillRecordServiceImpl.java
@@ -6,7 +6,6 @@
import com.mzl.flower.dto.request.wallet.CreateWalletBillRecordDTO;
import com.mzl.flower.dto.request.wallet.QueryWalletBillDTO;
import com.mzl.flower.dto.response.wallet.WalletBillRecordVO;
import com.mzl.flower.dto.response.wallet.WalletWithdrawRecordVO;
import com.mzl.flower.entity.payment.Transfer;
import com.mzl.flower.entity.payment.TransferDetail;
import com.mzl.flower.entity.wallet.WalletBillRecordDO;
@@ -80,7 +79,7 @@
                walletBillRecordDO.update("sys");
                walletBillRecordMapper.updateById(walletBillRecordDO);
                //更新钱包
                WalletDO walletDO = walletService.getBySupplierId(walletBillRecordDO.getWalletId());
                WalletDO walletDO = walletService.getOrCreateBySupplierId(walletBillRecordDO.getWalletId());
                if(!ObjectUtils.isEmpty(walletDO)){
                    //提现中金额:减少提现中金额
                    walletDO.setWithdrawingAmount(walletDO.getWithdrawingAmount().subtract(walletBillRecordDO.getChangeAmount()));
@@ -99,7 +98,7 @@
                walletBillRecordDO.setTransferState(Constants.SETTLEMENT_STATUS.FAILED.name());
                walletBillRecordDO.update("sys");
                walletBillRecordMapper.updateById(walletBillRecordDO);
                WalletDO walletDO = walletService.getBySupplierId(walletBillRecordDO.getWalletId());
                WalletDO walletDO = walletService.getOrCreateBySupplierId(walletBillRecordDO.getWalletId());
                if(!ObjectUtils.isEmpty(walletDO)){
                    //提现中金额:减少提现中金额
                    walletDO.setWithdrawingAmount(walletDO.getWithdrawingAmount().subtract(walletBillRecordDO.getChangeAmount()));
src/main/java/com/mzl/flower/service/impl/wallet/WalletServiceImpl.java
@@ -2,9 +2,9 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mzl.flower.config.security.SecurityUtils;
import com.mzl.flower.constant.LockConstants;
import com.mzl.flower.dto.request.wallet.QueryWalletAmountDTO;
import com.mzl.flower.dto.response.supplier.SupplierDTO;
import com.mzl.flower.entity.coupon.CouponTemplateDO;
import com.mzl.flower.entity.wallet.WalletDO;
import com.mzl.flower.enums.TrueOrFalseEnum;
import com.mzl.flower.mapper.wallet.WalletMapper;
@@ -13,6 +13,8 @@
import com.mzl.flower.service.wallet.WalletService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -20,6 +22,7 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
/**
@@ -42,6 +45,8 @@
    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    private static final Pattern dateTimeRegex = Pattern.compile("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$");
    @Autowired
    RedissonClient redissonClient;
    @Override
    public String getWalletOnLineTime() {
@@ -64,13 +69,25 @@
            // 查询的条件的deleted的字段得为0
            // 下面的单独封装成一个方法
            WalletDO walletDO = getBySupplierId(currentSupplier.getId());
            WalletDO walletDO = getOrCreateBySupplierId(currentSupplier.getId());
        return walletDO;
    }
    @Override
    public WalletDO getOrCreateBySupplierId(Long supplierId) {
        WalletDO walletDO=getBySupplierId(supplierId);
            if(null==walletDO){
                // 先创建一个钱包
            RLock lock = redissonClient.getLock(String.format(LockConstants.WALLET_SUPPLIER_ID_KEY, supplierId));
            try {
                if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                    try {
                        walletDO=getBySupplierId(supplierId);
                        if(null!=walletDO) return walletDO;
                        // 创建一个钱包
                walletDO=new WalletDO();
                walletDO.setUserId(SecurityUtils.getUserId());
                walletDO.setSupplierId(currentSupplier.getId());
                        walletDO.setSupplierId(supplierId);
                walletDO.setTotalAmount(BigDecimal.ZERO);
                walletDO.setWithdrawableAmount(BigDecimal.ZERO);
                //把所有涉及BigDecimal的金额都设置为0
@@ -83,23 +100,32 @@
                walletDO.create(SecurityUtils.getUserId());
                baseMapper.insert(walletDO);
                // 将再次查询的结果返回
                walletDO=getBySupplierId(currentSupplier.getId());
                        walletDO= getBySupplierId(supplierId);
                        return walletDO;
                    } finally {
                        lock.unlock();
                    }
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return null;
        }else{
        return walletDO;
        }
    }
    @Override
    public WalletDO getBySupplierId(Long supplierId) {
        // 不用getOne,用获取list的第一个元素
        List<WalletDO> walletDOS = baseMapper.selectList(new LambdaQueryWrapper<WalletDO>()
                .eq(WalletDO::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
                .eq(WalletDO::getSupplierId, supplierId));
        if(!CollectionUtils.isEmpty(walletDOS)){
            return walletDOS.get(0);
        }else return null;
        }
        return null;
    }
    @Override
src/main/java/com/mzl/flower/service/impl/wallet/WalletWithdrawRecordServiceImpl.java
@@ -252,7 +252,7 @@
        if (Constants.WALLET_APPROVE_STATE.REJECT.name().equals(walletWithdrawRecordDTO.getApproveState())) {
            //更新钱包
            Supplier s = supplierMapper.selectById(withdrawRecordDO.getSupplierId());
            WalletDO walletDO = walletService.getBySupplierId(s.getId());
            WalletDO walletDO = walletService.getOrCreateBySupplierId(s.getId());
            if(!ObjectUtils.isEmpty(walletDO)){
                //提现中金额:审核失败体现中金额扣减
                walletDO.setWithdrawingAmount(walletDO.getWithdrawingAmount().subtract(withdrawRecordDO.getAmount()));
src/main/java/com/mzl/flower/service/wallet/WalletService.java
@@ -15,11 +15,31 @@
 */
public interface WalletService extends IService<WalletDO> {
    /**
     * 获取钱包的上线时间
     * @return
     */
    String getWalletOnLineTime();
    /**
     * 获取当前登录供应商的钱包信息
     * @return 钱包信息
     */
    WalletDO getCurrentSupplier();
    /**
     * 先尝试获取,如果不存在则创建。
     * @param supplierId 供应商ID
     * @return 钱包信息
     */
    WalletDO getOrCreateBySupplierId(Long supplierId);
    /**
     * 根据供应商的ID获取钱包信息
     * @param supplierId 供应商ID
     * @return 钱包信息
     */
    WalletDO getBySupplierId(Long supplierId);
    BigDecimal getWaittingSettlementAmount(WalletDO walletDO);