无关风月
3 天以前 fafae77d59bc333a11c6b43e8f8606e190341e4a
部分代码
12个文件已修改
8个文件已添加
1155 ■■■■ 已修改文件
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/config/DatasourceModel.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/config/RedissonConfig.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/DatasourceModel.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/ShardingConfig.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/ToLongDeserializer.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TSubjectRecordDetail.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/AnswerQuestionDTO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/RestartDTO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/mapper/TSubjectRecordDetailMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITStudyService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITSubjectRecordDetailService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java 507 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TSubjectRecordDetailServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyAnswerResultVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyInductionResultVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyListenResultVO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyLookResultVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/vo/StudyPairResultVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/resources/mapper/sutdy/TSubjectRecordDetailMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>