public QuestionnaireUtils()
 {
     defaultModel = new QuestionnaireViewModels
     {
         AssessId = 0,
         UserId = Guid.Empty,
         Answers = new List<QuestionnaireViewModels.AnswerKeyArr>()
     };
 }
 public Task<QuestionnaireViewModels> GetQuestionnaireTopic(int AssessId, Guid UserId, int offset = 1)
 {
     return Task.Factory.StartNew(() =>
     {
         try
         {
             QuestionnaireViewModels result = new QuestionnaireViewModels { AssessId = AssessId, UserId = UserId, Offset = offset };
             using (var ctx = new EvaluationSysEntities())
             {
                 int pagecount = 6, totalcount = 0;
                 var pagesetting = ctx.SettingConfig.FirstOrDefault(f => f.Name == "PageCount" && f.ConfigStatus >= 0)?.Value;
                 int.TryParse(pagesetting ?? "6", out pagecount);
                 var assess = ctx.AssessObj.FirstOrDefault(f => f.Id == AssessId && f.PID == ProjectId && f.UserID == UserId && f.Status >= -1);
                 if (assess == null)
                     throw new ArgumentException("Invaild Parameter", nameof(AssessId));
                 var page = new List<string>(assess.TestPage.TopicArr.Split(',')).ConvertAll(int.Parse);
                 result.Answers = (from c in ctx.TopicRecord
                                   where page.Contains(c.Id) && c.PID == ProjectId
                                   orderby c.Id ascending
                                   select new QuestionnaireViewModels.AnswerKeyArr
                                   {
                                       TopicHead = c.Heading,
                                       TopicId = c.Id,
                                       TopicType = c.Type,
                                       topic = c,
                                       subject = c.SubjectiveItems.FirstOrDefault(f => f.AssessId == AssessId),
                                   }).Paging(offset, pagecount, out totalcount).ToList();
                 result.IsUserName = assess.UserInfo1.UserName;
                 result.IsUserDepartment = assess.UserInfo1.BM;
                 result.IsUserPosition = assess.UserInfo1.ZW;
                 result.TotalCount = totalcount;
                 result.TotalPage = totalcount / pagecount + (totalcount % pagecount > 0 ? 1 : 0);
                 int i = (offset - 1) * pagecount;
                 foreach (var ans in result.Answers)
                 {
                     ans.RecordNum = ++i;
                     if (ans.TopicType == "A")
                     {
                         ans.Answer = assess.KeyArr?.Split(',').FirstOrDefault(f => int.Parse(f.Split('-')[0]) == ans.TopicId)?.Split('-')[1];
                         ans.Options = new List<string>() { ans.topic?.KeyA, ans.topic?.KeyB, ans.topic?.KeyC, ans.topic?.KeyD, ans.topic?.KeyE, ans.topic?.KeyF };
                     }
                     else
                     {
                         ans.Answer = ans.subject?.Answers;
                     }
                 }
             }
             return result;
         }
         catch (Exception ex)
         {
             errmsg = ex.GetBaseException().Message;
             throw ex;
         }
     });
 }
 public bool AnswersSave(QuestionnaireViewModels models, out string ErrMsg)
 {
     ErrMsg = null;
     try
     {
         using (var ctx = new EvaluationSysEntities())
         {
             var assess = ctx.AssessObj.FirstOrDefault(f => f.Id == models.AssessId && f.PID == ProjectId && f.UserID == models.UserId && f.Status >= -1);
             if (assess == null)
                 throw new ArgumentException("Invaild Parameter", nameof(models.AssessId));
             List<string> tmpans = new List<string>();
             List<int> tmpsub = new List<int>();
             if (!string.IsNullOrEmpty(assess.KeyArr))
                 tmpans.AddRange(assess.KeyArr.Split(','));
             if (!string.IsNullOrEmpty(assess.SubjectArr))
                 tmpsub.AddRange(assess.SubjectArr.Split(',').ToList().ConvertAll(int.Parse));
             if (models.Answers == null) return true;
             foreach (var ans in models.Answers)
             {
                 if (ans.TopicType == "A")
                 {
                     var objcet = tmpans.FirstOrDefault(w => int.Parse(w.Split('-')[0]) == ans.TopicId);
                     if (objcet != null) tmpans.Remove(objcet);
                     tmpans.Add(ans.Answer);
                 }
                 else
                 {
                     if (!tmpsub.Contains(ans.TopicId)) tmpsub.Add(ans.TopicId);
                     var subject = ctx.TopicRecord.FirstOrDefault(f => f.Id == ans.TopicId && f.PID == ProjectId)?.SubjectiveItems.FirstOrDefault(f => f.AssessId == assess.Id);
                     if (subject == null)
                     {
                         ctx.SubjectiveItems.Add(new SubjectiveItems
                         {
                             TopicId = ans.TopicId,
                             PID = ProjectId,
                             AssessId = assess.Id,
                             CreateTime = DateTime.Now,
                             Answers = ans.Answer,
                         });
                     }
                     else
                     {
                         subject.Answers = ans.Answer;
                     }
                 }
             }
             if (models.TotalPage == models.Offset) assess.Status = 1;
             assess.EndTime = DateTime.Now;
             tmpans = tmpans.OrderBy(o => int.Parse(o.Split('-')[0])).ToList();
             assess.KeyArr = string.Join(",", tmpans);
             assess.SubjectArr = string.Join(",", tmpsub);
             return ctx.SaveChanges() >= 0;
         }
     }
     catch (Exception ex)
     {
         ErrMsg = errmsg = ex.GetBaseException().Message;
         return false;
     }
 }
 public ActionResult QuestionnaireSave(QuestionnaireViewModels answers)
 {
     string err = "";string href = Url.Action("Questionnaire", new { offset = answers.Offset + 1, assId = answers.AssessId, userId = answers.UserId.ToString("N") });
     if (answers.Offset == answers.TotalPage) href = Url.Action("Action", new { userId = answers.UserId.ToString("N") });
     if (!questionnaireUtils.AnswersSave(answers,out err))
     {
         return Json(new { isErr = true, errMsg = err, href = Url.Action("Action", new { userId = answers.UserId.ToString("N") }) });
     }
     return Json(new { isErr = false, href = href });
 }