Răsfoiți Sursa

1.开发统计:教学活动分析 讨论互动统计、统计:教学活动分析 学员和教员分别统计、统计:教学活动分析 课程的讨论主题统计

jasonk5949 6 luni în urmă
părinte
comite
42f43d1243

+ 22 - 1
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/controller/ForumPostInfoController.java

@@ -186,14 +186,35 @@ public class ForumPostInfoController {
     }
 
     /**
-     * 统计:根据日期查询发帖和回帖数
+     * 统计:学习进度概览 根据日期查询发帖和回帖数
      */
     @PostMapping("/forum/postinfo/getCountByDate")
     public CommonResult<JSONObject> getCountByDate(@RequestBody JSONObject json) {
         return forumPostInfoService.getCountByDate(json);
     }
 
+    /**
+     * 统计:教学活动分析 讨论互动统计
+     */
+    @PostMapping("/forum/postinfo/getCountByCourseAndDate")
+    public CommonResult<JSONObject> getCountByCourseAndDate(@RequestBody JSONObject json) {
+        return forumPostInfoService.getCountByCourseAndDate(json);
+    }
 
+    /**
+     * 统计:教学活动分析 学员和教员分别统计
+     */
+    @PostMapping("/forum/postinfo/getStudentAndTeacherCount")
+    public CommonResult<JSONObject> getStudentAndTeacherCount(@RequestBody JSONObject json) {
+        return forumPostInfoService.getStudentAndTeacherCount(json);
+    }
 
+    /**
+     * 统计:教学活动分析 课程的讨论主题统计
+     */
+    @PostMapping("/forum/postinfo/getStudentPostInfoList")
+    public CommonResult<JSONObject> getStudentPostInfoList(@RequestBody JSONObject json) {
+        return forumPostInfoService.getStudentPostInfoList(json);
+    }
 
 }

+ 35 - 0
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/mapper/ForumPostInfoMapper.java

@@ -13,8 +13,12 @@
 package vip.xiaonuo.forum.modular.postinfo.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import vip.xiaonuo.forum.modular.postinfo.entity.ForumPostInfo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 帖子信息表Mapper接口
  *
@@ -22,4 +26,35 @@ import vip.xiaonuo.forum.modular.postinfo.entity.ForumPostInfo;
  * @date  2025/07/16 08:46
  **/
 public interface ForumPostInfoMapper extends BaseMapper<ForumPostInfo> {
+
+    /**
+     * 根据课程id和时间标识 查询讨论数和回帖数
+     *
+     * @param courseId 课程id
+     * @param dateType 时间标识 1=7天、2=30天、3=90天、4=365天
+     *
+     * @return 讨论数和回帖数
+     */
+    Map<String, Long> getPostCountAndReplyCountByCourse(@Param("courseId") String courseId, @Param("dateType") Integer dateType);
+
+    /**
+     * 根据课程id和时间标识 分别查询学员和教员的讨论数和回帖数
+     *
+     * @param courseId 课程id
+     * @param dateType 时间标识 1=7天、2=30天、3=90天、4=365天
+     *
+     * @return 学员和教员的讨论数和回帖数
+     */
+
+    Map<String, Long> getStudentAndTeacherCount(@Param("courseId") String courseId, @Param("dateType") Integer dateType);
+
+    /**
+     * 根据课程id和时间标识 查询讨论发帖情况
+     *
+     * @param courseId 课程id
+     * @param dateType 时间标识 1=7天、2=30天、3=90天、4=365天
+     *
+     * @return 发帖情况
+     */
+    List<Map<String, String>> getStudentPostInfoList(@Param("courseId") String courseId, @Param("dateType") Integer dateType);
 }

+ 90 - 0
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/mapper/mapping/ForumPostInfoMapper.xml

@@ -2,4 +2,94 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="vip.xiaonuo.forum.modular.postinfo.mapper.ForumPostInfoMapper">
 
+    <select id="getPostCountAndReplyCountByCourse" resultType="java.util.Map">
+        SELECT
+        COUNT(CASE WHEN reply.PARENT_ID = '-1' THEN 1 END) AS postCount,
+        COUNT(CASE WHEN reply.PARENT_ID != '-1' THEN 1 END) AS replyCount
+        FROM FORUM_POST_REPLY reply
+        LEFT JOIN FORUM_CHAPTER_DISCUSSION chapter
+        ON reply.POST_ID = chapter.POST_ID
+        WHERE reply.POST_TYPE = 3
+        AND reply.CREATE_TIME >= CASE
+        WHEN #{dateType} = 1 THEN TRUNC(SYSDATE) - 6
+        WHEN #{dateType} = 2 THEN TRUNC(SYSDATE) - 29
+        WHEN #{dateType} = 3 THEN TRUNC(SYSDATE) - 89
+        WHEN #{dateType} = 4 THEN TRUNC(SYSDATE) - 364
+        ELSE TO_DATE('1970-01-01','YYYY-MM-DD') -- 默认值
+        END
+        AND reply.CREATE_TIME &lt; TRUNC(SYSDATE) + 1
+        <if test="courseId != null and courseId != ''">
+            AND chapter.COURSE_ID = #{courseId}
+        </if>
+    </select>
+
+    <select id="getStudentAndTeacherCount" resultType="java.util.Map">
+        SELECT
+        COUNT(CASE WHEN reply.PARENT_ID = '-1' AND reply.USER_EDU_IDENTITY = 1 THEN 1 END) AS studentPostCount,
+        COUNT(CASE WHEN reply.PARENT_ID != '-1' AND reply.USER_EDU_IDENTITY = 1 THEN 1 END) AS studentReplyCount,
+        COUNT(CASE WHEN reply.PARENT_ID = '-1' AND reply.USER_EDU_IDENTITY = 2 THEN 1 END) AS teacherPostCount,
+        COUNT(CASE WHEN reply.PARENT_ID != '-1' AND reply.USER_EDU_IDENTITY = 2 THEN 1 END) AS teacherReplyCount
+        FROM FORUM_POST_REPLY reply
+        LEFT JOIN FORUM_CHAPTER_DISCUSSION chapter
+        ON reply.POST_ID = chapter.POST_ID
+        WHERE reply.POST_TYPE = 3
+        AND reply.CREATE_TIME >= CASE
+        WHEN #{dateType} = 1 THEN TRUNC(SYSDATE) - 6
+        WHEN #{dateType} = 2 THEN TRUNC(SYSDATE) - 29
+        WHEN #{dateType} = 3 THEN TRUNC(SYSDATE) - 89
+        WHEN #{dateType} = 4 THEN TRUNC(SYSDATE) - 364
+        ELSE TO_DATE('1970-01-01','YYYY-MM-DD') -- 默认值
+        END
+        AND reply.CREATE_TIME &lt; TRUNC(SYSDATE) + 1
+        <if test="courseId != null and courseId != ''">
+            AND chapter.COURSE_ID = #{courseId}
+        </if>
+    </select>
+
+    <select id="getStudentPostInfoList" resultType="java.util.Map">
+        SELECT
+        reply.USER_ID,
+        MAX(reply.POST_ID) AS latest_post_id,
+        MAX(reply.PARENT_ID) AS latest_parent_id,
+        MAX(reply.REPLY_CONTENT) AS latest_content,
+        MAX(DATE_FORMAT(reply.CREATE_TIME, '%Y-%m-%d %H:%i:%s')) AS latest_create_time,
+        MAX(sysuser.NAME) AS userName,
+        MAX(post.POST_TITLE) AS postTitle,
+        COUNT(*) AS total_replies,
+        COALESCE(MAX(sub_reply.replyCount), 0) AS total_child_replies,
+        MAX(sub_reply.lastReplyTime) AS last_child_reply_time
+        FROM
+        FORUM_POST_REPLY as reply
+        LEFT JOIN SYS_USER as sysuser ON reply.USER_ID = sysuser.ID
+        LEFT JOIN FORUM_POST_INFO as post ON reply.POST_ID = post.POST_ID
+        LEFT JOIN FORUM_CHAPTER_DISCUSSION chapter ON reply.POST_ID = chapter.POST_ID
+        LEFT JOIN (
+        SELECT
+        PARENT_ID,
+        COUNT(*) as replyCount,
+        DATE_FORMAT(MAX(CREATE_TIME), '%Y-%m-%d %H:%i:%s') as lastReplyTime
+        FROM FORUM_POST_REPLY
+        GROUP BY PARENT_ID
+        ) sub_reply ON reply.REPLY_ID = sub_reply.PARENT_ID
+        WHERE
+        reply.POST_TYPE = 3
+        AND reply.CREATE_TIME >= CASE
+        WHEN #{dateType} = 1 THEN TRUNC(SYSDATE) - 6
+        WHEN #{dateType} = 2 THEN TRUNC(SYSDATE) - 29
+        WHEN #{dateType} = 3 THEN TRUNC(SYSDATE) - 89
+        WHEN #{dateType} = 4 THEN TRUNC(SYSDATE) - 364
+        ELSE TO_DATE('1970-01-01','YYYY-MM-DD')
+        END
+        AND reply.CREATE_TIME &lt; TRUNC(SYSDATE) + 1
+        <if test="courseId != null and courseId != ''">
+            AND chapter.COURSE_ID = #{courseId}
+        </if>
+        GROUP BY
+        reply.USER_ID
+        ORDER BY
+        latest_create_time DESC
+        LIMIT 5
+    </select>
+
+
 </mapper>

+ 16 - 0
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/service/ForumPostInfoService.java

@@ -119,4 +119,20 @@ public interface ForumPostInfoService extends IService<ForumPostInfo> {
      * 统计:根据日期查询发帖和回帖数
      */
     CommonResult<JSONObject> getCountByDate(JSONObject json);
+
+    /**
+     * 统计:讨论互动统计
+     */
+    CommonResult<JSONObject> getCountByCourseAndDate(JSONObject json);
+
+    /**
+     * 统计:教学活动分析 学员和教员分别统计
+     */
+    CommonResult<JSONObject> getStudentAndTeacherCount(JSONObject json);
+
+    /**
+     * 统计:教学活动分析 学员课程的讨论主题统计
+     */
+    CommonResult<JSONObject> getStudentPostInfoList(JSONObject json);
+
 }

+ 97 - 0
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/service/impl/ForumPostInfoServiceImpl.java

@@ -55,11 +55,15 @@ import vip.xiaonuo.forum.modular.supportenv.mapper.ForumSupportEnvMapper;
 import vip.xiaonuo.sys.api.SysUserApi;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -100,6 +104,9 @@ public class ForumPostInfoServiceImpl extends ServiceImpl<ForumPostInfoMapper, F
     @Resource
     private ForumChapterDiscussionMapper forumChapterDiscussionMapper;
 
+    @Resource
+    private ForumPostInfoMapper forumPostInfoMapper;
+
 
     @Override
     public Page<ForumPostInfo> page(ForumPostInfoPageParam forumPostInfoPageParam) {
@@ -730,6 +737,96 @@ public class ForumPostInfoServiceImpl extends ServiceImpl<ForumPostInfoMapper, F
         return CommonResult.data(result);
     }
 
+    @Override
+    public CommonResult<com.alibaba.fastjson.JSONObject> getCountByCourseAndDate(com.alibaba.fastjson.JSONObject json) {
+        // 取出课程id,查询日期类型 最近7天、最近30天、最近90天、最近一年
+        String courseId = json.getString("courseId");
+        Integer dateType = json.getInteger("dateType");
+        // 查询讨论总数、回帖总数、平均回帖数
+        Map<String, Long> postCountAndReplyCount = forumPostInfoMapper.getPostCountAndReplyCountByCourse(courseId, dateType);
+        com.alibaba.fastjson.JSONObject result = new com.alibaba.fastjson.JSONObject();
+        Long replyCount = postCountAndReplyCount.getOrDefault("replyCount", 0L);
+        Long postCount = postCountAndReplyCount.getOrDefault("postCount", 0L);
+        result.put("postCount", postCount);
+        result.put("replyCount", replyCount);
+        // 计算平均回帖数 回帖数除以发帖数 并四舍五入后面只留一位小数
+        double avgReplyCount = 0.0;
+        if (postCount > 0) {
+            // 使用BigDecimal保证计算精度
+            BigDecimal reply = new BigDecimal(replyCount);
+            BigDecimal post = new BigDecimal(postCount);
+            avgReplyCount = reply.divide(post, 2, RoundingMode.HALF_UP).setScale(1, RoundingMode.HALF_UP).doubleValue();
+        }
+        result.put("avgReplyCount", avgReplyCount);
+        return CommonResult.data(result);
+    }
+
+    @Override
+    public CommonResult<com.alibaba.fastjson.JSONObject> getStudentAndTeacherCount(com.alibaba.fastjson.JSONObject json) {
+        // 取出课程id,查询日期类型 最近7天、最近30天、最近90天、最近一年
+        String courseId = json.getString("courseId");
+        Integer dateType = json.getInteger("dateType");
+        // 分别查询学员和教员的讨论总数、回帖总数
+        Map<String, Long> studentAndTeacher = forumPostInfoMapper.getStudentAndTeacherCount(courseId, dateType);
+        // 封装参数
+        com.alibaba.fastjson.JSONObject result = new com.alibaba.fastjson.JSONObject();
+        // 学员
+        Long studentPostCount = studentAndTeacher.getOrDefault("studentPostCount", 0L);
+        Long studentReplyCount = studentAndTeacher.getOrDefault("studentReplyCount", 0L);
+        // 计算学员日均回帖数
+        double studentAvgReplyCount = 0.0;
+        if (studentPostCount > 0) {
+            // 使用BigDecimal保证计算精度
+            BigDecimal reply = new BigDecimal(studentReplyCount);
+            BigDecimal post = new BigDecimal(studentPostCount);
+            studentAvgReplyCount = reply.divide(post, 2, RoundingMode.HALF_UP).setScale(1, RoundingMode.HALF_UP).doubleValue();
+        }
+        // 教员
+        Long teacherPostCount = studentAndTeacher.getOrDefault("teacherPostCount", 0L);
+        Long teacherReplyCount = studentAndTeacher.getOrDefault("teacherReplyCount", 0L);
+        // 计算教员日均回帖数
+        double teacherAvgReplyCount = 0.0;
+        if (teacherPostCount > 0) {
+            // 使用BigDecimal保证计算精度
+            BigDecimal reply = new BigDecimal(teacherReplyCount);
+            BigDecimal post = new BigDecimal(teacherPostCount);
+            teacherAvgReplyCount = reply.divide(post, 2, RoundingMode.HALF_UP).setScale(1, RoundingMode.HALF_UP).doubleValue();
+        }
+        result.put("studentPostCount", studentPostCount);
+        result.put("studentReplyCount", studentReplyCount);
+        result.put("studentAvgReplyCount", studentAvgReplyCount);
+        result.put("teacherPostCount", teacherPostCount);
+        result.put("teacherReplyCount", teacherReplyCount);
+        result.put("teacherAvgReplyCount", teacherAvgReplyCount);
+        return CommonResult.data(result);
+    }
+
+    @Override
+    public CommonResult<com.alibaba.fastjson.JSONObject> getStudentPostInfoList(com.alibaba.fastjson.JSONObject json) {
+        com.alibaba.fastjson.JSONObject result = new com.alibaba.fastjson.JSONObject();
+        // 取出课程id,查询日期类型 最近7天、最近30天、最近90天、最近一年
+        String courseId = json.getString("courseId");
+        Integer dateType = json.getInteger("dateType");
+        // 根据课程id查询出 讨论的用户
+        List<Map<String, String>> studentAndTeacher = forumPostInfoMapper.getStudentPostInfoList(courseId, dateType);
+        // 封装参数
+        JSONArray jsonArray = new JSONArray();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        if (studentAndTeacher.size() > 0) {
+            for (Map<String, String> dataMap : studentAndTeacher) {
+                com.alibaba.fastjson.JSONObject info = new com.alibaba.fastjson.JSONObject();
+                info.put("postTitle", dataMap.getOrDefault("postTitle", ""));
+                info.put("userName", dataMap.getOrDefault("userName", ""));
+                info.put("createTime", dataMap.getOrDefault("latest_create_time", ""));
+                info.put("replyCount", dataMap.getOrDefault("total_replies", "0"));
+                info.put("lastReplyTime", dataMap.getOrDefault("last_child_reply_time", ""));
+                jsonArray.add(info);
+            }
+        }
+        result.put("list", jsonArray);
+        return CommonResult.data(result);
+    }
+
     /**
      * 自动创建章节讨论类型的帖子
      */