/// <summary>
        /// 学生完成课时学习后,创建课后任务
        /// </summary>
        public Yw_StudentTask CreateTaskAutoAfterStudy(int studentId, int lesProgressId)
        {
            StudentStudyBll          studyBll    = new StudentStudyBll();
            Yw_StudentLessonProgress lesProgress = studyBll.GetStuLessonProgressById(lesProgressId);

            if (lesProgress.Yle_Percent < 100 && lesProgress.Yle_SubjectCount > 0)//学生课时学习中,如果题目全部作对,就不创建课后任务
            {
                Yw_StudentCourseProgress progress = studyBll.GetProgressByStudentCourse(studentId, lesProgress.Yle_CourseId);
                return(CreateStudyPractice(progress, studentId, lesProgress.Yle_LessonId, lesProgress.Yle_LessonIndex, lesProgressId, null, StudyTaskTypeEnum.系统课后任务));
            }
            return(null);
        }
 /// <summary>
 /// 生成新的学习进度数据
 /// </summary>
 /// <param name="studentId">学生id</param>
 /// <param name="courseId">课程id</param>
 /// <param name="lessonId">课时id</param>
 /// <returns></returns>
 public Yw_StudentLessonProgress GetNewProgressByStudent(int studentId, int courseId, int lessonId)
 {
     if (ScpRepository.GetByStudentCourse(studentId, courseId) != null)//如果此学生有此课程
     {
         LessonBll bll    = new LessonBll();
         var       lesson = bll.GetLesson(lessonId);
         //获取最后一次学习进度
         var progress = StuLesProgressRepository.GetLastProgress(studentId, lessonId);
         //学习进度
         var newProgress = new Yw_StudentLessonProgress()
         {
             Yle_StudentId      = studentId,
             Yle_CourseId       = courseId,
             Yle_LessonId       = lessonId,
             Yle_LessonIndex    = lesson.Ycl_Index,
             Yle_CreateTime     = DateTime.Now,
             Yle_CoinFromUIndex = 1,
             Yle_LastStudyTime  = DateTime.Now,
             Yle_StartStudyTime = DateTime.Now,
             Yle_UnitIndex      = 1,
             Yle_StudySeconds   = 0,
             Yle_IsFinished     = false,
             Yle_IsLastest      = true,
             Yle_key            = Guid.NewGuid().ToString("N").ToLower()
         };
         //学生答题记录
         var newAnswers = new Yw_StudentLessonAnswer()
         {
             Yla_StudentId     = studentId,
             Yla_CourseId      = courseId,
             Yla_LessonId      = lessonId,
             Yla_StudentAnswer = "",
             Yla_StudentCoin   = ""
         };
         if (progress == null)//如果没有学习进度,则重新添加一个学习进度
         {
             StuLesProgressRepository.Insert(newProgress);
             newAnswers.Yla_LessonProgressId = newProgress.Yle_Id;
             StuLessonAnsRepository.Insert(newAnswers);
         }
         else //否则新增加一个学习进度,并且修改最大金币发放单元
         {
             newProgress.Yle_CoinFromUIndex = progress.Yle_CoinFromUIndex > progress.Yle_UnitIndex ? progress.Yle_CoinFromUIndex : progress.Yle_UnitIndex;//修改最大金币发放单元
             StuLesProgressRepository.Insert(newProgress);
             newAnswers.Yla_LessonProgressId = newProgress.Yle_Id;
             StuLessonAnsRepository.Insert(newAnswers);
         }
         return(newProgress);
     }
     return(null);
 }
        /// <summary>
        /// 获取最新的课时数据,并更新学习进度秘钥
        /// </summary>
        /// <param name="studentId">学生id</param>
        /// <param name="courseId">课程id</param>
        /// <param name="lessonId">课时id</param>
        /// <returns></returns>
        public Yw_StudentLessonProgress GetLastProgressByStudent(int studentId, int courseId, int lessonId)
        {
            var course = ScpRepository.GetByStudentCourse(studentId, courseId);

            if (course != null)                                             //如果此学生有此课程
            {
                ScpRepository.UpdateStudyTime(course.Yps_Id, DateTime.Now); //更新最后学习时间
                LessonBll bll    = new LessonBll();
                var       lesson = bll.GetLesson(lessonId);
                if (lesson.Ycl_CourseId != courseId || lesson.Ycl_Status != (int)LessonStatusEnum.合格)
                {
                    return(null);
                }                                                                                                     //如果课时的课程id不一致或课时不是合格状态,则返回空
                //获取最后一次学习进度
                var progress    = StuLesProgressRepository.GetLastProgress(studentId, lessonId);
                var newProgress = new Yw_StudentLessonProgress
                {
                    Yle_StudentId      = studentId,
                    Yle_CourseId       = courseId,
                    Yle_LessonId       = lessonId,
                    Yle_LessonIndex    = lesson.Ycl_Index,
                    Yle_CreateTime     = DateTime.Now,
                    Yle_CoinFromUIndex = 1,
                    Yle_LastStudyTime  = DateTime.Now,
                    Yle_StartStudyTime = DateTime.Now,
                    Yle_UnitIndex      = 1,
                    Yle_StudySeconds   = 0,
                    Yle_IsFinished     = false,
                    Yle_IsLastest      = true,
                    Yle_key            = Guid.NewGuid().ToString("N").ToLower()
                };
                var newAnswers = new Yw_StudentLessonAnswer()
                {
                    Yla_StudentId     = studentId,
                    Yla_CourseId      = courseId,
                    Yla_LessonId      = lessonId,
                    Yla_StudentAnswer = "",
                    Yla_StudentCoin   = ""
                };
                if (progress == null)//如果没有学习进度,则重新添加一个学习进度
                {
                    StuLesProgressRepository.Insert(newProgress);
                    newAnswers.Yla_LessonProgressId = newProgress.Yle_Id;
                    StuLessonAnsRepository.Insert(newAnswers);
                    return(newProgress);
                }
                else if (progress.Yle_IsFinished)                                                                                                                 //如果学习进度完成了,则新增加一个学习进度,并且修改最大金币发放单元
                {
                    newProgress.Yle_CoinFromUIndex = progress.Yle_CoinFromUIndex > progress.Yle_UnitIndex ? progress.Yle_CoinFromUIndex : progress.Yle_UnitIndex; //修改最大金币发放单元
                    StuLesProgressRepository.Insert(newProgress);
                    newAnswers.Yla_LessonProgressId = newProgress.Yle_Id;
                    StuLessonAnsRepository.Insert(newAnswers);
                    return(newProgress);
                }
                else //如果学习进度没有完成
                {
                    progress.Yle_key = StuLesProgressRepository.UpdateKey(progress.Yle_Id);//更新学习进度的秘钥
                    return(progress);
                }
            }
            return(null);
        }
        /// <summary>
        /// 获取学习报告的统计部分
        /// </summary>
        /// <param name="studentId"></param>
        /// <param name="taskId"></param>
        /// <returns></returns>
        public DtoStudentReport GetByStuLesAnswer(int studentId, int lessonProgressId)
        {
            StudentStudyBll studentStudyBll = new StudentStudyBll();
            //var result = studentStudyBll.StuLesProgressRepository.IsHasStudy(lessonProgressId, studentId);
            //if (!result)
            //{
            //    throw new AbhsException(ErrorCodeEnum.NotStudyReport, AbhsErrorMsg.ConstNotStudyReport + " LessonProgressId:" + lessonProgressId);
            //}

            //演示异常使用,正式上线删除
            var lesProgress = studentStudyBll.StuLesProgressRepository.IsHasStudys(lessonProgressId, studentId);

            if (lesProgress == null)
            {
                throw new AbhsException(ErrorCodeEnum.NotStudyReport, AbhsErrorMsg.ConstNotStudyReport + " LessonProgressId:" + lessonProgressId);
            }
            if (!lesProgress.Yle_IsFinished)
            {
                var errorlog = $"操作者:{studentId},操作时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},课程进度Id:{lessonProgressId},原因:课程状态未完成,开始学习时间:{lesProgress.Yle_StartStudyTime.ToString("yyyy-MM-dd HH:mm:ss")},结束学习时间:{lesProgress.Yle_FinishStudyTime.ToString("yyyy-MM-dd HH:mm:ss")},学习时长:{lesProgress.Yle_StudySeconds},已答题目数:{lesProgress.Yle_SubjectCount},数据创建时间:{lesProgress.Yle_CreateTime.ToString("yyyy-MM-dd HH:mm:ss")},数据修改时间:{lesProgress.Yle_UpdateTime.ToString("yyyy-MM-dd HH:mm:ss")}";
                LogHelper.WriteLog(errorlog);

                //查询学习时长
                Yw_StudentLessonProgress lessonProgress = studentStudyBll.StuLesProgressRepository.GetProgressByID(lessonProgressId);
                var studyTime = Convert.ToInt32(Math.Ceiling(lessonProgress.Yle_StudySeconds * 1.0 / 60));
                //病句  选择题
                if (lesProgress.Yle_LessonId == 10000)
                {
                    return(GetSelect(studyTime));
                }
                //断句
                else if (lesProgress.Yle_LessonId == 10001)
                {
                    return(GetMarkCut(studyTime));
                }
                //阅读理解 填空
                else if (lesProgress.Yle_LessonId == 10002)
                {
                    return(GetFillBlank(studyTime));
                }
            }
            //演示结束

            //获取学生答案
            Yw_StudentLessonAnswerExt lessonAnswer  = studentStudyBll.StuLessonAnsRepository.GetStuLesAnswer(studentId, lessonProgressId) as Yw_StudentLessonAnswerExt;
            List <StudentAnswerCard>  answerCard    = lessonAnswer.Yla_Answer_Obj;
            DtoStudentReport          studentReport = new DtoStudentReport();

            if (answerCard != null)
            {
                //查询学习时长
                Yw_StudentLessonProgress lessonProgress = studentStudyBll.StuLesProgressRepository.GetProgressByID(lessonProgressId);
                studentReport.StudyTime = Convert.ToInt32(Math.Ceiling(lessonProgress.Yle_StudySeconds * 1.0 / 60));

                studentReport.StudyDate      = answerCard.OrderBy(s => s.SubmitTime).FirstOrDefault().SubmitTime;
                studentReport.TotalStars     = answerCard.Sum(s => s.TotalStars);
                studentReport.ResultCoins    = answerCard.Sum(s => s.AnswerCollection.Sum(x => x.ResultCoins));
                studentReport.TotalCoins     = answerCard.Sum(s => s.TotalCoins);
                studentReport.TotalScore     = Convert.ToInt32(Math.Round((answerCard.Sum(s => s.TotalStars) * 1.0 / (answerCard.Sum(s => s.AnswerCollection.Count) * 5.0) * 5), MidpointRounding.AwayFromZero));
                studentReport.SubjectCount   = answerCard.Sum(s => s.AnswerCollection.Count());
                studentReport.KnowledgeRates = answerCard.Sum(s => s.TotalStars) * 1.0 / (answerCard.Sum(s => s.AnswerCollection.Count) * 5.0);

                double rates = Math.Round((double)(answerCard.Sum(s => s.AnswerCollection.Where(x => x.ResultStars == 5).Count())) / answerCard.Sum(s => s.AnswerCollection.Count()), 2) * 100;
                studentReport.ExcellentRates = rates;
                var answers = answerCard.Select(s => s.AnswerCollection).ToList();
                List <StudentAnswerBase> answerBase = new List <StudentAnswerBase>();
                foreach (var item in answers)
                {
                    answerBase.AddRange(item.Where(x => x.KnowledgeId != 0).ToList());
                }
                var knowledgeShow = answerBase.GroupBy(s => s.KnowledgeId);
                studentReport.Knowledge = GetKnowledge(knowledgeShow);
            }
            return(studentReport);
        }