Bladeren bron

更新成绩统计

Administrator 1 jaar geleden
bovenliggende
commit
f1e1f2d403
19 gewijzigde bestanden met toevoegingen van 299 en 54 verwijderingen
  1. 0 1
      pom.xml
  2. 1 1
      ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
  3. 6 0
      ruoyi-modules/ruoyi-system/pom.xml
  4. 21 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/score/ScoreDataController.java
  5. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/notice/XiaoyuanNotice.java
  6. 7 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/notice/bo/XiaoyuanNoticeBo.java
  7. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/notice/vo/XiaoyuanNoticeVo.java
  8. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreData.java
  9. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataStudent.java
  10. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataStudentBo.java
  11. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataStudentVo.java
  12. 17 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataVo.java
  13. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataMapper.java
  14. 4 4
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataStudentMapper.java
  15. 122 23
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/notice/XiaoyuanNoticeServiceImpl.java
  16. 55 13
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/score/ScoreDataServiceImpl.java
  17. 10 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/score/IScoreDataService.java
  18. 29 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataMapper.xml
  19. 15 1
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataStudentMapper.xml

+ 0 - 1
pom.xml

@@ -92,7 +92,6 @@
     <!-- 依赖声明 -->
     <dependencyManagement>
         <dependencies>
-
             <!-- SpringBoot的依赖配置-->
             <dependency>
                 <groupId>org.springframework.boot</groupId>

+ 1 - 1
ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java

@@ -17,7 +17,7 @@ public class DromaraApplication {
         SpringApplication application = new SpringApplication(DromaraApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  RuoYi-Vue-Plus启动成功   ლ(´ڡ`ლ)゙");
+        System.out.println("(♥◠‿◠)ノ゙  智能校管家启动成功   ლ(´ڡ`ლ)゙");
     }
 
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/pom.xml

@@ -89,6 +89,12 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-common-encrypt</artifactId>
         </dependency>
+        <!-- 阿里JSON解析器 -->
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.25</version>
+        </dependency>
 
     </dependencies>
     <properties>

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

@@ -145,7 +145,7 @@ public class ScoreDataController extends BaseController {
     @PostMapping("/indexPaiMing")
     public AjaxResult indexPaiMing(@RequestBody ScoreData scoreData)
     {
-        List<ScoreDataStudent> scoreDataStudentList = scoreDataService.indexPaiMing(scoreData);
+        List<ScoreDataStudentVo> scoreDataStudentList = scoreDataService.indexPaiMing(scoreData);
         return AjaxResult.success(scoreDataStudentList);
     }
 
@@ -189,4 +189,24 @@ public class ScoreDataController extends BaseController {
         List<ScoreDataDetailVo> scoreDataDetailVo = scoreDataService.xuekeRank(scoreData);
         return TableDataInfo.build(scoreDataDetailVo);
     }
+
+    /**
+     * 班级总分平均分排名统计
+     */
+    @PostMapping("/classRank")
+    public TableDataInfo<ScoreDataVo> classRank(@RequestBody ScoreData scoreData)
+    {
+        List<ScoreDataVo> scoreDataVos = scoreDataService.classRank(scoreData);
+        return TableDataInfo.build(scoreDataVos);
+    }
+
+    /**
+     * 班级总分平均分人数统计
+     */
+    @PostMapping("/avgRank")
+    public TableDataInfo<ScoreDataVo> avgRank(@RequestBody ScoreData scoreData)
+    {
+        List<ScoreDataVo> scoreDataVos = scoreDataService.avgRank(scoreData);
+        return TableDataInfo.build(scoreDataVos);
+    }
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/notice/XiaoyuanNotice.java

@@ -95,7 +95,7 @@ public class XiaoyuanNotice extends TenantEntity {
     /**
      * 头像地址
      */
-    private String avatar;
+    private Long avatar;
 
     /**
      * 评论

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

@@ -1,5 +1,6 @@
 package org.dromara.system.domain.notice.bo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -108,7 +109,7 @@ public class XiaoyuanNoticeBo extends BaseEntity {
      * 头像地址
      */
     //@NotBlank(message = "头像地址不能为空", groups = { AddGroup.class, EditGroup.class })
-    private String avatar;
+    private Long avatar;
 
     /**
      * 评论
@@ -127,6 +128,10 @@ public class XiaoyuanNoticeBo extends BaseEntity {
      */
     //@NotBlank(message = "收藏不能为空", groups = { AddGroup.class, EditGroup.class })
     private String collect;
-
+    //判断更新的类型 1:评论 2:点赞 3:收藏
+    @TableField(exist = false)
+    private String updateType;
+    @TableField(exist = false)
+    private String deleteId;
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/notice/vo/XiaoyuanNoticeVo.java

@@ -118,7 +118,7 @@ public class XiaoyuanNoticeVo implements Serializable {
      * 头像地址
      */
     @ExcelProperty(value = "头像地址")
-    private String avatar;
+    private Long avatar;
 
     /**
      * 评论

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

@@ -65,7 +65,7 @@ public class ScoreData extends TenantEntity {
     /**
      * 班级平均分
      */
-    private String avg;
+    private double avg;
 
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/ScoreDataStudent.java

@@ -50,7 +50,7 @@ public class ScoreDataStudent extends TenantEntity {
     /**
      * 总分
      */
-    private int zongfen;
+    private Double zongfen;
 
     /**
      * 平均分

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/bo/ScoreDataStudentBo.java

@@ -57,7 +57,7 @@ public class ScoreDataStudentBo extends BaseEntity {
      * 总分
      */
     //@NotBlank(message = "总分不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long zongfen;
+    private Double zongfen;
 
     /**
      * 平均分

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/score/vo/ScoreDataStudentVo.java

@@ -62,7 +62,7 @@ public class ScoreDataStudentVo implements Serializable {
      * 总分
      */
     @ExcelProperty(value = "总分")
-    private String zongfen;
+    private Double zongfen;
 
     /**
      * 平均分

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

@@ -58,6 +58,11 @@ public class ScoreDataVo implements Serializable {
      */
     @ExcelProperty(value = "接收班级名称")
     private String scoreClassName;
+    /**
+     * 排序
+     */
+    @TableField(exist = false)
+    private String scoreSort;
 
     /**
      * 隐私设置 1:仅自己 2:仅本班 3:全部
@@ -80,7 +85,7 @@ public class ScoreDataVo implements Serializable {
      * 班级平均分
      */
     @ExcelProperty(value = "班级平均分")
-    private String avg;
+    private double avg;
     @TableField(exist = false)
 
     private List<ScoreDataStudentVo> scoreDataStudentVoList;
@@ -106,4 +111,15 @@ public class ScoreDataVo implements Serializable {
      */
     @TableField(exist = false)
     private String percentage;
+
+    /**
+     * 平均分以上
+     */
+    @TableField(exist = false)
+    private int up;
+    @TableField(exist = false)
+    /**
+     * 平均分以下人数
+     */
+    private int down;
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataMapper.java

@@ -4,6 +4,8 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.system.domain.score.ScoreData;
 import org.dromara.system.domain.score.vo.ScoreDataVo;
 
+import java.util.List;
+
 /**
  * 成绩Mapper接口
  *
@@ -11,4 +13,8 @@ import org.dromara.system.domain.score.vo.ScoreDataVo;
  * @date 2023-08-17
  */
 public interface ScoreDataMapper extends BaseMapperPlus<ScoreData, ScoreDataVo> {
+
+   List<ScoreDataVo> classRank (ScoreData scoreData);
+   List<ScoreDataVo> avgRank (ScoreData scoreData);
+
 }

+ 4 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/score/ScoreDataStudentMapper.java

@@ -26,17 +26,17 @@ public interface ScoreDataStudentMapper extends BaseMapperPlus<ScoreDataStudent,
      */
     @InterceptorIgnore(tenantLine = "true")
 
-    public List<ScoreDataStudent> selectScoreDataByScoreClassId(String scoreClassId);
+    public List<ScoreDataStudentVo> selectScoreDataByScoreClassId(String scoreClassId);
     @InterceptorIgnore(tenantLine = "true")
 
     public List<ScoreDataStudentVo> selectScoreDataForParents(Long scoreId);
     @InterceptorIgnore(tenantLine = "true")
-
     public List<ScoreDataStudentVo> selectScoreByScoreId(Long scoreId);
-    @InterceptorIgnore(tenantLine = "true")
+    public List<ScoreDataStudentVo> selectScoreByScoreIds(long[] scoreIds);
+
     public List<ScoreDataStudentVo> gradeRank(ScoreData scoreData);
 
-    @InterceptorIgnore(tenantLine = "true")
+
     public List<ScoreDataDetailVo> xuekeRank(ScoreData scoreData);
 
 

+ 122 - 23
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/notice/XiaoyuanNoticeServiceImpl.java

@@ -1,41 +1,37 @@
 package org.dromara.system.service.impl.notice;
 
-import cn.hutool.core.util.ObjectUtil;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.api.client.util.SecurityUtils;
-import org.dromara.common.core.constant.UserConstants;
-import org.dromara.common.core.domain.model.LoginUser;
+
+import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StreamUtils;
+
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
-import org.dromara.common.mybatis.helper.DataBaseHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.domain.FormalParentsStudent;
 import org.dromara.system.domain.FormalTeacherClass;
-import org.dromara.system.domain.SysDept;
-import org.dromara.system.domain.SysUser;
-import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.domain.notice.XiaoyuanNotice;
 import org.dromara.system.domain.notice.bo.XiaoyuanNoticeBo;
 import org.dromara.system.domain.notice.vo.XiaoyuanNoticeVo;
+import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.FormalParentsStudentMapper;
 import org.dromara.system.mapper.FormalTeacherClassMapper;
+import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.mapper.notice.XiaoyuanNoticeMapper;
 import org.dromara.system.service.notice.IXiaoyuanNoticeService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
 
 /**
  * 校园新闻Service业务层处理
@@ -48,11 +44,13 @@ import java.util.Collection;
 public class XiaoyuanNoticeServiceImpl implements IXiaoyuanNoticeService {
 
     private final XiaoyuanNoticeMapper baseMapper;
-    @Autowired
-    private FormalTeacherClassMapper formalTeacherClassMapper;
 
-    @Autowired
-    private FormalParentsStudentMapper formalParentsStudentMapper;
+    private final FormalTeacherClassMapper formalTeacherClassMapper;
+
+
+    private final FormalParentsStudentMapper formalParentsStudentMapper;
+
+    private final SysUserMapper sysUserMapper;
 
     /**
      * 查询校园新闻
@@ -152,7 +150,6 @@ public class XiaoyuanNoticeServiceImpl implements IXiaoyuanNoticeService {
         lqw.like(StringUtils.isNotBlank(bo.getSenderName()), XiaoyuanNotice::getSenderName, bo.getSenderName());
         lqw.eq(StringUtils.isNotBlank(bo.getSenderDept()), XiaoyuanNotice::getSenderDept, bo.getSenderDept());
         lqw.like(StringUtils.isNotBlank(bo.getSchoolName()), XiaoyuanNotice::getSchoolName, bo.getSchoolName());
-        lqw.eq(StringUtils.isNotBlank(bo.getAvatar()), XiaoyuanNotice::getAvatar, bo.getAvatar());
         lqw.eq(StringUtils.isNotBlank(bo.getComment()), XiaoyuanNotice::getComment, bo.getComment());
         lqw.eq(StringUtils.isNotBlank(bo.getPrised()), XiaoyuanNotice::getPrised, bo.getPrised());
         lqw.eq(StringUtils.isNotBlank(bo.getCollect()), XiaoyuanNotice::getCollect, bo.getCollect());
@@ -166,6 +163,10 @@ public class XiaoyuanNoticeServiceImpl implements IXiaoyuanNoticeService {
     public Boolean insertByBo(XiaoyuanNoticeBo bo) {
         XiaoyuanNotice add = MapstructUtils.convert(bo, XiaoyuanNotice.class);
         validEntityBeforeSave(add);
+        add.setSenderId(String.valueOf(LoginHelper.getUserId()));
+        add.setSenderName(LoginHelper.getLoginUser().getNickname());
+        SysUserVo sysUserVo = sysUserMapper.selectUserById(LoginHelper.getUserId());
+        add.setAvatar(sysUserVo.getAvatar());
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setNoticeId(add.getNoticeId());
@@ -177,9 +178,107 @@ public class XiaoyuanNoticeServiceImpl implements IXiaoyuanNoticeService {
      * 修改校园新闻
      */
     @Override
-    public Boolean updateByBo(XiaoyuanNoticeBo bo) {
-        XiaoyuanNotice update = MapstructUtils.convert(bo, XiaoyuanNotice.class);
-        validEntityBeforeSave(update);
+    public Boolean updateByBo(XiaoyuanNoticeBo xiaoyuanNotice) {
+
+        //修改之前去查询
+        XiaoyuanNoticeVo xiaoyuanNoticeUpdate = baseMapper.selectVoById(xiaoyuanNotice.getNoticeId());
+        List<JSONObject> map = new ArrayList<>();
+        //判断是评论还是点赞还是收藏
+        UUID uuid = UUID.randomUUID();
+        String deleteId = xiaoyuanNotice.getDeleteId();
+        if (Constants.ONE.equals(xiaoyuanNotice.getUpdateType())) {
+            String comment = xiaoyuanNotice.getComment();
+            if (StringUtils.isNotBlank(comment)) {
+                String updateComment = xiaoyuanNoticeUpdate.getComment();
+                JSONObject jsonObject = JSONObject.parseObject(comment);
+                //没有id就是新增
+                if (StringUtils.isEmpty(deleteId)) {
+                    //给新增参数增加id
+                    jsonObject.put("id", uuid);
+                    map.add(jsonObject);
+                    xiaoyuanNotice.setComment(map.toString());
+                    //如果数据库中原始数据不为空
+                    if (StringUtils.isNotBlank(updateComment)) {
+                        updateComment = updateComment.replace("[", "").replace("]", "");
+                        ArrayList<Object> arr = new ArrayList<>(updateComment.length());
+                        Collections.addAll(arr, updateComment);
+                        arr.add(jsonObject);
+                        xiaoyuanNotice.setComment(arr.toString());
+                    }
+                } else {
+                    //删除原始数据
+                    JSONArray jsonArray = JSONArray.parseArray(updateComment);
+                    jsonArray.removeIf(object -> xiaoyuanNotice.getDeleteId().equals(((JSONObject) object).get("id")));
+                    xiaoyuanNotice.setComment("");
+                    if (jsonArray.size() > 0) {
+                        xiaoyuanNotice.setComment(jsonArray.toString());
+                    }
+                }
+            }
+        } else if ("2".equals(xiaoyuanNotice.getUpdateType())) {
+            String prised = xiaoyuanNotice.getPrised();
+            String updatePrised = xiaoyuanNoticeUpdate.getPrised();
+            if (StringUtils.isNotBlank(prised)) {
+                JSONObject jsonObject = JSONObject.parseObject(prised);
+                //给新增参数增加id
+                //没有id就是新增
+                if (StringUtils.isEmpty(deleteId)) {
+                    jsonObject.put("id", uuid);
+                    map.add(jsonObject);
+                    xiaoyuanNotice.setPrised(map.toString());
+                    //如果数据库中原始数据不为空
+                    if (StringUtils.isNotBlank(updatePrised)) {
+                        updatePrised = updatePrised.replace("[", "").replace("]", "");
+                        ArrayList<Object> arr = new ArrayList<>(updatePrised.length());
+                        Collections.addAll(arr, updatePrised);
+                        arr.add(jsonObject);
+                        xiaoyuanNotice.setPrised(arr.toString());
+                    }
+                } else {
+
+                    //删除原始数据
+                    JSONArray jsonArray = JSONArray.parseArray(updatePrised);
+                    jsonArray.removeIf(object -> xiaoyuanNotice.getDeleteId().equals(((JSONObject) object).get("id")));
+                    xiaoyuanNotice.setPrised("");
+                    if (jsonArray.size() > 0) {
+                        xiaoyuanNotice.setPrised(jsonArray.toString());
+                    }
+                }
+            }
+        } else if ("3".equals(xiaoyuanNotice.getUpdateType())) {
+            String collect = xiaoyuanNotice.getCollect();
+            String updateCollect = xiaoyuanNoticeUpdate.getCollect();
+            if (StringUtils.isNotBlank(collect)) {
+                JSONObject jsonObject = JSONObject.parseObject(collect);
+
+                //给新增参数增加id
+                //没有id就是新增
+                if (StringUtils.isEmpty(deleteId)) {
+                    jsonObject.put("id", uuid);
+                    map.add(jsonObject);
+                    xiaoyuanNotice.setCollect(map.toString());
+                    //如果数据库中原始数据不为空
+                    if (StringUtils.isNotBlank(updateCollect)) {
+                        updateCollect = updateCollect.replace("[", "").replace("]", "");
+                        ArrayList<Object> arr = new ArrayList<>(updateCollect.length());
+                        Collections.addAll(arr, updateCollect);
+                        arr.add(jsonObject);
+                        xiaoyuanNotice.setCollect(arr.toString());
+                    }
+                } else {
+                    //删除原始数据
+                    JSONArray jsonArray = JSONArray.parseArray(updateCollect);
+                    jsonArray.removeIf(object -> xiaoyuanNotice.getDeleteId().equals(((JSONObject) object).get("id")));
+                    xiaoyuanNotice.setCollect("");
+                    if (jsonArray.size() > 0) {
+                        xiaoyuanNotice.setCollect(jsonArray.toString());
+                    }
+                }
+            }
+        }
+
+        xiaoyuanNotice.setUpdateTime(DateUtils.getNowDate());
+        XiaoyuanNotice update = MapstructUtils.convert(xiaoyuanNotice, XiaoyuanNotice.class);
         return baseMapper.updateById(update) > 0;
     }
 
@@ -218,7 +317,7 @@ public class XiaoyuanNoticeServiceImpl implements IXiaoyuanNoticeService {
 
         QueryWrapper<XiaoyuanNoticeBo> wrapper = Wrappers.query();
         wrapper
-            .like(StringUtils.isNotBlank(bo.getCollect()), "concat", bo.getCollect());
+            .like(StringUtils.isNotBlank(bo.getCollect()), "collect", bo.getCollect());
         return wrapper;
     }
 }

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

@@ -188,7 +188,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
             bo.setScoreId(scoreId);
         }
         //班级总分
-        long classZf = 0L;
+        double classZf = 0D;
         //获取各科成绩满分
         List<ScoreDataMfBo> scoreDataMfBoList = bo.getScoreDataMfBoList();
         if (scoreDataMfBoList != null && scoreDataMfBoList.size() > 0) {
@@ -203,7 +203,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
             for (ScoreDataStudentBo scoreDataStudentBo : scoreDataStudentBoList) {
                 List<ScoreDataDetailBo> scoreDataDetailBoList = scoreDataStudentBo.getScoreDataDetailBoList();
                 if (scoreDataDetailBoList != null && scoreDataDetailBoList.size() > 0) {
-                    long zf = 0L;
+                    double zf = 0D;
                     //计算总分
                     for (ScoreDataDetailBo scoreDataDetailBo : scoreDataDetailBoList) {
                         //总分 = 总分 + 单科成绩
@@ -223,7 +223,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
                 }
             }
             //成绩排序
-            scoreDataStudentBoList = scoreDataStudentBoList.stream().sorted(Comparator.comparingLong(ScoreDataStudentBo::getZongfen).reversed()).collect(Collectors.toList());
+            scoreDataStudentBoList = scoreDataStudentBoList.stream().sorted(Comparator.comparingDouble(ScoreDataStudentBo::getZongfen).reversed()).collect(Collectors.toList());
             int index = 0;// 排名
             double lastScore = -1;// 最近一次的分
             for (int i = 0; i < scoreDataStudentBoList.size(); i++) {
@@ -238,8 +238,8 @@ public class ScoreDataServiceImpl implements IScoreDataService {
             scoreDataStudentMapper.insertBatch(MapstructUtils.convert(scoreDataStudentBoList, ScoreDataStudent.class));
 
             //计算班级总分平均分=各学生总分/学生人数
-            long classAvg = classZf / scoreDataStudentBoList.size();
-            add.setAvg(String.valueOf(classAvg));
+            double classAvg = classZf / scoreDataStudentBoList.size();
+            add.setAvg(classAvg);
             baseMapper.updateById(add);
         }
         return flag;
@@ -277,8 +277,8 @@ public class ScoreDataServiceImpl implements IScoreDataService {
      * 后台首页成绩统计排名
      */
     @Override
-    public List<ScoreDataStudent> indexPaiMing(ScoreData scoreData) {
-        List<ScoreDataStudent> scoreDataStudents = scoreDataStudentMapper.selectScoreDataByScoreClassId(scoreData.getScoreClassId());
+    public List<ScoreDataStudentVo> indexPaiMing(ScoreData scoreData) {
+        List<ScoreDataStudentVo> scoreDataStudents = scoreDataStudentMapper.selectScoreDataByScoreClassId(scoreData.getScoreClassId());
         if (scoreDataStudents != null && scoreDataStudents.size() > 0) {
             scoreDataStudents = scoreDataStudents.subList(0, Math.min(scoreDataStudents.size(), 10));
         }
@@ -293,11 +293,11 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         //获取缓存的数据
         Map<String, Object> cacheMap = RedisUtils.getCacheMap(CacheConstants.FEN_DUAN_NEW + scoreData.getScoreClassId());
         //获取班级id对应的最新考试id
-        Long scoreDataId = (Long) RedisUtils.getCacheObject(CacheConstants.SCORE_ID + scoreData.getScoreClassId());
+        String scoreDataId =  RedisUtils.getCacheObject(CacheConstants.SCORE_ID + scoreData.getScoreClassId());
         boolean flag = false;
         if (cacheMap != null) {
             //获取redis缓存的考试id
-            Long scoreId = (Long) cacheMap.get("scoreId");
+            String scoreId = String.valueOf(cacheMap.get("scoreId"));
             //判断最新一次考试id和缓存id是否匹配
             if (scoreDataId != null && scoreDataId.equals(scoreId)) {
                 //说明缓存就是最新的
@@ -317,13 +317,13 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         map.put("Six", f);
         map.put("Sev", g);
         map.put("Eig", h);
-        List<ScoreDataStudent> scoreDataStudents = scoreDataStudentMapper.selectScoreDataByScoreClassId(scoreData.getScoreClassId());
+        List<ScoreDataStudentVo> scoreDataStudents = scoreDataStudentMapper.selectScoreDataByScoreClassId(scoreData.getScoreClassId());
 
         if (scoreDataStudents != null && scoreDataStudents.size() > 0) {
-            int zongfen = 0;
+            double zongfen = 0;
             //计算各个分数段有多少人
-            for (ScoreDataStudent scoreDataDetail : scoreDataStudents) {
-                zongfen = scoreDataDetail.getZongfen();
+            for (ScoreDataStudentVo scoreDataStudent : scoreDataStudents) {
+                zongfen = scoreDataStudent.getZongfen();
                 if (zongfen >= 0 && zongfen <= 100) {
                     a++;
                 } else if (zongfen > 100 && zongfen <= 200) {
@@ -441,6 +441,48 @@ public class ScoreDataServiceImpl implements IScoreDataService {
         return scoreDataStudentMapper.xuekeRank(scoreData);
     }
 
+    /**
+     * 班级总分平均分排名统计
+     */
+    @Override
+    public List<ScoreDataVo> classRank(ScoreData scoreData) {
+        return baseMapper.classRank(scoreData);
+    }
+
+    /**
+     * 班级总分平均分人数统计
+     */
+    @Override
+    public List<ScoreDataVo> avgRank(ScoreData scoreData) {
+        //接受考试类型/考试时间/考试班级名称
+        //查询出所有对应班级的考试id和平均分
+        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 (ScoreDataVo scoreDataVo : scoreDataVos) {
+                Long scoreId = scoreDataVo.getScoreId();
+                //班级平均分
+                double avg = scoreDataVo.getAvg();
+                Map<Long, List<ScoreDataStudentVo>> collect = scoreDataStudentVos.stream().collect(Collectors.groupingBy(ScoreDataStudentVo::getScoreId));
+                //获取对应考试的学生集合
+                List<ScoreDataStudentVo> scoreDataStudentVosList = collect.get(scoreId);
+                //进行平均分的判断
+                if (scoreDataStudentVosList != null && scoreDataStudentVosList.size() > 0){
+                    List<ScoreDataStudentVo> scoreDataStudentVosListUp = scoreDataStudentVosList.stream().filter(scoreDataStudent -> scoreDataStudent.getZongfen() >= avg)
+                        .collect(Collectors.toList());
+                    List<ScoreDataStudentVo> scoreDataStudentVosListDown = scoreDataStudentVosList.stream().filter(scoreDataStudent -> scoreDataStudent.getZongfen() < avg)
+                        .collect(Collectors.toList());
+                    scoreDataVo.setUp(scoreDataStudentVosListUp.size());
+                    scoreDataVo.setDown(scoreDataStudentVosListDown.size());
+                }
+            }
+        }
+        return scoreDataVos;
+    }
+
     /**
      * 查询成绩
      *

+ 10 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/score/IScoreDataService.java

@@ -54,7 +54,7 @@ public interface IScoreDataService {
     /**
      * 后台首页成绩统计排名
      */
-    public List<ScoreDataStudent> indexPaiMing(ScoreData scoreData);
+    public List<ScoreDataStudentVo> indexPaiMing(ScoreData scoreData);
     /**
      * 后台首页成绩统计分段人数饼图
      */
@@ -78,6 +78,15 @@ public interface IScoreDataService {
      */
     public List<ScoreDataDetailVo> xuekeRank(ScoreData scoreData);
 
+    /**
+     * 班级总分平均分排名统计
+     */
+    public List<ScoreDataVo> classRank(ScoreData scoreData);
+    /**
+     * 班级总分平均分人数统计
+     */
+    public List<ScoreDataVo> avgRank(ScoreData scoreData);
+
     /**
      * 查询成绩
      *

+ 29 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataMapper.xml

@@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="scoreTitle"    column="score_title"    />
         <result property="scoreTime"    column="score_time"    />
         <result property="scoreClassId"    column="score_class_id"    />
+        <result property="scoreSort"    column="score_sort"    />
         <result property="scoreClassName"    column="score_class_name"    />
         <result property="privacyType"    column="privacy_type"    />
         <result property="scoreType"    column="score_type"    />
@@ -42,6 +43,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="manfen"    column="sdm_manfen"    />
         <result property="avg"    column="sdm_avg"    />
     </resultMap>
+    <select id="classRank" parameterType="org.dromara.system.domain.score.ScoreData" resultMap="ScoreDataVoResult">
+        SET @INDEX = 0;
+        SELECT
+        @INDEX := @INDEX + 1 AS `score_sort`,
+        d.score_class_name
+        FROM
+        score_data d
+        <where>
+            <if test="scoreType != null  and scoreType != ''"> and d.score_type = #{scoreType}</if>
+            <if test="scoreTime != null "> and d.score_time = #{scoreTime}</if>
+            <if test="scoreClassName != null  and scoreClassName != ''"> and d.score_class_name like concat( #{scoreClassName}, '%')</if>
+        </where>
+         order by d.avg  DESC
+    </select>
+
+
+    <select id="avgRank" parameterType="org.dromara.system.domain.score.ScoreData" resultMap="ScoreDataVoResult">
+        d.score_id,
+        d.avg
+        FROM
+        score_data d
+        <where>
+            <if test="scoreType != null  and scoreType != ''"> and d.score_type = #{scoreType}</if>
+            <if test="scoreTime != null "> and d.score_time = #{scoreTime}</if>
+            <if test="scoreClassName != null  and scoreClassName != ''"> and d.score_class_name like concat( #{scoreClassName}, '%')</if>
+            <if test="scoreClassId != null  "> and d.score_class_id = #{scoreClassId}</if>
+        </where>
+    </select>
 
 
 </mapper>

+ 15 - 1
ruoyi-modules/ruoyi-system/src/main/resources/mapper/score/ScoreDataStudentMapper.xml

@@ -25,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
     <select id="selectScoreDataByScoreClassId" parameterType="string" resultMap="ScoreDataStudentResult">
         select
-            s.zongfen,s.score_id,s.avg,s.details_type,s.score_sort
+            s.zongfen,s.score_id,s.avg,s.details_type,s.score_sort,s.score_data_name
         from
             score_data_student s
         WHERE
@@ -70,6 +70,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where b.score_id = #{scoreId}
     </select>
 
+    <select id="selectScoreByScoreIds" parameterType="String" resultMap="ScoreDataStudentResult">
+        SELECT
+            b.score_id,
+            b.zongfen
+        FROM
+            score_data_student b
+        where
+        b.score_id in
+        <foreach item="scoreId" open="(" close=")" collection="array" separator=",">
+           #{scoreId}
+        </foreach>
+    </select>
+
     <select id="gradeRank" parameterType="Long" resultMap="ScoreDataStudentResult">
         SET @index = 0;
         SELECT @index:=@index+1 AS `score_sort`,s.score_data_name,s.score_data_name_id,s.zongfen
@@ -79,6 +92,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>
             <if test="scoreType != null  and scoreType != ''"> and d.score_type = #{scoreType}</if>
             <if test="scoreTime != null "> and d.score_time = #{scoreTime}</if>
+            <if test="scoreClassId != null "> and d.score_class_id = #{scoreClassId}</if>
             <if test="scoreClassName != null  and scoreClassName != ''"> and d.score_class_name like concat( #{scoreClassName}, '%')</if>
         </where>
         order by s.zongfen  DESC