Bläddra i källkod

1.编写学习进度统计
2.课程去掉院系限制

honorfire 6 månader sedan
förälder
incheckning
8d61cb180c

+ 84 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/StatisticsLearningProgressController.java

@@ -0,0 +1,84 @@
+package vip.xiaonuo.disk.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.param.QuestionAnswerPageParam;
+import vip.xiaonuo.disk.service.StatisticsLearningProgressService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 统计-学习进度控制器
+ *
+ * @author honorfire
+ * @date  2025/06/18 14:16
+ */
+@Api(tags = "统计-学习进度控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class StatisticsLearningProgressController {
+
+    @Resource
+    private StatisticsLearningProgressService statisticsLearningProgressService;
+
+
+    /**
+     * 学习进度-顶部基本数据
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("学习进度-顶部基本数据")
+    @GetMapping("/disk/learningprogress/topFundamentalDetail")
+    public CommonResult<Map<String,Object>> topFundamentalDetail( HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        Map<String,Object> result=statisticsLearningProgressService.topFundamentalDetail(param);
+        return CommonResult.data(result);
+    }
+
+    /**
+     * 学习进度-访问人数趋势
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("学习进度-访问人数趋势")
+    @GetMapping("/disk/learningprogress/viewTendency")
+    public CommonResult<Map<String,Object>> viewTendency( HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        Map<String,Object> result=statisticsLearningProgressService.viewTendency(param);
+        return CommonResult.data(result);
+    }
+
+    /**
+     * 学习进度-学习明细数据
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("学习进度-学习明细数据")
+    @GetMapping("/disk/learningprogress/studyDetail")
+    public CommonResult<Page<Map<String,Object>>> studyDetail( HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
+        Page<Map<String,Object>> list=statisticsLearningProgressService.studyDetail(param);
+        return CommonResult.data(list);
+    }
+
+}

+ 41 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/StatisticsLearningProgressMapper.java

@@ -0,0 +1,41 @@
+package vip.xiaonuo.disk.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.disk.service.StatisticsLearningProgressService;
+
+import java.util.Map;
+
+public interface StatisticsLearningProgressMapper {
+
+    /**
+     * 课程信息-顶部基本数据-开课人数
+     */
+    String getCourseOpenStuNum(Map param);
+
+    /**
+     * 课程信息-顶部基本数据-课程访问次数
+     */
+    String getCourseViewNum(Map param);
+
+    /**
+     * 课程信息-顶部基本数据-作业测验提交数
+     */
+    String getPaperSubmitNum(Map param);
+
+    /**
+     * 课程信息-顶部基本数据-互动数
+     */
+    String getInteractionNum(Map param);
+
+    /**
+     * 课程信息-访问人数趋势
+     */
+    String getViewTendencyNum(Map param);
+
+    /**
+     * 学习进度-学习明细数据
+     */
+    Page<Map<String,Object>> studyDetail(@Param("param") Map param, @Param("page") Page<Object> page);
+}

+ 87 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/StatisticsLearningProgressMapper.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.disk.mapper.StatisticsLearningProgressMapper">
+
+    <select id="studyDetail" resultType="java.util.Map">
+        SELECT
+            ci.COURSE_ID AS courseId,
+            ci.COURSE_NAME AS courseName,
+            IFNULL(t1.openStuNum,0) AS openStuNum,
+            IFNULL(t2.viewCount,0) AS viewCount,
+            IFNULL(t3.stayTime,0) AS stayTime,
+            IFNULL(t4.teachMaterialsNum,0) AS teachMaterialsNum
+        FROM COURSE_INFO ci
+        LEFT JOIN (
+            SELECT
+            cop.COURSE_ID AS courseId,
+            count(DISTINCT stu.ID) AS openStuNum
+            FROM COURSE_OPEN cop
+            LEFT JOIN COURSE_INFO ci ON ci.COURSE_ID =cop.COURSE_ID AND ci.DELETE_FLAG='NOT_DELETE'
+            LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+            WHERE cop.DELETE_FLAG ='NOT_DELETE'
+            GROUP BY cop.COURSE_ID
+        )t1 ON ci.COURSE_ID =t1.courseId
+         LEFT JOIN (
+            SELECT
+            ci.COURSE_ID AS courseId,
+            sum(ci.VIEW_COUNT) AS viewCount
+            FROM COURSE_INFO ci
+            WHERE ci.DELETE_FLAG ='NOT_DELETE'
+            GROUP BY ci.COURSE_ID
+        )t2 ON ci.COURSE_ID =t2.courseId
+         LEFT JOIN (
+            SELECT
+            cc.COURSE_ID AS courseId,
+            sum(csb.STAY_TIME) AS stayTime
+            FROM COURSE_STUDENT_BURIALPOINT csb
+            LEFT JOIN COURSE_CLASSHOUR cch ON cch.ID=csb.HOUR_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON cc.ID=cch.CHAPTER_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+            WHERE csb.DELETE_FLAG ='NOT_DELETE'
+              AND csb.FUNC_TYPE='1'
+              AND csb.TYPE='1'
+            GROUP BY cc.COURSE_ID
+        )t3 ON ci.COURSE_ID =t3.courseId
+         LEFT JOIN (
+            SELECT
+            cc.COURSE_ID AS courseId,
+            count(csb.ID)AS teachMaterialsNum
+            FROM COURSE_STUDENT_BURIALPOINT csb
+            LEFT JOIN COURSE_CLASSHOUR cch ON cch.ID=csb.HOUR_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+            LEFT JOIN COURSE_CHAPTER cc ON cc.ID=cch.CHAPTER_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+            WHERE csb.DELETE_FLAG ='NOT_DELETE'
+              AND csb.FUNC_TYPE='2'
+              AND csb.TYPE='1'
+            GROUP BY cc.COURSE_ID
+        )t4 ON ci.COURSE_ID =t4.courseId
+    </select>
+
+    <select id="getCourseOpenStuNum" resultType="java.lang.String">
+        SELECT
+            count(DISTINCT stu.ID) AS num
+        FROM COURSE_OPEN cop
+        LEFT JOIN COURSE_INFO ci ON ci.COURSE_ID =cop.COURSE_ID AND ci.DELETE_FLAG='NOT_DELETE'
+        LEFT JOIN SYS_USER stu ON stu.GRADES_ID =cop.GRADES_ID AND stu.DELETE_FLAG='NOT_DELETE'
+        WHERE cop.DELETE_FLAG ='NOT_DELETE'
+    </select>
+    <select id="getCourseViewNum" resultType="java.lang.String">
+        SELECT
+            sum(ci.VIEW_COUNT) AS num
+        FROM COURSE_INFO ci
+        WHERE ci.DELETE_FLAG ='NOT_DELETE'
+    </select>
+    <select id="getViewTendencyNum" resultType="java.lang.String">
+        SELECT
+            DISTINCT csb.USER_ID
+        FROM COURSE_STUDENT_BURIALPOINT csb
+        LEFT JOIN COURSE_CLASSHOUR cch ON cch.ID=csb.HOUR_ID AND cch.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN COURSE_CHAPTER cc ON cc.ID=cch.CHAPTER_ID AND cc.DELETE_FLAG ='NOT_DELETE'
+        WHERE csb.DELETE_FLAG ='NOT_DELETE'
+          AND csb.FUNC_TYPE='1'
+          AND csb.TYPE='1'
+          AND TO_CHAR(csb.CREATE_TIME, 'YYYY-MM') =#{month}
+        <if test="courseId!=null and courseId != ''">
+            and cc.COURSE_ID=#{courseId}
+        </if>
+    </select>
+
+</mapper>

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courseInfo/CourseInfoAddParam.java

@@ -96,7 +96,7 @@ public class CourseInfoAddParam {
 
     /** 二级院系ID */
     @ApiModelProperty(value = "二级院系ID", position = 7)
-    @NotBlank(message = "二级院系ID不能为空")
+//    @NotBlank(message = "二级院系ID不能为空")
     private String collegeTwoId;
 
     /** 三级院系ID */

+ 32 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/StatisticsLearningProgressService.java

@@ -0,0 +1,32 @@
+package vip.xiaonuo.disk.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.Map;
+
+/**
+ * 统计-学习进度service
+ *
+ * @author honorfire
+ * @date  2025/06/18 14:16
+ */
+public interface StatisticsLearningProgressService {
+
+
+
+    /**
+     *  学习进度-顶部基本数据
+     */
+    Map<String,Object> topFundamentalDetail(Map param);
+
+    /**
+     *  学习进度-访问人数趋势
+     */
+    Map<String,Object> viewTendency(Map param);
+
+    /**
+     *  学习进度-学习明细数据
+     */
+    Page<Map<String,Object>> studyDetail(Map param);
+
+}

+ 102 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/StatisticsLearningProgressServiceImpl.java

@@ -0,0 +1,102 @@
+package vip.xiaonuo.disk.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.disk.mapper.StatisticsLearningProgressMapper;
+import vip.xiaonuo.disk.service.StatisticsLearningProgressService;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+public class StatisticsLearningProgressServiceImpl implements StatisticsLearningProgressService {
+
+    @Resource
+    private StatisticsLearningProgressMapper statisticsLearningProgressMapper;
+
+    /**
+     *  学习进度-顶部基本数据
+     */
+    @Override
+    public Map<String,Object> topFundamentalDetail(Map param)
+    {
+        Map result=new HashMap();
+        String courseOpenStuNum=statisticsLearningProgressMapper.getCourseOpenStuNum(param);
+        String courseViewNum=statisticsLearningProgressMapper.getCourseViewNum(param);
+        String paperSubmitNum=statisticsLearningProgressMapper.getPaperSubmitNum(param);
+        String interactionNum=statisticsLearningProgressMapper.getInteractionNum(param);
+        result.put("courseOpenStuNum",courseOpenStuNum);
+        result.put("courseViewNum",courseViewNum);
+//        result.put("paperSubmitNum",paperSubmitNum);
+//        result.put("interactionNum",interactionNum);
+        return result;
+    }
+
+    /**
+     *  学习进度-访问人数趋势
+     */
+    @Override
+    public Map<String,Object> viewTendency(Map param)
+    {
+        Map result=new HashMap();
+        String courseId=null;
+        if(ObjectUtil.isNotEmpty(param.get("courseId")))courseId=param.get("courseId").toString();
+        List<String> months = getLastSevenMonths(param.get("month").toString());
+        for(String  month:months)
+        {
+            Map viewTendencyParam =new HashMap();
+            viewTendencyParam.put("month",month);
+            viewTendencyParam.put("courseId",courseId);
+            String viewTendencyNum=statisticsLearningProgressMapper.getViewTendencyNum(param);
+            result.put(month,viewTendencyNum);
+        }
+        return result;
+    }
+
+    /**
+     *  学习进度-学习明细数据
+     */
+    @Override
+    public Page<Map<String,Object>> studyDetail(Map param)
+    {
+        return statisticsLearningProgressMapper.studyDetail(param, CommonPageRequest.defaultPage());
+    }
+
+
+    /**
+     *  获取指定七个月
+     *  不传值默认查当前月
+     */
+    public static List<String> getLastSevenMonths(String baseMonth) {
+        List<String> months = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        Calendar calendar = Calendar.getInstance();
+
+        try {
+            // 如果指定了基准月份,解析并设置Calendar
+            if (baseMonth != null) {
+                Date date = sdf.parse(baseMonth);
+                calendar.setTime(date);
+            }
+
+            // 将Calendar调整到基准月份的第一天(避免日期溢出问题)
+            calendar.set(Calendar.DAY_OF_MONTH, 1);
+
+            // 往前推7个月(共8个月)
+            for (int i = 7; i >= 0; i--) {
+                Calendar temp = (Calendar) calendar.clone();
+                temp.add(Calendar.MONTH, -i); // 往前减i个月
+                months.add(sdf.format(temp.getTime()));
+            }
+
+        } catch (Exception e) {
+            throw new IllegalArgumentException("月份格式必须为'YYYY-MM'", e);
+        }
+
+        return months;
+    }
+
+}