/// <summary>
        /// 获取已安排课表的班级课表信息
        /// <para>作    者:zhiwei.Tang</para>
        /// <para>创建时间:2018-11-06</para>
        /// </summary>
        /// <remarks>课程表班级的详情信息</remarks>
        /// <exception cref="BussinessException">
        /// 异常ID:1,异常描述:班级信息为空
        /// </exception>
        private ClassTimetableResponse GetClassTimetable()
        {
            //获取班级
            var classInfo = this.GetClass();

            if (classInfo == null)
            {
                throw new BussinessException(ModelType.Default, 1);
            }

            //基础数据
            ClassTimetableResponse res = new ClassTimetableResponse()
            {
                ClassNo            = classInfo.ClassNo,
                CourseId           = classInfo.CourseId,
                CourseLevelId      = classInfo.CourseLeveId,
                CourseNum          = classInfo.CourseNum,
                StudentsNum        = classInfo.StudentsNum,
                TeaherId           = classInfo.TeacherId,
                CanClassJoin       = false,
                WeekDaySchoolTimes = new List <ClassTimetableSchoolTimeResponse>()
            };

            SchoolTimeService schoolTimeService = new SchoolTimeService(classInfo.TermId);
            //获取学期信息
            TblDatTerm term = schoolTimeService.TblDatTerm;
            //这个学期所有的上课时间
            var allTermClassTime = schoolTimeService.TblDatSchoolTime.OrderBy(x => x.BeginTime).ToList();

            //校区老师
            res.Teacher = TeachService.GetIncumbentTeachers(term.SchoolId, classInfo.TeacherId);

            //课程信息与课程等级
            res.ClassTimetableCourse = GetClassTimetableCourseResponse(term.SchoolId, classInfo.ClassRoomId, classInfo.CourseId);

            //当前教室门牌号
            res.RoomNo = new SchoolClassRoomService(term.SchoolId).GetClassRoom(classInfo.ClassRoomId)?.RoomNo;

            var timClassTime = _classTimeRepository.Value.GetByClassId(classInfo.ClassId);

            //当前班级对应的上课时间段
            var currentClassTimes = allTermClassTime
                                    .Where(m => timClassTime.Select(x => x.SchoolTimeId).Contains(m.SchoolTimeId))
                                    .OrderBy(x => x.BeginTime).ToList();

            //班级第一个时间段
            var firstClassTime = currentClassTimes[0];

            res.Time1 = new List <string> {
                firstClassTime.BeginTime, firstClassTime.EndTime
            };
            res.Time2 = new List <string>();

            var isJoinClass = currentClassTimes.Where(x => x.WeekDay == firstClassTime.WeekDay).OrderBy(x => x.BeginTime).ToList();

            //班级第二个时间段
            if (isJoinClass.Count > 1)
            {
                var secondClassTime = isJoinClass[1];
                res.Time2 = new List <string> {
                    secondClassTime.BeginTime, secondClassTime.EndTime
                };
                res.IsClassJoin = true;
            }

            //星期几与上课时间的数据
            for (int i = 1; i <= 7; i++)
            {
                var classTime = currentClassTimes.Where(x => x.WeekDay == i).ToList();
                ClassTimetableSchoolTimeResponse ctst = new ClassTimetableSchoolTimeResponse
                {
                    HasSchoolTime1 = false,
                    SchoolTimeId1  = 0,
                    HasSchoolTime2 = false,
                    SchoolTimeId2  = 0,
                    IsChecked      = false,
                    WeekDay        = i
                };
                if (classTime.Any())
                {
                    ctst.HasSchoolTime1 = true;
                    ctst.SchoolTimeId1  = classTime[0].SchoolTimeId;
                    ctst.IsChecked      = true;

                    if (classTime.Count > 1)
                    {
                        ctst.HasSchoolTime2 = true;
                        ctst.SchoolTimeId2  = classTime[1].SchoolTimeId;
                    }
                }
                res.WeekDaySchoolTimes.Add(ctst);
            }

            return(res);
        }
        /// <summary>
        /// 校验时间段是否可以连上
        /// <para>作    者:zhiwei.Tang</para>
        /// <para>创建时间:2018-11-06</para>
        /// </summary>
        /// <param name="allClassTime">所有上课时间段</param>
        /// <param name="classRoomId">教室Id</param>
        /// <param name="schoolTimeId">上课时间段</param>
        /// <param name="termId">学期Id</param>
        /// <returns>课程表基础数据</returns>
        private static ClassTimetableSchoolTimeResult GetClassTimetableSchoolTimeResult(
            List <TblDatSchoolTime> allClassTime, long classRoomId, long schoolTimeId, long termId)
        {
            ClassTimetableSchoolTimeResult res = new ClassTimetableSchoolTimeResult()
            {
                Time2 = new List <string>(),
                WeekDaySchoolTimes = new List <ClassTimetableSchoolTimeResponse>(),
                CanClassJoin       = false
            };

            TermCourseTimetableAuditService termCourseTimetableAuditService = new TermCourseTimetableAuditService(termId);

            List <long> schoolTimeIds = allClassTime.Select(x => x.SchoolTimeId).Distinct().ToList();

            List <long> alreadySchoolTimeIds = null;//已上课时间段

            if (termCourseTimetableAuditService.NoPass)
            {
                alreadySchoolTimeIds = termCourseTimetableAuditService.GetAlreadyClassTime(classRoomId);
            }
            else
            {
                alreadySchoolTimeIds = GetAlreadyClassTime(termId, classRoomId);
            }

            //1.第一节上课时间
            TblDatSchoolTime firstClassTime = allClassTime.FirstOrDefault(x => x.SchoolTimeId == schoolTimeId);
            //2.第二节上课时间
            TblDatSchoolTime secondClassTime = null;

            //当天所有上课时间段
            var dayClassTimes = allClassTime
                                .Where(x => x.WeekDay == firstClassTime.WeekDay && x.Duration == firstClassTime.Duration)
                                .OrderBy(x => x.BeginTime)
                                .ToList();

            //第一个时间段索引
            int firstTimeIndex = dayClassTimes.IndexOf(firstClassTime);
            //第二个时间段索引
            int secondClassTimeIndex = firstTimeIndex + 1;

            //班级第二个时间段
            if (dayClassTimes.Count > secondClassTimeIndex)
            {
                secondClassTime = dayClassTimes[secondClassTimeIndex];
                if (!alreadySchoolTimeIds.Any(x => x == secondClassTime.SchoolTimeId))
                {
                    res.CanClassJoin = true;
                    res.Time2.Add(secondClassTime.BeginTime);
                    res.Time2.Add(secondClassTime.EndTime);
                }
            }

            //一周的上课时间
            for (int i = 1; i <= 7; i++)
            {
                ClassTimetableSchoolTimeResponse ctst = new ClassTimetableSchoolTimeResponse
                {
                    HasSchoolTime1 = false,
                    SchoolTimeId1  = 0,
                    HasSchoolTime2 = false,
                    SchoolTimeId2  = 0,
                    IsChecked      = false,
                    WeekDay        = i
                };

                //当天时间段
                var currentDayTime = allClassTime
                                     .Where(x => x.WeekDay == i && x.Duration == firstClassTime.Duration)
                                     .OrderBy(x => x.BeginTime)
                                     .ToList();

                //第一节
                TblDatSchoolTime first = currentDayTime.FirstOrDefault(x =>
                                                                       x.Duration == firstClassTime.Duration &&
                                                                       x.BeginTime == firstClassTime.BeginTime &&
                                                                       x.EndTime == firstClassTime.EndTime);

                //该天没有此时间段
                if (first == null)
                {
                    res.WeekDaySchoolTimes.Add(ctst);
                    continue;
                }

                //第一节课基本数据
                ctst.HasSchoolTime1 = true;
                ctst.SchoolTimeId1  = first.SchoolTimeId;
                if (first.SchoolTimeId == firstClassTime.SchoolTimeId)
                {
                    ctst.IsChecked = true;
                }

                //第一节课时间段段是否占用
                if (alreadySchoolTimeIds.Any(x => x == first.SchoolTimeId))
                {
                    ctst.HasSchoolTime1 = false;
                    ctst.SchoolTimeId1  = 0;
                    res.WeekDaySchoolTimes.Add(ctst);
                    continue;
                }

                //第二节 是否能够与下一个时间段连上
                if (secondClassTime != null)
                {
                    TblDatSchoolTime second = currentDayTime.FirstOrDefault(x =>
                                                                            x.Duration == secondClassTime.Duration &&
                                                                            x.BeginTime == secondClassTime.BeginTime &&
                                                                            x.EndTime == secondClassTime.EndTime);

                    if (second != null)
                    {
                        if (!alreadySchoolTimeIds.Any(x => x == second.SchoolTimeId))
                        {
                            ctst.HasSchoolTime2 = true;
                            ctst.SchoolTimeId2  = second.SchoolTimeId;
                        }
                    }
                }
                res.WeekDaySchoolTimes.Add(ctst);
            }

            return(res);
        }