xgb před 5 dny
rodič
revize
1f5ac01782

+ 7 - 0
fs-admin/src/main/java/com/fs/his/task/trafficlog/TrafficlogTask.java

@@ -16,4 +16,11 @@ public class TrafficlogTask {
     public void sumTrafficlog(){
         fsCourseTrafficLogService.sumTrafficlog();
     }
+
+    /**
+     * 七月份流量数据订正:internet_traffic 乘以 1.2 并四舍五入保留整数(分批更新)
+     */
+    public void updateTrafficByMonth(){
+        fsCourseTrafficLogService.updateTrafficByMonth();
+    }
 }

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

@@ -246,4 +246,26 @@ public interface FsCourseTrafficLogMapper
      * 查询过期记录总数
      */
     Long countExpireLink(@Param("createTime") Date createTime);
+
+    /**
+     * 分批查询指定时间范围内待处理流量记录的log_id(按log_id升序,用于数据订正)
+     *
+     * @param startTime 开始时间(含)
+     * @param endTime   结束时间(不含)
+     * @param lastId    上次处理的最后一个log_id(用于游标翻页)
+     * @param batchSize 批次大小
+     * @return log_id集合
+     */
+    List<Long> selectTrafficLogIdsByTimeRange(@Param("startTime") String startTime,
+                                              @Param("endTime") String endTime,
+                                              @Param("lastId") Long lastId,
+                                              @Param("batchSize") int batchSize);
+
+    /**
+     * 批量将指定log_id的internet_traffic乘以1.2并四舍五入保留整数
+     *
+     * @param ids log_id集合
+     * @return 受影响行数
+     */
+    int multiplyInternetTrafficBatch(@Param("ids") List<Long> ids);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/course/service/IFsCourseTrafficLogService.java

@@ -97,4 +97,9 @@ public interface IFsCourseTrafficLogService
     List<StatisticsSummaryVO> getStatisticsSummaryListNotPage(StatisticsSummaryParam param);
 
     void batchDelTraffic();
+
+    /**
+     * 分批更新指定月份的流量数据:将internet_traffic乘以1.2并四舍五入保留整数
+     */
+    void updateTrafficByMonth();
 }

+ 48 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseTrafficLogServiceImpl.java

@@ -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);
+    }
 }

+ 23 - 0
fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml

@@ -359,4 +359,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ]]>
     </select>
 
+    <select id="selectTrafficLogIdsByTimeRange" resultType="java.lang.Long">
+        <![CDATA[
+        SELECT log_id
+        FROM fs_course_traffic_log
+        WHERE create_time >= #{startTime}
+          AND create_time < #{endTime}
+        ]]>
+        <if test="lastId != null">
+            AND log_id &gt; #{lastId}
+        </if>
+        ORDER BY log_id ASC
+        LIMIT #{batchSize}
+    </select>
+
+    <update id="multiplyInternetTrafficBatch">
+        UPDATE fs_course_traffic_log
+        SET internet_traffic = ROUND(internet_traffic * 1.2)
+        WHERE log_id IN
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
 </mapper>