package com.mzl.flower.service.impl.wallet;
|
|
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.wallet.WalletDO;
|
import com.mzl.flower.enums.TrueOrFalseEnum;
|
import com.mzl.flower.mapper.wallet.WalletMapper;
|
import com.mzl.flower.service.supplier.SupplierService;
|
import com.mzl.flower.service.wallet.WalletReduceService;
|
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;
|
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.concurrent.TimeUnit;
|
import java.util.regex.Pattern;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author @TaoJie
|
* @since 2024-10-22
|
*/
|
@Service
|
public class WalletServiceImpl extends ServiceImpl<WalletMapper, WalletDO> implements WalletService {
|
|
@Autowired
|
private SupplierService supplierService;
|
|
@Autowired
|
private WalletReduceService walletReduceService;
|
|
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() {
|
String walletOnlineTime =baseMapper.selectWalletOnlineTime();
|
// 这里需要判断walletOnlineTime是不是一个正确的yyyy-mm-dd hh24:mi:ss的时间
|
String startTime;
|
if (isValidDateTime(walletOnlineTime)) {
|
startTime = walletOnlineTime;
|
} else {
|
// 如果 walletOnlineTime 无效,则使用当前时间的字符串
|
startTime = getCurrentDateTime();
|
}
|
return startTime;
|
}
|
|
@Override
|
public WalletDO getCurrentSupplier() {
|
final SupplierDTO currentSupplier = supplierService.getCurrentSupplier();
|
// 根据供应商ID获取钱包信息
|
|
// 查询的条件的deleted的字段得为0
|
// 下面的单独封装成一个方法
|
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(supplierId);
|
walletDO.setTotalAmount(BigDecimal.ZERO);
|
walletDO.setWithdrawableAmount(BigDecimal.ZERO);
|
//把所有涉及BigDecimal的金额都设置为0
|
walletDO.setWithdrawingAmount(BigDecimal.ZERO);
|
walletDO.setWithdrawnAmount(BigDecimal.ZERO);
|
walletDO.setSettlingAmount(BigDecimal.ZERO);
|
walletDO.setTotalDeduction(BigDecimal.ZERO);
|
walletDO.setTotalTransactionAmount(BigDecimal.ZERO);
|
walletDO.setSettledAmount(BigDecimal.ZERO);
|
walletDO.create(SecurityUtils.getUserId());
|
baseMapper.insert(walletDO);
|
// 将再次查询的结果返回
|
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) {
|
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);
|
}
|
return null;
|
}
|
|
@Override
|
public BigDecimal getWaittingSettlementAmount(WalletDO walletDO) {
|
|
return baseMapper.getWaittingSettlementAmount(walletDO);
|
}
|
|
@Override
|
public BigDecimal getSupplierTotalTransactionAmount(WalletDO walletDO) {
|
|
QueryWalletAmountDTO queryWalletAmountDTO=new QueryWalletAmountDTO();
|
queryWalletAmountDTO.setSupplierId(walletDO.getSupplierId());
|
queryWalletAmountDTO.setStartTime(getWalletOnLineTime());
|
queryWalletAmountDTO.setUserId(walletDO.getUserId());
|
|
BigDecimal totalTransactionAmount=baseMapper.getSupplierTotalTransactionAmount(queryWalletAmountDTO);
|
|
return totalTransactionAmount;
|
}
|
|
@Override
|
public BigDecimal getSupplierDeductAmount(WalletDO walletDO) {
|
QueryWalletAmountDTO queryWalletAmountDTO=new QueryWalletAmountDTO();
|
queryWalletAmountDTO.setSupplierId(walletDO.getSupplierId());
|
queryWalletAmountDTO.setStartTime(getWalletOnLineTime());
|
queryWalletAmountDTO.setUserId(walletDO.getUserId());
|
|
// 质检扣款
|
BigDecimal checkDeduceAmount = walletReduceService.getCheckReduceAmount(queryWalletAmountDTO);
|
checkDeduceAmount = checkDeduceAmount != null ? checkDeduceAmount : BigDecimal.ZERO;
|
// 售后扣款
|
BigDecimal saleDeduceAmount = walletReduceService.getSaleReduceAmount(queryWalletAmountDTO);
|
saleDeduceAmount = saleDeduceAmount != null ? saleDeduceAmount : BigDecimal.ZERO;
|
|
// 总扣款
|
BigDecimal deduceAmount = checkDeduceAmount.add(saleDeduceAmount);
|
|
return deduceAmount;
|
}
|
|
|
public static boolean isValidDateTime(String dateTime) {
|
if (dateTime == null || !dateTimeRegex.matcher(dateTime).matches()) {
|
return false;
|
}
|
SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_PATTERN);
|
sdf.setLenient(false);
|
try {
|
sdf.parse(dateTime);
|
return true;
|
} catch (Exception e) {
|
return false;
|
}
|
}
|
|
public static String getCurrentDateTime() {
|
SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_PATTERN);
|
return sdf.format(new Date());
|
}
|
}
|