|
|
|
@ -14,6 +14,7 @@ import com.ibeetl.admin.core.util.PlatformException;
|
|
|
|
|
import com.ibeetl.admin.core.util.TimeTool;
|
|
|
|
|
import com.ibeetl.admin.core.web.JsonResult;
|
|
|
|
|
import com.ibeetl.admin.core.web.JsonReturnCode;
|
|
|
|
|
import com.ibeetl.jlw.constants.TeacherOpenCourseScoreDashboardConstant;
|
|
|
|
|
import com.ibeetl.jlw.dao.*;
|
|
|
|
|
import com.ibeetl.jlw.entity.*;
|
|
|
|
|
import com.ibeetl.jlw.enums.ChatLogSendTypeEnum;
|
|
|
|
@ -75,7 +76,7 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
private TeacherOpenCourseStudentSigninLogDao studentSigninLogDao;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private QuestionLogSummaryDao questionLogSummaryService;
|
|
|
|
|
private QuestionLogSummaryDao questionLogSummaryDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private TeacherOpenCourseQuestionSettingDao teacherOpenCourseQuestionSettingDao;
|
|
|
|
|
@Autowired
|
|
|
|
@ -108,6 +109,9 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
@Autowired
|
|
|
|
|
private HandsOnAchievementService handsOnAchievementService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private TeacherOpenCourseChatLogService teacherOpenCourseChatLogService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public PageQuery<TeacherOpenCourseScoreDashboard> queryByCondition(PageQuery query) {
|
|
|
|
|
PageQuery ret = teacherOpenCourseScoreDashboardDao.queryByCondition(query);
|
|
|
|
@ -451,6 +455,62 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public boolean updateGrades(Long teacherOpenCourseId) {
|
|
|
|
|
|
|
|
|
|
if (teacherOpenCourseId == null) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
|
|
|
|
|
//获取该课程的所有讨论数据
|
|
|
|
|
TeacherOpenCourseChatLog teacherOpenCourseChatLog = new TeacherOpenCourseChatLog();
|
|
|
|
|
teacherOpenCourseChatLog.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
teacherOpenCourseChatLog.setTeacherOpenCourseChatLogStatus(1);
|
|
|
|
|
List<TeacherOpenCourseChatLog> teacherOpenCourseChatLogList = teacherOpenCourseChatLogService.queryObjectList(teacherOpenCourseChatLog);
|
|
|
|
|
|
|
|
|
|
//查询章节练习配置
|
|
|
|
|
List<TeacherOpenCourseQuestionSetting> chapterExerciseList = teacherOpenCourseQuestionSettingDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingStatus, 1).select();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//查询本课程的所有实操任务
|
|
|
|
|
TeacherOpenCourseHandsOn param = new TeacherOpenCourseHandsOn();
|
|
|
|
|
param.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
List<TeacherOpenCourseHandsOn> handsOnList = teacherOpenCourseHandsOnService.queryObjectList(param);
|
|
|
|
|
|
|
|
|
|
//查询本课程的所有实操任务子项
|
|
|
|
|
List<TeacherOpenCourseHandsOnSimulationTasks> teacherOpenCourseHandsOnSimulationTasksList = null;
|
|
|
|
|
List<Long> handOnIdList = null;
|
|
|
|
|
if (CollectionUtil.isNotEmpty(handsOnList)) {
|
|
|
|
|
handOnIdList = handsOnList.stream().map(TeacherOpenCourseHandsOn::getHandsOnId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
TeacherOpenCourseHandsOnSimulationTasks query = new TeacherOpenCourseHandsOnSimulationTasks();
|
|
|
|
|
query.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
teacherOpenCourseHandsOnSimulationTasksList = teacherOpenCourseHandsOnSimulationTasksService.queryObjectList(query);
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtil.isEmpty(teacherOpenCourseHandsOnSimulationTasksList)) {
|
|
|
|
|
teacherOpenCourseHandsOnSimulationTasksList = new ArrayList<>();
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtil.isEmpty(handOnIdList)) {
|
|
|
|
|
handOnIdList = new ArrayList<>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查该课程的所有作业
|
|
|
|
|
List<TeacherOpenCourseQuestionSetting> homeworkList = teacherOpenCourseQuestionSettingDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingStatus, 1)
|
|
|
|
|
.andIn(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, Arrays.asList(ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_QUESTION, ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_FILE))
|
|
|
|
|
.select();
|
|
|
|
|
|
|
|
|
|
//查该课程的所有考试
|
|
|
|
|
List<TeacherOpenCourseQuestionSetting> examList = teacherOpenCourseQuestionSettingDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingStatus, 1)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.EXAM).select();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//查询权重
|
|
|
|
|
TeacherOpenCourseScoreWeight weight = weightDao.single(teacherOpenCourseId);
|
|
|
|
|
TeacherOpenCourseMergeStudentQuery studentQuery = new TeacherOpenCourseMergeStudentQuery();
|
|
|
|
@ -459,23 +519,48 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
//查开课里面的学生
|
|
|
|
|
List<TeacherOpenCourseMergeStudent> students = mergeStudentDao.getValuesByQueryNotWithPermission(studentQuery);
|
|
|
|
|
|
|
|
|
|
List<TeacherOpenCourseScoreDashboard> studentScores = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
//班次数
|
|
|
|
|
for (TeacherOpenCourseMergeStudent teacherOpenCourseMergeStudent : students) {
|
|
|
|
|
Long studentId = teacherOpenCourseMergeStudent.getStudentId();
|
|
|
|
|
|
|
|
|
|
//通过id查询学生
|
|
|
|
|
Student student = studentService.queryById(studentId);
|
|
|
|
|
|
|
|
|
|
TeacherOpenCourseScoreDashboard teacherOpenCourseScoreDashboard = teacherOpenCourseScoreDashboardDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseScoreDashboard::getTeacherOpenCourseId, teacherOpenCourseId)
|
|
|
|
|
.andEq(TeacherOpenCourseScoreDashboard::getStudentId, studentId)
|
|
|
|
|
.singleSimple();
|
|
|
|
|
if (teacherOpenCourseScoreDashboard == null) {
|
|
|
|
|
teacherOpenCourseScoreDashboard = new TeacherOpenCourseScoreDashboard();
|
|
|
|
|
teacherOpenCourseScoreDashboard.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setStudentId(studentId);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setOrgId(student.getOrgId());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setStudentSn(student.getStudentSn());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setStudentName(student.getStudentName());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setExamScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setCourseScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setChatScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setSigninScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setRealOperationScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setQuestionHomeworkScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setTotalScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setManualScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setUserId(student.getUserId());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setCreateTime(now);
|
|
|
|
|
teacherOpenCourseScoreDashboardDao.insert(teacherOpenCourseScoreDashboard);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (teacherOpenCourseScoreDashboard.getTeacherOpenCourseScoreDashboardId() == null) {
|
|
|
|
|
log.error("teacherOpenCourseScoreDashboard.getTeacherOpenCourseScoreDashboardId()为空,studentId:{},openCourseId:{}", studentId, teacherOpenCourseId);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (student == null) {
|
|
|
|
|
log.error("学生不存在,studentId={}", studentId);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TeacherOpenCourseScoreDashboard scoreDashboard = new TeacherOpenCourseScoreDashboard();
|
|
|
|
|
scoreDashboard.setStudentId(studentId);
|
|
|
|
|
scoreDashboard.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
scoreDashboard.setTeacherOpenCourseScoreDashboardId(teacherOpenCourseScoreDashboard.getTeacherOpenCourseScoreDashboardId());
|
|
|
|
|
|
|
|
|
|
//签到成绩
|
|
|
|
|
{
|
|
|
|
@ -522,17 +607,11 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
{
|
|
|
|
|
scoreDashboard.setCourseScore(BigDecimal.ZERO);
|
|
|
|
|
|
|
|
|
|
//查询章节练习配置
|
|
|
|
|
List<TeacherOpenCourseQuestionSetting> chapterExerciseList = teacherOpenCourseQuestionSettingDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingStatus, 1).select();
|
|
|
|
|
|
|
|
|
|
if (!CollectionUtil.isEmpty(chapterExerciseList)) {
|
|
|
|
|
List<Long> teacherOpenCourseQuestionSettingIdList = chapterExerciseList.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//查询章节练习成绩
|
|
|
|
|
List<QuestionLogSummary> questionLogSummaryList = questionLogSummaryService.createLambdaQuery()
|
|
|
|
|
List<QuestionLogSummary> questionLogSummaryList = questionLogSummaryDao.createLambdaQuery()
|
|
|
|
|
.andEq(QuestionLogSummary::getPersonId, studentId)
|
|
|
|
|
.andEq(QuestionLogSummary::getQuestionLogSummaryStatus, 1)
|
|
|
|
|
.andIn(QuestionLogSummary::getQuestionSettingId, teacherOpenCourseQuestionSettingIdList).select();
|
|
|
|
@ -555,13 +634,15 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
}
|
|
|
|
|
list.sort(Comparator.comparing(QuestionLogSummary::getQuestionLogSummaryAddTime).reversed());
|
|
|
|
|
QuestionLogSummary questionLogSummary = list.get(0);
|
|
|
|
|
|
|
|
|
|
//这里的正确率默认就是百分比,不需要再除以100
|
|
|
|
|
BigDecimal questionLogSummarySuccessRate = questionLogSummary.getQuestionLogSummarySuccessRate();
|
|
|
|
|
if (questionLogSummarySuccessRate != null) {
|
|
|
|
|
allSuccessRate = allSuccessRate.add(questionLogSummarySuccessRate);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//平均正确率*100得出分数
|
|
|
|
|
BigDecimal avgSuccessRate = allSuccessRate.divide(BigDecimal.valueOf(baseSize), 3, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
|
|
|
|
|
//平均正确率得出分数
|
|
|
|
|
BigDecimal avgSuccessRate = allSuccessRate.divide(BigDecimal.valueOf(baseSize), 1, RoundingMode.HALF_UP);
|
|
|
|
|
scoreDashboard.setCourseScore(avgSuccessRate);
|
|
|
|
|
} else if ("2".equals(weight.getCoursePracticeResultSetting())) {
|
|
|
|
|
//按完成进度计分:完成进度*100
|
|
|
|
@ -577,25 +658,7 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
|
|
|
|
|
//实操成绩
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
scoreDashboard.setRealOperationScore(BigDecimal.ZERO);
|
|
|
|
|
|
|
|
|
|
//查询本课程的所有实操任务
|
|
|
|
|
TeacherOpenCourseHandsOn param = new TeacherOpenCourseHandsOn();
|
|
|
|
|
param.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<TeacherOpenCourseHandsOn> handsOnList = teacherOpenCourseHandsOnService.queryObjectList(param);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(handsOnList)) {
|
|
|
|
|
|
|
|
|
|
List<Long> handOnIdList = handsOnList.stream().map(TeacherOpenCourseHandsOn::getHandsOnId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
//查询本课程的所有实操任务子项
|
|
|
|
|
TeacherOpenCourseHandsOnSimulationTasks query = new TeacherOpenCourseHandsOnSimulationTasks();
|
|
|
|
|
param.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
List<TeacherOpenCourseHandsOnSimulationTasks> teacherOpenCourseHandsOnSimulationTasksList = teacherOpenCourseHandsOnSimulationTasksService.queryObjectList(query);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(teacherOpenCourseHandsOnSimulationTasksList)) {
|
|
|
|
|
|
|
|
|
|
Map<Long, List<TeacherOpenCourseHandsOnSimulationTasks>> teacherOpenCourseHandsOnSimulationTasksMap = teacherOpenCourseHandsOnSimulationTasksList.stream().collect(Collectors.groupingBy(TeacherOpenCourseHandsOnSimulationTasks::getHandsOnId));
|
|
|
|
@ -699,37 +762,43 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//作业
|
|
|
|
|
{
|
|
|
|
|
//假设本课程开了 2门考试,为A考试 B考试
|
|
|
|
|
//
|
|
|
|
|
//A考试 学生考了两遍 第一遍 考了 80分 第二次考了79分 ,下面的计算取最近的一次 也就是79分
|
|
|
|
|
//
|
|
|
|
|
//B考试 学生考了一遍 得分 100分
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
//则成绩页面考试得分 = (79+100)/2 = 89.5分
|
|
|
|
|
//记得百分制
|
|
|
|
|
List<TeacherOpenCourseQuestionSetting> select2 = teacherOpenCourseQuestionSettingDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_QUESTION).select();
|
|
|
|
|
if (CollectionUtil.isEmpty(select2)) {
|
|
|
|
|
//查询题目类型作业和文件类型作业
|
|
|
|
|
scoreDashboard.setQuestionHomeworkScore(BigDecimal.ZERO);
|
|
|
|
|
} else {
|
|
|
|
|
List<Long> collect = select2.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList());
|
|
|
|
|
List<QuestionLogSummary> select1 = questionLogSummaryService.createLambdaQuery()
|
|
|
|
|
|
|
|
|
|
if (!CollectionUtil.isEmpty(homeworkList)) {
|
|
|
|
|
List<Long> settingIdList = homeworkList.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList());
|
|
|
|
|
List<QuestionLogSummary> questionLogSummaryList = questionLogSummaryDao.createLambdaQuery()
|
|
|
|
|
.andEq(QuestionLogSummary::getPersonId, studentId)
|
|
|
|
|
.andIn(QuestionLogSummary::getQuestionSettingId, collect).select();
|
|
|
|
|
if (CollectionUtil.isEmpty(select1)) {
|
|
|
|
|
scoreDashboard.setQuestionHomeworkScore(BigDecimal.ZERO);
|
|
|
|
|
} else {
|
|
|
|
|
.andIn(QuestionLogSummary::getQuestionSettingId, settingIdList)
|
|
|
|
|
.andEq(QuestionLogSummary::getQuestionLogSummaryStatus, 1).select();
|
|
|
|
|
if (!CollectionUtil.isEmpty(questionLogSummaryList)) {
|
|
|
|
|
Map<Long, List<QuestionLogSummary>> questionLogSummaryMap = questionLogSummaryList.stream().collect(Collectors.groupingBy(QuestionLogSummary::getQuestionSettingId));
|
|
|
|
|
|
|
|
|
|
BigDecimal b = BigDecimal.ZERO;
|
|
|
|
|
for (QuestionLogSummary questionLogSummary : select1) {
|
|
|
|
|
b = b.add(questionLogSummary.getQuestionLogSummaryStudentTotalScore());
|
|
|
|
|
for (Map.Entry<Long, List<QuestionLogSummary>> entry : questionLogSummaryMap.entrySet()) {
|
|
|
|
|
List<QuestionLogSummary> value = entry.getValue();
|
|
|
|
|
//以防万一有多条记录,取最近的一条
|
|
|
|
|
value.sort(Comparator.comparing(QuestionLogSummary::getQuestionLogSummaryAddTime).reversed());
|
|
|
|
|
QuestionLogSummary questionLogSummary = value.get(0);
|
|
|
|
|
|
|
|
|
|
if (ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_FILE.equals(questionLogSummary.getQuestionSettingType())) {
|
|
|
|
|
//文件作业类型 没有最大分数,直接取学生得分
|
|
|
|
|
b = b.add(ObjectUtil.defaultIfNull(questionLogSummary.getQuestionLogSummaryStudentTotalScore(), BigDecimal.ZERO));
|
|
|
|
|
} else {
|
|
|
|
|
//题目类型作业 有最大分数,需要转换为百分制
|
|
|
|
|
|
|
|
|
|
BigDecimal questionSettingTotalScore = ObjectUtil.defaultIfNull(questionLogSummary.getQuestionSettingTotalScore(), BigDecimal.valueOf(100));
|
|
|
|
|
BigDecimal questionLogSummaryStudentTotalScore = ObjectUtil.defaultIfNull(questionLogSummary.getQuestionLogSummaryStudentTotalScore(), BigDecimal.ZERO);
|
|
|
|
|
//转为百分制
|
|
|
|
|
b = b.add(questionLogSummaryStudentTotalScore.multiply(new BigDecimal(100)).divide(questionSettingTotalScore, 1, RoundingMode.HALF_UP));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//总分除以总作业数得出平均分
|
|
|
|
|
b = b.divide(new BigDecimal(homeworkList.size()), 1, RoundingMode.HALF_UP);
|
|
|
|
|
scoreDashboard.setQuestionHomeworkScore(b);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -737,78 +806,148 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
|
|
|
|
|
//考试
|
|
|
|
|
{
|
|
|
|
|
List<TeacherOpenCourseQuestionSetting> select3 = teacherOpenCourseQuestionSettingDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId)
|
|
|
|
|
.andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.EXAM).select();
|
|
|
|
|
if (CollectionUtil.isEmpty(select3)) {
|
|
|
|
|
scoreDashboard.setExamScore(BigDecimal.ZERO);
|
|
|
|
|
} else {
|
|
|
|
|
if (weight == null || "1".equals(weight.getCoursePracticeResultSetting())) {
|
|
|
|
|
List<Long> collect = select3.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList());
|
|
|
|
|
List<QuestionLogSummary> select1 = questionLogSummaryService.createLambdaQuery()
|
|
|
|
|
|
|
|
|
|
if (!CollectionUtil.isEmpty(examList)) {
|
|
|
|
|
if (weight == null || "1".equals(weight.getExaminationResultSetting())) {
|
|
|
|
|
List<Long> settingIdList = examList.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList());
|
|
|
|
|
//查询学生考试记录
|
|
|
|
|
List<QuestionLogSummary> questionLogSummaryList = questionLogSummaryDao.createLambdaQuery()
|
|
|
|
|
.andEq(QuestionLogSummary::getPersonId, studentId)
|
|
|
|
|
.andIn(QuestionLogSummary::getQuestionSettingId, collect).select();
|
|
|
|
|
if (CollectionUtil.isEmpty(select1)) {
|
|
|
|
|
scoreDashboard.setExamScore(BigDecimal.ZERO);
|
|
|
|
|
} else {
|
|
|
|
|
.andIn(QuestionLogSummary::getQuestionSettingId, settingIdList)
|
|
|
|
|
.andEq(QuestionLogSummary::getQuestionLogSummaryStatus, 1)
|
|
|
|
|
.select();
|
|
|
|
|
|
|
|
|
|
if (!CollectionUtil.isEmpty(questionLogSummaryList)) {
|
|
|
|
|
Map<Long, List<QuestionLogSummary>> questionLogSummaryMap = questionLogSummaryList.stream().collect(Collectors.groupingBy(QuestionLogSummary::getQuestionSettingId));
|
|
|
|
|
|
|
|
|
|
BigDecimal b = BigDecimal.ZERO;
|
|
|
|
|
for (QuestionLogSummary questionLogSummary : select1) {
|
|
|
|
|
b = b.add(questionLogSummary.getQuestionLogSummaryStudentTotalScore());
|
|
|
|
|
}
|
|
|
|
|
scoreDashboard.setExamScore(b);
|
|
|
|
|
for (Map.Entry<Long, List<QuestionLogSummary>> entry : questionLogSummaryMap.entrySet()) {
|
|
|
|
|
List<QuestionLogSummary> value = entry.getValue();
|
|
|
|
|
//以防万一有多条记录,取最近的一条
|
|
|
|
|
value.sort(Comparator.comparing(QuestionLogSummary::getQuestionLogSummaryAddTime).reversed());
|
|
|
|
|
QuestionLogSummary questionLogSummary = value.get(0);
|
|
|
|
|
BigDecimal questionSettingTotalScore = ObjectUtil.defaultIfNull(questionLogSummary.getQuestionSettingTotalScore(), BigDecimal.valueOf(100));
|
|
|
|
|
BigDecimal questionLogSummaryStudentTotalScore = ObjectUtil.defaultIfNull(questionLogSummary.getQuestionLogSummaryStudentTotalScore(), BigDecimal.ZERO);
|
|
|
|
|
//转为百分制
|
|
|
|
|
b = b.add(questionLogSummaryStudentTotalScore.multiply(new BigDecimal(100)).divide(questionSettingTotalScore, 1, RoundingMode.HALF_UP));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//总分除以总作业数得出平均分
|
|
|
|
|
b = b.divide(new BigDecimal(examList.size()), 1, RoundingMode.HALF_UP);
|
|
|
|
|
scoreDashboard.setQuestionHomeworkScore(b);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//互动
|
|
|
|
|
List<TeacherOpenCourseChatLog> chatLogList = courseChatLogDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseChatLog::getStudentId, studentId)
|
|
|
|
|
.andEq(TeacherOpenCourseChatLog::getTeacherOpenCourseId, teacherOpenCourseId).select();
|
|
|
|
|
//提问次数
|
|
|
|
|
long count = chatLogList.stream().filter(v -> v.getChatLogSendType().equals(ChatLogSendTypeEnum.student_ask)
|
|
|
|
|
|| v.getChatLogSendType().equals(ChatLogSendTypeEnum.specify_ask)).count();
|
|
|
|
|
//回复次数
|
|
|
|
|
long count2 = chatLogList.stream().filter(v ->
|
|
|
|
|
v.getChatLogSendType().equals(ChatLogSendTypeEnum.normal)).count();
|
|
|
|
|
//答题次数
|
|
|
|
|
long count3 = chatLogList.stream().filter(v ->
|
|
|
|
|
v.getChatLogSendType().equals(ChatLogSendTypeEnum.normal)
|
|
|
|
|
&& v.getStudentScore() != null
|
|
|
|
|
).count();
|
|
|
|
|
BigDecimal chatScore = BigDecimal.ZERO;
|
|
|
|
|
if (weight != null && StringUtils.isNotEmpty(weight.getInteractionResultSetting())) {
|
|
|
|
|
//互动分数
|
|
|
|
|
{
|
|
|
|
|
scoreDashboard.setChatScore(BigDecimal.ZERO);
|
|
|
|
|
if (CollectionUtil.isNotEmpty(teacherOpenCourseChatLogList) && weight != null && StringUtils.isNotBlank(weight.getInteractionResultSetting())) {
|
|
|
|
|
BigDecimal totalChatScore = BigDecimal.ZERO;
|
|
|
|
|
//1留言2提问3回答
|
|
|
|
|
String interactionResultSetting = weight.getInteractionResultSetting();
|
|
|
|
|
if (interactionResultSetting.contains("1")) {
|
|
|
|
|
chatScore = NumberUtil.mul(count2, NumberUtil.toBigDecimal(weight.getInteractionResultMessageScore()));
|
|
|
|
|
|
|
|
|
|
//回答分数处理
|
|
|
|
|
{
|
|
|
|
|
if (interactionResultSetting.contains("3")) {
|
|
|
|
|
//老师提问该学生
|
|
|
|
|
List<Long> teacherAskIds = teacherOpenCourseChatLogList.stream().filter(v -> {
|
|
|
|
|
return (ChatLogSendTypeEnum.random_ask.equals(v.getChatLogSendType()) || ChatLogSendTypeEnum.specify_ask.equals(v.getChatLogSendType()))
|
|
|
|
|
&& ObjectUtil.equals(studentId, v.getStudentId());
|
|
|
|
|
}).map(TeacherOpenCourseChatLog::getTeacherOpenCourseChatLogId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(teacherAskIds)) {
|
|
|
|
|
//学生回答的次数,回答多次也只算一次
|
|
|
|
|
long count = teacherOpenCourseChatLogList.stream().filter(v -> {
|
|
|
|
|
return ObjectUtil.equals(studentId, v.getStudentId())
|
|
|
|
|
&& teacherAskIds.contains(v.getTeacherOpenCourseChatLogParentId());
|
|
|
|
|
}).map(TeacherOpenCourseChatLog::getTeacherOpenCourseChatLogParentId).distinct().count();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BigDecimal interactionResultAnswerScore = new BigDecimal(ObjectUtil.defaultIfBlank(weight.getInteractionResultAnswerScore(), "0"));
|
|
|
|
|
totalChatScore = totalChatScore.add(interactionResultAnswerScore.multiply(new BigDecimal(count)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//提问分数处理
|
|
|
|
|
{
|
|
|
|
|
if (interactionResultSetting.contains("2")) {
|
|
|
|
|
chatScore = NumberUtil.mul(count, NumberUtil.toBigDecimal(weight.getInteractionResultQuestionScore()));
|
|
|
|
|
//学生提问老师
|
|
|
|
|
List<Long> studentAskIds = teacherOpenCourseChatLogList.stream().filter(v -> {
|
|
|
|
|
return ChatLogSendTypeEnum.student_ask.equals(v.getChatLogSendType())
|
|
|
|
|
&& ObjectUtil.equals(studentId, v.getStudentId());
|
|
|
|
|
}).map(TeacherOpenCourseChatLog::getTeacherOpenCourseChatLogId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
long count = studentAskIds.size();
|
|
|
|
|
BigDecimal interactionResultQuestionScore = new BigDecimal(ObjectUtil.defaultIfBlank(weight.getInteractionResultQuestionScore(), "0"));
|
|
|
|
|
BigDecimal multiply = interactionResultQuestionScore.multiply(new BigDecimal(count));
|
|
|
|
|
if (multiply.compareTo(new BigDecimal(TeacherOpenCourseScoreDashboardConstant.STUDENT_ASK_MAX_SCORE)) > 0) {
|
|
|
|
|
multiply = new BigDecimal(TeacherOpenCourseScoreDashboardConstant.STUDENT_ASK_MAX_SCORE);
|
|
|
|
|
}
|
|
|
|
|
if (interactionResultSetting.contains("3")) {
|
|
|
|
|
chatScore = NumberUtil.mul(count3, NumberUtil.toBigDecimal(weight.getInteractionResultAnswerScore()));
|
|
|
|
|
totalChatScore = totalChatScore.add(multiply);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
chatScore = BigDecimal.valueOf(count2);
|
|
|
|
|
}
|
|
|
|
|
scoreDashboard.setChatScore(chatScore);
|
|
|
|
|
|
|
|
|
|
//留言分数处理
|
|
|
|
|
{
|
|
|
|
|
if (interactionResultSetting.contains("1")) {
|
|
|
|
|
//老师发起的讨论,学生的班级在讨论的班级中
|
|
|
|
|
List<Long> discussionIdList = teacherOpenCourseChatLogList.stream().filter(v -> {
|
|
|
|
|
return ChatLogSendTypeEnum.discuss.equals(v.getChatLogSendType())
|
|
|
|
|
&& (
|
|
|
|
|
StringUtils.isBlank(v.getSchoolClassIds())
|
|
|
|
|
|| Arrays.asList(v.getSchoolClassIds().split(",")).contains(student.getClassId().toString())
|
|
|
|
|
);
|
|
|
|
|
}).map(TeacherOpenCourseChatLog::getTeacherOpenCourseChatLogId).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
BigDecimal totalScore = scoreDashboard.getSigninScore()
|
|
|
|
|
.add(scoreDashboard.getCourseScore())
|
|
|
|
|
.add(scoreDashboard.getRealOperationScore())
|
|
|
|
|
.add(scoreDashboard.getQuestionHomeworkScore())
|
|
|
|
|
.add(scoreDashboard.getExamScore())
|
|
|
|
|
.add(scoreDashboard.getChatScore());
|
|
|
|
|
scoreDashboard.setTotalScore(totalScore);
|
|
|
|
|
//学生回复的讨论的次数
|
|
|
|
|
long count = teacherOpenCourseChatLogList.stream().filter(v -> {
|
|
|
|
|
return (
|
|
|
|
|
ObjectUtil.equals(studentId, v.getStudentId())
|
|
|
|
|
&& ChatLogSendTypeEnum.normal.equals(v.getChatLogSendType())
|
|
|
|
|
&& StringUtils.isNotBlank(v.getChatLogFullId())
|
|
|
|
|
&& discussionIdList.contains(Long.valueOf(v.getChatLogFullId().split("_")[0]))
|
|
|
|
|
);
|
|
|
|
|
}).count();
|
|
|
|
|
BigDecimal interactionResultMessageScore = new BigDecimal(ObjectUtil.defaultIfBlank(weight.getInteractionResultMessageScore(), "0"));
|
|
|
|
|
BigDecimal multiply = interactionResultMessageScore.multiply(new BigDecimal(count));
|
|
|
|
|
if (multiply.compareTo(new BigDecimal(TeacherOpenCourseScoreDashboardConstant.DISCUSS_MAX_SCORE)) > 0) {
|
|
|
|
|
multiply = new BigDecimal(TeacherOpenCourseScoreDashboardConstant.DISCUSS_MAX_SCORE);
|
|
|
|
|
}
|
|
|
|
|
totalChatScore = totalChatScore.add(multiply);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
scoreDashboard.setChatScore(totalChatScore);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//总分
|
|
|
|
|
{
|
|
|
|
|
scoreDashboard.setTotalScore(BigDecimal.ZERO);
|
|
|
|
|
if (weight != null) {
|
|
|
|
|
BigDecimal totalScore = BigDecimal.ZERO;
|
|
|
|
|
BigDecimal formatSignScore = scoreDashboard.getSigninScore().multiply(new BigDecimal(ObjectUtil.defaultIfBlank(weight.getSignInResult(), "0")));
|
|
|
|
|
BigDecimal formatCourseScore = scoreDashboard.getCourseScore().multiply(new BigDecimal(ObjectUtil.defaultIfBlank(weight.getChapterContactResult(), "0")));
|
|
|
|
|
BigDecimal formatRealOperationScore = scoreDashboard.getRealOperationScore().multiply(new BigDecimal(ObjectUtil.defaultIfBlank(weight.getCoursePracticeResult(), "0")));
|
|
|
|
|
BigDecimal formatQuestionHomeworkScore = scoreDashboard.getQuestionHomeworkScore().multiply(new BigDecimal(ObjectUtil.defaultIfBlank(weight.getHomeworkResult(), "0")));
|
|
|
|
|
BigDecimal formatExamScore = scoreDashboard.getExamScore().multiply(new BigDecimal(ObjectUtil.defaultIfBlank(weight.getExaminationResult(), "0")));
|
|
|
|
|
BigDecimal formatChatScore = scoreDashboard.getChatScore().multiply(new BigDecimal(ObjectUtil.defaultIfBlank(weight.getInteractionResult(), "0")));
|
|
|
|
|
totalScore = totalScore.add(formatSignScore).add(formatCourseScore).add(formatRealOperationScore).add(formatQuestionHomeworkScore).add(formatExamScore).add(formatChatScore);
|
|
|
|
|
|
|
|
|
|
//加上手动的分数
|
|
|
|
|
totalScore = totalScore.add(ObjectUtil.defaultIfNull(teacherOpenCourseScoreDashboard.getManualScore(), BigDecimal.ZERO));
|
|
|
|
|
totalScore = totalScore.setScale(1, RoundingMode.HALF_UP);
|
|
|
|
|
scoreDashboard.setTotalScore(totalScore);
|
|
|
|
|
|
|
|
|
|
//成绩状态
|
|
|
|
|
lastStatus(weight, totalScore, scoreDashboard);
|
|
|
|
|
}
|
|
|
|
|
studentScores.add(scoreDashboard);
|
|
|
|
|
}
|
|
|
|
|
//通过课程id删除存量数据
|
|
|
|
|
teacherOpenCourseScoreDashboardDao.deleteByTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
teacherOpenCourseScoreDashboardDao.insertBatch(studentScores);
|
|
|
|
|
updateTemplate(scoreDashboard);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -907,4 +1046,70 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService<Teac
|
|
|
|
|
String filename = StrUtil.format("成绩-导出 {}.xlsx", System.currentTimeMillis());
|
|
|
|
|
write(response, filename, "Sheet1", header.values(), convertData(header.keySet(), maps));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void updateManualScore(Long teacherOpenCourseScoreDashboardId, Long studentId, Long teacherOpenCourseId, BigDecimal manualScore) {
|
|
|
|
|
TeacherOpenCourseScoreDashboard teacherOpenCourseScoreDashboard = null;
|
|
|
|
|
if (teacherOpenCourseScoreDashboardId != null) {
|
|
|
|
|
teacherOpenCourseScoreDashboard = this.queryById(teacherOpenCourseScoreDashboardId);
|
|
|
|
|
if (teacherOpenCourseScoreDashboard == null) {
|
|
|
|
|
throw new PlatformException("参数错误!");
|
|
|
|
|
}
|
|
|
|
|
}else {
|
|
|
|
|
if (studentId==null||teacherOpenCourseId==null){
|
|
|
|
|
throw new PlatformException("参数错误!");
|
|
|
|
|
}
|
|
|
|
|
TeacherOpenCourseScoreDashboard param = new TeacherOpenCourseScoreDashboard();
|
|
|
|
|
param.setStudentId(studentId);
|
|
|
|
|
param.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
teacherOpenCourseScoreDashboard = this.queryObject(param);
|
|
|
|
|
if (teacherOpenCourseScoreDashboard == null) {
|
|
|
|
|
Student student = studentService.queryById(studentId);
|
|
|
|
|
if (student == null) {
|
|
|
|
|
throw new PlatformException("参数错误!");
|
|
|
|
|
}
|
|
|
|
|
teacherOpenCourseScoreDashboard = new TeacherOpenCourseScoreDashboard();
|
|
|
|
|
teacherOpenCourseScoreDashboard.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setStudentId(studentId);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setOrgId(student.getOrgId());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setStudentSn(student.getStudentSn());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setStudentName(student.getStudentName());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setExamScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setCourseScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setChatScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setSigninScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setRealOperationScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setQuestionHomeworkScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setTotalScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setManualScore(BigDecimal.ZERO);
|
|
|
|
|
teacherOpenCourseScoreDashboard.setUserId(student.getUserId());
|
|
|
|
|
teacherOpenCourseScoreDashboard.setCreateTime(new Date());
|
|
|
|
|
teacherOpenCourseScoreDashboardDao.insert(teacherOpenCourseScoreDashboard);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
teacherOpenCourseScoreDashboard.setManualScore(ObjectUtil.defaultIfNull(manualScore, BigDecimal.ZERO));
|
|
|
|
|
teacherOpenCourseScoreDashboard.setTotalScore(ObjectUtil.defaultIfNull(teacherOpenCourseScoreDashboard.getTotalScore(), BigDecimal.ZERO).add(ObjectUtil.defaultIfNull(manualScore, BigDecimal.ZERO)).setScale(1, RoundingMode.HALF_UP));
|
|
|
|
|
updateTemplate(teacherOpenCourseScoreDashboard);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|