Преглед на файлове

福本源-同步金额到缓存(充值、扣款、红包退回)

caoliqin преди 3 седмици
родител
ревизия
e788f7fd34

+ 9 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyDeductController.java

@@ -133,7 +133,15 @@ public class CompanyDeductController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         if(deduct.getIsAudit()==1){
             Company company=companyService.selectCompanyByIdForUpdate(deduct.getCompanyId());
-            company.setMoney(company.getMoney().subtract(deduct.getMoney()));
+
+            // 同步redis缓存
+            R r = companyRechargeService.syncUpdateRedisCompanyRecharge(company, deduct.getMoney(), 2);
+            if(!"200".equals(r.get("code").toString())){
+                return r;
+            }
+            // 充值后,需要同步更新余额到数据库,否则余额与缓存中的不一致
+            String newMoney = r.get("newMoney").toString();
+            company.setMoney(new BigDecimal(newMoney));
             companyService.updateCompany(company);
             CompanyMoneyLogs log=new CompanyMoneyLogs();
             log.setCompanyId(deduct.getCompanyId());

+ 10 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyRechargeController.java

@@ -122,7 +122,16 @@ public class CompanyRechargeController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         if(companyRecharge.getIsAudit()==1){
             Company company=companyService.selectCompanyById(companyRecharge.getCompanyId());
-            company.setMoney(company.getMoney().add(companyRecharge.getMoney()));
+
+            // 同步redis缓存
+            // 注意:在进行充值审核之前,需要先执行一下定时任务同步缓存数据到数据库,再进行后续操作,否则金额不正确
+            R r = companyRechargeService.syncUpdateRedisCompanyRecharge(company, companyRecharge.getMoney(), 1);
+            if(!"200".equals(r.get("code").toString())){
+                return r;
+            }
+            // 充值后,需要同步更新余额到数据库,否则余额与缓存中的不一致
+            String newMoney = r.get("newMoney").toString();
+            company.setMoney(new BigDecimal(newMoney));
             companyService.updateCompany(company);
             CompanyMoneyLogs log=new CompanyMoneyLogs();
             log.setCompanyId(companyRecharge.getCompanyId());

+ 42 - 11
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -1549,17 +1549,48 @@ public class CompanyServiceImpl implements ICompanyService
         if(companyId!=null&&companyId>0){
             Company company=companyMapper.selectCompanyByIdForUpdate(companyId);
             if(company!=null){
-                logger.info("退回红包金额:"+money);
-                company.setMoney(company.getMoney().add(money));
-                companyMapper.updateCompany(company);
-                CompanyMoneyLogs log=new CompanyMoneyLogs();
-                log.setCompanyId(company.getCompanyId());
-                log.setRemark("退回红包金额");
-                log.setMoney(money);
-                log.setLogsType(16);
-                log.setBalance(company.getMoney());
-                log.setCreateTime(new Date());
-                moneyLogsMapper.insertCompanyMoneyLogs(log);
+                String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + company.getCompanyId();
+                // 加锁,与看课发放红包的加锁保持一致
+                RLock lock = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + company.getCompanyId());
+                boolean lockAcquired = false;
+                try {
+                    lockAcquired = lock.tryLock(3, 10, TimeUnit.SECONDS);
+                    if (lockAcquired) {
+                        BigDecimal redisMoney;
+                        // 获取当前余额
+                        String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+                        if (StringUtils.isNotEmpty(moneyStr)) {
+                            redisMoney = new BigDecimal(moneyStr);
+                        } else {
+                            redisMoney = company.getMoney();
+                        }
+                        BigDecimal newMoney = redisMoney.add(money);
+                        logger.info("退回红包金额:"+money);
+                        company.setMoney(newMoney);
+                        companyMapper.updateCompany(company);
+                        CompanyMoneyLogs log=new CompanyMoneyLogs();
+                        log.setCompanyId(company.getCompanyId());
+                        log.setRemark("退回红包金额");
+                        log.setMoney(money);
+                        log.setLogsType(16);
+                        log.setBalance(newMoney);
+                        log.setCreateTime(new Date());
+                        moneyLogsMapper.insertCompanyMoneyLogs(log);
+
+                        redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
+                    }
+                } catch (Exception e) {
+                    logger.error("退回的红包同步增加到缓存和数据表,参数错误,请求异常,异常信息:{}", e.getMessage(), e);
+                } finally {
+                    if (lockAcquired && lock.isHeldByCurrentThread()) {
+                        try {
+                            lock.unlock();
+                        } catch (IllegalMonitorStateException e) {
+                            logger.warn("尝试释放非当前线程持有的锁: companyId:{}", company.getCompanyId());
+                        }
+                    }
+                }
+
             }
         }
     }