/// <summary> /// 檢核答題說明是否必填規則 /// </summary> /// <param name="questDefine">問卷題目定義</param> /// <param name="answerDetailList">問卷題目答案明細集合</param> /// <returns>檢核結果</returns> private bool ValidateOtherAnswer(QuestDefineEntity questDefine, IEnumerable <AnswerDetailEntity> answerDetailList) { bool validateResult = false; bool hasOtherAnswerCondition = false; if (questDefine.AnswerType == "F") { validateResult = true; } else { foreach (AnswerDefineEntity answerDefine in questDefine.AnswerDefineEntities) { AnswerDetailEntity answerDetail = answerDetailList. FirstOrDefault(x => x.AnswerCode == answerDefine.AnswerCode); if (answerDetail == null) { continue; } if ((answerDefine.HaveOtherAnswer == "Y") && (answerDefine.NeedOtherAnswer == "Y") && !String.IsNullOrEmpty(answerDetail.AnswerCode)) { hasOtherAnswerCondition = true; if (!String.IsNullOrEmpty(answerDetail.OtherAnswer)) { validateResult = true; } } } if (!hasOtherAnswerCondition) { validateResult = true; } } return(validateResult); }
/// <summary> /// 計算問卷得分,回傳問卷得分類別 /// </summary> /// <param name="answer">問卷填答資料</param> /// <param name="questionEntity">問卷定義資料</param> /// <returns>問卷得分類別</returns> public CalculateScoreEntity CalculateScore(QuestionnaireAnswerEntity answer, QuestionnaireEntity questionEntity) { List <AnswerDetailEntity> answerFullDetailList = new List <AnswerDetailEntity>(); int actualScore = 0; List <int> questionScoreList = new List <int>(); IEnumerable <AnswerDetailEntity> answerDetailList = null; AnswerDetailEntity answerDetail = null; AnswerDefineEntity answerDefine = null; IEnumerable <int> answerScoreList = null; foreach (QuestDefineEntity questDefine in questionEntity.QuestDefineEntities) { answerDetailList = null; answerDetail = null; answerDefine = null; answerScoreList = null; answerDetailList = answer.AnswerDetailEntities. Where(x => (x.QuestionId == questDefine.QuestionId) && !String.IsNullOrEmpty(x.AnswerCode)); if (questDefine.AnswerType == "S") { if (answerDetailList.Count() == 0) { continue; } else if (answerDetailList.Count() > 1) { var ex = new InvalidOperationException("answerCode not the only"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; ex.Data["answerCodeList"] = String.Join(",", answerDetailList); throw ex; } answerDetail = answerDetailList.First(); answerDefine = questDefine.AnswerDefineEntities. FirstOrDefault(x => x.AnswerCode == answerDetail.AnswerCode); if (answerDefine == null) { var ex = new InvalidOperationException("answerDefine not found"); ex.Data["answerDetail.AnswerCode"] = answerDetail.AnswerCode; throw ex; } answerFullDetailList.Add(new AnswerDetailEntity { QuestionUid = questDefine.Uid, Score = answerDefine.Score, QuestionId = answerDetail.QuestionId, AnswerCode = answerDetail.AnswerCode, OtherAnswer = answerDetail.OtherAnswer, }); } else if (questDefine.AnswerType == "M") { foreach (AnswerDetailEntity answerDetailEntity in answerDetailList) { answerDefine = null; answerDefine = questDefine.AnswerDefineEntities. FirstOrDefault(x => x.AnswerCode == answerDetailEntity.AnswerCode); if (answerDefine == null) { var ex = new InvalidOperationException("answerDefine not found"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; ex.Data["answerDetailEntity.AnswerCode"] = answerDetailEntity.AnswerCode; throw ex; } answerFullDetailList.Add(new AnswerDetailEntity { QuestionUid = questDefine.Uid, Score = answerDefine.Score, QuestionId = answerDetailEntity.QuestionId, AnswerCode = answerDetailEntity.AnswerCode, OtherAnswer = answerDetailEntity.OtherAnswer, }); } } else if (questDefine.AnswerType == "F") { if (answerDetailList.Count() == 0) { var ex = new InvalidOperationException("answerCode not the only"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; throw ex; } else if (answerDetailList.Count() != 1) { var ex = new InvalidOperationException("answerCode not the only"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; ex.Data["answerCodeList"] = String.Join(",", answerDetailList); throw ex; } answerDetail = answerDetailList.First(); IEnumerable <AnswerDefineEntity> answerDefineList = questDefine.AnswerDefineEntities. Where(x => x.AnswerCode == String.Empty); if (answerDefineList.Count() == 0) { var ex = new InvalidOperationException("answerDefineList not found"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; throw ex; } else if (answerDefineList.Count() != 1) { var ex = new InvalidOperationException("answerDefineList not the only"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; throw ex; } answerDefine = answerDefineList.First(); answerFullDetailList.Add(new AnswerDetailEntity { QuestionUid = questDefine.Uid, Score = answerDefine.Score, QuestionId = answerDetail.QuestionId, AnswerCode = null, OtherAnswer = answerDetail.AnswerCode, }); } if (questionEntity.NeedScore == "Y") { answerScoreList = answerFullDetailList. Where(x => (x.QuestionId == questDefine.QuestionId) && (x.Score != null)). Select(x => x.Score.Value); if ((answerScoreList == null) || (answerScoreList.Count() == 0)) { var ex = new InvalidOperationException("answerScoreList not found"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; throw ex; } switch (questDefine.CountScoreType) { case "1": questionScoreList.Add(answerScoreList.Sum()); break; case "2": questionScoreList.Add(answerScoreList.Max()); break; case "3": questionScoreList.Add(answerScoreList.Min()); break; case "4": questionScoreList.Add(Convert.ToInt32(Math. Round(answerScoreList.Average(), 0, MidpointRounding.AwayFromZero))); break; default: var ex = new InvalidOperationException("countScoreType not found"); ex.Data["questDefine.QuestionId"] = questDefine.QuestionId; ex.Data["questDefine.CountScoreType"] = questDefine.CountScoreType; throw ex; } } } if (questionEntity.NeedScore == "Y") { if (questionEntity.ScoreKind == "1") { actualScore = questionScoreList.Sum(); } if ((questionEntity.QuestScore != null) && (actualScore > questionEntity.QuestScore.Value)) { actualScore = questionEntity.QuestScore.Value; } } return(new CalculateScoreEntity() { ActualScore = actualScore, FullAnswerDetailList = answerFullDetailList, }); }