From 984dc83c2e93ee05d8ea57db5beec76a773d4716 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 04 七月 2025 18:08:49 +0800 Subject: [PATCH] 部分代码 --- ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java | 738 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 659 insertions(+), 79 deletions(-) diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java index 24caf4c..2f5da68 100644 --- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java +++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java @@ -1,8 +1,11 @@ package com.ruoyi.study.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.constant.Constants; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.GlobalException; +import com.ruoyi.common.core.web.domain.BaseModel; import com.ruoyi.study.domain.*; import com.ruoyi.study.dto.StudyWeekDTO; import com.ruoyi.study.mapper.TStudyMapper; @@ -11,6 +14,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -45,6 +50,8 @@ private ITGameService gameService; @Resource private ITStoryListenService storyListenService; + @Resource + private ITSubjectRecordDetailService subjectRecordDetailService; private final static Map<Integer, Integer> GAME_DIFFICULTY_MAP = new HashMap<>(); @@ -418,7 +425,7 @@ } @Override - public StudyListenResultVO listenSelectPicture(Integer week, Integer day, List<TStudyListen> studyListens) { + public StudyListenResultVO listenSelectPicture(Integer week, Integer day, List<TStudyListen> studyListens, Integer userid) { if (studyListens.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -436,22 +443,103 @@ learnStudy.setIntegral(total); // 语音及图片 List<List<TSubject>> subjectList = new ArrayList<>(); - for (TStudyListen studyListen : studyListens) { - List<String> subjectIds = Arrays.stream(studyListen.getSubject().split(",")).collect(Collectors.toList()); - List<TSubject> list = new ArrayList<>(); - // 图片及语音集合 - for (String id : subjectIds) { - TSubject data = subjectService.lambdaQuery().eq(TSubject::getId, id) - .eq(TSubject::getDisabled, 0).one(); - list.add(data); + + StudyListenResultVO studyListenResultVO = new StudyListenResultVO(learnStudy, subjectList); + List<TSubjectRecordDetail> subjectRecordDetails = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week).ne(BaseModel::getDisabled, 0).list(); + List<TSubjectRecordDetail> listenList = subjectRecordDetails.stream().filter(e -> e.getType() == 1).collect(Collectors.toList()); + int listenPass = (int) listenList.stream().filter(e -> e.getStatus() == 2).count(); + int listenSize = listenList.size(); + if (listenSize!=0){ + // 计算当前通关率 + double listenRate = (double) listenPass /listenSize; + TStudyListen one = studyListenService.lambdaQuery().eq(TStudyListen::getWeek, week) + .eq(TStudyListen::getDay, 1).last("limit 1").one(); + if (one!=null){ + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + // 清空答题记录 + subjectRecordDetailService.remove(new LambdaQueryWrapper<TSubjectRecordDetail>() + .eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay,day) + .eq(TSubjectRecordDetail::getType + ,1)); + } } - subjectList.add(list); } - return new StudyListenResultVO(learnStudy, subjectList); + List<TSubjectRecordDetail> list = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay, day) + .eq(TSubjectRecordDetail::getType, 1).list(); + if (list.isEmpty()) { + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (TStudyListen studyListen : studyListens) { + List<String> subjectIds = Arrays.stream(studyListen.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subs = new ArrayList<>(); + // 图片及语音集合 + for (String id : subjectIds) { + TSubject data = subjectService.lambdaQuery().eq(TSubject::getId, id) + .eq(TSubject::getDisabled, 0).one(); + subs.add(data); + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(1); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setObjectId(studyListen.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + } + subjectList.add(subs); + } + subjectRecordDetailService.saveBatch(tSubjectRecordDetails); + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setAccuracy(new BigDecimal("0.00")); + + } else { + + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (TStudyListen studyListen : studyListens) { + List<String> subjectIds = Arrays.stream(studyListen.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subs = new ArrayList<>(); + // 图片及语音集合 + for (String id : subjectIds) { + TSubject data = subjectService.lambdaQuery().eq(TSubject::getId, id) + .eq(TSubject::getDisabled, 0).one(); + subs.add(data); + } + subjectList.add(subs); + List<TSubjectRecordDetail> tSubjectRecordDetail1 = list.stream().filter(e -> e.getObjectId().equals(studyListen.getId())).collect(Collectors.toList()); + + if (tSubjectRecordDetail1.isEmpty()){ + for (int i = 0; i < 4; i++) { + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(1); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setObjectId(studyListen.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + } + subjectRecordDetailService.saveBatch(tSubjectRecordDetails); + }else{ + tSubjectRecordDetails.addAll(tSubjectRecordDetail1); + } + } + + studyListenResultVO.setList(tSubjectRecordDetails); + // 计算正确率 + BigDecimal accuracy = new BigDecimal(tSubjectRecordDetails.stream().filter(tSubjectRecordDetail -> tSubjectRecordDetail.getStatus().equals(2)).count()) + .divide(new BigDecimal(tSubjectRecordDetails.size()), 2, RoundingMode.HALF_UP); + studyListenResultVO.setAccuracy(accuracy); + } + studyListenResultVO.setSubjectList(subjectList); + return studyListenResultVO; } @Override - public StudyLookResultVO pictureSelectVoice(Integer week, Integer day, List<TStudyLook> lookList) { + public R<StudyLookResultVO> pictureSelectVoice(Integer week, Integer day, List<TStudyLook> lookList, Integer userid) { if (lookList.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -469,26 +557,128 @@ learnStudy.setIntegral(total); // 语音及图片 List<List<TSubject>> subjectList = new ArrayList<>(); - for (TStudyLook studyLook : lookList) { - List<String> sortList = Arrays.stream(studyLook.getSort().split(",")).collect(Collectors.toList()); - List<String> subjectIds = Arrays.stream(studyLook.getSubject().split(",")).collect(Collectors.toList()); - List<TSubject> list = new ArrayList<>(); - // 图片及语音集合 - for (int i = 0; i < subjectIds.size(); i++) { - TSubject data = subjectService.lambdaQuery().eq(TSubject::getId, subjectIds.get(i)) - .eq(TSubject::getDisabled, 0).one(); - data.setSort(Integer.parseInt(sortList.get(i))); - list.add(data); + + StudyLookResultVO studyListenResultVO = new StudyLookResultVO(learnStudy, subjectList); + List<TSubjectRecordDetail> subjectRecordDetails = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week).ne(BaseModel::getDisabled, 0).list(); + List<TSubjectRecordDetail> listenList = subjectRecordDetails.stream().filter(e -> e.getType() == 1).collect(Collectors.toList()); + int listenPass = (int) listenList.stream().filter(e -> e.getStatus() == 2).count(); + int listenSize = listenList.size(); + if (listenSize!=0){ + // 先计算上一天的通关率 设置为两位小数 + double listenRate = (double) listenPass /listenSize; + BigDecimal divide = new BigDecimal(listenPass).divide(new BigDecimal(listenSize), 2, RoundingMode.HALF_UP); + TStudyListen one = studyListenService.lambdaQuery().eq(TStudyListen::getWeek, week) + .eq(TStudyListen::getDay, 1).last("limit 1").one(); + if (one!=null){ + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + return R.fail("听音选图未达到通关率"+one.getRate()+"%,"+"当前通关率:"+divide+"%"); + } } - // 根据顺序排序 - list.sort(Comparator.comparingInt(TSubject::getSort)); - subjectList.add(list); } - return new StudyLookResultVO(learnStudy, subjectList); + List<TSubjectRecordDetail> lookList1 = subjectRecordDetails.stream().filter(e -> e.getType() == 2).collect(Collectors.toList()); + int lookPass = (int) lookList1.stream().filter(e -> e.getStatus() == 2).count(); + int lookSize = lookList1.size(); + if (lookSize!=0){ + // 计算当前通关率 + double listenRate = (double) lookPass /lookSize; + TStudyLook one = studyLookService.lambdaQuery().eq(TStudyLook::getWeek, week) + .eq(TStudyLook::getDay, 2).last("limit 1").one(); + if (one!=null){ + // 通关率未达标 + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + // 清空答题记录 + subjectRecordDetailService.remove(new LambdaQueryWrapper<TSubjectRecordDetail>() + .eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay,day) + .eq(TSubjectRecordDetail::getType + ,2)); + } + } + } + List<TSubjectRecordDetail> list = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay, day) + .eq(TSubjectRecordDetail::getType, 2).list(); + if (list.isEmpty()) { + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (TStudyLook studyLook : lookList) { + List<String> sortList = Arrays.stream(studyLook.getSort().split(",")).collect(Collectors.toList()); + List<String> subjectIds = Arrays.stream(studyLook.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subjects = new ArrayList<>(); + // 图片及语音集合 + for (int i = 0; i < subjectIds.size(); i++) { + TSubject data = subjectService.lambdaQuery().eq(TSubject::getId, subjectIds.get(i)) + .eq(TSubject::getDisabled, 0).one(); + data.setSort(Integer.parseInt(sortList.get(i))); + subjects.add(data); + } + // 根据顺序排序 + subjects.sort(Comparator.comparingInt(TSubject::getSort)); + subjectList.add(subjects); + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(2); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setObjectId(studyLook.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + } + + studyListenResultVO.setSubjectList(subjectList); + subjectRecordDetailService.saveBatch(tSubjectRecordDetails); + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setAccuracy(new BigDecimal("0.00")); + + } else { + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + List<Integer> collect1 = lookList.stream().map(TStudyLook::getId).collect(Collectors.toList()); + List<TSubjectRecordDetail> collect3 = list.stream().filter(e -> !collect1.contains(e.getObjectId())).collect(Collectors.toList()); + subjectRecordDetailService.removeBatchByIds(collect3); + for (TStudyLook studyLook : lookList) { + List<String> sortList = Arrays.stream(studyLook.getSort().split(",")).collect(Collectors.toList()); + List<String> subjectIds = Arrays.stream(studyLook.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subjects = new ArrayList<>(); + // 图片及语音集合 + for (int i = 0; i < subjectIds.size(); i++) { + TSubject data = subjectService.lambdaQuery().eq(TSubject::getId, subjectIds.get(i)) + .eq(TSubject::getDisabled, 0).one(); + data.setSort(Integer.parseInt(sortList.get(i))); + subjects.add(data); + } + // 根据顺序排序 + subjects.sort(Comparator.comparingInt(TSubject::getSort)); + subjectList.add(subjects); + List<TSubjectRecordDetail> tSubjectRecordDetail1 = list.stream().filter(e -> e.getObjectId().equals(studyLook.getId())).collect(Collectors.toList()); + if (tSubjectRecordDetail1.isEmpty()){ + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(3); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setObjectId(studyLook.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + subjectRecordDetailService.save(tSubjectRecordDetail); + }else{ + tSubjectRecordDetails.addAll(tSubjectRecordDetail1); + } + + + } + + studyListenResultVO.setAccuracy(new BigDecimal(tSubjectRecordDetails.stream().filter(tSubjectRecordDetail -> tSubjectRecordDetail.getStatus().equals(2)).count()) + .divide(new BigDecimal(tSubjectRecordDetails.size()), 2, RoundingMode.HALF_UP)); + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setSubjectList(subjectList); + } + return R.ok(studyListenResultVO); } @Override - public StudyInductionResultVO induceExclude(Integer week, Integer day, List<TStudyInduction> inductionList) { + public R<StudyInductionResultVO> induceExclude(Integer week, Integer day, List<TStudyInduction> inductionList, Integer userid) { if (inductionList.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -506,45 +696,166 @@ learnStudy.setIntegral(total); // 语音及图片 List<List<TSubject>> subjectList = new ArrayList<>(); - for (TStudyInduction data : inductionList) { - List<String> subjectIds = Arrays.stream(data.getSubject().split(",")).collect(Collectors.toList()); - List<TSubject> subjectLists = new ArrayList<>(); - // 第一组题 固定下标为0,1,2的题 - for (int i = 0; i < Constants.THREE; i++) { - String id = subjectIds.get(i); - if (!id.startsWith("-")) { - subjectLists.add(subjectService.getById(id)); + + StudyInductionResultVO studyListenResultVO = new StudyInductionResultVO(learnStudy, subjectList); + + List<TSubjectRecordDetail> list = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay, day) + .eq(TSubjectRecordDetail::getType, 3).list(); + List<TSubjectRecordDetail> subjectRecordDetails = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week).ne(BaseModel::getDisabled, 0).list(); + List<TSubjectRecordDetail> listenList = subjectRecordDetails.stream().filter(e -> e.getType() == 2).collect(Collectors.toList()); + int listenPass = (int) listenList.stream().filter(e -> e.getStatus() == 2).count(); + int listenSize = listenList.size(); + if (listenSize!=0){ + // 先计算上一天的通关率 设置为两位小数 + double listenRate = (double) listenPass /listenSize; + BigDecimal divide = new BigDecimal(listenPass).divide(new BigDecimal(listenSize), 2, RoundingMode.HALF_UP); + TStudyLook one = studyLookService.lambdaQuery().eq(TStudyLook::getWeek, week) + .eq(TStudyLook::getDay, 2).last("limit 1").one(); + if (one!=null){ + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + return R.fail("看图选音未达到通关率"+one.getRate()+"%,"+"当前通关率:"+divide+"%"); } } - for (int i = 0; i < Constants.THREE; i++) { - String id = subjectIds.get(i); - if (id.startsWith("-")) { - id = id.replace("-", ""); - subjectLists.add(subjectService.getById(id)); - } - } - // 第二组题,固定下标为3,4的题 - for (int i = Constants.THREE; i < Constants.FIVE; i++) { - String id = subjectIds.get(i); - if (!id.startsWith("-")) { - subjectLists.add(subjectService.getById(id)); - } - } - for (int i = Constants.THREE; i < Constants.FIVE; i++) { - String id = subjectIds.get(i); - if (id.startsWith("-")) { - id = id.replace("-", ""); - subjectLists.add(subjectService.getById(id)); - } - } - subjectLists.add(subjectService.getById(subjectIds.get(subjectIds.size() - 1).replace("-", ""))); - subjectList.add(subjectLists); } - return new StudyInductionResultVO(learnStudy, subjectList); + List<TSubjectRecordDetail> lookList1 = subjectRecordDetails.stream().filter(e -> e.getType() == 3).collect(Collectors.toList()); + int lookPass = (int) lookList1.stream().filter(e -> e.getStatus() == 2).count(); + int lookSize = lookList1.size(); + if (lookSize!=0){ + // 计算当前通关率 + double listenRate = (double) lookPass /lookSize; + TStudyInduction one = studyInductionService.lambdaQuery().eq(TStudyInduction::getWeek, week) + .eq(TStudyInduction::getDay, 3).last("limit 1").one(); + if (one!=null){ + // 通关率未达标 + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + // 清空答题记录 + subjectRecordDetailService.remove(new LambdaQueryWrapper<TSubjectRecordDetail>() + .eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay,day) + .eq(TSubjectRecordDetail::getType + ,3)); + } + } + } + if (list.isEmpty()) { + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (TStudyInduction data : inductionList) { + List<String> subjectIds = Arrays.stream(data.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subjectLists = new ArrayList<>(); + // 第一组题 固定下标为0,1,2的题 + for (int i = 0; i < Constants.THREE; i++) { + String id = subjectIds.get(i); + if (!id.startsWith("-")) { + subjectLists.add(subjectService.getById(id)); + } + } + for (int i = 0; i < Constants.THREE; i++) { + String id = subjectIds.get(i); + if (id.startsWith("-")) { + id = id.replace("-", ""); + subjectLists.add(subjectService.getById(id)); + } + } + // 第二组题,固定下标为3,4的题 + for (int i = Constants.THREE; i < Constants.FIVE; i++) { + String id = subjectIds.get(i); + if (!id.startsWith("-")) { + subjectLists.add(subjectService.getById(id)); + } + } + for (int i = Constants.THREE; i < Constants.FIVE; i++) { + String id = subjectIds.get(i); + if (id.startsWith("-")) { + id = id.replace("-", ""); + subjectLists.add(subjectService.getById(id)); + } + } + subjectLists.add(subjectService.getById(subjectIds.get(subjectIds.size() - 1).replace("-", ""))); + subjectList.add(subjectLists); + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setObjectId(data.getId()); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(3); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetails.add(tSubjectRecordDetail); + } + studyListenResultVO.setSubjectList(subjectList); + + subjectRecordDetailService.saveBatch(tSubjectRecordDetails); + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setAccuracy(new BigDecimal("0.00")); + + } else { + List<Integer> collect1 = inductionList.stream().map(TStudyInduction::getId).collect(Collectors.toList()); + List<TSubjectRecordDetail> collect3 = list.stream().filter(e -> !collect1.contains(e.getObjectId())).collect(Collectors.toList()); + subjectRecordDetailService.removeBatchByIds(collect3); + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (TStudyInduction data : inductionList) { + List<String> subjectIds = Arrays.stream(data.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subjectLists = new ArrayList<>(); + // 第一组题 固定下标为0,1,2的题 + for (int i = 0; i < Constants.THREE; i++) { + String id = subjectIds.get(i); + if (!id.startsWith("-")) { + subjectLists.add(subjectService.getById(id)); + } + } + for (int i = 0; i < Constants.THREE; i++) { + String id = subjectIds.get(i); + if (id.startsWith("-")) { + id = id.replace("-", ""); + subjectLists.add(subjectService.getById(id)); + } + } + // 第二组题,固定下标为3,4的题 + for (int i = Constants.THREE; i < Constants.FIVE; i++) { + String id = subjectIds.get(i); + if (!id.startsWith("-")) { + subjectLists.add(subjectService.getById(id)); + } + } + for (int i = Constants.THREE; i < Constants.FIVE; i++) { + String id = subjectIds.get(i); + if (id.startsWith("-")) { + id = id.replace("-", ""); + subjectLists.add(subjectService.getById(id)); + } + } + subjectLists.add(subjectService.getById(subjectIds.get(subjectIds.size() - 1).replace("-", ""))); + subjectList.add(subjectLists); + + TSubjectRecordDetail tSubjectRecordDetail1 = list.stream().filter(e -> e.getObjectId().equals(data.getId())).findFirst().orElse(null); + if (tSubjectRecordDetail1==null){ + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(3); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setObjectId(data.getId()); + subjectRecordDetailService.save(tSubjectRecordDetail); + + tSubjectRecordDetails.add(tSubjectRecordDetail); + }else{ + tSubjectRecordDetails.add(tSubjectRecordDetail1); + } + } + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setAccuracy(new BigDecimal(tSubjectRecordDetails.stream().filter(tSubjectRecordDetail -> tSubjectRecordDetail.getStatus().equals(2)).count()) + .divide(new BigDecimal(tSubjectRecordDetails.size()), 2, RoundingMode.HALF_UP)); + } + studyListenResultVO.setSubjectList(subjectList); + return R.ok(studyListenResultVO); } @Override - public StudyAnswerResultVO questionsAndAnswers(Integer week, Integer day, List<TStudyAnswer> answerList) { + public R<StudyAnswerResultVO> questionsAndAnswers(Integer week, Integer day, List<TStudyAnswer> answerList, Integer userid) { if (answerList.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -562,16 +873,132 @@ learnStudy.setIntegral(total); // 题目语音及图片信息 List<List<QuestionsAnswersSubjectVO>> subjectList = new ArrayList<>(); - for (int i = 0; i < answerList.size(); i += Constants.TWO) { - List<QuestionsAnswersSubjectVO> voList = new ArrayList<>(); - // 一组题目为四道题, - TStudyAnswer one = answerList.get(i); - TStudyAnswer two = answerList.get(i + 1); - voAdd(voList, one); - voAdd(voList, two); - subjectList.add(voList); + + StudyAnswerResultVO studyListenResultVO = new StudyAnswerResultVO(learnStudy, subjectList); + + List<TSubjectRecordDetail> list = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay, day) + .eq(TSubjectRecordDetail::getType, 4).list(); + List<TSubjectRecordDetail> subjectRecordDetails = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week).ne(BaseModel::getDisabled, 0).list(); + List<TSubjectRecordDetail> listenList = subjectRecordDetails.stream().filter(e -> e.getType() == 3).collect(Collectors.toList()); + int listenPass = (int) listenList.stream().filter(e -> e.getStatus() == 2).count(); + int listenSize = listenList.size(); + if (listenSize!=0){ + // 先计算上一天的通关率 设置为两位小数 + double listenRate = (double) listenPass /listenSize; + BigDecimal divide = new BigDecimal(listenPass).divide(new BigDecimal(listenSize), 2, RoundingMode.HALF_UP); + TStudyInduction one = studyInductionService.lambdaQuery().eq(TStudyInduction::getWeek, week) + .eq(TStudyInduction::getDay, 3).last("limit 1").one(); + if (one!=null){ + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + return R.fail("归纳排除未达到通关率"+one.getRate()+"%,"+"当前通关率:"+divide+"%"); + } + } } - return new StudyAnswerResultVO(learnStudy, subjectList); + List<TSubjectRecordDetail> lookList1 = subjectRecordDetails.stream().filter(e -> e.getType() == 4).collect(Collectors.toList()); + int lookPass = (int) lookList1.stream().filter(e -> e.getStatus() == 2).count(); + int lookSize = lookList1.size(); + if (lookSize!=0){ + // 计算当前通关率 + double listenRate = (double) lookPass /lookSize; + TStudyAnswer one = studyAnswerService.lambdaQuery().eq(TStudyAnswer::getWeek, week) + .eq(TStudyAnswer::getDay, 4).last("limit 1").one(); + if (one!=null){ + // 通关率未达标 + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + // 清空答题记录 + subjectRecordDetailService.remove(new LambdaQueryWrapper<TSubjectRecordDetail>() + .eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay,day) + .eq(TSubjectRecordDetail::getType + ,4)); + } + } + } + if (list.isEmpty()) { + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (int i = 0; i < answerList.size(); i += Constants.TWO) { + List<QuestionsAnswersSubjectVO> voList = new ArrayList<>(); + // 一组题目为四道题, + TStudyAnswer one = answerList.get(i); + TStudyAnswer two = answerList.get(i + 1); + voAdd(voList, one); + voAdd(voList, two); + subjectList.add(voList); + } + for (int i = 0; i < answerList.size(); i += 4) { + // 一组题目为四道题, + TStudyAnswer one = answerList.get(i); + TStudyAnswer two = answerList.get(i + 1); + TStudyAnswer three = answerList.get(i + 2); + TStudyAnswer four = answerList.get(i + 3); + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(4); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setOne(one.getId()); + tSubjectRecordDetail.setTwo(two.getId()); + tSubjectRecordDetail.setThree(three.getId()); + tSubjectRecordDetail.setFour(four.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + } + subjectRecordDetailService.saveBatch(tSubjectRecordDetails); + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setAccuracy(new BigDecimal("0.00")); + + } else { + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (int i = 0; i < answerList.size(); i += Constants.TWO) { + List<QuestionsAnswersSubjectVO> voList = new ArrayList<>(); + // 一组题目为四道题, + TStudyAnswer one = answerList.get(i); + TStudyAnswer two = answerList.get(i + 1); + voAdd(voList, one); + voAdd(voList, two); + subjectList.add(voList); + } + + + List<TSubjectRecordDetail> tSubjectRecordDetails1 = new ArrayList<TSubjectRecordDetail>(); + + for (int i = 0; i < answerList.size(); i += 4) { + TStudyAnswer one = answerList.get(i); + TStudyAnswer two = answerList.get(i + 1); + TStudyAnswer three = answerList.get(i + 2); + TStudyAnswer four = answerList.get(i + 3); + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(4); + int size = list.size(); + if (size-1>=i/4){ + tSubjectRecordDetail.setStatus(list.get(i/4).getStatus()); + }else{ + tSubjectRecordDetail.setStatus(1); + } + tSubjectRecordDetail.setOne(one.getId()); + tSubjectRecordDetail.setTwo(two.getId()); + tSubjectRecordDetail.setThree(three.getId()); + tSubjectRecordDetail.setFour(four.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + tSubjectRecordDetails1.add(tSubjectRecordDetail); + } + List<Long> collect = list.stream().map(TSubjectRecordDetail::getId).collect(Collectors.toList()); + subjectRecordDetailService.removeBatchByIds(collect); + subjectRecordDetailService.saveBatch(tSubjectRecordDetails1); + + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setAccuracy(new BigDecimal(tSubjectRecordDetails.stream().filter(tSubjectRecordDetail -> tSubjectRecordDetail.getStatus().equals(2)).count()) + .divide(new BigDecimal(tSubjectRecordDetails.size()), 2, RoundingMode.HALF_UP)); + } + studyListenResultVO.setSubjectList(subjectList); + return R.ok(studyListenResultVO); } private void voAdd(List<QuestionsAnswersSubjectVO> voList, TStudyAnswer one) { @@ -613,7 +1040,7 @@ } @Override - public StudyPairResultVO pictureMateVoice(Integer week, Integer day, List<TStudyPair> pair) { + public R<StudyPairResultVO> pictureMateVoice(Integer week, Integer day, List<TStudyPair> pair, Integer userid) { if (pair.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -631,18 +1058,115 @@ learnStudy.setIntegral(total); // 语音及图片 List<List<TSubject>> subjectList = new ArrayList<>(); - for (TStudyPair data : pair) { - List<String> subjectIds = Arrays.stream(data.getSubject().split(",")).collect(Collectors.toList()); - List<TSubject> subjectLists = new ArrayList<>(); - for (String id : subjectIds) { - if (id.startsWith("-")) { - id = id.replace("-", ""); + + StudyPairResultVO studyListenResultVO = new StudyPairResultVO(learnStudy, subjectList); + + List<TSubjectRecordDetail> list = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay, day) + .eq(TSubjectRecordDetail::getType, 5).list(); + List<TSubjectRecordDetail> subjectRecordDetails = subjectRecordDetailService.lambdaQuery().eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week).ne(BaseModel::getDisabled, 0).list(); + List<TSubjectRecordDetail> listenList = subjectRecordDetails.stream().filter(e -> e.getType() == 4).collect(Collectors.toList()); + int listenPass = (int) listenList.stream().filter(e -> e.getStatus() == 2).count(); + int listenSize = listenList.size(); + if (listenSize!=0){ + // 先计算上一天的通关率 设置为两位小数 + double listenRate = (double) listenPass /listenSize; + BigDecimal divide = new BigDecimal(listenPass).divide(new BigDecimal(listenSize), 2, RoundingMode.HALF_UP); + TStudyAnswer one = studyAnswerService.lambdaQuery().eq(TStudyAnswer::getWeek, week) + .eq(TStudyAnswer::getDay, 4).last("limit 1").one(); + if (one!=null){ + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + return R.fail("归纳排除未达到通关率"+one.getRate()+"%,"+"当前通关率:"+divide+"%"); } - subjectLists.add(subjectService.getById(id)); } - subjectList.add(subjectLists); } - return new StudyPairResultVO(learnStudy, subjectList); + List<TSubjectRecordDetail> lookList1 = subjectRecordDetails.stream().filter(e -> e.getType() == 5).collect(Collectors.toList()); + int lookPass = (int) lookList1.stream().filter(e -> e.getStatus() == 2).count(); + int lookSize = lookList1.size(); + if (lookSize!=0){ + // 计算当前通关率 + double listenRate = (double) lookPass /lookSize; + TStudyPair one = studyPairService.lambdaQuery().eq(TStudyPair::getWeek, week) + .eq(TStudyPair::getDay, 5).last("limit 1").one(); + if (one!=null){ + // 通关率未达标 + if (listenRate<(Double.parseDouble(one.getRate())/100)){ + // 清空答题记录 + subjectRecordDetailService.remove(new LambdaQueryWrapper<TSubjectRecordDetail>() + .eq(TSubjectRecordDetail::getUserId, userid) + .eq(TSubjectRecordDetail::getWeek, week) + .eq(TSubjectRecordDetail::getDay,day) + .eq(TSubjectRecordDetail::getType + ,5)); + } + } + } + if (list.isEmpty()) { + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (TStudyPair data : pair) { + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(5); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setObjectId(data.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + + List<String> subjectIds = Arrays.stream(data.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subjectLists = new ArrayList<>(); + for (String id : subjectIds) { + if (id.startsWith("-")) { + id = id.replace("-", ""); + } + subjectLists.add(subjectService.getById(id)); + } + subjectList.add(subjectLists); + } + studyListenResultVO.setSubjectList(subjectList); + subjectRecordDetailService.saveBatch(tSubjectRecordDetails); + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setAccuracy(new BigDecimal("0.00")); + + } else { + List<Integer> collect1 = pair.stream().map(TStudyPair::getId).collect(Collectors.toList()); + List<TSubjectRecordDetail> collect3 = list.stream().filter(e -> !collect1.contains(e.getObjectId())).collect(Collectors.toList()); + subjectRecordDetailService.removeBatchByIds(collect3); + List<TSubjectRecordDetail> tSubjectRecordDetails = new ArrayList<>(); + for (TStudyPair data : pair) { + List<String> subjectIds = Arrays.stream(data.getSubject().split(",")).collect(Collectors.toList()); + List<TSubject> subjectLists = new ArrayList<>(); + for (String id : subjectIds) { + if (id.startsWith("-")) { + id = id.replace("-", ""); + } + subjectLists.add(subjectService.getById(id)); + } + subjectList.add(subjectLists); + List<TSubjectRecordDetail> tSubjectRecordDetail1 = list.stream().filter(e -> e.getObjectId().equals(data.getId())).collect(Collectors.toList()); + + if (tSubjectRecordDetail1.isEmpty()){ + TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); + tSubjectRecordDetail.setUserId(userid); + tSubjectRecordDetail.setWeek(week); + tSubjectRecordDetail.setDay(day); + tSubjectRecordDetail.setType(5); + tSubjectRecordDetail.setStatus(1); + tSubjectRecordDetail.setObjectId(data.getId()); + tSubjectRecordDetails.add(tSubjectRecordDetail); + subjectRecordDetailService.save(tSubjectRecordDetail); + }else{ + tSubjectRecordDetails.addAll(tSubjectRecordDetail1); + } + } + studyListenResultVO.setList(tSubjectRecordDetails); + studyListenResultVO.setSubjectList(subjectList); + studyListenResultVO.setAccuracy(new BigDecimal(tSubjectRecordDetails.stream().filter(tSubjectRecordDetail -> tSubjectRecordDetail.getStatus().equals(2)).count()) + .divide(new BigDecimal(tSubjectRecordDetails.size()), 2, RoundingMode.HALF_UP)); + } + return R.ok(studyListenResultVO); } @Override @@ -933,4 +1457,60 @@ } } + @Override + public Integer userGameDifficulty(TUserStudy studyRecord, Integer week) { + List<TStudy> studyList = this.lambdaQuery().eq(TStudy::getDisabled, 0) + .eq(TStudy::getType, 1) + .orderByAsc(TStudy::getWeek).list(); + // 基础学习进度 + Integer day = studyRecord.getDay(); + Integer studyWeek = studyRecord.getWeek(); + Map<Integer, List<TStudy>> studyMap = new HashMap<>(8); + for (TStudy study : studyList) { + Integer quarter = study.getQuarter(); + List<TStudy> itemList = studyMap.get(quarter); + if (null == itemList) { + itemList = new ArrayList<>(); + } + itemList.add(study); + studyMap.put(quarter, itemList); + } + // 学习进度所属季度 + int studyQuarter = 1; + // 当前进入周目所属季度 + int thisQuarter = 1; + for (Map.Entry<Integer, List<TStudy>> map : studyMap.entrySet()) { + Integer key = map.getKey(); + List<TStudy> list = map.getValue(); + List<Integer> collect = list.stream().map(TStudy::getWeek).collect(Collectors.toList()); + if (collect.contains(studyWeek)) { + studyQuarter = key; + } + if (collect.contains(week)) { + thisQuarter = key; + } + } + // 默认进度为 0 + int defaultSchedule; + // 季度判断 + if (studyQuarter > thisQuarter) { + defaultSchedule = 2; + } else if (studyQuarter < thisQuarter) { + defaultSchedule = 0; + } else { + List<TStudy> tStudies = studyMap.get(studyQuarter); + List<Integer> weekList = tStudies.stream().map(TStudy::getWeek).collect(Collectors.toList()); + int studyIndex = weekList.indexOf(studyWeek); + int weekIndex = weekList.indexOf(week); + if (studyIndex > weekIndex) { + defaultSchedule = 2; + } else if (studyIndex < weekIndex) { + defaultSchedule = 0; + } else { + defaultSchedule = studyRecord.getGameDifficulty(); + } + } + return defaultSchedule; + } + } -- Gitblit v1.7.1