/// <summary> /// 提交学生学习进度数据 /// </summary> /// <param name="info"></param> /// <returns>0:添加成功,-1:课时进度秘钥错误,-2:数据重复提交,-3:金币数目错误</returns> public int SubmitStudyProgress(DtoStudnetUnitSubmit info) { ///注:这里考虑如何使用事务 DateTime submitTime = DateTime.Now; //获取最后一次学习进度 var progress = StuLesProgressRepository.GetLastProgress(info.StudnetId, info.LessonId); //判断课时进度秘钥是否正确 if (progress.Yle_key == info.ProgressKey) { //如果当前进度中的当前学习单元页大于提交的单元 if (progress.Yle_UnitIndex > info.UnitNum) { return(-2);//表示数据已经提交过,不能重复提交 } else { //创建答题卡对象 StudentAnswerCard card = null; #region 填充答题卡数据 if (info.Answers != null && info.Answers.Count > 0) { card = new StudentAnswerCard(); card.AnswerCollection = info.Answers; //填充答案 card.TotalStars = info.Answers.Sum(s => s.ResultStars); //填充总星数 card.TotalCoins = info.Answers.Sum(s => s.ResultCoins); //填充总金币数 card.Part = info.UnitID; //填充单元(页码)id card.SubmitTime = submitTime.ToString("yyyy-MM-dd HH:mm:ss"); //填充提交时间 card.UseTime = info.UseTime; //填充用户学习时间 } #endregion //创建金币记录对象 StuLessonCoinRecord coinRecord = null; #region 更新金币记录对象及答题卡部分数据 if (info.Coins != null && info.Coins.Count > 0) { coinRecord = new StuLessonCoinRecord(); coinRecord.CoinCollection = info.Coins; //填充金币记录 coinRecord.TotalCoins = info.Coins.Sum(s => s.GetCoins); //填充总金币数 coinRecord.Part = info.UnitID; //填充单元(页码)id coinRecord.SubmitTime = submitTime.ToString("yyyy-MM-dd HH:mm:ss"); //填充提交时间 coinRecord.UseTime = info.UseTime; //填充用户学习时间 } #endregion if (coinRecord != null && coinRecord.TotalCoins > info.AllCoin) //如果得到的金币数大于本页总金币数 { return(-3); //表示金币和大于总金币数 } else { #region 修改课时进度表数据 progress.Yle_UnitIndex = info.UnitNum + 1; //更新开始页 progress.Yle_IsFinished = info.UnitNum >= info.TotalUnitNum; //更新是否结束 progress.Yle_LastStudyTime = DateTime.Now; //更新最后学习时间 progress.Yle_SubjectCount += info.Answers.Count; //更新总题目数 progress.Yle_RightSubjectCount += info.Answers.Where(s => s.IsRight).Count(); //更新正确题目数 progress.Yle_GainCoins += info.Coins.Sum(s => s.GetCoins); //更新获取金币数量 progress.Yle_Percent = (int)(Math.Round(progress.Yle_RightSubjectCount * 1.0 / (progress.Yle_SubjectCount == 0 ? 1 : progress.Yle_SubjectCount), 2) * 100); //重新计算题目正确率 progress.Yle_StudySeconds += info.UseTime; //增加课时进度学习时长 #endregion #region 事务提交 using (TransactionScope scope = new TransactionScope()) { try { #region 提交 //如果学习完成,更新学生课程进度表 if (progress.Yle_IsFinished) { progress.Yle_FinishStudyTime = DateTime.Now;//修改课时完成完成时间 //获取完成的课时id var finisheds = StuLesProgressRepository.GetFinishedByLesson(info.StudnetId, info.CoruseId); if (!finisheds.Contains(info.LessonId))//如果课时没有学完过,修改课程进度表数据 { LessonBll bll = new LessonBll(); int lessonCount = bll.GetLessonsCountByCourse(info.CoruseId); //课程的课时数 var courseProgress = ScpRepository.GetByStudentCourse(info.StudnetId, info.CoruseId); //获取课程完成进度. courseProgress.Yps_LessonFinishedCount = finisheds.Count() + 1; //完成的课时数+1(自身) courseProgress.Yps_IsFinished = courseProgress.Yps_LessonFinishedCount >= lessonCount; //如果完成的课时数大于等于总课时数,则表示完成. courseProgress.Yps_NextLessonIndex = courseProgress.Yps_NextLessonIndex > info.LessonNum ? courseProgress.Yps_NextLessonIndex : info.LessonNum + 1; //如果下一课时数大于当前课时,则不更改.否则改为当前课时的下一课时序号 if (courseProgress.Yps_IsFinished && courseProgress.Yps_FinishStudyTime == new DateTime(1900, 1, 1)) //如果课程进度完成,且完成时间不为初始值,则修改此时间 { courseProgress.Yps_FinishStudyTime = DateTime.Now; } courseProgress.Yps_UpdateTime = DateTime.Now; //更新时间 ScpRepository.Update(courseProgress); //更新课程进度 } } StuLesProgressRepository.Update(progress);//更新课时数据 string cardJson = "", coinJson = ""; //添加错题数据 if (card != null) { cardJson = $",{JsonConvert.SerializeObject(card)}"; new StudentWrongBookBll().SaveWrongBook(new List <StudentAnswerCard> { card }, new DtoStudentWrongBook { CourseId = progress.Yle_CourseId, LessonId = progress.Yle_LessonId, LessonProgressId = progress.Yle_Id, Source = StudyWrongSourceEnum.课程学习, StudentId = progress.Yle_StudentId, StudyTaskId = 0 }); } //需要修改学生金币数量及经验 if (coinRecord != null) { coinJson = $",{JsonConvert.SerializeObject(coinRecord)}"; new StudentInfoBll().AddCoins(info.StudnetId, coinRecord.TotalCoins); } //更新学生课时答题结果表 if (card != null || coinRecord != null) { StuLessonAnsRepository.Update(info.ProgressID, cardJson, coinJson); } #endregion scope.Complete(); } catch (Exception ex) { RollbackTran(); throw ex; } } #endregion StudentStudyBll ssbll = new StudentStudyBll(); ssbll.PublishStudyMessage(progress.Yle_CourseId, progress.Yle_LessonId, progress.Yle_StudentId, info.UseTime, progress.Yle_SubjectCount, progress.Yle_GainCoins); if (progress.Yle_IsFinished) { ssbll.PublishLessonFinishMessage(progress.Yle_StudentId, progress.Yle_Id); } return(0);//表示成功 } } } else { return(-1);//表示课时进度秘钥错误,及在其他地方打开了这个课程学习 } }
public Yw_StudentLessonAnswerExt MakeTranslator(Yw_StudentLessonAnswer entity) { Yw_StudentLessonAnswerExt realEntity = entity.ConvertTo <Yw_StudentLessonAnswerExt>(); if (!string.IsNullOrEmpty(entity.Yla_StudentAnswer)) { realEntity.Yla_Answer_Obj = new List <StudentAnswerCard>(); JArray arr = JsonConvert.DeserializeObject($"[{entity.Yla_StudentAnswer.Trim(',')}]") as JArray;//数据库存储时没有数组的括号,并且两边可能会有","需要去除 foreach (var o in arr) { StudentAnswerCard card = new StudentAnswerCard(); card.UseTime = Convert.ToInt32(o["UTim"]); card.SubmitTime = o["STim"].ToString(); card.TotalStars = Convert.ToInt32(o["EStar"]); card.TotalCoins = Convert.ToInt32(o["TCoin"]); card.Part = Convert.ToInt32(o["Part"]); JArray answers = JsonConvert.DeserializeObject(o["Anws"].ToString()) as JArray; foreach (var a in answers) { #region 根据类型添加不同的对象 switch ((SubjectTypeEnum)Convert.ToInt32(a["Type"])) { case SubjectTypeEnum.择题: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuSelectAnswer>(a.ToString())); } break; case SubjectTypeEnum.判断题: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuTrueFalseAnswer>(a.ToString())); } break; case SubjectTypeEnum.填空题: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuBlankAnswer>(a.ToString())); } break; case SubjectTypeEnum.择填空: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuSelectBlankAnswer>(a.ToString())); } break; case SubjectTypeEnum.连线题: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuMatchAnswer>(a.ToString())); } break; case SubjectTypeEnum.主观题: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuFreeAnswer>(a.ToString())); } break; case SubjectTypeEnum.圈点批注标色: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuMarkColorAnswer>(a.ToString())); } break; case SubjectTypeEnum.圈点批注断句: { card.AnswerCollection.Add(JsonConvert.DeserializeObject <StuMarkCutAnswer>(a.ToString())); } break; } #endregion } realEntity.Yla_Answer_Obj.Add(card); } } if (!string.IsNullOrEmpty(entity.Yla_StudentCoin)) { realEntity.Yla_StudentCoin_Obj = new List <StuLessonCoinRecord>(); JArray arr = JsonConvert.DeserializeObject($"[{entity.Yla_StudentCoin.Trim(',')}]") as JArray; //数据库存储时没有数组的括号,并且两边可能会有","需要去除 foreach (var o in arr) { StuLessonCoinRecord coin = new StuLessonCoinRecord(); coin.UseTime = Convert.ToInt32(o["UTim"]); coin.SubmitTime = o["STim"].ToString(); coin.TotalCoins = Convert.ToInt32(o["TCon"]); coin.Part = Convert.ToInt32(o["Part"]); coin.CoinCollection = new List <StuLessonCoinItem>(); JArray items = JsonConvert.DeserializeObject(o["Cons"].ToString()) as JArray; foreach (var i in items) { coin.CoinCollection.Add(JsonConvert.DeserializeObject <StuLessonCoinItem>(i.ToString())); } realEntity.Yla_StudentCoin_Obj.Add(coin); } } return(realEntity); }