|
@@ -2,28 +2,30 @@ package org.dromara.system.service.impl.score;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import org.dromara.common.core.constant.CacheConstants;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
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.redis.utils.RedisUtils;
|
|
|
import org.dromara.system.domain.score.ScoreData;
|
|
|
import org.dromara.system.domain.score.ScoreDataDetail;
|
|
|
import org.dromara.system.domain.score.ScoreDataStudent;
|
|
|
import org.dromara.system.domain.score.bo.ScoreDataBo;
|
|
|
import org.dromara.system.domain.score.bo.ScoreDataDetailBo;
|
|
|
+import org.dromara.system.domain.score.bo.ScoreDataMfBo;
|
|
|
import org.dromara.system.domain.score.bo.ScoreDataStudentBo;
|
|
|
import org.dromara.system.domain.score.vo.ScoreDataVo;
|
|
|
import org.dromara.system.mapper.score.ScoreDataDetailMapper;
|
|
|
import org.dromara.system.mapper.score.ScoreDataMapper;
|
|
|
+import org.dromara.system.mapper.score.ScoreDataMfMapper;
|
|
|
import org.dromara.system.mapper.score.ScoreDataStudentMapper;
|
|
|
import org.dromara.system.service.score.IScoreDataService;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Collection;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 成绩Service业务层处理
|
|
@@ -38,12 +40,14 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
|
private final ScoreDataMapper baseMapper;
|
|
|
private final ScoreDataStudentMapper scoreDataStudentMapper;
|
|
|
private final ScoreDataDetailMapper scoreDataDetailMapper;
|
|
|
+ private final ScoreDataMfMapper scoreDataMfMapper;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 查询成绩
|
|
|
*/
|
|
|
@Override
|
|
|
- public ScoreDataVo queryById(Long scoreId){
|
|
|
+ public ScoreDataVo queryById(Long scoreId) {
|
|
|
return baseMapper.selectVoById(scoreId);
|
|
|
}
|
|
|
|
|
@@ -83,33 +87,52 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
|
*/
|
|
|
@Override
|
|
|
public Boolean insertByBo(ScoreDataBo bo) {
|
|
|
+ ScoreData add = MapstructUtils.convert(bo, ScoreData.class);
|
|
|
+ //validEntityBeforeSave(add);
|
|
|
+ boolean flag = baseMapper.insert(add) > 0;
|
|
|
+ Long scoreId = add.getScoreId();
|
|
|
+ if (flag) {
|
|
|
+ bo.setScoreId(scoreId);
|
|
|
+ }
|
|
|
+ //班级总分
|
|
|
+ long classZf = 0L;
|
|
|
+ //获取各科成绩满分
|
|
|
+ List<ScoreDataMfBo> scoreDataMfBoList = bo.getScoreDataMfBoList();
|
|
|
+ if (scoreDataMfBoList != null && scoreDataMfBoList.size() > 0) {
|
|
|
+ for (ScoreDataMfBo scoreDataMfBo : scoreDataMfBoList) {
|
|
|
+ scoreDataMfBo.setScoreId(scoreId);
|
|
|
+ }
|
|
|
+ scoreDataMfMapper.insertBatch(MapstructUtils.convert(scoreDataMfBoList, org.dromara.system.domain.score.ScoreDataMf.class));
|
|
|
+ }
|
|
|
//从考试信息中获取所有学生信息,在获取该学生所有考试成绩
|
|
|
List<ScoreDataStudentBo> scoreDataStudentBoList = bo.getScoreDataStudentBoList();
|
|
|
- if (scoreDataStudentBoList != null && scoreDataStudentBoList.size() > 0){
|
|
|
+ if (scoreDataStudentBoList != null && scoreDataStudentBoList.size() > 0) {
|
|
|
for (ScoreDataStudentBo scoreDataStudentBo : scoreDataStudentBoList) {
|
|
|
List<ScoreDataDetailBo> scoreDataDetailBoList = scoreDataStudentBo.getScoreDataDetailBoList();
|
|
|
- if (scoreDataDetailBoList != null && scoreDataDetailBoList.size() > 0){
|
|
|
- Long zf = 0L;
|
|
|
+ if (scoreDataDetailBoList != null && scoreDataDetailBoList.size() > 0) {
|
|
|
+ long zf = 0L;
|
|
|
//计算总分
|
|
|
for (ScoreDataDetailBo scoreDataDetailBo : scoreDataDetailBoList) {
|
|
|
//总分 = 总分 + 单科成绩
|
|
|
zf = zf + scoreDataDetailBo.getScore();
|
|
|
- ScoreDataDetail scoreDataDetail = MapstructUtils.convert(scoreDataDetailBo, ScoreDataDetail.class);
|
|
|
- scoreDataDetailMapper.insert(scoreDataDetail);
|
|
|
+ scoreDataDetailBo.setScoreId(scoreId);
|
|
|
+ scoreDataDetailBo.setScoreDataName(scoreDataStudentBo.getScoreDataName());
|
|
|
+ scoreDataDetailBo.setScoreDataNameId(scoreDataStudentBo.getScoreDataNameId());
|
|
|
}
|
|
|
+ classZf = classZf + zf;
|
|
|
scoreDataStudentBo.setZongfen(zf);
|
|
|
//计算平均分 = 总分/学科数
|
|
|
- scoreDataStudentBo.setAvg(String.valueOf(zf/scoreDataDetailBoList.size()));
|
|
|
- ScoreDataStudent scoreDataStudent = MapstructUtils.convert(scoreDataStudentBo, org.dromara.system.domain.score.ScoreDataStudent.class);
|
|
|
+ scoreDataStudentBo.setAvg(String.valueOf(zf / scoreDataDetailBoList.size()));
|
|
|
+ ScoreDataStudent scoreDataStudent = MapstructUtils.convert(scoreDataStudentBo, ScoreDataStudent.class);
|
|
|
+ scoreDataStudent.setScoreId(scoreId);
|
|
|
scoreDataStudentMapper.insert(scoreDataStudent);
|
|
|
+ scoreDataDetailMapper.insertBatch(MapstructUtils.convert(scoreDataDetailBoList, ScoreDataDetail.class));
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- ScoreData add = MapstructUtils.convert(bo, ScoreData.class);
|
|
|
- //validEntityBeforeSave(add);
|
|
|
- boolean flag = baseMapper.insert(add) > 0;
|
|
|
- if (flag) {
|
|
|
- bo.setScoreId(add.getScoreId());
|
|
|
+ //计算班级总分平均分=各学生总分/学生人数
|
|
|
+ long classAvg = classZf / scoreDataStudentBoList.size();
|
|
|
+ add.setAvg(String.valueOf(classAvg));
|
|
|
+ baseMapper.updateById(add);
|
|
|
}
|
|
|
return flag;
|
|
|
}
|
|
@@ -127,7 +150,7 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
|
/**
|
|
|
* 保存前的数据校验
|
|
|
*/
|
|
|
- private void validEntityBeforeSave(ScoreData entity){
|
|
|
+ private void validEntityBeforeSave(ScoreData entity) {
|
|
|
//TODO 做一些数据校验,如唯一约束
|
|
|
}
|
|
|
|
|
@@ -136,9 +159,144 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
|
*/
|
|
|
@Override
|
|
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
- if(isValid){
|
|
|
+ if (isValid) {
|
|
|
//TODO 做一些业务上的校验,判断是否需要校验
|
|
|
}
|
|
|
return baseMapper.deleteBatchIds(ids) > 0;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 后台首页成绩统计排名
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<ScoreDataStudent> indexPaiMing(ScoreData scoreData) {
|
|
|
+ List<ScoreDataStudent> scoreDataStudents = scoreDataStudentMapper.selectScoreDataByScoreClassId(scoreData.getScoreClassId());
|
|
|
+ if (scoreDataStudents != null && scoreDataStudents.size() > 0) {
|
|
|
+ scoreDataStudents = scoreDataStudents.subList(0, Math.min(scoreDataStudents.size(), 10));
|
|
|
+ }
|
|
|
+ return scoreDataStudents;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 后台首页成绩统计分段人数饼图最新一次考试
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> indexBingTu(ScoreData scoreData) {
|
|
|
+ //获取缓存的数据
|
|
|
+ Map<String, Object> cacheMap = RedisUtils.getCacheMap(CacheConstants.FEN_DUAN_NEW + scoreData.getScoreClassId());
|
|
|
+ //获取班级id对应的最新考试id
|
|
|
+ Long scoreDataId = (Long) RedisUtils.getCacheObject(CacheConstants.SCORE_ID + scoreData.getScoreClassId());
|
|
|
+ boolean flag = false;
|
|
|
+ if (cacheMap != null) {
|
|
|
+ //获取redis缓存的考试id
|
|
|
+ Long scoreId = (Long) cacheMap.get("scoreId");
|
|
|
+ //判断最新一次考试id和缓存id是否匹配
|
|
|
+ if (scoreDataId != null && scoreDataId.equals(scoreId)) {
|
|
|
+ //说明缓存就是最新的
|
|
|
+ return cacheMap;
|
|
|
+ } else {
|
|
|
+ //说明缓存数据不是最新的需要放到对比数据key中去 成为对比数据
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String, Object> map = new HashMap<>(8);
|
|
|
+ int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 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);
|
|
|
+ List<ScoreDataStudent> scoreDataStudents = scoreDataStudentMapper.selectScoreDataByScoreClassId(scoreData.getScoreClassId());
|
|
|
+
|
|
|
+ if (scoreDataStudents != null && scoreDataStudents.size() > 0) {
|
|
|
+ int zongfen = 0;
|
|
|
+ //计算各个分数段有多少人
|
|
|
+ for (ScoreDataStudent scoreDataDetail : scoreDataStudents) {
|
|
|
+ zongfen = scoreDataDetail.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++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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("scoreId", scoreDataStudents.get(0).getScoreId());
|
|
|
+ //把最新数据放到最新缓存key中
|
|
|
+ RedisUtils.setCacheMap(CacheConstants.FEN_DUAN_NEW + scoreData.getScoreClassId(), map);
|
|
|
+ RedisUtils.setCacheObject(CacheConstants.SCORE_ID + scoreData.getScoreClassId(), scoreDataStudents.get(0).getScoreId());
|
|
|
+ if (flag) {
|
|
|
+ //放入对比数据
|
|
|
+ RedisUtils.setCacheMap(CacheConstants.FEN_DUAN_LAST + scoreData.getScoreClassId(), cacheMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 后台首页成绩统计分段人数折线图
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> indexZheXian(ScoreData scoreData) {
|
|
|
+ Map<String, Object> map = new HashMap<>(8);
|
|
|
+ //分段
|
|
|
+ List<String> x = new ArrayList<>();
|
|
|
+ x.add("One");
|
|
|
+ x.add("Tow");
|
|
|
+ x.add("Thr");
|
|
|
+ x.add("For");
|
|
|
+ x.add("Fiv");
|
|
|
+ x.add("Six");
|
|
|
+ x.add("Sev");
|
|
|
+ x.add("Eig");
|
|
|
+ //本次
|
|
|
+ List<Object> y1 = new ArrayList<>();
|
|
|
+ //上次
|
|
|
+ List<Object> y2 = new ArrayList<>();
|
|
|
+ Map<String, Object> cacheMapNew = RedisUtils.getCacheMap(CacheConstants.FEN_DUAN_NEW + scoreData.getScoreClassId());
|
|
|
+ Map<String, Object> cacheMapLast = RedisUtils.getCacheMap(CacheConstants.FEN_DUAN_LAST + scoreData.getScoreClassId());
|
|
|
+ if (cacheMapNew != null && cacheMapNew.size() > 0) {
|
|
|
+ for (String key : cacheMapNew.keySet()) {
|
|
|
+ if (!"scoreId".equals(key)) {
|
|
|
+ y1.add(cacheMapNew.get(key));
|
|
|
+ if (cacheMapLast.get(key) != null) {
|
|
|
+ y2.add(cacheMapLast.get(key));
|
|
|
+ } else {
|
|
|
+ y2.add(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ for (int i = 0; i < 8; i++) {
|
|
|
+ y1.add(0);
|
|
|
+ y2.add(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ map.put("x", x);
|
|
|
+ map.put("y1", y1);
|
|
|
+ map.put("y2", y2);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
}
|