예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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,
            });
        }