ソースを参照

医健宝-流量统计相关优化

chenguo 1 日 前
コミット
8c4f742639

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

@@ -37,7 +37,7 @@ public class CompanyTrafficController extends BaseController {
     /**
      * 每天扣除流量余额
      * */
-    @Scheduled(cron = "0 0 0 * * ?")
+    @Scheduled(cron = "0 1 0 * * ?")
     public void refreshTraffic(){
         if("1".equals(medicalMallConfig.getStatics()))
             companyTrafficRecordService.refreshTraffic();

+ 19 - 17
fs-service/src/main/java/com/fs/company/service/impl/CompanyTrafficRecordServiceImpl.java

@@ -22,6 +22,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.YearMonth;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -71,6 +73,10 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
             //更新缓存
             redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + companyId);
             redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + companyId, balance);
+            //删除前天流量缓存(如果存在;保留两天)
+            redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + companyId + ":" + LocalDate.now().minusDays(2));
+            //删除上上个月流量缓存
+            redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + companyId + ":" + YearMonth.now().minusMonths(2));
         }
 
         // 缓存 key=CACHE_KEY:deptId  value=部门ID
@@ -88,23 +94,14 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
 
     //通过redis更新表流量并添加扣除日志
     private void doReduce(CompanyTrafficRecord companyTrafficRecord, String doType) {
-        //redis获取剩余流量
-        Object traffic = redisCache.getCacheObject(CompanyTrafficConstants.CACHE_KEY + ":" + companyTrafficRecord.getDeptId() + ":" + companyTrafficRecord.getCompanyId());
-        if(traffic!=null) {
-            Long balance;
-            if(traffic instanceof Long) {
-                balance = (Long) traffic;
-            }else if(traffic instanceof Integer){
-                balance = ((Integer) traffic).longValue();
-            }else if(traffic instanceof String){
-                balance = Long.parseLong(traffic.toString());
-            }else{
-                throw new IllegalArgumentException("流量转换异常");
-            }
-            long trafficAmount = companyTrafficRecord.getBalance() - balance;
+
+        //根据fs_course_traffic_log表获取公司昨天流量
+        Long trafficAmountYesterday = fsCourseTrafficLogMapper.sumTrafficByCompanyYesterday(companyTrafficRecord.getCompanyId());
+        if(trafficAmountYesterday!=null) {
+            long balance = companyTrafficRecord.getBalance() - trafficAmountYesterday;
             companyTrafficRecord.setBalance(balance);
-            log.info("【更新流量】:{}", "部门ID:" + companyTrafficRecord.getDeptId() +"公司ID:" + companyTrafficRecord.getCompanyId() +  "消耗流量:" + trafficAmount+"剩余流量:"+balance);
-            if (trafficAmount > 0) {
+            log.info("【更新流量】:{}", "部门ID:" + companyTrafficRecord.getDeptId() +"公司ID:" + companyTrafficRecord.getCompanyId() +  "消耗流量:" + trafficAmountYesterday+"剩余流量:"+balance);
+            if (trafficAmountYesterday > 0) {
                 baseMapper.updateById(CompanyTrafficRecord.builder()
                         .id(companyTrafficRecord.getId())
                         .balance(balance)
@@ -112,7 +109,7 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
                         .updateBy(1L).build());
                 companyTrafficRecordLogService.save(CompanyTrafficRecordLog.builder()
                         .balance(balance)
-                        .trafficAmount(trafficAmount)
+                        .trafficAmount(trafficAmountYesterday)
                         .companyId(companyTrafficRecord.getCompanyId())
                         .createTime(new Date())
                         .operationType(2)
@@ -122,6 +119,7 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
                         .build());
             }
         }
+        init();
     }
 
     @Override
@@ -221,6 +219,10 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
             Long total = baseMapper.calculateTotalTrafficByDeptId(deptId);
             redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId);
             redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, total-totalTraffic);
+            //删除前天缓存
+            redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + LocalDate.now().minusDays(2));
+            //删除上上月缓存
+            redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + YearMonth.now().minusMonths(2));
         });
     }
 

+ 4 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseTrafficLogMapper.java

@@ -191,4 +191,8 @@ public interface FsCourseTrafficLogMapper
     @Select("SELECT SUM(T.internet_traffic)/1024 AS totalInternetTraffic FROM fs_course_traffic_log T " +
             "WHERE DATE(T.create_time) = DATE(CURDATE()) AND T.company_id = #{companyId} GROUP BY T.company_id ")
     Long sumTrafficByCompany(Long companyId);
+
+    @Select("SELECT SUM(T.internet_traffic)/1024 AS totalInternetTraffic FROM fs_course_traffic_log T " +
+            "WHERE DATE(T.create_time) = DATE(CURDATE() - INTERVAL 1 DAY) AND T.company_id = #{companyId} GROUP BY T.company_id ")
+    Long sumTrafficByCompanyYesterday(Long companyId);
 }

+ 20 - 22
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -813,12 +813,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
             // 处理 UUID 为空的情况
             if (StringUtils.isNotEmpty(trafficLog.getUuId())) {
-                // 直接插入或更新
-//                logger.error("zyp \n【插入或更新流量】:{}",trafficLog);
+                // 插入或更新
                 fsCourseTrafficLogMapper.insertOrUpdateTrafficLog(trafficLog);
-                if(trafficLog.getLogId() != null)
-                    //扣除流量
-                    asyncDeductTraffic(company, roundedResult/1024);
+                asyncDeductTraffic(company, trafficLog);
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -829,11 +826,21 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         return R.ok();
     }
 
-    @Async
-    public void asyncDeductTraffic(Company company, Long traffic) {
+    public void asyncDeductTraffic(Company company, FsCourseTrafficLog trafficLog) {
         try {
+            //根据uuid查询
+            FsCourseTrafficLog existingLog = fsCourseTrafficLogMapper.selectFsCourseTrafficLogByuuId(trafficLog.getUuId());
+            long recordedTraffic;
+            if (existingLog != null) {
+                recordedTraffic = trafficLog.getInternetTraffic() - existingLog.getInternetTraffic();
+            }else{
+                recordedTraffic = trafficLog.getInternetTraffic();
+            }
+            if (recordedTraffic <= 0) {
+                return;
+            }
             // 扣除流量
-            Long remainingTraffic = updateRedisCache(company, traffic);
+            Long remainingTraffic = updateRedisCache(company, recordedTraffic/1024);
 
             if ("1".equals(configUtil.generateConfigByKey("watch.course.config").getString("doNotPlay")) && remainingTraffic <= 0) {
                 logger.warn("公司ID: {} 流量不足,当前剩余: {}", company.getCompanyId(), remainingTraffic);
@@ -843,8 +850,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             /*logger.info("异步扣除流量成功 - 公司ID: {}, 扣除流量: {}, 剩余流量: {}",
                     company.getCompanyId(), traffic, remainingTraffic);*/
         } catch (Exception e) {
-            logger.error("异步扣除流量失败 - 公司ID: {}, 扣除流量: {}, 错误信息: {}",
-                    company.getCompanyId(), traffic, e.getMessage(), e);
+            logger.error("异步扣除流量失败 - 公司ID: {}, 错误信息: {}",
+                    company.getCompanyId(), e.getMessage(), e);
         }
     }
 
@@ -859,8 +866,6 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         String deptDayKey = deptKey + ":"+ LocalDate.now();
         String deptMonthKey = deptKey + ":"+ YearMonth.now();
 
-        String dayKey = CompanyTrafficConstants.CACHE_KEY+ ":1:"+ LocalDate.now();
-        String monthKey = CompanyTrafficConstants.CACHE_KEY+ ":1:"+ YearMonth.now();
         String lockKey = companyKey + ":lock";
         //销售公司剩余流量
         Object companyTraffic = redisCache.getCacheObject(companyKey);
@@ -874,20 +879,15 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }else{
             throw new IllegalArgumentException("流量转换异常");
         }
-        if(balance<0){
-            return balance;
-        }
         try {
-            if (redisCache.setIfAbsent(lockKey, "1", 3, TimeUnit.SECONDS)) {
+            if (redisCache.setIfAbsent(lockKey, "1", 2, TimeUnit.SECONDS)) {
                 try {
                     balance = redisCache.decr(companyKey, traffic);
                    redisCache.decr(deptKey, traffic);
                    redisCache.incr(companyDayKey, traffic);
                    redisCache.incr(deptDayKey, traffic);
-                   redisCache.incr(dayKey, traffic);
                    redisCache.incr(companyMonthKey, traffic);
                    redisCache.incr(deptMonthKey, traffic);
-                   redisCache.incr(monthKey, traffic);
                 } finally {
                     redisCache.deleteObject(lockKey); // 释放锁
                 }
@@ -2702,11 +2702,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             Company company = companyMapper.selectCompanyById(param.getCompanyId());
             // 处理 UUID 为空的情况
             if (StringUtils.isNotEmpty(trafficLog.getUuId())) {
-                // 直接插入或更新
-//                logger.error("zyp \n【插入或更新流量】:{}",trafficLog);
+                // 插入或更新
                 fsCourseTrafficLogMapper.insertOrUpdateTrafficLog(trafficLog);
-                if(trafficLog.getLogId() != null)
-                    asyncDeductTraffic(company, roundedResult/1024);
+                asyncDeductTraffic(company, trafficLog);
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 1 - 1
fs-service/src/main/java/com/fs/statis/service/impl/StatisticsCompanyServiceImpl.java

@@ -705,7 +705,7 @@ public class StatisticsCompanyServiceImpl implements IStatisticsCompanyService {
         dto.setUserType(userType);
         dto.setCompanyId(companyId);
         List<RewardMoneyTrendDTO> rewardMoneyTrendDTOS = rewardMoneyTrendDTO(dto);
-        redisCache.setCacheObject( String.format("%s:%d:%d", CHARTS_REWARD_MONEY_TREND, type,userType), rewardMoneyTrendDTOS);
+        redisCache.setCacheObject( String.format("%s:%d:%d:%d", CHARTS_REWARD_MONEY_TREND, type,userType,companyId), rewardMoneyTrendDTOS);
 
     }