/// <summary>
        /// 根据规则获取相应题目
        /// </summary>
        /// <returns></returns>
        public ExaminationOutPut GetQuestions()
        {
            ExaminationOutPut questionsResult = new ExaminationOutPut();
            var             single            = _questionType.FirstOrDefault(q => q.Name == "单选"); //单选题数量
            var             multiple          = _questionType.FirstOrDefault(q => q.Name == "多选"); //多选题数量
            var             judge             = _questionType.FirstOrDefault(q => q.Name == "判断"); //判断题数量
            List <Question> questionList      = _question.GetAll().Where(q => q.QuestionTypeId == single.Id).OrderBy(q => Guid.NewGuid()).Take(single.Number).ToList();

            questionList.AddRange(_question.GetAll().Where(q => q.QuestionTypeId == multiple.Id).OrderBy(q => Guid.NewGuid()).Take(multiple.Number).ToList());
            questionList.AddRange(_question.GetAll().Where(q => q.QuestionTypeId == judge.Id).OrderBy(q => Guid.NewGuid()).Take(judge.Number).ToList());

            questionsResult.QuestionItems = questionList.Select(item =>
            {
                return(new QuestionStringId()
                {
                    StrId = item.Id.ToString(),
                    Content = item.Content,
                    Options = item.Options,
                    AnswerNote = item.AnswerNote,
                    QuestionType = item.QuestionTypeId == single.Id ? "单选" : item.QuestionTypeId == multiple.Id ? "多选" : "判断"
                });
            }).ToList();

            return(questionsResult);
        }
        /// <summary>
        /// 考试接口
        /// </summary>
        /// <param name="dayOrWeek"></param>
        /// <returns></returns>
        public Result <ExaminationOutPut> TestStart(string dayOrWeek)
        {
            string examinationId = string.Empty;//考试编号

            if (dayOrWeek == "day")
            {
                if (_examination.Any(e => e.StartTime >= DateTime.Now.Date && e.EndTime > DateTime.Now && e.DayOrWeek == "day"))
                {
                    examinationId = _examination.FirstOrDefault(e => e.StartTime >= DateTime.Now.Date && e.EndTime > DateTime.Now && e.DayOrWeek == "day").Id.ToString();
                }
                else
                {//如果没有考试添加一条考试记录
                    examinationId = _examination.InsertAndGetId(new Examination()
                    {
                        StartTime = DateTime.Now, EndTime = DateTime.Now.AddDays(1).Date, Note = string.Empty, DayOrWeek = "day"
                    }).ToString();
                    _unitOfWork.SaveChanges();
                }
            }
            if (dayOrWeek == "week")
            {
                var a = DateTimeHelper.GetWeekFirstDayMon(DateTime.Now.Date);
                if (_examination.Any(e => e.StartTime >= a && e.EndTime > DateTime.Now && e.DayOrWeek == "week"))
                {
                    examinationId = _examination.FirstOrDefault(e => e.StartTime >= a && e.EndTime > DateTime.Now && e.DayOrWeek == "week").Id.ToString();
                }
                else
                {//如果没有考试添加一条考试记录
                    examinationId = _examination.InsertAndGetId(new Examination()
                    {
                        StartTime = DateTime.Now, EndTime = DateTimeHelper.GetWeekLastDaySun(DateTime.Now.Date), Note = string.Empty, DayOrWeek = "week"
                    }).ToString();
                    _unitOfWork.SaveChanges();
                }
            }
            if (string.IsNullOrEmpty(dayOrWeek))
            {
                #region
                if (_examination.Any(e => e.EndTime > DateTime.Now))//当前时间小于考试结束时间代表有考试
                {
                    examinationId = _examination.FirstOrDefault(e => e.EndTime > DateTime.Now).Id.ToString();
                }
                else
                {//如果没有考试添加一条考试记录
                    examinationId = _examination.InsertAndGetId(new Examination()
                    {
                        StartTime = DateTime.Now, EndTime = DateTime.Now.AddDays(1).Date, Note = string.Empty
                    }).ToString();
                    _unitOfWork.SaveChanges();
                }
                #endregion
            }

            ExaminationOutPut examinationOutPut = GetQuestions();
            examinationOutPut.ExaminationId = examinationId;
            return(Result <ExaminationOutPut> .Success(examinationOutPut));
        }
        /// <summary>
        /// 交卷
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="examinationIntput"></param>
        /// <returns></returns>
        public Result <TestEndOutput> TestEnd(long userId, ExaminationIntput examinationIntput)
        {
            Score score = new Score();

            if (string.IsNullOrEmpty(examinationIntput.ExaminationId))
            {
                return(Result <TestEndOutput> .Fail("该考试不存在"));
            }

            var has             = false;
            var thisExamination = _examination.Get(long.Parse(examinationIntput.ExaminationId));

            DateTime timeNow = DateTime.Now.Date;

            if (_score.Any(s => s.UserId == userId && s.ExaminationId == thisExamination.Id))
            {
                has   = true;
                score = _score.GetAll().FirstOrDefault(s => s.UserId == userId && s.ExaminationId == thisExamination.Id);
            }

            score.UserId        = userId;
            score.ExaminationId = thisExamination.Id;
            score.DayOrWeek     = thisExamination.DayOrWeek;
            string scoreContent = "[";
            double totalScore   = 0;
            var    types        = _questionType.GetAll().ToList();

            var error = 0;

            List <QuestionStringId> ErrorQuestion = new List <QuestionStringId>();


            ExaminationOutPut questionsResult = new ExaminationOutPut();
            var single   = _questionType.FirstOrDefault(q => q.Name == "单选"); //单选题数量
            var multiple = _questionType.FirstOrDefault(q => q.Name == "多选"); //多选题数量
            var judge    = _questionType.FirstOrDefault(q => q.Name == "判断"); //判断题数量

            foreach (QuestionAndInputAnswer item in examinationIntput.questionAndInputAnswers)
            {
                //item.QuestionItemId.TrimEnd() + "###" + item.InputAnswer.TrimEnd() + "&&&"
                scoreContent += "{\"" + item.QuestionItemId + "\":\"" + item.InputAnswer + "\"},";
                var thisQuestion = _question.Get(long.Parse(item.QuestionItemId));
                if (item.InputAnswer.TrimEnd() == thisQuestion.Answer)
                {
                    totalScore += types.FirstOrDefault(m => m.Id == thisQuestion.QuestionTypeId).Score;
                }
                else
                {
                    ErrorQuestion.Add(new QuestionStringId()
                    {
                        StrId        = thisQuestion.Id.ToString(),
                        Content      = thisQuestion.Content,
                        Options      = thisQuestion.Options,
                        AnswerNote   = thisQuestion.AnswerNote,
                        QuestionType = thisQuestion.QuestionTypeId == single.Id ? "单选" : thisQuestion.QuestionTypeId == multiple.Id ? "多选" : "判断",
                        Answer       = thisQuestion.Answer,
                        MyAnswer     = item.InputAnswer
                    });
                    error++;
                }
            }
            scoreContent     = scoreContent.Substring(0, scoreContent.Length - 1);
            scoreContent    += "]";
            score.Content    = scoreContent;
            score.TotalScore = totalScore;
            try
            {
                if (has)
                {
                    _score.Update(score);
                }
                else
                {
                    _score.Insert(score);
                }
                _unitOfWork.SaveChanges();
                return(Result <TestEndOutput> .Success(new TestEndOutput()
                {
                    Toal = examinationIntput.questionAndInputAnswers.Count(),
                    Error = error,
                    Score = totalScore,
                    ErrorQuestion = ErrorQuestion
                }));;
            }
            catch
            {
                return(Result <TestEndOutput> .Fail(""));
            }
        }