From ddca8e96ee1aa47ba33fcf3a9a1e7e964d63ad8b Mon Sep 17 00:00:00 2001
From: 陶杰 <1378534974@qq.com>
Date: 星期四, 31 十月 2024 17:15:43 +0800
Subject: [PATCH] fix: 钱包供应商财务1

---
 src/main/java/com/mzl/flower/service/impl/wallet/WalletServiceImpl.java |  179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 179 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/mzl/flower/service/impl/wallet/WalletServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/wallet/WalletServiceImpl.java
index d32bf77..1f3d758 100644
--- a/src/main/java/com/mzl/flower/service/impl/wallet/WalletServiceImpl.java
+++ b/src/main/java/com/mzl/flower/service/impl/wallet/WalletServiceImpl.java
@@ -1,10 +1,31 @@
 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.supplier.Supplier;
 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 org.springframework.util.StringUtils;
+
+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>
@@ -17,4 +38,162 @@
 @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;
+
+                        final Supplier supplier = supplierService.getSupplierById(supplierId);
+
+                        // 创建一个钱包
+                        walletDO =new WalletDO();
+                        walletDO.setUserId(supplier.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) {
+        if(null!=walletDO && !StringUtils.isEmpty(walletDO.getSupplierId()) && StringUtils.isEmpty(walletDO.getUserId())){
+            final Supplier supplier = supplierService.getSupplierById(walletDO.getSupplierId());
+            walletDO.setUserId(supplier.getUserId());
+        }
+        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());
+    }
 }

--
Gitblit v1.9.3