Преглед на файлове

feat:排行榜接口完善、新增视频下拉列表接口、转化漏斗图

caoliqin преди 2 месеца
родител
ревизия
33ccf76f49
променени са 16 файла, в които са добавени 381 реда и са изтрити 50 реда
  1. 31 11
      fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java
  2. 13 1
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  3. 5 0
      fs-service-system/src/main/java/com/fs/course/param/newfs/UserCourseVideoPageParam.java
  4. 8 0
      fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  5. 11 0
      fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  6. 0 3
      fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserCourseListVO.java
  7. 19 0
      fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserVideoListVO.java
  8. 7 3
      fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java
  9. 58 2
      fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java
  10. 33 11
      fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java
  11. 27 0
      fs-service-system/src/main/java/com/fs/store/vo/h5/FsCourseRankingVO.java
  12. 34 0
      fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserGraphicStatisticsVO.java
  13. 1 1
      fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserRankingVO.java
  14. 3 3
      fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserStatisticsVO.java
  15. 2 0
      fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml
  16. 129 15
      fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

+ 31 - 11
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -138,35 +138,55 @@ public class FsUserController extends AppBaseController {
     public ResponseResult<FsUserStatisticsVO> userStatisticsDetails(@ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
                                                                     @ApiParam(value = "视频id") @RequestParam(required = false) String videoId) {
         long userId = Long.parseLong(getUserId());
-        FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatisticsDetails(userId, courseId, videoId);
+        long companyId = getCompanyId();
+        FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatisticsDetails(userId, courseId, videoId, companyId);
         return ResponseResult.ok(fsUserStatisticsVO);
     }
 
     @GetMapping("/firstPage/userRanking")
     @ApiOperation("首页数据/详情-销售排行榜统计")
-    public ResponseResult<FsUserRankingVO> userRanking(
-            @ApiParam(value = "开始时间") @RequestParam String startTime,
-            @ApiParam(value = "结束时间") @RequestParam String endTime,
+    public ResponseResult<List<FsUserRankingVO>> userRanking(
+            @ApiParam(value = "开始时间") @RequestParam(required = false) String startTime,
+            @ApiParam(value = "结束时间") @RequestParam(required = false) String endTime,
             @ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
             @ApiParam(value = "视频id") @RequestParam(required = false) String videoId,
             @ApiParam(value = "asc-正序,desc-倒序", required = true) @RequestParam String order,
-            @ApiParam(value = "类型,1-按完播率,2-按正确率", required = true) @RequestParam(required = false) Integer type
-            ) {
+            @ApiParam(value = "类型,1-按完播率,2-按正确率", required = true) @RequestParam Integer type
+    ) {
         long userId = Long.parseLong(getUserId());
         return ResponseResult.ok(fsUserService.userRanking(userId, startTime, endTime, courseId, videoId, order, type));
     }
 
     @GetMapping("/firstPage/courseRanking")
     @ApiOperation("首页数据/详情-课程排行榜统计")
-    public ResponseResult<FsUserRankingVO> courseRanking(
-            @ApiParam(value = "开始时间") @RequestParam String startTime,
-            @ApiParam(value = "结束时间") @RequestParam String endTime,
+    public ResponseResult<List<FsCourseRankingVO>> courseRanking(
+            @ApiParam(value = "开始时间") @RequestParam(required = false) String startTime,
+            @ApiParam(value = "结束时间") @RequestParam(required = false) String endTime,
             @ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
             @ApiParam(value = "视频id") @RequestParam(required = false) String videoId,
             @ApiParam(value = "asc-正序,desc-倒序", required = true) @RequestParam String order,
-            @ApiParam(value = "类型,1-按完播率,2-按正确率", required = true) @RequestParam(required = false) Integer type
+            @ApiParam(value = "类型,1-按完播率,2-按正确率", required = true) @RequestParam Integer type
     ) {
         long userId = Long.parseLong(getUserId());
-        return ResponseResult.ok();
+        return ResponseResult.ok(fsUserService.courseRanking(userId, startTime, endTime, courseId, videoId, order, type));
+    }
+
+    @GetMapping("/firstPage/graphic")
+    @ApiOperation("首页数据-转化漏斗图")
+    public ResponseResult<List<FsUserGraphicStatisticsVO>> graphicStatistics(@ApiParam(value = "开始时间", required = true) @RequestParam String startTime,
+                                                                @ApiParam(value = "结束时间", required = true) @RequestParam String endTime) {
+        long userId = Long.parseLong(getUserId());
+        List<FsUserGraphicStatisticsVO> list = fsUserService.graphicStatistics(userId, startTime, endTime, null, null);
+        return ResponseResult.ok(list);
     }
+
+    @GetMapping("/graphic/details")
+    @ApiOperation("详情-转化漏斗图")
+    public ResponseResult<List<FsUserGraphicStatisticsVO>> graphicStatisticsDetails(@ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
+                                                                                    @ApiParam(value = "视频id") @RequestParam(required = false) String videoId) {
+        long userId = Long.parseLong(getUserId());
+        List<FsUserGraphicStatisticsVO> list = fsUserService.graphicStatistics(userId, null, null, courseId, videoId);
+        return ResponseResult.ok(list);
+    }
+
 }

+ 13 - 1
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -11,6 +11,7 @@ import com.fs.course.vo.FsUserCourseListPVO;
 import com.fs.course.vo.newfs.FsUserCourseListVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
+import com.fs.course.vo.newfs.FsUserVideoListVO;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
@@ -40,6 +41,7 @@ public class FsUserCourseVideoController extends AppBaseController {
     @ApiOperation("课程分页列表")
     public ResponseResult<PageInfo<FsUserCourseVideoPageListVO>> list(UserCourseVideoPageParam param) {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        param.setCompanyId(getCompanyId());
         List<FsUserCourseVideoPageListVO> list = fsUserCourseVideoService.pageListCourseVideo(param);
         PageInfo<FsUserCourseVideoPageListVO> pageInfo = new PageInfo<>(list);
         return ResponseResult.ok(pageInfo);
@@ -53,7 +55,7 @@ public class FsUserCourseVideoController extends AppBaseController {
 
     @GetMapping("/courseList")
     @ApiOperation("获取课程下拉列表")
-    public ResponseResult<PageInfo<FsUserCourseListVO>> getAllCompanyUser(FsUserCourseListParam param) {
+    public ResponseResult<PageInfo<FsUserCourseListVO>> getAllCourseList(FsUserCourseListParam param) {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         param.setCompanyId(getCompanyId());
         List<FsUserCourseListVO> fsUserCourseList = fsUserCourseService.getFsUserCourseList(param);
@@ -80,4 +82,14 @@ public class FsUserCourseVideoController extends AppBaseController {
         List<FsCourseAnalysisVO> list = fsUserCourseVideoService.getCourseAnalysisByMap(params);
         return R.ok().put("data", new PageInfo<>(list));
     }
+
+    @GetMapping("/videoList")
+    @ApiOperation("获取视频下拉列表")
+    public ResponseResult<PageInfo<FsUserVideoListVO>> getAllVideoList(UserCourseVideoPageParam param) {
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        param.setCompanyId(getCompanyId());
+        List<FsUserVideoListVO> listCourseVideo = fsUserCourseVideoService.getListCourseVideo(param);
+        PageInfo<FsUserVideoListVO> result = new PageInfo<>(listCourseVideo);
+        return ResponseResult.ok(result);
+    }
 }

+ 5 - 0
fs-service-system/src/main/java/com/fs/course/param/newfs/UserCourseVideoPageParam.java

@@ -23,6 +23,11 @@ public class UserCourseVideoPageParam implements Serializable {
     @ApiModelProperty(value = "课程id")
     private Long courseId;
 
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+
+
 //    @ApiModelProperty(value = "视频状态 1:草稿,2:待审核,3:发布")
 //    private Long status;
 

+ 8 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java

@@ -11,6 +11,7 @@ import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.course.vo.FsUserCourseVideoQVO;
 import com.fs.course.vo.FsUserCourseVideoVO;
+import com.fs.course.vo.newfs.FsUserVideoListVO;
 
 import java.util.List;
 import java.util.Map;
@@ -112,4 +113,11 @@ public interface IFsUserCourseVideoService
      * @return list
      */
     List<FsCourseAnalysisVO> getCourseAnalysisByMap(Map<String, Object> params);
+
+    /**
+     * 获取下拉视频列表(有分页,仅返回两个字段)
+     * @param param 入参
+     * @return list
+     */
+    List<FsUserVideoListVO> getListCourseVideo(UserCourseVideoPageParam param);
 }

+ 11 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -22,6 +22,7 @@ import com.fs.course.vo.FsUserCourseVideoQVO;
 import com.fs.course.vo.FsUserCourseVideoVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
+import com.fs.course.vo.newfs.FsUserVideoListVO;
 import com.fs.course.vo.newfs.FsUserVideoQuestionVO;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.store.domain.FsUser;
@@ -750,4 +751,14 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     public List<FsCourseAnalysisVO> getCourseAnalysisByMap(Map<String, Object> params) {
         return fsUserCourseVideoMapper.getCourseAnalysisByMap(params);
     }
+
+    @Override
+    public List<FsUserVideoListVO> getListCourseVideo(UserCourseVideoPageParam param) {
+        List<FsUserCourseVideoPageListVO> list = fsUserCourseVideoMapper.selectFsUserCourseVideoPageList(param);
+        return list.stream().map(v -> {
+            FsUserVideoListVO videoListVO = new FsUserVideoListVO();
+            BeanUtils.copyProperties(v, videoListVO);
+            return videoListVO;
+        }).collect(Collectors.toList());
+    }
 }

+ 0 - 3
fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserCourseListVO.java

@@ -5,9 +5,6 @@ import lombok.Data;
 
 /**
  * 课程下拉列表 对象(需要分页)
- *
- * @author fs
- * @date 2024-05-15
  */
 @Data
 public class FsUserCourseListVO {

+ 19 - 0
fs-service-system/src/main/java/com/fs/course/vo/newfs/FsUserVideoListVO.java

@@ -0,0 +1,19 @@
+package com.fs.course.vo.newfs;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 视频下拉列表 对象(需要分页)
+ *
+ */
+@Data
+public class FsUserVideoListVO {
+
+    @ApiModelProperty(value = "视频id")
+    private Long videoId;
+
+    @ApiModelProperty(value = "视频名称")
+    private String title;
+
+}

+ 7 - 3
fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java

@@ -247,10 +247,14 @@ public interface FsUserMapper
 
     Map<String, Object> countUserRedPacket(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId);
 
-    Map<String, Long> countCourseDetails(@Param("userId") Long userId, @Param("courseId")String courseId, @Param("videoId")String videoId);
+    Map<String, Long> countCourseDetails(@Param("userId") Long userId, @Param("courseId")String courseId, @Param("videoId")String videoId,  @Param("companyId")Long companyId);
 
-    FsUserRankingVO countUserRanking(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId, @Param("order")String order);
+    List<FsUserRankingVO> countUserRankingByComplete(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId, @Param("order")String order);
 
-    FsUserRankingVO countCourseRanking(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId, @Param("order")String order);
+    List<FsUserRankingVO> countUserRankingByRight(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId, @Param("order")String order);
+
+    List<FsCourseRankingVO> countCourseRankingByComplete(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId, @Param("order")String order);
+
+    List<FsCourseRankingVO> countCourseRankingByRight(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId, @Param("order")String order);
 
 }

+ 58 - 2
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -153,12 +153,68 @@ public interface IFsUserService
      */
     Map<String, Long> getUserVipCountByCompanyUserId(Long companyUserId);
 
+    /**
+     * 首页-获取用户总数
+     * @param userId 登录用户id
+     * @return vo
+     */
     FsUserSummaryCountVO userSummaryCount(Long userId);
 
+    /**
+     * 首页数据统计-课程、答题、红包统计
+     * @param userId 登录用户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param courseId 课程id
+     * @param videoId 视频id
+     * @return vo
+     */
     FsUserStatisticsVO userStatistics(Long userId, String startTime, String endTime, String courseId, String videoId);
 
-    FsUserStatisticsVO userStatisticsDetails(Long userId, String courseId, String videoId);
+    /**
+     * 数据详情统计-根据课程id 视频id进行详情统计
+     * @param userId 登录用户id
+     * @param courseId 课程id
+     * @param videoId 视频id
+     * @return vo
+     */
+    FsUserStatisticsVO userStatisticsDetails(Long userId, String courseId, String videoId, Long companyId);
 
-    FsUserRankingVO userRanking(Long userId, String startTime, String endTime, String courseId, String videoId, String order, Integer type);
+    /**
+     * 首页数据/详情-获取群管排行榜统计
+     * @param userId 登录用户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param courseId 课程id
+     * @param videoId 视频id
+     * @param order 排序,asc-正序,desc-倒序
+     * @param type 类型,1-按完播率,2-按正确率
+     * @return vo
+     */
+    List<FsUserRankingVO> userRanking(Long userId, String startTime, String endTime, String courseId, String videoId, String order, Integer type);
+
+    /**
+     * 首页数据/详情-获取课程排行榜统计
+     * @param userId 登录用户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param courseId 课程id
+     * @param videoId 视频id
+     * @param order 排序,asc-正序,desc-倒序
+     * @param type 类型,1-按完播率,2-按正确率
+     * @return vo
+     */
+    List<FsCourseRankingVO> courseRanking(Long userId, String startTime, String endTime, String courseId, String videoId, String order, Integer type);
+
+    /**
+     *
+     * @param userId 用户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param courseId 课程id
+     * @param videoId 视频id
+     * @return
+     */
+    List<FsUserGraphicStatisticsVO> graphicStatistics(Long userId, String startTime, String endTime, String courseId, String videoId);
 
 }

+ 33 - 11
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -2,10 +2,7 @@ package com.fs.store.service.impl;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -528,11 +525,11 @@ public class FsUserServiceImpl implements IFsUserService
     }
 
     @Override
-    public FsUserStatisticsVO userStatisticsDetails(Long userId, String courseId, String videoId) {
+    public FsUserStatisticsVO userStatisticsDetails(Long userId, String courseId, String videoId, Long companyId) {
         FsUserStatisticsVO userStatisticsVO = getUserStatistics(userId, null, null, courseId, videoId);
 
         //统计课程数据详情,在查询统计详情的时候需要显示
-        Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetails(userId, courseId, videoId);
+        Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetails(userId, courseId, videoId, companyId);
         if(courseDetailsMap != null && courseDetailsMap.get("courseNum") != null && courseDetailsMap.get("videoNum") != null && courseDetailsMap.get("courseUserNum") != null){
             userStatisticsVO.setCourseNum(Integer.parseInt(courseDetailsMap.get("courseNum").toString()))
                     .setVideoNum(Integer.parseInt(courseDetailsMap.get("videoNum").toString()))
@@ -542,16 +539,41 @@ public class FsUserServiceImpl implements IFsUserService
     }
 
     @Override
-    public FsUserRankingVO userRanking(Long userId, String startTime, String endTime, String courseId, String videoId, String order, Integer type) {
-        FsUserRankingVO fsUserRankingVO = null;
+    public List<FsUserRankingVO> userRanking(Long userId, String startTime, String endTime, String courseId, String videoId, String order, Integer type) {
+        List<FsUserRankingVO> listVO = Collections.emptyList();
         if(type == 1){
             //按完播率
-             fsUserRankingVO = fsUserMapper.countUserRanking(userId, startTime, endTime, courseId, videoId, order);
+            listVO = fsUserMapper.countUserRankingByComplete(userId, startTime, endTime, courseId, videoId, order);
         }
         if(type == 2){
             //按正确率
-             fsUserRankingVO = fsUserMapper.countCourseRanking(userId, startTime, endTime, courseId, videoId, order);
+            listVO = fsUserMapper.countUserRankingByRight(userId, startTime, endTime, courseId, videoId, order);
         }
-        return fsUserRankingVO;
+        return listVO;
+    }
+
+    @Override
+    public List<FsCourseRankingVO> courseRanking(Long userId, String startTime, String endTime, String courseId, String videoId, String order, Integer type) {
+        List<FsCourseRankingVO> list = Collections.emptyList();
+        if(type == 1){
+            list = fsUserMapper.countCourseRankingByComplete(userId, startTime, endTime, courseId, videoId, order);
+        }
+        if(type == 2){
+            list = fsUserMapper.countCourseRankingByRight(userId, startTime, endTime, courseId, videoId, order);
+        }
+
+        return list;
+    }
+
+    @Override
+    public List<FsUserGraphicStatisticsVO> graphicStatistics(Long userId, String startTime, String endTime, String courseId, String videoId) {
+        FsUserStatisticsVO userStatistics = getUserStatistics(userId, startTime, endTime, courseId, videoId);
+        List<FsUserGraphicStatisticsVO> list = new ArrayList<>();
+        list.add(new FsUserGraphicStatisticsVO("观看人数",userStatistics.getCourseWatchNum(), userStatistics.getCourseWatchNum()));
+        list.add(new FsUserGraphicStatisticsVO("完播人数", userStatistics.getCourseCompleteNum(), userStatistics.getCourseCompleteNum()));
+        list.add(new FsUserGraphicStatisticsVO("答题人数", userStatistics.getAnswerNum(), userStatistics.getAnswerNum()));
+        list.add(new FsUserGraphicStatisticsVO("正确人数", userStatistics.getAnswerRightNum(), userStatistics.getAnswerRightNum()));
+        list.add(new FsUserGraphicStatisticsVO("答题红包数", userStatistics.getRedPacketNum(), userStatistics.getRedPacketNum()));
+        return list;
     }
 }

+ 27 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/FsCourseRankingVO.java

@@ -0,0 +1,27 @@
+package com.fs.store.vo.h5;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * 首页-销售数据排行榜
+ */
+@Data
+@ApiModel
+@Accessors(chain = true)
+public class FsCourseRankingVO {
+
+    @ApiModelProperty(value = "课程名称")
+    private String videoName;
+
+    @ApiModelProperty(value = "完播率")
+    private BigDecimal completeRate;
+
+    @ApiModelProperty(value = "正确率")
+    private BigDecimal answerRightRate;
+
+}

+ 34 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserGraphicStatisticsVO.java

@@ -0,0 +1,34 @@
+package com.fs.store.vo.h5;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 首页-漏斗图统计
+ */
+@Data
+@ApiModel
+@Accessors(chain = true)
+public class FsUserGraphicStatisticsVO {
+
+    @ApiModelProperty(value = "统计名称")
+    private String name;
+
+    @ApiModelProperty(value = "显示文本值")
+    private int contextValue;
+
+    @ApiModelProperty(value = "统计值")
+    private int value;
+
+    public FsUserGraphicStatisticsVO() {
+
+    }
+
+    public FsUserGraphicStatisticsVO(String name, int contextValue, int value) {
+        this.name = name;
+        this.contextValue = contextValue;
+        this.value = value;
+    }
+}

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserRankingVO.java

@@ -16,7 +16,7 @@ import java.math.BigDecimal;
 public class FsUserRankingVO {
 
     @ApiModelProperty(value = "销售名称")
-    private int userName;
+    private String userName;
 
     @ApiModelProperty(value = "完播率")
     private BigDecimal completeRate;

+ 3 - 3
fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserStatisticsVO.java

@@ -15,13 +15,13 @@ import java.math.BigDecimal;
 @Accessors(chain = true)
 public class FsUserStatisticsVO {
 
-    @ApiModelProperty(value = "观看人数")
+    @ApiModelProperty(value = "课程统计-观看人数")
     private int courseWatchNum;
 
-    @ApiModelProperty(value = "完播人数")
+    @ApiModelProperty(value = "课程统计-完播人数")
     private int courseCompleteNum;
 
-    @ApiModelProperty(value = "完播率")
+    @ApiModelProperty(value = "课程统计-完播率")
     private int courseCompleteRate;
 
 

+ 2 - 0
fs-service-system/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml

@@ -180,6 +180,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         FROM `fs_user_course_video` video
         LEFT JOIN fs_user_course course ON video.course_id = course.course_id
         where 1 = 1
+        and course.is_del = 0
+        AND FIND_IN_SET(#{companyId}, course.company_ids)
         <if test="courseId != null and courseId !='' ">
             AND video.course_id = #{courseId}
         </if>

+ 129 - 15
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -638,7 +638,7 @@
         SELECT
             (
                 SELECT
-                    count( fcc.user_id )
+                    count(distinct fcc.user_id )
                 FROM
                     fs_user_course_count fcc
                         LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
@@ -661,7 +661,7 @@
             ) as courseWatchNum,
             (
                 SELECT
-                    count( fcc.user_id )
+                    count(distinct fcc.user_id )
                 FROM
                     fs_user_course_count fcc
                         LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
@@ -689,7 +689,7 @@
         SELECT
         (
         SELECT
-        count( fs_user.user_id )
+        count(distinct fs_user.user_id )
         FROM
         fs_course_answer_logs
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
@@ -711,7 +711,7 @@
         ) AS answerNum,
         (
         SELECT
-        count( fs_user.user_id )
+        count(distinct fs_user.user_id )
         FROM
         fs_course_answer_logs
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
@@ -783,17 +783,20 @@
     </select>
 
     <select id="countCourseDetails" resultType="Map">
-    select (SELECT count(fc.course_id)
+    select (SELECT count(DISTINCT fc.course_id)
             FROM fs_user_course fc
             WHERE fc.is_del = 0
+            AND FIND_IN_SET(#{companyId}, fc.company_ids)
             <if test="courseId != null and courseId != ''">
                 AND fc.course_id =  #{courseId}
             </if>
             ) as courseNum,
 
-           (SELECT count(fcv.video_id)
+           (SELECT count(DISTINCT fcv.video_id)
             FROM fs_user_course_video fcv
                      LEFT JOIN fs_user_course fc ON fc.course_id = fcv.course_id
+            WHERE fc.is_del = 0
+            AND FIND_IN_SET(#{companyId}, fc.company_ids)
             <if test="courseId != null and courseId != ''">
                 AND fcv.course_id =  #{courseId}
             </if>
@@ -801,7 +804,7 @@
                 AND fcv.video_id = #{videoId}
             </if>
             ) as videoNum,
-        ( SELECT count( user_id ) FROM fs_user_course_count fcc
+        ( SELECT count(DISTINCT user_id ) FROM fs_user_course_count fcc
             LEFT JOIN fs_user_course_video fcv ON fcv.course_id = fcc.course_id
         <if test="courseId != null and courseId != ''">
             AND fcc.course_id =  #{courseId}
@@ -812,11 +815,11 @@
          ) as courseUserNum
     </select>
 
-    <select id="countUserRanking" resultType="FsUserRankingVO">
+    <select id="countUserRankingByComplete" resultType="FsUserRankingVO">
         SELECT
         company_user.nick_name as userName,
         ifnull(
-            ROUND((COUNT( CASE WHEN fcc.complete_watch_count > 0 THEN 1 END ) / count( fcc.user_id ))*100,2),0
+            ROUND((COUNT(DISTINCT CASE WHEN fcc.complete_watch_count > 0 THEN 1 END ) / count(1))*100,2),0
         ) as completeRate
         FROM
         fs_user_course_count fcc
@@ -824,7 +827,7 @@
         LEFT JOIN company_user ON fs_user.company_user_id = company_user.user_id
         LEFT JOIN fs_user_course_video fcv ON fcv.course_id = fcc.course_id
         WHERE
-        company_user.parent_id = #{userId}
+        ( company_user.user_id = #{userId} OR company_user.parent_id = #{userId} )
         <if test="startTime != null and startTime !='' ">
             AND fcc.create_time &gt;= #{startTime}
         </if>
@@ -838,15 +841,25 @@
             AND fcv.video_id = #{videoId}
         </if>
         group by fcc.user_id
-        order by completeRate #{order}
+        <choose>
+            <when test="order != null and order == 'asc'">
+                order by completeRate asc
+            </when>
+            <when test="order != null and order == 'desc'">
+                order by completeRate desc
+            </when>
+            <otherwise>
+                order by completeRate desc
+            </otherwise>
+        </choose>
         limit 20
     </select>
 
-    <select id="countCourseRanking" resultType="FsUserRankingVO">
+    <select id="countUserRankingByRight" resultType="FsUserRankingVO">
         SELECT
             company_user.nick_name as userName,
             ifnull(ROUND(
-                           (COUNT( CASE WHEN fs_course_answer_logs.is_right = 1 THEN 1 END ) / count( fs_user.user_id ))
+                           (COUNT(DISTINCT CASE WHEN fs_course_answer_logs.is_right = 1 THEN 1 END ) / count(1))
                                *100,2),0
             ) as answerRightRate
         FROM
@@ -854,7 +867,7 @@
                 LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
                 LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
         WHERE
-            company_user.parent_id = #{userId}
+        ( company_user.user_id = #{userId} OR company_user.parent_id = #{userId} )
             <if test="startTime != null and startTime !='' ">
                 AND fs_course_answer_logs.create_time &gt;= #{startTime}
             </if>
@@ -868,8 +881,109 @@
                 AND fs_course_answer_logs.video_id = #{videoId}
             </if>
         group by fs_user.user_id
-        order by answerRightRate #{order}
+        <choose>
+            <when test="order != null and order == 'asc'">
+                order by answerRightRate asc
+            </when>
+            <when test="order != null and order == 'desc'">
+                order by answerRightRate desc
+            </when>
+            <otherwise>
+                order by answerRightRate desc
+            </otherwise>
+        </choose>
         limit 20
     </select>
 
+    <select id="countCourseRankingByComplete" resultType="FsCourseRankingVO">
+        SELECT
+        fcv.title AS videoName,
+        ifnull(
+        ROUND((
+        COUNT( DISTINCT CASE WHEN fcc.complete_watch_count > 0 THEN 1 END ) / count(1))* 100,
+        2
+        ),
+        0
+        ) AS completeRate
+        FROM
+        fs_user_course_count fcc
+        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
+        LEFT JOIN company_user ON fs_user.company_user_id = company_user.user_id
+        LEFT JOIN fs_user_course_video fcv ON fcv.course_id = fcc.course_id
+        WHERE
+        ( company_user.user_id = #{userId} OR company_user.parent_id = #{userId} )
+        <if test="startTime != null and startTime !='' ">
+            AND fcc.create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND fcc.create_time &lt;= #{endTime}
+        </if>
+        <if test="courseId != null and courseId != ''">
+            AND fcc.course_id =  #{courseId}
+        </if>
+        <if test="videoId != null and videoId != ''">
+            AND fcv.video_id = #{videoId}
+        </if>
+        GROUP BY
+        fcv.video_id
+        <choose>
+            <when test="order != null and order == 'asc'">
+                ORDER BY completeRate asc
+            </when>
+            <when test="order != null and order == 'desc'">
+                ORDER BY completeRate desc
+            </when>
+            <otherwise>
+                ORDER BY completeRate desc
+            </otherwise>
+        </choose>
+        LIMIT 20
+    </select>
+
+    <select id="countCourseRankingByRight" resultType="FsCourseRankingVO">
+        SELECT
+        fcv.title AS videoName,
+        ifnull(
+        ROUND(
+        (
+        COUNT( DISTINCT CASE WHEN fs_course_answer_logs.is_right = 1 THEN 1 END ) / count(1)) * 100,
+        2
+        ),
+        0
+        ) AS answerRightRate
+        FROM
+        fs_course_answer_logs
+        LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
+        LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
+        LEFT JOIN fs_user_course_video fcv ON fcv.video_id = fs_course_answer_logs.video_id
+        WHERE
+        ( company_user.user_id = #{userId} OR company_user.parent_id = #{userId} )
+        <if test="startTime != null and startTime !='' ">
+            AND fs_course_answer_logs.create_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND fs_course_answer_logs.create_time &lt;= #{endTime}
+        </if>
+        <if test="courseId != null and courseId != ''">
+            AND fs_course_answer_logs.course_id =  #{courseId}
+        </if>
+        <if test="videoId != null and videoId != ''">
+            AND fs_course_answer_logs.video_id = #{videoId}
+        </if>
+        GROUP BY
+        fs_course_answer_logs.video_id
+        <choose>
+            <when test="order != null and order == 'asc'">
+                ORDER BY answerRightRate asc
+            </when>
+            <when test="order != null and order == 'desc'">
+                ORDER BY answerRightRate desc
+            </when>
+            <otherwise>
+                ORDER BY answerRightRate desc
+            </otherwise>
+        </choose>
+        LIMIT 20
+    </select>
+
 </mapper>