Forráskód Böngészése

提交:直播学习记录统计接口

yangdamao 3 éve
szülő
commit
3aa008baef
15 módosított fájl, 402 hozzáadás és 15 törlés
  1. 24 3
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java
  2. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CheckSectionWatchVo.java
  3. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionDetailBo.java
  4. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionDetailVo.java
  5. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseStatementBo.java
  6. 59 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseStatementVo.java
  7. 2 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java
  8. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionWatchPerServiceImpl.java
  9. 2 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  10. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyRecordAddBo.java
  11. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyRecord.java
  12. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java
  13. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java
  14. 132 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  15. 30 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

+ 24 - 3
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -3,11 +3,10 @@ package com.zhongzheng.controller.course;
 import java.util.List;
 import java.util.Arrays;
 
-import com.zhongzheng.modules.course.bo.CourseAddBo;
-import com.zhongzheng.modules.course.bo.CourseEditBo;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.user.service.IUserStudyRecordService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +40,7 @@ import io.swagger.annotations.ApiOperation;
 public class CourseController extends BaseController {
 
     private final ICourseService iCourseService;
+    private final IUserStudyRecordService iUserStudyRecordService;
 
     /**
      * 查询课程列表
@@ -99,6 +99,27 @@ public class CourseController extends BaseController {
         return toAjax(iCourseService.updateByEditBo(bo) ? 1 : 0);
     }
 
+    /**
+     * 课程统计报表
+     */
+    @ApiOperation("课程统计报表")
+    @GetMapping("/statement")
+    public TableDataInfo<CourseStatementVo> getCourseStatement(CourseStatementBo bo) {
+        TableDataInfo<CourseStatementVo> list = iUserStudyRecordService.getCourseStatement(bo);
+        return list;
+    }
+
+    /**
+     * 课程详情统计
+     */
+    @ApiOperation("课程详情统计")
+    @GetMapping("/detail/statistics")
+    public TableDataInfo<CourseSectionDetailVo> getCourseDetailStatistics(CourseSectionDetailBo bo) {
+        startPage();
+        List<CourseSectionDetailVo> list = iUserStudyRecordService.getCourseDetailStatistics(bo);
+        return getDataTable(list);
+    }
+
     /**
      * 删除课程
      */

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CheckSectionWatchVo.java

@@ -34,4 +34,7 @@ public class CheckSectionWatchVo implements Serializable {
 
     @ApiModelProperty("用户ID")
     private Long userId;
+
+    @ApiModelProperty("是否购买课程:1是 0否")
+    private Integer buyCourse;
 }

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionDetailBo.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年08月17日 17:16
+ */
+@Data
+@ApiModel("课程节详情统计BO")
+public class CourseSectionDetailBo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+
+    @ApiModelProperty("课程节ID")
+    private Long sectionId;
+
+    @ApiModelProperty("学员名称")
+    private String userName;
+
+    @ApiModelProperty("学员身份证")
+    private String idCard;
+
+    @ApiModelProperty("学员电话")
+    private String phone;
+
+    @ApiModelProperty("开课状态:1是,0否 ")
+    private Integer purchaseStatus;
+
+}

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseSectionDetailVo.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年08月17日 17:16
+ */
+@Data
+@ApiModel("课程节详情统计Vo")
+public class CourseSectionDetailVo implements Serializable {
+
+    @ApiModelProperty("学员ID")
+    private Long userId;
+
+    @ApiModelProperty("学员名称")
+    private String userName;
+
+    @ApiModelProperty("学员身份证")
+    private String idCard;
+
+    @ApiModelProperty("学员电话")
+    private String phone;
+
+    @ApiModelProperty("开课状态:1已开课 0未开课")
+    private Integer purchaseStatus;
+
+    @ApiModelProperty("直播累计时间")
+    private Long liveDuration;
+
+    @ApiModelProperty("观看直播累计时间")
+    private Long watchLiveDuration;
+
+    @ApiModelProperty("观看次数")
+    private Integer watchNumber;
+
+}

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseStatementBo.java

@@ -0,0 +1,29 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年08月17日 15:41
+ */
+@Data
+@ApiModel("课程统计报表BO")
+public class CourseStatementBo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("课程节名称")
+    private String sectionName;
+
+    @ApiModelProperty("起始页")
+    private Integer pageNum;
+
+    @ApiModelProperty("每页显示的条数")
+    private Integer pageSize;
+
+}

+ 59 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/CourseStatementVo.java

@@ -0,0 +1,59 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2022年08月17日 15:41
+ */
+@Data
+@ApiModel("课程统计报表BO")
+public class CourseStatementVo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+
+    @ApiModelProperty("课程节ID")
+    private Long sectionId;
+
+    @ApiModelProperty("直播流地址")
+    private String liveUrl;
+
+    @ApiModelProperty("课程节名称")
+    private String sectionName;
+
+    @ApiModelProperty("课程节状态")
+    private Long sectionStatus;
+
+    @ApiModelProperty("直播开始时间")
+    private Long liveStartTime;
+
+    @ApiModelProperty("直播结束时间")
+    private Long liveEndTime;
+
+    @ApiModelProperty("观看人数")
+    private Integer watchNumber;
+
+    @ApiModelProperty("开通课程人数")
+    private Integer buyCourseNumber;
+
+    @ApiModelProperty("未通课程人数")
+    private Integer unBuyCourseNumber;
+
+    @ApiModelProperty("小程序观看人数")
+    private Integer appWatchNumber;
+
+    @ApiModelProperty("后台观看人数")
+    private Integer adminWatchNumber;
+
+    @ApiModelProperty("频道的观看页状态,取值为:live(直播中)、end(直播结束)、playback(回放中)、waiting(等待直播)")
+    private String watchStatus;
+
+}

+ 2 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/ICourseService.java

@@ -2,10 +2,8 @@ package com.zhongzheng.modules.course.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhongzheng.modules.course.bo.CourseAddBo;
-import com.zhongzheng.modules.course.bo.CourseEditBo;
-import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.Course;
 import com.zhongzheng.modules.course.vo.CourseUserVo;
 import com.zhongzheng.modules.course.vo.CourseVo;

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionWatchPerServiceImpl.java

@@ -104,6 +104,7 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
             if (CollectionUtils.isEmpty(userIds) || !userIds.contains(bo.getUserId())){
                 throw new CustomException("该学员没有观看权限");
             }
+            watchVo.setBuyCourse(1);
         }
         //所有人可以看或者有权限的学员
         List<CheckSectionWatchVo> vos = baseMapper.getCourseLevel(bo);
@@ -115,6 +116,7 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
         //查询商品订单ID
         Long orderGoodsId = baseMapper.getOrderGoodsIdByUser(bo);
         watchVo.setOrderGoodsId(orderGoodsId);
+        watchVo.setBuyCourse(0);
         return watchVo;
     }
 }

+ 2 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java

@@ -5,15 +5,13 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.bank.domain.ExamQuestion;
 import com.zhongzheng.modules.bank.domain.Question;
-import com.zhongzheng.modules.course.bo.CourseAddBo;
-import com.zhongzheng.modules.course.bo.CourseEditBo;
-import com.zhongzheng.modules.course.bo.CourseMenuQueryBo;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.Course;
 import com.zhongzheng.modules.course.domain.CourseBusiness;
 import com.zhongzheng.modules.course.domain.CoursePhotoLog;

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyRecordAddBo.java

@@ -79,4 +79,11 @@ public class UserStudyRecordAddBo {
     /**  来源平台 1小程序 2网站 */
     @ApiModelProperty(" 来源平台 1小程序 2网站")
     private String fromPlat;
+
+    @ApiModelProperty(" 是否购买课程:1是,0否")
+    private Integer buyCourse;
+    @ApiModelProperty(" 是否开始观看:1是,0否")
+    private Integer firstEntry;
+    @ApiModelProperty(" 节类型 1录播 2直播 3回放")
+    private Integer sectionType;
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyRecord.java

@@ -70,4 +70,11 @@ private static final long serialVersionUID=1L;
     private String photo;
     /**  来源平台 1小程序 2网站 */
     private String fromPlat;
+
+    /**  是否购买课程:1是,0否  */
+    private Integer buyCourse;
+    /**  是否开始观看:1是,0否 */
+    private Integer firstEntry;
+    /**  节类型 1录播 2直播 3回放 */
+    private Integer sectionType;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyRecordMapper.java

@@ -1,6 +1,8 @@
 package com.zhongzheng.modules.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.course.bo.CourseSectionDetailBo;
+import com.zhongzheng.modules.course.bo.CourseSectionDetailVo;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
 import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
 import com.zhongzheng.modules.grade.vo.UserPeriodStatusVo;
@@ -90,4 +92,6 @@ public interface UserStudyRecordMapper extends BaseMapper<UserStudyRecord> {
     List<SectionStudyRecordVo> selectSectionRecord(UserStudyRecordQueryBo bo);
 
     SectionStudyRecordVo getUserWatchLast(UserStudyRecordQueryBo bo);
+
+    List<CourseSectionDetailVo> getUserByRecord(CourseSectionDetailBo bo);
 }

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java

@@ -1,6 +1,11 @@
 package com.zhongzheng.modules.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.course.bo.CourseSectionDetailBo;
+import com.zhongzheng.modules.course.bo.CourseSectionDetailVo;
+import com.zhongzheng.modules.course.bo.CourseStatementBo;
+import com.zhongzheng.modules.course.bo.CourseStatementVo;
 import com.zhongzheng.modules.grade.bo.ClassGradeUserQueryBo;
 import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
 import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
@@ -104,4 +109,21 @@ public interface IUserStudyRecordService extends IService<UserStudyRecord> {
 	List<LiveListChannelViewlogResponse.LiveChannelViewlog> userSectionLiveLog(UserStudyRecordQueryBo bo) throws IOException, NoSuchAlgorithmException;
 
 	SectionStudyRecordVo getUserWatchLast(UserStudyRecordQueryBo bo);
+	/**
+	 * 课程统计报表
+	 * @author change
+	 * @date 2022/8/17 15:59
+	 * @param bo
+	 * @return java.util.List<com.zhongzheng.modules.course.bo.CourseStatementVo>
+	 */
+	TableDataInfo<CourseStatementVo> getCourseStatement(CourseStatementBo bo);
+
+	/**
+	 * 课程详情统计
+	 * @author change
+	 * @date 2022/8/17 17:32
+	 * @param bo
+	 * @return java.util.List<com.zhongzheng.modules.course.bo.CourseSectionDetailVo>
+	 */
+	List<CourseSectionDetailVo> getCourseDetailStatistics(CourseSectionDetailBo bo);
 }

+ 132 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -6,15 +6,19 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.microsoft.schemas.office.visio.x2012.main.SectionType;
+import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.modules.bank.domain.Exam;
-import com.zhongzheng.modules.course.bo.CourseQueryBo;
+import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.domain.CoursePhotoLog;
+import com.zhongzheng.modules.course.domain.CourseSection;
 import com.zhongzheng.modules.course.service.ICourseChapterSectionService;
 import com.zhongzheng.modules.course.service.ICoursePhotoLogService;
 import com.zhongzheng.modules.course.service.ICourseSectionService;
@@ -132,6 +136,8 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
     private IUserBankRecordService iUserBankRecordService;
     @Autowired
     private IUserExamGoodsService iUserExamGoodsService;
+    @Autowired
+    private IPolyvLiveService ployvLiveService;
 
     @Autowired
     private  RedisCache redisCache;
@@ -295,9 +301,10 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer insertByAddBo(UserStudyRecordAddBo bo) {
-        if(Validator.isEmpty(bo.getOrderGoodsId())){
-            throw new CustomException("订单商品ID缺失");
-        }
+//        if(Validator.isEmpty(bo.getOrderGoodsId())){
+//            throw new CustomException("订单商品ID缺失");
+//        }
+
         String key = "STUDY_Record_"+bo.getUserId();
         Long value = redisCache.getCacheObject(key);
         if(value!=null&&(Validator.isEmpty(bo.getStatus())||bo.getStatus()!=1)){
@@ -330,7 +337,16 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         }else{
             add.setFirstStartTime(add.getStartTime());
         }
+        add.setBuyCourse(bo.getBuyCourse());
+        //获取节类型
+        CourseSection section = iCourseSectionService.getById(bo.getSectionId());
+        add.setSectionType(section.getSectionType());
+        add.setFirstEntry(ObjectUtils.isNull(bo.getFirstEntry())?0:bo.getFirstEntry());
         this.save(add);
+        if (ObjectUtils.isNull(bo.getOrderGoodsId())){
+            //没有购买商品,通过分享观看
+            return 0;
+        }
 /*        if(courseSectionVo.getSectionType()==1||courseSectionVo.getSectionType()==2||courseSectionVo.getSectionType()==3){
             UserStudyRecordQueryBo queryBo = BeanUtil.toBean(bo, UserStudyRecordQueryBo.class);
 *//*            queryBo.setUserId(bo.getUserId());
@@ -622,7 +638,119 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         return false;
     }
 
+    @Override
+    public TableDataInfo<CourseStatementVo> getCourseStatement(CourseStatementBo bo) {
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<UserStudyRecord> page =
+                page(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<UserStudyRecord>(bo.getPageNum(), bo.getPageSize()),
+                new LambdaQueryWrapper<UserStudyRecord>()
+                        .eq(UserStudyRecord::getGoodsId, bo.getGoodsId())
+                        .groupBy(UserStudyRecord::getSectionId));
+        if (CollectionUtils.isEmpty(page.getRecords())){
+            return new TableDataInfo<>();
+        }
+        List<CourseStatementVo> statementVos = page.getRecords().stream().map(item -> {
+            CourseStatementVo vo = new CourseStatementVo();
+            //课程节信息
+            CourseSection section = iCourseSectionService.getById(item.getSectionId());
+            if (ObjectUtils.isNotNull(section)) {
+                vo.setSectionName(section.getName());
+                vo.setLiveStartTime(section.getLiveStartTime());
+                vo.setLiveEndTime(section.getLiveEndTime());
+                vo.setLiveUrl(section.getLiveUrl());
+            }
+            //统计观看人数
+            List<UserStudyRecord> recordList = list(new LambdaQueryWrapper<UserStudyRecord>()
+                    .eq(UserStudyRecord::getGoodsId, item.getGoodsId())
+                    .eq(UserStudyRecord::getSectionId, item.getSectionId()));
+            if (CollectionUtils.isNotEmpty(recordList)) {
+                Map<Long, List<UserStudyRecord>> map = recordList.stream().collect(Collectors.groupingBy(UserStudyRecord::getUserId));
+                vo.setWatchNumber(map.keySet().size());
+                Integer unBuyCourse = 0;
+                Integer buyCourse = 0;
+                for (UserStudyRecord record : recordList) {
+                    if (record.getBuyCourse() == 0) {
+                        //没有购买课程
+                        unBuyCourse++;
+                    } else {
+                        buyCourse++;
+                    }
+                }
+                vo.setBuyCourseNumber(buyCourse);
+                vo.setUnBuyCourseNumber(unBuyCourse);
+                Map<String, List<UserStudyRecord>> collect = recordList.stream().filter(x -> ObjectUtils.isNotNull(x.getFromPlat())).collect(Collectors.groupingBy(UserStudyRecord::getFromPlat));
+                if (CollectionUtils.isNotEmpty(collect)) {
+                    collect.forEach((k, v) -> {
+                        if (k.equals("1")) {
+                            //小程序
+                            vo.setAppWatchNumber(collect.get(k).size());
+                        } else {
+                            //PC
+                            vo.setAdminWatchNumber(collect.get(k).size());
+                        }
+                    });
+                }
+            }
+            return vo;
+        }).collect(Collectors.toList());
+        //查询保利威直播状态
+        Set<String> setUrl = statementVos.stream().map(CourseStatementVo::getLiveUrl).collect(Collectors.toSet());
+        List<LiveChannelBasicInfoResponse> result = setUrl.stream().map(url -> {
+            PolyvLiveQueryBo queryBo = new PolyvLiveQueryBo();
+            queryBo.setChannelId(url);
+            LiveChannelBasicInfoResponse response = new LiveChannelBasicInfoResponse();
+            try {
+                response = ployvLiveService.GetChannelBasicInfo(queryBo);
+            } catch (Exception e) {
+//                throw new CustomException("获取保利威直播状态失败");
+                response.setChannelId(url);
+                response.setWatchStatus("waiting");
+            }
+            return response;
+        }).collect(Collectors.toList());
+        statementVos.forEach(item -> {
+            for (LiveChannelBasicInfoResponse response : result) {
+                if (net.polyv.common.v1.util.StringUtils.isNotBlank(item.getLiveUrl()) && item.getLiveUrl().equals(response.getChannelId())){
+                    item.setWatchStatus(response.getWatchStatus());
+                }
+            }
+        });
+        TableDataInfo<CourseStatementVo> info = new TableDataInfo<CourseStatementVo>();
+        info.setRows(statementVos);
+        info.setTotal(page.getTotal());
+        return info;
+    }
 
+    @Override
+    public List<CourseSectionDetailVo> getCourseDetailStatistics(CourseSectionDetailBo bo) {
+        List<CourseSectionDetailVo> detailVos = baseMapper.getUserByRecord(bo);
+        if (CollectionUtils.isEmpty(detailVos)){
+            return new ArrayList<>();
+        }
+        //直播时长
+        CourseSection section = iCourseSectionService.getById(bo.getSectionId());
+        Long liveStartTime = 0L;
+        if (ObjectUtils.isNotNull(section)){
+             liveStartTime = section.getLiveEndTime() - section.getLiveStartTime();
+        }
+        //获取学员观看统计次数
+        for (CourseSectionDetailVo item : detailVos) {
+            List<UserStudyRecord> list = list(new LambdaQueryWrapper<UserStudyRecord>()
+                    .eq(UserStudyRecord::getUserId, item.getUserId())
+                    .eq(UserStudyRecord::getGoodsId, bo.getGoodsId())
+                    .eq(UserStudyRecord::getCourseId, bo.getCourseId())
+                    .eq(UserStudyRecord::getSectionId, bo.getSectionId()));
+            item.setLiveDuration(liveStartTime);
+            if (list.stream().anyMatch(x -> x.getBuyCourse() == 1)){
+                //已开课
+                item.setPurchaseStatus(1);
+            }
+            Long sum = list.stream().filter(x -> ObjectUtils.isNotNull(x.getStudyDuration())).mapToLong(UserStudyRecord::getStudyDuration).sum();
+            item.setWatchLiveDuration(sum);
+            Integer size = list.stream().filter(x -> ObjectUtils.isNotNull(x.getFirstEntry()) && x.getFirstEntry() == 1).collect(Collectors.toList()).size();
+            item.setWatchNumber(size);
+        }
+        return detailVos;
+    }
 
 
     /**

+ 30 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

@@ -1350,6 +1350,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             LIMIT 1
     </select>
 
+    <select id="getUserByRecord" parameterType="com.zhongzheng.modules.course.bo.CourseSectionDetailBo" resultType="com.zhongzheng.modules.course.bo.CourseSectionDetailVo">
+        SELECT
+            ur.user_id as userId,
+            u.realname as userName,
+            u.id_card as idCard,
+            u.telphone as phone
+        FROM
+            user_study_record ur
+                LEFT JOIN `user` u ON ur.user_id = u.user_id
+        WHERE
+            u.`status` = 1
+          AND ur.goods_id = #{goodsId}
+          AND ur.course_id = #{courseId}
+          AND ur.section_id = #{sectionId}
+        <if test="userName != null and userName !='' ">
+            AND u.realname  like concat('%', #{userName}, '%')
+        </if>
+        <if test="idCard != null and idCard !='' ">
+            AND u.id_card  like concat('%', #{idCard}, '%')
+        </if>
+        <if test="phone != null and phone !='' ">
+            AND u.telphone  like concat('%', #{phone}, '%')
+        </if>
+        <if test="purchaseStatus != null and purchaseStatus !='' ">
+            AND ur.buy_course = #{purchaseStatus}
+        </if>
+        GROUP BY
+            ur.user_id
+    </select>
+
     <select id="userSectionLiveList" parameterType="com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo" resultMap="SectionStudyRecordVoResult">
         SELECT
             r.*,