|
@@ -1,8 +1,12 @@
|
|
package org.dromara.system.service.impl.score;
|
|
package org.dromara.system.service.impl.score;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
+import com.google.api.client.util.SecurityUtils;
|
|
|
|
+import org.apache.commons.lang3.ObjectUtils;
|
|
import org.dromara.common.core.constant.CacheConstants;
|
|
import org.dromara.common.core.constant.CacheConstants;
|
|
|
|
+import org.dromara.common.core.domain.model.LoginUser;
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
@@ -10,24 +14,37 @@ import org.dromara.common.mybatis.core.page.PageQuery;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.dromara.common.redis.utils.RedisUtils;
|
|
import org.dromara.common.redis.utils.RedisUtils;
|
|
|
|
+import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
|
+import org.dromara.system.domain.FormalParentsStudent;
|
|
|
|
+import org.dromara.system.domain.FormalTeacherClass;
|
|
|
|
+import org.dromara.system.domain.SysUser;
|
|
import org.dromara.system.domain.score.ScoreData;
|
|
import org.dromara.system.domain.score.ScoreData;
|
|
import org.dromara.system.domain.score.ScoreDataDetail;
|
|
import org.dromara.system.domain.score.ScoreDataDetail;
|
|
|
|
+import org.dromara.system.domain.score.ScoreDataMf;
|
|
import org.dromara.system.domain.score.ScoreDataStudent;
|
|
import org.dromara.system.domain.score.ScoreDataStudent;
|
|
import org.dromara.system.domain.score.bo.ScoreDataBo;
|
|
import org.dromara.system.domain.score.bo.ScoreDataBo;
|
|
import org.dromara.system.domain.score.bo.ScoreDataDetailBo;
|
|
import org.dromara.system.domain.score.bo.ScoreDataDetailBo;
|
|
import org.dromara.system.domain.score.bo.ScoreDataMfBo;
|
|
import org.dromara.system.domain.score.bo.ScoreDataMfBo;
|
|
import org.dromara.system.domain.score.bo.ScoreDataStudentBo;
|
|
import org.dromara.system.domain.score.bo.ScoreDataStudentBo;
|
|
|
|
+import org.dromara.system.domain.score.vo.ScoreDataMfVo;
|
|
|
|
+import org.dromara.system.domain.score.vo.ScoreDataStudentVo;
|
|
import org.dromara.system.domain.score.vo.ScoreDataVo;
|
|
import org.dromara.system.domain.score.vo.ScoreDataVo;
|
|
|
|
+import org.dromara.system.mapper.FormalParentsStudentMapper;
|
|
|
|
+import org.dromara.system.mapper.FormalTeacherClassMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataDetailMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataDetailMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataMfMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataMfMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataStudentMapper;
|
|
import org.dromara.system.mapper.score.ScoreDataStudentMapper;
|
|
import org.dromara.system.service.score.IScoreDataService;
|
|
import org.dromara.system.service.score.IScoreDataService;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
+import java.text.DecimalFormat;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
+import static org.dromara.common.core.constant.CacheConstants.*;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 成绩Service业务层处理
|
|
* 成绩Service业务层处理
|
|
*
|
|
*
|
|
@@ -42,6 +59,11 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
private final ScoreDataStudentMapper scoreDataStudentMapper;
|
|
private final ScoreDataStudentMapper scoreDataStudentMapper;
|
|
private final ScoreDataDetailMapper scoreDataDetailMapper;
|
|
private final ScoreDataDetailMapper scoreDataDetailMapper;
|
|
private final ScoreDataMfMapper scoreDataMfMapper;
|
|
private final ScoreDataMfMapper scoreDataMfMapper;
|
|
|
|
+ @Autowired
|
|
|
|
+ private FormalTeacherClassMapper formalTeacherClassMapper;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private FormalParentsStudentMapper formalParentsStudentMapper;
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -57,8 +79,77 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public TableDataInfo<ScoreDataVo> queryPageList(ScoreDataBo bo, PageQuery pageQuery) {
|
|
public TableDataInfo<ScoreDataVo> queryPageList(ScoreDataBo bo, PageQuery pageQuery) {
|
|
- LambdaQueryWrapper<ScoreData> lqw = buildQueryWrapper(bo);
|
|
|
|
- Page<ScoreDataVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
|
|
+ Page<ScoreDataVo> result = new Page<>();
|
|
|
|
+ StringBuilder classId = new StringBuilder("0,");
|
|
|
|
+ Map<String, Object> params = bo.getParams();
|
|
|
|
+ String role = "admin";
|
|
|
|
+ if (params != null && params.size() > 0) {
|
|
|
|
+ role = (String) params.get("role");
|
|
|
|
+ }
|
|
|
|
+ if ("teacher".equals(role)) {
|
|
|
|
+ FormalTeacherClass formalTeacherClass = new FormalTeacherClass();
|
|
|
|
+ formalTeacherClass.setTeacherId(LoginHelper.getUserId());
|
|
|
|
+ List<FormalTeacherClass> formalTeacherClasses = formalTeacherClassMapper.selectFormalTeacherClassList(formalTeacherClass);
|
|
|
|
+ if (formalTeacherClasses != null && formalTeacherClasses.size() > 0) {
|
|
|
|
+ for (FormalTeacherClass teacherClass : formalTeacherClasses) {
|
|
|
|
+ classId.append(teacherClass.getClassId()).append(",");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isNotBlank(classId.toString())) {
|
|
|
|
+ classId = new StringBuilder(classId.substring(0, classId.length() - 1));
|
|
|
|
+ }
|
|
|
|
+ bo.setScoreClassId(classId.toString());
|
|
|
|
+ LambdaQueryWrapper<ScoreData> lqw = buildQueryWrapper(bo);
|
|
|
|
+ result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
+ } else if ("parents".equals(role)) {
|
|
|
|
+ FormalParentsStudent formalParentsStudent = new FormalParentsStudent();
|
|
|
|
+ formalParentsStudent.setParentsId(LoginHelper.getUserId());
|
|
|
|
+ List<FormalParentsStudent> formalParentsStudents = formalParentsStudentMapper.selectFormalParentsStudentList(formalParentsStudent);
|
|
|
|
+ for (FormalParentsStudent parentsStudent : formalParentsStudents) {
|
|
|
|
+ classId.append(parentsStudent.getClassId()).append(",");
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isNotBlank(classId.toString())) {
|
|
|
|
+ classId = new StringBuilder(classId.substring(0, classId.length() - 1));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bo.setScoreClassId(classId.toString());
|
|
|
|
+ LambdaQueryWrapper<ScoreData> lqw = buildQueryWrapper(bo);
|
|
|
|
+ result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
+ } else if ("admin".equals(role)) {
|
|
|
|
+ LambdaQueryWrapper<ScoreData> lqw = buildQueryWrapper(bo);
|
|
|
|
+ result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ //赋值查看率
|
|
|
|
+ if (result != null && result.getSize() > 0) {
|
|
|
|
+ DecimalFormat df = new DecimalFormat("##.0%");
|
|
|
|
+ String percent = "0.00%";
|
|
|
|
+ List<ScoreDataVo> records = result.getRecords();
|
|
|
|
+ for (ScoreDataVo data : records) {
|
|
|
|
+ //全部人数
|
|
|
|
+ double chaKanAll = 0D;
|
|
|
|
+ double chaKanCount = 0D;
|
|
|
|
+ if (ObjectUtils.isNotEmpty(RedisUtils.getCacheObject(SCORE_PEOPLE_ALL + data.getScoreId()))) {
|
|
|
|
+ chaKanAll = (int) RedisUtils.getCacheObject(SCORE_PEOPLE_ALL + data.getScoreId());
|
|
|
|
+ if (ObjectUtils.isNotEmpty(RedisUtils.getCacheObject(SCORE_PEOPLE_CHAKAN_COUNT + data.getScoreId()))) {
|
|
|
|
+ //已查看
|
|
|
|
+ chaKanCount = (int) RedisUtils.getCacheObject(SCORE_PEOPLE_CHAKAN_COUNT + data.getScoreId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ double weiChaKan = chaKanAll;
|
|
|
|
+ if (chaKanAll > 0 && chaKanCount >= 0) {
|
|
|
|
+ weiChaKan = chaKanAll - chaKanCount;
|
|
|
|
+ double z = chaKanCount / chaKanAll;
|
|
|
|
+ if (Math.abs(z) >= 0.1) {
|
|
|
|
+ //计算百分比
|
|
|
|
+ percent = df.format(z);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ data.setChaKan(chaKanCount);
|
|
|
|
+ data.setWeiChaKan(weiChaKan);
|
|
|
|
+ data.setPercentage(percent);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return TableDataInfo.build(result);
|
|
return TableDataInfo.build(result);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -132,12 +223,12 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
double lastScore = -1;// 最近一次的分
|
|
double lastScore = -1;// 最近一次的分
|
|
for (int i = 0; i < scoreDataStudentBoList.size(); i++) {
|
|
for (int i = 0; i < scoreDataStudentBoList.size(); i++) {
|
|
ScoreDataStudentBo studentBo = scoreDataStudentBoList.get(i);
|
|
ScoreDataStudentBo studentBo = scoreDataStudentBoList.get(i);
|
|
- if (Double.compare(lastScore, studentBo.getZongfen())!=0){
|
|
|
|
|
|
+ if (Double.compare(lastScore, studentBo.getZongfen()) != 0) {
|
|
// 如果成绩和上一名的成绩不相同,那么排名+1
|
|
// 如果成绩和上一名的成绩不相同,那么排名+1
|
|
lastScore = studentBo.getZongfen();
|
|
lastScore = studentBo.getZongfen();
|
|
index++;
|
|
index++;
|
|
}
|
|
}
|
|
- studentBo.setScoreSort(index+"");
|
|
|
|
|
|
+ studentBo.setScoreSort(index + "");
|
|
}
|
|
}
|
|
scoreDataStudentMapper.insert(scoreDataStudent);
|
|
scoreDataStudentMapper.insert(scoreDataStudent);
|
|
scoreDataDetailMapper.insertBatch(MapstructUtils.convert(scoreDataDetailBoList, ScoreDataDetail.class));
|
|
scoreDataDetailMapper.insertBatch(MapstructUtils.convert(scoreDataDetailBoList, ScoreDataDetail.class));
|
|
@@ -313,4 +404,68 @@ public class ScoreDataServiceImpl implements IScoreDataService {
|
|
map.put("y2", y2);
|
|
map.put("y2", y2);
|
|
return map;
|
|
return map;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查询成绩
|
|
|
|
+ *
|
|
|
|
+ * @param scoreData 成绩主键
|
|
|
|
+ * @return 成绩
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ScoreDataVo selectScoreDataByScoreId(ScoreData scoreData) {
|
|
|
|
+ Long scoreId = scoreData.getScoreId();
|
|
|
|
+ Map<String, Object> params = scoreData.getParams();
|
|
|
|
+ String role = "admin";
|
|
|
|
+ if (params != null && params.size() > 0) {
|
|
|
|
+ role = (String) params.get("role");
|
|
|
|
+ }
|
|
|
|
+ StringBuilder stdId = new StringBuilder("0,");
|
|
|
|
+ ScoreDataVo scoreDataVo = baseMapper.selectVoById(scoreData.getScoreId());
|
|
|
|
+ //查询满分
|
|
|
|
+ LambdaQueryWrapper<ScoreDataMf> lqw = Wrappers.lambdaQuery();
|
|
|
|
+ lqw.eq(ScoreDataMf::getScoreId, scoreData.getScoreId());
|
|
|
|
+ List<ScoreDataMfVo> scoreDataMfVos = scoreDataMfMapper.selectVoList(lqw);
|
|
|
|
+ scoreDataVo.setScoreDataMfVoList(scoreDataMfVos);
|
|
|
|
+ if ("parents".equals(role)) {
|
|
|
|
+ Long userId = LoginHelper.getLoginUser().getUserId();
|
|
|
|
+ //获取该家长的孩子id
|
|
|
|
+ LoginUser user = LoginHelper.getLoginUser();
|
|
|
|
+ FormalParentsStudent formalParentsStudent = new FormalParentsStudent();
|
|
|
|
+ formalParentsStudent.setParentsId(user.getUserId());
|
|
|
|
+ List<FormalParentsStudent> formalParentsStudents = formalParentsStudentMapper.selectFormalParentsStudentList(formalParentsStudent);
|
|
|
|
+ for (FormalParentsStudent parentsStudent : formalParentsStudents) {
|
|
|
|
+ stdId.append(parentsStudent.getId()).append(",");
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isNotBlank(stdId.toString())) {
|
|
|
|
+ stdId = new StringBuilder(stdId.substring(0, stdId.length() - 1));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
|
+ map.put("stdId",stdId.toString());
|
|
|
|
+ scoreData.setParams(map);
|
|
|
|
+ //获取查看人数
|
|
|
|
+ Object chaKanCount = RedisUtils.getCacheObject(SCORE_PEOPLE_CHAKAN_COUNT + scoreId);
|
|
|
|
+ if (ObjectUtils.isEmpty(chaKanCount)) {
|
|
|
|
+ RedisUtils.setCacheObject(SCORE_PEOPLE_CHAKAN_COUNT + scoreId, 1);
|
|
|
|
+ } else {
|
|
|
|
+ //判断该家长是否查看过
|
|
|
|
+ Object cacheObject = RedisUtils.getCacheObject(SCORE_PEOPLE_CHAKAN + scoreId + ":" + userId);
|
|
|
|
+ if (ObjectUtils.isEmpty(cacheObject)) {
|
|
|
|
+ RedisUtils.setCacheObject(SCORE_PEOPLE_CHAKAN_COUNT + scoreId, Integer.parseInt(String.valueOf(chaKanCount)) + 1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //如果是家长要记录到redis中
|
|
|
|
+ RedisUtils.setCacheObject(SCORE_PEOPLE_CHAKAN + scoreId + ":" + userId, userId);
|
|
|
|
+ //查询成绩家长查询自己的孩子
|
|
|
|
+
|
|
|
|
+ //查询考试对应的学生和成绩
|
|
|
|
+ List<ScoreDataStudentVo> scoreDataStudentVos = scoreDataStudentMapper.selectScoreDataForParents(scoreData.getScoreId());
|
|
|
|
+ scoreDataVo.setScoreDataStudentVoList(scoreDataStudentVos);
|
|
|
|
+ return scoreDataVo;
|
|
|
|
+ }
|
|
|
|
+ //查询考试对应的学生和成绩
|
|
|
|
+ List<ScoreDataStudentVo> scoreDataStudentVos = scoreDataStudentMapper.selectScoreByScoreId(scoreData.getScoreId());
|
|
|
|
+ scoreDataVo.setScoreDataStudentVoList(scoreDataStudentVos);
|
|
|
|
+ return scoreDataVo;
|
|
|
|
+ }
|
|
}
|
|
}
|