ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/config/DatasourceModel.java
@@ -15,15 +15,17 @@ public class DatasourceModel { // private String url = "jdbc:mysql://127.0.0.1:10633/dolphin_goods?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; // private String username = "root"; // private String password = "HaiTunEnglish2024!"; // private String password = "HaiTun@2024!"; // private String driverClassName = "com.mysql.cj.jdbc.Driver"; // private Integer maxActive =20; // private Long maxWait = 60000L; // private Integer minIdle =5; // private Integer initialSize =2; private String url = "jdbc:mysql://127.0.0.1:10633/dolphin_goods?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; private String url = "jdbc:mysql://127.0.0.1:3306/dolphin_goods?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; private String username = "root"; private String password = "Haitunyingyu@2025!"; private String password = "root"; private String driverClassName = "com.mysql.cj.jdbc.Driver"; private Integer maxActive =20; private Long maxWait = 60000L; ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/config/RedissonConfig.java
@@ -23,9 +23,9 @@ public RedissonClient redissonClient() { Config config = new Config(); //线上redis config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("Haitunyingyu@2025!"); // config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("Xiwang2024!"); // // 本地redis // config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456"); config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456"); return Redisson.create(config); } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/DatasourceModel.java
@@ -13,20 +13,20 @@ @Data @Component public class DatasourceModel { // private String url = "jdbc:mysql://127.0.0.1:10633/dolphin_study?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; // private String username = "root"; // private String password = "Haitunyingyu@2025!"; // private String driverClassName = "com.mysql.cj.jdbc.Driver"; // private Integer maxActive =20; // private Long maxWait = 60000L; // private Integer minIdle =5; // private Integer initialSize =2; private String url = "jdbc:mysql://127.0.0.1:3306/dolphin_study?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; private String url = "jdbc:mysql://127.0.0.1:10633/dolphin_study?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; private String username = "root"; private String password = "root"; private String password = "HaiTun@2024!"; private String driverClassName = "com.mysql.cj.jdbc.Driver"; private Integer maxActive =20; private Long maxWait = 60000L; private Integer minIdle =5; private Integer initialSize =2; // private String url = "jdbc:mysql://127.0.0.1:3306/dolphin_study?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai"; // private String username = "root"; // private String password = "root"; // private String driverClassName = "com.mysql.cj.jdbc.Driver"; // private Integer maxActive =20; // private Long maxWait = 60000L; // private Integer minIdle =5; // private Integer initialSize =2; } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/ShardingConfig.java
@@ -98,12 +98,20 @@ props6.setProperty("algorithm-expression", "t_subject_record$->{userId % 5 + 1}"); result1.getShardingAlgorithms().put("t_subject_record-inline", new AlgorithmConfiguration("INLINE", props6)); result1.getKeyGenerators().put("t_subject_record-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties())); //分片规则配置 result1.getTables().add(getCoursePackageOrderTableRuleConfiguration1()); Properties props7 = new Properties(); props7.setProperty("algorithm-expression", "t_user_present_record$->{user_id % 5 + 1}"); result1.getShardingAlgorithms().put("t_user_present_record-inline", new AlgorithmConfiguration("INLINE", props7)); result1.getKeyGenerators().put("t_user_present_record-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties())); //分片规则配置 result1.getTables().add(getCoursePackageOrderTableRuleConfiguration2()); Properties props8 = new Properties(); props8.setProperty("algorithm-expression", "t_subject_record_detail$->{userId % 5 + 1}"); result1.getShardingAlgorithms().put("t_subject_record_detail-inline", new AlgorithmConfiguration("INLINE", props8)); result1.getKeyGenerators().put("t_subject_record_detail-snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties())); linkedList.add(result1); return linkedList; @@ -162,11 +170,18 @@ result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("userId", "t_subject_record-inline")); result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_subject_record-snowflake")); return result; }private ShardingTableRuleConfiguration getCoursePackageOrderTableRuleConfiguration1() { } private ShardingTableRuleConfiguration getCoursePackageOrderTableRuleConfiguration1() { ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_user_present_record", "m_$->{0}.t_user_present_record$->{1..5}");//30 result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("user_id", "t_user_present_record-inline")); result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_user_present_record-snowflake")); return result; } private ShardingTableRuleConfiguration getCoursePackageOrderTableRuleConfiguration2() { ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_subject_record_detail", "m_$->{0}.t_subject_record_detail$->{1..5}");//30 result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("userId", "t_subject_record_detail-inline")); result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "t_subject_record_detail-snowflake")); return result; } } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/ToLongDeserializer.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.study.config; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; public class ToLongDeserializer extends JsonDeserializer<Long> { @Override public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String value = p.getText(); try { return value != null ? Long.parseLong(value) : null; } catch (NumberFormatException e) { throw new IOException("Invalid long value: " + value, e); } } } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -24,9 +24,17 @@ import kotlin.random.Random; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.sound.sampled.*; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -83,65 +91,19 @@ private ManagementClient managementClient; @Resource private ITUserPresentRecordService userPresentRecordService; @Resource private ITSubjectRecordDetailService subjectRecordDetailService; @PostMapping("/testAddData") @ApiOperation(value = "测试分片", tags = {"测试分片"}) public R<Object> testAddData() { TIntegralRecord tIntegralRecord = new TIntegralRecord(); tIntegralRecord.setIntegral("1"); tIntegralRecord.setMethod("1"); tIntegralRecord.setUserId(23); tIntegralRecord.setGameId(1); tIntegralRecord.setGameDifficulty(1); tIntegralRecord.setStoryId(1); tIntegralRecord.setStoryType(1); integralRecordService.save(tIntegralRecord); TGameRecord tGameRecord = new TGameRecord(); tGameRecord.setUserId(33); tGameRecord.setAccuracy(0); tGameRecord.setGameName(""); tGameRecord.setUseTime(0); tGameRecord.setUseTime1(""); tGameRecord.setGameId(0); tGameRecord.setGameDifficulty(0); tGameRecord.setTime(""); tGameRecord.setDisabled(false); tGameRecord.setCreateBy(""); tGameRecord.setCreateTime(new Date()); tGameRecord.setUpdateBy(""); tGameRecord.setUpdateTime(new Date()); gameRecordService.save(tGameRecord); TSubjectRecord tSubjectRecord = new TSubjectRecord(); tSubjectRecord.setUserId(22); tSubjectRecord.setWeek(0); tSubjectRecord.setDay(0); tSubjectRecord.setBeforeSubject(""); tSubjectRecord.setType(0); tSubjectRecord.setCompleteSubject(""); tSubjectRecord.setAnswerNumber(0); tSubjectRecord.setCorrectNumber(0); tSubjectRecord.setDisabled(false); tSubjectRecord.setCreateBy(""); tSubjectRecord.setCreateTime(new Date()); tSubjectRecord.setUpdateBy(""); tSubjectRecord.setUpdateTime(new Date()); subjectRecordService.save(tSubjectRecord); TUserPresentRecord tUserPresentRecord = new TUserPresentRecord(); tUserPresentRecord.setUserId(44); tUserPresentRecord.setPresentTime(new Date()); tUserPresentRecord.setIsDelete(0); userPresentRecordService.save(tUserPresentRecord); TSubjectRecordDetail tSubjectRecordDetail = new TSubjectRecordDetail(); tSubjectRecordDetail.setUserId(12); subjectRecordDetailService.save(tSubjectRecordDetail); TUserStudyRecord tUserStudyRecord = new TUserStudyRecord(); tUserStudyRecord.setUserId(17); tUserStudyRecord.setQuarter(0); tUserStudyRecord.setWeek(0); tUserStudyRecord.setDay(0); tUserStudyRecord.setObtainedIntegral(0); tUserStudyRecord.setType(0); tUserStudyRecord.setStudyType(0); tUserStudyRecord.setStoryId(0); studyRecordService.save(tUserStudyRecord); return R.ok(); } @@ -537,6 +499,10 @@ return R.ok(); } public static void main(String[] args) throws Exception { double temp =1.687; System.err.println((int)temp); } /** * 添加周目 * @@ -549,10 +515,7 @@ .eq("week", dto.getWeek()) .eq("type", dto.getType())); if (one != null) { one.setType(dto.getType()); one.setWeek(dto.getWeek()); one.setTitle(dto.getTitle()); one.setQuarter(dto.getQuarter()); studyService.saveOrUpdate(one); } else { TStudy tStudy = new TStudy(); @@ -570,8 +533,69 @@ .orderByAsc(TStudy::getWeek) .list(); int i = 1; List<TGame> games = gameService.list(new QueryWrapper<TGame>()); List<TStoryListen> storyListens = storyListenService.list(new QueryWrapper<TStoryListen>()); List<TStudyListen> studyListens = studyListenService.list(); List<TStudyLook> studyLooks = studyLookService.list(); List<TStudyInduction> studyInductions = studyInductionService.list(); List<TStudyAnswer> studyAnswers = studyAnswerService.list(); List<TStudyPair> studyPairs = studyPairService.list(); for (TStudy tStudy : list1) { System.err.println("进入修改"); tStudy.setWeek(i); // 将对应的题目配置修改week List<TGame> games1 = games.stream().filter(e->e.getWeek().equals(tStudy.getWeek())).collect(Collectors.toList()); for (TGame tGame : games1) { tGame.setWeek(i); tGame.setStudyId(tStudy.getId()); gameService.updateById(tGame); } // 听故事 List<TStoryListen> storyListens1 = storyListens.stream().filter(e->e.getWeek().equals(tStudy.getWeek())).collect(Collectors.toList()); for (TStoryListen tStoryListen : storyListens1) { tStoryListen.setWeek(i); tStoryListen.setStudyId(tStudy.getId()); storyListenService.updateById(tStoryListen); } // 听音选图 List<TStudyListen> studyListens1 = studyListens.stream().filter(e->e.getWeek().equals(tStudy.getWeek())).collect(Collectors.toList()); for (TStudyListen tStudyListen : studyListens1) { tStudyListen.setWeek(i); tStudyListen.setStudyId(tStudy.getId()); studyListenService.updateById(tStudyListen); } // 看图选音 List<TStudyLook>studyLooks1 = studyLooks.stream().filter(e->e.getWeek().equals(tStudy.getWeek())).collect(Collectors.toList()); for (TStudyLook tStudyLook : studyLooks1) { tStudyLook.setWeek(i); tStudyLook.setStudyId(tStudy.getId()); studyLookService.updateById(tStudyLook); } // 归纳判断 List<TStudyInduction> studyInductions1 = studyInductions.stream().filter(e->e.getWeek().equals(tStudy.getWeek())).collect(Collectors.toList()); for (TStudyInduction tStudyInduction : studyInductions1) { tStudyInduction.setWeek(i); tStudyInduction.setStudyId(tStudy.getId()); System.err.println("归纳判断"+tStudy.getId()); studyInductionService.updateById(tStudyInduction); } List<TStudyAnswer> studyAnswers1 = studyAnswers.stream().filter(e->e.getWeek().equals(tStudy.getWeek())).collect(Collectors.toList()); for (TStudyAnswer tStudyAnswer : studyAnswers1) { tStudyAnswer.setStudyId(tStudy.getId()); tStudyAnswer.setWeek(i); studyAnswerService.updateById(tStudyAnswer); } List<TStudyPair> studyPairs1 = studyPairs.stream().filter(e->e.getWeek().equals(tStudy.getWeek())).collect(Collectors.toList()); for (TStudyPair tStudyPair : studyPairs1) { tStudyPair.setWeek(i); tStudyPair.setStudyId(tStudy.getId()); studyPairService.updateById(tStudyPair); } i++; } studyService.updateBatchById(list1); @@ -670,13 +694,17 @@ List<TStudyListen> list = studyListenService.list(new QueryWrapper<TStudyListen>() .eq("week", week) .eq("day", day)); List<TSubject> list9 = subjectService.list(); for (TStudyListen tStudyListen : list) { StringBuilder temp = new StringBuilder(); StudyListenVO studyListenVO = new StudyListenVO(); if (StringUtils.hasLength(tStudyListen.getSubject())) { for (String s : tStudyListen.getSubject().split(",")) { TSubject byId = subjectService.getById(s); temp.append(byId.getName()).append(","); TSubject byId = list9.stream().filter(e -> e.getId().equals(Integer.valueOf(s))).findFirst().orElse(null); if (byId!=null){ temp.append(byId.getName()).append(","); } } String string = temp.toString(); studyListenVO.setName(string.substring(0, string.length() - 1)); @@ -699,8 +727,10 @@ StudyLookVO studyLookVO1 = new StudyLookVO(); if (StringUtils.hasLength(tStudyLook.getSubject())) { for (String s : tStudyLook.getSubject().split(",")) { TSubject byId = subjectService.getById(s); names.append(byId.getName()).append(","); TSubject byId = list9.stream().filter(e -> e.getId().equals(Integer.valueOf(s))).findFirst().orElse(null); if (byId!=null){ names.append(byId.getName()).append(","); } String[] split = tStudyLook.getSort().split(","); String s1 = split[index]; sorts.append(s1).append(","); @@ -728,8 +758,10 @@ if (StringUtils.hasLength(tStudyInduction.getSubject())) { for (String s : tStudyInduction.getSubject().split(",")) { String replace = s.replace("-", ""); TSubject byId = subjectService.getById(replace); names.append(byId.getName()).append(","); TSubject byId = list9.stream().filter(e -> e.getId().equals(Integer.valueOf(replace))).findFirst().orElse(null); if (byId!=null){ names.append(byId.getName()).append(","); } } String string = names.toString(); studyInductionVO.setName(string.substring(0, string.length() - 1)); @@ -750,21 +782,31 @@ if (tStudyAnswer.getIsAnswer() != null) { if (tStudyAnswer.getIsAnswer() == 1) { if (tStudyAnswer.getSubject() != null) { TSubject byId = subjectService.getById(tStudyAnswer.getSubject()); names.append(byId.getName()).append(","); TSubject byId = list9.stream().filter(e -> e.getId().equals(tStudyAnswer.getSubject())).findFirst().orElse(null); if (byId!=null){ names.append(byId.getName()).append(","); } } if (tStudyAnswer.getAnswerSubject() != null) { TSubject byId1 = subjectService.getById(tStudyAnswer.getAnswerSubject()); names.append(byId1.getName()).append(","); TSubject byId1 = list9.stream().filter(e -> e.getId().equals(tStudyAnswer.getAnswerSubject())).findFirst().orElse(null); if (byId1!=null){ names.append(byId1.getName()).append(","); } } } else { if (tStudyAnswer.getSubject() != null) { TSubject byId = subjectService.getById(tStudyAnswer.getSubject()); names.append(byId.getName()).append(","); TSubject byId = list9.stream().filter(e -> e.getId().equals(tStudyAnswer.getSubject())).findFirst().orElse(null); if (byId!=null){ names.append(byId.getName()).append(","); } } if (tStudyAnswer.getAnswerSubject() != null) { TSubject byId1 = subjectService.getById(tStudyAnswer.getAnswerSubject()); names.append(byId1.getName()).append(","); TSubject byId1 = list9.stream().filter(e -> e.getId().equals(tStudyAnswer.getAnswerSubject())).findFirst().orElse(null); if (byId1!=null){ names.append(byId1.getName()).append(","); } } } } @@ -789,8 +831,11 @@ StudyPairVO studyPairVO = new StudyPairVO(); if (StringUtils.hasLength(tStudyPair.getSubject())) { for (String s : tStudyPair.getSubject().split(",")) { TSubject byId = subjectService.getById(s); names.append(byId.getName()).append(","); TSubject byId = list9.stream().filter(e -> e.getId().equals(Integer.valueOf(s))).findFirst().orElse(null); if (byId!=null){ names.append(byId.getName()).append(","); } } String string = names.toString(); studyPairVO.setName(string.substring(0, string.length() - 1)); @@ -816,6 +861,9 @@ } List<TStoryListen> list6 = storyListenService.list(new QueryWrapper<TStoryListen>() .eq("week", week)); List<TStory> list10 = storyService.list(); for (TStoryListen tStory : list6) { StoryVO storyVO = new StoryVO(); storyVO.setStory(tStory.getStory()); @@ -826,14 +874,19 @@ StringBuilder sort1 = new StringBuilder(); if (StringUtils.hasLength(tStory.getStory())) { for (String s : tStory.getStory().split(",")) { TStory byId = storyService.getById(s); names.append(byId.getName()).append(","); TStory byId = list10.stream().filter(e -> e.getId().equals(Integer.valueOf(s))).findFirst().orElse(null); if (byId!=null){ names.append(byId.getName()).append(","); } } } if (StringUtils.hasLength(tStory.getLookStory())) { for (String s : tStory.getLookStory().split(",")) { TStory byId = storyService.getById(s); names1.append(byId.getName()).append(","); TStory byId = list10.stream().filter(e -> e.getId().equals(Integer.valueOf(s))).findFirst().orElse(null); if (byId!=null){ names1.append(byId.getName()).append(","); } } } if (StringUtils.hasLength(tStory.getSort())) { @@ -1261,6 +1314,7 @@ @RequestParam Integer day) { // 判断当前登录用户是否为 会员 Boolean isVip = userService.isVip(); // 非会员只能查看非会员题目,会员可以查看所有题目 List<TStudyListen> studyListens = studyListenService.listenSelectPicture(quarter, week, day); for (TStudyListen studyListen : studyListens) { @@ -1272,7 +1326,7 @@ } } } return R.ok(studyService.listenSelectPicture(week, day, studyListens)); return R.ok(studyService.listenSelectPicture(week, day, studyListens,tokenService.getLoginUserStudy().getUserid())); } /** @@ -1303,7 +1357,7 @@ } } } return R.ok(studyService.pictureSelectVoice(week, day, lookList)); return R.ok(studyService.pictureSelectVoice(week, day, lookList,tokenService.getLoginUserStudy().getUserid())); } /** @@ -1334,7 +1388,7 @@ } } } return R.ok(studyService.induceExclude(week, day, inductionList)); return R.ok(studyService.induceExclude(week, day, inductionList,tokenService.getLoginUserStudy().getUserid())); } /** @@ -1365,7 +1419,7 @@ } } } return R.ok(studyService.questionsAndAnswers(week, day, answerList)); return R.ok(studyService.questionsAndAnswers(week, day, answerList,tokenService.getLoginUserStudy().getUserid())); } /** @@ -1396,10 +1450,53 @@ } } } return R.ok(studyService.pictureMateVoice(week, day, pairList)); return R.ok(studyService.pictureMateVoice(week, day, pairList,tokenService.getLoginUserStudy().getUserid())); } /** * 2.0新增-记录答题状态 * */ @PostMapping("/answerQuestion") @ApiOperation(value = "2.0新增-记录答题状态", tags = {"学习端-听-自主学习"}) public R answerQuestion(@RequestBody @Validated AnswerQuestionDTO answerQuestionDTO) { LoginUserParent userStudy = tokenService.getLoginUserStudy(); if (null == userStudy) { return R.tokenError("登录失效!"); } TSubjectRecordDetail byId = subjectRecordDetailService.getById(answerQuestionDTO.getId()); byId.setUserId(null); byId.setStatus(answerQuestionDTO.getStatus()); subjectRecordDetailService.updateById(byId); return R.ok(); } /** * 2.0新增-重新开始 * */ @PostMapping("/restart") @ApiOperation(value = "2.0新增-重新开始", tags = {"学习端-听-自主学习"}) public R restart(@RequestBody RestartDTO restartDTO) { LoginUserParent userStudy = tokenService.getLoginUserStudy(); if (null == userStudy) { return R.tokenError("登录失效!"); } List<TSubjectRecordDetail> list = subjectRecordDetailService.lambdaQuery() .eq(TSubjectRecordDetail::getUserId, userStudy.getUserid()) .eq(TSubjectRecordDetail::getWeek, restartDTO.getWeek()) .eq(TSubjectRecordDetail::getDay, restartDTO.getDay()) .eq(TSubjectRecordDetail::getType, restartDTO.getType()) .list(); for (TSubjectRecordDetail tSubjectRecordDetail : list) { tSubjectRecordDetail.setStatus(1); tSubjectRecordDetail.setUserId(null); } subjectRecordDetailService.updateBatchById(list); return R.ok(); } /** * 学习完成,生成学习记录,积分明细记录 * * @param completeStudy 完成学习信息 ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TSubjectRecordDetail.java
New file @@ -0,0 +1,90 @@ package com.ruoyi.study.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.ruoyi.common.core.web.domain.BaseModel; import com.ruoyi.study.config.ToLongDeserializer; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * <p> * 用户学习记录 * </p> * * @author 无关风月 * @since 2024-04-26 */ @Data @TableName("t_subject_record_detail") public class TSubjectRecordDetail extends BaseModel { private static final long serialVersionUID = 1L; /** * 主键id */ @TableId(value = "id", type = IdType.NONE) @JsonSerialize(using = ToStringSerializer.class) @JsonDeserialize(using = ToLongDeserializer.class) private Long id; /** * 用户id */ @ApiModelProperty(value = "用户id") private Integer userId; /** * /** * 所属周目 */ @ApiModelProperty(value = "所属周目") private Integer week; /** * 学习进度dayXX */ @ApiModelProperty(value = "学习进度dayXX ") private Integer day; /** * 根据类型 对应题组id */ @ApiModelProperty(value = "对应题组id ") private Integer objectId; /** * 根据类型 对应题组id */ @ApiModelProperty(value = "one ") private Integer one; /** * 根据类型 对应题组id */ @ApiModelProperty(value = "two ") private Integer two; /** * 根据类型 对应题组id */ @ApiModelProperty(value = "three ") private Integer three; /** * 根据类型 对应题组id */ @ApiModelProperty(value = "four ") private Integer four; /** /** * 类型1听音选图2看图选音3归纳排除4有问有答5音图相配 */ @ApiModelProperty(value = "类型1:听音选图,2:看图选音,3:归纳排除,4:有问有答,5:音图相配") private Integer type; /** * 状态1灰色未答题 2绿色正确 3红色错误 */ @ApiModelProperty(value = "状态1灰色未答题 2绿色正确 3红色错误") private Integer status; } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/AnswerQuestionDTO.java
New file @@ -0,0 +1,50 @@ package com.ruoyi.study.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; /** * @author HJL * @version 1.0 * @since 2024-05-20 14:04 */ @Data public class AnswerQuestionDTO { // /** // * 题目id数组 // */ // @ApiModelProperty("题目类型(1:听音选图;2:看图选音;3:归纳排除;4:有问有答;5:音图相配)") // private Integer type; /** * 答题记录id */ @ApiModelProperty("答题记录id") @NotNull(message = "答题记录id不能为空") private Long id; /** * 状态1灰色未答题 2绿色正确 3红色错误 */ @ApiModelProperty("状态1灰色未答题 2绿色正确 3红色错误") @NotNull(message = "状态不能为空") private Integer status; // /** // * 周目 // */ // @ApiModelProperty("周目") // private Integer week; // // /** // * 所属day // */ // @ApiModelProperty("所属day") // private Integer day; } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/RestartDTO.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.study.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; /** * @author HJL * @version 1.0 * @since 2024-05-20 14:04 */ @Data public class RestartDTO { /** * 题目id数组 */ @ApiModelProperty("题目类型(1:听音选图;2:看图选音;3:归纳排除;4:有问有答;5:音图相配)") private Integer type; /** * 周目 */ @ApiModelProperty("周目") private Integer week; /** * 所属day */ @ApiModelProperty("所属day") private Integer day; } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/mapper/TSubjectRecordDetailMapper.java
New file @@ -0,0 +1,17 @@ package com.ruoyi.study.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.study.domain.TSubjectRecord; import com.ruoyi.study.domain.TSubjectRecordDetail; /** * <p> * 自主游戏 Mapper 接口 * </p> * * @author 无关风月 * @since 2024-04-26 */ public interface TSubjectRecordDetailMapper extends BaseMapper<TSubjectRecordDetail> { } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITStudyService.java
@@ -44,7 +44,7 @@ * @param studyListens 数据集合 * @return 单个题组下所包含的所有图片及语音 */ StudyListenResultVO listenSelectPicture(Integer week, Integer day, List<TStudyListen> studyListens); StudyListenResultVO listenSelectPicture(Integer week, Integer day, List<TStudyListen> studyListens,Integer userId); /** * 自主游戏1-超级听力 @@ -64,7 +64,7 @@ * @param lookList 数据集合 * @return 单个题组下所包含的所有图片及语音 */ StudyLookResultVO pictureSelectVoice(Integer week, Integer day, List<TStudyLook> lookList); StudyLookResultVO pictureSelectVoice(Integer week, Integer day, List<TStudyLook> lookList,Integer userId); /** * 自主学习3-归纳排除 @@ -74,7 +74,7 @@ * @param inductionList 归纳排除 * @return 题目信息 */ StudyInductionResultVO induceExclude(Integer week, Integer day, List<TStudyInduction> inductionList); StudyInductionResultVO induceExclude(Integer week, Integer day, List<TStudyInduction> inductionList,Integer userId); /** * 自主学习4-有问有答 @@ -84,7 +84,7 @@ * @param answerList 有问有答 * @return 题目信息 */ StudyAnswerResultVO questionsAndAnswers(Integer week, Integer day, List<TStudyAnswer> answerList); StudyAnswerResultVO questionsAndAnswers(Integer week, Integer day, List<TStudyAnswer> answerList,Integer userId); /** * 自主学习5-音图相配 @@ -94,7 +94,7 @@ * @param pair 音图相配 * @return 题目信息 */ StudyPairResultVO pictureMateVoice(Integer week, Integer day, List<TStudyPair> pair); StudyPairResultVO pictureMateVoice(Integer week, Integer day, List<TStudyPair> pair,Integer userId); /** * 计算用户当前week的学习进度 ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITSubjectRecordDetailService.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.study.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.study.domain.TSubjectRecord; import com.ruoyi.study.domain.TSubjectRecordDetail; import com.ruoyi.study.vo.ExitLearnVO; /** * <p> * 自主游戏 服务类 * </p> * * @author 无关风月 * @since 2024-04-26 */ public interface ITSubjectRecordDetailService extends IService<TSubjectRecordDetail> { } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java
@@ -11,6 +11,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 +47,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 +422,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 +440,82 @@ 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> 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); } subjectList.add(list); 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); } return new StudyListenResultVO(learnStudy, subjectList); studyListenResultVO.setSubjectList(subjectList); return studyListenResultVO; } @Override public StudyLookResultVO pictureSelectVoice(Integer week, Integer day, List<TStudyLook> lookList) { public StudyLookResultVO pictureSelectVoice(Integer week, Integer day, List<TStudyLook> lookList, Integer userid) { if (lookList.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -469,26 +533,91 @@ 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> 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); } // 根据顺序排序 list.sort(Comparator.comparingInt(TSubject::getSort)); subjectList.add(list); 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 new StudyLookResultVO(learnStudy, subjectList); return studyListenResultVO; } @Override public StudyInductionResultVO induceExclude(Integer week, Integer day, List<TStudyInduction> inductionList) { public StudyInductionResultVO induceExclude(Integer week, Integer day, List<TStudyInduction> inductionList, Integer userid) { if (inductionList.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -506,45 +635,128 @@ 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(); 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); } } 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); 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)); } return new StudyInductionResultVO(learnStudy, subjectList); studyListenResultVO.setSubjectList(subjectList); return studyListenResultVO; } @Override public StudyAnswerResultVO questionsAndAnswers(Integer week, Integer day, List<TStudyAnswer> answerList) { public StudyAnswerResultVO questionsAndAnswers(Integer week, Integer day, List<TStudyAnswer> answerList, Integer userid) { if (answerList.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -562,16 +774,94 @@ 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(); 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)); } return new StudyAnswerResultVO(learnStudy, subjectList); studyListenResultVO.setSubjectList(subjectList); return studyListenResultVO; } private void voAdd(List<QuestionsAnswersSubjectVO> voList, TStudyAnswer one) { @@ -613,7 +903,7 @@ } @Override public StudyPairResultVO pictureMateVoice(Integer week, Integer day, List<TStudyPair> pair) { public StudyPairResultVO pictureMateVoice(Integer week, Integer day, List<TStudyPair> pair, Integer userid) { if (pair.isEmpty()) { throw new GlobalException("当前学习周目题目数量不足!"); } @@ -631,18 +921,77 @@ 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(); 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)); } subjectLists.add(subjectService.getById(id)); subjectList.add(subjectLists); } 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 new StudyPairResultVO(learnStudy, subjectList); return studyListenResultVO; } @Override ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TSubjectRecordDetailServiceImpl.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.study.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.study.domain.TSubjectRecord; import com.ruoyi.study.domain.TSubjectRecordDetail; import com.ruoyi.study.mapper.TSubjectRecordDetailMapper; import com.ruoyi.study.mapper.TSubjectRecordMapper; import com.ruoyi.study.service.ITSubjectRecordDetailService; import com.ruoyi.study.service.ITSubjectRecordService; import com.ruoyi.study.vo.ExitLearnVO; import org.springframework.stereotype.Service; /** * <p> * 自主游戏 服务实现类 * </p> * * @author 无关风月 * @since 2024-04-26 */ @Service public class TSubjectRecordDetailServiceImpl extends ServiceImpl<TSubjectRecordDetailMapper, TSubjectRecordDetail> implements ITSubjectRecordDetailService { } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyAnswerResultVO.java
@@ -1,9 +1,11 @@ package com.ruoyi.study.vo; import com.ruoyi.study.domain.TSubjectRecordDetail; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; /** @@ -20,7 +22,16 @@ */ @ApiModelProperty("自主学习题目信息") private LearnStudyVO data; /** * 2.0新增答题记录 */ @ApiModelProperty("2.0新增答题记录") private List<TSubjectRecordDetail> list; /** * 正确率 */ @ApiModelProperty("正确率") private BigDecimal accuracy; /** * 自主学习题目所包含录音图片等 */ ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyInductionResultVO.java
@@ -1,11 +1,13 @@ package com.ruoyi.study.vo; import com.ruoyi.study.domain.TSubject; import com.ruoyi.study.domain.TSubjectRecordDetail; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.List; /** @@ -23,7 +25,16 @@ */ @ApiModelProperty("自主学习题目信息") private LearnStudyVO data; /** * 2.0新增答题记录 */ @ApiModelProperty("2.0新增答题记录") private List<TSubjectRecordDetail> list; /** * 正确率 */ @ApiModelProperty("正确率") private BigDecimal accuracy; public StudyInductionResultVO(LearnStudyVO data, List<List<TSubject>> subjectList) { this.data = data; super.setSubjectList(subjectList); ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyListenResultVO.java
@@ -1,11 +1,13 @@ package com.ruoyi.study.vo; import com.ruoyi.study.domain.TSubject; import com.ruoyi.study.domain.TSubjectRecordDetail; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.List; /** @@ -23,6 +25,16 @@ */ @ApiModelProperty("自主学习题目信息") private LearnStudyVO data; /** * 2.0新增答题记录 */ @ApiModelProperty("2.0新增答题记录") private List<TSubjectRecordDetail> list; /** * 正确率 */ @ApiModelProperty("正确率") private BigDecimal accuracy; public StudyListenResultVO(LearnStudyVO data, List<List<TSubject>> subjectList) { this.data = data; ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyLookResultVO.java
@@ -1,11 +1,13 @@ package com.ruoyi.study.vo; import com.ruoyi.study.domain.TSubject; import com.ruoyi.study.domain.TSubjectRecordDetail; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.List; /** @@ -23,7 +25,16 @@ */ @ApiModelProperty("自主学习题目信息") private LearnStudyVO data; /** * 正确率 */ @ApiModelProperty("正确率") private BigDecimal accuracy; /** * 2.0新增答题记录 */ @ApiModelProperty("2.0新增答题记录") private List<TSubjectRecordDetail> list; public StudyLookResultVO(LearnStudyVO data, List<List<TSubject>> subjectList) { this.data = data; super.setSubjectList(subjectList); ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyPairResultVO.java
@@ -1,10 +1,12 @@ package com.ruoyi.study.vo; import com.ruoyi.study.domain.TSubject; import com.ruoyi.study.domain.TSubjectRecordDetail; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; /** @@ -21,7 +23,16 @@ */ @ApiModelProperty("自主学习题目信息") private LearnStudyVO data; /** * 2.0新增答题记录 */ @ApiModelProperty("2.0新增答题记录") private List<TSubjectRecordDetail> list; /** * 正确率 */ @ApiModelProperty("正确率") private BigDecimal accuracy; public StudyPairResultVO(LearnStudyVO data, List<List<TSubject>> subjectList) { this.data = data; super.setSubjectList(subjectList); ruoyi-service/ruoyi-study/src/main/resources/mapper/sutdy/TSubjectRecordDetailMapper.xml
New file @@ -0,0 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.study.mapper.TSubjectRecordDetailMapper"> </mapper>