Ver Fonte

更新成绩统计

Administrator há 1 ano atrás
pai
commit
d38b99d6d2
14 ficheiros alterados com 263 adições e 15 exclusões
  1. 21 3
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/score/ScoreDataController.java
  2. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreData.java
  3. 5 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataDetail.java
  4. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataBo.java
  5. 7 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataDetailBo.java
  6. 5 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataDetailVo.java
  7. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataVo.java
  8. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataDetailMapper.java
  9. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataMapper.java
  10. 163 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/score/ScoreDataServiceImpl.java
  11. 13 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/score/IScoreDataService.java
  12. 17 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataDetailMapper.xml
  13. 2 1
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataMapper.xml
  14. 4 3
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataStudentMapper.xml

+ 21 - 3
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/score/ScoreDataController.java

@@ -169,6 +169,15 @@ public class ScoreDataController extends BaseController {
         return AjaxResult.success(map);
     }
 
+    /**
+     * 后台首页成绩统计列表
+     */
+    @PostMapping("/indexList")
+    public TableDataInfo indexList(@RequestBody ScoreData scoreData)
+    {
+        return TableDataInfo.build(scoreDataService.indexList(scoreData));
+    }
+
 
     /**
      * 成绩年级统计
@@ -204,13 +213,13 @@ public class ScoreDataController extends BaseController {
      * 班级总分平均分排名统计折线
      */
     @PostMapping("/avgRankZheXian")
-    public Map<String,Object> avgRankZheXian(@RequestBody ScoreData scoreData)
+    public AjaxResult avgRankZheXian(@RequestBody ScoreData scoreData)
     {
-        return scoreDataService.classRankZheXian(scoreData);
+        return AjaxResult.success(scoreDataService.classRankZheXian(scoreData));
     }
 
     /**
-     * 班级总分平均分人数统计
+     * 班级总分平均分人数统计
      */
     @PostMapping("/avgRank")
     public TableDataInfo<ScoreDataVo> avgRank(@RequestBody ScoreData scoreData)
@@ -218,4 +227,13 @@ public class ScoreDataController extends BaseController {
         List<ScoreDataVo> scoreDataVos = scoreDataService.avgRank(scoreData);
         return TableDataInfo.build(scoreDataVos);
     }
+
+    /**
+     * 年级分数段统计
+     */
+    @PostMapping("/bingTuRank")
+    public AjaxResult bingTuRank(@RequestBody ScoreData scoreData)
+    {
+        return AjaxResult.success(scoreDataService.bingTuRank(scoreData));
+    }
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreData.java

@@ -45,6 +45,12 @@ public class ScoreData extends TenantEntity {
      */
     private String scoreClassId;
 
+    /**
+     * 学生姓名只做查询使用
+     */
+    @TableField(exist = false)
+    private String scoreDataName;
+
     /**
      * 接收班级名称
      */

+ 5 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataDetail.java

@@ -55,7 +55,7 @@ public class ScoreDataDetail extends TenantEntity {
     /**
      * 成绩
      */
-    private String score;
+    private Double score;
 
     /**
      * 满分
@@ -66,6 +66,9 @@ public class ScoreDataDetail extends TenantEntity {
      * 备注
      */
     private String remark;
-
+    /**
+     * 学科平均分
+     */
+    private String avg;
 
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataBo.java

@@ -92,4 +92,10 @@ public class ScoreDataBo extends BaseEntity {
     @TableField(exist = false)
     private String xueke;
 
+    /**
+     * 学生姓名只做查询使用
+     */
+    @TableField(exist = false)
+    private String scoreDataName;
+
 }

+ 7 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataDetailBo.java

@@ -63,13 +63,13 @@ public class ScoreDataDetailBo extends BaseEntity {
      * 成绩
      */
     //@NotBlank(message = "成绩不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long score;
+    private Double score;
 
     /**
      * 满分
      */
     //@NotBlank(message = "满分不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long manfen;
+    private String manfen;
 
     /**
      * 备注
@@ -77,6 +77,11 @@ public class ScoreDataDetailBo extends BaseEntity {
     //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
+    /**
+     * 学科平均分
+     */
+    private String avg;
+
     @TableField(exist = false)
     private List<ScoreDataStudentBo> scoreDataStudentBoList;
 }

+ 5 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataDetailVo.java

@@ -65,7 +65,7 @@ public class ScoreDataDetailVo implements Serializable {
      * 成绩
      */
     @ExcelProperty(value = "成绩")
-    private String score;
+    private Double score;
 
     /**
      * 满分
@@ -78,6 +78,9 @@ public class ScoreDataDetailVo implements Serializable {
      */
     @ExcelProperty(value = "备注")
     private String remark;
-
+    /**
+     * 学科平均分
+     */
+    private String avg;
 
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataVo.java

@@ -66,6 +66,12 @@ public class ScoreDataVo implements Serializable {
     @TableField(exist = false)
     private int scoreSort;
 
+    /**
+     * 学生姓名只做查询使用
+     */
+    @TableField(exist = false)
+    private String scoreDataName;
+
     /**
      * 隐私设置 1:仅自己 2:仅本班 3:全部
      */

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataDetailMapper.java

@@ -1,9 +1,12 @@
 package org.dromara.system.mapper.score;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.system.domain.score.ScoreDataDetail;
 import org.dromara.system.domain.score.vo.ScoreDataDetailVo;
 
+import java.util.List;
+
 /**
  * 成绩_成绩详情idMapper接口
  *
@@ -12,4 +15,6 @@ import org.dromara.system.domain.score.vo.ScoreDataDetailVo;
  */
 public interface ScoreDataDetailMapper extends BaseMapperPlus<ScoreDataDetail, ScoreDataDetailVo> {
 
+    @InterceptorIgnore(tenantLine = "true")
+    List<ScoreDataDetailVo> selectListByscoreDataNameId(List<Long> scoreDataNameIds);
 }

+ 3 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataMapper.java

@@ -1,5 +1,6 @@
 package org.dromara.system.mapper.score;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.system.domain.score.ScoreData;
 import org.dromara.system.domain.score.vo.ScoreDataVo;
@@ -15,6 +16,7 @@ import java.util.List;
 public interface ScoreDataMapper extends BaseMapperPlus<ScoreData, ScoreDataVo> {
 
    List<ScoreDataVo> classRank (ScoreData scoreData);
-   List<ScoreDataVo> avgRank (ScoreData scoreData);
+
+    List<ScoreDataVo> avgRank (ScoreData scoreData);
 
 }

+ 163 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/score/ScoreDataServiceImpl.java

@@ -191,9 +191,12 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         double classZf = 0D;
         //获取各科成绩满分
         List<ScoreDataMfBo> scoreDataMfBoList = bo.getScoreDataMfBoList();
+        //组装一个学科 满分的MAP
+        Map<String,String> map = new HashMap<>();
         if (scoreDataMfBoList != null && scoreDataMfBoList.size() > 0) {
             for (ScoreDataMfBo scoreDataMfBo : scoreDataMfBoList) {
                 scoreDataMfBo.setScoreId(scoreId);
+                map.put(scoreDataMfBo.getXueke(),scoreDataMfBo.getManfen());
             }
             scoreDataMfMapper.insertBatch(MapstructUtils.convert(scoreDataMfBoList, org.dromara.system.domain.score.ScoreDataMf.class));
         }
@@ -211,6 +214,8 @@ public class ScoreDataServiceImpl implements IScoreDataService {
                         scoreDataDetailBo.setScoreId(scoreId);
                         scoreDataDetailBo.setScoreDataName(scoreDataStudentBo.getScoreDataName());
                         scoreDataDetailBo.setScoreDataNameId(scoreDataStudentBo.getScoreDataNameId());
+                        //插入满分
+                        scoreDataDetailBo.setManfen(map.get(scoreDataDetailBo.getXueke()));
                     }
                     classZf = classZf + zf;
                     scoreDataStudentBo.setZongfen(zf);
@@ -429,6 +434,62 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         return scoreDataStudentVos;
     }
 
+    /**
+     * 后台首页成绩统计列表
+     */
+    @Override
+    public List<ScoreDataStudentVo> indexList(ScoreData scoreData) {
+        //可以搜索学生姓名&选择班级进行年级排名
+        //接收考试时间和考试类型,所有考试时间相同的
+        String scoreClassName = scoreData.getScoreClassName();
+        //截取两位年级
+        String grade = scoreClassName.substring(0, 2);
+        scoreData.setScoreClassName(grade);
+        //先去获取所有的考试学生
+        //获取年级所有学生排名
+        List<ScoreDataStudentVo> scoreDataStudentVos = scoreDataStudentMapper.gradeRank(scoreData);
+        Long scoreId = scoreData.getScoreId();
+        Map<String,Double> map = new HashMap<>();
+        if (scoreId != null){
+            //过滤出本班学生id
+            scoreDataStudentVos =   scoreDataStudentVos.stream().filter(scoreDataStudentVo -> scoreDataStudentVo.getScoreId().equals(scoreId)).sorted(Comparator.comparing(ScoreDataStudentVo::getZongfen)).collect(Collectors.toList());
+            //去查询对应学生的具体学科成绩/计算学科平均分
+            //获取所有学生id
+            List<Long> scoreDataNameIds = scoreDataStudentVos.stream().map(ScoreDataStudentVo::getScoreDataNameId).collect(Collectors.toList());
+            List<ScoreDataDetailVo> scoreDataDetailVos = scoreDataDetailMapper.selectListByscoreDataNameId(scoreDataNameIds);
+            //根据学科进行分组
+            if (scoreDataDetailVos != null && scoreDataDetailVos.size() > 0){
+                Map<String, List<ScoreDataDetailVo>> xuekeCollect = scoreDataDetailVos.parallelStream().collect(Collectors.groupingBy(ScoreDataDetailVo::getXueke));
+                for (String xueke : xuekeCollect.keySet()) {
+                    List<ScoreDataDetailVo> scoreDataDetailVosXueke = xuekeCollect.get(xueke);
+                    //获取学科总分
+                    double sum = scoreDataDetailVosXueke.stream().mapToDouble(ScoreDataDetailVo::getScore).sum();
+                    //计算学科平均分 = 学科总分 /人数
+                    double xueKeAvg = sum / scoreDataNameIds.size();
+                    map.put(xueke,xueKeAvg);
+                }
+            }
+            //总成绩均分
+            double sum = scoreDataStudentVos.stream().mapToDouble(ScoreDataStudentVo::getZongfen).sum();
+            double zongFenAvg = sum / scoreDataStudentVos.size();
+
+            //给学生对象插入数据
+            //对学生成绩根据学生id进行分组
+            Map<Long, List<ScoreDataDetailVo>> scoreDataNameIdCollect = scoreDataDetailVos.parallelStream().collect(Collectors.groupingBy(ScoreDataDetailVo::getScoreDataNameId));
+            for (ScoreDataStudentVo scoreDataStudentVo : scoreDataStudentVos) {
+                scoreDataStudentVo.setAvg(String.valueOf(zongFenAvg));
+                List<ScoreDataDetailVo> scoreDataDetailVosList = scoreDataNameIdCollect.get(scoreDataStudentVo.getScoreDataNameId());
+                if (scoreDataDetailVosList != null && scoreDataDetailVosList.size() > 0){
+                    for (ScoreDataDetailVo scoreDataDetailVo : scoreDataDetailVosList) {
+                        scoreDataDetailVo.setAvg(String.valueOf(map.get(scoreDataDetailVo.getXueke())));
+                    }
+                }
+                scoreDataStudentVo.setScoreDataDetailVoList(scoreDataDetailVosList);
+            }
+        }
+        return scoreDataStudentVos;
+    }
+
 
     /**
      * 成绩年级统计
@@ -452,6 +513,12 @@ public class ScoreDataServiceImpl implements IScoreDataService {
      */
     @Override
     public List<ScoreDataVo> classRank(ScoreData scoreData) {
+        //可以搜索学生姓名&选择班级进行年级排名
+        //接收考试时间和考试类型,所有考试时间相同的
+        String scoreClassName = scoreData.getScoreClassName();
+        //截取两位年级
+        String grade = scoreClassName.substring(0, 2);
+        scoreData.setScoreClassName(grade);
         return baseMapper.classRank(scoreData);
     }
 
@@ -463,7 +530,12 @@ public class ScoreDataServiceImpl implements IScoreDataService {
     @Override
     public Map<String, Object> classRankZheXian(ScoreData scoreData) {
         Map<String, Object> map = new HashMap<>(3);
-
+        //可以搜索学生姓名&选择班级进行年级排名
+        //接收考试时间和考试类型,所有考试时间相同的
+        String scoreClassName = scoreData.getScoreClassName();
+        //截取两位年级
+        String grade = scoreClassName.substring(0, 2);
+        scoreData.setScoreClassName(grade);
         //接受考试类型/考试时间/考试班级名称
         //查询出所有对应班级的考试id和平均分
         List<ScoreDataVo> scoreDataVos = baseMapper.avgRank(scoreData);
@@ -508,6 +580,12 @@ public class ScoreDataServiceImpl implements IScoreDataService {
      */
     @Override
     public List<ScoreDataVo> avgRank(ScoreData scoreData) {
+        //可以搜索学生姓名&选择班级进行年级排名
+        //接收考试时间和考试类型,所有考试时间相同的
+        String scoreClassName = scoreData.getScoreClassName();
+        //截取两位年级
+        String grade = scoreClassName.substring(0, 2);
+        scoreData.setScoreClassName(grade);
         //接受考试类型/考试时间/考试班级名称
         //查询出所有对应班级的考试id和平均分
         List<ScoreDataVo> scoreDataVos = baseMapper.avgRank(scoreData);
@@ -537,6 +615,90 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         return scoreDataVos;
     }
 
+    /**
+     * 年级分数段统计
+     * @param scoreData
+     * @return
+     */
+    @Override
+    public Map<String, Object> bingTuRank(ScoreData scoreData) {
+        Map<String, Object> map = new HashMap<>(8);
+        int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0;
+        String aZ = "0%", bZ = "0%", cZ = "0%", dZ = "0%", eZ = "0%", fZ = "0%", gZ = "0%", hZ = "0%";
+        map.put("One", a);
+        map.put("Tow", b);
+        map.put("Thr", c);
+        map.put("For", d);
+        map.put("Fiv", e);
+        map.put("Six", f);
+        map.put("Sev", g);
+        map.put("Eig", h);
+        map.put("OneZ", aZ);
+        map.put("TowZ", bZ);
+        map.put("ThrZ", cZ);
+        map.put("ForZ", dZ);
+        map.put("FivZ", eZ);
+        map.put("SixZ", fZ);
+        map.put("SevZ", gZ);
+        map.put("EigZ", hZ);
+        //可以搜索学生姓名&选择班级进行年级排名
+        //接收考试时间和考试类型,所有考试时间相同的
+        String scoreClassName = scoreData.getScoreClassName();
+        //截取两位年级
+        String grade = scoreClassName.substring(0, 2);
+        scoreData.setScoreClassName(grade);
+        List<ScoreDataVo> scoreDataVos = baseMapper.avgRank(scoreData);
+        if (scoreDataVos != null && scoreDataVos.size() > 0) {
+            long[] scoreIds = scoreDataVos.stream().mapToLong(ScoreDataVo::getScoreId).toArray();
+            //拿着考试id去查询对应学生
+            List<ScoreDataStudentVo> scoreDataStudentVos = scoreDataStudentMapper.selectScoreByScoreIds(scoreIds);
+            //判断学生的总分所在分数段
+            for (ScoreDataStudentVo scoreDataStudentVo : scoreDataStudentVos) {
+                Double zongfen = scoreDataStudentVo.getZongfen();
+                if (zongfen >= 0 && zongfen <= 100) {
+                    a++;
+                } else if (zongfen > 100 && zongfen <= 200) {
+                    b++;
+                } else if (zongfen > 200 && zongfen <= 300) {
+                    c++;
+                } else if (zongfen > 300 && zongfen <= 400) {
+                    d++;
+                } else if (zongfen > 400 && zongfen <= 500) {
+                    e++;
+                } else if (zongfen > 500 && zongfen <= 600) {
+                    f++;
+                } else if (zongfen > 600 && zongfen <= 700) {
+                    g++;
+                } else if (zongfen > 700) {
+                    h++;
+                }
+            }
+            //总人数
+            int size = scoreDataStudentVos.size();
+            if (size > 0){
+                DecimalFormat df = new DecimalFormat("##.0%");
+                map.put("OneZ", df.format(size/a));
+                map.put("TowZ", df.format(size/b));
+                map.put("ThrZ", df.format(size/c));
+                map.put("ForZ", df.format(size/d));
+                map.put("FivZ", df.format(size/e));
+                map.put("SixZ", df.format(size/f));
+                map.put("SevZ", df.format(size/g));
+                map.put("EigZ", df.format(size/h));
+            }
+            map.put("One", a);
+            map.put("Tow", b);
+            map.put("Thr", c);
+            map.put("For", d);
+            map.put("Fiv", e);
+            map.put("Six", f);
+            map.put("Sev", g);
+            map.put("Eig", h);
+        }
+        return map;
+
+    }
+
     /**
      * 查询成绩
      *

+ 13 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/score/IScoreDataService.java

@@ -71,6 +71,11 @@ public interface IScoreDataService {
      */
     public List<ScoreDataStudentVo> gradeRank(ScoreData scoreData);
 
+    /**
+     * 后台首页成绩统计列表
+     */
+    public List<ScoreDataStudentVo> indexList(ScoreData scoreData);
+
     /**
      * 成绩学科统计
      * @param scoreDatabo
@@ -88,6 +93,14 @@ public interface IScoreDataService {
      */
     public List<ScoreDataVo> avgRank(ScoreData scoreData);
 
+    /**
+     * 年级分数段统计
+     * @param scoreData
+     * @return
+     */
+    public Map<String,Object> bingTuRank(ScoreData scoreData);
+
+
     /**
      * 查询成绩
      *

+ 17 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataDetailMapper.xml

@@ -4,4 +4,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.system.mapper.score.ScoreDataDetailMapper">
 
+    <resultMap type="org.dromara.system.domain.score.vo.ScoreDataDetailVo" id="ScoreDataDetailResult">
+        <result property="scoreDetailId"    column="score_detail_id"    />
+        <result property="scoreId"    column="score_id"    />
+        <result property="xueke"    column="xueke"    />
+        <result property="score"    column="score"    />
+        <result property="manfen"    column="manfen"    />
+        <result property="scoreDataName"    column="score_data_name"    />
+        <result property="scoreDataNameId"    column="score_data_name_id"    />
+    </resultMap>
+    <select id="selectListByscoreDataNameId" parameterType="list" resultMap="ScoreDataDetailResult">
+
+        select score_data_name_id,xueke,score,manfen,avg from score_data_detail
+        where score_data_name_id in
+        <foreach item="scoreDataNameId" open="(" close=")" collection="list" separator=",">
+            #{scoreDataNameId}
+        </foreach>
+    </select>
 </mapper>

+ 2 - 1
ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataMapper.xml

@@ -61,7 +61,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="avgRank" parameterType="org.dromara.system.domain.score.ScoreData" resultMap="ScoreDataVoResult">
         select
         d.score_id,
-        d.avg
+        d.avg,
+        d.score_class_name
         FROM
         score_data d
         <where>

+ 4 - 3
ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataStudentMapper.xml

@@ -96,7 +96,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
         )
         <where>
-            <if test="scoreDataName != null  and scoreDataName != ''"> and d.score_type = #{scoreType}</if>
+            <if test="scoreDataName != null  and scoreDataName != ''"> and s.score_data_name = #{scoreDataName}</if>
         </where>
         order by s.zongfen  DESC
     </select>
@@ -120,10 +120,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="scoreType != null  and scoreType != ''"> and d.score_type = #{scoreType}</if>
             <if test="scoreTime != null "> and d.score_time = #{scoreTime}</if>
             <if test="scoreId != null "> and d.score_id = #{scoreId}</if>
-            <if test="scoreDataName != null and scoreDataName"> and d.score_data_name = #{scoreDataName}</if>
             <if test="scoreClassName != null  and scoreClassName != ''"> and d.score_class_name like concat( #{scoreClassName}, '%')</if>
         </where>
-            ) and dd.xueke=#{xueke} order by dd.score  DESC
+            ) and dd.xueke=#{xueke}
+          <if test="scoreDataName != null and scoreDataName">and dd.score_data_name = #{scoreDataName}</if>
+        order by dd.score  DESC
     </select>
 
 </mapper>