• 评测管理的业务逻辑


    1、查看用户的答题情况

    问卷:里面有题库ids(多个题库)

    题库:循环遍历每个题库

          问题:FId与题库关联

          选项:FId与问题关联 , is_right代表正确答案

    do_eval_question: id,问卷id,用户id

    eval_do_question_detail:id,问卷问题Id,问题答案。

    原本查询:

     1、用doInvestigateId查到数据 

    2、 把题库分开,然后一个题库一个题库处理(循环)

    3、根据题库id找到对应问题的FId,查到题目列表(循环)

       4、遍历题目列表(循环)

          5、获取到问题人做该题的细节(通过传入做问卷的id、问题id)

         6、循环遍历该问题的选项,然后与5中获取到的对象所选这个题目的选项进行对比,如果一样,把isChoose设置为真(isChoose只在实体类中出现,表中没有的,因为我们只是要返回一个结果集。)

    7、就把更新的数据(先是选项集,更新到题库;然后题库集更新到文件集)

    然后返回问卷集也是结果集。

    查问卷1次

    每个查题库1次(构建查询条件,直接一次性查到)

    题库里面的每个问题要查一次选项(有多少问题就得查多少次)

    答题人每个问题的选项都得查一遍(问题次数,有多少个问题就得查多少次)

    优化

    private QuestionResult genQuestionResult(QuestionResult questionResult, Long DoInvestigateId, Long id) {
        // 获取问卷信息
        EvalInvestigate ei = evalInvestigateMapper.selectEvalInvestigateById(DoInvestigateId);
        if (ei == null)
            throw new NullPointerException("DoInvestigateId=" + DoInvestigateId + "的问卷不存在");

        // 获取问卷的题库集
        String[] splits = ei.getInvParperIds().split("\\.");
        List papers = new ArrayList<>();

        for (String s : splits) {
            Long i = Long.parseLong(s);
            // 获取题库集里的一份题库
            EvalPaper evalPaper = evalPaperMapper.selectEvalPaperById(i);

            // 一次性查询题库里面的所有问题和答案
            List evalQus = evalQuMapper.selectEvalQuListByPaperId(evalPaper.getId());
            List evalQuAnswers = evalQuAnswerMapper.selectEvalQuAnswersByQuestionIds(
                    evalQus.stream().map(EvalQu::getId).collect(Collectors.toList())
            );
            List evalDoQuestionDetails = evalDoQuestionDetailMapper.selectEvalDoQuestionDetailsByQuestionIds(
                    evalQus.stream().map(EvalQu::getId).collect(Collectors.toList()), id
            );

            // 将问题和答案进行匹配

            //遍历问题
            for (EvalQu evalQu : evalQus) {

                //获得问题的答案集
                List answersForQuestion = evalQuAnswers.stream()
                        .filter(answer -> answer.getFid().equals(evalQu.getId()))
                        .collect(Collectors.toList());

               //遍历答案集(答案集*选项个数)

               for (EvalDoQuestionDetail questionDetail : evalDoQuestionDetails) {

                    //答案跟每个每个选项集对比
                    for (EvalQuAnswer quAnswer : answersForQuestion) {
                        if (quAnswer.getId().equals(questionDetail.getEvalDetailAnsId())) {
                            quAnswer.setChoose(true);
                        }
                    }
                }

                evalQu.setEvalQuAnswerList(answersForQuestion);
            }

            evalPaper.setQuestionList(evalQus);
            papers.add(evalPaper);
        }

        questionResult.setEvalPaperList(papers);
        return questionResult;
    }

    (在evalPaper题库里面加个存放所有问题的List)

      (问题跟选项做成视图)

    1、一次性查询所有题库里的问题和答案(将题库获得题库里面所有id的List)

    2、selectEvalQuAnswersByQuestionIds()

    public interface EvalQuAnswerMapper {
        List selectEvalQuAnswersByQuestionIds(List questionIds);
    }


    3、查询答案集

    public interface EvalDoQuestionDetailMapper {
        List selectEvalDoQuestionDetailsByQuestionIds(List questionIds, Long Id);
    }

    4、遍历问题集

        遍历答案集,每个答案都要跟问题的所有选项对比。

    5、可以继续优化

    for (EvalQu evalQu : evalQus) { Long evalQuId = evalQu.getId(); List answersForQuestion = evalQuAnswers.stream() .filter(answer -> answer.getFid().equals(evalQuId)) .collect(Collectors.toList()); List evalDetailAnsIds = evalDoQuestionDetails.stream() .map(EvalDoQuestionDetail::getEvalDetailAnsId) .collect(Collectors.toList()); for (EvalQuAnswer quAnswer : answersForQuestion) { quAnswer.setChoose(evalDetailAnsIds.contains(quAnswer.getId())); } evalQu.setEvalQuAnswerList(answersForQuestion); }

  • 相关阅读:
    vue本地开发设置代理连接本地后台服务
    asp.net急救资源管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
    [总结]好书的评判标准
    1055 The World‘s Richest
    Vue组件路由
    电动扳手设计(说明书+开题报告+英文文献及译文+cad图纸)
    以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的
    [Redis-实战] 企业常用的缓存使用方案(查询、更新、击穿、穿透、雪崩) 附源码
    面向大数据存算分离场景的数据湖加速方案
    wsl2 执行exe文件提示 无法执行二进制文件:可执行文件格式错误
  • 原文地址:https://blog.csdn.net/weixin_48628145/article/details/132912788