考试统计

main
sunhonglei 5 months ago
parent aef1853a45
commit f090a76a3f
  1. 18
      ccic-entity/src/main/java/com/ccic/safeliab/entity/ExamStatistics.java
  2. 20
      ccic-exam/src/main/java/com/ccic/safeliab/dao/ExamStatisticsMapper.java
  3. 19
      ccic-exam/src/main/java/com/ccic/safeliab/service/ExamStatisticsService.java
  4. 37
      ccic-exam/src/main/java/com/ccic/safeliab/service/ExamStatisticsServiceImpl.java
  5. 44
      ccic-exam/src/main/java/com/ccic/safeliab/web/ExamStatisticsController.java
  6. 174
      ccic-exam/src/main/resources/mappers/ExamStatisticsMapper.xml

@ -0,0 +1,18 @@
package com.ccic.safeliab.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ExamStatistics extends BaseEntity{
}

@ -0,0 +1,20 @@
package com.ccic.safeliab.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ccic.safeliab.entity.ExamStatistics;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface ExamStatisticsMapper extends BaseMapper<ExamStatistics>{
int getQuestionCount();
int getPaperCount();
int getExamCount();
List<Map<String,Object>> getIndustryDimensionData();
List<Map<String,Object>> getAqServiceDimensionData();
List<Map<String,Object>> getExamTableData();
List<Map<String,Object>> getScoreDistributionData();
List<Map<String,Object>> getPaperDistributionData();
}

@ -0,0 +1,19 @@
package com.ccic.safeliab.service;
import com.ccic.safeliab.entity.ExamSchedule;
import com.ccic.safeliab.entity.ExamStatistics;
import com.ccic.safeliab.support.BaseService;
import java.util.List;
import java.util.Map;
public interface ExamStatisticsService extends BaseService<ExamStatistics> {
int getQuestionCount();
int getPaperCount();
int getExamCount();
List<Map<String,Object>> getIndustryDimensionData();
List<Map<String,Object>> getAqServiceDimensionData();
List<Map<String,Object>> getExamTableData();
List<Map<String,Object>> getScoreDistributionData();
List<Map<String,Object>> getPaperDistributionData();
}

@ -0,0 +1,37 @@
package com.ccic.safeliab.service;
import com.ccic.safeliab.dao.ExamStatisticsMapper;
import com.ccic.safeliab.entity.ExamStatistics;
import com.ccic.safeliab.support.BaseServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class ExamStatisticsServiceImpl extends BaseServiceImpl<ExamStatisticsMapper, ExamStatistics> implements ExamStatisticsService {
public int getQuestionCount(){
return baseMapper.getQuestionCount();
}
public int getPaperCount(){
return baseMapper.getPaperCount();
}
public int getExamCount(){
return baseMapper.getExamCount();
}
public List<Map<String,Object>> getIndustryDimensionData(){
return baseMapper.getIndustryDimensionData();
}
public List<Map<String,Object>> getAqServiceDimensionData(){
return baseMapper.getAqServiceDimensionData();
}
public List<Map<String,Object>> getExamTableData(){
return baseMapper.getExamTableData();
}
public List<Map<String,Object>> getScoreDistributionData(){
return baseMapper.getScoreDistributionData();
}
public List<Map<String,Object>> getPaperDistributionData(){
return baseMapper.getPaperDistributionData();
}
}

@ -0,0 +1,44 @@
package com.ccic.safeliab.web;
import com.ccic.safeliab.entity.ExamSchedule;
import com.ccic.safeliab.service.ExamScheduleService;
import com.ccic.safeliab.service.ExamStatisticsService;
import com.ccic.safeliab.util.R;
import com.ccic.safeliab.vo.ExamScheduleVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/ex/exam-statistics")
public class ExamStatisticsController {
@Autowired
private ExamStatisticsService service;
@GetMapping("/init")
public R init() {
// 这里可以添加实际的数据库查询逻辑
Map<Object,Object> result = new HashMap<>();
// 题目数
result.put("questionCount", service.getQuestionCount());
// 试卷数
result.put("paperCount", service.getPaperCount());
// 考试数
result.put("examCount", service.getExamCount());
// 监管行业环状图
result.put("industryDimensionData", service.getIndustryDimensionData());
// 安全服务环状图
result.put("aqServiceDimensionData",service.getAqServiceDimensionData());
// 考试状况表格
result.put("examTableData",service.getExamTableData());
// 成绩分布
result.put("scoreDistributionData",service.getScoreDistributionData());
// 试卷情况
result.put("paperDistributionData",service.getPaperDistributionData());
return R.ok().data(result);
}
}

@ -0,0 +1,174 @@
<?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="com.ccic.safeliab.dao.ExamStatisticsMapper">
<select id="getQuestionCount" resultType="java.lang.Integer">
select count(1) from ex_question_categories
where status = 1
and is_deleted = 0
</select>
<select id="getPaperCount" resultType="java.lang.Integer">
select count(1) from ex_exam_papers
where paper_status = 1
and is_deleted = 0
</select>
<select id="getExamCount" resultType="java.lang.Integer">
select count(1) from ex_exam_info
where status = 1
and publish_status = 1
and is_deleted = 0
</select>
<select id="getIndustryDimensionData" resultType="java.util.Map">
<![CDATA[
SELECT
COUNT ( q.ID ) AS "value",
( ind.industry_name || ': ' || COUNT ( q.ID ) || ' 条' ) AS "name"
FROM
tbl_industry ind
LEFT JOIN ex_question_categories q ON q.industry_id = ind.industry_id
AND q.is_deleted = 0
AND q.status = 1
WHERE
ind.status = 1
GROUP BY
ind.industry_id,
ind.industry_name
ORDER BY
ind.industry_id
]]>
</select>
<select id="getAqServiceDimensionData" resultType="java.util.Map">
<![CDATA[
SELECT
COUNT ( q.ID ) AS "value",
( dict.dict_value || ': ' || COUNT ( q.ID ) || ' 条' ) AS "name"
FROM
ex_dict dict
LEFT JOIN ex_question_categories q ON q.service_type_id = dict.dict_key
AND q.is_deleted = 0
AND q.status = 1
WHERE
dict.code = 'serviceTypeDict'
AND dict.is_deleted = 0
AND dict.parent_id <> 0
GROUP BY
dict.dict_key,
dict.dict_value
ORDER BY
dict.dict_key
]]>
</select>
<select id="getExamTableData" resultType="java.util.Map">
<![CDATA[
-- 定义 CTE exam_Count,统计符合条件的考试数量
WITH exam_Count AS (
SELECT COUNT(1) AS "count"
FROM ex_exam_info
WHERE status = 1
AND publish_status = 1
AND is_deleted = 0
),
-- 定义 CTE scores,计算每个考试记录的得分比例和用时
scores AS (
SELECT
score.total_score / papers.total_score AS score,
score.exam_time_spent AS time_spent
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
)
-- 主查询,统计相关信息
SELECT
1 as "key",
(SELECT "count" FROM exam_Count) AS "examTimes",
(SELECT COUNT(1) FROM scores) AS "participants",
(SELECT AVG(time_spent) FROM scores) AS "averageTime",
ROUND((SELECT COUNT(1) FROM scores WHERE score >= 0.6) * 100.0 / (SELECT COUNT(1) FROM scores), 2) AS "passRate"
]]>
</select>
<select id="getScoreDistributionData" 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
),
-- 定义 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
)
-- 主查询部分,计算不同成绩区间的比例并精确到小数点后两位
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="getPaperDistributionData" resultType="java.util.Map">
SELECT COUNT
( 1 ) AS "value",
ind.industry_name || ': '|| COUNT( 1 ) || ' 套' AS "name"
FROM
tbl_industry ind
left join ex_exam_papers papers
on papers.industry_id = ind.industry_id
and papers.is_deleted = 0
AND papers.paper_status = 1
WHERE
ind.status = 1
GROUP BY
ind.industry_id ,
ind.industry_name
ORDER BY
ind.industry_id
</select>
<select id="getExamAnswerDetails" resultType="java.util.Map">
</select>
</mapper>
Loading…
Cancel
Save