yangdamao 3 rokov pred
rodič
commit
0af7197bd3

+ 37 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -1,11 +1,19 @@
 package com.zhongzheng.controller.course;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Arrays;
+import java.util.stream.Collectors;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.goods.vo.ExportLiveGoodsVo;
+import com.zhongzheng.modules.order.vo.OrderGoodsLiveExportVo;
+import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.user.service.IUserStudyRecordService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -110,6 +118,20 @@ public class CourseController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 课程统计报表导出
+     */
+    @ApiOperation("课程统计报表导出")
+    @GetMapping("/statement/export")
+    public AjaxResult<CourseStatementVo> exportCourseStatement(CourseStatementBo bo) {
+        List<CourseStatementVo> list = iUserStudyRecordService.getCourseStatement(bo);
+        if (CollectionUtils.isNotEmpty(list)){
+            list = list.stream().map(item -> CourseStatementVo.createExportVo(item)).collect(Collectors.toList());
+        }
+        ExcelUtil<CourseStatementVo> util = new ExcelUtil<>(CourseStatementVo.class);
+        return util.exportExcel(list,"课程学习统计");
+    }
+
     /**
      * 课程详情统计
      */
@@ -121,6 +143,21 @@ public class CourseController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 课程详情统计导出
+     */
+    @ApiOperation("课程详情统计导出")
+    @GetMapping("/detail/statistics/export")
+    public AjaxResult<CourseSectionDetailVo> exportCourseDetailStatistics(CourseSectionDetailBo bo) {
+        List<CourseSectionDetailVo> list = iUserStudyRecordService.getCourseDetailStatistics(bo);
+        if (CollectionUtils.isNotEmpty(list)){
+            list.forEach(item -> {
+                item.setPurchaseStatusStr(ObjectUtils.isNotNull(item.getPurchaseStatus()) && item.getPurchaseStatus() == 1?"已开课":"未开课");
+            });
+        }
+        ExcelUtil<CourseSectionDetailVo> util = new ExcelUtil<>(CourseSectionDetailVo.class);
+        return util.exportExcel(list,"课程学员学习统计");
+    }
 
     /**
      * 学员观看记录

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

@@ -40,4 +40,7 @@ public class CheckSectionWatchVo implements Serializable {
 
     @ApiModelProperty("是否购买课程:1是 0否")
     private Integer buyCourse;
+
+    @ApiModelProperty("商品状态:1上架 0未上架")
+    private Integer goodsStatus;
 }

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

@@ -1,5 +1,6 @@
 package com.zhongzheng.modules.course.bo;
 
+import com.zhongzheng.common.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -18,24 +19,33 @@ public class CourseSectionDetailVo implements Serializable {
     private Long userId;
 
     @ApiModelProperty("学员名称")
+    @Excel(name = "学员名称")
     private String userName;
 
     @ApiModelProperty("学员身份证")
+    @Excel(name = "学员身份证")
     private String idCard;
 
     @ApiModelProperty("学员电话")
+    @Excel(name = "学员电话")
     private String phone;
 
     @ApiModelProperty("开课状态:1已开课 0未开课")
     private Integer purchaseStatus;
 
+    @Excel(name = "开课状态")
+    private String purchaseStatusStr;
+
     @ApiModelProperty("直播累计时间")
+    @Excel(name = "直播累计时间(秒)")
     private Long liveDuration;
 
     @ApiModelProperty("观看直播累计时间")
+    @Excel(name = "观看直播累计时间(秒)")
     private Long watchLiveDuration;
 
     @ApiModelProperty("观看次数")
+    @Excel(name = "观看次数")
     private Integer watchNumber;
 
 }

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

@@ -1,10 +1,16 @@
 package com.zhongzheng.modules.course.bo;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.zhongzheng.common.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.logging.SimpleFormatter;
 
 /**
  * @author yangdamao
@@ -27,6 +33,7 @@ public class CourseStatementVo implements Serializable {
     private String liveUrl;
 
     @ApiModelProperty("课程节名称")
+    @Excel(name = "课程名称")
     private String sectionName;
 
     @ApiModelProperty("直播开始时间")
@@ -36,21 +43,61 @@ public class CourseStatementVo implements Serializable {
     private Long liveEndTime;
 
     @ApiModelProperty("观看人数")
+    @Excel(name = "观看人数")
     private Integer watchNumber;
 
     @ApiModelProperty("开通课程人数")
+    @Excel(name = "开通课程人数")
     private Integer buyCourseNumber;
 
     @ApiModelProperty("未通课程人数")
+    @Excel(name = "未通课程人数")
     private Integer unBuyCourseNumber;
 
     @ApiModelProperty("小程序观看人数")
+    @Excel(name = "小程序观看人数")
     private Integer appWatchNumber;
 
     @ApiModelProperty("后台观看人数")
+    @Excel(name = "后台观看人数")
     private Integer adminWatchNumber;
 
     @ApiModelProperty("频道的观看页状态,取值为:live(直播中)、end(直播结束)、playback(回放中)、waiting(等待直播)")
     private String watchStatus;
 
+    @Excel(name = "直播开始时间")
+    private String liveStartTimeStr;
+
+    @Excel(name = "直播结束时间")
+    private String liveEndTimeStr;
+
+    @Excel(name = "课程状态")
+    private String watchStatusStr;
+
+    public static CourseStatementVo createExportVo(CourseStatementVo vo){
+        if (ObjectUtils.isNull(vo)){
+            return new CourseStatementVo();
+        }
+        SimpleDateFormat sfl = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date statusDate = new Date(vo.getLiveStartTime());
+        Date endDate = new Date(vo.getLiveEndTime());
+        vo.setLiveStartTimeStr(ObjectUtils.isNotNull(vo.getLiveStartTime())?sfl.format(statusDate):"");
+        vo.setLiveEndTimeStr(ObjectUtils.isNotNull(vo.getLiveEndTime())?sfl.format(endDate):"");
+        if (StringUtils.isNotBlank(vo.getWatchStatus())){
+            switch (vo.getWatchStatus()){
+                case "live":vo.setWatchStatusStr("直播中");
+                    break;
+                case "end":vo.setWatchStatusStr("直播结束");
+                    break;
+                case "playback":vo.setWatchStatusStr("回放中");
+                    break;
+                case "waiting":vo.setWatchStatusStr("等待直播");
+                    break;
+                default: vo.setWatchStatusStr("");
+                    break;
+            }
+        }
+        return vo;
+    }
+
 }

+ 10 - 9
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionWatchPerServiceImpl.java

@@ -95,18 +95,19 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
     @Override
     public CheckSectionWatchVo checkSectionWatchPer(SectionWatchQueryBo bo) {
         //校验商品有效期
-//        Goods goods = goodsService.getById(bo.getGoodsId());
-//        if (ObjectUtils.isNotNull(goods.getValidityStartTime()) && ObjectUtils.isNotNull(goods.getValidityEndTime())){
-//            Long validityStartTime = goods.getValidityStartTime();
-//            Long validityEndTime = goods.getValidityEndTime();
-//            if (System.currentTimeMillis() < validityStartTime || System.currentTimeMillis() > validityEndTime){
-//                throw new CustomException("该商品不在有效期");
-//            }
-//        }
+        Goods goods = goodsService.getById(bo.getGoodsId());
+        if (ObjectUtils.isNotNull(goods.getValidityStartTime()) && ObjectUtils.isNotNull(goods.getValidityEndTime())){
+            Long validityStartTime = goods.getValidityStartTime();
+            Long validityEndTime = goods.getValidityEndTime();
+            if (System.currentTimeMillis() < validityStartTime || System.currentTimeMillis() > validityEndTime){
+                throw new CustomException("该商品不在有效期");
+            }
+        }
         CheckSectionWatchVo watchVo = new CheckSectionWatchVo();
         watchVo.setGoodsId(bo.getGoodsId());
         watchVo.setCourseId(bo.getCourseId());
         watchVo.setSectionId(bo.getSectionId());
+        watchVo.setGoodsStatus(goods.getGoodsStatus());
         //获取观看权限
         CourseSectionWatchPer watchPer = getOne(new LambdaQueryWrapper<CourseSectionWatchPer>()
                 .eq(CourseSectionWatchPer::getCourseId, bo.getCourseId())
@@ -118,7 +119,7 @@ public class CourseSectionWatchPerServiceImpl extends ServiceImpl<CourseSectionW
             //获取购买该商品的userId
             List<Long> userIds = baseMapper.getUserIdByGoods(bo);
             if (CollectionUtils.isEmpty(userIds) || !userIds.contains(bo.getUserId())){
-                throw new CustomException("该学员没有观看权限");
+                throw new CustomException("您还没有开通直播课程,无法观看!");
             }
             watchVo.setBuyCourse(1);
         }

+ 1 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseLiveVo.java

@@ -94,7 +94,7 @@ public class CourseLiveVo implements Serializable {
     private Long orderId;
 
     @ApiModelProperty("订单商品关联ID")
-    private Long orderGoodId;
+    private Long orderGoodsId;
 
     @ApiModelProperty("章ID")
     private Long chapterId;

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

@@ -732,6 +732,9 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
             if (list.stream().anyMatch(x -> x.getBuyCourse() == 1)){
                 //已开课
                 item.setPurchaseStatus(1);
+            }else {
+                //未开课
+                item.setPurchaseStatus(0);
             }
             Long sum = list.stream().filter(x -> ObjectUtils.isNotNull(x.getStudyDuration())).mapToLong(UserStudyRecord::getStudyDuration).sum();
             item.setWatchLiveDuration(sum);
@@ -765,7 +768,7 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
             vo.setWatchLiveDuration(sum);
             result.add(vo);
         });
-        return result;
+        return result.stream().sorted(Comparator.comparing(UserWatchStatisticsVo::getStartTime).reversed()).collect(Collectors.toList());
     }
 
 

+ 3 - 3
zhongzheng-system/src/main/resources/mapper/modules/order/OrderGoodsMapper.xml

@@ -528,7 +528,7 @@
             (
                 SELECT
                     gc.course_id AS courseId,
-                    og.order_goods_id AS orderGoodId,
+                    og.order_goods_id AS orderGoodsId,
                     g.goods_id AS goodId,
                     cm.menu_id AS chapterId,
                     '' AS moduleId,
@@ -553,7 +553,7 @@
 		          AND ct.section_type = 2 UNION ALL
                 SELECT
                     gc.course_id AS courseId,
-                    og.order_goods_id AS orderGoodId,
+                    og.order_goods_id AS orderGoodsId,
                     g.goods_id AS goodId,
                     '' AS chapterId,
                     '' AS moduleId,
@@ -577,7 +577,7 @@
                   AND ct.section_type = 2 UNION ALL
                 SELECT
                     gc.course_id AS courseId,
-                    og.order_goods_id AS orderGoodId,
+                    og.order_goods_id AS orderGoodsId,
                     g.goods_id AS goodId,
                     cmc.chapter_id AS chapterId,
                     cmc.module_id AS moduleId,