|
|
@@ -599,4 +599,52 @@ public class FsCourseTrafficLogServiceImpl implements IFsCourseTrafficLogService
|
|
|
throw new RuntimeException("批量删除失败", e);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateTrafficByMonth() {
|
|
|
+ // 七月份流量数据订正:internet_traffic 乘以 1.2 并四舍五入保留整数
|
|
|
+ // 结束时间取 8月1日 0点(不含),避免边界遗漏
|
|
|
+ String startTime = "2026-07-01 00:00:00";
|
|
|
+ String endTime = "2026-08-01 00:00:00";
|
|
|
+ int batchSize = 5000;
|
|
|
+ int sleepMillis = 100;
|
|
|
+ // 初始为 null,第一次查询不带 log_id 条件,从时间范围内最小的 log_id 开始
|
|
|
+ Long lastId = null;
|
|
|
+ long totalUpdated = 0;
|
|
|
+ int batchNumber = 0;
|
|
|
+
|
|
|
+ long start = System.currentTimeMillis();
|
|
|
+ log.info("开始订正流量数据,时间范围: {} ~ {}", startTime, endTime);
|
|
|
+
|
|
|
+ while (true) {
|
|
|
+ // 按 log_id 升序分批查询,用 lastId 作为游标翻页,避免大表 OFFSET 越翻越慢
|
|
|
+ List<Long> ids = fsCourseTrafficLogMapper.selectTrafficLogIdsByTimeRange(startTime, endTime, lastId, batchSize);
|
|
|
+ if (ids == null || ids.isEmpty()) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ int updated = fsCourseTrafficLogMapper.multiplyInternetTrafficBatch(ids);
|
|
|
+ totalUpdated += updated;
|
|
|
+ lastId = ids.get(ids.size() - 1);
|
|
|
+ batchNumber++;
|
|
|
+
|
|
|
+ if (batchNumber % 10 == 0) {
|
|
|
+ log.info("流量订正进度:已处理 {} 批,累计更新 {} 条,当前lastId: {}", batchNumber, totalUpdated, lastId);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批次间短暂休眠,降低数据库压力
|
|
|
+ if (sleepMillis > 0) {
|
|
|
+ try {
|
|
|
+ Thread.sleep(sleepMillis);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
+ log.warn("流量订正任务被中断");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ long cost = (System.currentTimeMillis() - start) / 1000;
|
|
|
+ log.info("流量数据订正完成,共更新 {} 条,耗时 {} 秒", totalUpdated, cost);
|
|
|
+ }
|
|
|
}
|