Przeglądaj źródła

fix: 润天公司账户充值

xdd 4 dni temu
rodzic
commit
e06b07c97d

+ 72 - 8
fs-admin/src/main/java/com/fs/qw/FsCourseTask.java

@@ -1,18 +1,26 @@
 package com.fs.qw;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.qw.service.IQwWorkTaskService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
+import io.jsonwebtoken.lang.Assert;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.http.util.Asserts;
+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.math.RoundingMode;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 后台统计相关 定时任务
@@ -29,21 +37,77 @@ public class FsCourseTask {
     private static final String REDPACKET_COMPANY_MONEY_CHANGE = "redpacket_money_CHANGE";
     @Autowired
     private SysConfigMapper sysConfigMapper;
+    private static final String REDPACKET_POOL_LOCK = "redpacket_pool_lock";
+    private static final String REDPACKET_COMPANY_MONEY = "redpacket_money";
+
+    @Autowired
+    private RedissonClient redissonClient;
+
     /**
-     * 公司红包金额变更
+     * 润天公司账户充值
+     * @param chargeMoney 充值金额
      */
-    public void redpacketCompanyMoneyChange(){
-        List<BigDecimal> moneyChange = redisCache.getCacheList(REDPACKET_COMPANY_MONEY_CHANGE);
-        log.info("公司账户红包余额变更 {} -> {}",moneyChange.get(0).toPlainString(),moneyChange.get(1).toPlainString());
+    public void rechargeRedpacketMoney(String chargeMoney){
+        Assert.notNull(chargeMoney,"充值金额不能为空!");
+
+        log.info("润天公司账户充值 充值金额: {}",chargeMoney);
+
+        RLock lock = redissonClient.getLock(REDPACKET_POOL_LOCK);
+        try{
+            boolean locked = lock.tryLock(3, 10, TimeUnit.SECONDS);
 
-        if(CollectionUtils.isNotEmpty(moneyChange)){
+            if (!locked) {
+                log.error("获取锁失败...");
+                return;
+            }
+
+            BigDecimal redPacketCompanyMoney = redisCache.getCacheObject(REDPACKET_COMPANY_MONEY);
+            if(ObjectUtils.isNull(redPacketCompanyMoney)){
+                redPacketCompanyMoney = BigDecimal.ZERO;
+            }
+            BigDecimal value = redPacketCompanyMoney.add(new BigDecimal(chargeMoney));
+
+            log.info("润天公司账户充值成功 目前余额: {}",value);
+
+            redisCache.setCacheObject(REDPACKET_COMPANY_MONEY,value);
+
+
+            // 保存到数据库
             SysConfig sysConfig = new SysConfig();
-            BigDecimal bigDecimal = moneyChange.get(1);
-            sysConfig.setConfigValue(bigDecimal.setScale(4, RoundingMode.HALF_UP).toPlainString());
+            sysConfig.setConfigValue(value.setScale(4, RoundingMode.HALF_UP).toPlainString());
             sysConfig.setConfigKey("company.money");
             sysConfigMapper.updateConfig(sysConfig);
 
-            redisCache.deleteObject(REDPACKET_COMPANY_MONEY_CHANGE);
+        }catch (Exception e){
+            log.error("充值失败 原因:{}", ExceptionUtils.getFullStackTrace(e),e);
+            throw new RuntimeException(e);
+        }finally {
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
+    /**
+     * 公司红包金额变更
+     */
+    public void redpacketCompanyMoneyChange(){
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("company.money");
+        Asserts.notNull(sysConfig,"公司账户配置不能为空!");
+
+        String configValue = sysConfig.getConfigValue();
+        Asserts.notNull(configValue,"公司账户余额不能为空");
+
+        BigDecimal oldBigDecimal = new BigDecimal(configValue);
+
+        BigDecimal redPacketCompanyMoney = redisCache.getCacheObject(REDPACKET_COMPANY_MONEY);
+
+        log.info("公司账户红包余额变更 {} -> {}",oldBigDecimal,redPacketCompanyMoney);
+
+        // 如果两者不一致才同步到数据库
+        if(oldBigDecimal.compareTo(redPacketCompanyMoney) != 0){
+            sysConfig.setConfigValue(redPacketCompanyMoney.setScale(4, RoundingMode.HALF_UP).toPlainString());
+            sysConfig.setConfigKey("company.money");
+            sysConfigMapper.updateConfig(sysConfig);
         }
     }
     /**

+ 0 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1208,8 +1208,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 // 更新账户余额
                 logger.info("[更新账户余额] 当前余额{} 更新后余额{}",companyMoney.toPlainString(),companyMoney.subtract(amount).toPlainString());
 
-                redisCache.setCacheList(REDPACKET_COMPANY_MONEY_CHANGE, Arrays.asList(companyMoney,companyMoney.subtract(amount)));
-
                 companyMoney = companyMoney.subtract(amount);
                 redisCache.setCacheObject(REDPACKET_COMPANY_MONEY,companyMoney);
             }