/// <summary> /// 取得最新一筆用戶問卷答題資料 /// </summary> /// <param name="uid">問卷主檔紀錄識別碼</param> /// <param name="userId">用戶ID</param> /// <returns>問卷答題資料</returns> public QuestionnaireAnswerDO GetLatestQuestionnaireAnswer(Guid uid, string userId) { QuestionnaireAnswerDO questAnswerDO = null; if (uid == Guid.Empty) { throw new ArgumentNullException("questAnswerId"); } else if (String.IsNullOrEmpty(userId)) { throw new ArgumentNullException("userId"); } string query = @" SELECT TOP 1 [Uid],[QuestUid],[QuestAnswerId],[TesteeId], [QuestScore],[ActualScore],[TesteeSource],[CreateUserId], [CreateTime],[ModifyUserId],[ModifyTime] FROM QuestionnaireAnswer WHERE QuestUid = @QuestUid AND TesteeId = @TesteeId ORDER BY CreateTime DESC;"; using (SqlConnection connection = DbConnection) { SqlCommand command = new SqlCommand(query, connection); command.Parameters.Add(new SqlParameter("@QuestUid", SqlDbType.UniqueIdentifier) { Value = uid, }); command.Parameters.Add(new SqlParameter("@TesteeId", SqlDbType.VarChar) { Value = userId, }); connection.Open(); DataTable dt = new DataTable(); SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dt); if (dt.Rows.Count == 1) { questAnswerDO = ConvertQuestionnaireAnswerDO(dt.Rows[0]); } adapter = null; dt = null; command = null; if (connection.State == ConnectionState.Open) { connection.Close(); } } return(questAnswerDO); }
/// <summary> /// 紀錄問卷填答資料至問卷答題主檔與答題明細 /// </summary> /// <param name="questEntity">問卷資料</param> /// <param name="calculateResult">問卷得分與填答資料</param> /// <param name="userId">用戶ID</param> /// <returns>問卷答題資料</returns> private QuestionnaireAnswerDO SaveQuestionAnswer(QuestionnaireEntity questEntity, CalculateScoreEntity calculateResult, string userId) { QuestionnaireAnswerDO questionnaireAnswerDO = null; if (questEntity == null) { throw new ArgumentNullException("questEntity"); } else if (calculateResult == null) { throw new ArgumentNullException("calculateResult"); } else if (String.IsNullOrEmpty(userId)) { throw new ArgumentNullException("userId"); } DateTime currentTiem = DateTime.Now; using (TransactionScope scope = new TransactionScope()) { questionnaireAnswerDO = new QuestionnaireAnswerDO() { Uid = Guid.NewGuid(), QuestUid = questEntity.Uid, QuestAnswerId = currentTiem.ToString("yyMMddHHmmssfff"), TesteeId = userId, QuestScore = questEntity.QuestScore, ActualScore = calculateResult.ActualScore, TesteeSource = _testeeSource, CreateUserId = userId, CreateTime = currentTiem, ModifyUserId = null, ModifyTime = null, }; IEnumerable <QuestionnaireAnswerDetailDO> questAnswerDetailList = calculateResult.FullAnswerDetailList.Select(answerDetail => new QuestionnaireAnswerDetailDO() { Uid = Guid.NewGuid(), AnswerUid = questionnaireAnswerDO.Uid, QuestionUid = answerDetail.QuestionUid, AnswerCode = answerDetail.AnswerCode, OtherAnswer = answerDetail.OtherAnswer, Score = answerDetail.Score, CreateUserId = userId, CreateTime = currentTiem, ModifyUserId = null, ModifyTime = null, }); new QuestionnaireAnswerDAO().Insert(questionnaireAnswerDO); new QuestionnaireAnswerDetailDAO().Insert(questAnswerDetailList); scope.Complete(); } return(questionnaireAnswerDO); }
/// <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); }
/// <summary> /// 新增問卷填答結果至問卷答題主檔 /// </summary> /// <param name="questAnswerDO">問卷填答資料</param> /// <returns></returns> public void Insert(QuestionnaireAnswerDO questAnswerDO) { if (questAnswerDO == null) { throw new ArgumentNullException("questAnswerDO"); } string query = @" INSERT INTO [QuestionnaireAnswer] ([Uid],[QuestUid],[QuestAnswerId],[TesteeId],[QuestScore],[ActualScore],[TesteeSource], [CreateUserId],[CreateTime],[ModifyUserId],[ModifyTime]) VALUES (@Uid, @QuestUid, @QuestAnswerId, @TesteeId, @QuestScore, @ActualScore, @TesteeSource, @CreateUserId, @CreateTime, @ModifyUserId, @ModifyTime);"; using (SqlConnection connection = DbConnection) { SqlCommand command = new SqlCommand(query, connection); command.Parameters.Add(new SqlParameter("@Uid", SqlDbType.VarChar) { Value = questAnswerDO.Uid.ToString() }); command.Parameters.Add(new SqlParameter("@QuestUid", SqlDbType.VarChar) { Value = questAnswerDO.QuestUid.ToString() }); command.Parameters.Add(new SqlParameter("@QuestAnswerId", SqlDbType.VarChar) { Value = questAnswerDO.QuestAnswerId ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@TesteeId", SqlDbType.VarChar) { Value = questAnswerDO.TesteeId ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@QuestScore", SqlDbType.Int) { Value = questAnswerDO.QuestScore ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@ActualScore", SqlDbType.Int) { Value = questAnswerDO.ActualScore ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@TesteeSource", SqlDbType.VarChar) { Value = questAnswerDO.TesteeSource ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@CreateUserId", SqlDbType.VarChar) { Value = questAnswerDO.CreateUserId ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@CreateTime", SqlDbType.DateTime) { Value = questAnswerDO.CreateTime ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@ModifyUserId", SqlDbType.VarChar) { Value = questAnswerDO.ModifyUserId ?? Convert.DBNull }); command.Parameters.Add(new SqlParameter("@ModifyTime", SqlDbType.DateTime) { Value = questAnswerDO.ModifyTime ?? Convert.DBNull }); connection.Open(); command.ExecuteNonQuery(); command = null; if (connection.State == ConnectionState.Open) { connection.Close(); } } }