Beispiel #1
0
        /// <summary>
        /// 評估投資風險等級
        /// </summary>
        /// <param name="answer">風險評估填答資料</param>
        /// <returns></returns>
        public RiskEvaResultDTO EvaluateRiskRank(RiskEvaAnswerEntity answer)
        {
            RiskEvaResultDTO          riskEvaResultDTO     = null;
            QuestionnaireResultEntity questionResultEntity = null;

            if (answer == null)
            {
                throw new ArgumentNullException("answer");
            }
            else if (answer.QuestionnaireAnswerEntity == null)
            {
                throw new ArgumentNullException("QuestionnaireAnswerEntity");
            }

            RiskEvaluationDO riskEvaluationDO = new RiskEvaluationDAO().GetLatestRiskEvaluation(
                answer.QuestionnaireAnswerEntity.UserId);

            bool canEvaluteRisk = CheckCanEvaluteRisk(riskEvaluationDO);

            if (!canEvaluteRisk)
            {
                var ex = new InvalidOperationException("Not can used risk evaluation");
                ex.Data["canEvaluteRisk"] = canEvaluteRisk;
                throw ex;
            }



            questionResultEntity = QuestService.Calculate(answer.QuestionnaireAnswerEntity);

            if (questionResultEntity == null)
            {
                throw new InvalidOperationException("questResultEntity not found");
            }

            if (questionResultEntity.QuestionnaireEntity.NeedScore == "Y")
            {
                RiskRankDO riskRankDO = new RiskRankDAO().GetRiskRank(questionResultEntity.ActualScore,
                                                                      _riskEvaIdFundInvestment);

                if (riskRankDO == null)
                {
                    var ex = new InvalidOperationException("riskRankDO not found");
                    ex.Data["QuestId"]     = questionResultEntity.QuestionnaireEntity.QuestId;
                    ex.Data["UserId"]      = answer.QuestionnaireAnswerEntity.UserId;
                    ex.Data["ActualScore"] = questionResultEntity.ActualScore;
                    ex.Data["riskEvaId"]   = _riskEvaIdFundInvestment;
                    throw ex;
                }

                questionResultEntity.RiskRankKind = riskRankDO.RiskRankKind;
            }



            riskEvaResultDTO = new RiskEvaResultDTO()
            {
                QuestionnaireResultEntity = questionResultEntity,
                RiskRankEntities          = GetRiskRankEntities(_riskEvaIdFundInvestment),
            };

            CacheProvider.SetCache($"{_cacheKeyQuestionResultEntity}-{questionResultEntity.QuestAnswerId}",
                                   questionResultEntity);

            return(riskEvaResultDTO);
        }
Beispiel #2
0
        /// <summary>
        /// 儲存評估投資風險評估結果資料
        /// </summary>
        /// <param name="riskResultId">風險評估結果識別代號</param>
        public void SaveRiskRank(string riskResultId)
        {
            if (String.IsNullOrEmpty(riskResultId))
            {
                throw new ArgumentNullException("riskResultId");
            }

            RiskEvaResultDTO riskEvaResultDTO = GetRiskResult(riskResultId);

            if (riskEvaResultDTO == null)
            {
                var ex = new InvalidOperationException("riskEvaResultDTO not found");
                ex.Data["riskResultId"] = riskResultId;
                throw ex;
            }
            else if (riskEvaResultDTO.QuestionnaireResultEntity == null)
            {
                var ex = new InvalidOperationException("QuestionnaireResultEntity not found");
                ex.Data["riskResultId"] = riskResultId;
                throw ex;
            }

            QuestionnaireResultEntity questResultEntity = riskEvaResultDTO.QuestionnaireResultEntity;

            RiskEvaluationDO riskEvaluationDO = new RiskEvaluationDAO().GetLatestRiskEvaluation(
                questResultEntity.TesteeId);

            bool canEvaluteRisk = CheckCanEvaluteRisk(riskEvaluationDO);

            if (!canEvaluteRisk)
            {
                var ex = new InvalidOperationException("Not can used risk evaluation");
                ex.Data["canEvaluteRisk"] = canEvaluteRisk;
                throw ex;
            }


            DateTime currenTime = DateTime.Now;

            if (riskEvaluationDO == null)
            {
                riskEvaluationDO = new RiskEvaluationDO()
                {
                    Uid            = Guid.NewGuid(),
                    RiskEvaId      = _riskEvaIdFundInvestment,
                    QuestAnswerId  = questResultEntity.QuestAnswerId,
                    CliId          = questResultEntity.TesteeId,
                    RiskResult     = string.Join(";", questResultEntity.RiskResult.Select(x => $"[{x.Key}:{x.Value}]")),
                    RiskScore      = questResultEntity.ActualScore,
                    RiskAttribute  = questResultEntity.RiskRankKind,
                    EvaluationDate = currenTime,
                    BusinessDate   = ConvertBusinessDate(currenTime),
                    IsUsed         = "N",
                    CreateUserId   = questResultEntity.TesteeId,
                    CreateTime     = currenTime,
                    ModifyUserId   = null,
                    ModifyTime     = null,
                };

                new RiskEvaluationDAO().Insert(riskEvaluationDO);
            }
            else
            {
                bool inCuttimeRange = CheckInCuttimeRange(riskEvaluationDO);

                if (inCuttimeRange)
                {
                    riskEvaluationDO.QuestAnswerId  = questResultEntity.QuestAnswerId;
                    riskEvaluationDO.RiskResult     = String.Join(";", questResultEntity.RiskResult.Select(x => $"[{x.Key}:{x.Value}]"));
                    riskEvaluationDO.RiskScore      = questResultEntity.ActualScore;
                    riskEvaluationDO.RiskAttribute  = questResultEntity.RiskRankKind;
                    riskEvaluationDO.EvaluationDate = currenTime;
                    riskEvaluationDO.BusinessDate   = ConvertBusinessDate(currenTime);
                    riskEvaluationDO.IsUsed         = "N";
                    riskEvaluationDO.ModifyUserId   = questResultEntity.TesteeId;
                    riskEvaluationDO.ModifyTime     = currenTime;

                    new RiskEvaluationDAO().Update(riskEvaluationDO);
                }
                else
                {
                    riskEvaluationDO = new RiskEvaluationDO()
                    {
                        Uid            = Guid.NewGuid(),
                        RiskEvaId      = _riskEvaIdFundInvestment,
                        QuestAnswerId  = questResultEntity.QuestAnswerId,
                        CliId          = questResultEntity.TesteeId,
                        RiskResult     = String.Join(";", questResultEntity.RiskResult.Select(x => $"[{x.Key}:{x.Value}]")),
                        RiskScore      = questResultEntity.ActualScore,
                        RiskAttribute  = questResultEntity.RiskRankKind,
                        EvaluationDate = currenTime,
                        BusinessDate   = ConvertBusinessDate(currenTime),
                        IsUsed         = "N",
                        CreateUserId   = questResultEntity.TesteeId,
                        CreateTime     = currenTime,
                        ModifyUserId   = null,
                        ModifyTime     = null,
                    };

                    new RiskEvaluationDAO().Insert(riskEvaluationDO);
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// 計算問卷填答得分
        /// </summary>
        /// <param name="answer">問卷填答資料</param>
        /// <returns>問卷填答評分結果</returns>
        public QuestionnaireResultEntity Calculate(QuestionnaireAnswerEntity answer)
        {
            QuestionnaireResultEntity questionResultEntity = null;
            QuestionnaireAnswerDO     questionAnswerDO     = null;

            if (answer == null)
            {
                throw new ArgumentNullException("沒有提供問卷填答資料");
            }

            QuestionnaireEntity questionEntity = GetQuestionnaire(answer.QuestUid);
            DateTime            currentTime    = DateTime.Now;

            if ((questionEntity == null) ||
                (questionEntity.Ondate >= currentTime) ||
                (questionEntity.Offdate != null) && (questionEntity.Offdate <= currentTime))
            {
                var ex = new InvalidOperationException("問卷資料不存在或沒有有效的問卷資料");
                ex.Data["QuestionUis"] = answer.QuestUid;
                throw ex;
            }


            Dictionary <string, string> validateResult = ValidateRule(answer, questionEntity);

            if (validateResult == null)
            {
                throw new InvalidOperationException("validateResult not found");
            }


            Dictionary <string, string> riskResult = null;
            string dialogMsg = null;


            if (validateResult.Count == 0)
            {
                CalculateScoreEntity calculateResult = CalculateScore(answer, questionEntity);

                if (calculateResult == null)
                {
                    throw new InvalidOperationException("calculateResult not found");
                }

                riskResult = calculateResult.FullAnswerDetailList.
                             Where(x => !String.IsNullOrEmpty(x.AnswerCode)).
                             GroupBy(x => x.QuestionId).
                             Select(group => new
                {
                    group.Key,
                    Value = String.Join(",", group.Select(item => item.AnswerCode))
                }).ToDictionary(x => x.Key, x => x.Value);

                if (riskResult == null)
                {
                    throw new InvalidOperationException("riskResult not found");
                }

                questionAnswerDO = SaveQuestionAnswer(questionEntity, calculateResult,
                                                      answer.UserId);

                if (questionAnswerDO == null)
                {
                    throw new InvalidOperationException("questionAnswerDO not found");
                }

                if (questionEntity.NeedScore != "Y")
                {
                    dialogMsg = "您的問卷己填答完畢,謝謝您的參與";
                }
            }


            questionResultEntity = new QuestionnaireResultEntity()
            {
                QuestionnaireEntity  = questionEntity,
                AnswerDetailEntities = answer.AnswerDetailEntities,
                ValidateFailInfo     = validateResult,
                RiskResult           = riskResult,
                QuestionnaireMessage = dialogMsg,
            };

            if (questionAnswerDO != null)
            {
                questionResultEntity.Uid           = questionAnswerDO.Uid;
                questionResultEntity.QuestUid      = questionAnswerDO.QuestUid;
                questionResultEntity.QuestAnswerId = questionAnswerDO.QuestAnswerId;
                questionResultEntity.TesteeId      = questionAnswerDO.TesteeId;
                questionResultEntity.QuestScore    = questionAnswerDO.QuestScore;
                questionResultEntity.ActualScore   = questionAnswerDO.ActualScore;
                questionResultEntity.TesteeSource  = questionAnswerDO.TesteeSource;
                questionResultEntity.CreateUserId  = questionAnswerDO.CreateUserId;
                questionResultEntity.CreateTime    = questionAnswerDO.CreateTime;
                questionResultEntity.ModifyUserId  = questionAnswerDO.ModifyUserId;
                questionResultEntity.ModifyTime    = questionAnswerDO.ModifyTime;
            }

            return(questionResultEntity);
        }