소스 검색

1.视频分析相关统计
2.其他完善

honorfire 5 달 전
부모
커밋
214f1cc073

+ 4 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/StatisticsLearningProgressController.java

@@ -37,7 +37,7 @@ public class StatisticsLearningProgressController {
     /**
      * 学习进度-顶部基本数据
      *
-     * @author pans
+     * @author honorfire
      * @date  2025/07/11 18:52
      */
     @ApiOperationSupport(order = 1)
@@ -56,7 +56,7 @@ public class StatisticsLearningProgressController {
     /**
      * 学习进度-访问人数趋势
      *
-     * @author pans
+     * @author honorfire
      * @date  2025/07/11 18:52
      */
     @ApiOperationSupport(order = 1)
@@ -74,7 +74,7 @@ public class StatisticsLearningProgressController {
     /**
      * 学习进度-练习平均提交数
      *
-     * @author pans
+     * @author honorfire
      * @date  2025/07/11 18:52
      */
     @ApiOperationSupport(order = 1)
@@ -90,7 +90,7 @@ public class StatisticsLearningProgressController {
     /**
      * 学习进度-学习明细数据
      *
-     * @author pans
+     * @author honorfire
      * @date  2025/07/11 18:52
      */
     @ApiOperationSupport(order = 1)

+ 146 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/VideoAnalysisProgressController.java

@@ -0,0 +1,146 @@
+package vip.xiaonuo.disk.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.service.VideoAnalysisProgressService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 统计-视频分析控制器
+ *
+ * @author honorfire
+ * @date  2025/06/18 14:16
+ */
+@Api(tags = "统计-视频分析控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class VideoAnalysisProgressController {
+
+    @Resource
+    private VideoAnalysisProgressService videoAnalysisProgressService;
+
+    /**
+     * 视频分析-观看人数统计
+     *
+     * @author honorfire
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("视频分析-观看人数统计")
+    @GetMapping("/disk/videoanalysis/watchUserCountProgress")
+    public CommonResult<Map<String,Object>> topFundamentalDetail(HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        param.put("startTime", req.getParameter("startTime"));
+        param.put("endTime", req.getParameter("endTime"));
+
+        Map<String,Object> result=videoAnalysisProgressService.getWatchUserCountProgress(param);
+        return CommonResult.data(result);
+    }
+
+    /**
+     * 视频分析-讲义下载次数
+     *
+     * @author honorfire
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("视频分析-讲义下载次数")
+    @GetMapping("/disk/videoanalysis/teachMaterialsDownloadCount")
+    public CommonResult<Map<String,Object>> teachMaterialsDownloadCount(HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        param.put("startTime", req.getParameter("startTime"));
+        param.put("endTime", req.getParameter("endTime"));
+
+        Map<String,Object> result=videoAnalysisProgressService.getTeachMaterialsDownloadCount(param);
+        return CommonResult.data(result);
+    }
+
+    /**
+     * 视频分析-跳出时间分析
+     *
+     * @author honorfire
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("视频分析-跳出时间分析")
+    @GetMapping("/disk/videoanalysis/jumpTimeAnalyse")
+    public CommonResult<Map<String,Object>> jumpTimeAnalyse(HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        param.put("startTime", req.getParameter("startTime"));
+        param.put("endTime", req.getParameter("endTime"));
+
+        Map<String,Object> result=videoAnalysisProgressService.getJumpTimeAnalyse(param);
+        return CommonResult.data(result);
+    }
+
+    /**
+     * 视频分析-互动统计分析
+     *
+     * @author honorfire
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("视频分析-互动统计分析")
+    @GetMapping("/disk/videoanalysis/interactionDataAnalyse")
+    public CommonResult<Map<String,Object>> interactionDataAnalyse(HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        param.put("startTime", req.getParameter("startTime"));
+        param.put("endTime", req.getParameter("endTime"));
+
+        Map<String,Object> result=videoAnalysisProgressService.getInteractionDataAnalyse(param);
+        return CommonResult.data(result);
+    }
+
+    /**
+     * 视频分析-学员学习行为详细数据
+     *
+     * @author honorfire
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("视频分析-学员学习行为详细数据")
+    @GetMapping("/disk/videoanalysis/studyBehaviorDetailData")
+    public CommonResult<Page<Map<String,Object>>> studyBehaviorDetailData(HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        param.put("startTime", req.getParameter("startTime"));
+        param.put("endTime", req.getParameter("endTime"));
+        Page<Map<String,Object>> list=videoAnalysisProgressService.getStudyBehaviorDetailData(param);
+        return CommonResult.data(list);
+    }
+
+    /**
+     * 视频分析-视频章节详细统计
+     *
+     * @author honorfire
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("视频分析-视频章节详细统计")
+    @GetMapping("/disk/videoanalysis/videoDetailDataAnalysis")
+    public CommonResult<Page<Map<String,Object>>> videoDetailDataAnalysis(HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        param.put("startTime", req.getParameter("startTime"));
+        param.put("endTime", req.getParameter("endTime"));
+        Page<Map<String,Object>> list=videoAnalysisProgressService.getVideoDetailDataAnalysis(param);
+        return CommonResult.data(list);
+    }
+
+}

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/CollegeEnum.java

@@ -41,7 +41,7 @@ public enum CollegeEnum {
     }
 
     public static void validate(String value) {
-        boolean flag = COMPANY.getValue().equals(value) || DEPT.getValue().equals(value)|| COLLEGE.getValue().equals(value);
+        boolean flag = COMPANY.getValue().equals(value) || DEPT.getValue().equals(value)|| COLLEGE.getValue().equals(value)|| STUDENT.getValue().equals(value);
         if(!flag) {
             throw new CommonException("不支持的组织分类:{}", value);
         }

+ 160 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/VideoAnalysisProgressMapper.java

@@ -0,0 +1,160 @@
+package vip.xiaonuo.disk.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface VideoAnalysisProgressMapper {
+
+    /**
+     * 视频分析-观看人数统计-总观看人数
+     */
+    String getAlreadyWatchUserCount(Map param);
+
+    /**
+     * 视频分析-观看人数统计-完成观看人数
+     */
+    String getCompleteWatchUserCount(Map param);
+
+    /**
+     * 视频分析-观看人数统计-完成率
+     */
+    String getCompleteRate(Map param);
+
+    /**
+     * 视频分析-讲义下载次数-总下载次数
+     */
+    String getAllDownloadCount(Map param);
+
+    /**
+     * 视频分析-讲义下载次数-下载率
+     */
+    String getDownloadRate(Map param);
+
+    /**
+     * 视频分析-讲义下载次数-人均讲义下载数量
+     */
+    String getAvgDownloadCount(Map param);
+
+    /**
+     * 视频分析-跳出时间分析-总跳出次数
+     */
+    String getJumpOutCount(Map param);
+
+    /**
+     * 视频分析-跳出时间分析-跳出率
+     */
+    String getJumpOutRate(Map param);
+
+    /**
+     * 视频分析-跳出时间分析-平均跳出时间
+     */
+    String getJumpAvgTime(Map param);
+
+    /**
+     * 视频分析-互动统计分析-笔记总数
+     */
+    String getNoteCount(Map param);
+
+    /**
+     * 视频分析-互动统计分析-讨论总数
+     */
+    String getPostCount(Map param);
+
+    /**
+     * 视频分析-互动统计分析-回帖总数
+     */
+    String getReplyCount(Map param);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取人员信息
+     */
+    Page<Map<String,Object>> getUserList(@Param("param") Map param, @Param("page") Page<Object> page);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取人员观看总时长和观看次数
+     */
+    List<Map<String,Object>> getWatchTimeAndCountStudyBehavior(Map param);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取快进快退次数
+     */
+    List<Map<String,Object>> getQuickOperaCountListStudyBehavior(Map param);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取学习进度
+     */
+    List<Map<String,Object>> getFinishRateListStudyBehavior(Map param);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取笔记数
+     */
+    List<Map<String,Object>> getNoteCountListStudyBehavior(Map param);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取跳出时间点
+     */
+    List<Map<String,Object>> getJumpTimeContactListStudyBehavior(Map param);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取讨论数
+     */
+    List<Map<String,Object>> getPostCountListStudyBehavior(Map param);
+
+    /**
+     * 视频分析-学员学习行为详细数据-获取回帖数
+     */
+    List<Map<String,Object>> getReplyCountListStudyBehavior(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取课时基准信息
+     */
+    Page<Map<String,Object>> getHourList(@Param("param") Map param, @Param("page") Page<Object> page);
+
+    /**
+     * 视频分析-视频章节详细统计-获取视频总观看时长
+     */
+    List<Map<String,Object>> getAllStayTimeListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取观看人数
+     */
+    List<Map<String,Object>> getWatchUserCountListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取完成人数
+     */
+    List<Map<String,Object>> getCompleteWatchUserCountListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取完成率
+     */
+    List<Map<String,Object>> getCompleteRateListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取平均观看时长
+     */
+    List<Map<String,Object>> getAvgStayTimeListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取跳出率
+     */
+    List<Map<String,Object>> getJumpOutRateListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取下载数(讲义数)
+     */
+    List<Map<String,Object>> getDownloadCountListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取笔记数
+     */
+    List<Map<String,Object>> getNoteCountListVideoDetail(Map param);
+
+    /**
+     * 视频分析-视频章节详细统计-获取讨论数
+     */
+    List<Map<String,Object>> getPostCountListVideoDetail(Map param);
+}

+ 1816 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/VideoAnalysisProgressMapper.xml

@@ -0,0 +1,1816 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.disk.mapper.VideoAnalysisProgressMapper">
+
+    <select id="getAlreadyWatchUserCount" resultType="java.lang.String">
+        SELECT
+            IFNULL(count(z1.userId),0) AS alreadyWatchUserCount
+        from(
+            SELECT
+                --		t1.hourId AS hourId,
+                --		t1.chapterId AS chapterId,
+                --		csb.USER_ID AS userId
+                t1.userId AS userId,
+                IFNULL(COUNT(csb.HOUR_ID AS hourId),0) AS alreadyCount
+            FROM (
+                SELECT
+                    cop.ID AS copId,
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                FROM COURSE_INFO ci
+                LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                AND cch.ID IS NOT NULL
+                AND cc.ID IS NOT NULL
+                AND ci.COURSE_ID IS NOT NULL
+                AND stu.ID IS NOT NULL
+                AND stu.EDU_IDENTITY='2'
+                     --		AND csb.USER_ID='1948586504800468993'
+            )t1
+            LEFT JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' GROUP BY csb1.USER_ID,csb1.HOUR_ID) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+            WHERE 1=1
+                  --	AND t1.courseId='1954728193252552705'
+            GROUP BY t1.userId
+        )z1
+        WHERE z1.alreadyCount>0
+    </select>
+    <select id="getCompleteWatchUserCount" resultType="java.lang.String">
+        SELECT
+            --	tt1.userId
+            count(tt1.userId) AS completeWatchUserCount
+        from(
+            SELECT
+            --	z1.courseId AS courseId,
+            --	z1.alreadyCount AS alreadyCount,
+            --	z2.allCount AS allCount
+            z2.userId AS userId,
+            CASE
+            when z2.allCount=0 or z2.allCount is NULL OR z1.alreadyCount=0 OR z1.alreadyCount IS null then 0
+            else TRUNC(z1.alreadyCount * 1.0 / z2.allCount, 2)
+            END AS finishRate
+            FROM (
+                SELECT
+                    t2.userId,
+                    IFNULL(COUNT(t2.hourId AS hourId),0) AS allCount
+                FROM (
+                    SELECT
+                    cop.ID AS copId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId,
+                    stu.ID AS userId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                )t2
+                WHERE 1=1
+                --	AND t2.courseId='1954728193252552705'
+                GROUP BY t2.userId
+            )z2
+            LEFT JOIN(
+                SELECT
+        --		t1.hourId AS hourId,
+        --		t1.chapterId AS chapterId,
+        --		csb.USER_ID AS userId
+                t1.userId AS userId,
+                IFNULL(COUNT(csb.HOUR_ID AS hourId),0) AS alreadyCount
+                FROM (
+                    SELECT
+                        cop.ID AS copId,
+                        stu.ID AS userId,
+                        cch.ID AS hourId,
+                        cc.ID AS chapterId,
+                        ci.COURSE_ID AS courseId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    --		AND csb.USER_ID='1948586504800468993'
+                )t1
+                LEFT JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' GROUP BY csb1.USER_ID,csb1.HOUR_ID) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                WHERE 1=1
+                --	AND t1.courseId='1954728193252552705'
+                GROUP BY t1.userId
+            )z1 ON z1.userId=z2.userId
+        )tt1
+        WHERE tt1.finishRate>0
+    </select>
+    <select id="getCompleteRate" resultType="java.lang.String">
+        SELECT
+            CASE
+            when zz1.allUserCount=0 or zz1.allUserCount is NULL OR zz1.alreadyWatchUserCount=0 OR zz1.alreadyWatchUserCount IS null then 0
+            else TRUNC(zz1.alreadyWatchUserCount * 1.0 / zz1.allUserCount, 2)
+            END AS completeRate
+        FROM (
+            SELECT
+            (
+                SELECT count(su.ID)
+                FROM SYS_USER su
+                WHERE su.DELETE_FLAG ='NOT_DELETE'
+                AND su.EDU_IDENTITY='2'
+            ) AS allUserCount,
+            (
+                SELECT
+                    count(tt1.userId)
+                FROM (
+                    SELECT
+                        --	z1.courseId AS courseId,
+                        --	z1.alreadyCount AS alreadyCount,
+                        --	z2.allCount AS allCount
+                        z2.userId AS userId,
+                        CASE
+                        when z2.allCount=0 or z2.allCount is NULL OR z1.alreadyCount=0 OR z1.alreadyCount IS null then 0
+                        else TRUNC(z1.alreadyCount * 1.0 / z2.allCount, 2)
+                        END AS finishRate
+                    FROM (
+                        SELECT
+                            t2.userId,
+                            IFNULL(COUNT(t2.hourId AS hourId),0) AS allCount
+                        FROM (
+                            SELECT
+                            cop.ID AS copId,
+                            cch.ID AS hourId,
+                            cc.ID AS chapterId,
+                            ci.COURSE_ID AS courseId,
+                            stu.ID AS userId
+                            FROM COURSE_INFO ci
+                            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                            AND cch.ID IS NOT NULL
+                            AND cc.ID IS NOT NULL
+                            AND ci.COURSE_ID IS NOT NULL
+                            AND stu.ID IS NOT NULL
+                            AND stu.EDU_IDENTITY='2'
+                        )t2
+                        WHERE 1=1
+                        --	AND t2.courseId='1954728193252552705'
+                        GROUP BY t2.userId
+                    )z2
+                    LEFT JOIN(
+                        SELECT
+                            --		t1.hourId AS hourId,
+                            --		t1.chapterId AS chapterId,
+                            --		csb.USER_ID AS userId
+                            t1.userId AS userId,
+                            IFNULL(COUNT(csb.HOUR_ID AS hourId),0) AS alreadyCount
+                        FROM (
+                            SELECT
+                            cop.ID AS copId,
+                            stu.ID AS userId,
+                            cch.ID AS hourId,
+                            cc.ID AS chapterId,
+                            ci.COURSE_ID AS courseId
+                            FROM COURSE_INFO ci
+                            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                            AND cch.ID IS NOT NULL
+                            AND cc.ID IS NOT NULL
+                            AND ci.COURSE_ID IS NOT NULL
+                            AND stu.ID IS NOT NULL
+                            AND stu.EDU_IDENTITY='2'
+                            --		AND csb.USER_ID='1948586504800468993'
+                        )t1
+                        LEFT JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' GROUP BY csb1.USER_ID,csb1.HOUR_ID) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                        WHERE 1=1
+                        --	AND t1.courseId='1954728193252552705'
+                        GROUP BY t1.userId
+                    )z1 ON z1.userId=z2.userId
+                )tt1
+                WHERE tt1.finishRate>0
+            ) AS alreadyWatchUserCount
+            FROM DUAL
+        )zz1
+    </select>
+    <select id="getAllDownloadCount" resultType="java.lang.String">
+        SELECT
+--			t1.hourId AS hourId,
+--			t1.chapterId AS chapterId,
+--			csb.USER_ID AS userId
+            IFNULL(COUNT(csb.HOUR_ID AS hourId),0) as allDownloadCount
+        FROM (
+                 SELECT
+                     cop.ID AS copId,
+                     stu.ID AS userId,
+                     cch.ID AS hourId,
+                     cc.ID AS chapterId,
+                     ci.COURSE_ID AS courseId
+                 FROM COURSE_INFO ci
+                          LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                          LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                          LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                          LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                 WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                   AND cch.ID IS NOT NULL
+                   AND cc.ID IS NOT NULL
+                   AND ci.COURSE_ID IS NOT NULL
+                   AND stu.ID IS NOT NULL
+--		AND csb.USER_ID='1948586504800468993'
+             )t1
+        JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='2' AND csb1.TYPE='2') csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+        WHERE 1=1
+    </select>
+    <select id="getDownloadRate" resultType="java.lang.String">
+        SELECT
+            CASE
+                when zz1.downLoadCount=0 or zz1.downLoadCount is NULL OR zz1.allCount=0 OR zz1.allCount IS null then 0
+                else TRUNC(zz1.downLoadCount * 1.0 / zz1.allCount, 2)
+            END AS rate
+        from(
+            SELECT
+                (
+                    SELECT
+                    IFNULL(COUNT(t2.hourId AS hourId),0)
+                    FROM (
+                        SELECT
+                        cop.ID AS copId,
+                        cch.ID AS hourId,
+                        cc.ID AS chapterId,
+                        ci.COURSE_ID AS courseId,
+                        stu.ID AS userId
+                        FROM COURSE_INFO ci
+                        LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                        LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                        WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                        AND cch.ID IS NOT NULL
+                        AND cc.ID IS NOT NULL
+                        AND ci.COURSE_ID IS NOT NULL
+                        AND stu.ID IS NOT NULL
+                    )t2
+                    WHERE 1=1
+                    --	AND t2.courseId='1954728193252552705'
+                ) AS allCount,
+                (
+                    SELECT
+                    --			t1.hourId AS hourId,
+                    --			t1.chapterId AS chapterId,
+                    --			csb.USER_ID AS userId
+                    IFNULL(COUNT(csb.HOUR_ID AS hourId),0)
+                    FROM (
+                        SELECT
+                        cop.ID AS copId,
+                        stu.ID AS userId,
+                        cch.ID AS hourId,
+                        cc.ID AS chapterId,
+                        ci.COURSE_ID AS courseId
+                        FROM COURSE_INFO ci
+                        LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                        LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                        WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                        AND cch.ID IS NOT NULL
+                        AND cc.ID IS NOT NULL
+                        AND ci.COURSE_ID IS NOT NULL
+                        AND stu.ID IS NOT NULL
+                        --		AND csb.USER_ID='1948586504800468993'
+                    )t1
+                    JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='2' AND csb1.TYPE='2' GROUP BY csb1.USER_ID,csb1.HOUR_ID) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                    WHERE 1=1
+                    --	AND t1.courseId='1954728193252552705'
+                )AS downLoadCount
+            FROM DUAL
+        )zz1
+    </select>
+    <select id="getAvgDownloadCount" resultType="java.lang.String">
+        SELECT
+            IFNULL(ROUND(AVG(z1.downloadCount), 2),0) avgDownloadCount
+        FROM (
+            SELECT
+            --	t1.hourId AS hourId,
+            --	t1.chapterId AS chapterId,
+            --	t1.userId AS userId
+            t1.userId AS userId,
+            COUNT(t1.hourId) AS downloadCount
+            FROM (
+                SELECT
+                    cop.ID AS copId,
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                FROM COURSE_INFO ci
+                LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                AND cch.ID IS NOT NULL
+                AND cc.ID IS NOT NULL
+                AND ci.COURSE_ID IS NOT NULL
+                AND stu.ID IS NOT NULL
+                --		AND csb.USER_ID='1948586504800468993'
+            )t1
+            JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='2' AND csb1.TYPE='2') csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+            WHERE 1=1
+            GROUP BY t1.userId
+        )z1
+    </select>
+    <select id="getJumpOutCount" resultType="java.lang.String">
+        SELECT
+            --	t1.hourId AS hourId,
+            --	t1.chapterId AS chapterId,
+            --	t1.userId AS userId,
+            --	csb.ID AS csbId,
+            --	csb.PROGRESS AS progress
+            IFNULL(count(csb.ID),0) AS jumpOutCount
+        FROM (
+            SELECT
+            cop.ID AS copId,
+            stu.ID AS userId,
+            cch.ID AS hourId,
+            cc.ID AS chapterId,
+            ci.COURSE_ID AS courseId
+            FROM COURSE_INFO ci
+            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+            AND cch.ID IS NOT NULL
+            AND cc.ID IS NOT NULL
+            AND ci.COURSE_ID IS NOT NULL
+            AND stu.ID IS NOT NULL
+            --		AND csb.USER_ID='1948586504800468993'
+        )t1
+        JOIN (SELECT csb1.ID,csb1.USER_ID,csb1.HOUR_ID,csb1.PROGRESS FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' AND csb1.PROGRESS &lt; 100) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+        WHERE 1=1
+    </select>
+    <select id="getJumpOutRate" resultType="java.lang.String">
+        SELECT
+            CASE
+            when z1.jumpOutCount=0 or z1.jumpOutCount is NULL OR z1.allCount=0 OR z1.allCount IS null then 0
+            else TRUNC(z1.jumpOutCount * 1.0 / z1.allCount, 2)
+            END AS jumpOutRate
+        FROM(
+            SELECT
+                --	t1.hourId AS hourId,
+                --	t1.chapterId AS chapterId,
+                --	t1.courseId AS courseId,
+                --	t1.userId AS userId,
+                --	csb.ID AS csbId,
+                --	csb.PROGRESS AS progress
+                count(CASE WHEN csb.PROGRESS &lt; 100 THEN 1 END) AS jumpOutCount,
+                count(csb.ID) AS allCount
+            FROM (
+                SELECT
+                cop.ID AS copId,
+                stu.ID AS userId,
+                cch.ID AS hourId,
+                cc.ID AS chapterId,
+                ci.COURSE_ID AS courseId
+                FROM COURSE_INFO ci
+                LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                AND cch.ID IS NOT NULL
+                AND cc.ID IS NOT NULL
+                AND ci.COURSE_ID IS NOT NULL
+                AND stu.ID IS NOT NULL
+                --		AND csb.USER_ID='1948586504800468993'
+            )t1
+            JOIN (SELECT csb1.ID,csb1.USER_ID,csb1.HOUR_ID,csb1.PROGRESS FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1') csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+            WHERE 1=1
+        )z1
+    </select>
+
+    <select id="getJumpAvgTime" resultType="java.lang.String">
+        SELECT
+            --	t1.hourId AS hourId,
+            --	t1.chapterId AS chapterId,
+            --	t1.userId AS userId,
+            --	csb.ID AS csbId,
+            --    LPAD(FLOOR(csb1.END_TIME / 3600000), 2, '0') || ':' ||
+            --    LPAD(FLOOR((csb1.END_TIME % 3600000) / 60000), 2, '0') || ':' ||
+            --    LPAD(FLOOR((csb1.END_TIME % 60000) / 1000), 2, '0') AS jumpTime
+            ROUND(AVG(IFNULL(csb.END_TIME,0)), 2) AS jumpAvgTime
+        FROM (
+            SELECT
+            cop.ID AS copId,
+            stu.ID AS userId,
+            cch.ID AS hourId,
+            cc.ID AS chapterId,
+            ci.COURSE_ID AS courseId
+            FROM COURSE_INFO ci
+            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+            AND cch.ID IS NOT NULL
+            AND cc.ID IS NOT NULL
+            AND ci.COURSE_ID IS NOT NULL
+            AND stu.ID IS NOT NULL
+            --		AND csb.USER_ID='1948586504800468993'
+        )t1
+        JOIN (SELECT csb1.ID,csb1.USER_ID,csb1.HOUR_ID,csb1.END_TIME FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' AND csb1.PROGRESS &lt; 100) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+        WHERE 1=1
+    </select>
+    <select id="getNoteCount" resultType="java.lang.String">
+        SELECT
+            --	t1.hourId AS hourId,
+            --	t1.chapterId AS chapterId,
+            --	t1.courseId AS courseId,
+            --	cr.ID AS crId,
+            --	cr.FUNC_TYPE AS crFuncType
+            count(cr.ID) noteCount
+        from(
+            SELECT
+            cch.ID AS hourId,
+            cc.ID AS chapterId,
+            ci.COURSE_ID AS courseId
+            FROM COURSE_INFO ci
+            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+            AND cch.ID IS NOT NULL
+            AND cc.ID IS NOT NULL
+            AND ci.COURSE_ID IS NOT NULL
+            GROUP BY cch.ID,cc.ID,ci.COURSE_ID
+        )t1
+        JOIN COURSE_RELATE cr ON t1.hourId=cr.MAIN_ID AND cr.DELETE_FLAG ='NOT_DELETE' and cr.CHAPTERHOUR_TYPE ='1' AND cr.INFO_TYPE ='1' AND FUNC_TYPE ='6'
+    </select>
+    <select id="getPostCount" resultType="java.lang.String">
+        SELECT
+            --	t1.userId AS userId,
+            --	t1.chapterId AS chapterId,
+            --	t1.courseId AS courseId,
+            --	t2.replyId AS replyId
+            IFNULL(count(t2.replyId),0) postCount
+        from(
+            SELECT
+            stu.ID AS userId,
+            cc.ID AS chapterId,
+            ci.COURSE_ID AS courseId
+            FROM COURSE_INFO ci
+            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+            AND cc.ID IS NOT NULL
+            AND ci.COURSE_ID IS NOT NULL
+            AND stu.ID IS NOT NULL
+            GROUP BY stu.ID,cc.ID,ci.COURSE_ID
+        )t1
+        JOIN (
+            select
+            reply.REPLY_ID AS replyId,
+            reply.USER_ID AS userId,
+            chapter.DISCUSSION_ID AS discussionId,
+            chapter.CHAPTER_ID AS chapterId
+            from FORUM_POST_REPLY as reply
+            left join FORUM_CHAPTER_DISCUSSION as chapter on reply.POST_ID = chapter.POST_ID
+            where
+            reply.POST_TYPE = 3
+            --AND reply.CREATE_TIME &gt; = TRUNC(SYSDATE) -6
+            --AND reply.CREATE_TIME &lt; TRUNC(SYSDATE) + 1
+            --AND chapter.COURSE_ID = '1946462050075185153'
+            --AND reply.USER_ID = '1948586504800468993'
+        )t2 ON t1.chapterId=t2.chapterId AND t1.userId=t2.userId
+        WHERE 1=1
+    </select>
+    <select id="getReplyCount" resultType="java.lang.String">
+        SELECT
+            --	t1.userId AS userId,
+            --	t1.chapterId AS chapterId,
+            --	t1.courseId AS courseId,
+            --	t2.replyId AS replyId
+            IFNULL(count(t2.replyId),0) postCount
+        from(
+            SELECT
+            stu.ID AS userId,
+            cc.ID AS chapterId,
+            ci.COURSE_ID AS courseId
+            FROM COURSE_INFO ci
+            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+            AND cc.ID IS NOT NULL
+            AND ci.COURSE_ID IS NOT NULL
+            AND stu.ID IS NOT NULL
+            GROUP BY stu.ID,cc.ID,ci.COURSE_ID
+        )t1
+        JOIN (
+            select
+            reply.REPLY_ID AS replyId,
+            reply.USER_ID AS userId,
+            chapter.DISCUSSION_ID AS discussionId,
+            chapter.CHAPTER_ID AS chapterId
+            from FORUM_POST_REPLY as reply
+            left join FORUM_CHAPTER_DISCUSSION as chapter on reply.POST_ID = chapter.POST_ID
+            where
+            reply.POST_TYPE = 3
+            AND reply.PARENT_ID != '-1'
+            --AND reply.CREATE_TIME &gt;= TRUNC(SYSDATE) -6
+            --AND reply.CREATE_TIME &lt; TRUNC(SYSDATE) + 1
+            --AND chapter.COURSE_ID = '1946462050075185153'
+            --AND reply.USER_ID = '1948586504800468993'
+        )t2 ON t1.chapterId=t2.chapterId AND t1.userId=t2.userId
+        WHERE 1=1
+    </select>
+
+    <select id="getUserList" resultType="java.util.Map">
+        SELECT
+            su.ID AS userId,
+            IFNULL(su.NAME,'') AS stuName,
+            IFNULL(su.LAST_LOGIN_TIME,'') AS lastLoginTime
+        FROM (SELECT su1.* FROM SYS_USER su1 WHERE su1.DELETE_FLAG='NOT_DELETE' AND su1.EDU_IDENTITY='2' ) su
+    </select>
+    <select id="getWatchTimeAndCountStudyBehavior" resultType="java.util.Map">
+        SELECT
+            su.ID AS userId,
+            IFNULL(finalOne.allStayTime,0) AS allStayTime,
+            IFNULL(finalOne.watchCount,0) AS watchCount
+        FROM (
+            SELECT su1.* FROM SYS_USER su1
+            WHERE su1.DELETE_FLAG='NOT_DELETE'
+            AND su1.EDU_IDENTITY='2'
+            <if test="userIdList !=null and userIdList.size()>0">
+                and su1.ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        ) su
+        LEFT JOIN(
+            SELECT
+                z1.userId AS userId,
+                z1.watchCount AS watchCount,
+                LPAD(FLOOR(z1.allStayTime / 3600000), 5, '0') || '小时' ||
+                LPAD(FLOOR((z1.allStayTime % 3600000) / 60000), 2, '0') || '分钟' AS allStayTime
+            FROM(
+                SELECT
+                    --	#获取每个人课程每次课时停留时长,用来计算访问时长
+                    t1.userId AS userId,
+                    IFNULL(COUNT(csbVideo.ID),0) AS watchCount,
+                    IFNULL(SUM(csbVideo.STAY_TIME),0) AS allStayTime
+                FROM(
+                    --  #这里需要分组,将不同开课下相同课程和课时归一,避免不同开课相同课程数据重复
+                    SELECT
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID       AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    <if test="userIdList !=null and userIdList.size()>0">
+                        and stu.ID in
+                        <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                    GROUP BY stu.ID,cch.ID,cc.ID,ci.COURSE_ID
+                )t1
+                LEFT JOIN (
+                    SELECT csb1.ID,csb1.USER_ID,csb1.HOUR_ID,csb1.STAY_TIME FROM COURSE_STUDENT_BURIALPOINT csb1
+                    WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1'
+                    <if test="userIdList !=null and userIdList.size()>0">
+                        and csb1.USER_ID in
+                        <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                ) csbVideo ON csbVideo.HOUR_ID =t1.hourId AND csbVideo.USER_ID=t1.userId
+                WHERE 1=1
+                GROUP BY t1.userId
+            )z1
+        )finalOne ON su.ID =finalOne.userId
+    </select>
+    <select id="getQuickOperaCountListStudyBehavior" resultType="java.util.Map">
+        SELECT
+        su.ID AS userId,
+        IFNULL(finalTwo.quickOperaCount,0) AS quickOperaCount
+        FROM (
+        SELECT su1.* FROM SYS_USER su1
+        WHERE su1.DELETE_FLAG='NOT_DELETE'
+        AND su1.EDU_IDENTITY='2'
+        <if test="userIdList !=null and userIdList.size()>0">
+            and su1.ID in
+            <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        ) su
+        LEFT JOIN(
+        SELECT
+            --	#获取每个人课程课时所有快进快退记录总数量
+            t1.userId AS userId,
+            IFNULL(COUNT(csbQuickOpera.ID),0) AS quickOperaCount
+        FROM(
+            --  #这里需要分组,将不同开课下相同课程和课时归一,避免不同开课相同课程数据重复
+            SELECT
+            stu.ID AS userId,
+            cch.ID AS hourId,
+            cc.ID AS chapterId,
+            ci.COURSE_ID AS courseId
+            FROM COURSE_INFO ci
+            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID       AND cc.DELETE_FLAG ='NOT_DELETE'
+            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+            AND cch.ID IS NOT NULL
+            AND cc.ID IS NOT NULL
+            AND ci.COURSE_ID IS NOT NULL
+            AND stu.ID IS NOT NULL
+            <if test="userIdList !=null and userIdList.size()>0">
+                and stu.ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            GROUP BY stu.ID,cch.ID,cc.ID,ci.COURSE_ID
+        )t1
+        LEFT JOIN (
+            SELECT csb1.ID,csb1.USER_ID,csb1.HOUR_ID,csb1.TYPE FROM COURSE_STUDENT_BURIALPOINT csb1
+            WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND (csb1.TYPE='3' OR csb1.TYPE='4')
+            <if test="userIdList !=null and userIdList.size()>0">
+                and csb1.USER_ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        ) csbQuickOpera ON csbQuickOpera.HOUR_ID =t1.hourId AND csbQuickOpera.USER_ID=t1.userId
+        WHERE 1=1
+        GROUP BY t1.userId
+        )finalTwo ON su.ID =finalTwo.userId
+    </select>
+
+    <select id="getFinishRateListStudyBehavior" resultType="java.util.Map">
+        SELECT
+            su.ID AS userId,
+            IFNULL(finalThree.finishRate,0) AS finishRate
+        FROM (
+            SELECT su1.* FROM SYS_USER su1
+            WHERE su1.DELETE_FLAG='NOT_DELETE'
+            AND su1.EDU_IDENTITY='2'
+            <if test="userIdList !=null and userIdList.size()>0">
+                and su1.ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        ) su
+        LEFT JOIN(
+            SELECT
+                z2.userId AS userId,
+                CASE
+                when z2.allCount=0 or z2.allCount is NULL OR z1.alreadyCount=0 OR z1.alreadyCount IS null then 0
+                else TRUNC(z1.alreadyCount * 1.0 / z2.allCount, 2)
+                END AS finishRate
+            FROM (
+                SELECT
+                    t2.userId,
+                    IFNULL(COUNT(t2.hourId AS hourId),0) AS allCount
+                FROM (
+                    SELECT
+                    cop.ID AS copId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId,
+                    stu.ID AS userId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    <if test="userIdList !=null and userIdList.size()>0">
+                        and stu.ID in
+                        <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                )t2
+                WHERE 1=1
+                --	AND t2.courseId='1954728193252552705'
+                GROUP BY t2.userId
+            )z2
+            LEFT JOIN(
+                SELECT
+                    --		t1.hourId AS hourId,
+                    --		t1.chapterId AS chapterId,
+                    --		csb.USER_ID AS userId
+                    t1.userId AS userId,
+                    IFNULL(COUNT(csb.HOUR_ID AS hourId),0) AS alreadyCount
+                FROM (
+                    SELECT
+                    cop.ID AS copId,
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    <if test="userIdList !=null and userIdList.size()>0">
+                        and stu.ID in
+                        <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                    --		AND csb.USER_ID='1948586504800468993'
+                )t1
+                LEFT JOIN (
+                    SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1
+                    WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1'
+                    <if test="userIdList !=null and userIdList.size()>0">
+                        and csb1.USER_ID in
+                        <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                    GROUP BY csb1.USER_ID,csb1.HOUR_ID
+                ) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                WHERE 1=1
+                --	AND t1.courseId='1954728193252552705'
+                GROUP BY t1.userId
+            )z1 ON z1.userId=z2.userId
+        )finalThree ON su.ID =finalThree.userId
+    </select>
+    <select id="getNoteCountListStudyBehavior" resultType="java.util.Map">
+        SELECT
+            su.ID AS userId,
+            IFNULL(finalFour.noteCount,0) AS noteCount
+        FROM (
+            SELECT su1.* FROM SYS_USER su1
+            WHERE su1.DELETE_FLAG='NOT_DELETE'
+            AND su1.EDU_IDENTITY='2'
+            <if test="userIdList !=null and userIdList.size()>0">
+                and su1.ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        ) su
+        LEFT JOIN(
+            SELECT
+                t1.userId AS userId,
+                count(cr.ID) noteCount
+            from(
+                SELECT
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                FROM COURSE_INFO ci
+                LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID       AND cc.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                AND cch.ID IS NOT NULL
+                AND cc.ID IS NOT NULL
+                AND ci.COURSE_ID IS NOT NULL
+                AND stu.ID IS NOT NULL
+                <if test="userIdList !=null and userIdList.size()>0">
+                    and stu.ID in
+                    <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY stu.ID,cch.ID,cc.ID,ci.COURSE_ID
+            )t1
+            JOIN COURSE_RELATE cr ON t1.hourId=cr.MAIN_ID AND cr.DELETE_FLAG ='NOT_DELETE' and cr.CHAPTERHOUR_TYPE ='1' AND cr.INFO_TYPE ='1' AND FUNC_TYPE ='6'
+            WHERE 1=1
+            GROUP BY t1.userId
+        )finalFour ON su.ID =finalFour.userId
+    </select>
+    <select id="getJumpTimeContactListStudyBehavior" resultType="java.util.Map">
+        SELECT
+            su.ID AS userId,
+            IFNULL(finalFive.jumpTimeContact,0) AS jumpTimeContact
+        FROM (
+            SELECT su1.* FROM SYS_USER su1
+            WHERE su1.DELETE_FLAG='NOT_DELETE'
+            AND su1.EDU_IDENTITY='2'
+            <if test="userIdList !=null and userIdList.size()>0">
+                and su1.ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        ) su
+        LEFT JOIN(
+            SELECT
+                --	z1.userId,
+                --	z1.jumpTime,
+                --	z1.thisJumpTimeCount,
+                --	z1.rn
+                z1.userId,
+                LISTAGG(z1.jumpTime, ',') WITHIN GROUP (ORDER BY z1.rn) AS jumpTimeContact
+            FROM(
+                SELECT
+                    --	csb.USER_ID AS userId,
+                    --	t1.hourId,
+                    --	csb.ID AS csbId,
+                    --	csb.jumpTime AS jumpTime
+                    csb.USER_ID AS userId,
+                    csb.jumpTime AS jumpTime,
+                    COUNT(csb.jumpTime) AS thisJumpTimeCount,
+                    ROW_NUMBER() OVER (
+                    PARTITION BY csb.USER_ID  -- 请替换为你的分组字段,例如 user_id
+                    ORDER BY COUNT(csb.jumpTime) DESC -- 请替换为你的排序字段,并按需指定排序方式(ASC升序或DESC降序)
+                    ) AS rn
+                FROM (
+                    SELECT
+                        stu.ID AS userId,
+                        cch.ID AS hourId,
+                        cc.ID AS chapterId,
+                        ci.COURSE_ID AS courseId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    <if test="userIdList !=null and userIdList.size()>0">
+                        and stu.ID in
+                        <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                    --		AND csb.USER_ID='1948586504800468993'
+                    GROUP BY stu.ID,cch.ID,cc.ID,ci.COURSE_ID
+                )t1
+                JOIN (
+                    --	#查询每个人跳出时间,分组一下,只显示前五频率的跳出时间
+                    SELECT
+                        csb1.ID,
+                        csb1.USER_ID,
+                        csb1.HOUR_ID,
+                        LPAD(FLOOR(csb1.END_TIME / 3600000), 2, '0') || ':' ||
+                        LPAD(FLOOR((csb1.END_TIME % 3600000) / 60000), 2, '0') || ':' ||
+                        LPAD(FLOOR((csb1.END_TIME % 60000) / 1000), 2, '0') AS jumpTime
+                    FROM COURSE_STUDENT_BURIALPOINT csb1
+                    WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' AND csb1.PROGRESS &lt; 100
+                    <if test="userIdList !=null and userIdList.size()>0">
+                        and csb1.USER_ID in
+                        <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                ) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                WHERE 1=1
+                GROUP BY csb.jumpTime,csb.USER_ID
+                ORDER BY thisJumpTimeCount desc
+            )z1
+            WHERE z1.rn &lt; =5
+            GROUP BY z1.userId
+        )finalFive ON su.ID =finalFive.userId
+    </select>
+    <select id="getPostCountListStudyBehavior" resultType="java.util.Map">
+        SELECT
+            su.ID AS userId,
+            IFNULL(finalSix.postCount,0) AS postCount
+        FROM (
+            SELECT su1.* FROM SYS_USER su1
+            WHERE su1.DELETE_FLAG='NOT_DELETE'
+            AND su1.EDU_IDENTITY='2'
+            <if test="userIdList !=null and userIdList.size()>0">
+                and su1.ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        ) su
+        LEFT JOIN(
+            SELECT
+                reply.USER_ID AS userId,
+                count(0) as postCount
+            from FORUM_POST_REPLY as reply
+            left join FORUM_CHAPTER_DISCUSSION as chapter on reply.POST_ID = chapter.POST_ID
+            where
+            reply.POST_TYPE = 3
+            <if test="userIdList !=null and userIdList.size()>0">
+                and reply.USER_ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            GROUP BY reply.USER_ID
+        )finalSix ON su.ID =finalSix.userId
+    </select>
+    <select id="getReplyCountListStudyBehavior" resultType="java.util.Map">
+        SELECT
+            su.ID AS userId,
+            IFNULL(finalSeven.replyCount,0) AS replyCount
+        FROM (
+        SELECT su1.* FROM SYS_USER su1
+            WHERE su1.DELETE_FLAG='NOT_DELETE'
+            AND su1.EDU_IDENTITY='2'
+            <if test="userIdList !=null and userIdList.size()>0">
+                and su1.ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        ) su
+        LEFT join(
+            SELECT
+                reply.USER_ID AS userId,
+                count(0)as replyCount
+            from FORUM_POST_REPLY as reply
+            left join FORUM_CHAPTER_DISCUSSION as chapter on reply.POST_ID = chapter.POST_ID
+            where
+            reply.POST_TYPE = 3
+            AND reply.PARENT_ID != '-1'
+            <if test="userIdList !=null and userIdList.size()>0">
+                and reply.USER_ID in
+                <foreach collection=" userIdList" close=")" index="index" item="item" open="(" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            GROUP BY reply.USER_ID
+        )finalSeven ON su.ID =finalSeven.userId
+    </select>
+    <select id="getHourList" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            classhour.hourIdName AS hourIdName,
+            classhour.chapterId AS chapterId,
+            classhour.chapterIdName AS chapterIdName,
+            classhour.courseId AS courseId,
+            classhour.courseIdName AS courseIdName
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                cch.NAME AS hourIdName,
+                basis.chapterId AS chapterId,
+                cc.NAME AS chapterIdName,
+                basis.courseId AS courseId,
+                ci.COURSE_NAME AS courseIdName
+            FROM (
+                SELECT
+                cch1.ID AS hourId,
+                cc1.ID AS chapterId,
+                ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+            JOIN COURSE_INFO ci ON ci.COURSE_ID =basis.courseId
+            JOIN COURSE_CHAPTER cc ON cc.ID = basis.chapterId
+            JOIN COURSE_CLASSHOUR cch ON cch.ID = basis.hourId
+        )classhour
+    </select>
+    <select id="getAllStayTimeListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalOne.allStayTime,'') AS allStayTime
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                z1.hourId AS hourId,
+                LPAD(FLOOR(z1.allStayTime / 3600000), 5, '0') || ':' ||
+                LPAD(FLOOR((z1.allStayTime % 3600000) / 60000), 2, '0') || ':' ||
+                LPAD(FLOOR((z1.allStayTime % 60000) / 1000), 2, '0') AS allStayTime
+            FROM (
+                SELECT
+                    --	#获取每个课程每人每次课时停留时长,用来计算课程的访问时长
+                    --	t1.courseId AS courseId,
+                    --	t1.hourId AS hourId,
+                    --	csb.ID AS csbId,
+                    --	csb.USER_ID AS userId,
+                    --	csb.STAY_TIME AS stayTime
+                    t1.hourId AS hourId,
+                IFNULL(SUM(csb.STAY_TIME),0) AS allStayTime
+                FROM(
+                    --  #这里需要分组,将不同开课下相同课程和课时归一,避免不同开课相同课程数据重复
+                    SELECT
+                        stu.ID AS userId,
+                        cch.ID AS hourId,
+                        cc.ID AS chapterId,
+                        ci.COURSE_ID AS courseId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID       AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    <if test="hourIdList !=null and hourIdList.size()>0">
+                        and cch.ID in
+                        <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                    GROUP BY stu.ID,cch.ID,cc.ID,ci.COURSE_ID
+                )t1
+                LEFT JOIN (SELECT csb1.ID,csb1.USER_ID,csb1.HOUR_ID,csb1.STAY_TIME FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1') csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                WHERE 1=1
+                GROUP BY t1.hourId
+            )z1
+        )finalOne ON classhour.hourId =finalOne.hourId
+    </select>
+    <select id="getWatchUserCountListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalTwo.watchUserCount,0) AS watchUserCount
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                z1.hourId AS hourId,
+                IFNULL(count(z1.userId),0) AS watchUserCount
+            FROM(
+                SELECT
+                    --	#获取每个课程每人每次课时停留时长,用来计算课程的访问时长
+                    --	t1.courseId AS courseId,
+                    --	t1.hourId AS hourId,
+                    --	csb.USER_ID AS userId
+                    t1.hourId AS hourId,
+                    csb.USER_ID AS userId
+                FROM(
+                    --  #这里需要分组,将不同开课下相同课程和课时归一,避免不同开课相同课程数据重复
+                    SELECT
+                        stu.ID AS userId,
+                        cch.ID AS hourId,
+                        cc.ID AS chapterId,
+                        ci.COURSE_ID AS courseId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID       AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    <if test="hourIdList !=null and hourIdList.size()>0">
+                        and cch.ID in
+                        <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                    GROUP BY stu.ID,cch.ID,cc.ID,ci.COURSE_ID
+                )t1
+                JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' GROUP BY csb1.USER_ID,csb1.HOUR_ID) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                WHERE 1=1
+                GROUP BY t1.hourId,csb.USER_ID
+            )z1
+            GROUP BY z1.hourId
+        )finalTwo ON classhour.hourId =finalTwo.hourId
+    </select>
+    <select id="getCompleteWatchUserCountListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalThree.completeWatchUserCount,0) AS completeWatchUserCount
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                tt1.hourId,
+                IFNULL(count(tt1.userId),0) AS completeWatchUserCount
+            from(
+                --	#查询每个课时每个人完成率
+                SELECT
+                    IFNULL(z1.alreadyCount,0) AS alreadyCount,
+                    IFNULL(z2.allCount,0) AS allCount,
+                    z2.hourId AS hourId,
+                    z2.userId AS userId,
+                    CASE
+                    when z2.allCount=0 or z2.allCount is NULL OR z1.alreadyCount=0 OR z1.alreadyCount IS null then 0
+                    else TRUNC(z1.alreadyCount * 1.0 / z2.allCount, 2)
+                    END AS finishRate
+                FROM (
+                    --	#根据开课查询每个课时,每个人员,对应的课时总数量
+                    SELECT
+                        t2.hourId,
+                        t2.userId,
+                    IFNULL(COUNT(t2.userId),0) AS allCount
+                    FROM (
+                        SELECT
+                            cop.ID AS copId,
+                            cch.ID AS hourId,
+                            cc.ID AS chapterId,
+                            ci.COURSE_ID AS courseId,
+                            stu.ID AS userId
+                        FROM COURSE_INFO ci
+                        LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                        LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                        WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                        AND cch.ID IS NOT NULL
+                        AND cc.ID IS NOT NULL
+                        AND ci.COURSE_ID IS NOT NULL
+                        AND stu.ID IS NOT NULL
+                        <if test="hourIdList !=null and hourIdList.size()>0">
+                            and cch.ID in
+                            <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                                #{item}
+                            </foreach>
+                        </if>
+                    )t2
+                    WHERE 1=1
+                    --	AND t2.courseId='1954728193252552705'
+                    GROUP BY t2.hourId,t2.userId
+                )z2
+                LEFT JOIN(
+                    --	#根据开课查询每个课程课时,对应的课时的对应人员,其中已经看完的部分
+                    SELECT
+                        --			t1.hourId AS hourId,
+                        --			t1.chapterId AS chapterId,
+                        --			t1.courseId AS courseId,
+                        --			t1.userId AS needWatchUserId,
+                        --			csb.USER_ID AS alreadyWatchUserId
+                        t1.hourId AS hourId,
+                        t1.userId AS userId,
+                        IFNULL(COUNT(csb.USER_ID AS hourId),0) AS alreadyCount
+                    FROM (
+                        SELECT
+                            cop.ID AS copId,
+                            stu.ID AS userId,
+                            cch.ID AS hourId,
+                            cc.ID AS chapterId,
+                            ci.COURSE_ID AS courseId
+                        FROM COURSE_INFO ci
+                        LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                        LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                        WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                        AND cch.ID IS NOT NULL
+                        AND cc.ID IS NOT NULL
+                        AND ci.COURSE_ID IS NOT NULL
+                        AND stu.ID IS NOT NULL
+                        <if test="hourIdList !=null and hourIdList.size()>0">
+                            and cch.ID in
+                            <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                                #{item}
+                            </foreach>
+                        </if>
+                        --		AND csb.USER_ID='1948586504800468993'
+                    )t1
+                    JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' GROUP BY csb1.USER_ID,csb1.HOUR_ID) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                    WHERE 1=1
+                    --	AND t1.courseId='1954728193252552705'
+                    GROUP BY t1.hourId,t1.userId
+                )z1 ON z1.userId=z2.userId AND z1.hourId=z2.hourId
+            )tt1
+            --#最后查出每个课时每个人完成率,统计那门课时完成率达标的人
+            WHERE tt1.finishRate>0
+            GROUP BY tt1.hourId
+        )finalThree ON classhour.hourId =finalThree.hourId
+    </select>
+    <select id="getCompleteRateListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalFour.completeRate,0) AS completeRate
+        FROM(
+            SELECT
+            basis.hourId AS hourId,
+            basis.chapterId AS chapterId,
+            basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                tt2.hourId AS hourId,
+                CASE
+                when tt2.allUserCount=0 or tt2.allUserCount is NULL OR tt2.completeWatchUserCount=0 OR tt2.completeWatchUserCount IS null then 0
+                else TRUNC(tt2.completeWatchUserCount * 1.0 / tt2.allUserCount, 2)
+                END AS completeRate
+            FROM(
+                SELECT
+                    --	#这门课时,完成观看的人和应该观看的总人数
+                    tt1.hourId,
+                    IFNULL(count( CASE WHEN tt1.finishRate &gt; 0 THEN 1 ELSE NULL END ),0) AS completeWatchUserCount,
+                    IFNULL(count(tt1.userId),0) AS allUserCount
+                from(
+                    --	#查询每个课时每个人完成率(每个人的完成率)
+                    SELECT
+                        IFNULL(z1.alreadyCount,0) AS alreadyCount,
+                        IFNULL(z2.allCount,0) AS allCount,
+                        z2.hourId AS hourId,
+                        z2.userId AS userId,
+                        CASE
+                        when z2.allCount=0 or z2.allCount is NULL OR z1.alreadyCount=0 OR z1.alreadyCount IS null then 0
+                        else TRUNC(z1.alreadyCount * 1.0 / z2.allCount, 2)
+                        END AS finishRate
+                    FROM (
+                        --	#根据开课查询每个课时以及对应每个人员
+                        SELECT
+                            t2.hourId,
+                            t2.userId,
+                            IFNULL(COUNT(t2.userId),0) AS allCount
+                        FROM (
+                            SELECT
+                                cop.ID AS copId,
+                                cop.GRADES_ID AS gradesId,
+                                cch.ID AS hourId,
+                                cc.ID AS chapterId,
+                                ci.COURSE_ID AS courseId,
+                                stu.ID AS userId
+                            FROM COURSE_INFO ci
+                            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                            AND cch.ID IS NOT NULL
+                            AND cc.ID IS NOT NULL
+                            AND ci.COURSE_ID IS NOT NULL
+                            AND stu.ID IS NOT NULL
+                            <if test="hourIdList !=null and hourIdList.size()>0">
+                                and cch.ID in
+                                <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                                    #{item}
+                                </foreach>
+                            </if>
+                        )t2
+                        WHERE 1=1
+                        --	AND t2.courseId='1954728193252552705'
+                        GROUP BY t2.hourId,t2.userId
+                    )z2
+                    LEFT JOIN(
+                        --	#根据开课查询每个课程,其下课时的对应人员,是否已经看完
+                        SELECT
+                            --			t1.hourId AS hourId,
+                            --			t1.chapterId AS chapterId,
+                            --			t1.courseId AS courseId,
+                            --			t1.userId AS needWatchUserId,
+                            --			csb.USER_ID AS alreadyWatchUserId
+                            t1.hourId AS hourId,
+                            t1.userId AS userId,
+                            IFNULL(COUNT(csb.USER_ID AS hourId),0) AS alreadyCount
+                        FROM (
+                            SELECT
+                                cop.ID AS copId,
+                                stu.ID AS userId,
+                                cch.ID AS hourId,
+                                cc.ID AS chapterId,
+                                ci.COURSE_ID AS courseId
+                            FROM COURSE_INFO ci
+                            LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                            LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                            LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                            AND cch.ID IS NOT NULL
+                            AND cc.ID IS NOT NULL
+                            AND ci.COURSE_ID IS NOT NULL
+                            AND stu.ID IS NOT NULL
+                            --		AND csb.USER_ID='1948586504800468993'
+                            <if test="hourIdList !=null and hourIdList.size()>0">
+                                and cch.ID in
+                                <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                                    #{item}
+                                </foreach>
+                            </if>
+                        )t1
+                        JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1' GROUP BY csb1.USER_ID,csb1.HOUR_ID) csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                        WHERE 1=1
+                        --	AND t1.courseId='1954728193252552705'
+                        GROUP BY t1.hourId,t1.userId
+                    )z1 ON z1.userId=z2.userId AND z1.hourId=z2.hourId
+                )tt1
+                GROUP BY tt1.hourId
+            )tt2
+        )finalFour ON classhour.hourId =finalFour.hourId
+    </select>
+    <select id="getAvgStayTimeListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalFive.avgStayTime,'') AS avgStayTime
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                tt1.hourId AS hourId,
+                LPAD(FLOOR(tt1.avgStayTime / 3600000), 5, '0') || ':' ||
+                LPAD(FLOOR((tt1.avgStayTime % 3600000) / 60000), 2, '0') || ':' ||
+                LPAD(FLOOR((tt1.avgStayTime % 60000) / 1000), 2, '0') AS avgStayTime
+            FROM(
+                SELECT
+                    z1.hourId AS hourId,
+                    TRUNC(IFNULL(AVG(z1.userAllStayTIme),0), 2) AS avgStayTime
+                FROM(
+                    --#先查看这个课时下每个人看的总时间
+                    SELECT
+                        --	t1.hourId AS hourId,
+                        --	t1.chapterId AS chapterId,
+                        --	t1.courseId AS courseId,
+                        --	t1.userId AS userId,
+                        --	IFNULL(csb.STAY_TIME,0) AS stayTime
+                        t1.hourId AS hourId,
+                        t1.userId AS userId,
+                        IFNULL(SUM(csb.STAY_TIME),0) AS userAllStayTIme
+                    FROM (
+                        SELECT
+                            cop.ID AS copId,
+                            stu.ID AS userId,
+                            cch.ID AS hourId,
+                            cc.ID AS chapterId,
+                            ci.COURSE_ID AS courseId
+                        FROM COURSE_INFO ci
+                        LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                        LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                        LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                        WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                        AND cch.ID IS NOT NULL
+                        AND cc.ID IS NOT NULL
+                        AND ci.COURSE_ID IS NOT NULL
+                        AND stu.ID IS NOT NULL
+                        --		AND csb.USER_ID='1948586504800468993'
+                        <if test="hourIdList !=null and hourIdList.size()>0">
+                            and cch.ID in
+                            <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                                #{item}
+                            </foreach>
+                        </if>
+                    )t1
+                    LEFT JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID,csb1.STAY_TIME FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1') csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                    WHERE 1=1
+                    --	AND t1.courseId='1954728193252552705'
+                    GROUP BY t1.hourId,t1.userId
+                )z1
+                GROUP BY z1.hourId
+            )tt1
+        )finalFive ON classhour.hourId =finalFive.hourId
+    </select>
+    <select id="getJumpOutRateListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalSix.jumpOutRate,0) AS jumpOutRate
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                z1.hourId AS hourId,
+                CASE
+                when z1.jumpOutCount=0 or z1.jumpOutCount is NULL OR z1.allCount=0 OR z1.allCount IS null then 0
+                else TRUNC(z1.jumpOutCount * 1.0 / z1.allCount, 2)
+                END AS jumpOutRate
+            FROM(
+                --	#当前这些开课下所有课程的对应课时,各自所有观看过的记录
+                SELECT
+                    --	t1.hourId AS hourId,
+                    --	t1.chapterId AS chapterId,
+                    --	t1.courseId AS courseId,
+                    --	t1.userId AS userId,
+                    --	csb.ID AS csbId,
+                    --	csb.PROGRESS AS progress
+                    t1.hourId AS hourId,
+                    count(CASE WHEN csb.PROGRESS &lt; 100 THEN 1 END) AS jumpOutCount,
+                    count(csb.ID) AS allCount
+                FROM (
+                    SELECT
+                        cop.ID AS copId,
+                        stu.ID AS userId,
+                        cch.ID AS hourId,
+                        cc.ID AS chapterId,
+                        ci.COURSE_ID AS courseId
+                    FROM COURSE_INFO ci
+                    LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                    LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                    LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                    WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                    AND cch.ID IS NOT NULL
+                    AND cc.ID IS NOT NULL
+                    AND ci.COURSE_ID IS NOT NULL
+                    AND stu.ID IS NOT NULL
+                    --		AND csb.USER_ID='1948586504800468993'
+                    <if test="hourIdList !=null and hourIdList.size()>0">
+                        and cch.ID in
+                        <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                            #{item}
+                        </foreach>
+                    </if>
+                )t1
+                JOIN (SELECT csb1.ID,csb1.USER_ID,csb1.HOUR_ID,csb1.PROGRESS FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='1' AND csb1.TYPE='1') csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+                WHERE 1=1
+                GROUP BY t1.hourId
+            )z1
+        )finalSix ON classhour.hourId =finalSix.hourId
+    </select>
+    <select id="getDownloadCountListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalSeven.downloadCount,0) AS downloadCount
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                --			t1.hourId AS hourId,
+                --			t1.chapterId AS chapterId,
+                --			t1.courseId AS courseId,
+                --			csb.USER_ID AS userId
+                t1.hourId AS hourId,
+                IFNULL(COUNT(csb.HOUR_ID AS hourId),0) AS downloadCount
+            FROM (
+                SELECT
+                    cop.ID AS copId,
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                FROM COURSE_INFO ci
+                LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                AND cch.ID IS NOT NULL
+                AND cc.ID IS NOT NULL
+                AND ci.COURSE_ID IS NOT NULL
+                AND stu.ID IS NOT NULL
+                --		AND csb.USER_ID='1948586504800468993'
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+            )t1
+            JOIN (SELECT csb1.USER_ID,csb1.HOUR_ID FROM COURSE_STUDENT_BURIALPOINT csb1 WHERE csb1.DELETE_FLAG ='NOT_DELETE' AND csb1.FUNC_TYPE='2' AND csb1.TYPE='2') csb ON csb.HOUR_ID =t1.hourId AND csb.USER_ID=t1.userId
+            WHERE 1=1
+            GROUP BY t1.hourId
+        )finalSeven ON classhour.hourId =finalSeven.hourId
+    </select>
+    <select id="getNoteCountListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalEight.noteCount,0) AS noteCount
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                --	t1.userId AS userId,
+                --	t1.hourId AS hourId,
+                --	t1.chapterId AS chapterId,
+                --	t1.courseId AS courseId,
+                --	cr.ID AS crId,
+                --	cr.FUNC_TYPE AS crFuncType
+                t1.hourId AS hourId,
+            IFNULL(count(cr.ID),0) noteCount
+            from(
+                SELECT
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                FROM COURSE_INFO ci
+                LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID       AND cc.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                AND cch.ID IS NOT NULL
+                AND cc.ID IS NOT NULL
+                AND ci.COURSE_ID IS NOT NULL
+                AND stu.ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY stu.ID,cch.ID,cc.ID,ci.COURSE_ID
+            )t1
+            JOIN COURSE_RELATE cr ON t1.hourId=cr.MAIN_ID AND cr.DELETE_FLAG ='NOT_DELETE' and cr.CHAPTERHOUR_TYPE ='1' AND cr.INFO_TYPE ='1' AND FUNC_TYPE ='6'
+            WHERE 1=1
+            GROUP BY t1.hourId
+        )finalEight ON classhour.hourId =finalEight.hourId
+    </select>
+    <select id="getPostCountListVideoDetail" resultType="java.util.Map">
+        SELECT
+            classhour.hourId AS hourId,
+            IFNULL(finalNine.postCount,0) AS postCount
+        FROM(
+            SELECT
+                basis.hourId AS hourId,
+                basis.chapterId AS chapterId,
+                basis.courseId AS courseId
+            FROM (
+                SELECT
+                    cch1.ID AS hourId,
+                    cc1.ID AS chapterId,
+                    ci1.COURSE_ID AS courseId
+                FROM COURSE_INFO ci1
+                LEFT JOIN COURSE_OPEN cop ON ci1.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc1 ON ci1.COURSE_ID =cc1.COURSE_ID AND cc1.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch1 ON cc1.ID=cch1.CHAPTER_ID AND cch1.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci1.DELETE_FLAG ='NOT_DELETE'
+                AND cch1.ID IS NOT NULL
+                AND cc1.ID IS NOT NULL
+                AND ci1.COURSE_ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch1.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY cch1.ID,cc1.ID,ci1.COURSE_ID
+            )basis
+        )classhour
+        LEFT JOIN(
+            SELECT
+                --		t1.userId AS userId,
+                --		t1.chapterId AS chapterId,
+                --		t1.hourId AS hourId,
+                --		t2.replyId AS replyId
+                t1.hourId AS hourId,
+                IFNULL(count(t2.replyId),0) postCount
+            from(
+                SELECT
+                    stu.ID AS userId,
+                    cch.ID AS hourId,
+                    cc.ID AS chapterId,
+                    ci.COURSE_ID AS courseId
+                FROM COURSE_INFO ci
+                LEFT JOIN COURSE_OPEN cop ON ci.COURSE_ID =cop.COURSE_ID AND cop.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+                LEFT JOIN COURSE_CHAPTER cc ON ci.COURSE_ID =cc.COURSE_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+                LEFT JOIN COURSE_CLASSHOUR cch ON cc.ID=cch.CHAPTER_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+                WHERE ci.DELETE_FLAG ='NOT_DELETE'
+                AND cc.ID IS NOT NULL
+                AND cch.ID IS NOT NULL
+                AND ci.COURSE_ID IS NOT NULL
+                AND stu.ID IS NOT NULL
+                <if test="hourIdList !=null and hourIdList.size()>0">
+                    and cch.ID in
+                    <foreach collection=" hourIdList" close=")" index="index" item="item" open="(" separator=",">
+                        #{item}
+                    </foreach>
+                </if>
+                GROUP BY stu.ID,cc.ID,ci.COURSE_ID,cch.ID
+            )t1
+            JOIN (
+                select
+                    reply.REPLY_ID AS replyId,
+                    reply.USER_ID AS userId,
+                    chapter.DISCUSSION_ID AS discussionId,
+                    chapter.CHAPTER_ID AS chapterId
+                from FORUM_POST_REPLY as reply
+                left join FORUM_CHAPTER_DISCUSSION as chapter on reply.POST_ID = chapter.POST_ID
+                where
+                reply.POST_TYPE = 3
+            )t2 ON t1.chapterId=t2.chapterId AND t1.userId=t2.userId
+            WHERE 1=1
+            GROUP BY t1.hourId
+        )finalNine ON classhour.hourId =finalNine.hourId
+    </select>
+
+</mapper>

+ 44 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/VideoAnalysisProgressService.java

@@ -0,0 +1,44 @@
+package vip.xiaonuo.disk.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.Map;
+
+/**
+ * 统计-视频分析service
+ *
+ * @author honorfire
+ * @date  2025/06/18 14:16
+ */
+public interface VideoAnalysisProgressService {
+
+    /**
+     * 视频分析-观看人数统计
+     */
+    Map<String,Object> getWatchUserCountProgress(Map param);
+
+    /**
+     * 视频分析-讲义下载次数
+     */
+    Map<String,Object> getTeachMaterialsDownloadCount(Map param);
+
+    /**
+     * 视频分析-跳出时间分析
+     */
+    Map<String,Object> getJumpTimeAnalyse(Map param);
+
+    /**
+     * 视频分析-互动统计分析
+     */
+    Map<String,Object> getInteractionDataAnalyse(Map param);
+
+    /**
+     *  视频分析-学员学习行为详细数据
+     */
+    Page<Map<String,Object>> getStudyBehaviorDetailData(Map param);
+
+    /**
+     *  视频分析-视频章节详细统计
+     */
+    Page<Map<String,Object>> getVideoDetailDataAnalysis(Map param);
+}

+ 364 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/VideoAnalysisProgressServiceImpl.java

@@ -0,0 +1,364 @@
+package vip.xiaonuo.disk.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.disk.mapper.VideoAnalysisProgressMapper;
+import vip.xiaonuo.disk.service.VideoAnalysisProgressService;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class VideoAnalysisProgressServiceImpl implements VideoAnalysisProgressService {
+
+    @Resource
+    private VideoAnalysisProgressMapper videoAnalysisProgressMapper;
+
+    /**
+     * 视频分析-观看人数统计
+     */
+    @Override
+    public Map<String,Object> getWatchUserCountProgress(Map param)
+    {
+        Map<String,Object> result=new HashMap<>();
+        //总观看人数
+        String alreadyWatchUserCount=videoAnalysisProgressMapper.getAlreadyWatchUserCount(param);
+        //完成观看人数
+        String completeWatchUserCount=videoAnalysisProgressMapper.getCompleteWatchUserCount(param);
+        //完成率
+        String completeRate=videoAnalysisProgressMapper.getCompleteRate(param);
+        result.put("alreadyWatchUserCount",alreadyWatchUserCount);
+        result.put("completeWatchUserCount",completeWatchUserCount);
+        result.put("completeRate",completeRate);
+
+        return result;
+    }
+
+    /**
+     * 视频分析-讲义下载次数
+     */
+    @Override
+    public Map<String,Object> getTeachMaterialsDownloadCount(Map param)
+    {
+        Map<String,Object> result=new HashMap<>();
+        //总下载次数
+        String allDownloadCount=videoAnalysisProgressMapper.getAllDownloadCount(param);
+        //下载率
+        String downloadRate=videoAnalysisProgressMapper.getDownloadRate(param);
+        //人均讲义下载数量
+        String avgDownloadCount=videoAnalysisProgressMapper.getAvgDownloadCount(param);
+        result.put("allDownloadCount",allDownloadCount);
+        result.put("downloadRate",downloadRate);
+        result.put("avgDownloadCount",avgDownloadCount);
+
+        return result;
+    }
+
+    /**
+     * 视频分析-跳出时间分析
+     */
+    @Override
+    public Map<String,Object> getJumpTimeAnalyse(Map param)
+    {
+        Map<String,Object> result=new HashMap<>();
+        //总跳出次数
+        String jumpOutCount=videoAnalysisProgressMapper.getJumpOutCount(param);
+        //跳出率
+        String jumpOutRate=videoAnalysisProgressMapper.getJumpOutRate(param);
+        //平均跳出时间
+        String jumpAvgTime=videoAnalysisProgressMapper.getJumpAvgTime(param);
+        result.put("jumpOutCount",jumpOutCount);
+        result.put("jumpOutRate",jumpOutRate);
+        result.put("jumpAvgTime",jumpAvgTime);
+
+        return result;
+    }
+
+    /**
+     * 视频分析-互动统计分析
+     */
+    @Override
+    public Map<String,Object> getInteractionDataAnalyse(Map param)
+    {
+        Map<String,Object> result=new HashMap<>();
+        //笔记总数
+        String noteCount=videoAnalysisProgressMapper.getNoteCount(param);
+        //讨论总数
+        String postCount=videoAnalysisProgressMapper.getPostCount(param);
+        //回帖总数
+        String replyCount=videoAnalysisProgressMapper.getReplyCount(param);
+        result.put("noteCount",noteCount);
+        result.put("postCount",postCount);
+        result.put("replyCount",replyCount);
+
+        return result;
+    }
+
+    /**
+     *  视频分析-学员学习行为详细数据
+     */
+    @Override
+    public Page<Map<String,Object>> getStudyBehaviorDetailData(Map param)
+    {
+        //为了考虑效率问题,改成不通过大sql一起查回,通过后台组装数据
+        //1.获取人员信息
+        Page<Map<String,Object>> page=videoAnalysisProgressMapper.getUserList(param, CommonPageRequest.defaultPage());
+        List<Map<String,Object>> userList=page.getRecords();
+        //获取人员id集合
+        List<String> userIdList = userList.stream().map(map -> (String) map.get("userId")).collect(Collectors.toList());
+        param.put("userIdList",userIdList);
+        //2.获取人员观看总时长和观看次数
+        List<Map<String,Object>> watchTimeAndCountList=videoAnalysisProgressMapper.getWatchTimeAndCountStudyBehavior(param);
+        //3.获取快进快退次数
+        List<Map<String,Object>> quickOperaCountList=videoAnalysisProgressMapper.getQuickOperaCountListStudyBehavior(param);
+        //4.获取学习进度
+        List<Map<String,Object>> finishRateList=videoAnalysisProgressMapper.getFinishRateListStudyBehavior(param);
+        //5.获取笔记数
+        List<Map<String,Object>> noteCountList=videoAnalysisProgressMapper.getNoteCountListStudyBehavior(param);
+        //6.获取跳出时间点
+        List<Map<String,Object>> jumpTimeContactList=videoAnalysisProgressMapper.getJumpTimeContactListStudyBehavior(param);
+        //7.获取讨论数
+        List<Map<String,Object>> postCountList=videoAnalysisProgressMapper.getPostCountListStudyBehavior(param);
+        //8.获取回帖数
+        List<Map<String,Object>> replyCountList=videoAnalysisProgressMapper.getReplyCountListStudyBehavior(param);
+
+        //数据匹配
+        //采取倒叙安全删除方法,提升效率
+        for (Map<String,Object> user:userList)
+        {
+            //匹配2.获取人员观看总时长和观看次数
+            for (int i = watchTimeAndCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> watchTimeAndCount = watchTimeAndCountList.get(i);
+                if (watchTimeAndCount == null || watchTimeAndCount.get("userId") == null) continue;
+
+                if (user.get("userId").equals(watchTimeAndCount.get("userId")))
+                {
+                    user.put("allStayTime",watchTimeAndCount.get("allStayTime"));
+                    user.put("watchCount",watchTimeAndCount.get("watchCount"));
+                    watchTimeAndCountList.remove(i);          // 从原列表删除(安全操作)
+                }
+            }
+            //匹配3.获取快进快退次数
+            for (int i = quickOperaCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> quickOperaCount = quickOperaCountList.get(i);
+                if (quickOperaCount == null || quickOperaCount.get("userId") == null) continue;
+
+                if (user.get("userId").equals(quickOperaCount.get("userId")))
+                {
+                    user.put("quickOperaCount",quickOperaCount.get("quickOperaCount"));
+                    quickOperaCountList.remove(i);          // 从原列表删除(安全操作)
+                }
+            }
+            //匹配4.获取学习进度
+            for (int i = finishRateList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> finishRate = finishRateList.get(i);
+                if (finishRate == null || finishRate.get("userId") == null) continue;
+
+                if (user.get("userId").equals(finishRate.get("userId")))
+                {
+                    user.put("finishRate",finishRate.get("finishRate"));
+                    finishRateList.remove(i);          // 从原列表删除(安全操作)
+                }
+            }
+            //匹配5.获取笔记数
+            for (int i = noteCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> noteCount = noteCountList.get(i);
+                if (noteCount == null || noteCount.get("userId") == null) continue;
+
+                if (user.get("userId").equals(noteCount.get("userId")))
+                {
+                    user.put("noteCount",noteCount.get("noteCount"));
+                    noteCountList.remove(i);          // 从原列表删除(安全操作)
+                }
+            }
+            //匹配6.获取跳出时间点
+            for (int i = jumpTimeContactList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> jumpTimeContact = jumpTimeContactList.get(i);
+                if (jumpTimeContact == null || jumpTimeContact.get("userId") == null) continue;
+                if (user.get("userId").equals(jumpTimeContact.get("userId")))
+                {
+                    user.put("jumpTimeContact",jumpTimeContact.get("jumpTimeContact"));
+                    jumpTimeContactList.remove(i);          // 从原列表删除(安全操作)
+                }
+            }
+            //匹配7.获取讨论数
+            for (int i = postCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> postCount = postCountList.get(i);
+                if (postCount == null || postCount.get("userId") == null) continue;
+
+                if (user.get("userId").equals(postCount.get("userId")))
+                {
+                    user.put("postCount",postCount.get("postCount"));
+                    postCountList.remove(i);          // 从原列表
+                }
+            }
+            //匹配8.获取回帖数
+            for (int i = replyCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> replyCount = replyCountList.get(i);
+                if (replyCount == null || replyCount.get("userId") == null) continue;
+
+                if (user.get("userId").equals(replyCount.get("userId")))
+                {
+                    user.put("replyCount",replyCount.get("replyCount"));
+                    replyCountList.remove(i);          // 从原列表
+                }
+            }
+
+        }
+        return page;
+    }
+
+    /**
+     *  视频分析-视频章节详细统计
+     */
+    @Override
+    public Page<Map<String,Object>> getVideoDetailDataAnalysis(Map param)
+    {
+        //为了考虑效率问题,改成不通过大sql一起查回,通过后台组装数据
+        //1.获取课时基准信息,同时带上课程章节信息
+        Page<Map<String,Object>> page=videoAnalysisProgressMapper.getHourList(param, CommonPageRequest.defaultPage());
+        List<Map<String,Object>> hourList=page.getRecords();
+        //获取课时id集合
+        List<String> hourIdList = hourList.stream().map(map -> (String) map.get("hourId")).collect(Collectors.toList());
+        param.put("hourIdList",hourIdList);
+        //2.获取视频总观看时长
+        List<Map<String,Object>> allStayTimeList=videoAnalysisProgressMapper.getAllStayTimeListVideoDetail(param);
+        //3.获取观看人数
+        List<Map<String,Object>> watchUserCountList=videoAnalysisProgressMapper.getWatchUserCountListVideoDetail(param);
+        //4.获取完成人数
+        List<Map<String,Object>> completeWatchUserCountList=videoAnalysisProgressMapper.getCompleteWatchUserCountListVideoDetail(param);
+        //5.获取完成率
+        List<Map<String,Object>> completeRateList=videoAnalysisProgressMapper.getCompleteRateListVideoDetail(param);
+        //6.获取平均观看时长
+        List<Map<String,Object>> avgStayTimeList=videoAnalysisProgressMapper.getAvgStayTimeListVideoDetail(param);
+        //7.获取跳出率
+        List<Map<String,Object>> jumpOutRateList=videoAnalysisProgressMapper.getJumpOutRateListVideoDetail(param);
+        //8.获取下载数(讲义数)
+        List<Map<String,Object>> downloadCountList=videoAnalysisProgressMapper.getDownloadCountListVideoDetail(param);
+        //9.获取笔记数
+        List<Map<String,Object>> noteCountList=videoAnalysisProgressMapper.getNoteCountListVideoDetail(param);
+        //10.获取讨论数
+        List<Map<String,Object>> postCountList=videoAnalysisProgressMapper.getPostCountListVideoDetail(param);
+
+        //数据匹配
+        //采取倒叙安全删除方法,提升效率
+        for (Map<String,Object> hour : hourList)
+        {
+            //匹配2.获取视频总观看时长
+            for (int i = allStayTimeList.size() - 1; i >= 0; i--){
+                Map<String,Object> replyCount = allStayTimeList.get(i);
+                if (replyCount == null || replyCount.get("hourId") == null) continue;
+
+                if (hour.get("hourId").equals(replyCount.get("hourId")))
+                {
+                    hour.put("allStayTime",replyCount.get("allStayTime"));
+                    allStayTimeList.remove(i);          // 从原列表
+                }
+            }
+            //匹配3.获取观看人数
+            for (int i = watchUserCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> watchUserCount = watchUserCountList.get(i);
+                if (watchUserCount == null || watchUserCount.get("hourId") == null) continue;
+
+                if (hour.get("hourId").equals(watchUserCount.get("hourId")))
+                {
+                    hour.put("watchUserCount",watchUserCount.get("watchUserCount"));
+                    watchUserCountList.remove(i);          // 从原列表
+                }
+            }
+            //匹配4.获取完成人数
+            for (int i = completeWatchUserCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> completeWatchUserCount = completeWatchUserCountList.get(i);
+                if (completeWatchUserCount == null || completeWatchUserCount.get("hourId") == null) continue;
+
+                if (hour.get("hourId").equals(completeWatchUserCount.get("hourId")))
+                {
+                    hour.put("completeWatchUserCount",completeWatchUserCount.get("completeWatchUserCount"));
+                    completeWatchUserCountList.remove(i);          // 从原列表
+                }
+            }
+            //匹配5.获取完成率
+            for (int i = completeRateList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> completeRate = completeRateList.get(i);
+                if (completeRate == null || completeRate.get("hourId") == null) continue;
+                if (hour.get("hourId").equals(completeRate.get("hourId")))
+                {
+                    hour.put("completeRate",completeRate.get("completeRate"));
+                    completeRateList.remove(i);          // 从原列表
+                }
+            }
+            //匹配6.获取平均观看时长
+            for (int i = avgStayTimeList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> avgStayTime = avgStayTimeList.get(i);
+                if (avgStayTime == null || avgStayTime.get("hourId") == null) continue;
+                if (hour.get("hourId").equals(avgStayTime.get("hourId")))
+                {
+                    hour.put("avgStayTime",avgStayTime.get("avgStayTime"));
+                    avgStayTimeList.remove(i);          // 从原列表
+                }
+            }
+            //匹配7.获取跳出率
+            for (int i = jumpOutRateList.size() - 1; i >= 0; i--) {
+                Map<String, Object> jumpOutRate = jumpOutRateList.get(i);
+                if (jumpOutRate == null || jumpOutRate.get("hourId") == null) continue;
+                if (hour.get("hourId").equals(jumpOutRate.get("hourId")))
+                {
+                    hour.put("jumpOutRate",jumpOutRate.get("jumpOutRate"));
+                    jumpOutRateList.remove(i);          // 从原列表
+                }
+            }
+            //匹配8.获取下载数(笔记数)
+            for (int i = downloadCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> downloadCount = downloadCountList.get(i);
+                if (downloadCount == null || downloadCount.get("hourId") == null) continue;
+                if (hour.get("hourId").equals(downloadCount.get("hourId")))
+                {
+                    hour.put("downloadCount",downloadCount.get("downloadCount"));
+                    downloadCountList.remove(i);
+                }
+            }
+            //匹配9.获取笔记数
+            for (int i = noteCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> noteCount = noteCountList.get(i);
+                if (noteCount == null || noteCount.get("hourId") == null) continue;
+                if (hour.get("hourId").equals(noteCount.get("hourId")))
+                {
+                    hour.put("noteCount",noteCount.get("noteCount"));
+                    noteCountList.remove(i);
+                }
+            }
+            //匹配10.获取讨论数
+            for (int i = postCountList.size() - 1; i >= 0; i--)
+            {
+                Map<String,Object> postCount = postCountList.get(i);
+                if (postCount == null || postCount.get("hourId") == null) continue;
+                if (hour.get("hourId").equals(postCount.get("hourId")))
+                {
+                    hour.put("postCount",postCount.get("postCount"));
+                    postCountList.remove(i);
+                }
+            }
+
+        }
+
+        return page;
+    }
+
+}