Browse Source

营期会员数优化处理

xgb 1 tuần trước cách đây
mục cha
commit
155936c150

+ 7 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -701,6 +701,13 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      */
     Integer getUserCountByCampId(@Param("trainingCampId") Long trainingCampId);
 
+    /**
+     * 批量查询训练营看课人数
+     * @param trainingCampIds 训练营 ID 集合
+     * @return Map<训练营 ID, 看课人数>
+     */
+    List<Map<String, Object>> getUserCountByCampIds(@Param("trainingCampIds") List<Long> trainingCampIds);
+
     List<FsCourseWatchLogStatisticsListByCompanyVO> selectFsCourseWatchLogStatisticsListByCompanyVO(FsCourseWatchLogStatisticsListParam param);
 
     /**

+ 25 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseTrainingCampServiceImpl.java

@@ -53,7 +53,31 @@ public class FsUserCourseTrainingCampServiceImpl extends ServiceImpl<FsUserCours
     @Override
     public List<FsUserCourseTrainingCampVO> selectFsUserCourseTrainingCampVOListByMap(Map<String, Object> params) {
         List<FsUserCourseTrainingCampVO> trainingCampVOS = baseMapper.selectFsUserCourseTrainingCampVOListByMap(params);
-        trainingCampVOS.forEach(camp -> camp.setVipCount(fsCourseWatchLogMapper.getUserCountByCampId(camp.getTrainingCampId())));
+//        trainingCampVOS.forEach(camp -> camp.setVipCount(fsCourseWatchLogMapper.getUserCountByCampId(camp.getTrainingCampId())));
+        if (CollectionUtils.isNotEmpty(trainingCampVOS)) {
+            // 提取所有训练营 ID
+            List<Long> campIds = trainingCampVOS.stream()
+                    .map(FsUserCourseTrainingCampVO::getTrainingCampId)
+                    .collect(Collectors.toList());
+
+            // 批量查询每个训练营的看课人数
+            List<Map<String, Object>> countMaps = fsCourseWatchLogMapper.getUserCountByCampIds(campIds);
+
+            // 转换为 Map<campId, vipCount>
+            Map<Long, Integer> vipCountMap = countMaps.stream()
+                    .collect(Collectors.toMap(
+                            map -> ((Number) map.get("trainingCampId")).longValue(),
+                            map -> ((Number) map.get("vipCount")).intValue(),
+                            (v1, v2) -> v1
+                    ));
+
+            // 设置 vipCount
+            trainingCampVOS.forEach(camp -> {
+                Integer vipCount = vipCountMap.getOrDefault(camp.getTrainingCampId(), 0);
+                camp.setVipCount(vipCount);
+            });
+        }
+
         return trainingCampVOS;
     }
 

+ 13 - 0
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -924,6 +924,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where ucp.training_camp_id = #{trainingCampId}
     </select>
 
+    <select id="getUserCountByCampIds" resultType="java.util.Map">
+        select
+        ucp.training_camp_id as trainingCampId,
+        count(distinct cwl.user_id) as vipCount
+        from fs_user_course_period ucp
+        inner join fs_course_watch_log cwl on ucp.period_id = cwl.period_id
+        where ucp.training_camp_id in
+        <foreach collection="trainingCampIds" item="campId" open="(" separator="," close=")">
+            #{campId}
+        </foreach>
+        group by ucp.training_camp_id
+    </select>
+
     <select id="selectFsCourseWatchLogStatisticsListByCompanyVO"
             resultType="com.fs.course.vo.FsCourseWatchLogStatisticsListByCompanyVO">
         SELECT