Переглянути джерело

feat:管理-列表统计查询、二级销售会员情况和看课情况统计

caoliqin 2 місяців тому
батько
коміт
718735cbb4

+ 50 - 6
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -9,8 +9,11 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyTagUserService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.CompanyQueryVo;
+import com.fs.course.vo.newfs.FsCourseAnalysisVO;
+import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.param.h5.TagListParam;
+import com.fs.store.param.h5.UserStatisticsCommonParam;
 import com.fs.store.service.IFsUserService;
 import com.fs.store.vo.h5.*;
 import com.github.pagehelper.PageHelper;
@@ -124,10 +127,14 @@ public class FsUserController extends AppBaseController {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String nowDate = dateFormat.format(new Date());
         /*---------- 如果传入的日期是今天 ----------*/
-        FsUserStatisticsVO vo = fsUserService.userStatistics(userId, startTime, endTime, null, null);
+        UserStatisticsCommonParam param = new UserStatisticsCommonParam();
+        param.setUserId(userId).setStartTime(startTime).setEndTime(endTime);
+        FsUserStatisticsVO vo = fsUserService.userStatistics(param);
         if (nowDate.compareTo(startTime) > 0 && nowDate.compareTo(endTime) < 0) {
             String yesterday = LocalDate.now().minusDays(1).toString();
-            FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatistics(userId, yesterday + " 00:00:00", yesterday + " 23:59:59", null, null);
+            UserStatisticsCommonParam paramYes = new UserStatisticsCommonParam();
+            paramYes.setUserId(userId).setStartTime(yesterday + " 00:00:00").setEndTime(yesterday + " 23:59:59");
+            FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatistics(paramYes);
             vo.setYesterdayVO(fsUserStatisticsVO);
         }
         return ResponseResult.ok(vo);
@@ -139,7 +146,9 @@ public class FsUserController extends AppBaseController {
                                                                     @ApiParam(value = "视频id") @RequestParam(required = false) String videoId) {
         long userId = Long.parseLong(getUserId());
         long companyId = getCompanyId();
-        FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatisticsDetails(userId, courseId, videoId, companyId);
+        UserStatisticsCommonParam param = new UserStatisticsCommonParam();
+        param.setUserId(userId).setCourseId(courseId).setVideoId(videoId).setCompanyId(companyId);
+        FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatisticsDetails(param);
         return ResponseResult.ok(fsUserStatisticsVO);
     }
 
@@ -174,9 +183,11 @@ public class FsUserController extends AppBaseController {
     @GetMapping("/firstPage/graphic")
     @ApiOperation("首页数据-转化漏斗图")
     public ResponseResult<List<FsUserGraphicStatisticsVO>> graphicStatistics(@ApiParam(value = "开始时间", required = true) @RequestParam String startTime,
-                                                                @ApiParam(value = "结束时间", required = true) @RequestParam String endTime) {
+                                                                             @ApiParam(value = "结束时间", required = true) @RequestParam String endTime) {
         long userId = Long.parseLong(getUserId());
-        List<FsUserGraphicStatisticsVO> list = fsUserService.graphicStatistics(userId, startTime, endTime, null, null);
+        UserStatisticsCommonParam param = new UserStatisticsCommonParam();
+        param.setUserId(userId).setStartTime(startTime).setEndTime(endTime);
+        List<FsUserGraphicStatisticsVO> list = fsUserService.graphicStatistics(param);
         return ResponseResult.ok(list);
     }
 
@@ -185,8 +196,41 @@ public class FsUserController extends AppBaseController {
     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);
+        UserStatisticsCommonParam param = new UserStatisticsCommonParam();
+        param.setUserId(userId).setCourseId(courseId).setVideoId(videoId);
+        List<FsUserGraphicStatisticsVO> list = fsUserService.graphicStatistics(param);
         return ResponseResult.ok(list);
     }
 
+    @GetMapping("/courseAnalysis")
+    @ApiOperation("管理-课程分析-分页列表查询")
+    public ResponseResult<PageInfo<FsCourseAnalysisVO>> courseAnalysisList(CourseAnalysisParam param) {
+        param.setCompanyId(getCompanyId());
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<FsCourseAnalysisVO> list = fsUserService.courseAnalysis(param);
+        PageInfo<FsCourseAnalysisVO> pageInfo = new PageInfo<>(list);
+        return ResponseResult.ok(pageInfo);
+    }
+
+    @GetMapping("/companyUser/details")
+    @ApiOperation("管理-群管数据-根据销售id,群管数据统计")
+    public ResponseResult<FsUserStatisticsVO> companyUserStatistics(@ApiParam(value = "课程id") @RequestParam(required = false) String courseId,
+                                                                    @ApiParam(value = "视频id") @RequestParam(required = false) String videoId,
+                                                                    @ApiParam(value = "销售用户id", required = true) @RequestParam String companyUserId) {
+        UserStatisticsCommonParam param = new UserStatisticsCommonParam();
+        param.setUserId(Long.parseLong(getUserId()))
+                .setCourseId(courseId).setVideoId(videoId)
+                .setCompanyId(getCompanyId())
+                .setCompanyUserId(companyUserId);
+        FsUserStatisticsVO fsUserStatisticsVO = fsUserService.userStatisticsDetails(param);
+        return ResponseResult.ok(fsUserStatisticsVO);
+    }
+
+    @GetMapping("/companyUser/summaryCount")
+    @ApiOperation("管理-群管数据-顶部会员统计")
+    public ResponseResult<CompanyUserSummaryCountVO> companyUserSummaryCount(@ApiParam(value = "销售用户id", required = true) @RequestParam String companyUserId) {
+        long userId = Long.parseLong(getUserId());
+        return ResponseResult.ok(fsUserService.companyUserSummaryCount(userId, companyUserId));
+    }
+
 }

+ 50 - 0
fs-service-system/src/main/java/com/fs/course/vo/newfs/FsCourseAnalysisCountVO.java

@@ -0,0 +1,50 @@
+package com.fs.course.vo.newfs;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel
+public class FsCourseAnalysisCountVO implements Cloneable {
+
+    @ApiModelProperty(value = "关联视频id")
+    private Long videoId;
+
+    @ApiModelProperty(value = "观看人数")
+    private int courseWatchNum;
+
+    @ApiModelProperty(value = "完播人数")
+    private int courseCompleteNum;
+
+    @ApiModelProperty(value = "完播率")
+    private BigDecimal completeRate;
+
+    @ApiModelProperty(value = "答题红包数")
+    private int redPacketNum;
+
+    @ApiModelProperty(value = "答题红包金额")
+    private BigDecimal redPacketAmount;
+
+    @ApiModelProperty(value = "答题人数")
+    private int answerNum;
+
+    @ApiModelProperty(value = "正确人数")
+    private int answerRightNum;
+
+    @ApiModelProperty(value = "正确率")
+    private BigDecimal answerRightRate;
+
+    @Override
+    public FsCourseAnalysisCountVO clone() {
+        FsCourseAnalysisCountVO countVO;
+        try {
+            countVO = (FsCourseAnalysisCountVO) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError();
+        }
+        return countVO;
+    }
+}

+ 43 - 0
fs-service-system/src/main/java/com/fs/course/vo/newfs/FsCourseAnalysisVO.java

@@ -0,0 +1,43 @@
+package com.fs.course.vo.newfs;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel
+public class FsCourseAnalysisVO implements Cloneable{
+
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "关联视频id")
+    private Long videoId;
+
+    @ApiModelProperty(value = "视频标题")
+    private String title;
+
+    @ApiModelProperty(value = "视频封面")
+    private String thumbnail;
+
+    @ApiModelProperty(value = "统计信息")
+    private FsCourseAnalysisCountVO countVO;
+
+    /**
+     * 深度克隆
+     */
+    @Override
+    public FsCourseAnalysisVO clone() {
+        FsCourseAnalysisVO vo;
+        try {
+            vo = (FsCourseAnalysisVO) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError();
+        }
+        vo.countVO = countVO.clone();
+        return vo;
+    }
+}

+ 16 - 4
fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java

@@ -3,6 +3,7 @@ package com.fs.store.mapper;
 import java.util.List;
 import java.util.Map;
 
+import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
 import com.fs.qw.vo.newvo.ExternalContactNumVO;
@@ -10,7 +11,9 @@ import com.fs.store.domain.FsStorePayment;
 import com.fs.store.domain.FsUser;
 import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.param.SelectCusListPageParam;
+import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.param.h5.FsUserPageListParam;
+import com.fs.store.param.h5.UserStatisticsCommonParam;
 import com.fs.store.vo.FSUserVO;
 
 import com.fs.store.vo.FsCompanyUserListQueryVO;
@@ -241,13 +244,13 @@ public interface FsUserMapper
 
     List<FsUserSummaryCountTagVO> countTag(@Param("userId") Long userId);
 
-    Map<String, Long> countUserCourse(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId);
+    Map<String, Long> countUserCourse(UserStatisticsCommonParam param);
 
-    Map<String, Long> countUserAnswer(@Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("courseId")String courseId, @Param("videoId")String videoId);
+    Map<String, Long> countUserAnswer(UserStatisticsCommonParam param);
 
-    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, Object> countUserRedPacket(UserStatisticsCommonParam param);
 
-    Map<String, Long> countCourseDetails(@Param("userId") Long userId, @Param("courseId")String courseId, @Param("videoId")String videoId,  @Param("companyId")Long companyId);
+    Map<String, Long> countCourseDetails(UserStatisticsCommonParam param);
 
     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);
 
@@ -257,4 +260,13 @@ public interface FsUserMapper
 
     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);
 
+    List<FsCourseAnalysisCountVO> courseAnalysisCourseCount(CourseAnalysisParam param);
+
+    List<FsCourseAnalysisCountVO> courseAnalysisRedPacketCount(CourseAnalysisParam param);
+
+    List<FsCourseAnalysisCountVO> courseAnalysisAnswerCount(CourseAnalysisParam param);
+
+    CompanyUserSummaryCountVO companyUserCount(@Param("companyUserId")String companyUserId);
+
+    CompanyUserSummaryCountVO newUserRedPacketCount(@Param("companyUserId")String companyUserId);
 }

+ 37 - 0
fs-service-system/src/main/java/com/fs/store/param/h5/CourseAnalysisParam.java

@@ -0,0 +1,37 @@
+package com.fs.store.param.h5;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 课程分析查询-入参
+ */
+@Data
+public class CourseAnalysisParam implements Serializable {
+
+    @ApiModelProperty(value = "页码,默认为1", required = true)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "页大小,默认为10", required = true)
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "销售用户id")
+    private Long companyUserId;
+
+    @ApiModelProperty(value = "课程id")
+    private String courseId;
+
+    @ApiModelProperty(value = "视频id")
+    private String videoId;
+
+//    @ApiModelProperty(value = "登录用户id,不传")
+//    private Long userId;
+
+    @ApiModelProperty(value = "公司id,不传")
+    private Long companyId;
+
+}
+

+ 40 - 0
fs-service-system/src/main/java/com/fs/store/param/h5/UserStatisticsCommonParam.java

@@ -0,0 +1,40 @@
+package com.fs.store.param.h5;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 课程分析查询-入参
+ */
+@Data
+@Accessors(chain = true)
+public class UserStatisticsCommonParam implements Serializable {
+
+    @ApiModelProperty(value = "登录用户id,不传")
+    private Long userId;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "课程id")
+    private String courseId;
+
+    @ApiModelProperty(value = "视频id")
+    private String videoId;
+
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @ApiModelProperty(value = "群管(二级销售)id")
+    private String companyUserId;
+
+
+}
+

+ 25 - 17
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -6,6 +6,7 @@ import java.util.Map;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.company.vo.CompanyQueryVo;
+import com.fs.course.vo.newfs.FsCourseAnalysisVO;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
 import com.fs.store.domain.FsStoreOrder;
@@ -13,7 +14,9 @@ import com.fs.store.domain.FsStoreOrderItem;
 import com.fs.store.domain.FsUser;
 import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.param.SelectCusListPageParam;
+import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.param.h5.FsUserPageListParam;
+import com.fs.store.param.h5.UserStatisticsCommonParam;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
 import com.fs.store.vo.FsUserTuiVO;
@@ -163,23 +166,17 @@ public interface IFsUserService
 
     /**
      * 首页数据统计-课程、答题、红包统计
-     * @param userId 登录用户id
-     * @param startTime 开始时间
-     * @param endTime 结束时间
-     * @param courseId 课程id
-     * @param videoId 视频id
+     * @param param 查询参数
      * @return vo
      */
-    FsUserStatisticsVO userStatistics(Long userId, String startTime, String endTime, String courseId, String videoId);
+    FsUserStatisticsVO userStatistics(UserStatisticsCommonParam param);
 
     /**
      * 数据详情统计-根据课程id 视频id进行详情统计
-     * @param userId 登录用户id
-     * @param courseId 课程id
-     * @param videoId 视频id
+     * @param param 查询参数
      * @return vo
      */
-    FsUserStatisticsVO userStatisticsDetails(Long userId, String courseId, String videoId, Long companyId);
+    FsUserStatisticsVO userStatisticsDetails(UserStatisticsCommonParam param);
 
     /**
      * 首页数据/详情-获取群管排行榜统计
@@ -209,13 +206,24 @@ public interface IFsUserService
 
     /**
      *
-     * @param userId 用户id
-     * @param startTime 开始时间
-     * @param endTime 结束时间
-     * @param courseId 课程id
-     * @param videoId 视频id
-     * @return
+     * @param param 查询参数
+     * @return vo
+     */
+    List<FsUserGraphicStatisticsVO> graphicStatistics(UserStatisticsCommonParam param);
+
+    /**
+     * 课程分析查询-某销售下课程视频的观看和答题情况统计
+     * @param param 参数
+     * @return vo
+     */
+    List<FsCourseAnalysisVO> courseAnalysis(CourseAnalysisParam param);
+
+    /**
+     * 查询某个群管(二级销售)的会员统计
+     * @param userId 登录用户id
+     * @param companyUserId 销售id
+     * @return vo
      */
-    List<FsUserGraphicStatisticsVO> graphicStatistics(Long userId, String startTime, String endTime, String courseId, String videoId);
+    CompanyUserSummaryCountVO companyUserSummaryCount(Long userId, String companyUserId);
 
 }

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

@@ -3,6 +3,7 @@ package com.fs.store.service.impl;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -16,6 +17,11 @@ import com.fs.company.cache.ICompanyUserCacheService;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.CompanyQueryVo;
+import com.fs.course.mapper.FsUserCourseVideoMapper;
+import com.fs.course.param.newfs.UserCourseVideoPageParam;
+import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
+import com.fs.course.vo.newfs.FsCourseAnalysisVO;
+import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
 import com.fs.store.domain.FsStoreOrder;
@@ -26,8 +32,10 @@ import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.enums.BillDetailEnum;
 import com.fs.store.mapper.FsStoreOrderMapper;
 import com.fs.store.mapper.FsStoreProductAttrValueMapper;
+import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.param.SelectCusListPageParam;
+import com.fs.store.param.h5.UserStatisticsCommonParam;
 import com.fs.store.service.IFsUserBillService;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
@@ -75,6 +83,8 @@ public class FsUserServiceImpl implements IFsUserService
     private ICompanyUserCacheService companyUserCacheService;
     @Autowired
     private ICompanyUserService companyUserService;
+    @Autowired
+    private FsUserCourseVideoMapper userCourseVideoMapper;
 
     /**
      * 查询用户
@@ -480,15 +490,15 @@ public class FsUserServiceImpl implements IFsUserService
     }
 
     @Override
-    public FsUserStatisticsVO userStatistics(Long userId, String startTime, String endTime, String courseId, String videoId) {
-        return getUserStatistics(userId, startTime, endTime, courseId, videoId);
+    public FsUserStatisticsVO userStatistics(UserStatisticsCommonParam param) {
+        return getUserStatistics(param);
     }
 
-    private FsUserStatisticsVO getUserStatistics(Long userId, String startTime, String endTime, String courseId, String videoId) {
+    private FsUserStatisticsVO getUserStatistics(UserStatisticsCommonParam param) {
         FsUserStatisticsVO fsUserStatisticsVO = new FsUserStatisticsVO();
 
         // 获取课程统计
-        Map<String, Long> couserMap = fsUserMapper.countUserCourse(userId, startTime, endTime, courseId, videoId);
+        Map<String, Long> couserMap = fsUserMapper.countUserCourse(param);
         if (couserMap != null) {
             fsUserStatisticsVO.setCourseWatchNum(couserMap.get("courseWatchNum").intValue()).setCourseCompleteNum(couserMap.get("courseCompleteNum").intValue());
 
@@ -502,7 +512,7 @@ public class FsUserServiceImpl implements IFsUserService
         }
 
         // 获取答题统计
-        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(userId, startTime, endTime, courseId, videoId);
+        Map<String, Long> answerMap = fsUserMapper.countUserAnswer(param);
         if (answerMap != null) {
             fsUserStatisticsVO.setAnswerNum(answerMap.get("answerNum").intValue()).setAnswerRightNum(answerMap.get("answerRightNum").intValue());
 
@@ -516,7 +526,7 @@ public class FsUserServiceImpl implements IFsUserService
         }
 
         // 获取红包统计
-        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(userId, startTime, endTime, courseId, videoId);
+        Map<String, Object> redPacketMap = fsUserMapper.countUserRedPacket(param);
         if(redPacketMap != null && redPacketMap.get("redPacketNum") != null && redPacketMap.get("redPacketAmount") != null) {
             fsUserStatisticsVO.setRedPacketNum(Integer.parseInt(redPacketMap.get("redPacketNum").toString()))
                     .setRedPacketAmount(new BigDecimal(redPacketMap.get("redPacketAmount").toString()));
@@ -525,11 +535,11 @@ public class FsUserServiceImpl implements IFsUserService
     }
 
     @Override
-    public FsUserStatisticsVO userStatisticsDetails(Long userId, String courseId, String videoId, Long companyId) {
-        FsUserStatisticsVO userStatisticsVO = getUserStatistics(userId, null, null, courseId, videoId);
+    public FsUserStatisticsVO userStatisticsDetails(UserStatisticsCommonParam param) {
+        FsUserStatisticsVO userStatisticsVO = getUserStatistics(param);
 
         //统计课程数据详情,在查询统计详情的时候需要显示
-        Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetails(userId, courseId, videoId, companyId);
+        Map<String, Long> courseDetailsMap = fsUserMapper.countCourseDetails(param);
         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()))
@@ -566,8 +576,8 @@ public class FsUserServiceImpl implements IFsUserService
     }
 
     @Override
-    public List<FsUserGraphicStatisticsVO> graphicStatistics(Long userId, String startTime, String endTime, String courseId, String videoId) {
-        FsUserStatisticsVO userStatistics = getUserStatistics(userId, startTime, endTime, courseId, videoId);
+    public List<FsUserGraphicStatisticsVO> graphicStatistics(UserStatisticsCommonParam param) {
+        FsUserStatisticsVO userStatistics = getUserStatistics(param);
         List<FsUserGraphicStatisticsVO> list = new ArrayList<>();
         list.add(new FsUserGraphicStatisticsVO("观看人数",userStatistics.getCourseWatchNum(), userStatistics.getCourseWatchNum()));
         list.add(new FsUserGraphicStatisticsVO("完播人数", userStatistics.getCourseCompleteNum(), userStatistics.getCourseCompleteNum()));
@@ -576,4 +586,57 @@ public class FsUserServiceImpl implements IFsUserService
         list.add(new FsUserGraphicStatisticsVO("答题红包数", userStatistics.getRedPacketNum(), userStatistics.getRedPacketNum()));
         return list;
     }
+
+    @Override
+    public List<FsCourseAnalysisVO> courseAnalysis(CourseAnalysisParam param) {
+        //1、查询课程视频信息
+        UserCourseVideoPageParam userCourseVideoPageParam = new UserCourseVideoPageParam();
+        BeanUtils.copyProperties(param, userCourseVideoPageParam);
+        List<FsUserCourseVideoPageListVO> videoList = userCourseVideoMapper.selectFsUserCourseVideoPageList(userCourseVideoPageParam);
+
+        //2、查询统计
+        List<FsCourseAnalysisCountVO> courseCountList = fsUserMapper.courseAnalysisCourseCount(param);
+        List<FsCourseAnalysisCountVO> redPacketCountList = fsUserMapper.courseAnalysisRedPacketCount(param);
+        List<FsCourseAnalysisCountVO> answerCountList = fsUserMapper.courseAnalysisAnswerCount(param);
+
+        //3、转化为map
+        Map<Long, FsCourseAnalysisCountVO> courseMap = courseCountList.stream()
+                .collect(Collectors.toMap(
+                        FsCourseAnalysisCountVO::getVideoId,
+                        Function.identity()
+                ));
+        Map<Long, FsCourseAnalysisCountVO> redPacketMap = redPacketCountList.stream()
+                .collect(Collectors.toMap(
+                        FsCourseAnalysisCountVO::getVideoId,
+                        Function.identity()
+                ));
+        Map<Long, FsCourseAnalysisCountVO> answerMap = answerCountList.stream()
+                .collect(Collectors.toMap(
+                        FsCourseAnalysisCountVO::getVideoId,
+                        Function.identity()
+                ));
+
+        //4、处理数据
+        return videoList.stream().map(v -> {
+            FsCourseAnalysisVO fsCourseAnalysisVO = new FsCourseAnalysisVO();
+            BeanUtils.copyProperties(v, fsCourseAnalysisVO);
+            FsCourseAnalysisCountVO countVO = new FsCourseAnalysisCountVO();
+            fsCourseAnalysisVO.setCountVO(courseMap.getOrDefault(v.getVideoId(), countVO));
+
+            fsCourseAnalysisVO.setCountVO(redPacketMap.getOrDefault(v.getVideoId(), countVO));
+            fsCourseAnalysisVO.setCountVO(answerMap.getOrDefault(v.getVideoId(), countVO));
+            return fsCourseAnalysisVO;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public CompanyUserSummaryCountVO companyUserSummaryCount(Long userId, String companyUserId) {
+        CompanyUserSummaryCountVO companyUserCount = fsUserMapper.companyUserCount(companyUserId);
+        CompanyUserSummaryCountVO newUserRedPacketCount = fsUserMapper.newUserRedPacketCount(companyUserId);
+        CompanyUserSummaryCountVO vo = new CompanyUserSummaryCountVO();
+        BeanUtils.copyProperties(companyUserCount, vo);
+        vo.setUserRedPacketNum(newUserRedPacketCount.getUserRedPacketNum());
+        vo.setTodayUserRedPacketAmount(newUserRedPacketCount.getTodayUserRedPacketAmount());
+        return vo;
+    }
 }

+ 26 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/CompanyUserSummaryCountVO.java

@@ -0,0 +1,26 @@
+package com.fs.store.vo.h5;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+/**
+ *
+ */
+@Data
+@ApiModel
+public class CompanyUserSummaryCountVO {
+
+    @ApiModelProperty(value = "会员总数")
+    private int userTotal;
+
+    @ApiModelProperty(value = "今日新增会员")
+    private int todayNewUser;
+
+    @ApiModelProperty(value = "会员红包数")
+    private int userRedPacketNum;
+
+    @ApiModelProperty(value = "新会员红包金额")
+    private int todayUserRedPacketAmount;
+
+
+}

+ 162 - 2
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -668,6 +668,14 @@
                     <if test="videoId != null and videoId != ''">
                         AND fcv.video_id = #{videoId}
                     </if>
+                    <if test="videoId != null and videoId != ''">
+                        AND fcv.video_id = #{videoId}
+                    </if>
+                    -- 单独通过销售id查询
+                    <if test="companyUserId != null and companyUserId != ''">
+                        AND company_user.user_id = #{companyUserId}
+                    </if>
+
             ) as courseWatchNum,
             (
                 SELECT
@@ -692,6 +700,10 @@
                     <if test="videoId != null and videoId != ''">
                         AND fcv.video_id = #{videoId}
                     </if>
+                    -- 单独通过销售id查询
+                    <if test="companyUserId != null and companyUserId != ''">
+                        AND company_user.user_id = #{companyUserId}
+                    </if>
             ) as courseCompleteNum
     </select>
 
@@ -718,6 +730,10 @@
         <if test="videoId != null and videoId != ''">
             AND fs_course_answer_logs.video_id = #{videoId}
         </if>
+        -- 单独通过销售id查询
+        <if test="companyUserId != null and companyUserId != ''">
+            AND company_user.user_id = #{companyUserId}
+        </if>
         ) AS answerNum,
         (
         SELECT
@@ -741,6 +757,10 @@
         <if test="videoId != null and videoId != ''">
             AND fs_course_answer_logs.video_id = #{videoId}
         </if>
+        -- 单独通过销售id查询
+        <if test="companyUserId != null and companyUserId != ''">
+            AND company_user.user_id = #{companyUserId}
+        </if>
         ) AS answerRightNum
     </select>
 
@@ -767,6 +787,10 @@
                 <if test="videoId != null and videoId != ''">
                     AND flog.video_id = #{videoId}
                 </if>
+                -- 单独通过销售id查询
+                <if test="companyUserId != null and companyUserId != ''">
+                    AND company_user.user_id = #{companyUserId}
+                </if>
         ) AS redPacketNum,
         (
             SELECT
@@ -789,22 +813,34 @@
                 <if test="videoId != null and videoId != ''">
                     AND flog.video_id = #{videoId}
                 </if>
+                -- 单独通过销售id查询
+                <if test="companyUserId != null and companyUserId != ''">
+                    AND company_user.user_id = #{companyUserId}
+                </if>
         ) AS redPacketAmount
     </select>
 
     <select id="countCourseDetails" resultType="Map">
     select (SELECT count(DISTINCT fc.course_id)
             FROM fs_user_course fc
+            LEFT JOIN fs_user_course_count fcc ON fcc.course_id = fc.course_id
+            LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
             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>
+            -- 单独通过销售id查询
+            <if test="companyUserId != null and companyUserId != ''">
+                AND fs_user.company_user_id = #{companyUserId}
+            </if>
             ) as courseNum,
 
            (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
+            LEFT JOIN fs_user_course fc ON fc.course_id = fcv.course_id
+            LEFT JOIN fs_user_course_count fcc ON fcc.course_id = fc.course_id
+            LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
             WHERE fc.is_del = 0
             AND FIND_IN_SET(#{companyId}, fc.company_ids)
             <if test="courseId != null and courseId != ''">
@@ -813,14 +849,23 @@
             <if test="videoId != null and videoId != ''">
                 AND fcv.video_id = #{videoId}
             </if>
+            -- 单独通过销售id查询
+            <if test="companyUserId != null and companyUserId != ''">
+                AND fs_user.company_user_id = #{companyUserId}
+            </if>
             ) as videoNum,
-        ( SELECT count(DISTINCT user_id ) FROM fs_user_course_count fcc
+        ( SELECT count(DISTINCT fs_user.user_id ) FROM fs_user_course_count fcc
             LEFT JOIN fs_user_course_video fcv ON fcv.course_id = fcc.course_id
+            LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
         <if test="courseId != null and courseId != ''">
             AND fcc.course_id =  #{courseId}
         </if>
         <if test="videoId != null and videoId != ''">
             AND fcv.video_id = #{videoId}
+        </if>
+        -- 单独通过销售id查询
+        <if test="companyUserId != null and companyUserId != ''">
+            AND fs_user.company_user_id = #{companyUserId}
         </if>
          ) as courseUserNum
     </select>
@@ -996,4 +1041,119 @@
         LIMIT 20
     </select>
 
+    <!--  查询某用户的课程视频,看课统计  -->
+    <select id="courseAnalysisCourseCount" resultType="FsCourseAnalysisCountVO">
+        SELECT
+        count( DISTINCT fcc.user_id ) as courseWatchNum,
+        COUNT( DISTINCT CASE WHEN fcc.complete_watch_count > 0 THEN fcc.user_id END ) as courseCompleteNum,
+        ifnull(
+        ROUND(
+        (
+        COUNT( DISTINCT CASE WHEN fcc.complete_watch_count > 0 THEN fcc.user_id END ) / count( DISTINCT fcc.user_id )) * 100,
+        2
+        ),
+        0
+        ) as completeRate,
+        fcv.video_id
+        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 = #{companyUserId}
+          and fcv.is_del = 0
+        <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
+    </select>
+
+    <!--  查询某用户的课程视频,红包统计  -->
+    <select id="courseAnalysisRedPacketCount" resultType="FsCourseAnalysisCountVO">
+        SELECT
+        count( flog.log_id ) as redPacketNum,
+        ifnull ( sum( flog.amount ), 0 ) as redPacketAmount,
+        flog.video_id
+        FROM
+        fs_course_red_packet_log flog
+        LEFT JOIN fs_user ON fs_user.user_id = flog.user_id
+        LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
+        WHERE
+        company_user.user_id = #{companyUserId}
+        <if test="courseId != null and courseId != ''">
+            AND flog.course_id =  #{courseId}
+        </if>
+        <if test="videoId != null and videoId != ''">
+            AND flog.video_id = #{videoId}
+        </if>
+        GROUP BY
+        flog.video_id
+    </select>
+
+    <!--  查询某用户的课程视频,答题统计  -->
+    <select id="courseAnalysisAnswerCount" resultType="FsCourseAnalysisCountVO">
+        SELECT
+        count( DISTINCT fs_user.user_id ) as answerNum,
+        COUNT( DISTINCT CASE WHEN fs_course_answer_logs.is_right = 1 THEN fs_user.user_id END ) as answerRightNum,
+        ifnull(
+        ROUND(
+        (
+        COUNT( DISTINCT CASE WHEN fs_course_answer_logs.is_right = 1 THEN fs_user.user_id END ) / count( DISTINCT fs_user.user_id )) * 100,
+        2
+        ),
+        0
+        ) as answerRightRate,
+        fs_course_answer_logs.video_id
+        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
+        WHERE
+        company_user.user_id = #{companyUserId}
+        <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
+    </select>
+
+    <select id="companyUserCount" resultType="CompanyUserSummaryCountVO">
+        SELECT
+            (
+                SELECT count( fs_user.user_id ) FROM fs_user LEFT JOIN company_user ON fs_user.company_user_id = company_user.user_id
+                WHERE company_user.user_id = #{companyUserId}
+            ) AS userTotal,
+            (
+                SELECT
+                    count( fs_user.user_id )
+                FROM
+                    fs_user
+                        LEFT JOIN company_user ON fs_user.company_user_id = company_user.user_id
+                WHERE
+                    company_user.user_id = #{companyUserId}
+                  AND to_days( fs_user.create_time ) = to_days(
+                        now())
+            ) AS todayNewUser
+    </select>
+
+    <select id="newUserRedPacketCount" resultType="CompanyUserSummaryCountVO">
+        SELECT
+            count(flog.log_id) as userRedPacketNum,
+            ifnull ( sum(case when to_days( fs_user.create_time ) = to_days(now()) THEN IFNULL(flog.amount,0) END), 0) as todayUserRedPacketAmount
+        FROM
+            fs_course_red_packet_log flog
+                LEFT JOIN fs_user ON fs_user.user_id = flog.user_id
+        WHERE
+            fs_user.company_user_id = #{companyUserId}
+    </select>
+
+
 </mapper>