数据统计

This commit is contained in:
2025-10-30 18:55:40 +08:00
parent 0935ec5ec5
commit a881f57e30
19 changed files with 1587 additions and 162 deletions

View File

@@ -204,4 +204,157 @@
<include refid="Where_Clause" />
</select>
<!-- 获取本周课程和文章的总学习时长统计 -->
<select id="getWeeklyStudyDurationByType" resultType="map">
SELECT
CASE
WHEN lr.resource_type = 2 THEN '课程'
WHEN lr.resource_type = 1 THEN '文章'
ELSE '其他'
END AS resourceType,
COUNT(DISTINCT lr.user_id) AS userCount,
COALESCE(SUM(lr.duration), 0) AS totalDuration,
COUNT(*) AS studyCount
FROM tb_learning_record lr
INNER JOIN tb_sys_user u ON lr.user_id = u.id AND u.deleted = 0
<if test="userDeptRoles != null and userDeptRoles.size() > 0">
INNER JOIN tb_sys_user_dept_role udr ON u.id = udr.user_id AND udr.deleted = 0
INNER JOIN tb_sys_dept user_dept ON udr.dept_id = user_dept.dept_id AND user_dept.deleted = 0
INNER JOIN (
SELECT dept_id, dept_path FROM tb_sys_dept WHERE deleted = 0 AND dept_id IN (
<foreach collection="userDeptRoles" item="udr" separator=",">
#{udr.deptID}
</foreach>
)
) current_dept ON user_dept.dept_path LIKE CONCAT(current_dept.dept_path, '%')
</if>
WHERE lr.deleted = 0
AND lr.last_learn_time >= DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY)
AND lr.last_learn_time &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY), INTERVAL 7 DAY)
GROUP BY lr.resource_type
ORDER BY totalDuration DESC
</select>
<!-- 获取本周学习时长排行榜 -->
<select id="getWeeklyStudyDurationRanking" resultType="map">
SELECT
lr.user_id AS userId,
u.username AS username,
COALESCE(SUM(lr.duration), 0) AS totalDuration,
COUNT(DISTINCT lr.resource_id) AS resourceCount,
COUNT(*) AS studyCount
FROM tb_learning_record lr
INNER JOIN tb_sys_user u ON lr.user_id = u.id AND u.deleted = 0
<if test="userDeptRoles != null and userDeptRoles.size() > 0">
INNER JOIN tb_sys_user_dept_role udr ON u.id = udr.user_id AND udr.deleted = 0
INNER JOIN tb_sys_dept user_dept ON udr.dept_id = user_dept.dept_id AND user_dept.deleted = 0
INNER JOIN (
SELECT dept_id, dept_path FROM tb_sys_dept WHERE deleted = 0 AND dept_id IN (
<foreach collection="userDeptRoles" item="udr" separator=",">
#{udr.deptID}
</foreach>
)
) current_dept ON user_dept.dept_path LIKE CONCAT(current_dept.dept_path, '%')
</if>
WHERE lr.deleted = 0
AND lr.last_learn_time >= DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY)
AND lr.last_learn_time &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY), INTERVAL 7 DAY)
GROUP BY lr.user_id, u.username
ORDER BY totalDuration DESC
LIMIT 10
</select>
<!-- 获取本周学习课程排行榜 -->
<select id="getWeeklyCourseRanking" resultType="map">
SELECT
lr.resource_id AS resourceId,
c.name AS resourceName,
COUNT(DISTINCT lr.user_id) AS learnerCount,
COALESCE(SUM(lr.duration), 0) AS totalDuration,
COUNT(*) AS studyCount
FROM tb_learning_record lr
INNER JOIN tb_course c ON lr.resource_id = c.course_id AND c.deleted = 0
INNER JOIN tb_sys_user u ON lr.user_id = u.id AND u.deleted = 0
<if test="userDeptRoles != null and userDeptRoles.size() > 0">
INNER JOIN tb_sys_user_dept_role udr ON u.id = udr.user_id AND udr.deleted = 0
INNER JOIN tb_sys_dept user_dept ON udr.dept_id = user_dept.dept_id AND user_dept.deleted = 0
INNER JOIN (
SELECT dept_id, dept_path FROM tb_sys_dept WHERE deleted = 0 AND dept_id IN (
<foreach collection="userDeptRoles" item="udr" separator=",">
#{udr.deptID}
</foreach>
)
) current_dept ON user_dept.dept_path LIKE CONCAT(current_dept.dept_path, '%')
</if>
WHERE lr.deleted = 0
AND lr.resource_type = 2
AND lr.last_learn_time >= DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY)
AND lr.last_learn_time &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY), INTERVAL 7 DAY)
GROUP BY lr.resource_id, c.name
ORDER BY learnerCount DESC, totalDuration DESC
LIMIT 10
</select>
<!-- 获取本周学习文章排行榜 -->
<select id="getWeeklyArticleRanking" resultType="map">
SELECT
lr.resource_id AS resourceId,
r.title AS resourceName,
COUNT(DISTINCT lr.user_id) AS learnerCount,
COALESCE(SUM(lr.duration), 0) AS totalDuration,
COUNT(*) AS studyCount
FROM tb_learning_record lr
INNER JOIN tb_resource r ON lr.resource_id = r.resource_id AND r.deleted = 0
INNER JOIN tb_sys_user u ON lr.user_id = u.id AND u.deleted = 0
<if test="userDeptRoles != null and userDeptRoles.size() > 0">
INNER JOIN tb_sys_user_dept_role udr ON u.id = udr.user_id AND udr.deleted = 0
INNER JOIN tb_sys_dept user_dept ON udr.dept_id = user_dept.dept_id AND user_dept.deleted = 0
INNER JOIN (
SELECT dept_id, dept_path FROM tb_sys_dept WHERE deleted = 0 AND dept_id IN (
<foreach collection="userDeptRoles" item="udr" separator=",">
#{udr.deptID}
</foreach>
)
) current_dept ON user_dept.dept_path LIKE CONCAT(current_dept.dept_path, '%')
</if>
WHERE lr.deleted = 0
AND lr.resource_type = 1
AND lr.last_learn_time >= DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY)
AND lr.last_learn_time &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY), INTERVAL 7 DAY)
GROUP BY lr.resource_id, r.title
ORDER BY learnerCount DESC, totalDuration DESC
LIMIT 10
</select>
<!-- 获取本周任务完成最多的排行榜 -->
<select id="getWeeklyTaskCompletionRanking" resultType="map">
SELECT
tu.user_id AS userId,
u.username AS username,
COUNT(DISTINCT tu.task_id) AS completedTaskCount,
COALESCE(SUM(lr.duration), 0) AS totalDuration,
MAX(tu.complete_time) AS lastCompleteTime
FROM tb_task_user tu
INNER JOIN tb_sys_user u ON tu.user_id = u.id AND u.deleted = 0
<if test="userDeptRoles != null and userDeptRoles.size() > 0">
INNER JOIN tb_sys_user_dept_role udr ON u.id = udr.user_id AND udr.deleted = 0
INNER JOIN tb_sys_dept user_dept ON udr.dept_id = user_dept.dept_id AND user_dept.deleted = 0
INNER JOIN (
SELECT dept_id, dept_path FROM tb_sys_dept WHERE deleted = 0 AND dept_id IN (
<foreach collection="userDeptRoles" item="udr" separator=",">
#{udr.deptID}
</foreach>
)
) current_dept ON user_dept.dept_path LIKE CONCAT(current_dept.dept_path, '%')
</if>
LEFT JOIN tb_learning_record lr ON tu.user_id = lr.user_id AND tu.task_id = lr.task_id AND lr.deleted = 0
WHERE tu.deleted = 0
AND tu.status = 2
AND tu.complete_time >= DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY)
AND tu.complete_time &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE())-1 DAY), INTERVAL 7 DAY)
GROUP BY tu.user_id, u.username
ORDER BY completedTaskCount DESC, totalDuration DESC
LIMIT 10
</select>
</mapper>

View File

@@ -263,4 +263,84 @@
<include refid="Where_Clause" />
</select>
<!-- 获取任务学习时长分布数据 -->
<select id="getStudyDurationDistribution" resultType="map">
SELECT
CASE
WHEN total_duration &lt; 600 THEN '0-10分钟'
WHEN total_duration &lt; 1800 THEN '10-30分钟'
WHEN total_duration &lt; 3600 THEN '30-60分钟'
WHEN total_duration &lt; 7200 THEN '1-2小时'
WHEN total_duration &lt; 14400 THEN '2-4小时'
ELSE '4小时以上'
END AS durationRange,
COUNT(*) AS userCount
FROM (
SELECT
lh.user_id,
COALESCE(SUM(lh.duration), 0) AS total_duration
FROM tb_task_user tu
LEFT JOIN tb_learning_history lh ON tu.user_id = lh.user_id AND tu.task_id = lh.task_id AND lh.deleted = 0
WHERE tu.task_id = #{taskId} AND tu.deleted = 0
GROUP BY lh.user_id
) AS user_durations
GROUP BY durationRange
ORDER BY MIN(total_duration)
</select>
<!-- 获取任务学习进度分布数据 -->
<select id="getStudyProgressDistribution" resultType="map">
SELECT
CASE
WHEN progress &lt; 10 THEN '0-10%'
WHEN progress &lt; 20 THEN '10-20%'
WHEN progress &lt; 30 THEN '20-30%'
WHEN progress &lt; 40 THEN '30-40%'
WHEN progress &lt; 50 THEN '40-50%'
WHEN progress &lt; 60 THEN '50-60%'
WHEN progress &lt; 70 THEN '60-70%'
WHEN progress &lt; 80 THEN '70-80%'
WHEN progress &lt; 90 THEN '80-90%'
WHEN progress &lt; 100 THEN '90-100%'
ELSE '100%'
END AS progressRange,
COUNT(*) AS userCount
FROM tb_task_user
WHERE task_id = #{taskId} AND deleted = 0
GROUP BY progressRange
ORDER BY MIN(progress)
</select>
<!-- 获取任务完成时间排行榜前10名 -->
<select id="getCompletionTimeRanking" resultType="map">
SELECT
tu.user_id AS userId,
u.username AS username,
tu.complete_time AS completeTime,
TIMESTAMPDIFF(SECOND, tu.create_time, tu.complete_time) AS completionDuration
FROM tb_task_user tu
INNER JOIN tb_sys_user u ON tu.user_id = u.id AND u.deleted = 0
WHERE tu.task_id = #{taskId}
AND tu.status = 2
AND tu.complete_time IS NOT NULL
AND tu.deleted = 0
ORDER BY tu.complete_time ASC
LIMIT 10
</select>
<!-- 获取任务学习时长排行榜前10名 -->
<select id="getStudyDurationRanking" resultType="map">
SELECT
lh.user_id AS userId,
u.username AS username,
COALESCE(SUM(lh.duration), 0) AS totalDuration
FROM tb_task_user tu
INNER JOIN tb_sys_user u ON tu.user_id = u.id AND u.deleted = 0
LEFT JOIN tb_learning_history lh ON tu.user_id = lh.user_id AND tu.task_id = lh.task_id AND lh.deleted = 0
WHERE tu.task_id = #{taskId} AND tu.deleted = 0
GROUP BY lh.user_id, u.username
ORDER BY totalDuration DESC
LIMIT 10
</select>
</mapper>