using SqlSugar; using Tiobon.Core.Model.Models; using static Tiobon.Core.Model.Consts; namespace Tiobon.Core.Common.Helper; public class ExamHelper { public static async Task SystemMarkAsync(ISqlSugarClient Db, Ghre_ExamRecord record, List details, List recordAnswers) { var questionIds = details.Where(x => x.QuestionId != null).Select(m => m.QuestionId).Distinct().ToList(); //var exampaperQuestions = await Db.Queryable().Where(x => x.ExamPaperId == record.ExamPaperId).ToListAsync(); var exampaper = await Db.Queryable().FirstAsync(x => x.Id == record.ExamPaperId); var exampaperQuestions = await Db.Queryable() .Where(x => (x.ExamPaperId == exampaper.Id && exampaper.SetMethod == DIC_EXAM_PAPER_SET_METHOD.MANUAL) || (x.ExamPaperId == record.Id && exampaper.SetMethod == DIC_EXAM_PAPER_SET_METHOD.RANDOM)) .ToListAsync(); var questions = await Db.Queryable().Where(x => questionIds.Contains(x.Id)).ToListAsync(); var answers = await Db.Queryable() .Where(x => x.QuestionId != null && questionIds.Contains(x.QuestionId.Value) && x.IsCorrect == true) .ToListAsync(); var answerIds = answers.Select(x => x.Id).ToList(); decimal? score = 0; details.ForEach(detail => { var question = questions.FirstOrDefault(x => x.Id == detail.QuestionId); detail.IsCorrect = false; detail.Score = 0; var exampaperQuestion = exampaperQuestions.FirstOrDefault(x => x.QuestionId == detail.QuestionId); switch (question.QuestionType) { case "Completion": var completionAnswers = answers.OrderBy(x => x.TaxisNo).Where(x => x.QuestionId == detail.QuestionId).ToList(); var contents = recordAnswers.Where(x => x.ExamRecordDetailId == detail.Id).Select(x => x.AnswerContent).ToList(); var count = completionAnswers.Count; if (contents.Count == count) { for (int i = 0; i < completionAnswers.Count; i++) if (completionAnswers[i].AnswerContent == contents[i]) count--; if (count == 0) { score += exampaperQuestion?.Score; detail.Score = exampaperQuestion?.Score; detail.IsCorrect = true; } } break; case "ShortAnswer": if (recordAnswers.Where(x => x.ExamRecordDetailId == detail.Id).Any()) { var completionAnswers1 = answers.OrderBy(x => x.TaxisNo).Where(x => x.QuestionId == detail.QuestionId).ToList(); var content = recordAnswers.Where(x => x.ExamRecordDetailId == detail.Id).First().AnswerContent; var count1 = completionAnswers1.Count; if (!content.IsNull()) for (int i = 0; i < completionAnswers1.Count; i++) if (content.IndexOf(completionAnswers1[i].AnswerContent) > -1) count1--; if (count1 == 0) { score += exampaperQuestion?.Score; detail.Score = exampaperQuestion?.Score; detail.IsCorrect = true; } } break; default: var questionAnswerIds = recordAnswers.Where(x => x.ExamRecordDetailId == detail.Id && x.QuestionAnswerId != null && answerIds.Contains(x.QuestionAnswerId.Value)).Select(m => m.QuestionAnswerId).ToList(); if (questionAnswerIds.Count == answers.Where(x => x.QuestionId == detail.QuestionId).Count()) { score += exampaperQuestion?.Score; detail.Score = exampaperQuestion?.Score; detail.IsCorrect = true; } break; } }); record.Score = score ?? 0; } }