From a62395529de2851a41121c363d75fe6f0b2c13d8 Mon Sep 17 00:00:00 2001 From: xiaoCJ <406612557@qq.com> Date: Wed, 25 Dec 2024 11:13:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9E=E9=AA=8C=E5=AE=9E?= =?UTF-8?q?=E8=AE=AD=E7=AE=97=E5=88=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/stu/StuScoreController.java | 2 +- .../service/stu/StuScoreService.java | 1 + .../service/stu/impl/StuScoreServiceImpl.java | 71 ++++++++++++++++--- .../tea/impl/TeaCaseStepServiceImpl.java | 5 +- .../tea/impl/TeaGradeManageServiceImpl.java | 56 +++++++++++++-- 5 files changed, 116 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/sztzjy/financial_bigdata/controller/stu/StuScoreController.java b/src/main/java/com/sztzjy/financial_bigdata/controller/stu/StuScoreController.java index 8403239..6b4986b 100644 --- a/src/main/java/com/sztzjy/financial_bigdata/controller/stu/StuScoreController.java +++ b/src/main/java/com/sztzjy/financial_bigdata/controller/stu/StuScoreController.java @@ -57,7 +57,7 @@ public class StuScoreController { public ResultEntity getScoreInfo(@RequestParam String userId, @RequestParam String chapterId, @RequestParam String schoolId, - @RequestParam String systemOwner) { + @RequestParam String systemOwner){ StuTrainingDto stuTrainingDto = new StuTrainingDto(); StuTrainingExample stuTrainingExample = new StuTrainingExample(); diff --git a/src/main/java/com/sztzjy/financial_bigdata/service/stu/StuScoreService.java b/src/main/java/com/sztzjy/financial_bigdata/service/stu/StuScoreService.java index 9db2e3e..87af010 100644 --- a/src/main/java/com/sztzjy/financial_bigdata/service/stu/StuScoreService.java +++ b/src/main/java/com/sztzjy/financial_bigdata/service/stu/StuScoreService.java @@ -4,6 +4,7 @@ import com.sztzjy.financial_bigdata.entity.StuTrainingWithBLOBs; import com.sztzjy.financial_bigdata.entity.resource_entity.SysThreeCatalog; import com.sztzjy.financial_bigdata.entity.stu_dto.StuTrainingDto; +import java.io.IOException; import java.util.List; /** diff --git a/src/main/java/com/sztzjy/financial_bigdata/service/stu/impl/StuScoreServiceImpl.java b/src/main/java/com/sztzjy/financial_bigdata/service/stu/impl/StuScoreServiceImpl.java index cb10602..42f66fd 100644 --- a/src/main/java/com/sztzjy/financial_bigdata/service/stu/impl/StuScoreServiceImpl.java +++ b/src/main/java/com/sztzjy/financial_bigdata/service/stu/impl/StuScoreServiceImpl.java @@ -1,21 +1,27 @@ package com.sztzjy.financial_bigdata.service.stu.impl; -import com.sztzjy.financial_bigdata.entity.StuTrainingWithBLOBs; -import com.sztzjy.financial_bigdata.entity.SysWeight; -import com.sztzjy.financial_bigdata.entity.SysWeightExample; -import com.sztzjy.financial_bigdata.entity.TrainingReport; +import com.sztzjy.financial_bigdata.entity.*; import com.sztzjy.financial_bigdata.entity.resource_entity.SysThreeCatalog; +import com.sztzjy.financial_bigdata.entity.resource_entity.TestSysCaseQuestionStep; +import com.sztzjy.financial_bigdata.entity.resource_entity.TestTestSysCaseQuestionStepWithBLOBs; import com.sztzjy.financial_bigdata.entity.stu_dto.StuTrainingDto; +import com.sztzjy.financial_bigdata.mapper.StuTrainingStepRecordMapper; import com.sztzjy.financial_bigdata.mapper.SysWeightMapper; import com.sztzjy.financial_bigdata.mapper.TrainingReportMapper; +import com.sztzjy.financial_bigdata.resourceCenterAPI.CaseApi; +import com.sztzjy.financial_bigdata.resourceCenterAPI.CourseAPI; import com.sztzjy.financial_bigdata.service.stu.StuScoreService; +import com.sztzjy.financial_bigdata.util.ResultEntity; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; +import java.util.stream.Collectors; /** * @Author xcj @@ -27,7 +33,8 @@ public class StuScoreServiceImpl implements StuScoreService { private SysWeightMapper sysWeightMapper; @Autowired TrainingReportMapper trainingReportMapper; - + @Autowired + StuTrainingStepRecordMapper trainingStepRecordMapper; // @Override // public StuTrainingDto getScoreByChapterId(String schoolId, String systemOwner, StuTrainingWithBLOBs stuTrainingWithBLOBs, StuTrainingDto stuTrainingDto, SysThreeCatalog sysCourseChapter) { @@ -118,7 +125,7 @@ public class StuScoreServiceImpl implements StuScoreService { @Override - public StuTrainingDto getScoreByChapterId(String schoolId, String systemOwner, StuTrainingWithBLOBs stuTrainingWithBLOBs, StuTrainingDto stuTrainingDto, SysThreeCatalog sysCourseChapter) { + public StuTrainingDto getScoreByChapterId(String schoolId, String systemOwner, StuTrainingWithBLOBs stuTrainingWithBLOBs, StuTrainingDto stuTrainingDto, SysThreeCatalog sysCourseChapter){ SysWeightExample sysWeightExample = new SysWeightExample(); sysWeightExample.createCriteria().andCourseIdEqualTo(sysCourseChapter.getTwoId()) .andSchoolIdEqualTo(schoolId) @@ -136,13 +143,43 @@ public class StuScoreServiceImpl implements StuScoreService { // 计算各模块得分 //知识概要和学习资源得分已经乘过权重,直接返回 + //实验实训得分 if (stuTrainingDto.getCaseStuScore() == null) { stuTrainingDto.setCaseStuScore(BigDecimal.ZERO); } else { - BigDecimal caseStuScore = stuTrainingDto.getCaseStuScore(); //实验实训得分 + + //1.取出章节下的有所案例ID + List stepList = null; + try { + stepList = CaseApi.selectCaseStepListBatchByIdListAndSort(sysCourseChapter.getThreeId()); + } catch (IOException e) { + throw new RuntimeException("资源中心根据根据案例题IDS批量查询失败"); + } + List stepIdList = stepList.stream().map(TestSysCaseQuestionStep::getCaseStepId).collect(Collectors.toList()); + + //2.步骤表中所有得分之和 + BigDecimal rightTotalScore = stepList.stream() + .map(TestTestSysCaseQuestionStepWithBLOBs::getScore) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + //3.记录表中所有ID得分之和 + StuTrainingStepRecordExample example =new StuTrainingStepRecordExample(); + example.createCriteria().andCaseStepIdIn(stepIdList); + List stuTrainingStepRecords = trainingStepRecordMapper.selectByExampleWithBLOBs(example); + + double stuTotalScore = stuTrainingStepRecords.stream() //学生总共得分 + .map(StuTrainingStepRecord::getScore) + .mapToDouble(Double::parseDouble) + .sum(); + + BigDecimal expTrainingWeight = stuTrainingDto.getExpTrainingWeight(); //实验实训权重 - BigDecimal weightCaseScore = expTrainingWeight.multiply(caseStuScore).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); - stuTrainingDto.setCaseStuScore(weightCaseScore); //返回乘过权重的 + BigDecimal accuracy = BigDecimal.valueOf(stuTotalScore).divide(rightTotalScore,2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).multiply(expTrainingWeight.divide(BigDecimal.valueOf(100))); + if (accuracy.compareTo(expTrainingWeight)>0){ + accuracy = expTrainingWeight; + } + //这里返回正确率 模块得分/模块案例满分*100*权重 + stuTrainingDto.setCaseStuScore(accuracy); //返回乘过权重的 } //学习测评 @@ -152,6 +189,9 @@ public class StuScoreServiceImpl implements StuScoreService { BigDecimal learningEvalScore = stuTrainingDto.getLearningEvalScore(); BigDecimal learningEvalWeight = stuTrainingDto.getLearningEvalWeight(); BigDecimal weightLearningEvalScore = learningEvalWeight.multiply(learningEvalScore).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + if (weightLearningEvalScore.compareTo(learningEvalWeight)>0){ + weightLearningEvalScore = learningEvalWeight; + } stuTrainingDto.setLearningEvalScore(weightLearningEvalScore); } @@ -162,8 +202,11 @@ public class StuScoreServiceImpl implements StuScoreService { }else { BigDecimal resourceLearningScore = stuTrainingDto.getResourceLearningScore(); BigDecimal resourceLearningWeight = stuTrainingDto.getResourceLearningWeight(); - BigDecimal weightLearningEvalScore = resourceLearningWeight.multiply(resourceLearningScore).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); - stuTrainingDto.setResourceLearningScore(weightLearningEvalScore); + BigDecimal weightresourceLearningScore = resourceLearningWeight.multiply(resourceLearningScore).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + if (weightresourceLearningScore.compareTo(resourceLearningWeight)>0){ + weightresourceLearningScore = resourceLearningWeight; + } + stuTrainingDto.setResourceLearningScore(weightresourceLearningScore); } //知识概要 @@ -173,6 +216,9 @@ public class StuScoreServiceImpl implements StuScoreService { BigDecimal knowledgeSummaryScore = stuTrainingDto.getKnowledgeSummaryScore(); BigDecimal knowledgeSummaryWeight = stuTrainingDto.getKnowledgeSummaryWeight(); BigDecimal weightKnowledgeSummaryScore = knowledgeSummaryWeight.multiply(knowledgeSummaryScore).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + if (weightKnowledgeSummaryScore.compareTo(knowledgeSummaryWeight)>0){ + weightKnowledgeSummaryScore = knowledgeSummaryWeight; + } stuTrainingDto.setKnowledgeSummaryScore(weightKnowledgeSummaryScore); } @@ -186,6 +232,9 @@ public class StuScoreServiceImpl implements StuScoreService { BigDecimal reportScore = trainingReport.getTeacherScore(); BigDecimal reportWeight = stuTrainingDto.getReportWeight(); BigDecimal weightReportScore = reportScore.multiply(reportWeight).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + if (weightReportScore.compareTo(reportWeight)>0){ + weightReportScore = reportWeight; + } stuTrainingDto.setReportScore(weightReportScore); stuTrainingDto.setReportCompleteStatus("已提交"); } diff --git a/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaCaseStepServiceImpl.java b/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaCaseStepServiceImpl.java index 57a3d44..e4820be 100644 --- a/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaCaseStepServiceImpl.java +++ b/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaCaseStepServiceImpl.java @@ -102,7 +102,10 @@ public class TeaCaseStepServiceImpl implements ITeaCaseStepService { stepRecord.setCaseStepId(commitCaseDto.getCaseStepId()); stepRecord.setStuAnswer(commitCaseDto.getStuAnswer()); TestTestSysCaseQuestionStepWithBLOBs sysCaseQuestionStep = CaseApi.selectCaseStepDetails(commitCaseDto.getCaseStepId()); - if(dbCaseQuestionStep.getAnswer().equals(commitCaseDto.getStuAnswer())){ + String answerOriginal = dbCaseQuestionStep.getAnswerOriginal(); + String cleanedString = answerOriginal.replaceAll("^```python|```$", "").replaceAll("\\s*|\r|\n|\t", "").trim();//表里取的正确答案 + String stuAnswer = commitCaseDto.getStuAnswer().replaceAll("\\s*|\r|\n|\t", "").trim(); //前端传的学生答案 + if(cleanedString.equals(stuAnswer)){ //答案正确 记录到案例步骤记录表中 stepRecord.setScore(String.valueOf(sysCaseQuestionStep.getScore())); diff --git a/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaGradeManageServiceImpl.java b/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaGradeManageServiceImpl.java index 197cd98..7ff3ae4 100644 --- a/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaGradeManageServiceImpl.java +++ b/src/main/java/com/sztzjy/financial_bigdata/service/tea/impl/TeaGradeManageServiceImpl.java @@ -7,6 +7,8 @@ import com.github.pagehelper.PageInfo; import com.sztzjy.financial_bigdata.entity.*; import com.sztzjy.financial_bigdata.entity.resource_entity.SysThreeCatalog; import com.sztzjy.financial_bigdata.entity.resource_entity.SysTwoCatalog; +import com.sztzjy.financial_bigdata.entity.resource_entity.TestSysCaseQuestionStep; +import com.sztzjy.financial_bigdata.entity.resource_entity.TestTestSysCaseQuestionStepWithBLOBs; import com.sztzjy.financial_bigdata.entity.stu_dto.StuTrainingDto; import com.sztzjy.financial_bigdata.entity.stu_dto.StuUserDto; import com.sztzjy.financial_bigdata.entity.tea_dto.StuTheoryRecordDto; @@ -14,6 +16,7 @@ import com.sztzjy.financial_bigdata.entity.tea_dto.TeaExamAndUserDto; import com.sztzjy.financial_bigdata.entity.tea_dto.TeaExaminationDetailsDto; import com.sztzjy.financial_bigdata.entity.tea_dto.TeaTrainingInfoDTO; import com.sztzjy.financial_bigdata.mapper.*; +import com.sztzjy.financial_bigdata.resourceCenterAPI.CaseApi; import com.sztzjy.financial_bigdata.resourceCenterAPI.CourseAPI; import com.sztzjy.financial_bigdata.service.stu.StuScoreService; import com.sztzjy.financial_bigdata.service.tea.ITeaGradeManageService; @@ -56,6 +59,9 @@ public class TeaGradeManageServiceImpl implements ITeaGradeManageService { private StuTrainingMapper stuTrainingMapper; @Autowired private StuScoreService stuScoreService; + @Autowired + private StuTrainingStepRecordMapper trainingStepRecordMapper; + @Override public PageInfo getTrainingInfo(Integer index, Integer size, String schoolId, String keyWord, String classId, String systemOwner) { @@ -352,18 +358,56 @@ public class TeaGradeManageServiceImpl implements ITeaGradeManageService { BigDecimal learningEvalWeight = sysWeight.getLearningEvalWeight(); BigDecimal expTrainingWeight = sysWeight.getExpTrainingWeight(); - //知识概要和学习资源乘过权重了 BigDecimal knowledgeSummaryScore = Optional.ofNullable(stuTrainingWithBLOB.getKnowledgeSummaryScore()).orElse(BigDecimal.ZERO); BigDecimal resourceLearningScore = Optional.ofNullable(stuTrainingWithBLOB.getResourceLearningScore()).orElse(BigDecimal.ZERO); BigDecimal learningEvalScore = Optional.ofNullable(stuTrainingWithBLOB.getLearningEvalScore()).orElse(BigDecimal.ZERO); BigDecimal expTrainingScore = Optional.ofNullable(stuTrainingWithBLOB.getExpTrainingScore()).orElse(BigDecimal.ZERO); - knowledgeSummaryScore = knowledgeSummaryWeight.multiply(knowledgeSummaryScore); - resourceLearningScore = resourceLearningScore.multiply(resourceLearningWeight); - learningEvalScore = learningEvalScore.multiply(learningEvalWeight).divide(BigDecimal.valueOf(100).setScale(2,RoundingMode.HALF_UP)); - expTrainingScore = expTrainingScore.multiply(expTrainingWeight).divide(BigDecimal.valueOf(100).setScale(2,RoundingMode.HALF_UP)); + knowledgeSummaryScore = knowledgeSummaryWeight.multiply(knowledgeSummaryScore).divide(BigDecimal.valueOf(100).setScale(2, RoundingMode.HALF_UP)); + if (knowledgeSummaryScore.compareTo(knowledgeSummaryWeight) > 0) { + knowledgeSummaryScore = knowledgeSummaryWeight; + } + resourceLearningScore = resourceLearningScore.multiply(resourceLearningWeight).divide(BigDecimal.valueOf(100).setScale(2, RoundingMode.HALF_UP)); + if (resourceLearningScore.compareTo(resourceLearningWeight) > 0) { + resourceLearningScore = resourceLearningWeight; + } + learningEvalScore = learningEvalScore.multiply(learningEvalWeight).divide(BigDecimal.valueOf(100).setScale(2, RoundingMode.HALF_UP)); + if (learningEvalScore.compareTo(learningEvalWeight) > 0) { + learningEvalScore = learningEvalWeight; + } + + //实验实训 + String chapterId = stuTrainingWithBLOB.getChapterId(); + //1.取出章节下的有所案例ID + List stepList = null; + try { + stepList = CaseApi.selectCaseStepListBatchByIdListAndSort(chapterId); + } catch (IOException e) { + throw new RuntimeException("资源中心根据根据案例题IDS批量查询失败"); + } + List stepIdList = stepList.stream().map(TestSysCaseQuestionStep::getCaseStepId).collect(Collectors.toList()); + + //2.步骤表中所有得分之和 + BigDecimal rightTotalScore = stepList.stream() + .map(TestTestSysCaseQuestionStepWithBLOBs::getScore) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + //3.记录表中所有ID得分之和 + StuTrainingStepRecordExample example =new StuTrainingStepRecordExample(); + example.createCriteria().andCaseStepIdIn(stepIdList); + List stuTrainingStepRecords = trainingStepRecordMapper.selectByExampleWithBLOBs(example); - return knowledgeSummaryScore.add(resourceLearningScore).add(learningEvalScore).add(expTrainingScore); + double stuTotalScore = stuTrainingStepRecords.stream() //学生总共得分 + .map(StuTrainingStepRecord::getScore) + .mapToDouble(Double::parseDouble) + .sum(); + + BigDecimal accuracy = BigDecimal.valueOf(stuTotalScore).divide(rightTotalScore,2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).multiply(expTrainingWeight.divide(BigDecimal.valueOf(100))); + + if (accuracy.compareTo(expTrainingWeight) > 0) { + accuracy = expTrainingWeight; + } + return knowledgeSummaryScore.add(resourceLearningScore).add(learningEvalScore).add(accuracy); } @Override