/// <summary>
        /// 获取未安排课表的班级课表信息
        /// <para>作    者:zhiwei.Tang</para>
        /// <para>创建时间:2018-11-06</para>
        /// </summary>
        /// <param name="classRoomId">教室ID</param>
        /// <param name="schoolTimeId">时间段ID</param>
        /// <returns>课次表详情</returns>
        public static ClassTimetableResponse GetNoClassTimetable(long classRoomId, long schoolTimeId)
        {
            ClassTimetableResponse res = new ClassTimetableResponse
            {
                IsClassJoin = false
            };

            SchoolTimeService       service        = SchoolTimeService.CreateSchoolTimeService(schoolTimeId);
            List <TblDatSchoolTime> allSchoolTimes = service.TblDatSchoolTime;
            TblDatTerm term = service.TblDatTerm;

            //获取当前时间段
            var firstTime = allSchoolTimes.FirstOrDefault(x => x.SchoolTimeId == schoolTimeId);

            //第一节课时间段
            res.Time1 = new List <string> {
                firstTime.BeginTime, firstTime.EndTime
            };

            //上课老师
            res.Teacher = TeachService.GetIncumbentTeachers(term.SchoolId);

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

            //课程与课程等级
            res.ClassTimetableCourse = GetClassTimetableCourseResponse(term.SchoolId, classRoomId);

            ClassTimetableSchoolTimeResult classTimetableSchoolTimeResult = GetClassTimetableSchoolTimeResult(allSchoolTimes, classRoomId, schoolTimeId, term.TermId);

            //星期几与上课时间的数据
            res.WeekDaySchoolTimes = classTimetableSchoolTimeResult
                                     .WeekDaySchoolTimes
                                     .OrderBy(m => m.WeekDay).ToList();

            res.CanClassJoin = classTimetableSchoolTimeResult.CanClassJoin;

            //第二节课时间段
            res.Time2 = classTimetableSchoolTimeResult.Time2;

            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);
        }