diff --git a/web/src/main/java/cn/jlw/util/IpUtils.java b/web/src/main/java/cn/jlw/util/IpUtils.java index 48885471..3ddebb4a 100644 --- a/web/src/main/java/cn/jlw/util/IpUtils.java +++ b/web/src/main/java/cn/jlw/util/IpUtils.java @@ -128,7 +128,7 @@ public class IpUtils { String reg = "^((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}" + "-((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}$"; Assert.isTrue(ReUtil.isMatch(reg, ipRange), - () -> new PlatformException("ipRangeAddressList 参数格式化错误!支持格式:x.x.x.x-x.x.x.x,x.x.x.x-x.x.x.x")); + () -> new PlatformException("ipRangeAddressList 参数格式化错误!支持格式如:192.168.1.1-192.168.1.100")); } } @@ -144,7 +144,7 @@ public class IpUtils { // 单IP的正则 String reg = "^((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}$"; Assert.isTrue(ReUtil.isMatch(reg, ip), - () -> new PlatformException("ipAddressList 参数格式化错误!支持格式:x.x.x.x,x.x.x.x")); + () -> new PlatformException("ipAddressList 参数格式化错误!支持格式:192.168.1.1-192.168.1.100")); } } diff --git a/web/src/main/java/com/ibeetl/jlw/constants/TeacherOpenCourseScoreDashboardConstant.java b/web/src/main/java/com/ibeetl/jlw/constants/TeacherOpenCourseScoreDashboardConstant.java new file mode 100644 index 00000000..ecb791ce --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/constants/TeacherOpenCourseScoreDashboardConstant.java @@ -0,0 +1,10 @@ +package com.ibeetl.jlw.constants; + +/** + * 老师公开课分数表,放一些计算分数时会用到的常量 + * + * @author zhouzhao + * @date 2023/05/16 04:27:05 + */ +public class TeacherOpenCourseScoreDashboardConstant { +} diff --git a/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseStudentSigninSettingDao.java b/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseStudentSigninSettingDao.java index cdea4a2d..8ee1d89c 100644 --- a/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseStudentSigninSettingDao.java +++ b/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseStudentSigninSettingDao.java @@ -29,4 +29,5 @@ public interface TeacherOpenCourseStudentSigninSettingDao extends BaseMapper getValuesByQuery(TeacherOpenCourseStudentSigninSettingQuery teacherOpenCourseStudentSigninSettingQuery); List getValuesByQueryNotWithPermission(TeacherOpenCourseStudentSigninSettingQuery teacherOpenCourseStudentSigninSettingQuery); + List getByClassId(Long classId); } diff --git a/web/src/main/java/com/ibeetl/jlw/job/TeacherOpenCourseScoreDashboardJob.java b/web/src/main/java/com/ibeetl/jlw/job/TeacherOpenCourseScoreDashboardJob.java index 913c8f79..e4179867 100644 --- a/web/src/main/java/com/ibeetl/jlw/job/TeacherOpenCourseScoreDashboardJob.java +++ b/web/src/main/java/com/ibeetl/jlw/job/TeacherOpenCourseScoreDashboardJob.java @@ -1,17 +1,15 @@ package com.ibeetl.jlw.job; import cn.jlw.util.DateUtil; -import com.ibeetl.jlw.entity.Quartz; -import com.ibeetl.jlw.entity.TeacherOpenCourseScoreDashboard; +import com.ibeetl.jlw.dao.TeacherOpenCourseDao; +import com.ibeetl.jlw.entity.TeacherOpenCourse; +import com.ibeetl.jlw.service.TeacherOpenCourseScoreDashboardService; +import lombok.extern.slf4j.Slf4j; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.ibeetl.jlw.service.*; -import lombok.extern.slf4j.Slf4j; -import com.ibeetl.jlw.dao.TeacherOpenCourseDao; -import com.ibeetl.jlw.entity.TeacherOpenCourse; import java.util.Date; import java.util.List; @@ -25,7 +23,8 @@ public class TeacherOpenCourseScoreDashboardJob implements Job { @Autowired private TeacherOpenCourseDao teacherOpenCourseDao; - @Autowired private TeacherOpenCourseScoreDashboardService dashboardService; + @Autowired + private TeacherOpenCourseScoreDashboardService dashboardService; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHandsOnSimulationTasksService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHandsOnSimulationTasksService.java index 9649b664..cfce57f8 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHandsOnSimulationTasksService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseHandsOnSimulationTasksService.java @@ -12,7 +12,6 @@ import com.ibeetl.admin.core.service.CoreBaseService; import com.ibeetl.admin.core.util.PlatformException; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.admin.core.web.JsonReturnCode; -import com.ibeetl.jlw.constants.StudentHandsOnTaskConstant; import com.ibeetl.jlw.dao.TeacherOpenCourseHandsOnDao; import com.ibeetl.jlw.dao.TeacherOpenCourseHandsOnSimulationTasksDao; import com.ibeetl.jlw.dao.TeacherOpenCourseMergeResourcesQuestionDao; @@ -64,9 +63,6 @@ public class TeacherOpenCourseHandsOnSimulationTasksService extends CoreBaseServ @Autowired private StudentService studentService; - @Autowired - private ResourcesQuestionService resourcesQuestionService; - @Autowired private TeacherOpenCourseMergeResourcesQuestionDao mergeResourcesQuestionService; @@ -566,7 +562,7 @@ public class TeacherOpenCourseHandsOnSimulationTasksService extends CoreBaseServ StudentHandsOnTaskLogQuery logQuery = new StudentHandsOnTaskLogQuery(); logQuery.setHandsOnTaskId(taskId); logQuery.setStudentId(studentId); - List handsOnTaskLogs =null; + List handsOnTaskLogs = null; if (HandsOnTaskEnum.TASK_VIDEO.status.equals(task.getTaskType())) { StudentHandsOnTaskVideoQuery videoQuery = new StudentHandsOnTaskVideoQuery(); diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScoreDashboardService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScoreDashboardService.java index 69acf894..805474f5 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScoreDashboardService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScoreDashboardService.java @@ -1,8 +1,8 @@ package com.ibeetl.jlw.service; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.jlw.util.ToolUtils; import com.alibaba.fastjson.JSON; @@ -23,6 +23,7 @@ import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeStudentQuery; import com.ibeetl.jlw.web.query.TeacherOpenCourseScoreDashboardQuery; import com.ibeetl.jlw.web.query.TeacherOpenCourseStudentSigninLogQuery; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; @@ -33,6 +34,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.beetl.sql.core.SqlId; import org.beetl.sql.core.engine.PageQuery; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,6 +42,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; import java.io.*; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; @@ -71,29 +74,40 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService queryByCondition(PageQuery query) { PageQuery ret = teacherOpenCourseScoreDashboardDao.queryByCondition(query); @@ -442,198 +456,311 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService students = mergeStudentDao.getValuesByQueryNotWithPermission(studentQuery); - //todo 章节练习成绩,课程实操成绩,作业成绩,考试成绩,互动成绩 List studentScores = new ArrayList<>(); + //班次数 - Double classNum = null; - for (TeacherOpenCourseMergeStudent student : students) { - Long studentId = student.getStudentId(); + for (TeacherOpenCourseMergeStudent teacherOpenCourseMergeStudent : students) { + Long studentId = teacherOpenCourseMergeStudent.getStudentId(); + + //通过id查询学生 + Student student = studentService.queryById(studentId); + + if (student == null) { + log.error("学生不存在,studentId={}", studentId); + continue; + } + TeacherOpenCourseScoreDashboard scoreDashboard = new TeacherOpenCourseScoreDashboard(); scoreDashboard.setStudentId(studentId); - TeacherOpenCourseStudentSigninLogQuery logQuery = new TeacherOpenCourseStudentSigninLogQuery(); - logQuery.setTeacherOpenCourseId(teacherOpenCourseId); - logQuery.setStudentId(studentId); - logQuery.setTeacherOpenCourseStudentSigninLogTag(SignInTypeEnum.SIGN_IN); - List logs = studentSigninLogDao.getValuesByQueryNotWithPermission(logQuery); - if (CollectionUtil.isNotEmpty(logs)) { - //周次*开课星期的长度 - if (weight != null && "2".equals(weight.getSignInResultSetting())) { - //查询班次 - if (classNum == null) { - TeacherOpenCourseScheduleSession teacherOpenCourseScheduleSession = teacherOpenCourseScheduleSessionDao.createLambdaQuery() - .andEq(TeacherOpenCourseScheduleSession::getTeacherOpenCourseId, teacherOpenCourseId).singleSimple(); - if (teacherOpenCourseScheduleSession != null) { - String teacherOpenCourseScheduleSessionStartDate = teacherOpenCourseScheduleSession.getTeacherOpenCourseScheduleSessionStartDate(); - String teacherOpenCourseScheduleSessionEndDate = teacherOpenCourseScheduleSession.getTeacherOpenCourseScheduleSessionEndDate(); - long l = DateUtil.betweenWeek(DateUtil.parseDate(teacherOpenCourseScheduleSessionStartDate), - DateUtil.parseDate(teacherOpenCourseScheduleSessionEndDate), true); - classNum = NumberUtil.mul(l, teacherOpenCourseScheduleSession.getTeacherOpenCourseScheduleSessionWeekNum().longValue()); + scoreDashboard.setTeacherOpenCourseId(teacherOpenCourseId); + + //签到成绩 + { + //所有签到记录 + TeacherOpenCourseStudentSigninLogQuery logQuery = new TeacherOpenCourseStudentSigninLogQuery(); + logQuery.setTeacherOpenCourseId(teacherOpenCourseId); + logQuery.setStudentId(studentId); + logQuery.setTeacherOpenCourseStudentSigninLogTag(SignInTypeEnum.SIGN_IN); + List logs = studentSigninLogDao.getValuesByQueryNotWithPermission(logQuery); + scoreDashboard.setSigninScore(BigDecimal.ZERO); + if (CollectionUtil.isNotEmpty(logs)) { + + long studentAllSignCount = logs.stream().map(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninSettingId).distinct().count(); + + //签到到课率 + if (weight != null && "2".equals(weight.getSignInResultSetting())) { + + //有关该班级的所有签到设置 + List teacherOpenCourseStudentSigninSettingList = teacherOpenCourseStudentSigninSettingService.getByClassId(student.getClassId()); + + if (CollectionUtils.isNotEmpty(teacherOpenCourseStudentSigninSettingList)) { + int baseSize = teacherOpenCourseStudentSigninSettingList.size(); + //0.xxx * 100 = xx.x 结果保留一位小数 + BigDecimal signScore = BigDecimal.valueOf(studentAllSignCount).divide(BigDecimal.valueOf(baseSize), 3, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); + scoreDashboard.setSigninScore(signScore); } else { - classNum = 0D; + //有签到记录,但是没有签到设置,不应该出现这种情况 + log.error("有签到记录,但是没有签到设置,不应该出现这种情况,studentId={}", studentId); + scoreDashboard.setSigninScore(BigDecimal.ZERO); + } + } + //按签到次数乘以签到分数 + else if (weight != null && "1".equals(weight.getSignInResultSetting())) { + if (StringUtils.isNotBlank(weight.getSignInScore())) { + BigDecimal signScore = BigDecimal.valueOf(studentAllSignCount).multiply(new BigDecimal(weight.getSignInScore())).setScale(1, RoundingMode.HALF_UP); + scoreDashboard.setSigninScore(signScore); } } - double div = NumberUtil.div(logs.size(), classNum.intValue()); - double score = NumberUtil.mul(div, 100); - scoreDashboard.setSigninScore(BigDecimal.valueOf(score)); - } else if (weight != null && "1".equals(weight.getSignInResultSetting())) { - scoreDashboard.setSigninScore(BigDecimal.valueOf(NumberUtil.mul(logs.size(), Integer.parseInt(weight.getSignInScore())))); - } else { - scoreDashboard.setSigninScore(BigDecimal.valueOf(logs.size())); } - } else { - scoreDashboard.setSigninScore(BigDecimal.ZERO); + } - //章节练习 - List select = teacherOpenCourseQuestionSettingDao.createLambdaQuery() - .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId) - .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE).select(); - if (CollectionUtil.isEmpty(select)) { + + //章节练习成绩 + { scoreDashboard.setCourseScore(BigDecimal.ZERO); - } else { - List collect = select.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList()); - List select1 = questionLogSummaryService.createLambdaQuery() - .andEq(QuestionLogSummary::getPersonId, studentId) - .andIn(QuestionLogSummary::getQuestionSettingId, collect).select(); - if (weight == null || "1".equals(weight.getCoursePracticeResultSetting())) { - if (CollectionUtil.isEmpty(select1)) { - scoreDashboard.setCourseScore(BigDecimal.ZERO); - } else { - BigDecimal b = BigDecimal.ZERO; - for (QuestionLogSummary questionLogSummary : select1) { - b = b.add(questionLogSummary.getQuestionLogSummarySuccessRate()); - } - BigDecimal div = NumberUtil.div(b, select1.size()); - BigDecimal mul = NumberUtil.mul(div, 100); - scoreDashboard.setCourseScore(mul); + + //查询章节练习配置 + List chapterExerciseList = teacherOpenCourseQuestionSettingDao.createLambdaQuery() + .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId) + .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE) + .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingStatus, 1).select(); + + if (!CollectionUtil.isEmpty(chapterExerciseList)) { + List teacherOpenCourseQuestionSettingIdList = chapterExerciseList.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList()); + + //查询章节练习成绩 + List questionLogSummaryList = questionLogSummaryService.createLambdaQuery() + .andEq(QuestionLogSummary::getPersonId, studentId) + .andEq(QuestionLogSummary::getQuestionLogSummaryStatus, 1) + .andIn(QuestionLogSummary::getQuestionSettingId, teacherOpenCourseQuestionSettingIdList).select(); + + if (CollectionUtil.isEmpty(questionLogSummaryList)) { + questionLogSummaryList = new ArrayList<>(); } - } else { - BigDecimal b = BigDecimal.ZERO; - for (QuestionLogSummary questionLogSummary : select1) { - b = b.add(questionLogSummary.getQuestionLogSummaryStudentTotalScore()); + Map> questionLogSummaryMap = questionLogSummaryList.stream().collect(Collectors.groupingBy(QuestionLogSummary::getQuestionSettingId)); + + //按正确率计算 + if (weight == null || "1".equals(weight.getCoursePracticeResultSetting())) { + //总章节练习数 + int baseSize = teacherOpenCourseQuestionSettingIdList.size(); + //总正确率 + BigDecimal allSuccessRate = BigDecimal.ZERO; + for (Long settingId : teacherOpenCourseQuestionSettingIdList) { + List list = questionLogSummaryMap.get(settingId); + if (CollectionUtils.isEmpty(list)) { + continue; + } + list.sort(Comparator.comparing(QuestionLogSummary::getQuestionLogSummaryAddTime).reversed()); + QuestionLogSummary questionLogSummary = list.get(0); + 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)); + scoreDashboard.setCourseScore(avgSuccessRate); + } else if ("2".equals(weight.getCoursePracticeResultSetting())) { + //按完成进度计分:完成进度*100 + //总章节练习数 + int baseSize = teacherOpenCourseQuestionSettingIdList.size(); + int successSize = questionLogSummaryList.size(); + BigDecimal avgSuccessCount = BigDecimal.valueOf(successSize).divide(BigDecimal.valueOf(baseSize), 3, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); + scoreDashboard.setCourseScore(avgSuccessCount); } - scoreDashboard.setCourseScore(b); } + } + //实操成绩 - List single = videoService.createLambdaQuery() - .andEq(StudentHandsOnTaskVideo::getTeacherOpenCourseId, teacherOpenCourseId) - .andEq(StudentHandsOnTaskVideo::getStudentId, studentId).select(); - List single2 = pptService.createLambdaQuery() - .andEq(StudentHandsOnTaskPpt::getTeacherOpenCourseId, teacherOpenCourseId) - .andEq(StudentHandsOnTaskPpt::getStudentId, studentId).select(); - List single3 = stepService.createLambdaQuery() - .andEq(StudentHandsOnTaskStep::getTeacherOpenCourseId, teacherOpenCourseId) - .andEq(StudentHandsOnTaskStep::getStudentId, studentId).select(); - List single4 = reportService.createLambdaQuery() - .andEq(StudentHandsOnTaskReport::getTeacherOpenCourseId, teacherOpenCourseId) - .andEq(StudentHandsOnTaskReport::getStudentId, studentId).select(); - List single5 = theoryService.createLambdaQuery() - .andEq(StudentHandsOnTaskTheory::getTeacherOpenCourseId, teacherOpenCourseId) - .andEq(StudentHandsOnTaskTheory::getStudentId, studentId).select(); - BigDecimal realOperationScore = BigDecimal.ZERO; - if (CollectionUtil.isNotEmpty(single)) { - for (StudentHandsOnTaskVideo studentHandsOnTaskVideo : single) { - try { - realOperationScore = NumberUtil.add(realOperationScore, - NumberUtil.toBigDecimal(studentHandsOnTaskVideo.getVideoScore())); - } catch (Exception ee) { - ee.printStackTrace(); - } + { - } - } - if (CollectionUtil.isNotEmpty(single2)) { - for (StudentHandsOnTaskPpt studentHandsOnTaskPpt : single2) { - try { - realOperationScore = NumberUtil.add(realOperationScore, - NumberUtil.toBigDecimal(studentHandsOnTaskPpt.getPptScore())); - } catch (Exception ee) { - ee.printStackTrace(); - } + scoreDashboard.setRealOperationScore(BigDecimal.ZERO); - } - } - if (CollectionUtil.isNotEmpty(single3)) { - for (StudentHandsOnTaskStep studentHandsOnTaskStep : single3) { - try { - realOperationScore = NumberUtil.add(realOperationScore, - NumberUtil.toBigDecimal(studentHandsOnTaskStep.getTheoryScore())); - } catch (Exception ee) { - ee.printStackTrace(); - } + //查询本课程的所有实操任务 + TeacherOpenCourseHandsOn param = new TeacherOpenCourseHandsOn(); + param.setTeacherOpenCourseId(teacherOpenCourseId); - } - } - if (CollectionUtil.isNotEmpty(single4)) { - for (StudentHandsOnTaskReport studentHandsOnTaskReport : single4) { - try { - realOperationScore = NumberUtil.add(realOperationScore, - NumberUtil.toBigDecimal(studentHandsOnTaskReport.getReportScore())); - } catch (Exception ee) { - ee.printStackTrace(); - } - } - } - if (CollectionUtil.isNotEmpty(single5)) { - for (StudentHandsOnTaskTheory studentHandsOnTaskTheory : single5) { - try { - realOperationScore = NumberUtil.add(realOperationScore, - NumberUtil.toBigDecimal(studentHandsOnTaskTheory.getTheoryScore())); - } catch (Exception ee) { - ee.printStackTrace(); - } + List handsOnList = teacherOpenCourseHandsOnService.queryObjectList(param); + + if (CollectionUtil.isNotEmpty(handsOnList)) { + + List handOnIdList = handsOnList.stream().map(TeacherOpenCourseHandsOn::getHandsOnId).collect(Collectors.toList()); + + //查询本课程的所有实操任务子项 + TeacherOpenCourseHandsOnSimulationTasks query = new TeacherOpenCourseHandsOnSimulationTasks(); + param.setTeacherOpenCourseId(teacherOpenCourseId); + List teacherOpenCourseHandsOnSimulationTasksList = teacherOpenCourseHandsOnSimulationTasksService.queryObjectList(query); + + if (CollectionUtil.isNotEmpty(teacherOpenCourseHandsOnSimulationTasksList)) { + + Map> teacherOpenCourseHandsOnSimulationTasksMap = teacherOpenCourseHandsOnSimulationTasksList.stream().collect(Collectors.groupingBy(TeacherOpenCourseHandsOnSimulationTasks::getHandsOnId)); + + List studentHandsOnTaskVideoList = videoDao.createLambdaQuery() + .andEq(StudentHandsOnTaskVideo::getTeacherOpenCourseId, teacherOpenCourseId) + .andEq(StudentHandsOnTaskVideo::getStudentId, studentId).select(); + + Map> studentHandsOnTaskVideoMap = studentHandsOnTaskVideoList.stream().collect(Collectors.groupingBy(StudentHandsOnTaskVideo::getHandsOnTaskId)); + + List studentHandsOnTaskPptList = pptDao.createLambdaQuery() + .andEq(StudentHandsOnTaskPpt::getTeacherOpenCourseId, teacherOpenCourseId) + .andEq(StudentHandsOnTaskPpt::getStudentId, studentId).select(); + + Map> studentHandsOnTaskPptMap = studentHandsOnTaskPptList.stream().collect(Collectors.groupingBy(StudentHandsOnTaskPpt::getHandsOnTaskId)); + + List studentHandsOnTaskStepList = stepDao.createLambdaQuery() + .andEq(StudentHandsOnTaskStep::getTeacherOpenCourseId, teacherOpenCourseId) + .andEq(StudentHandsOnTaskStep::getStudentId, studentId).select(); + + Map> studentHandsOnTaskStepMap = studentHandsOnTaskStepList.stream().collect(Collectors.groupingBy(StudentHandsOnTaskStep::getHandsOnTaskId)); + + List studentHandsOnTaskReportList = reportDao.createLambdaQuery() + .andEq(StudentHandsOnTaskReport::getTeacherOpenCourseId, teacherOpenCourseId) + .andEq(StudentHandsOnTaskReport::getStudentId, studentId).select(); + + Map> studentHandsOnTaskReportMap = studentHandsOnTaskReportList.stream().collect(Collectors.groupingBy(StudentHandsOnTaskReport::getHandsOnTaskId)); + + List studentHandsOnTaskTheoryList = theoryDao.createLambdaQuery() + .andEq(StudentHandsOnTaskTheory::getTeacherOpenCourseId, teacherOpenCourseId) + .andEq(StudentHandsOnTaskTheory::getStudentId, studentId).select(); + + Map> studentHandsOnTaskTheoryMap = studentHandsOnTaskTheoryList.stream().collect(Collectors.groupingBy(StudentHandsOnTaskTheory::getHandsOnTaskId)); + + + //1平均分2平均完成进度 + if (weight == null || "1".equals(weight.getCoursePracticeResultSetting())) { + BigDecimal allHandOnScore = BigDecimal.ZERO; + + for (Long handOnId : handOnIdList) { + + //获取这个实操任务的所有子项,并算出总分 + List list = teacherOpenCourseHandsOnSimulationTasksMap.get(handOnId); + + if (CollectionUtil.isEmpty(list)) { + continue; + } + BigDecimal handOnTaskScoreSum = BigDecimal.ZERO; + for (TeacherOpenCourseHandsOnSimulationTasks item : list) { + BigDecimal taskScore = new BigDecimal(ObjectUtil.defaultIfBlank(item.getTaskScore(), "0")); + handOnTaskScoreSum = handOnTaskScoreSum.add(taskScore); + } + //得到这个学生的分数,一个学生一个实操任务只有一条记录 + HandsOnAchievement handsOnAchievement = new HandsOnAchievement(); + handsOnAchievement.setHandOnId(handOnId); + handsOnAchievement.setStudentId(studentId); + handsOnAchievement.setHandOnAchievementStatus(1); + HandsOnAchievement handsOnAchievementRes = handsOnAchievementService.queryObject(handsOnAchievement); + if (handsOnAchievementRes != null) { + String totalScore = handsOnAchievementRes.getTotalScore(); + if (StringUtils.isNotBlank(totalScore)) { + //转换为百分制 + BigDecimal formatScore = new BigDecimal(totalScore).multiply(new BigDecimal(100)).divide(handOnTaskScoreSum, 1, RoundingMode.HALF_UP); + allHandOnScore = allHandOnScore.add(formatScore); + } + } + } + BigDecimal avgScore = allHandOnScore.divide(new BigDecimal(handOnIdList.size()), 1, RoundingMode.HALF_UP); + scoreDashboard.setRealOperationScore(avgScore); + } else if ("2".equals(weight.getCoursePracticeResultSetting())) { + + BigDecimal allDoStepSuccessProportion = BigDecimal.ZERO; + for (Long handOnId : handOnIdList) { + //获取这个实操任务的所有子项 + List list = teacherOpenCourseHandsOnSimulationTasksMap.get(handOnId); + + if (CollectionUtil.isNotEmpty(list)) { + //得出这个实操任务的完成率 + int doStepTimes = 0; + for (TeacherOpenCourseHandsOnSimulationTasks task : list) { + if (studentHandsOnTaskVideoMap.containsKey(task.getTaskId()) + || studentHandsOnTaskPptMap.containsKey(task.getTaskId()) + || studentHandsOnTaskStepMap.containsKey(task.getTaskId()) + || studentHandsOnTaskReportMap.containsKey(task.getTaskId()) + || studentHandsOnTaskTheoryMap.containsKey(task.getTaskId())) { + doStepTimes++; + } + } + //计算完成率 + BigDecimal divide = new BigDecimal(doStepTimes).divide(new BigDecimal(list.size()), 5, RoundingMode.HALF_UP); + if (divide.compareTo(BigDecimal.ONE) > 0) { + divide = BigDecimal.ONE; + } + allDoStepSuccessProportion = allDoStepSuccessProportion.add(divide); + } + } + //计算平均完成率并乘以100得出分数 + BigDecimal avgScore = allDoStepSuccessProportion.multiply(new BigDecimal(100)).divide(new BigDecimal(handOnIdList.size()), 1, RoundingMode.HALF_UP); + scoreDashboard.setRealOperationScore(avgScore); + } + } } } - scoreDashboard.setRealOperationScore(realOperationScore); + //作业 - List select2 = teacherOpenCourseQuestionSettingDao.createLambdaQuery() - .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId) - .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_QUESTION).select(); - if (CollectionUtil.isEmpty(select2)) { - scoreDashboard.setQuestionHomeworkScore(BigDecimal.ZERO); - } else { - List collect = select2.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList()); - List select1 = questionLogSummaryService.createLambdaQuery() - .andEq(QuestionLogSummary::getPersonId, studentId) - .andIn(QuestionLogSummary::getQuestionSettingId, collect).select(); - if (CollectionUtil.isEmpty(select1)) { + { + //假设本课程开了 2门考试,为A考试 B考试 + // + //A考试 学生考了两遍 第一遍 考了 80分 第二次考了79分 ,下面的计算取最近的一次 也就是79分 + // + //B考试 学生考了一遍 得分 100分 + // + // + //则成绩页面考试得分 = (79+100)/2 = 89.5分 + //记得百分制 + List select2 = teacherOpenCourseQuestionSettingDao.createLambdaQuery() + .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseId, teacherOpenCourseId) + .andEq(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingType, ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_QUESTION).select(); + if (CollectionUtil.isEmpty(select2)) { scoreDashboard.setQuestionHomeworkScore(BigDecimal.ZERO); } else { - BigDecimal b = BigDecimal.ZERO; - for (QuestionLogSummary questionLogSummary : select1) { - b = b.add(questionLogSummary.getQuestionLogSummaryStudentTotalScore()); - } - scoreDashboard.setQuestionHomeworkScore(b); - } - } - //考试 - List 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 collect = select3.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList()); + List collect = select2.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList()); List select1 = questionLogSummaryService.createLambdaQuery() .andEq(QuestionLogSummary::getPersonId, studentId) .andIn(QuestionLogSummary::getQuestionSettingId, collect).select(); if (CollectionUtil.isEmpty(select1)) { - scoreDashboard.setExamScore(BigDecimal.ZERO); + scoreDashboard.setQuestionHomeworkScore(BigDecimal.ZERO); } else { BigDecimal b = BigDecimal.ZERO; for (QuestionLogSummary questionLogSummary : select1) { b = b.add(questionLogSummary.getQuestionLogSummaryStudentTotalScore()); } - scoreDashboard.setExamScore(b); + scoreDashboard.setQuestionHomeworkScore(b); + } + } + } + + //考试 + { + List 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 collect = select3.stream().map(TeacherOpenCourseQuestionSetting::getTeacherOpenCourseQuestionSettingId).collect(Collectors.toList()); + List select1 = questionLogSummaryService.createLambdaQuery() + .andEq(QuestionLogSummary::getPersonId, studentId) + .andIn(QuestionLogSummary::getQuestionSettingId, collect).select(); + if (CollectionUtil.isEmpty(select1)) { + scoreDashboard.setExamScore(BigDecimal.ZERO); + } else { + BigDecimal b = BigDecimal.ZERO; + for (QuestionLogSummary questionLogSummary : select1) { + b = b.add(questionLogSummary.getQuestionLogSummaryStudentTotalScore()); + } + scoreDashboard.setExamScore(b); + } } } } + //互动 List chatLogList = courseChatLogDao.createLambdaQuery() .andEq(TeacherOpenCourseChatLog::getStudentId, studentId) @@ -665,6 +792,8 @@ public class TeacherOpenCourseScoreDashboardService extends CoreBaseService getByClassId(Long classId) { + return teacherOpenCourseStudentSigninSettingDao.getByClassId(classId); + } } diff --git a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md index 0989ca58..0096e110 100644 --- a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md +++ b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md @@ -293,7 +293,6 @@ studentScoreList LEFT JOIN student ta ON ta.student_id = t.student_id WHERE 1 = 1 - AND t.teacher_open_course_question_log_status = 2 AND ta.student_sn IS NOT NULL @if(!isEmpty(teacherOpenCourseQuestionLogId)){ and t.teacher_open_course_question_log_id =#teacherOpenCourseQuestionLogId# diff --git a/web/src/main/resources/sql/jlw/teacherOpenCourseStudentSigninSetting.md b/web/src/main/resources/sql/jlw/teacherOpenCourseStudentSigninSetting.md index 779cff47..4e69929f 100644 --- a/web/src/main/resources/sql/jlw/teacherOpenCourseStudentSigninSetting.md +++ b/web/src/main/resources/sql/jlw/teacherOpenCourseStudentSigninSetting.md @@ -473,4 +473,11 @@ getValuesByQueryNotWithPermission @} - +getByClassId +=== + * 根据班级id查询签到设置 + select t.* + from teacher_open_course_student_signin_setting t + where 1=1 + and t.teacher_open_course_student_signin_setting_status = 1 + and find_in_set(#schoolClassId#,t.school_class_ids) \ No newline at end of file