public void SubmintProcressData() { var dataStr = "{\"coins\":[],\"answers\":[],\"useTime\":5,\"courseId\":10000,\"lessonId\":10000,\"lessonNum\":1,\"unitId\":10000,\"unitNum\":1,\"totalUnitNum\":14,\"progressId\":10001,\"progressKey\":\"71441bd833884cc78e6ae8434e552ff1\",\"coinsKey\":\"E490AD625ABC1D994DA1F5D897591D3A0A745B468D778F7B\"}"; DtoStudnetUnitSubmit info = new DtoStudnetUnitSubmit(); #region json字符串填充数据 try { JObject data = JsonConvert.DeserializeObject(dataStr) as JObject; info.StudnetId = 10000; info.CoruseId = Convert.ToInt32(data["courseId"]); //课程id info.LessonId = Convert.ToInt32(data["lessonId"]); //课时id info.LessonNum = Convert.ToInt32(data["lessonNum"]); //课时序号 info.UnitID = Convert.ToInt32(data["unitId"]); //单元(讲义页)id string coinKey = Encrypt.DecryptQueryString(data["coinsKey"].ToString()); //金币加密字符串 string[] check = coinKey.Split('_'); //验证金币加密串是否可用 //这个验证方式要与GetLessonPage方法中加密字符串对应 if (check.Length == 4 && check[1] == info.UnitID.ToString() && check[2] == info.LessonId.ToString() && check[3] == info.CoruseId.ToString()) { info.AllCoin = Convert.ToInt32(check[0]); //本页最大金币数 info.UnitNum = Convert.ToInt32(data["unitNum"]); //单元(讲义页)序号 info.UseTime = Convert.ToInt32(data["useTime"]); //学习时长(秒) info.ProgressID = Convert.ToInt32(data["progressId"]); //学习进度id info.ProgressKey = data["progressKey"].ToString(); //学习进度key info.TotalUnitNum = Convert.ToInt32(data["totalUnitNum"]); //最大学习数 #region 填充答题结果 JArray answers = JsonConvert.DeserializeObject(data["answers"].ToString()) as JArray; foreach (var a in answers) { info.Answers.Add(TranslateAnswer(a.ToString())); } #endregion #region 填充金币记录 JArray coins = JsonConvert.DeserializeObject(data["coins"].ToString()) as JArray; foreach (var c in coins) { JObject o = JsonConvert.DeserializeObject(c.ToString()) as JObject; info.Coins.Add(new StuLessonCoinItem { ActionId = o["acid"].ToString(), ActionCoins = Convert.ToInt32(o["acin"]), ActionType = o["type"].ToString(), GetCoins = Convert.ToInt32(o["gcin"]) }); } #endregion } else { throw new Exception("金币加密数据错误"); } } catch { throw new Exception("字符串转对象错误"); } #endregion StudentStudyBll bll = new StudentStudyBll(); int result = bll.SubmitStudyProgress(info);//提交数据结果 var r = new JsonResponse <object>(); #region 根据结果填充返回数据 switch (result) { case 0: //成功 r.State = true; break; case -1: //课时进度秘钥错误 r.State = false; r.ErrorCode = result; r.ErrorMsg = "课时进度秘钥错误"; break; case -2: //数据重复提交 r.State = false; r.ErrorCode = result; r.ErrorMsg = "数据重复提交"; break; case -3: //金币数目错误 r.State = false; r.ErrorCode = result; r.ErrorMsg = "金币数目错误"; break; default: r.State = false; r.ErrorCode = result; r.ErrorMsg = "未知错误"; break; } #endregion }
public JsonResult SubmintProcressData(string dataStr) { StringBuilder sb = new StringBuilder(); sb.Append($"学生id:{GetCurrentUser().StudentId},操作时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")};"); sb.AppendLine($"接收数据:{dataStr}"); DtoStudnetUnitSubmit info = new DtoStudnetUnitSubmit(); #region json字符串填充数据 try { JObject data = JsonConvert.DeserializeObject(dataStr) as JObject; info.StudnetId = GetCurrentUser().StudentId; info.CoruseId = Convert.ToInt32(data["courseId"]); //课程id info.LessonId = Convert.ToInt32(data["lessonId"]); //课时id info.LessonNum = Convert.ToInt32(data["lessonNum"]); //课时序号 info.UnitID = Convert.ToInt32(data["unitId"]); //单元(讲义页)id string coinKey = Encrypt.DecryptQueryString(data["coinsKey"].ToString()); //金币加密字符串 string[] check = coinKey.Split('_'); //验证金币加密串是否可用 //这个验证方式要与GetLessonPage方法中加密字符串对应 if (check.Length == 4 && check[1] == info.UnitID.ToString() && check[2] == info.LessonId.ToString() && check[3] == info.CoruseId.ToString()) { info.AllCoin = Convert.ToInt32(check[0]); //本页最大金币数 info.UnitNum = Convert.ToInt32(data["unitNum"]); //单元(讲义页)序号 info.UseTime = Convert.ToInt32(data["useTime"]); //学习时长(秒) info.ProgressID = Convert.ToInt32(data["progressId"]); //学习进度id info.ProgressKey = data["progressKey"].ToString(); //学习进度key info.TotalUnitNum = Convert.ToInt32(data["totalUnitNum"]); //最大学习数 #region 填充答题结果 JArray answers = JsonConvert.DeserializeObject(data["answers"].ToString()) as JArray; foreach (var a in answers) { info.Answers.Add(SubjectAnswerObjectBuilder.TranslateAnswer(a.ToString())); } #endregion #region 填充金币记录 JArray coins = JsonConvert.DeserializeObject(data["coins"].ToString()) as JArray; foreach (var c in coins) { JObject o = JsonConvert.DeserializeObject(c.ToString()) as JObject; info.Coins.Add(new StuLessonCoinItem { ActionId = o["acid"].ToString(), ActionCoins = Convert.ToInt32(o["acin"]), ActionType = o["type"].ToString(), GetCoins = Convert.ToInt32(o["gcin"]) }); } #endregion } else { sb.AppendLine("回复数据:金币加密串解析错误"); LogHelper.ErrorLog(sb.ToString(), new Exception("金币加密串解析错误")); return(Json(new JsonResponse <object> { State = false, ErrorCode = -100, ErrorMsg = "金币加密串解析错误" })); } } catch (Exception ex) { sb.AppendLine("回复数据:json数据结构错误"); LogHelper.ErrorLog(sb.ToString(), ex); return(Json(new JsonResponse <object> { State = false, ErrorCode = -200, ErrorMsg = "json数据结构错误" })); } #endregion StudentStudyBll bll = new StudentStudyBll(); int result = bll.SubmitStudyProgress(info);//提交数据结果 var r = new JsonResponse <object>(); #region 根据结果填充返回数据 switch (result) { case 0: //成功 r.State = true; r.ErrorMsg = "成功"; break; case -1: //课时进度秘钥错误 r.State = false; r.ErrorCode = result; r.ErrorMsg = "课时进度秘钥错误"; break; case -2: //数据重复提交 r.State = false; r.ErrorCode = result; r.ErrorMsg = "数据重复提交"; break; case -3: //金币数目错误 r.State = false; r.ErrorCode = result; r.ErrorMsg = "金币数目错误"; break; default: r.State = false; r.ErrorCode = result; r.ErrorMsg = "未知错误"; break; } #endregion if (!r.State) { sb.AppendLine($"回复数据:{r.ErrorMsg}"); LogHelper.ErrorLog(sb.ToString(), new Exception(r.ErrorMsg)); } return(Json(r)); }
/// <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);//表示课时进度秘钥错误,及在其他地方打开了这个课程学习 } }