浏览代码

课程数据汇总

xdd 2 月之前
父节点
当前提交
86840e5e0a

+ 2 - 2
fs-company/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java

@@ -195,7 +195,7 @@ public class FsCourseWatchLogController extends BaseController
     @GetMapping("/export")
     public AjaxResult export(FsCourseWatchLogListParam param)
     {
-        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVOExport(param);
         ExcelUtil<FsCourseWatchLogListVO> util = new ExcelUtil<FsCourseWatchLogListVO>(FsCourseWatchLogListVO.class);
         return util.exportExcel(list, "短链课程看课记录数据");
     }
@@ -210,7 +210,7 @@ public class FsCourseWatchLogController extends BaseController
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId( loginUser.getCompany().getCompanyId());
-        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVO(param);
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogListVOExport(param);
         ExcelUtil<FsCourseWatchLogListVO> util = new ExcelUtil<FsCourseWatchLogListVO>(FsCourseWatchLogListVO.class);
         return util.exportExcel(list, "短链课程看课记录数据");
     }

+ 1 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java

@@ -81,6 +81,7 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
 
 
     List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVO(FsCourseWatchLogListParam param);
+    List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOExport(FsCourseWatchLogListParam param);
 
     List<FsCourseWatchLogListVO> selectFsCourseWatchLogListByParam(FsCourseWatchLogListParam param);
 

+ 8 - 2
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -219,7 +219,7 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
 
     @Override
     public List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVO(FsCourseWatchLogListParam param) {
-        List<FsCourseWatchLogListVO> list = fsCourseWatchLogMapper.selectFsCourseWatchLogListVO(param);
+        List<FsCourseWatchLogListVO> list = fsCourseWatchLogMapper.selectFsCourseWatchLogListVONew(param);
         for (FsCourseWatchLogListVO item : list) {
             // 项目
             if(ObjectUtils.isNotNull(item.getProject())) {
@@ -272,6 +272,11 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         return list;
     }
 
+    @Override
+    public List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOExport(FsCourseWatchLogListParam param) {
+        return fsCourseWatchLogMapper.selectFsCourseWatchLogListVO(param);
+    }
+
     @Override
     public List<FsCourseWatchLogListVO> selectFsCourseWatchLogListByParam(FsCourseWatchLogListParam param) {
 
@@ -596,7 +601,8 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                         qwWatchLog.setCompanyId(fsCourseWatchLog.getCompanyId());
                         qwWatchLog.setCompanyUserId(fsCourseWatchLog.getCompanyUserId());
                         qwWatchLog.setFsUserId(fsCourseWatchLog.getUserId());
-
+                        qwWatchLog.setCourseId(fsCourseWatchLog.getCourseId());
+                        qwWatchLog.setVideoId(fsCourseWatchLog.getVideoId());
                         QwWatchLogs.add(qwWatchLog);
                     }
                     if (!QwWatchLogs.isEmpty()){

+ 3 - 0
fs-service-system/src/main/java/com/fs/qw/domain/QwWatchLog.java

@@ -47,4 +47,7 @@ public class QwWatchLog extends BaseEntity{
     private Long fsUserId;
     private Long companyId;
     private Long companyUserId;
+
+    private Long courseId;
+    private Long videoId;
 }

+ 12 - 75
fs-service-system/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java

@@ -104,14 +104,14 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
             "COUNT(CASE WHEN day = 1 and status=2 THEN 1 END) AS d1Over\n" +
             " from qw_watch_log where qw_user_id=#{id} and DATE(line_time) = DATE(#{createTime})")
     QwWatchLogStatisticsListVO selectQwWatchLogByQwUserId(@Param("id")Long id,@Param("createTime") Date createTime);
-    @Select("select \n" +
-            "COUNT(CASE WHEN day = 0 and status in (1,2) THEN 1 END) AS firstOnline," +
-            "COUNT(CASE WHEN day = 0 and status=2 THEN 1 END) AS firstOver," +
-            "COUNT(CASE WHEN day = 1 and status in (1,2) THEN 1 END) AS d1Online," +
-            "COUNT(CASE WHEN day = 1 and status=2 THEN 1 END) AS d1Over," +
-            "COUNT(1) AS line" +
-            " from qw_watch_log where company_user_id=#{companyUserId} and DATE(line_time) between #{sTime} and #{dTime}")
-    QwWatchLogStatisticsListVO selectQwWatchLogByCompanyUserId(@Param("companyUserId") Long companyUserId,@Param("sTime") Date sTime,@Param("dTime") Date dTime);
+
+    List<QwWatchLogStatisticsListVO> selectQwWatchLogByCompanyUserId(@Param("companyUserId") Long companyUserId,
+                                                                     @Param("sTime") Date sTime,
+                                                                     @Param("dTime") Date dTime,
+                                                                     @Param("project") Long project,
+                                                                     @Param("courseId") Long courseId,
+                                                                     @Param("videoId") Long videoId
+    );
 
 
     @Select("SELECT count(1) from qw_watch_log where ext_id=#{id} and `day`=0 ")
@@ -187,73 +187,10 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
     QwWatchLogAllStatisticsListVO selectQwWatchLogAllStatisticsListVO(@Param("id")Long id,@Param("createTime") Date createTime);
 
 
-
-    @Select("select \n" +
-            "COUNT(CASE WHEN day = 0 and status in (1,2) THEN 1 END) AS firstOnline,\n" +
-            "COUNT(CASE WHEN day = 0 and status=2 THEN 1 END) AS firstOver,\n" +
-            "COUNT(CASE WHEN day = 1 and status in (1,2) THEN 1 END) AS d1Online,\n" +
-            "COUNT(CASE WHEN day = 1 and status=2 THEN 1 END) AS d1Over,\n" +
-            "COUNT(CASE WHEN day = 2 and status in (1,2) THEN 1 END) AS d2Online,\n" +
-            "COUNT(CASE WHEN day = 2 and status=2 THEN 1 END) AS d2Over,\n" +
-            "COUNT(CASE WHEN day = 3 and status in (1,2) THEN 1 END) AS d3Online,\n" +
-            "COUNT(CASE WHEN day = 3 and status=2 THEN 1 END) AS d3Over,\n" +
-            "COUNT(CASE WHEN day = 4 and status in (1,2) THEN 1 END) AS d4Online,\n" +
-            "COUNT(CASE WHEN day = 4 and status=2 THEN 1 END) AS d4Over,\n" +
-            "COUNT(CASE WHEN day = 5 and status in (1,2) THEN 1 END) AS d5Online,\n" +
-            "COUNT(CASE WHEN day = 5 and status=2 THEN 1 END) AS d5Over,\n" +
-            "COUNT(CASE WHEN day = 6 and status in (1,2) THEN 1 END) AS d6Online,\n" +
-            "COUNT(CASE WHEN day = 6 and status=2 THEN 1 END) AS d6Over,\n" +
-            "COUNT(CASE WHEN day = 7 and status in (1,2) THEN 1 END) AS d7Online,\n" +
-            "COUNT(CASE WHEN day = 7 and status=2 THEN 1 END) AS d7Over,\n" +
-            "COUNT(CASE WHEN day = 8 and status in (1,2) THEN 1 END) AS d8Online,\n" +
-            "COUNT(CASE WHEN day = 8 and status=2 THEN 1 END) AS d8Over,\n" +
-            "COUNT(CASE WHEN day = 9 and status in (1,2) THEN 1 END) AS d9Online,\n" +
-            "COUNT(CASE WHEN day = 9 and status=2 THEN 1 END) AS d9Over,\n" +
-            "COUNT(CASE WHEN day = 10 and status in (1,2) THEN 1 END) AS d10Online,\n" +
-            "COUNT(CASE WHEN day = 10 and status=2 THEN 1 END) AS d10Over,\n" +
-            "COUNT(CASE WHEN day = 11 and status in (1,2) THEN 1 END) AS d11Online,\n" +
-            "COUNT(CASE WHEN day = 11 and status=2 THEN 1 END) AS d11Over,\n" +
-            "COUNT(CASE WHEN day = 12 and status in (1,2) THEN 1 END) AS d12Online,\n" +
-            "COUNT(CASE WHEN day = 12 and status=2 THEN 1 END) AS d12Over,\n" +
-            "COUNT(CASE WHEN day = 13 and status in (1,2) THEN 1 END) AS d13Online,\n" +
-            "COUNT(CASE WHEN day = 13 and status=2 THEN 1 END) AS d13Over,\n" +
-            "COUNT(CASE WHEN day = 14 and status in (1,2) THEN 1 END) AS d14Online,\n" +
-            "COUNT(CASE WHEN day = 14 and status=2 THEN 1 END) AS d14Over,\n" +
-            "COUNT(CASE WHEN day = 15 and status in (1,2) THEN 1 END) AS d15Online,\n" +
-            "COUNT(CASE WHEN day = 15 and status=2 THEN 1 END) AS d15Over,\n" +
-            "COUNT(CASE WHEN day = 16 and status in (1,2) THEN 1 END) AS d16Online,\n" +
-            "COUNT(CASE WHEN day = 16 and status=2 THEN 1 END) AS d16Over,\n" +
-            "COUNT(CASE WHEN day = 17 and status in (1,2) THEN 1 END) AS d17Online,\n" +
-            "COUNT(CASE WHEN day = 17 and status=2 THEN 1 END) AS d17Over,\n" +
-            "COUNT(CASE WHEN day = 18 and status in (1,2) THEN 1 END) AS d18Online,\n" +
-            "COUNT(CASE WHEN day = 18 and status=2 THEN 1 END) AS d18Over,\n" +
-            "COUNT(CASE WHEN day = 19 and status in (1,2) THEN 1 END) AS d19Online,\n" +
-            "COUNT(CASE WHEN day = 19 and status=2 THEN 1 END) AS d19Over,\n" +
-            "COUNT(CASE WHEN day = 20 and status in (1,2) THEN 1 END) AS d20Online,\n" +
-            "COUNT(CASE WHEN day = 20 and status=2 THEN 1 END) AS d20Over,\n" +
-            "COUNT(CASE WHEN day = 21 and status in (1,2) THEN 1 END) AS d21Online,\n" +
-            "COUNT(CASE WHEN day = 21 and status=2 THEN 1 END) AS d21Over,\n" +
-            "COUNT(CASE WHEN day = 22 and status in (1,2) THEN 1 END) AS d22Online,\n" +
-            "COUNT(CASE WHEN day = 22 and status=2 THEN 1 END) AS d22Over,\n" +
-            "COUNT(CASE WHEN day = 23 and status in (1,2) THEN 1 END) AS d23Online,\n" +
-            "COUNT(CASE WHEN day = 23 and status=2 THEN 1 END) AS d23Over,\n" +
-            "COUNT(CASE WHEN day = 24 and status in (1,2) THEN 1 END) AS d24Online,\n" +
-            "COUNT(CASE WHEN day = 24 and status=2 THEN 1 END) AS d24Over,\n" +
-            "COUNT(CASE WHEN day = 25 and status in (1,2) THEN 1 END) AS d25Online,\n" +
-            "COUNT(CASE WHEN day = 25 and status=2 THEN 1 END) AS d25Over,\n" +
-            "COUNT(CASE WHEN day = 26 and status in (1,2) THEN 1 END) AS d26Online,\n" +
-            "COUNT(CASE WHEN day = 26 and status=2 THEN 1 END) AS d26Over,\n" +
-            "COUNT(CASE WHEN day = 27 and status in (1,2) THEN 1 END) AS d27Online,\n" +
-            "COUNT(CASE WHEN day = 27 and status=2 THEN 1 END) AS d27Over,\n" +
-            "COUNT(CASE WHEN day = 28 and status in (1,2) THEN 1 END) AS d28Online,\n" +
-            "COUNT(CASE WHEN day = 28 and status=2 THEN 1 END) AS d28Over,\n" +
-            "COUNT(CASE WHEN day = 29 and status in (1,2) THEN 1 END) AS d29Online,\n" +
-            "COUNT(CASE WHEN day = 29 and status=2 THEN 1 END) AS d29Over,\n" +
-            "COUNT(CASE WHEN day = 30 and status in (1,2) THEN 1 END) AS d30Online,\n" +
-            "COUNT(CASE WHEN day = 30 and status=2 THEN 1 END) AS d30Over," +
-            "COUNT(1) AS line" +
-            " from qw_watch_log where company_user_id=#{companyUserId} and DATE(line_time) between #{sDate} AND #{eDate}")
-    QwWatchLogAllStatisticsListVO selectQwWatchLogAllStatisticsListVONew(@Param("companyUserId")Long companyUserId,@Param("sDate") Date sDate,@Param("eDate") Date eDate);
+    List<QwWatchLogAllStatisticsListVO> selectQwWatchLogAllStatisticsListVONew(@Param("companyUserId")Long companyUserId, @Param("sDate") Date sDate, @Param("eDate") Date eDate,
+                                                                               @Param("project") Long project,
+                                                                               @Param("courseId") Long courseId,
+                                                                               @Param("videoId") Long videoId);
     @Select({"<script> " +
             "SELECT\n" +
             "    qec.qw_user_id id,\n" +

+ 3 - 0
fs-service-system/src/main/java/com/fs/qw/param/QwWatchLogStatisticsListParam.java

@@ -17,4 +17,7 @@ public class QwWatchLogStatisticsListParam {
     private Long companyUserId;
     private Long id;
     private String ids;
+    private Long project;
+    private Long courseId;
+    private Long videoId;
 }

+ 73 - 15
fs-service-system/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java

@@ -1,9 +1,14 @@
 package com.fs.qw.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.DictUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.course.domain.FsUserCourse;
+import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.service.cache.IFsUserCourseVideoCacheService;
 import com.fs.qw.domain.QwWatchLog;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
@@ -12,6 +17,8 @@ import com.fs.qw.param.QwWatchLogStatisticsListParam;
 import com.fs.qw.service.IQwWatchLogService;
 import com.fs.qw.vo.QwWatchLogAllStatisticsListVO;
 import com.fs.qw.vo.QwWatchLogStatisticsListVO;
+import com.fs.store.service.cache.IFsUserCourseCacheService;
+import com.hc.openapi.tool.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -25,21 +32,25 @@ import java.util.*;
  */
 @Service
 public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatchLog> implements IQwWatchLogService {
-    @Autowired
-    private QwUserMapper qwUserMapper;
+
     @Autowired
     private QwWatchLogMapper qwWatchLogMapper;
-    @Autowired
-    private QwExternalContactMapper qwExternalContactMapper;
+
     @Autowired
     private CompanyUserMapper companyUserMapper;
+
+    @Autowired
+    private IFsUserCourseCacheService fsUserCourseCacheService;
+
+    @Autowired
+    private IFsUserCourseVideoCacheService fsUserCourseVideoCacheService;
     /**
      * 查询企微看课
      *
      * @param id 企微看课主键
      * @return 企微看课
      */
-    @Override
+     @Override
     public QwWatchLog selectQwWatchLogById(Long id)
     {
         return baseMapper.selectQwWatchLogById(id);
@@ -140,13 +151,34 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         List<QwWatchLogStatisticsListVO> list = new ArrayList<>();
         for (CompanyUser companyUser : companyUsers) {
             // 统计销售下面的所有记录
-            QwWatchLogStatisticsListVO vo = qwWatchLogMapper.selectQwWatchLogByCompanyUserId(companyUser.getCompanyId(),
-                    param.getSTime(),param.getETime());
-            vo.setCompanyUserName(String.format("%s_%d",companyUser.getUserName(),companyUser.getUserId()));
-            vo.setCreateTime(companyUser.getCreateTime());
-            list.add(vo);
+            List<QwWatchLogStatisticsListVO> vos = qwWatchLogMapper.selectQwWatchLogByCompanyUserId(companyUser.getCompanyId(),
+                    param.getSTime(),param.getETime(),param.getProject(),param.getCourseId(),param.getVideoId());
+            for (QwWatchLogStatisticsListVO item : vos) {
+                item.setCompanyUserName(String.format("%s_%d",companyUser.getUserName(),companyUser.getUserId()));
+                item.setCreateTime(companyUser.getCreateTime());
+                if(ObjectUtils.isNotNull(item.getProject())){
+                    String sysCourseProject = DictUtils.getDictLabel("sys_course_project", String.valueOf(item.getProject()));
+                    if(StringUtils.isNotBlank(sysCourseProject)){
+                        item.setProjectName(sysCourseProject);
+                    }
+                }
+                // 课程名
+                if(ObjectUtils.isNotNull(item.getCourseId())) {
+                    FsUserCourse course = fsUserCourseCacheService.selectFsUserCourseByCourseId(item.getCourseId());
+                    if(ObjectUtils.isNotNull(course)){
+                        item.setCourseName(course.getCourseName());
+                    }
+                }
+                // 小节名
+                if(ObjectUtils.isNotNull(item.getVideoId())) {
+                    FsUserCourseVideo fsUserCourseVideo = fsUserCourseVideoCacheService.selectFsUserCourseVideoByVideoId(item.getVideoId());
+                    if(ObjectUtils.isNotNull(fsUserCourseVideo)){
+                        item.setVideoName(fsUserCourseVideo.getTitle());
+                    }
+                }
+                list.add(item);
+            }
         }
-
         return list;
     }
 
@@ -184,10 +216,36 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         List<QwWatchLogAllStatisticsListVO> list = new ArrayList<>();
 
         for (CompanyUser companyUser : companyUsers) {
-            QwWatchLogAllStatisticsListVO vo = qwWatchLogMapper.selectQwWatchLogAllStatisticsListVONew(companyUser.getCompanyId(), param.getSTime(), param.getETime());
-            vo.setQwUserName(companyUser.getUserName());
-            vo.setCreateTime(companyUser.getCreateTime());
-            list.add(vo);
+            List<QwWatchLogAllStatisticsListVO> vos = qwWatchLogMapper
+                    .selectQwWatchLogAllStatisticsListVONew(companyUser.getCompanyId(), param.getSTime(), param.getETime(),
+                            param.getProject(),param.getCourseId(),param.getVideoId()
+                            );
+            for (QwWatchLogAllStatisticsListVO item : vos) {
+                if(ObjectUtils.isNotNull(item.getProject())){
+                    String sysCourseProject = DictUtils.getDictLabel("sys_course_project", String.valueOf(item.getProject()));
+                    if(StringUtils.isNotBlank(sysCourseProject)){
+                        item.setProjectName(sysCourseProject);
+                    }
+                }
+                // 课程名
+                if(ObjectUtils.isNotNull(item.getCourseId())) {
+                    FsUserCourse course = fsUserCourseCacheService.selectFsUserCourseByCourseId(item.getCourseId());
+                    if(ObjectUtils.isNotNull(course)){
+                        item.setCourseName(course.getCourseName());
+                    }
+                }
+                // 小节名
+                if(ObjectUtils.isNotNull(item.getVideoId())) {
+                    FsUserCourseVideo fsUserCourseVideo = fsUserCourseVideoCacheService.selectFsUserCourseVideoByVideoId(item.getVideoId());
+                    if(ObjectUtils.isNotNull(fsUserCourseVideo)){
+                        item.setVideoName(fsUserCourseVideo.getTitle());
+                    }
+                }
+                item.setQwUserName(companyUser.getUserName());
+                item.setCreateTime(companyUser.getCreateTime());
+                list.add(item);
+            }
+
         }
         return list;
     }

+ 16 - 0
fs-service-system/src/main/java/com/fs/qw/vo/QwWatchLogAllStatisticsListVO.java

@@ -78,5 +78,21 @@ public class QwWatchLogAllStatisticsListVO {
     Long d29Over;
     Long d30Online;
     Long d30Over;
+    /**
+     * 项目
+     */
+    private Long project;
+    private String projectName;
 
+    /**
+     * 课程
+     */
+    private Long courseId;
+    private String courseName;
+
+    /**
+     * 小节
+     */
+    private Long videoId;
+    private String videoName;
 }

+ 18 - 0
fs-service-system/src/main/java/com/fs/qw/vo/QwWatchLogStatisticsListVO.java

@@ -12,6 +12,24 @@ public class QwWatchLogStatisticsListVO {
     private String companyUserName;
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createTime;
+    /**
+     * 项目
+     */
+    private Long project;
+    private String projectName;
+
+    /**
+     * 课程
+     */
+    private Long courseId;
+    private String courseName;
+
+    /**
+     * 小节
+     */
+    private Long videoId;
+    private String videoName;
+
     private Long line;//进线数
     private Long firstOnline;//先导课上线
     private Long firstOver;//先导课完课

+ 102 - 0
fs-service-system/src/main/resources/mapper/qw/QwWatchLogMapper.xml

@@ -34,6 +34,108 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectQwWatchLogVo"/>
         where id = #{id}
     </select>
+    <select id="selectQwWatchLogByCompanyUserId" resultType="com.fs.qw.vo.QwWatchLogStatisticsListVO">
+            select
+            COUNT(CASE WHEN day = 0 and status in (1,2) THEN 1 END) AS firstOnline,
+            COUNT(CASE WHEN day = 0 and status=2 THEN 1 END) AS firstOver,
+            COUNT(CASE WHEN day = 1 and status in (1,2) THEN 1 END) AS d1Online,
+            COUNT(CASE WHEN day = 1 and status=2 THEN 1 END) AS d1Over,
+            COUNT(1) AS line,project,course_id,video_id
+             from qw_watch_log where
+           company_user_id=#{companyUserId}
+            <if test="project != null">
+                and project=#{project}
+            </if>
+            <if test="courseId != null">
+                and course_id=#{courseId}
+            </if>
+            <if test="videoId != null">
+                and video_id=#{videoId}
+            </if>
+           and DATE(line_time) between #{sTime} and #{dTime}
+            group by project,course_id,video_id
+    </select>
+    <select id="selectQwWatchLogAllStatisticsListVONew"
+            resultType="com.fs.qw.vo.QwWatchLogAllStatisticsListVO">
+            select
+            COUNT(CASE WHEN day = 0 and status in (1,2) THEN 1 END) AS firstOnline,
+            COUNT(CASE WHEN day = 0 and status=2 THEN 1 END) AS firstOver,
+            COUNT(CASE WHEN day = 1 and status in (1,2) THEN 1 END) AS d1Online,
+            COUNT(CASE WHEN day = 1 and status=2 THEN 1 END) AS d1Over,
+            COUNT(CASE WHEN day = 2 and status in (1,2) THEN 1 END) AS d2Online,
+            COUNT(CASE WHEN day = 2 and status=2 THEN 1 END) AS d2Over,
+            COUNT(CASE WHEN day = 3 and status in (1,2) THEN 1 END) AS d3Online,
+            COUNT(CASE WHEN day = 3 and status=2 THEN 1 END) AS d3Over,
+            COUNT(CASE WHEN day = 4 and status in (1,2) THEN 1 END) AS d4Online,
+            COUNT(CASE WHEN day = 4 and status=2 THEN 1 END) AS d4Over,
+            COUNT(CASE WHEN day = 5 and status in (1,2) THEN 1 END) AS d5Online,
+            COUNT(CASE WHEN day = 5 and status=2 THEN 1 END) AS d5Over,
+            COUNT(CASE WHEN day = 6 and status in (1,2) THEN 1 END) AS d6Online,
+            COUNT(CASE WHEN day = 6 and status=2 THEN 1 END) AS d6Over,
+            COUNT(CASE WHEN day = 7 and status in (1,2) THEN 1 END) AS d7Online,
+            COUNT(CASE WHEN day = 7 and status=2 THEN 1 END) AS d7Over,
+            COUNT(CASE WHEN day = 8 and status in (1,2) THEN 1 END) AS d8Online,
+            COUNT(CASE WHEN day = 8 and status=2 THEN 1 END) AS d8Over,
+            COUNT(CASE WHEN day = 9 and status in (1,2) THEN 1 END) AS d9Online,
+            COUNT(CASE WHEN day = 9 and status=2 THEN 1 END) AS d9Over,
+            COUNT(CASE WHEN day = 10 and status in (1,2) THEN 1 END) AS d10Online,
+            COUNT(CASE WHEN day = 10 and status=2 THEN 1 END) AS d10Over,
+            COUNT(CASE WHEN day = 11 and status in (1,2) THEN 1 END) AS d11Online,
+            COUNT(CASE WHEN day = 11 and status=2 THEN 1 END) AS d11Over,
+            COUNT(CASE WHEN day = 12 and status in (1,2) THEN 1 END) AS d12Online,
+            COUNT(CASE WHEN day = 12 and status=2 THEN 1 END) AS d12Over,
+            COUNT(CASE WHEN day = 13 and status in (1,2) THEN 1 END) AS d13Online,
+            COUNT(CASE WHEN day = 13 and status=2 THEN 1 END) AS d13Over,
+            COUNT(CASE WHEN day = 14 and status in (1,2) THEN 1 END) AS d14Online,
+            COUNT(CASE WHEN day = 14 and status=2 THEN 1 END) AS d14Over,
+            COUNT(CASE WHEN day = 15 and status in (1,2) THEN 1 END) AS d15Online,
+            COUNT(CASE WHEN day = 15 and status=2 THEN 1 END) AS d15Over,
+            COUNT(CASE WHEN day = 16 and status in (1,2) THEN 1 END) AS d16Online,
+            COUNT(CASE WHEN day = 16 and status=2 THEN 1 END) AS d16Over,
+            COUNT(CASE WHEN day = 17 and status in (1,2) THEN 1 END) AS d17Online,
+            COUNT(CASE WHEN day = 17 and status=2 THEN 1 END) AS d17Over,
+            COUNT(CASE WHEN day = 18 and status in (1,2) THEN 1 END) AS d18Online,
+            COUNT(CASE WHEN day = 18 and status=2 THEN 1 END) AS d18Over,
+            COUNT(CASE WHEN day = 19 and status in (1,2) THEN 1 END) AS d19Online,
+            COUNT(CASE WHEN day = 19 and status=2 THEN 1 END) AS d19Over,
+            COUNT(CASE WHEN day = 20 and status in (1,2) THEN 1 END) AS d20Online,
+            COUNT(CASE WHEN day = 20 and status=2 THEN 1 END) AS d20Over,
+            COUNT(CASE WHEN day = 21 and status in (1,2) THEN 1 END) AS d21Online,
+            COUNT(CASE WHEN day = 21 and status=2 THEN 1 END) AS d21Over,
+            COUNT(CASE WHEN day = 22 and status in (1,2) THEN 1 END) AS d22Online,
+            COUNT(CASE WHEN day = 22 and status=2 THEN 1 END) AS d22Over,
+            COUNT(CASE WHEN day = 23 and status in (1,2) THEN 1 END) AS d23Online,
+            COUNT(CASE WHEN day = 23 and status=2 THEN 1 END) AS d23Over,
+            COUNT(CASE WHEN day = 24 and status in (1,2) THEN 1 END) AS d24Online,
+            COUNT(CASE WHEN day = 24 and status=2 THEN 1 END) AS d24Over,
+            COUNT(CASE WHEN day = 25 and status in (1,2) THEN 1 END) AS d25Online,
+            COUNT(CASE WHEN day = 25 and status=2 THEN 1 END) AS d25Over,
+            COUNT(CASE WHEN day = 26 and status in (1,2) THEN 1 END) AS d26Online,
+            COUNT(CASE WHEN day = 26 and status=2 THEN 1 END) AS d26Over,
+            COUNT(CASE WHEN day = 27 and status in (1,2) THEN 1 END) AS d27Online,
+            COUNT(CASE WHEN day = 27 and status=2 THEN 1 END) AS d27Over,
+            COUNT(CASE WHEN day = 28 and status in (1,2) THEN 1 END) AS d28Online,
+            COUNT(CASE WHEN day = 28 and status=2 THEN 1 END) AS d28Over,
+            COUNT(CASE WHEN day = 29 and status in (1,2) THEN 1 END) AS d29Online,
+            COUNT(CASE WHEN day = 29 and status=2 THEN 1 END) AS d29Over,
+            COUNT(CASE WHEN day = 30 and status in (1,2) THEN 1 END) AS d30Online,
+            COUNT(CASE WHEN day = 30 and status=2 THEN 1 END) AS d30Over,
+            COUNT(1) AS line,project,course_id,video_id
+             from qw_watch_log
+            <where>
+                company_user_id=#{companyUserId}
+                <if test="project != null">
+                    and project = #{project}
+                </if>
+                <if test="courseId != null">
+                    and course_id = #{project}
+                </if>
+                <if test="videoId != null">
+                    and video_id =#{videoId}
+                </if>
+                and DATE(line_time) between #{sDate} AND #{eDate} group by project,course_id,video_id
+            </where>
+    </select>
 
     <insert id="insertQwWatchLog" parameterType="QwWatchLog" useGeneratedKeys="true" keyProperty="id">
         insert into qw_watch_log