|
@@ -1,7 +1,6 @@
|
|
package com.fs.course.service.impl;
|
|
package com.fs.course.service.impl;
|
|
|
|
|
|
-import java.util.Collections;
|
|
|
|
-import java.util.List;
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
import com.fs.common.exception.CustomException;
|
|
import com.fs.common.exception.CustomException;
|
|
@@ -9,8 +8,12 @@ import com.fs.common.utils.DateUtils;
|
|
import com.fs.common.utils.DictUtils;
|
|
import com.fs.common.utils.DictUtils;
|
|
import com.fs.company.cache.ICompanyCacheService;
|
|
import com.fs.company.cache.ICompanyCacheService;
|
|
import com.fs.course.param.FsCourseTrafficLogParam;
|
|
import com.fs.course.param.FsCourseTrafficLogParam;
|
|
|
|
+import com.fs.course.param.InternetTrafficParam;
|
|
|
|
+import com.fs.course.param.TrafficRecord;
|
|
import com.fs.course.vo.FsCourseTrafficLogListVO;
|
|
import com.fs.course.vo.FsCourseTrafficLogListVO;
|
|
import com.fs.store.service.cache.IFsUserCourseCacheService;
|
|
import com.fs.store.service.cache.IFsUserCourseCacheService;
|
|
|
|
+import com.fs.system.domain.SysConfig;
|
|
|
|
+import com.fs.system.service.ISysConfigService;
|
|
import com.hc.openapi.tool.util.StringUtils;
|
|
import com.hc.openapi.tool.util.StringUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
@@ -32,6 +35,8 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
|
|
@Autowired
|
|
@Autowired
|
|
private ICompanyCacheService companyCacheService;
|
|
private ICompanyCacheService companyCacheService;
|
|
@Autowired
|
|
@Autowired
|
|
|
|
+ private ISysConfigService iSysConfigService;
|
|
|
|
+ @Autowired
|
|
private IFsUserCourseCacheService fsUserCourseCacheService;
|
|
private IFsUserCourseCacheService fsUserCourseCacheService;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -93,6 +98,17 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
|
|
public int insertFsCourseTrafficLog(FsCourseTrafficLog fsCourseTrafficLog)
|
|
public int insertFsCourseTrafficLog(FsCourseTrafficLog fsCourseTrafficLog)
|
|
{
|
|
{
|
|
fsCourseTrafficLog.setCreateTime(DateUtils.getNowDate());
|
|
fsCourseTrafficLog.setCreateTime(DateUtils.getNowDate());
|
|
|
|
+ SysConfig sysConfig = iSysConfigService.selectConfigByConfigKey("redPacket.Traffic.config");
|
|
|
|
+ if (ObjectUtils.isEmpty(sysConfig)){
|
|
|
|
+ sysConfig = new SysConfig();
|
|
|
|
+ sysConfig.setConfigKey("redPacket.Traffic.config");
|
|
|
|
+ sysConfig.setConfigName("红包流量配置");
|
|
|
|
+ sysConfig.setConfigValue("-"+fsCourseTrafficLog.getInternetTraffic());
|
|
|
|
+ iSysConfigService.insertConfig(sysConfig);
|
|
|
|
+ }else {
|
|
|
|
+ sysConfig.setConfigValue(String.valueOf((Long.parseLong(sysConfig.getConfigValue())-fsCourseTrafficLog.getInternetTraffic())));
|
|
|
|
+ iSysConfigService.updateConfig(sysConfig);
|
|
|
|
+ }
|
|
return fsCourseTrafficLogMapper.insertFsCourseTrafficLog(fsCourseTrafficLog);
|
|
return fsCourseTrafficLogMapper.insertFsCourseTrafficLog(fsCourseTrafficLog);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -167,4 +183,120 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
|
|
}
|
|
}
|
|
return fsCourseTrafficLogListVOS;
|
|
return fsCourseTrafficLogListVOS;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void updateTrafficStatus(InternetTrafficParam internetTrafficParam) {
|
|
|
|
+ System.out.println("开始处理流量充值...");
|
|
|
|
+
|
|
|
|
+ // 计算充值对应的流量
|
|
|
|
+ double account = Double.parseDouble(internetTrafficParam.getAccount());
|
|
|
|
+ double pricePerGB = 0.05;
|
|
|
|
+ double trafficGB = account / pricePerGB;
|
|
|
|
+ long trafficKB = (long) (trafficGB * 1024 * 1024);
|
|
|
|
+
|
|
|
|
+ System.out.println("充值金额:" + account + " 元,对应可用流量:" + trafficKB + " KB");
|
|
|
|
+
|
|
|
|
+ long updatedTrafficKB = 0L;
|
|
|
|
+ int pageSize = 3; // 每次查询1000条
|
|
|
|
+ int pageNum = 0; // 分页页码
|
|
|
|
+ int loopCount = 0; // 查询次数
|
|
|
|
+ int maxLoop = 20; // 最大循环次数
|
|
|
|
+
|
|
|
|
+ List<Long> idsToUpdate = new ArrayList<>();
|
|
|
|
+ Set<Long> processedIds = new HashSet<>(); // 用于去重
|
|
|
|
+ long remainingTrafficKB = trafficKB; // 还需补充的流量
|
|
|
|
+ long totalInternetTrafficRemaining = 0L; // 记录未处理的流量总和
|
|
|
|
+
|
|
|
|
+ while (updatedTrafficKB < trafficKB && loopCount < maxLoop) {
|
|
|
|
+ loopCount++;
|
|
|
|
+ int offset = pageNum * pageSize; // 计算当前查询的偏移量
|
|
|
|
+
|
|
|
|
+ // 查询当前分页的数据
|
|
|
|
+ List<TrafficRecord> trafficRecords =
|
|
|
|
+ fsCourseTrafficLogMapper.findUnusedRecordsWithTraffic(internetTrafficParam.getCompanyId(), offset, pageSize);
|
|
|
|
+
|
|
|
|
+ if (trafficRecords.isEmpty()) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 处理当前批次的数据
|
|
|
|
+ for (TrafficRecord record : trafficRecords) {
|
|
|
|
+ if (updatedTrafficKB >= trafficKB) break; // 达到目标流量则退出
|
|
|
|
+
|
|
|
|
+ Long logId = record.getLogId();
|
|
|
|
+ if (processedIds.contains(logId)) {
|
|
|
|
+ continue; // 如果记录已处理过,则跳过
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ updatedTrafficKB += record.getInternetTraffic(); // 累加已使用的流量
|
|
|
|
+ idsToUpdate.add(logId); // 记录需要更新的ID
|
|
|
|
+ processedIds.add(logId); // 标记为已处理
|
|
|
|
+
|
|
|
|
+ remainingTrafficKB = Math.max(0, trafficKB - updatedTrafficKB); // 更新剩余流量
|
|
|
|
+ totalInternetTrafficRemaining += record.getInternetTraffic(); // 累计未处理的流量
|
|
|
|
+ // 如果剩余流量不足,则停止处理
|
|
|
|
+ if (remainingTrafficKB == 0) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 模拟数据库压力,休眠一段时间
|
|
|
|
+ try {
|
|
|
|
+ Thread.sleep(100);
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pageNum++; // 翻到下一页
|
|
|
|
+ }
|
|
|
|
+ // 更新数据库状态
|
|
|
|
+ if (!idsToUpdate.isEmpty()) {
|
|
|
|
+ fsCourseTrafficLogMapper.updateStatusByIds(idsToUpdate);
|
|
|
|
+ System.out.println("共更新状态记录数:" + idsToUpdate.size());
|
|
|
|
+ } else {
|
|
|
|
+ System.out.println("没有记录被更新。");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 计算超出充值流量的部分
|
|
|
|
+ Long count = fsCourseTrafficLogMapper.findRecordsNum(internetTrafficParam.getCompanyId());
|
|
|
|
+ long overflowTrafficKB = Math.max(0, updatedTrafficKB - trafficKB)+count;
|
|
|
|
+ if (overflowTrafficKB > 0) {
|
|
|
|
+ System.out.println("已使用流量超过充值流量,超出部分:" + overflowTrafficKB + " KB");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 输出未处理的流量信息
|
|
|
|
+ long remainingUnprocessedTrafficKB = totalInternetTrafficRemaining - overflowTrafficKB;
|
|
|
|
+ if (updatedTrafficKB < trafficKB) {
|
|
|
|
+ System.out.println("处理完毕,未使用完的剩余流量:" + remainingUnprocessedTrafficKB + " KB");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 输出最终统计结果
|
|
|
|
+ System.out.println("充值总流量:" + trafficKB + " KB");
|
|
|
|
+ System.out.println("已使用流量:" + updatedTrafficKB + " KB");
|
|
|
|
+ long finalRemainingTrafficKB = Math.max(0, trafficKB - updatedTrafficKB);
|
|
|
|
+ System.out.println("最终剩余流量:" + finalRemainingTrafficKB + " KB");
|
|
|
|
+ SysConfig sysConfig = iSysConfigService.selectConfigByConfigKey("redPacket.Traffic.config");
|
|
|
|
+ String trafficCount = null;
|
|
|
|
+ if (finalRemainingTrafficKB==0){
|
|
|
|
+ trafficCount = "-"+overflowTrafficKB;
|
|
|
|
+ }else {
|
|
|
|
+ trafficCount = String.valueOf(finalRemainingTrafficKB);
|
|
|
|
+ }
|
|
|
|
+ if (ObjectUtils.isEmpty(sysConfig)){
|
|
|
|
+ sysConfig = new SysConfig();
|
|
|
|
+ sysConfig.setConfigKey("redPacket.Traffic.config");
|
|
|
|
+ sysConfig.setConfigName("红包流量配置");
|
|
|
|
+ sysConfig.setConfigValue(trafficCount);
|
|
|
|
+ iSysConfigService.insertConfig(sysConfig);
|
|
|
|
+ }else {
|
|
|
|
+ sysConfig.setConfigValue(trafficCount);
|
|
|
|
+ iSysConfigService.updateConfig(sysConfig);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|