考试统计

main
sunhonglei 5 months ago
parent 16d9f6c4ea
commit be33d48ba1
  1. 6
      ccic-exam/src/main/java/com/ccic/safeliab/dao/ExamStatisticsMapper.java
  2. 6
      ccic-exam/src/main/java/com/ccic/safeliab/service/ExamStatisticsService.java
  3. 12
      ccic-exam/src/main/java/com/ccic/safeliab/service/ExamStatisticsServiceImpl.java
  4. 29
      ccic-exam/src/main/java/com/ccic/safeliab/web/ExamStatisticsController.java
  5. 137
      ccic-exam/src/main/resources/mappers/ExamStatisticsMapper.xml

@ -19,4 +19,10 @@ public interface ExamStatisticsMapper extends BaseMapper<ExamStatistics>{
List<Map<String,Object>> getScoreDistributionData();
List<Map<String,Object>> getPaperDistributionData();
List<Map<String,Object>> getQuestionTypeDistributionData(@Param("id") String id);
List<Map<String,Object>> getScoreDistribution(@Param("id") String id);
List<Map<String,Object>> getExamDetailAnalysisPageList(@Param("examName")String examName,
@Param("paperName")String paperName,
@Param("examArea")String examArea,
@Param("industry")String industry);
int getPaperAnalysisData(@Param("status") String status);
}

@ -17,4 +17,10 @@ public interface ExamStatisticsService extends BaseService<ExamStatistics> {
List<Map<String,Object>> getScoreDistributionData();
List<Map<String,Object>> getPaperDistributionData();
List<Map<String,Object>> getQuestionTypeDistributionData(String id);
List<Map<String,Object>> getScoreDistribution(String id);
List<Map<String,Object>> getExamDetailAnalysisPageList(String examName,
String paperName,
String examArea,
String industry);
int getPaperAnalysisData(String status);
}

@ -38,4 +38,16 @@ public class ExamStatisticsServiceImpl extends BaseServiceImpl<ExamStatisticsMap
public List<Map<String,Object>> getQuestionTypeDistributionData(@Param("id") String id){
return baseMapper.getQuestionTypeDistributionData(id);
}
public List<Map<String,Object>> getScoreDistribution(String id){
return baseMapper.getScoreDistribution(id);
}
public List<Map<String,Object>> getExamDetailAnalysisPageList(String examName,
String paperName,
String examArea,
String industry) {
return baseMapper.getExamDetailAnalysisPageList(examName,paperName,examArea,industry);
}
public int getPaperAnalysisData(String status){
return baseMapper.getPaperAnalysisData(status);
}
}

@ -20,7 +20,6 @@ public class ExamStatisticsController {
private ExamStatisticsService service;
@GetMapping("/init")
public R init() {
// 这里可以添加实际的数据库查询逻辑
Map<Object,Object> result = new HashMap<>();
// 题目数
result.put("questionCount", service.getQuestionCount());
@ -42,7 +41,6 @@ public class ExamStatisticsController {
}
@GetMapping("/change")
public R onChange(@RequestParam String id) {
// 这里可以添加实际的数据库查询逻辑
Map<Object,Object> result = new HashMap<>();
// 安全服务环状图
result.put("aqServiceDimensionData",service.getAqServiceDimensionData(id));
@ -50,4 +48,31 @@ public class ExamStatisticsController {
result.put("questionTypeDistributionData",service.getQuestionTypeDistributionData(id));
return R.ok().data(result);
}
// 考试详情画面的检索
@GetMapping("/getExamDetailAnalysisPageList")
public R getExamDetailAnalysisPageList(@RequestParam String examName,
@RequestParam String paperName,
@RequestParam String examArea,
@RequestParam String industry) {
return R.ok().data(service.getExamDetailAnalysisPageList(examName,paperName,examArea,industry));
}
// 考试详情画面的成绩分布
@GetMapping("/getScoreDistribution")
public R getScoreDistribution(@RequestParam String id) {
return R.ok().data(service.getScoreDistribution(id));
}
// 考试详情画面的成绩分布
@GetMapping("/getPaperAnalysisData")
public R getScoreDistribution() {
Map<Object,Object> result = new HashMap<>();
// 总数
result.put("totalCount", service.getPaperAnalysisData(null));
// 使用数
result.put("usedCount", service.getPaperAnalysisData("1"));
// 停用数
result.put("disabledCount", service.getPaperAnalysisData("0"));
return R.ok().data(result);
}
}

@ -209,4 +209,141 @@
t.NAME ,
q.question_types
</select>
<select id="getExamDetailAnalysisPageList" resultType="java.util.Map">
SELECT
scores.exam_id as examId,
info.exam_name as examName,
papers.paper_name as paperName,
CASE
WHEN INSTR ( info.exam_region, '/' ) > 0 THEN
SUBSTRING ( info.exam_region, INSTR ( info.exam_region, '/' ) + 1 ) ELSE info.exam_region
END AS examArea,
ind.industry_name AS industry,
COUNT ( scores."id" ) AS "participants",
AVG ( scores.exam_time_spent ) AS "averageTime",
<![CDATA[
round(
SUM ( CASE WHEN scores.total_score / papers.total_score >= 0.6 THEN 1 ELSE 0 END ) / COUNT ( scores."id" ) * 100,
2
) || '%' AS "passRate"
]]>
FROM
ex_exam_scores AS scores
LEFT JOIN ex_exam_info AS info ON info.ID = scores.exam_id
AND info.paper_id = scores.paper_id
AND info.is_deleted = 0
AND info.publish_status = 1
LEFT JOIN ex_exam_papers papers ON papers.ID = scores.paper_id
AND papers.is_deleted = 0
AND papers.paper_status = 1
LEFT JOIN tbl_industry ind ON ind.industry_id = info.industry_id
AND ind.status = 1
WHERE
scores.is_deleted = 0
<if test="examName != null and examName != ''">
AND info.exam_name LIKE '%' + #{examName} + '%'
</if>
<if test="paperName != null and paperName != ''">
AND paper.paper_name LIKE '%' + #{paperName} + '%'
</if>
<if test="industry != null and industry != ''">
AND ind.industry_id = #{industry}
</if>
<if test="examArea != null and examArea != ''">
AND info.exam_region = #{examArea}
</if>
GROUP BY
info.exam_name,
papers.paper_name,
ind.industry_name,
info.exam_region,
scores.exam_id,
scores.paper_id
ORDER BY
scores.exam_id,
scores.paper_id
</select>
<select id="getScoreDistribution" resultType="java.util.Map">
<![CDATA[
-- 定义 CTE scores,用于获取考试成绩相关信息
WITH scores AS (
SELECT
score.total_score,
papers.total_score,
score.total_score / papers.total_score AS grade,
info.ID
FROM
ex_exam_scores score
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
WHERE
score.is_deleted = 0
and score.exam_id = #{id}
),
-- 定义 CTE total,用于计算总人数
total AS (
SELECT count(1) headcount
FROM
ex_exam_scores score
LEFT JOIN ex_exam_info info ON info.ID = score.exam_id
AND info.publish_status = 1
AND info.is_deleted = 0
LEFT JOIN ex_exam_papers papers ON papers.ID = info.paper_id
AND papers.is_deleted = 0
WHERE
score.is_deleted = 0
and score.exam_id = #{id}
)
-- 主查询部分,计算不同成绩区间的比例并精确到小数点后两位
SELECT
ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) AS "value" ,
'优秀占比: '||ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) || '%' AS "name"
FROM
scores
WHERE
grade >= 0.9
UNION ALL
SELECT
ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) AS "value" ,
'合格占比: '||ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) || '%'AS "name"
FROM
scores
WHERE
grade < 0.9
AND grade >= 0.6
UNION ALL
SELECT
ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) AS "value" ,
'需努力占比: '||ROUND(COUNT(1) / (SELECT headcount FROM total) * 100, 2) || '%'AS "name"
FROM
scores
WHERE
grade < 0.6;
]]>
</select>
<select id="getPaperAnalysisData" resultType="java.lang.Integer">
select
count(1)
from
ex_exam_papers
WHERE
is_deleted = 0
<if test="status != null and status != ''">
AND paper_status = #{status}
</if>
</select>
<select id="getPaperAnalysisData" resultType="java.lang.Integer">
select
count(1)
from
ex_exam_papers
WHERE
is_deleted = 0
<if test="status != null and status != ''">
AND paper_status = #{status}
</if>
</select>
</mapper>
Loading…
Cancel
Save