using Edu.AOP.CustomerAttribute;
using Edu.Cache.User;
using Edu.Common;
using Edu.Common.Enum;
using Edu.Common.Enum.Course;
using Edu.Common.Plugin;
using Edu.Model.CacheModel;
using Edu.Model.Entity.Course;
using Edu.Model.Entity.Grade;
using Edu.Model.Entity.Sell;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.Mall;
using Edu.Model.ViewModel.Grade;
using Edu.Model.ViewModel.Reserve;
using Edu.Model.ViewModel.Sell;
using Edu.Model.ViewModel.User;
using Edu.Repository.Course;
using Edu.Repository.Finance;
using Edu.Repository.Log;
using Edu.Repository.Reserve;
using Edu.Repository.User;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using VT.FW.DB;
using Edu.Model.Entity.Mall;
using Edu.Repository.BackClass;
using Edu.Repository.Grade;
using Edu.Repository.Sell;
using Edu.Module.User;
using System.Web;
using Edu.Common.Enum.System;

namespace Edu.Module.Course
{
    /// <summary>
    /// 班级管理处理类
    /// </summary>
    public class ClassModule
    {
        /// <summary>
        /// 班级仓储层对象
        /// </summary>
        private readonly RB_ClassRepository classRepository = new RB_ClassRepository();

        /// <summary>
        /// 班级上课计划仓储层对象
        /// </summary>
        private readonly RB_Class_PlanRepository class_PlanRepository = new RB_Class_PlanRepository();

        /// <summary>
        /// 班级上课计划上课时间仓储层对象
        /// </summary>
        private readonly RB_Class_TimeRepository class_TimeRepository = new RB_Class_TimeRepository();

        /// <summary>
        /// 班级类型
        /// </summary>
        private readonly RB_Class_TypeRepository class_TypeRepository = new RB_Class_TypeRepository();

        /// <summary>
        /// 班级价格仓储层对象
        /// </summary>
        private readonly RB_Class_StepPriceRepository class_StepPriceRepository = new RB_Class_StepPriceRepository();

        /// <summary>
        /// 订单学员仓储层对象
        /// </summary>
        private readonly RB_Order_GuestRepository order_GuestRepository = new RB_Order_GuestRepository();

        /// <summary>
        /// 课程仓储层对象
        /// </summary>
        private readonly RB_CourseRepository courseRepository = new RB_CourseRepository();

        /// <summary>
        /// 订单仓储层对象
        /// </summary>
        private readonly RB_OrderRepository orderRepository = new RB_OrderRepository();
        /// <summary>
        /// 课程日志记录表
        /// </summary>
        private readonly RB_Class_LogRepository classLogRepository = new RB_Class_LogRepository();
        /// <summary>
        /// 课程签到记录表
        /// </summary>
        private readonly RB_Class_CheckRepository classCheckRepository = new RB_Class_CheckRepository();

        /// <summary>
        /// 课程日志记录表
        /// </summary>
        private readonly RB_StudentRepository studentRepository = new RB_StudentRepository();

        /// <summary>
        /// 教室仓储层对象
        /// </summary>
        private readonly RB_Class_RoomRepository class_RoomRepository = new RB_Class_RoomRepository();

        /// <summary>
        /// 教师仓储层对象
        /// </summary>
        private readonly RB_TeacherRepository teacherRepository = new RB_TeacherRepository();

        /// <summary>
        /// 开启班级收支仓储层对象
        /// </summary>
        private readonly RB_Class_FinanceRepository classFinanceRepository = new RB_Class_FinanceRepository();

        /// <summary>
        /// 课程基础配置
        /// </summary>
        private readonly RB_Class_ConfigRepository class_ConfigRepository = new RB_Class_ConfigRepository();

        /// <summary>
        /// 教育月结轧账
        /// </summary>
        private readonly RB_RollingAccountRepository rollingAccountRepository = new RB_RollingAccountRepository();

        /// <summary>
        /// 课程基础配置
        /// </summary>
        private readonly RB_Class_LessonPlanDetailsRepository ClassLessonPlanDetailsRepository = new RB_Class_LessonPlanDetailsRepository();

        /// <summary>
        /// 课程基础配置
        /// </summary>
        private readonly RB_Class_LessonPlanProjectsRepository ClassLessonPlanProjectsRepository = new RB_Class_LessonPlanProjectsRepository();

        /// <summary>
        /// 班级备案评论仓储层对象
        /// </summary>
        private readonly RB_Class_LessonCommentRepository classLessonCommentRepository = new RB_Class_LessonCommentRepository();

        /// <summary>
        /// 课程基础配置
        /// </summary>
        private readonly RB_Class_LessonPlanRepository ClassLessonPlanRepository = new RB_Class_LessonPlanRepository();

        /// <summary>
        /// 班级关联课程仓储层对象
        /// </summary>
        private readonly RB_Class_CourseRepository class_CourseRepository = new RB_Class_CourseRepository();

        /// <summary>
        /// 约课仓储层对象
        /// </summary>
        private readonly RB_Reserve_ClassRepository reserve_ClassRepository = new RB_Reserve_ClassRepository();

        /// <summary>
        /// 访客预约仓储层对象
        /// </summary>
        private readonly RB_Visitor_ReserveRepository visitor_ReserveRepository = new RB_Visitor_ReserveRepository();


        /// <summary>
        /// 教室异常仓储对象
        /// </summary>
        private readonly RB_Class_RoomUseLogRepository class_RoomUseLogRepository = new RB_Class_RoomUseLogRepository();

        /// <summary>
        /// 学员补课记录表仓储层对象
        /// </summary>
        private readonly RB_Student_MakeupRepository student_MakeupRepository = new RB_Student_MakeupRepository();

        /// <summary>
        /// 学员订单仓储层对象
        /// </summary>
        private readonly RB_Student_OrderGuestRepository student_OrderGuestRepository = new RB_Student_OrderGuestRepository();

        /// <summary>
        /// 日志仓储对象
        /// </summary>
        private readonly RB_User_ChangeLogRepository user_ChangeLogRepository = new RB_User_ChangeLogRepository();

        /// <summary>
        /// b2b同业学生消息推送
        /// </summary>
        private readonly RB_B2B_StudentNoticeRepository b2B_StudentNoticeRepository = new RB_B2B_StudentNoticeRepository();

        /// <summary>
        /// 商品规格
        /// </summary>
        private readonly Repository.Mall.RB_Goods_SpecificationRepository goods_SpecificationRepository = new Repository.Mall.RB_Goods_SpecificationRepository();
        /// <summary>
        /// 商品规格值
        /// </summary>
        private readonly Repository.Mall.RB_Goods_SpecificationValueRepository goods_SpecificationValueRepository = new Repository.Mall.RB_Goods_SpecificationValueRepository();
        /// <summary>
        /// 商品规格价格
        /// </summary>
        private readonly Repository.Mall.RB_Goods_SpecificationPriceRepository goods_SpecificationPriceRepository = new Repository.Mall.RB_Goods_SpecificationPriceRepository();

        /// <summary>
        /// 账户仓储层
        /// </summary>
        private readonly RB_AccountRepository accountRepository = new RB_AccountRepository();


        /// <summary>
        /// 账户仓储层
        /// </summary>
        private readonly RB_Class_FeedBackRepository class_FeedBackRepository = new RB_Class_FeedBackRepository();

        /// <summary>
        /// 获取班级列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_ViewModel> GetClassListModule(RB_Class_ViewModel query)
        {
            var list = classRepository.GetClassListRepository(query);
            if (list != null && list.Count > 0)
            {
                string classIds = string.Join(",", list.Select(qitem => qitem.ClassId));
                List<RB_Class_Plan_ViewModel> planList = new List<RB_Class_Plan_ViewModel>();
                List<RB_Class_Time_ViewModel> timeList = new List<RB_Class_Time_ViewModel>();
                //查询剩余的上课计划
                if (query.IsQuerySurplusPlan == 1)
                {
                    planList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel()
                    {
                        QClassIds = classIds,
                        StartTime = Common.ConvertHelper.FormatDate(DateTime.Now)
                    });
                }

                if (planList != null && planList.Count > 0)
                {
                    string planIds = string.Join(",", planList.Select(qitem => qitem.ClassPlanId));
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel()
                    {
                        QClassIds = classIds,
                        QClassPlanIds = planIds,
                    });
                }
                foreach (var item in list)
                {
                    var tempPlanList = planList?.Where(qitem => qitem.ClassId == item.ClassId)?.OrderBy(qitem => qitem.ClassDate)?.ToList();
                    if (tempPlanList != null && tempPlanList.Count > 0)
                    {
                        foreach (var sItem in tempPlanList)
                        {
                            sItem.PlanTimeList = timeList?.Where(qitem => qitem.ClassId == item.ClassId && qitem.ClassPlanId == sItem.ClassPlanId)?.OrderBy(qitem => qitem.StartTime)?.ToList() ?? new List<RB_Class_Time_ViewModel>();
                        }
                    }
                    item.ClassPlanList = tempPlanList ?? new List<RB_Class_Plan_ViewModel>();
                }
            }
            return list;
        }

        /// <summary>
        /// 获取班级列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_ViewModel> GetClassListForProperty(RB_Class_ViewModel query)
        {
            return classRepository.GetClassListForProperty(query);
        }

        /// <summary>
        /// 获取班级课程名称以及老师信息列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_ViewModel> GetClassAndCourseListRepository(RB_Class_ViewModel query)
        {
            return classRepository.GetClassAndCourseListRepository(query);
        }

        /// <summary>
        /// 获取班级上课时间列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Time_ViewModel> GetClassTimeListModule(RB_Class_Time_ViewModel query)
        {
            return class_TimeRepository.GetClassTimeListRepository(query);
        }


        /// <summary>
        /// 获取班级上课时间列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Time_ViewModel> GetClassTimeList_V2(RB_Class_Time_ViewModel query)
        {
            return class_TimeRepository.GetClassTimeList_V2(query);
        }

        /// <summary>
        /// 获取班级上课时间列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Time_ViewModel> GetClassTimeList(RB_Class_Time_ViewModel query)
        {
            return class_TimeRepository.GetClassTimeList(query);
        }

        /// <summary>
        /// 获取班级分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <param name="isGetStepPrice">是否查询阶梯价格</param>
        /// <returns></returns>
        public List<RB_Class_ViewModel> GetClassPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Class_ViewModel query, bool isGetStepPrice = false)
        {
            var list = classRepository.GetClassPageListRepository(pageIndex, pageSize, out rowsCount, query);
            if (list != null && list.Count > 0)
            {
                var classTimeList = new List<RB_Class_Time_ViewModel>();
                var classOrderList = new List<RB_Order_ViewModel>();
                var stepPriceList = new List<RB_Class_StepPrice_ViewModel>();
                var otherCourseList = new List<RB_Class_Course_Extend>();
                var planList = new List<RB_Class_Plan_ViewModel>();
                string ids = string.Join(",", list.Select(qitem => qitem.ClassId));
                if (!string.IsNullOrEmpty(ids))
                {
                    classTimeList = class_TimeRepository.GetClassTimeListRepository(ids);
                    classOrderList = orderRepository.GetClassOrderPeopleNumRepository(ids);
                    otherCourseList = GetClassCourseListModule(new RB_Class_Course_Extend() { QClassIds = ids });
                    planList = class_PlanRepository.GetClassPlanMaxDataRepository(new RB_Class_Plan_ViewModel()
                    {
                        QClassIds = ids
                    });
                }
                if (isGetStepPrice)
                {
                    stepPriceList = class_StepPriceRepository.GetClassStepPriceListRepository(new RB_Class_StepPrice_ViewModel() { QClassIds = ids })?.ToList() ?? new List<RB_Class_StepPrice_ViewModel>();
                }
                //课程计划上课日期
                foreach (var item in list)
                {
                    item.NewPlanDateTime = classTimeList?.Where(qitem => qitem.ClassId == item.ClassId)?.FirstOrDefault()?.NewPlanDateTime;
                    item.OrderStudentCount = classOrderList?.Where(qitem => qitem.ClassId == item.ClassId)?.FirstOrDefault()?.GuestNum ?? 0;
                    if (isGetStepPrice)
                    {
                        item.ClassStepPriceList = stepPriceList?.Where(qitem => qitem.ClassId == item.ClassId)?.ToList() ?? new List<RB_Class_StepPrice_ViewModel>();
                    }
                    item.OtherCourseList = otherCourseList?.Where(qitem => qitem.ClassId == item.ClassId)?.ToList() ?? new List<RB_Class_Course_Extend>();
                    var tempData = planList.Where(qitem => qitem.ClassId == item.ClassId)?.FirstOrDefault();
                    if (tempData != null)
                    {
                        item.EndClassDate = tempData.ClassDate;
                    }
                    item.FinishTimeStr = Common.ConvertHelper.FormatDate(item.EndClassDate);
                }
            }
            return list;
        }


        /// <summary>
        /// 获取班级日志分页列表
        /// </summary>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">每页显示条数</param>
        /// <param name="rowsCount">总条数</param>
        /// <param name="query">查询条件</param>
        /// <returns></returns>
        public List<RB_Class_Log_ViewModel> GetClassLogPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Class_Log_ViewModel query)
        {
            return classLogRepository.GetClassLogPageListRepository(pageIndex, pageSize, out rowsCount, query);
        }

        /// <summary>
        /// 新增修改班级
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public virtual bool SetClassModule(RB_Class_ViewModel model)
        {
            bool flag = false;
            if (model.ClassId > 0)
            {
                var oldModel = GetClassModule(model.ClassId);
                if (oldModel.Teacher_Id != model.Teacher_Id && model.Teacher_Id > 0 && oldModel.Teacher_Id > 0)
                {
                    class_PlanRepository.UpdatePlanTeacherIdRepository(model.Teacher_Id, model.ClassId);
                }
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    { nameof(RB_Class_ViewModel.ClassName),model.ClassName},
                    { nameof(RB_Class_ViewModel.CouseId),model.CouseId},
                    { nameof(RB_Class_ViewModel.Teacher_Id),model.Teacher_Id},
                    { nameof(RB_Class_ViewModel.Assist_Id),model.Assist_Id},
                    { nameof(RB_Class_ViewModel.UpdateBy),model.UpdateBy},
                    { nameof(RB_Class_ViewModel.UpdateTime),model.UpdateTime},
                    { nameof(RB_Class_ViewModel.ClassPersion),model.ClassPersion},
                    { nameof(RB_Class_ViewModel.OpenTime),model.OpenTime},
                    { nameof(RB_Class_ViewModel.EndOrderTime),model.EndOrderTime},
                    { nameof(RB_Class_ViewModel.OriginalPrice),model.OriginalPrice},
                    { nameof(RB_Class_ViewModel.SellPrice),model.SellPrice},
                    { nameof(RB_Class_ViewModel.IsStepPrice),model.IsStepPrice},
                    { nameof(RB_Class_ViewModel.ClassRoomId),model.ClassRoomId},
                    { nameof(RB_Class_ViewModel.IsOpenCommission),model.IsOpenCommission},
                    { nameof(RB_Class_ViewModel.CommissionType),model.CommissionType},
                    { nameof(RB_Class_ViewModel.CommissionValue),model.CommissionValue},
                    { nameof(RB_Class_ViewModel.ClassHours),model.ClassHours},
                    { nameof(RB_Class_ViewModel.ClassStyle),model.ClassStyle},
                    { nameof(RB_Class_ViewModel.InnerRemark),model.InnerRemark},
                    { nameof(RB_Class_ViewModel.ClassType),model.ClassType},
                    { nameof(RB_Class_ViewModel.DefaultTimeJson),model.DefaultTimeJson},
                    { nameof(RB_Class_ViewModel.DateJson),model.DateJson},
                    { nameof(RB_Class_ViewModel.School_Id),model.School_Id},
                    { nameof(RB_Class_ViewModel.IsSubscribe),model.IsSubscribe},
                    { nameof(RB_Class_ViewModel.IsDeduction),model.IsDeduction},
                    { nameof(RB_Class_ViewModel.Point),model.Point},
                    { nameof(RB_Class_ViewModel.CourseClassType),model.CourseClassType},
                    { nameof(RB_Class_ViewModel.StudentNumType),model.StudentNumType},
                    { nameof(RB_Class_ViewModel.ClassHourMinute),model.ClassHourMinute},
                };
                if (oldModel.OpenTime != model.OpenTime || oldModel.ClassType != model.ClassType || string.IsNullOrEmpty(oldModel.ClassNo))
                {
                    if (oldModel.OpenTime != model.OpenTime || string.IsNullOrEmpty(oldModel.ClassNo))
                    {
                        #region 生成班级号
                        model.ClassNo = "";
                        var classTypeModel = class_TypeRepository.GetEntity(model.ClassType);
                        if (classTypeModel != null)
                        {
                            model.ClassNo = classTypeModel.ClassNoPrefix;
                        }
                        //查询最大的字母
                        int CNum = classRepository.GetMaxClassNoPrefix(model.OpenTime.ToString("yyyy-MM-dd"));
                        if (CNum == 0)
                        {
                            model.ClassNo += model.OpenTime.ToString("yyyyMMdd") + "A";
                            model.ClassLetterNum = 1;
                        }
                        else
                        {
                            string ClassNoLetterStr = Edu.Common.Config.ClassNoLetterStr;
                            model.ClassNo += model.OpenTime.ToString("yyyyMMdd") + ClassNoLetterStr.Substring(CNum, 1);
                            model.ClassLetterNum = CNum + 1;
                        }
                        #endregion
                        fileds.Add(nameof(RB_Class_ViewModel.ClassNo), model.ClassNo);
                        fileds.Add(nameof(RB_Class_ViewModel.ClassLetterNum), model.ClassLetterNum);
                    }
                    else if (oldModel.ClassType != model.ClassType)
                    {
                        var classTypeModel = class_TypeRepository.GetEntity(model.ClassType);
                        if (classTypeModel != null)
                        {
                            model.ClassNo = classTypeModel.ClassNoPrefix;
                        }
                        model.ClassNo += model.OpenTime.ToString("yyyyMMdd") + oldModel.ClassNo.Substring(oldModel.ClassNo.Length - 1, 1);
                        fileds.Add(nameof(RB_Class_ViewModel.ClassNo), model.ClassNo);
                    }
                }
                flag = classRepository.Update(fileds, new WhereHelper(nameof(RB_Class_ViewModel.ClassId), model.ClassId));
            }
            else
            {
                #region 生成班级号
                model.ClassNo = "";
                var classTypeModel = class_TypeRepository.GetEntity(model.ClassType);
                if (classTypeModel != null)
                {
                    model.ClassNo = classTypeModel.ClassNoPrefix;
                }
                //查询最大的字母
                int CNum = classRepository.GetMaxClassNoPrefix(model.OpenTime.ToString("yyyy-MM-dd"));
                if (CNum == 0)
                {
                    model.ClassNo += model.OpenTime.ToString("yyyyMMdd") + "A";
                    model.ClassLetterNum = 1;
                }
                else
                {
                    string ClassNoLetterStr = Edu.Common.Config.ClassNoLetterStr;
                    model.ClassNo += model.OpenTime.ToString("yyyyMMdd") + ClassNoLetterStr.Substring(CNum, 1);
                    model.ClassLetterNum = CNum + 1;
                }
                #endregion
                var newId = classRepository.Insert(model);
                model.ClassId = newId;
                flag = newId > 0;
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                    LogContent = "创建班级",
                    ClassId = newId,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id,
                    CreateBy = model.CreateBy,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }

            #region 阶梯报价
            //未开启阶梯价格
            if (model.IsStepPrice == 0)
            {
                class_StepPriceRepository.DeleteClassStepPriceRepository(model.ClassId);
            }
            else//开启阶梯价格
            {
                var oldStepPriceList = class_StepPriceRepository.GetClassStepPriceListRepository(new RB_Class_StepPrice_ViewModel() { ClassId = model.ClassId });
                //以前没有阶梯报价信息【直接新增】
                if (oldStepPriceList == null || (oldStepPriceList != null && oldStepPriceList.Count == 0))
                {
                    if (model.ClassStepPriceList != null && model.ClassStepPriceList.Count > 0)
                    {
                        foreach (var item in model.ClassStepPriceList)
                        {
                            item.ClassStepPriceId = 0;
                            item.ClassId = model.ClassId;
                            item.Group_Id = model.Group_Id;
                            item.School_Id = model.School_Id;
                            class_StepPriceRepository.Insert(item);
                        }
                    }
                }
                else//以前有阶梯报价
                {
                    //现在没有阶梯报价了【直接删除以前的阶梯报价】
                    if (model.ClassStepPriceList == null || (model.ClassStepPriceList != null && model.ClassStepPriceList.Count == 0))
                    {
                        class_StepPriceRepository.DeleteClassStepPriceRepository(model.ClassId);
                    }
                    //找出差异的数据
                    var deleteList = oldStepPriceList.Where(qitem => !model.ClassStepPriceList.Any(oldItem => qitem.ClassStepPriceId == oldItem.ClassStepPriceId)).ToList();
                    foreach (var dItem in deleteList)
                    {
                        if (dItem.ClassStepPriceId > 0)
                        {
                            class_StepPriceRepository.Delete(dItem.ClassStepPriceId);
                        }
                    }
                    foreach (var priceItem in model.ClassStepPriceList)
                    {
                        priceItem.ClassId = model.ClassId;
                        priceItem.Group_Id = model.Group_Id;
                        priceItem.School_Id = model.School_Id;
                        if (priceItem.ClassStepPriceId == 0)
                        {
                            class_StepPriceRepository.Insert(priceItem);
                        }
                        else
                        {
                            class_StepPriceRepository.Update(priceItem);
                        }
                    }
                }
            }
            #endregion

            #region 班级计划
            //默认上课时间
            var defaultPlanTimeList = new List<ClassTimeItem>();
            var BasicMinutes = class_ConfigRepository.GetBasicMinutesRepository(model.Group_Id);
            foreach (var tItem in model.DefaultTimeList)
            {
                ClassTimeItem tModel = new ClassTimeItem()
                {
                    DateList = new List<string>(),
                    TimeList = new List<TimeItem>()
                };
                tModel.DateList = tItem.DateList;
                foreach (var subItem in tItem.TimeList)
                {
                    var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + subItem.StartTime + ":00");
                    var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + subItem.EndTime + ":00");
                    TimeSpan span = endDate.Subtract(startDate);
                    var timeModel = new TimeItem()
                    {
                        StartTime = subItem.StartTime,
                        EndTime = subItem.EndTime,
                        TimeHour = subItem.TimeHour,
                    };
                    if (timeModel.TimeHour <= 0)
                    {
                        timeModel.TimeHour = Convert.ToDecimal(span.TotalMinutes / BasicMinutes);
                    }
                    tModel.TimeList.Add(timeModel);
                    defaultPlanTimeList.Add(tModel);
                }
            }

            #endregion
            if (model.Teacher_Id > 0 && model.ClassRoomId > 0)
            {
                //班级上课计划列表
                List<RB_Class_Plan_ViewModel> classPlanList = CreateClassPlanList(model, defaultPlanTimeList, BasicMinutes);
                model.ClassPlanList = classPlanList;
            }
            else
            {
                model.ClassPlanList = new List<RB_Class_Plan_ViewModel>();
            }
            #region 同步班级到甲鹤小程序   Add by:W   2021-08-02 09:49
            SetGoodsSpecificationValue(model);
            #endregion
            return flag;
        }

        /// <summary>
        /// 添加上课计划
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool AddClassPlanModule(int ClassId, List<RB_Class_Plan_ViewModel> planList, UserInfo user, out bool result)
        {
            bool flag = true;
            result = false;
            RB_Class_ViewModel model = GetClassModule(ClassId);
            model.ClassPlanList = planList;
            List<TimeItem> timeItemList = new List<TimeItem>();
            if (model.ClassPlanList != null && model.ClassPlanList.Count > 0)
            {
                var datetimeList = model.ClassPlanList.Select(qitem => qitem.ClassDate).ToList();
                var dateStr = Common.ConvertHelper.DateTimeListToString(datetimeList);
                //添加班级上课计划
                var tempPlanList = class_PlanRepository.BatchInsertClassPlanRepository(model.ClassPlanList);
                List<RB_Class_Time> timeList = new List<RB_Class_Time>();
                foreach (var item in model.ClassPlanList)
                {
                    var newClassPlanId = tempPlanList?.Where(qitem => qitem.ClassId == item.ClassId && Common.ConvertHelper.FormatDate(qitem.ClassDate) == Common.ConvertHelper.FormatDate(item.ClassDate))?.FirstOrDefault()?.ClassPlanId ?? 0;
                    if (newClassPlanId > 0 && item.PlanTimeList != null && item.PlanTimeList.Count > 0)
                    {
                        foreach (var subItem in item.PlanTimeList)
                        {
                            var classTime = new RB_Class_Time()
                            {
                                ClassTimeId = 0,
                                ClassId = model.ClassId,
                                ClassPlanId = newClassPlanId,
                                StartTime = subItem.StartTime,
                                EndTime = subItem.EndTime,
                                Group_Id = model.Group_Id,
                                School_Id = model.School_Id,
                                ClassStatus = 0,
                                TimeHour = subItem.TimeHour
                            };
                            timeList.Add(classTime);
                        }
                    }
                }
                if (timeList != null && timeList.Count > 0)
                {
                    flag = class_TimeRepository.BatchInsertClassTimeRepository(timeList);
                }
            }
            //检查上课计划是否重复
            class_PlanRepository.CheckClassPlanRepeatRepository(ClassId, out result);
            if (result)
            {
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                    LogContent = string.Format("班级管理员{0}创建上课计划成功!但是存在冲突的上课安排,等待管理员处理!", user.AccountName),
                    ClassId = ClassId,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id,
                    CreateBy = model.CreateBy,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            else
            {
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                    LogContent = string.Format("班级管理员{0},完成班级排课计划冲突", user.AccountName),
                    ClassId = ClassId,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id,
                    CreateBy = model.CreateBy,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            return flag;
        }

        /// <summary>
        /// 批量修改上课计划
        /// </summary>
        /// <param name="ChangeType">调动类型(1-老师,2-教室,3-时段)</param>
        /// <param name="ClassRoomId"></param>
        /// <param name="TeacherId"></param>
        /// <param name="ClassPlanIdList"></param>
        /// <param name="TimeList"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public bool BatchUpdateClassPlanModule(int ClassId, int ChangeType, int ClassRoomId, int TeacherId, List<int> ClassPlanIdList, List<TimeItem> TimeList, UserInfo user, out bool result)
        {
            bool flag = false;
            string ids = string.Join(",", ClassPlanIdList);
            result = false;
            if (ChangeType == 1)
            {
                flag = class_PlanRepository.UpdateClassPlanTeacherOrClassRoomIdRepository(TeacherId, 0, ids);
            }
            if (ChangeType == 2)
            {
                flag = class_PlanRepository.UpdateClassPlanTeacherOrClassRoomIdRepository(0, ClassRoomId, ids);
            }
            if (ChangeType == 3)
            {
                flag = class_TimeRepository.DeleteClassTimeByPlanIdsRepository(ids);
                var planList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel()
                {
                    QClassPlanIds = ids
                });
                if (flag && planList != null && planList.Count > 0)
                {
                    List<RB_Class_Time> timeList = new List<RB_Class_Time>();
                    foreach (var item in planList)
                    {
                        foreach (var subItem in TimeList)
                        {
                            var classTime = new RB_Class_Time()
                            {
                                ClassTimeId = 0,
                                ClassId = item.ClassId,
                                ClassPlanId = item.ClassPlanId,
                                StartTime = subItem.StartTime,
                                EndTime = subItem.EndTime,
                                Group_Id = item.Group_Id,
                                School_Id = item.School_Id,
                                ClassStatus = 0,
                                TimeHour = subItem.TimeHour
                            };
                            timeList.Add(classTime);
                        }
                    }
                    if (timeList != null && timeList.Count > 0)
                    {
                        flag = class_TimeRepository.BatchInsertClassTimeRepository(timeList);
                    }
                }
            }
            class_PlanRepository.CheckClassPlanRepeatRepository(ClassId, out result);
            if (result)
            {
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                    LogContent = string.Format("班级管理员{0}修改上课计划成功!但是存在冲突的上课安排,等待管理员处理!", user.AccountName),
                    ClassId = ClassId,
                    Group_Id = user.Group_Id,
                    School_Id = user.School_Id,
                    CreateBy = user.Id,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            else
            {
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                    LogContent = string.Format("班级管理员{0},完成班级排课计划冲突", user.AccountName),
                    ClassId = ClassId,
                    Group_Id = user.Group_Id,
                    School_Id = user.School_Id,
                    CreateBy = user.Id,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            return flag;
        }

        /// <summary>
        /// 忽略上课计划
        /// </summary>
        /// <param name="classId"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public bool IgnoreClassPlanModule(int classId, UserInfo user)
        {
            var classLogModel = new Model.Entity.Log.RB_Class_Log()
            {
                LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                LogContent = string.Format("班级管理员{0},放弃处理上课计划冲突", user.AccountName),
                ClassId = classId,
                Group_Id = user.Group_Id,
                School_Id = user.School_Id,
                CreateBy = user.Id,
                CreateTime = System.DateTime.Now
            };
            return classLogRepository.AddClassLogRepository(classLogModel);
        }

        /// <summary>
        /// 单个修改上课计划
        /// </summary>
        /// <returns></returns>
        public bool UpdateClassPlanSingleModule(List<RB_Class_Plan_ViewModel> list, UserInfo user, out bool result)
        {
            var flag = true;
            result = false;
            foreach (var item in list)
            {
                if (flag)
                {
                    flag = SetClassPlanModule(item, user.Id);
                }
            }

            if (flag)
            {
                class_PlanRepository.CheckClassPlanRepeatRepository(list[0].ClassId, out result);
            }
            if (result)
            {
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                    LogContent = string.Format("班级管理员{0}修改上课计划成功!但是存在冲突的上课安排,等待管理员处理!", user.AccountName),
                    ClassId = list[0].ClassId,
                    Group_Id = user.Group_Id,
                    School_Id = user.School_Id,
                    CreateBy = user.Id,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            else
            {
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.CreateClass,
                    LogContent = string.Format("班级管理员{0},完成班级排课计划冲突", user.AccountName),
                    ClassId = list[0].ClassId,
                    Group_Id = user.Group_Id,
                    School_Id = user.School_Id,
                    CreateBy = user.Id,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            return flag;
        }

        /// <summary>
        /// 获取有冲突的上课计划
        /// </summary>
        /// <param name="classId"></param>
        public object GetRepeatClassPlanModule(int ClassId)
        {
            List<object> result = new List<object>();
            var list = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel()
            {
                ClassId = ClassId,
                IsQRepeat = 1
            });
            if (list != null && list.Count > 0)
            {
                string repeatIds = string.Join(",", list.Select(qitem => qitem.RepeatPlanIds));
                var repeatList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel()
                {
                    QClassPlanIds = repeatIds
                });
                List<int> ids = new List<int>();
                var planIds = Common.ConvertHelper.StringToList(string.Join(",", list.Select(qitem => qitem.ClassPlanId)));
                if (planIds != null && planIds.Count > 0)
                {
                    ids.AddRange(planIds);
                }
                var repeatPlanIds = Common.ConvertHelper.StringToList(string.Join(",", repeatList.Select(qitem => qitem.ClassPlanId)));
                if (repeatPlanIds != null && repeatPlanIds.Count > 0)
                {
                    ids.AddRange(repeatPlanIds);
                }
                List<RB_Class_Time_ViewModel> timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel()
                {
                    QClassPlanIds = string.Join(",", ids)
                });
                foreach (var item in list)
                {
                    List<object> PlanRepeatList = new List<object>();
                    var tempRepeatList = repeatList?.Where(qitem => qitem.ClassDate == item.ClassDate)?.ToList();
                    if (tempRepeatList != null && tempRepeatList.Count > 0)
                    {
                        foreach (var subItem in tempRepeatList)
                        {
                            var tempObj = new
                            {
                                subItem.ClassPlanId,
                                subItem.ClassId,
                                subItem.ClassName,
                                ClassDate = Common.ConvertHelper.FormatDate(subItem.ClassDate),
                                subItem.TeacherId,
                                subItem.TeacherName,
                                subItem.ClassRoomId,
                                subItem.RoomName,
                                PlanTimeList = timeList.Where(qitem => qitem.ClassPlanId == subItem.ClassPlanId).Select(qitem => new
                                {
                                    qitem.ClassTimeId,
                                    qitem.ClassId,
                                    qitem.ClassPlanId,
                                    qitem.StartTime,
                                    qitem.EndTime,
                                    qitem.TimeHour
                                }),
                            };
                            PlanRepeatList.Add(tempObj);
                        }
                    }
                    RB_Class_Plan_ViewModel model = new RB_Class_Plan_ViewModel();
                    var obj = new
                    {
                        item.ClassPlanId,
                        item.ClassId,
                        item.ClassName,
                        ClassDate = Common.ConvertHelper.FormatDate(item.ClassDate),
                        item.TeacherId,
                        item.TeacherName,
                        item.ClassRoomId,
                        item.RoomName,
                        PlanTimeList = timeList.Where(qitem => qitem.ClassPlanId == item.ClassPlanId).Select(qitem => new
                        {
                            qitem.ClassTimeId,
                            qitem.ClassId,
                            qitem.ClassPlanId,
                            qitem.StartTime,
                            qitem.EndTime,
                            qitem.TimeHour
                        }),
                        PlanRepeatList
                    };
                    result.Add(obj);
                }
            }
            return result;
        }

        /// <summary>
        /// 修改班级状态
        /// </summary>
        /// <param name="model"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool SetClassStatusModule(RB_Class_ViewModel model, UserInfo user, out string message, out bool result)
        {
            var oldModel = GetClassModule(model.ClassId);
            result = false;
            bool flag = false;
            message = "";
            var newTeacherId = oldModel.Teacher_Id > 0 ? oldModel.Teacher_Id : model.Teacher_Id;
            var newClassRoomId = oldModel.ClassRoomId > 0 ? oldModel.ClassRoomId : model.ClassRoomId;
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
               { nameof(RB_Class_ViewModel.ClassStatus),(int)model.ClassStatus},
            };
            //上课计划
            Dictionary<string, object> planFileds = new Dictionary<string, object>();
            if (model.ClassRoomId > 0)
            {
                fileds.Add(nameof(RB_Class_ViewModel.ClassRoomId), model.ClassRoomId);
                planFileds.Add(nameof(RB_Class_Plan.ClassRoomId), model.ClassRoomId);
            }
            if (model.Teacher_Id > 0)
            {
                fileds.Add(nameof(RB_Class_ViewModel.Teacher_Id), model.Teacher_Id);
                planFileds.Add(nameof(RB_Class_Plan.TeacherId), model.Teacher_Id);
            }
            if (planFileds != null && planFileds.Count > 0)
            {
                class_PlanRepository.Update(planFileds, new WhereHelper(nameof(RB_Class_Plan.ClassId), model.ClassId));
            }
            if (model.ClassStatus == ClassStatusEnum.StudyIng)
            {
                var BasicMinutes = GetBasicMinutesModule(oldModel.Group_Id);
                if (!string.IsNullOrEmpty(oldModel.DefaultTimeJson))
                {
                    oldModel.DefaultTimeList = Common.Plugin.JsonHelper.DeserializeObject<List<ClassTimeItem>>(oldModel.DefaultTimeJson);
                }
                if (oldModel.Teacher_Id > 0 && oldModel.ClassRoomId > 0)
                {
                    var classPlanList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel()
                    {
                        ClassId = model.ClassId
                    });
                    if (classPlanList != null && classPlanList.Count > 0)
                    {
                        class_PlanRepository.CheckClassPlanRepeatRepository(model.ClassId, out result);
                    }
                    else
                    {
                        List<RB_Class_Plan_ViewModel> newClassPlanList = CreateClassPlanList(oldModel, oldModel.DefaultTimeList, BasicMinutes);
                        model.ClassPlanList = newClassPlanList;
                        AddClassPlanModule(model.ClassId, newClassPlanList, user, out result);
                    }
                }
                else
                {
                    oldModel.Teacher_Id = newTeacherId;
                    oldModel.ClassRoomId = newClassRoomId;
                    List<RB_Class_Plan_ViewModel> classPlanList = CreateClassPlanList(oldModel, oldModel.DefaultTimeList, BasicMinutes);
                    model.ClassPlanList = classPlanList;
                    AddClassPlanModule(model.ClassId, classPlanList, user, out result);
                }
            }
            //结课验证课时
            if (model.ClassStatus == ClassStatusEnum.EndClass)
            {
                var guestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel()
                {
                    ClassId = model.ClassId
                }).Where(qitem => qitem.GuestState != GuestStateEnum.DropOut || qitem.GuestState != GuestStateEnum.StopClasses).ToList();
                foreach (var item in guestList)
                {
                    if (item.ValidClassHours > item.CompleteHours)
                    {
                        message = "注意,该班级下面任然存在未消耗完课时的学员,请核对学员课时,进行补课处理!";
                    }
                }
            }

            flag = classRepository.Update(fileds, new WhereHelper(nameof(RB_Class_ViewModel.ClassId), model.ClassId));
            if (flag)
            {
                #region 同步班级到甲鹤小程序   Add by:W   2021-08-02 09:49
                System.Threading.Tasks.Task.Run(() => SetGoodsSpecificationValue(model));
                #endregion
            }
            return flag;
        }


        /// <summary>
        /// 获取班级学员树形结构
        /// </summary>
        /// <returns></returns>
        public List<object> GetClassStudentTreeModule(RB_Order_Guest_ViewModel query)
        {
            List<object> list = new List<object>();
            var dataList = order_GuestRepository.GetOrderGuestListRepository(query).Where(qitem => qitem.GuestState != GuestStateEnum.DropOut || qitem.GuestState != GuestStateEnum.StopClasses).ToList();
            if (dataList != null && dataList.Count > 0)
            {
                var groupList = dataList?.GroupBy(qitem => new { qitem.ClassName, qitem.ClassId, qitem.ClassNo })?.Select(qitem => new { qitem.Key.ClassId, qitem.Key.ClassName, qitem.Key.ClassNo });
                if (groupList != null && groupList.Count() > 0)
                {
                    int Index = 1;
                    foreach (var item in groupList)
                    {
                        var subList = dataList?.Where(qitem => qitem.ClassId == item.ClassId)?.ToList();
                        if (subList != null && subList.Count > 0)
                        {
                            var obj = new
                            {
                                item.ClassId,
                                Name = item.ClassName + "(" + item.ClassNo + ")",
                                OrderId = 0,
                                GuestId = 100000 + Index,
                                CourseId = 0,
                                IsCheck = false,
                                SubList = subList?.Select(qitem => new
                                {
                                    qitem.ClassId,
                                    Name = qitem.GuestName,
                                    qitem.OrderId,
                                    GuestId = qitem.Id,
                                    qitem.CourseId,
                                    IsCheck = false,
                                })
                            };
                            list.Add(obj);
                        }
                        Index++;
                    }
                }
            }
            return list;
        }

        /// <summary>
        /// 更新班级完成进度
        /// </summary>
        /// <param name="classId">班级Id</param>
        /// <returns></returns>
        public virtual bool SetClassProcessModule(int classId)
        {
            int CompleteProgress = 0;//进度数
            var classModel = classRepository.GetEntity(classId);
            //班级完成的总分钟数
            var FinishMinutes = classCheckRepository.GetClassFinishMinutesRepository(classId.ToString())?.FirstOrDefault()?.FinishMinutes ?? 0;
            if (FinishMinutes > 0)
            {
                //基础课时分钟数
                var BasicMinutes = class_ConfigRepository.GetClassMinutesRepository(classId);
                //完成课时数
                var finishHours = FinishMinutes / BasicMinutes;
                if (classModel.ClassHours > 0)
                {
                    CompleteProgress = Convert.ToInt32(finishHours / Convert.ToDecimal(classModel.ClassHours) * 100);
                }
                else if (classModel.ClassHours <= 0 && finishHours > 0)
                {
                    CompleteProgress = 100;
                }
            }
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
               { nameof(RB_Class_ViewModel.CompleteProgress),CompleteProgress},
            };
            return classRepository.Update(fileds, new WhereHelper(nameof(RB_Class_ViewModel.ClassId), classId));
        }

        /// <summary>
        /// 获取基础课时分钟数
        /// </summary>
        /// <param name="classId"></param>
        /// <returns></returns>
        public int GetClassMinutesModule(int classId)
        {
            return class_ConfigRepository.GetClassMinutesRepository(classId);
        }

        /// <summary>
        /// 获取基础课时分钟数
        /// </summary>
        /// <param name="Group_Id"></param>
        /// <returns></returns>
        public int GetBasicMinutesModule(int Group_Id)
        {
            var BasicMinutes = class_ConfigRepository.GetBasicMinutesRepository(Group_Id);
            return BasicMinutes;
        }

        /// <summary>
        /// 更新班级结课日期
        /// </summary>
        /// <param name="classId"></param>
        /// <returns></returns>
        public bool UpdateClassEndDateModule(int classId)
        {
            return classRepository.UpdateClassEndDateRepository(classId);
        }

        /// <summary>
        /// 生成班级上课计划表
        /// </summary>
        /// <param name="model"></param>
        /// <param name="defaultPlanTimeList"></param>
        /// <param name="BasicMinutes"></param>
        /// <returns></returns>
        private List<RB_Class_Plan_ViewModel> CreateClassPlanList(RB_Class_ViewModel model, List<ClassTimeItem> defaultPlanTimeList, int BasicMinutes)
        {
            var planList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel() { ClassId = model.ClassId, StartTime = Common.ConvertHelper.FormatDate(DateTime.Now) });
            if (planList != null && planList.Count > 0)
            {
                string ids = string.Join(",", planList.Select(qitem => qitem.ClassPlanId));
                if (!string.IsNullOrEmpty(ids))
                {
                    var flag1 = class_TimeRepository.DeleteClassTimeByPlanIdsRepository(ids);
                    var flag2 = class_PlanRepository.DeleteClassPlanRepository(ids);
                }
            }
            var oldPlanList = class_PlanRepository.GetClassPlanListExtRepository(new RB_Class_Plan_ViewModel()
            {
                ClassId = model.ClassId,
                EndTime = Common.ConvertHelper.FormatDate(DateTime.Now.AddDays(-1))
            });
            //已经完成的上课计划
            var finishClassHours = oldPlanList?.Sum(qitem => qitem.TimeHour) ?? 0;
            List<RB_Class_Plan_ViewModel> classPlanList = new List<RB_Class_Plan_ViewModel>();
            if (model.ClassHours > 0 && defaultPlanTimeList != null && defaultPlanTimeList.Count > 0)
            {
                var srartDate = model.OpenTime;
                if (model.OpenTime < DateTime.Now)
                {
                    srartDate = DateTime.Now;
                }
                //按周排课和按月排课
                if (model.ClassStyle == ClassStyleEnum.Week || model.ClassStyle == ClassStyleEnum.Month)
                {
                    int i = 0;
                    double totalHours = Convert.ToDouble(finishClassHours);
                    while (model.ClassHours > totalHours)
                    {
                        var newDate = srartDate.AddDays(i);
                        foreach (var item in model.WeekDayList)
                        {
                            var planModel = new RB_Class_Plan_ViewModel()
                            {
                                ClassId = model.ClassId,
                                ClassPlanId = 0,
                                ClassRoomId = model.ClassRoomId,
                                Group_Id = model.Group_Id,
                                School_Id = model.School_Id,
                                PlanTimeList = new List<RB_Class_Time_ViewModel>(),
                                TeacherId = model.Teacher_Id,
                                ClassDate = newDate
                            };
                            if (model.ClassStyle == ClassStyleEnum.Week)
                            {
                                switch (item)
                                {
                                    case "1":
                                        if (newDate.DayOfWeek == DayOfWeek.Monday)
                                        {
                                            var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                            if (timeList != null && timeList.Count > 0)
                                            {
                                                var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                                totalHours += dayHours;
                                                classPlanList.Add(planModel);
                                            }
                                        }
                                        break;
                                    case "2":
                                        if (newDate.DayOfWeek == DayOfWeek.Tuesday)
                                        {
                                            var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                            if (timeList != null && timeList.Count > 0)
                                            {
                                                var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                                totalHours += dayHours;
                                                classPlanList.Add(planModel);
                                            }
                                        }
                                        break;
                                    case "3":
                                        if (newDate.DayOfWeek == DayOfWeek.Wednesday)
                                        {
                                            var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                            if (timeList != null && timeList.Count > 0)
                                            {
                                                var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                                totalHours += dayHours;
                                                classPlanList.Add(planModel);
                                            }
                                        }
                                        break;
                                    case "4":
                                        if (newDate.DayOfWeek == DayOfWeek.Thursday)
                                        {
                                            var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                            if (timeList != null && timeList.Count > 0)
                                            {
                                                var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                                totalHours += dayHours;
                                                classPlanList.Add(planModel);
                                            }
                                        }
                                        break;
                                    case "5":
                                        if (newDate.DayOfWeek == DayOfWeek.Friday)
                                        {
                                            var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                            if (timeList != null && timeList.Count > 0)
                                            {
                                                var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                                totalHours += dayHours;
                                                classPlanList.Add(planModel);
                                            }
                                        }
                                        break;
                                    case "6":
                                        if (newDate.DayOfWeek == DayOfWeek.Saturday)
                                        {
                                            var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                            if (timeList != null && timeList.Count > 0)
                                            {
                                                var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                                totalHours += dayHours;
                                                classPlanList.Add(planModel);
                                            }
                                        }
                                        break;
                                    case "7":
                                        if (newDate.DayOfWeek == DayOfWeek.Sunday)
                                        {
                                            var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                            if (timeList != null && timeList.Count > 0)
                                            {
                                                var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                                totalHours += dayHours;
                                                classPlanList.Add(planModel);
                                            }
                                        }
                                        break;
                                }
                            }
                            else if (model.ClassStyle == ClassStyleEnum.Month)
                            {
                                if (newDate.Day == Convert.ToInt32(item))
                                {
                                    var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                                    if (timeList != null && timeList.Count > 0)
                                    {
                                        var dayHours = CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                                        totalHours += dayHours;
                                        classPlanList.Add(planModel);
                                    }
                                }
                            }
                        }
                        i++;
                    }
                }
                //固定日期
                else if (model.ClassStyle == ClassStyleEnum.FixedDate)
                {
                    foreach (var item in model.WeekDayList)
                    {
                        var planModel = new RB_Class_Plan_ViewModel()
                        {
                            ClassId = model.ClassId,
                            ClassPlanId = 0,
                            ClassRoomId = model.ClassRoomId,
                            Group_Id = model.Group_Id,
                            School_Id = model.School_Id,
                            PlanTimeList = new List<RB_Class_Time_ViewModel>(),
                            TeacherId = model.Teacher_Id,
                            ClassDate = Convert.ToDateTime(item)
                        };
                        var timeList = defaultPlanTimeList.Where(qitem => qitem.DateList.Contains(item))?.FirstOrDefault()?.TimeList;
                        if (timeList != null && timeList.Count > 0)
                        {
                            CalcDayClassHoursModule(timeList, planModel.PlanTimeList, model, BasicMinutes);
                            classPlanList.Add(planModel);
                        }
                    }
                }
                //约课
                else
                {

                }
            }
            return classPlanList;
        }

        /// <summary>
        /// 计算每天课时
        /// </summary>
        /// <param name="timeList"></param>
        /// <param name="classTimeList"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        private double CalcDayClassHoursModule(List<TimeItem> timeList, List<RB_Class_Time_ViewModel> classTimeList, RB_Class_ViewModel model, int BasicMinutes)
        {
            double dayClassHours = 0;
            double dayMinutes = 0;
            foreach (var sItem in timeList)
            {
                var timeModel = new RB_Class_Time_ViewModel()
                {
                    StartTime = sItem.StartTime,
                    EndTime = sItem.EndTime,
                    TimeHour = sItem.TimeHour,
                };
                classTimeList.Add(timeModel);
                var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + sItem.StartTime + ":00");
                var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + sItem.EndTime + ":00");
                TimeSpan span = endDate.Subtract(startDate);
                if (span.TotalMinutes > 0)
                {
                    dayMinutes += span.TotalMinutes;
                }
            }
            if (model.ClassHourMinute > 0)
            {
                dayClassHours = dayMinutes / model.ClassHourMinute;
            }
            else
            {
                dayClassHours = dayMinutes / BasicMinutes;
            }
            return dayClassHours;
        }

        /// <summary>
        /// 根据班级编号获取班级详细信息
        /// </summary>
        /// <param name="ClassId"></param>
        /// <returns></returns>
        public RB_Class_ViewModel GetClassModule(object ClassId)
        {
            var extModel = classRepository.GetEntity<RB_Class_ViewModel>(ClassId);
            if (extModel != null && extModel.ClassId > 0)
            {
                extModel.ClassDateList = new List<string>();
                if (extModel.CouseId > 0)
                {
                    extModel.CourseName = courseRepository.GetEntity(extModel.CouseId)?.CourseName ?? "";
                }
                if (extModel.Teacher_Id > 0)
                {
                    extModel.TeacherName = teacherRepository.GetEntity(extModel.Teacher_Id)?.TeacherName ?? "";
                }
                //课程梯度价格
                extModel.ClassStepPriceList = class_StepPriceRepository.GetClassStepPriceListRepository(new RB_Class_StepPrice_ViewModel() { ClassId = extModel.ClassId })?.ToList() ?? new List<RB_Class_StepPrice_ViewModel>();
                //课程计划上课日期
                extModel.ClassPlanList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel() { ClassId = extModel.ClassId })?.ToList() ?? new List<RB_Class_Plan_ViewModel>();

                extModel.TotalPlanNum = extModel?.ClassPlanList?.Count() ?? 0;
                extModel.UsePlanNum = extModel?.ClassPlanList?.Where(qitem => qitem.ClassDate <= DateTime.Now)?.Count() ?? 0;
                //班级上课计划时间列表
                var timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { ClassId = extModel.ClassId })?.ToList() ?? new List<RB_Class_Time_ViewModel>();
                if (extModel.ClassPlanList != null && extModel.ClassPlanList.Count > 0 && timeList != null && timeList.Count > 0)
                {
                    foreach (var item in extModel.ClassPlanList)
                    {
                        item.PlanTimeList = timeList?.Where(qitem => qitem.ClassPlanId == item.ClassPlanId)?.ToList() ?? new List<RB_Class_Time_ViewModel>();
                    }
                }
                if (!string.IsNullOrEmpty(extModel.DefaultTimeJson))
                {
                    extModel.DefaultTimeList = Common.Plugin.JsonHelper.DeserializeObject<List<ClassTimeItem>>(extModel.DefaultTimeJson);
                }
                if (!string.IsNullOrEmpty(extModel.DateJson) && extModel.ClassStyle != Common.Enum.Course.ClassStyleEnum.OnLine)
                {
                    extModel.WeekDayList = Common.Plugin.JsonHelper.DeserializeObject<List<string>>(extModel.DateJson);
                }
                if (!string.IsNullOrEmpty(Common.ConvertHelper.FormatDate(extModel.OpenTime)))
                {
                    extModel.ClassDateList.Add(Common.ConvertHelper.FormatDate(extModel.OpenTime));
                }
            }
            return extModel;
        }

        /// <summary>
        /// 修改班级【正常/删除】状态
        /// </summary>
        /// <param name="ClassId"></param>
        /// <param name="Status"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public bool RemoveClassModule(int ClassId, int Status, out string message)
        {
            message = "";
            var orderList = orderRepository.GetOrderPageRepository(1, 1, out _, new RB_Order_ViewModel()
            {
                ClassId = ClassId,
                Q_OrderState = 1
            });
            if (orderList != null && orderList.Count > 0)
            {
                message = "此班级下存在正常订单!不能删除!";
                return false;
            }
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                { nameof(RB_Class_ViewModel.Status),Status},
            };
            return classRepository.Update(fileds, new WhereHelper(nameof(RB_Class_ViewModel.ClassId), ClassId));
        }

        /// <summary>
        /// 获取班级计划列表
        /// </summary>
        /// <param name="classId">班级编号</param>
        /// <param name="monthStr">月份</param>
        /// <returns></returns>
        public object GetClassPlanModule(int classId, string monthStr)
        {
            List<object> list = new List<object>();
            var timeList = new List<RB_Class_Time_ViewModel>();
            var planList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel() { ClassId = classId, QMonth = monthStr })?.OrderBy(qitem => qitem.ClassDate);
            if (planList != null && planList.Count() > 0)
            {
                string Ids = string.Join(",", planList.Select(qitem => qitem.ClassPlanId));
                if (!string.IsNullOrEmpty(Ids))
                {
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { QClassPlanIds = Ids });
                }
                var minDate = planList.Min(qitem => qitem.ClassDate);
                var maxDate = planList.Max(qitem => qitem.ClassDate);
                var checkList = classCheckRepository.GetClassCheckListRepository(new RB_Class_Check_ViewModel() { ClassId = classId, StartDate = Common.ConvertHelper.FormatDate(minDate), EndDate = Common.ConvertHelper.FormatDate(maxDate) });
                DateTime today = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd"));
                foreach (var item in planList)
                {
                    List<object> classTimeList = new List<object>();
                    item.PlanTimeList = timeList?.Where(qitem => qitem.ClassPlanId == item.ClassPlanId)?.OrderBy(qitem => qitem.StartTime)?.ToList();
                    if (item.PlanTimeList != null && item.PlanTimeList.Count > 0)
                    {
                        foreach (var subItem in item.PlanTimeList)
                        {
                            var tempCheckList = checkList?.Where(qitem => qitem.ClassId == item.ClassId && qitem.ClassDate == item.ClassDate && qitem.ClassTimeId == subItem.ClassTimeId)?.ToList() ?? new List<RB_Class_Check_ViewModel>();
                            classTimeList.Add(new
                            {
                                subItem.ClassTimeId,
                                subItem.StartTime,
                                subItem.EndTime,
                                subItem.TimeHour,
                                CheckNum = tempCheckList?.Where(qitem => qitem.CheckStatus == 0)?.Count(),
                                NoCheckNum = tempCheckList?.Where(qitem => qitem.CheckStatus == 1)?.Count(),
                                AskForLeaveNum = tempCheckList?.Where(qitem => qitem.CheckStatus == 2)?.Count()
                            });
                        }
                    }
                    list.Add(new
                    {
                        IsEndDate = item.ClassDate <= today && item.ClassDate >= today.AddDays(-7),
                        item.ClassPlanId,
                        item.ClassId,
                        item.ClassDate,
                        ClassDateStr = Common.ConvertHelper.FormatDate(item.ClassDate),
                        item.ClassRoomId,
                        item.RoomName,
                        item.TeacherId,
                        item.TeacherName,
                        item.UserIcon,
                        TimeList = classTimeList
                    });
                }
            }
            return list;
        }

        /// <summary>
        /// 获取班级计划列表
        /// </summary>
        /// <param name="classId">班级编号</param>
        /// <param name="monthStr">月份</param>
        /// <returns></returns>
        public object GetClassPlan_V2(RB_Class_Plan_ViewModel model)
        {
            List<object> list = new List<object>();
            var timeList = new List<RB_Class_Time_ViewModel>();
            var planList = class_PlanRepository.GetClassPlanListRepository(model)?.OrderBy(qitem => qitem.ClassDate);
            if (planList != null && planList.Count() > 0)
            {
                string Ids = string.Join(",", planList.Select(qitem => qitem.ClassPlanId));
                if (!string.IsNullOrEmpty(Ids))
                {
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { QClassPlanIds = Ids });
                }
                DateTime today = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd"));
                foreach (var item in planList)
                {
                    item.PlanTimeList = timeList?.Where(qitem => qitem.ClassPlanId == item.ClassPlanId)?.ToList();
                    list.Add(new
                    {
                        IsEndDate = item.ClassDate <= today,
                        item.ClassPlanId,
                        item.ClassId,
                        item.ClassDate,
                        ClassDateStr = Common.ConvertHelper.FormatDate(item.ClassDate),
                        item.ClassRoomId,
                        item.RoomName,
                        item.TeacherId,
                        item.TeacherName,
                        item.UserIcon,
                        TimeList = item?.PlanTimeList?.Select(qitem => new { qitem.ClassTimeId, qitem.StartTime, qitem.EndTime })?.OrderBy(qitem => qitem.StartTime)
                    });
                }
            }
            return list;
        }

        /// <summary>
        /// 根据计划编号删除上课计划
        /// </summary>
        /// <param name="ClassPlanId"></param>
        /// <param name="UserInfo">用户信息</param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool RemoveClassPlanModule(int ClassPlanId, UserInfo UserInfo, out string message)
        {
            bool flag = false;
            message = "";
            var planModel = class_PlanRepository.GetEntity(ClassPlanId);
            if (planModel != null)
            {
                classLogRepository.AddClassLogRepository(new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.Class,
                    LogContent = "删除【" + Common.ConvertHelper.FormatDate(planModel?.ClassDate) + "】上课计划",
                    ClassId = planModel.ClassId,
                    CreateBy = UserInfo.Id,
                    Group_Id = UserInfo.Group_Id,
                    School_Id = UserInfo.School_Id,
                });
                flag = UpdateClassEndDateModule(planModel.ClassId);
                flag = class_PlanRepository.DeleteOne(new WhereHelper(nameof(RB_Class_Plan_ViewModel.ClassPlanId), ClassPlanId));
            }
            else
            {
                message = "此上课计划不存在,请刷新后再试!";
            }
            return flag;
        }

        /// <summary>
        /// 检查班级上课日期是否存在
        /// </summary>
        /// <param name="extModel"></param>
        /// <returns></returns>
        public bool CheckPlanModule(RB_Class_Plan_ViewModel extModel)
        {
            List<WhereHelper> list = new List<WhereHelper>()
            {
                new WhereHelper (nameof(RB_Class_Plan_ViewModel.ClassId),extModel.ClassId),
                new WhereHelper (nameof(RB_Class_Plan_ViewModel.ClassDate),extModel.ClassDate),
                new WhereHelper (nameof(RB_Class_Plan_ViewModel.Status),(int)DateStateEnum.Normal),
            };
            if (extModel.ClassPlanId > 0)
            {
                list.Add(new WhereHelper(nameof(RB_Class_Plan_ViewModel.ClassPlanId), extModel.ClassPlanId, OperatorEnum.NotEqual));
            }
            return class_PlanRepository.Exists(list);
        }

        /// <summary>
        /// 新增修改班级上课计划
        /// </summary>
        /// <param name="extModel"></param>
        /// <param name="createBy">操作人</param>
        /// <returns></returns>
        public virtual bool SetClassPlanModule(RB_Class_Plan_ViewModel extModel, int createBy)
        {
            bool flag;
            string logContent = "";
            if (extModel.ClassPlanId > 0)
            {
                var oldPlanModel = class_PlanRepository.GetEntity(extModel.ClassPlanId);
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Class_Plan_ViewModel.ClassRoomId),extModel.ClassRoomId },
                    {nameof(RB_Class_Plan_ViewModel.TeacherId),extModel.TeacherId },
                    {nameof(RB_Class_Plan_ViewModel.ClassDate),extModel.ClassDate },
                };
                if (oldPlanModel.ClassRoomId != extModel.ClassRoomId)
                {
                    string roomIds = oldPlanModel.ClassRoomId + "," + extModel.ClassRoomId;
                    var roomList = class_RoomRepository.GetClassRoomListRepository(new RB_Class_Room_ViewModel() { QRoomIds = roomIds });
                    logContent += string.Format(",教室由【{0}】修改为【{1}】.",
                        (roomList?.Where(qitem => qitem.RoomId == oldPlanModel.ClassRoomId)?.FirstOrDefault()?.RoomName ?? ""),
                        (roomList?.Where(qitem => qitem.RoomId == extModel.ClassRoomId)?.FirstOrDefault()?.RoomName ?? "")
                        );
                }
                if (oldPlanModel.TeacherId != extModel.TeacherId)
                {
                    string tIds = oldPlanModel.TeacherId + "," + extModel.TeacherId;
                    var teacherList = teacherRepository.GetTeacherListRepository(new RB_Teacher_ViewModel() { QTIds = tIds });
                    logContent += string.Format(",讲师由【{0}】修改为【{1}】.",
                        (teacherList?.Where(qitem => qitem.TId == oldPlanModel.TeacherId)?.FirstOrDefault()?.TeacherName ?? ""),
                        (teacherList?.Where(qitem => qitem.TId == extModel.TeacherId)?.FirstOrDefault()?.TeacherName ?? "")
                        );
                }
                if (oldPlanModel.ClassDate != extModel.ClassDate)
                {
                    logContent += string.Format(",日期由【{0}】修改为【{1}】.", Common.ConvertHelper.FormatDate(oldPlanModel.ClassDate), Common.ConvertHelper.FormatDate(extModel.ClassDate));
                }
                //如果老师变更且存在签到记录则更新签到表中的老师Id
                if (oldPlanModel.TeacherId != extModel.TeacherId)
                {
                    var checkList = classCheckRepository.GetClassCheckListRepository(new RB_Class_Check_ViewModel()
                    {
                        Q_ClassIds = extModel.ClassId.ToString(),
                        StartDate = Common.ConvertHelper.FormatDate(extModel.ClassDate),
                        EndDate = Common.ConvertHelper.FormatDate(extModel.ClassDate),
                    });
                    if (checkList != null && checkList.Count > 0)
                    {
                        foreach (var sItem in checkList)
                        {
                            Dictionary<string, object> checkFileds = new Dictionary<string, object>()
                            {
                                {nameof(RB_Class_Check_ViewModel.TeacherId),extModel.TeacherId }
                            };
                            classCheckRepository.Update(checkFileds, new WhereHelper(nameof(RB_Class_Check_ViewModel.ClassCheckId), sItem.ClassCheckId));
                        }
                    }
                }
                flag = class_PlanRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Plan_ViewModel.ClassPlanId), extModel.ClassPlanId));
            }
            else
            {
                var newId = class_PlanRepository.Insert(extModel);
                extModel.ClassPlanId = newId;
                flag = newId > 0;
                logContent = "新增【" + Common.ConvertHelper.FormatDate(extModel?.ClassDate) + "】上课计划";
            }
            var oldPlanList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel()
            {
                ClassId = extModel.ClassId,
                ClassPlanId = extModel.ClassPlanId,
            });

            //原来没有计划
            if (oldPlanList == null || (oldPlanList != null && oldPlanList.Count == 0))
            {
                foreach (var item in extModel.PlanTimeList)
                {
                    item.ClassId = extModel.ClassId;
                    item.ClassPlanId = extModel.ClassPlanId;
                    item.Group_Id = extModel.Group_Id;
                    item.School_Id = extModel.School_Id;
                    item.ClassTimeId = 0;
                    flag = class_TimeRepository.Insert(item) > 0;
                }
            }
            //以前有计划
            else
            {
                //现在没有设置时间【直接删除以前的时间】
                if (extModel.PlanTimeList == null || (extModel.PlanTimeList != null && extModel.PlanTimeList.Count == 0))
                {
                    class_TimeRepository.DeleteClassTimeByPlanIdsRepository(extModel.ClassPlanId.ToString());
                }
                //找出差异的数据
                var deleteList = oldPlanList.Where(qitem => !extModel.PlanTimeList.Any(oldItem => qitem.ClassTimeId == oldItem.ClassTimeId)).ToList();
                foreach (var dItem in deleteList)
                {
                    if (dItem.ClassTimeId > 0)
                    {
                        logContent += string.Format(",删除{0}上课时间【{1} - {2}】", Common.ConvertHelper.FormatDate(extModel.ClassDate), dItem.StartTime, dItem.EndTime);
                        class_TimeRepository.Delete(dItem.ClassTimeId);
                    }
                }
                var BasicMinutes = class_ConfigRepository.GetBasicMinutesRepository(extModel.Group_Id);
                foreach (var item in extModel.PlanTimeList)
                {
                    item.ClassId = extModel.ClassId;
                    item.ClassPlanId = extModel.ClassPlanId;
                    item.Group_Id = extModel.Group_Id;
                    item.School_Id = extModel.School_Id;
                    var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + item.StartTime + ":00");
                    var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " " + item.EndTime + ":00");
                    TimeSpan span = endDate.Subtract(startDate);
                    if (item.TimeHour <= 0)
                    {
                        item.TimeHour = Convert.ToDecimal(span.TotalMinutes / BasicMinutes);
                    }
                    if (item.ClassTimeId == 0)
                    {
                        logContent += string.Format(",新增{0}上课时间【{1} - {2}】", Common.ConvertHelper.FormatDate(extModel.ClassDate), item.StartTime, item.EndTime);
                        flag = class_TimeRepository.Insert(item) > 0;
                    }
                    else
                    {
                        var oldModel = oldPlanList?.Where(qitem => qitem.ClassTimeId == item.ClassTimeId)?.FirstOrDefault();
                        if (oldModel != null)
                        {
                            if (oldModel.StartTime != item.StartTime)
                            {
                                logContent += string.Format(",{0}上课开始时间由【{1}】修改为【{2}】", Common.ConvertHelper.FormatDate(extModel.ClassDate), oldModel.StartTime, item.EndTime);
                            }
                            if (oldModel.EndTime != item.EndTime)
                            {
                                logContent += string.Format(",{0}上课结束时间由【{1}】修改为【{2}】", Common.ConvertHelper.FormatDate(extModel.ClassDate), oldModel.EndTime, item.EndTime);
                            }
                        }
                        flag = class_TimeRepository.Update(item);
                    }
                }
            }

            if (!string.IsNullOrEmpty(logContent))
            {
                classLogRepository.AddClassLogRepository(
                    new Model.Entity.Log.RB_Class_Log()
                    {
                        LogType = Common.Enum.Course.ClassLogTypeEnum.Class,
                        LogContent = logContent,
                        ClassId = extModel.ClassId,
                        Group_Id = extModel.Group_Id,
                        School_Id = extModel.School_Id,
                        CreateBy = createBy
                    });
            }
            return flag;
        }

        /// <summary>
        /// 获取班级学员列表
        /// </summary>
        /// <param name="classId">班级编号</param>
        /// <returns></returns>
        public object GetClassStudentListModule(int classId, int school_Id, int group_Id, int ClassTimeId, int QEffectStatus = 0, int QNoFinish = 0)
        {
            List<object> list = new List<object>();
            var orderStudentList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel()
            {
                ClassId = classId,
                Group_Id = group_Id,
                School_Id = school_Id,
                QEffectStatus = QEffectStatus,
            }).ToList();
            if (QEffectStatus == 1)
            {
                orderStudentList = orderStudentList.Where(qitem => qitem.GuestState == GuestStateEnum.Normal).ToList();
            }
            var classModel = GetClassModule(classId);
            var courseModel = courseRepository.GetEntity((classModel?.CouseId ?? 0));
            List<RB_Class_Check_ViewModel> checkList = new List<RB_Class_Check_ViewModel>();
            if (ClassTimeId > 0)
            {
                checkList = GetClassCheckList(new RB_Class_Check_ViewModel { Group_Id = group_Id, ClassId = classId, ClassTimeId = ClassTimeId });
                var classTimeModel = class_TimeRepository.GetClassTimeList_V2(new RB_Class_Time_ViewModel { ClassTimeId = ClassTimeId, Group_Id = group_Id }).FirstOrDefault();
                orderStudentList = orderStudentList.Where(x => x.GuestState == GuestStateEnum.Normal || x.GuestState == GuestStateEnum.StopClassesApplyIng || ((x.GuestState == GuestStateEnum.StopClasses || x.GuestState == GuestStateEnum.Graduate) && x.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(x.ChangeEffectTime)) >= Convert.ToDateTime(Common.ConvertHelper.FormatDate(classTimeModel.NewPlanDateTime)))).ToList();
            }
            if (QNoFinish == 1)
            {
                orderStudentList = orderStudentList.Where(qitem => qitem.GuestState == GuestStateEnum.Normal && (qitem.TotalHours - qitem.CompleteHours) > 0).ToList();
            }
            if (orderStudentList != null && orderStudentList.Count > 0)
            {
                foreach (var item in orderStudentList)
                {
                    int checkStatus = -1;
                    if (ClassTimeId > 0 && checkList != null && checkList.Any())
                    {
                        checkStatus = checkList?.Where(qitem => qitem.ClassTimeId == ClassTimeId && qitem.ClassId == item.ClassId && qitem.OrderGuestId == item.Id)?.FirstOrDefault()?.CheckStatus ?? -1;
                    }
                    list.Add(new
                    {
                        UserIcon = item.StuIcon,
                        item.Id,
                        SexStr = item.Sex == 1 ? "男" : "女",
                        item.GuestName,
                        item.Age,
                        CreateTimeStr = Common.ConvertHelper.FormatTime(item.CreateTime),
                        item.Mobile,
                        item.OrderId,
                        EnterName = UserReidsCache.GetUserLoginInfo(item.EnterID)?.AccountName ?? "",
                        item.ContractTotalHours,
                        item.TotalHours,
                        item.CompleteHours,
                        item.ValidClassHours,
                        SurplusHours = item.TotalHours - item.CompleteHours,
                        item.MakeUpHours,
                        ClassHours = item.CompleteHours + "-" + (classModel?.ClassHours ?? 0),
                        IsRenew = item.IsRenewOrder,
                        item.RenewOrderId,
                        CheckStatus = checkStatus,
                        item.JoinType,
                        JoinTypeName = item.JoinType.ToName(),
                        item.TargetJoinType,
                        TargetJoinTypeName = item.TargetJoinType.ToName(),
                        item.SourceOrderId,
                        item.SourceClassName,
                        item.TargetOrderId,
                        item.TargetClassName,
                        item.StartClassHours,
                        item.CourseName,
                        item.EffectStatus,
                        item.EffectStatusStr,
                        EffectTime = Common.ConvertHelper.FormatDate(item.EffectTime),
                        item.UpOrderId,
                        item.GuestState,
                        item.GuestStateStr,
                    });
                }
            }
            return list;
        }


        /// <summary>
        /// 根据班级id获取订单学员信息
        /// </summary>
        /// <param name="classId"></param>
        /// <returns></returns>
        public List<RB_Order_Guest_ViewModel> GetOrderGuestListModule(RB_Order_Guest_ViewModel model)
        {
            return order_GuestRepository.GetOrderGuestListRepository(model);
        }


        /// <summary>
        /// 更新学生的退课信息
        /// </summary>
        /// <param name="Ids"></param>
        /// <param name="DropOutRemark"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool UpdateClassStudentDropOutModule(string ids, string dropOutRemark, int classId, int createBy, int group_Id, int school_Id, string studentName)
        {
            bool flag = false;
            foreach (var item in ids.Split(","))
            {
                if (!string.IsNullOrWhiteSpace(item))
                {
                    Dictionary<string, object> fileds = new Dictionary<string, object>()
                    {
                        {nameof(RB_Order_Guest_ViewModel.GuestState),(int)GuestStateEnum.DropOut},
                        {nameof(RB_Order_Guest_ViewModel.DropOutRemark),dropOutRemark}
                    };
                    //写日志
                    flag = order_GuestRepository.Update(fileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), item));
                }
            }
            if (flag)
            {
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.DropOutStudent,
                    LogContent = studentName + " 学员因" + dropOutRemark + "退课",
                    ClassId = classId,
                    Group_Id = group_Id,
                    School_Id = school_Id,
                    CreateBy = createBy,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            return flag;
        }

        /// <summary>
        /// 更新学生的退课信息
        /// </summary>
        /// <param name="Ids"></param>
        /// <param name="DropOutRemark"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public bool AddClassStudentDropOutModule(RB_Order_Guest_ViewModel model, string CreateName)
        {
            //写日志
            bool flag = order_GuestRepository.Insert(model) > 0;
            if (flag)
            {
                //更新学生的状态
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Student_ViewModel.StuStatus),3},
                };
                //写日志
                studentRepository.Update(fileds, new WhereHelper(nameof(RB_Student_ViewModel.StuId), model.StudentId));
                var classLogModel = new Model.Entity.Log.RB_Class_Log()
                {
                    LogType = Common.Enum.Course.ClassLogTypeEnum.AddStudent,
                    LogContent = CreateName + "邀请  " + model.GuestName + " 加入班级",
                    ClassId = model.ClassId,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id,
                    CreateBy = model.CreateBy,
                    CreateTime = System.DateTime.Now
                };
                classLogRepository.AddClassLogRepository(classLogModel);
            }
            return flag;
        }

        /// <summary>
        /// 获取补课记录分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Student_Makeup_ViewModel> GetStudentMakeupPageModule(int pageIndex, int pageSize, out long rowsCount, RB_Student_Makeup_ViewModel query)
        {
            return student_MakeupRepository.GetStudentMakeupPageRepository(pageIndex, pageSize, out rowsCount, query);
        }

        /// <summary>
        /// 新增签到
        /// </summary>
        /// <param name="Ids"></param>
        /// <param name="DropOutRemark"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool AddClassCheckModule(List<RB_Class_Check_ViewModel> list)
        {
            //基础课时分钟数
            var BasicMinutes = 0;
            BasicMinutes = class_ConfigRepository.GetClassMinutesRepository(list[0].ClassId);
            var timeModel = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel()
            {
                ClassTimeId = list[0].ClassTimeId
            })?.FirstOrDefault();
            //写日志
            bool flag = true;
            foreach (var item in list)
            {
                if (flag)
                {
                    var guestModel = order_GuestRepository.GetEntity(item.OrderGuestId);
                    item.CurrentDeductionHours = timeModel?.TimeHour ?? 0;
                    decimal currentDeductionHours = item.CurrentDeductionHours;
                    if (item.CheckStatus == 2)
                    {
                        currentDeductionHours = 0;
                    }
                    if (item.ClassCheckId > 0)
                    {
                        Dictionary<string, object> fileds = new Dictionary<string, object>()
                        {
                            { nameof(RB_Class_Check_ViewModel.CheckStatus),item.CheckStatus},
                            { nameof(RB_Class_Check_ViewModel.StudyNum),item.StudyNum},
                            { nameof(RB_Class_Check_ViewModel.CurrentDeductionHours),currentDeductionHours},
                        };
                        List<WhereHelper> wheres = new List<WhereHelper>()
                        {
                          new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),item.ClassCheckId)
                        };
                        flag = classCheckRepository.Update(fileds, wheres);
                    }
                    else
                    {
                        item.CurrentDeductionHours = currentDeductionHours;
                        item.MakeUpStatus = 1;
                        var newId = classCheckRepository.Insert(item);
                        item.ClassCheckId = newId;
                        flag = newId > 0;
                    }
                    var oldModel = classCheckRepository.GetGuestFinishMinutesRepository(item.OrderGuestId.ToString(), ClassCheckId: item.ClassCheckId)?.FirstOrDefault();
                    if (flag)
                    {
                        //更新学员完成课时
                        var completeHours = (oldModel?.FinishClassHours ?? 0) + currentDeductionHours;
                        Dictionary<string, object> orderFileds = new Dictionary<string, object>()
                        {
                            {nameof(RB_Order_Guest_ViewModel.CompleteHours),completeHours }
                        };

                        var orderModel = orderRepository.GetEntity(guestModel.OrderId);
                        string LogContent = "";
                        var shenyuHours = guestModel.ValidClassHours - completeHours;
                        //已上课时>=有效课时,如果是,修改学员状态为停课,并且备注“有效课时消耗完毕,系统自动停课”
                        if (completeHours > guestModel.ValidClassHours)
                        {
                            orderFileds.Add(nameof(RB_Order_Guest_ViewModel.GuestState), (int)GuestStateEnum.StopClasses);
                            orderFileds.Add(nameof(RB_Order_Guest_ViewModel.ChangeEffectTime), System.DateTime.Now);
                            orderFileds.Add(nameof(RB_Order_Guest_ViewModel.DropOutRemark), "有效课时消耗完毕,系统自动停课");
                            LogContent = guestModel.GuestName + "有效课时消耗完毕,系统自动停课!";
                            
                            var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
                            var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
                            var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
                            #region 欠费提醒(销售)
                            var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
                            if (!string.IsNullOrEmpty(queryTargetWorkId))
                            {
                                // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                                var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
                                path = HttpUtility.UrlEncode(path);
                                string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}\n>\n>待收金额:<font color='warning'>¥{shengyuMoney:0.00}</font>\n>停课理由:费用不足,系统自动触发停课限制\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
                                Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                {
                                    CategoryId = PushMessageCategoryEnum.SalePeople,
                                    Content = markdownContent,
                                    CoverImg = "",
                                    CreateByName = "系统",
                                    JumpUrl = "",
                                    WorkMsgType = "markdown",
                                    SendTime = DateTime.Now,
                                    SendType = 0,
                                    Title = "学员欠费停课通知",
                                    Platform = 5,
                                    ReceiveId = queryTargetWorkId
                                };
                                Common.Message.MessageHelper.SendMessage(modelWork);

                            }
                            #endregion

                            #region 欠费提醒(管理者)
                            var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Arrears");
                            if (queryNotifyManager != null && queryNotifyManager.Count > 0)
                            {
                                queryNotifyManager.ForEach(x =>
                                {
                                    var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
                                    path = HttpUtility.UrlEncode(path);

                                    string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}({sellerInfo.AccountName})\n>\n>待收金额:<font color='warning'>¥{shengyuMoney:0.00}</font>\n>停课理由:费用不足,系统自动触发停课限制\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
                                    Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                    {
                                        CategoryId = PushMessageCategoryEnum.SalePeople,
                                        Content = markdownContent,
                                        CoverImg = "",
                                        CreateByName = "系统",
                                        JumpUrl = "",
                                        WorkMsgType = "markdown",
                                        SendTime = DateTime.Now,
                                        SendType = 0,
                                        Title = "学员欠费停课通知",
                                        Platform = 5,
                                        ReceiveId = x.WorkUserId
                                    };
                                    Common.Message.MessageHelper.SendMessage(modelWork);
                                });
                            }
                            #endregion
                        }
                        else if (guestModel.TotalHours > guestModel.ValidClassHours && shenyuHours < 12)
                        {
                            var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
                            var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
                            var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
                            #region 即将欠费提醒(销售)
                            var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
                            if (!string.IsNullOrEmpty(queryTargetWorkId))
                            {
                                // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                                var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
                                path = HttpUtility.UrlEncode(path);
                                string markdownContent = $"`欠费预警` 学员即将欠费通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>关联单号:{guestModel.OrderId}\n>\n>待收金额:<font color='warning'>¥{shengyuMoney:0.00}</font>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
                                Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                {
                                    CategoryId = PushMessageCategoryEnum.SalePeople,
                                    Content = markdownContent,
                                    CoverImg = "",
                                    CreateByName = "系统",
                                    JumpUrl = "",
                                    WorkMsgType = "markdown",
                                    SendTime = DateTime.Now,
                                    SendType = 0,
                                    Title = "学员即将欠费通知",
                                    Platform = 5,
                                    ReceiveId = queryTargetWorkId
                                };
                                Common.Message.MessageHelper.SendMessage(modelWork);

                            }
                            #endregion
                            #region 即将欠费提醒(管理者)
                            var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Arrears");
                            if (queryNotifyManager != null && queryNotifyManager.Count > 0)
                            {
                                queryNotifyManager.ForEach(x =>
                                {
                                    var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
                                    path = HttpUtility.UrlEncode(path);

                                    string markdownContent = $"`欠费预警` 学员即将欠费通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>关联单号:{guestModel.OrderId}({sellerInfo.AccountName})\n>\n>待收金额:<font color='warning'>¥{shengyuMoney:0.00}</font>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
                                    Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                    {
                                        CategoryId = PushMessageCategoryEnum.SalePeople,
                                        Content = markdownContent,
                                        CoverImg = "",
                                        CreateByName = "系统",
                                        JumpUrl = "",
                                        WorkMsgType = "markdown",
                                        SendTime = DateTime.Now,
                                        SendType = 0,
                                        Title = "学员即将欠费通知",
                                        Platform = 5,
                                        ReceiveId = x.WorkUserId
                                    };
                                    Common.Message.MessageHelper.SendMessage(modelWork);
                                });
                            }
                            #endregion
                        }
                        else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours < 12 && shenyuHours > 0)
                        {
                            var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
                            var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
                            var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
                            #region 即将结课提醒 (销售端)
                            var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
                            if (!string.IsNullOrEmpty(queryTargetWorkId))
                            {
                                // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                                var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
                                path = HttpUtility.UrlEncode(path);

                                string markdownContent = $"`结课预警` 学员即将结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId}\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
                                Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                {
                                    CategoryId = PushMessageCategoryEnum.SalePeople,
                                    Content = markdownContent,
                                    CoverImg = "",
                                    CreateByName = "系统",
                                    JumpUrl = "",
                                    WorkMsgType = "markdown",
                                    SendTime = DateTime.Now,
                                    SendType = 0,
                                    Title = "学员即将结课通知",
                                    Platform = 5,
                                    ReceiveId = queryTargetWorkId
                                };
                                Common.Message.MessageHelper.SendMessage(modelWork);

                            }
                            #endregion

                            #region 即将结课提醒 (管理端)
                            var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_EndClass");
                            if (queryNotifyManager != null && queryNotifyManager.Count > 0)
                            {
                                queryNotifyManager.ForEach(x =>
                                {
                                    // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                                    var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
                                    path = HttpUtility.UrlEncode(path);

                                    string markdownContent = $"`结课预警` 学员即将结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId} ({sellerInfo.AccountName})\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
                                    Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                    {
                                        CategoryId = PushMessageCategoryEnum.SalePeople,
                                        Content = markdownContent,
                                        CoverImg = "",
                                        CreateByName = "系统",
                                        JumpUrl = "",
                                        WorkMsgType = "markdown",
                                        SendTime = DateTime.Now,
                                        SendType = 0,
                                        Title = "学员即将结课通知",
                                        Platform = 5,
                                        ReceiveId = x.WorkUserId
                                    };
                                    Common.Message.MessageHelper.SendMessage(modelWork);
                                });
                            }
                            #endregion
                        }
                        else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours == 0)
                        {
                            var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
                            var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
                            var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
                            #region 即将结课提醒 (销售端)
                            var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
                            if (!string.IsNullOrEmpty(queryTargetWorkId))
                            {
                                // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                                var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
                                path = HttpUtility.UrlEncode(path);

                                string markdownContent = $"`结课通知` 学员已结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId}\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
                                Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                {
                                    CategoryId = PushMessageCategoryEnum.SalePeople,
                                    Content = markdownContent,
                                    CoverImg = "",
                                    CreateByName = "系统",
                                    JumpUrl = "",
                                    WorkMsgType = "markdown",
                                    SendTime = DateTime.Now,
                                    SendType = 0,
                                    Title = "学员已结课通知",
                                    Platform = 5,
                                    ReceiveId = queryTargetWorkId
                                };
                                Common.Message.MessageHelper.SendMessage(modelWork);

                            }
                            #endregion

                            #region 即将结课提醒 (销售端)
                            var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_EndClass");
                            if (queryNotifyManager != null && queryNotifyManager.Count > 0)
                            {
                                queryNotifyManager.ForEach(x =>
                                {
                                    // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                                    var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
                                    path = HttpUtility.UrlEncode(path);

                                    string markdownContent = $"`结课通知` 学员已结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId} ({sellerInfo.AccountName})\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
                                    Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                    {
                                        CategoryId = PushMessageCategoryEnum.SalePeople,
                                        Content = markdownContent,
                                        CoverImg = "",
                                        CreateByName = "系统",
                                        JumpUrl = "",
                                        WorkMsgType = "markdown",
                                        SendTime = DateTime.Now,
                                        SendType = 0,
                                        Title = "学员已结课通知",
                                        Platform = 5,
                                        ReceiveId = x.WorkUserId
                                    };
                                    Common.Message.MessageHelper.SendMessage(modelWork);
                                });
                            }
                            #endregion
                        }

                        if (item.CheckStatus == 1)
                        {
                            #region 通知缺勤信息
                            var param = new RB_Class_Plan_ViewModel()
                            {
                                ClassTimeId = item.ClassTimeId
                            };
                            var planModel = class_PlanRepository.GetClassPlanListExtRepository(param).FirstOrDefault();
                            var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Absence");
                            if (queryNotifyManager != null && queryNotifyManager.Count > 0)
                            {
                                queryNotifyManager.ForEach(x =>
                                {
                                    // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                                    var path = $"/stuMan/studentManage?OrderId={guestModel.OrderId}";
                                    path = HttpUtility.UrlEncode(path);

                                    string markdownContent = $"`缺勤通知` 学员缺勤信息告知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>缺勤时间:<font color='warning'>{planModel.ClassDate}({planModel.StartTime}-{planModel.EndTime})</font>\n>关联单号:{guestModel.OrderId}\n>班级名称:<font>{planModel.ClassName}</font>\n>带班老师:<font>{planModel.TeacherName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
                                    Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                                    {
                                        CategoryId = PushMessageCategoryEnum.SalePeople,
                                        Content = markdownContent,
                                        CoverImg = "",
                                        CreateByName = "系统",
                                        JumpUrl = "",
                                        WorkMsgType = "markdown",
                                        SendTime = DateTime.Now,
                                        SendType = 0,
                                        Title = "学员缺勤通知",
                                        Platform = 5,
                                        ReceiveId = x.WorkUserId
                                    };
                                    Common.Message.MessageHelper.SendMessage(modelWork);
                                });
                            }

                            #endregion
                        }

                        flag = order_GuestRepository.Update(orderFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), item.OrderGuestId));
                        if (flag && !string.IsNullOrEmpty(LogContent))
                        {
                            user_ChangeLogRepository.Insert(new Model.Entity.Log.RB_User_ChangeLog()
                            {
                                Id = 0,
                                Type = 3,
                                CreateBy = item.CreateBy,
                                CreateTime = DateTime.Now,
                                Group_Id = item.Group_Id,
                                LogContent = LogContent,
                                School_Id = item.School_Id,
                                SourceId = guestModel.Id
                            });
                        }
                        //缺勤和请假
                        if (item.CheckStatus == 1 || item.CheckStatus == 2)
                        {
                            flag = CalcGuestHoursModule(guestModel, item);
                        }

                        #region B2B同业推送
                        if (orderModel != null && orderModel.CustomerId > 0)
                        {
                            //最后5个课时做处理
                            if (completeHours > guestModel.ValidClassHours)
                            {
                                //已停课
                                b2B_StudentNoticeRepository.Insert(new Model.Entity.Log.RB_B2B_StudentNotice()
                                {
                                    Id = 0,
                                    Type = 3,
                                    StudentId = guestModel.Id,
                                    CustomerId = orderModel.CustomerId,
                                    Title = "停课通知",
                                    Content = "学员" + guestModel.GuestName + " 有效课时消耗完毕,已自动停课,关联单号:" + guestModel.OrderId + "!",
                                    IsLook = 2,
                                    Status = 0,
                                    CreateBy = item.CreateBy,
                                    CreateTime = DateTime.Now,
                                    Group_Id = item.Group_Id,
                                    UpdateTime = DateTime.Now
                                });
                            }
                            else if (guestModel.TotalHours > guestModel.ValidClassHours && shenyuHours <= 5)
                            {
                                //即将欠费
                                b2B_StudentNoticeRepository.Insert(new Model.Entity.Log.RB_B2B_StudentNotice()
                                {
                                    Id = 0,
                                    Type = 1,
                                    StudentId = guestModel.Id,
                                    CustomerId = orderModel.CustomerId,
                                    Title = "欠费预警",
                                    Content = "学员" + guestModel.GuestName + " 即将欠费,剩余课时" + shenyuHours + ",关联单号:" + guestModel.OrderId + "!",
                                    IsLook = 2,
                                    Status = 0,
                                    CreateBy = item.CreateBy,
                                    CreateTime = DateTime.Now,
                                    Group_Id = item.Group_Id,
                                    UpdateTime = DateTime.Now
                                });
                            }
                            else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours <= 5 && shenyuHours >= 0)
                            {
                                //即将结课
                                b2B_StudentNoticeRepository.Insert(new Model.Entity.Log.RB_B2B_StudentNotice()
                                {
                                    Id = 0,
                                    Type = 2,
                                    StudentId = guestModel.Id,
                                    CustomerId = orderModel.CustomerId,
                                    Title = "结课预警",
                                    Content = "学员" + guestModel.GuestName + " 即将结课,剩余课时" + shenyuHours + ",关联单号:" + guestModel.OrderId + "!",
                                    IsLook = 2,
                                    Status = 0,
                                    CreateBy = item.CreateBy,
                                    CreateTime = DateTime.Now,
                                    Group_Id = item.Group_Id,
                                    UpdateTime = DateTime.Now
                                });
                            }
                            else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours == 0)
                            {
                                //已经结课
                                b2B_StudentNoticeRepository.Insert(new Model.Entity.Log.RB_B2B_StudentNotice()
                                {
                                    Id = 0,
                                    Type = 4,
                                    StudentId = guestModel.Id,
                                    CustomerId = orderModel.CustomerId,
                                    Title = "结课通知",
                                    Content = "学员" + guestModel.GuestName + " 已结课,关联单号:" + guestModel.OrderId + "!",
                                    IsLook = 2,
                                    Status = 0,
                                    CreateBy = item.CreateBy,
                                    CreateTime = DateTime.Now,
                                    Group_Id = item.Group_Id,
                                    UpdateTime = DateTime.Now
                                });
                            }
                        }
                        #endregion
                    }
                }
            }
            return flag;
        }

        /// <summary>
        /// 验证缺席 补课是否已处理
        /// </summary>
        /// <param name="classCheckId"></param>
        /// <param name="guestName"></param>
        /// <returns></returns>
        public bool ValidateMakeupIsDeal(int classCheckId, out string guestName)
        {
            guestName = "";
            var mmodel = student_MakeupRepository.GetStudentMakeupListRepository(new RB_Student_Makeup_ViewModel() { ClassCheckId = classCheckId }).FirstOrDefault();
            if (mmodel != null && mmodel.MakeUpStatus != 1)
            {
                guestName = order_GuestRepository.GetEntity(mmodel.OrderGuestId)?.GuestName ?? "";
                return true;
            }
            return false;
        }

        /// <summary>
        /// 初始化缺勤数据
        /// </summary>
        /// <returns></returns>
        public bool InitDataModule()
        {
            bool flag = true;
            var list = GetClassCheckListRepository(new RB_Class_Check_ViewModel());
            var tempList = list?.Where(qitem => qitem.CheckStatus > 0)?.ToList();

            foreach (var item in tempList)
            {
                if (item.ClassId > 5)
                {
                    var guestModel = order_GuestRepository.GetEntity(item.OrderGuestId);
                    flag = CalcGuestHoursModule(guestModel, item);
                }
            }
            return flag;
        }

        /// <summary>
        /// 计算学员缺课课时
        /// </summary>
        /// <param name="guestModel"></param>
        /// <param name="checkModel"></param>
        /// <returns></returns>
        public bool CalcGuestHoursModule(RB_Order_Guest guestModel, RB_Class_Check_ViewModel checkModel)
        {
            bool flag = true;
            if (guestModel.GuestState == GuestStateEnum.Normal)
            {
                decimal NoFinishHours = 0;
                //获取以前所有签到列表【倒叙】
                var checkList = classCheckRepository.GetClassCheckListRepository(new RB_Class_Check_ViewModel()
                {
                    ClassId = checkModel.ClassId,
                    OrderGuestId = checkModel.OrderGuestId,
                    EndDate = Common.ConvertHelper.FormatDate(checkModel.ClassDate)
                }).OrderByDescending(qitem => qitem.ClassDate).ToList();
                for (var i = 0; i < checkList.Count; i++)
                {
                    if ((checkList[i].CheckStatus == 1) && (checkList[i].MakeUpStatus == 3 || checkList[i].MakeUpStatus == 4 || checkList[i].MakeUpStatus == 1))
                    {
                        NoFinishHours += checkList[i].CurrentDeductionHours;
                    }
                    else
                    {
                        break;
                    }
                }
                Dictionary<string, object> fileds = new Dictionary<string, object>();
                Dictionary<string, object> checkFileds = new Dictionary<string, object>();
                //缺勤课时超过12课时更新学员状态为【停课】
                if (NoFinishHours >= Common.Config.AbsentHours)
                {
                    fileds.Add(nameof(RB_Order_Guest_ViewModel.GuestState), (int)GuestStateEnum.StopClasses);
                    checkFileds.Add(nameof(RB_Class_Check_ViewModel.IsAbsentHours), 1);
                    checkFileds.Add(nameof(RB_Class_Check_ViewModel.MakeUpStatus), 4);

                    var orderModel = orderRepository.GetEntity(guestModel.OrderId);
                    var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice;
                    var classModel = classRepository.GetEntity<RB_Class_ViewModel>(guestModel.ClassId);
                    var sellerInfo = UserReidsCache.GetUserLoginInfo(orderModel.EnterID);
                    #region 欠费提醒(销售)
                    var queryTargetWorkId = accountRepository.GetWorkUserIdRepository(orderModel.EnterID);
                    if (!string.IsNullOrEmpty(queryTargetWorkId))
                    {
                        // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称
                        var path = $"/sale/myOrder?OrderId={guestModel.OrderId}";
                        path = HttpUtility.UrlEncode(path);
                        string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}\n>\n>待收金额:<font color='warning'>¥{shengyuMoney:0.00}</font>\n>停课理由:连续缺课超过{Config.AbsentHours}课时,系统自动停课\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})";
                        Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                        {
                            CategoryId = PushMessageCategoryEnum.SalePeople,
                            Content = markdownContent,
                            CoverImg = "",
                            CreateByName = "系统",
                            JumpUrl = "",
                            WorkMsgType = "markdown",
                            SendTime = DateTime.Now,
                            SendType = 0,
                            Title = "学员欠费停课通知",
                            Platform = 5,
                            ReceiveId = queryTargetWorkId
                        };
                        Common.Message.MessageHelper.SendMessage(modelWork);

                    }
                    #endregion

                    #region 欠费提醒(管理者)
                    var queryNotifyManager = accountRepository.GetWorkUserIdByDictRepository("Push_Arrears");
                    if (queryNotifyManager != null && queryNotifyManager.Count > 0)
                    {
                        queryNotifyManager.ForEach(x =>
                        {
                            var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}";
                            path = HttpUtility.UrlEncode(path);

                            string markdownContent = $"`停课通知` 学员欠费停课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>当前状态:<font color='warning'>停课</font>\n>关联单号:{guestModel.OrderId}({sellerInfo.AccountName})\n>\n>待收金额:<font color='warning'>¥{shengyuMoney:0.00}</font>\n>停课理由:连续缺课超过{Config.AbsentHours}课时,系统自动停课\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Config.ErpUrl}/autologin?loginId={x.Id}&target={path})";
                            Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                            {
                                CategoryId = PushMessageCategoryEnum.SalePeople,
                                Content = markdownContent,
                                CoverImg = "",
                                CreateByName = "系统",
                                JumpUrl = "",
                                WorkMsgType = "markdown",
                                SendTime = DateTime.Now,
                                SendType = 0,
                                Title = "学员欠费停课通知",
                                Platform = 5,
                                ReceiveId = x.WorkUserId
                            };
                            Common.Message.MessageHelper.SendMessage(modelWork);
                        });
                    }
                    #endregion
                }
                if (fileds != null && fileds.Count > 0 && checkFileds != null && checkFileds.Count > 0)
                {
                    List<WhereHelper> wheres = new List<WhereHelper>()
                    {
                        new WhereHelper (nameof(RB_Order_Guest_ViewModel.Id),guestModel.Id),
                    };
                    flag = order_GuestRepository.Update(fileds, wheres);
                    List<WhereHelper> checkWheres = new List<WhereHelper>()
                    {
                        new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),checkModel.ClassCheckId),
                    };
                    flag = classCheckRepository.Update(checkFileds, checkWheres);
                }

                if (flag && checkModel.CheckStatus == 1 && checkModel.IsUpdateMakeUp != 1)
                {
                    //请假的 因为不扣课时, 无法进补课
                    flag = student_MakeupRepository.SetStudentMakeUpRepository(new RB_Student_Makeup()
                    {
                        Id = 0,
                        ClassCheckId = checkModel.ClassCheckId,
                        ClassDate = checkModel.ClassDate,
                        ClassId = checkModel.ClassId,
                        CreateBy = checkModel.CreateBy,
                        CreateTime = checkModel.CreateTime,
                        Group_Id = checkModel.Group_Id,
                        MakeUpStatus = 1,
                        OrderGuestId = checkModel.OrderGuestId
                    });
                }
            }
            return flag;
        }

        /// <summary>
        /// 设置修改学员补课状态
        /// </summary>
        /// <param name="MakeUpStatus"></param>
        /// <param name="ClassCheckId"></param>
        /// <param name="GuestId"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool SetMakeUpStatusModule(int Id, int MakeUpStatus, int ClassCheckId, int GuestId, UserInfo userinfo)
        {
            bool flag = true;
            var model = student_MakeupRepository.GetEntity(Id);
            if (model.MakeUpStatus == MakeUpStatus) { return true; }
            if (model.MakeUpStatus == 1)
            {
                Dictionary<string, object> makeUpFileds = new Dictionary<string, object>()
                {
                   {nameof(RB_Student_Makeup_ViewModel.MakeUpStatus), MakeUpStatus },
                   {nameof(RB_Student_Makeup_ViewModel.DealBy),userinfo.Id},
                   {nameof(RB_Student_Makeup_ViewModel.DealTime),DateTime.Now},
                };
                //更新补课表状态
                flag = student_MakeupRepository.Update(makeUpFileds, new WhereHelper(nameof(RB_Student_Makeup_ViewModel.Id), Id));
                if (flag)
                {
                    Dictionary<string, object> fileds = new Dictionary<string, object>()
                    {
                        {nameof(RB_Class_Check_ViewModel.MakeUpStatus), MakeUpStatus }
                    };
                    //更新签到表状态
                    flag = classCheckRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Check_ViewModel.ClassCheckId), ClassCheckId));
                }

                if (flag)
                {
                    if (MakeUpStatus == 2)
                    {
                        //更新学员状态和已补课时
                        var guestModel = order_GuestRepository.GetEntity(GuestId);
                        var checkModel = classCheckRepository.GetEntity(ClassCheckId);
                        var makeUpHours = (guestModel?.MakeUpHours ?? 0) + (checkModel?.CurrentDeductionHours ?? 0);
                        Dictionary<string, object> guestFileds = new Dictionary<string, object>()
                        {
                            { nameof(RB_Order_Guest_ViewModel.MakeUpHours),makeUpHours }
                        };
                        flag = order_GuestRepository.Update(guestFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), GuestId));
                    }
                }
            }
            else
            {
                if (MakeUpStatus == 2)
                {
                    Dictionary<string, object> makeUpFileds = new Dictionary<string, object>()
                    {
                       {nameof(RB_Student_Makeup_ViewModel.MakeUpStatus), MakeUpStatus },
                       {nameof(RB_Student_Makeup_ViewModel.DealBy),userinfo.Id},
                       {nameof(RB_Student_Makeup_ViewModel.DealTime),DateTime.Now},
                    };
                    //更新补课表状态
                    flag = student_MakeupRepository.Update(makeUpFileds, new WhereHelper(nameof(RB_Student_Makeup_ViewModel.Id), Id));
                    if (flag)
                    {
                        Dictionary<string, object> fileds = new Dictionary<string, object>()
                        {
                            {nameof(RB_Class_Check_ViewModel.MakeUpStatus), MakeUpStatus }
                        };
                        //更新签到表状态
                        flag = classCheckRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Check_ViewModel.ClassCheckId), ClassCheckId));
                    }

                    if (flag)
                    {
                        //更新学员状态和已补课时
                        var guestModel = order_GuestRepository.GetEntity(GuestId);
                        var checkModel = classCheckRepository.GetEntity(ClassCheckId);
                        var makeUpHours = (guestModel?.MakeUpHours ?? 0) + (checkModel?.CurrentDeductionHours ?? 0);
                        Dictionary<string, object> guestFileds = new Dictionary<string, object>()
                        {
                            //{ nameof(RB_Order_Guest_ViewModel.GuestState), 1 },
                            { nameof(RB_Order_Guest_ViewModel.MakeUpHours),makeUpHours }
                        };
                        flag = order_GuestRepository.Update(guestFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), GuestId));
                    }
                }
                else if (MakeUpStatus == 3)
                {
                    //由可补课  修改为  不可补课, 需要扣回
                    Dictionary<string, object> makeUpFileds = new Dictionary<string, object>()
                    {
                       {nameof(RB_Student_Makeup_ViewModel.MakeUpStatus), MakeUpStatus },
                       {nameof(RB_Student_Makeup_ViewModel.DealBy),userinfo.Id},
                       {nameof(RB_Student_Makeup_ViewModel.DealTime),DateTime.Now},
                    };
                    //更新补课表状态
                    flag = student_MakeupRepository.Update(makeUpFileds, new WhereHelper(nameof(RB_Student_Makeup_ViewModel.Id), Id));
                    if (flag)
                    {
                        Dictionary<string, object> fileds = new Dictionary<string, object>()
                        {
                            {nameof(RB_Class_Check_ViewModel.MakeUpStatus), MakeUpStatus }
                        };
                        //更新签到表状态
                        flag = classCheckRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Check_ViewModel.ClassCheckId), ClassCheckId));
                    }

                    if (flag)
                    {
                        //更新学员状态和已补课时
                        var guestModel = order_GuestRepository.GetEntity(GuestId);
                        var checkModel = classCheckRepository.GetEntity(ClassCheckId);
                        var makeUpHours = (guestModel?.MakeUpHours ?? 0) - (checkModel?.CurrentDeductionHours ?? 0);
                        makeUpHours = makeUpHours < 0 ? 0 : makeUpHours;
                        Dictionary<string, object> guestFileds = new Dictionary<string, object>()
                        {
                            //{ nameof(RB_Order_Guest_ViewModel.GuestState), 1 },
                            { nameof(RB_Order_Guest_ViewModel.MakeUpHours),makeUpHours }
                        };
                        flag = order_GuestRepository.Update(guestFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), GuestId));
                    }
                }
            }
            return flag;
        }

        /// <summary>
        /// 获取班级上课记录
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public object GetClassPlanLogPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Class_Plan_ViewModel query)
        {
            List<object> result = new List<object>();
            var list = class_PlanRepository.GetClassPlanLogPageListRepository(pageIndex, pageSize, out rowsCount, query);
            if (list != null && list.Count > 0)
            {
                List<RB_Class_Check_ViewModel> checkLogList = new List<RB_Class_Check_ViewModel>();
                List<RB_Class_Time_ViewModel> timeList = new List<RB_Class_Time_ViewModel>();
                if (list != null && list.Any())
                {
                    checkLogList = classCheckRepository.GetClassCheckListRepository(new RB_Class_Check_ViewModel { Group_Id = query.Group_Id, School_Id = query.School_Id, ClassId = query.ClassId, StartDate = list.Min(x => x.ClassDate).ToString("yyyy-MM-dd HH:mm:ss"), EndDate = list.Max(x => x.ClassDate).ToString("yyyy-MM-dd HH:mm:ss") });
                }
                string Ids = string.Join(",", list.Select(qitem => qitem.ClassPlanId));
                if (!string.IsNullOrEmpty(Ids))
                {
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { QClassPlanIds = Ids });
                }
                foreach (var item in list)
                {
                    List<object> time = new List<object>();
                    var tempTimeList = timeList?.Where(qitem => qitem.ClassPlanId == item.ClassPlanId)?.OrderBy(qitem => qitem.StartTime)?.ToList();
                    int tempTotalNum = order_GuestRepository.GetOrderGuestNumRepository(new RB_Order_Guest_ViewModel() { ClassId = item.ClassId, GuestState = GuestStateEnum.Normal });
                    int TotalNum = 0;
                    int NoCheckNum = 0;
                    if (tempTimeList != null && tempTimeList.Count > 0)
                    {
                        foreach (var subItem in tempTimeList)
                        {
                            TotalNum += tempTotalNum;
                            var checkList = checkLogList.Where(x => x.CheckStatus == 0 && x.ClassTimeId == subItem.ClassTimeId).ToList();
                            var noCheckList = checkLogList.Where(x => x.CheckStatus == 1 && x.ClassTimeId == subItem.ClassTimeId).ToList();
                            var askforleaveList = checkLogList.Where(x => x.CheckStatus == 2 && x.ClassTimeId == subItem.ClassTimeId).ToList();
                            NoCheckNum += noCheckList.Count();
                            var obj = new
                            {
                                subItem.StartTime,
                                subItem.EndTime,
                                CheckNum = checkList.Count(),
                                CheckList = checkList.Select(qitem => new { qitem.GuestName }),
                                NoCheckNum = noCheckList.Count(),
                                NoCheckList = noCheckList.Select(qitem => new { qitem.GuestName }),
                                AskforleaveNum = askforleaveList.Count(),
                                AskforleaveList = askforleaveList.Select(qitem => new { qitem.GuestName }),
                            };
                            time.Add(obj);
                        }
                    }
                    var planCheckObj = new
                    {
                        item.TeacherName,
                        ColorType = item.TeacherId != item.Teacher_Id ? 1 : (TotalNum == NoCheckNum ? 2 : 3),
                        IsAlternate = item.TeacherId == item.Teacher_Id ? 0 : 1,//是否代课老师
                        MonthStr = item.ClassDate.ToString("MM"),
                        DayStr = item.ClassDate.ToString("dd"),
                        YearStr = item.ClassDate.ToString("yyyy"),
                        TimeList = time
                    };
                    result.Add(planCheckObj);
                }
            }
            return result;
        }

        /// <summary>
        /// 获取班级上课计划
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetClassPlanEntityModule(RB_Class_Plan_ViewModel query)
        {
            return class_PlanRepository.GetClassPlanModelRepository(query);
        }

        /// <summary>
        /// 获取每天签到记录
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Check_ViewModel> GetClassCheckListRepository(RB_Class_Check_ViewModel query)
        {
            return classCheckRepository.GetClassCheckListRepository(query);
        }

        /// <summary>
        /// 获取班级签到列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Check_ViewModel> GetClassCheckList(RB_Class_Check_ViewModel query)
        {
            return classCheckRepository.GetClassCheckList(query);
        }

        /// <summary>
        /// 获取班级上课计划列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetClassPlanListModule(RB_Class_Plan_ViewModel query)
        {
            return class_PlanRepository.GetClassPlanListRepository(query);
        }

        /// <summary>
        /// 获取班级上课计划列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetClassPlanListExtModule(RB_Class_Plan_ViewModel query)
        {
            return class_PlanRepository.GetClassPlanListExtRepository(query);
        }


        /// <summary>
        /// 获取上课计划
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetClassPlanList_V2(RB_Class_Plan_ViewModel query)
        {
            var list = class_PlanRepository.GetClassPlanList_V2(query);
            if (list != null && list.Any())
            {
                string ClassIds = string.Join(",", list.Distinct().Select(x => x.ClassId));
                var orderStudentList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel()
                {
                    ClassIds = ClassIds,
                    Group_Id = query.Group_Id,
                    School_Id = -1
                }).Where(x => x.GuestState == GuestStateEnum.Normal).ToList();

                if (orderStudentList != null && orderStudentList.Any())
                {
                    foreach (var item in list)
                    {
                        item.GuestList = new List<RB_Order_Guest_ViewModel>();
                        item.GuestList = orderStudentList.Where(x => x.ClassId == item.ClassId).ToList();
                    }
                }
            }
            return list;
        }


        /// <summary>
        /// 获取上课计划
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetClassPlanList_V3(RB_Class_Plan_ViewModel query)
        {
            var list = class_PlanRepository.GetClassPlanList_V2(query);

            return list;
        }

        /// <summary>
        /// 获取学生列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Student_ViewModel> GetStudentListRepository(RB_Student_ViewModel query)
        {
            return studentRepository.GetStudentListRepository(query);
        }

        #region 班级收支信息
        /// <summary>
        /// 获取班级收支信息列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_Finance_ViewModel> GetClassFinanceListRepository(RB_Class_Finance_ViewModel query)
        {
            return classFinanceRepository.GetClassFinanceListRepository(query);
        }

        /// <summary>
        /// 新增/修改班级收支设置
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetClassFinance(RB_Class_Finance_ViewModel model)
        {
            var oldModel = GetClassFinanceListRepository(model).FirstOrDefault();
            if (oldModel == null || oldModel.FinanceId == 0)
            {
                return classFinanceRepository.Insert(model) > 0;
            }
            else
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Class_Finance_ViewModel.IsOpen),model.IsOpen},
                    {nameof(RB_Class_Finance_ViewModel.UpdateBy),model.UpdateBy},
                    {nameof(RB_Class_Finance_ViewModel.UpdateTime),model.UpdateTime}
                };
                return order_GuestRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Finance_ViewModel.FinanceId), oldModel.FinanceId));
            }

        }

        #endregion

        #region 老师教案
        /// <summary>
        /// 新增/修改老师教案
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public bool SetClassLessPlan(Class_LessonPlan_ViewModel model, UserInfo user)
        {
            bool flag = false;
            if (model.LessonPlanList != null && model.LessonPlanList.Any())
            {
                foreach (var item in model.LessonPlanList)
                {
                    int LessonPlanId = 0;
                    item.ClassId = model.ClassId;
                    item.ClassPlanId = model.ClassPlanId;
                    item.Group_Id = model.Group_Id;
                    item.School_Id = model.School_Id;
                    item.IsTemplate = model.IsTemplate;
                    item.CourseNum = model.CourseNum;
                    item.LessonPlan = model.LessonPlan;
                    item.CreateBy = model.CreateBy;
                    item.CreateTime = model.CreateTime;
                    item.UpdateBy = model.UpdateBy;
                    item.UpdateTime = model.UpdateTime;
                    if (item.LessonPlanId > 0)//更新
                    {
                        LessonPlanId = item.LessonPlanId;
                        flag = ClassLessonPlanRepository.Update(item);
                        //删除之前有,现在没有的数据
                        var detailsList = GetLessonPlanDetailsListRepository(new RB_Class_LessonPlanDetails_ViewModel { Group_Id = item.Group_Id, School_Id = item.School_Id, LessonPlanId = item.LessonPlanId });
                        if (item.LessonPlanDetailsList != null && item.LessonPlanDetailsList.Any())
                        {
                            List<int> detailsList1 = detailsList.Select(x => x.LessonPlanDetailsId).ToList();
                            List<int> detailsList2 = item.LessonPlanDetailsList.Where(x => x.LessonPlanDetailsId > 0).Select(x => x.LessonPlanDetailsId).ToList();
                            var deleDetailsList = detailsList1.Except(detailsList2).ToList();
                            foreach (var itemDele in deleDetailsList)
                            {
                                ClassLessonPlanDetailsRepository.Delete(detailsList.Where(x => x.LessonPlanDetailsId == itemDele).FirstOrDefault());
                            }
                        }
                        else
                        {
                            ClassLessonPlanDetailsRepository.DeleteBatch(detailsList);
                        }

                        //删除之前有,现在没有的数据
                        var projectsList = GetLessonPlanProjectsListRepository(new RB_Class_LessonPlanProjects_ViewModel { Group_Id = item.Group_Id, School_Id = item.School_Id, LessonPlanId = item.LessonPlanId });
                        if (item.LessonPlanDetailsList != null && item.LessonPlanDetailsList.Any())
                        {
                            List<int> projectsList1 = projectsList.Select(x => x.LessonPlanProjectsId).ToList();
                            List<int> projectsList2 = item.LessonPlanProjectsList.Where(x => x.LessonPlanProjectsId > 0).Select(x => x.LessonPlanProjectsId).ToList();
                            var deleProjectsList = projectsList1.Except(projectsList2).ToList();
                            foreach (var itemDele in deleProjectsList)
                            {
                                ClassLessonPlanProjectsRepository.Delete(projectsList.Where(x => x.LessonPlanProjectsId == itemDele).FirstOrDefault());
                            }
                        }
                        else
                        {
                            ClassLessonPlanProjectsRepository.DeleteBatch(projectsList);
                        }
                        #region 备课通知
                        var classInfo = classRepository.GetEntity(item.ClassId);
                        var recipientPath = HttpUtility.UrlEncode($"/course/prepareclassDetails?ClassId={item.ClassId}&ClassPlanId={item.ClassPlanId}&TeacherId={user.AccountId}");

                        var notifyObjs = accountRepository.GetWorkUserIdByDictRepository("Push_TeachPreparing");
                        if (notifyObjs != null && notifyObjs.Any())
                        {
                            notifyObjs.ForEach(x =>
                            {
                                string content = $"<font color='info'>修改备课通知</font> 有老师对备课内容进行了修改调整\n>**概要信息** \n>备课老师:<font color='comment'>{user.AccountName}</font>\n>备课标题:<font color='comment'>{item.LessonPlan}(第{item.CourseNum}课)</font>\n>目标班级:<font color='comment'>{classInfo.ClassName}</font> \n>上课日期:<font color='warning'>{item.ClassDate.Value:yyyy年MM月dd日}</font>\n>请点击:[查看备课内容]({Config.ErpUrl}/autologin?loginId={x.Id}&target={recipientPath})";
                                PushWorkChatHelper.PushToWorkChat(content, x.WorkUserId, "修改备课通知");
                            });
                        }
                        #endregion
                    }
                    else
                    {
                        LessonPlanId = ClassLessonPlanRepository.Insert(item);
                        flag = LessonPlanId > 0;

                        #region 备课通知
                        var classInfo = classRepository.GetEntity(item.ClassId);
                        var recipientPath = HttpUtility.UrlEncode($"/course/prepareclassDetails?ClassId={item.ClassId}&ClassPlanId={item.ClassPlanId}&TeacherId={user.AccountId}");

                        var notifyObjs = accountRepository.GetWorkUserIdByDictRepository("Push_TeachPreparing");
                        if (notifyObjs != null && notifyObjs.Any())
                        {
                            notifyObjs.ForEach(x =>
                            {
                                var content = $"<font color='info'>备课通知</font> 有老师完成了备课工作\n>**概要信息** \n>备课老师:<font color='comment'>{user.AccountName}</font>\n>备课标题:<font color='comment'>{item.LessonPlan}(第{item.CourseNum}课)</font>\n>目标班级:<font color='comment'>{classInfo.ClassName}</font> \n>上课日期:<font color='warning'>{item.ClassDate.Value:yyyy年MM月dd日}</font>\n>请点击:[查看备课内容]({Config.ErpUrl}/autologin?loginId={x.Id}&target={recipientPath})";
                                PushWorkChatHelper.PushToWorkChat(content, x.WorkUserId, "新增备课通知");
                            });
                        }
                        #endregion
                    }
                    if (flag)
                    {
                        Dictionary<string, object> fileds = new Dictionary<string, object>()
                            {
                                {nameof(RB_Class_Plan_ViewModel.BeiKeStatus),1},
                            };
                        class_PlanRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Plan_ViewModel.ClassPlanId), item.ClassPlanId));
                    }
                    foreach (var itemDetails in item.LessonPlanDetailsList)
                    {
                        itemDetails.LessonPlanId = LessonPlanId;
                        itemDetails.School_Id = item.School_Id;
                        itemDetails.Group_Id = item.Group_Id;
                        if (itemDetails.LessonPlanDetailsId == 0)
                        {
                            ClassLessonPlanDetailsRepository.Insert(itemDetails);
                        }
                        else
                        {
                            ClassLessonPlanDetailsRepository.Update(itemDetails);
                        }
                    }
                    foreach (var itemProjects in item.LessonPlanProjectsList)
                    {
                        itemProjects.LessonPlanId = LessonPlanId;
                        itemProjects.School_Id = item.School_Id;
                        itemProjects.Group_Id = item.Group_Id;
                        if (itemProjects.LessonPlanProjectsId == 0)
                        {
                            ClassLessonPlanProjectsRepository.Insert(itemProjects);
                        }
                        else
                        {
                            ClassLessonPlanProjectsRepository.Update(itemProjects);
                        }
                    }
                }
            }
            return flag;
        }

        /// <summary>
        /// 新增/修改老师教案
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool UpdateClassLessPlan(Class_LessonPlan_ViewModel model, UserInfo user)
        {
            bool flag = true;
            if (model.LessonPlanList != null && model.LessonPlanList.Any())
            {
                foreach (var item in model.LessonPlanList)
                {
                    foreach (var itemDetails in item.LessonPlanDetailsList)
                    {
                        Dictionary<string, object> fileds = new Dictionary<string, object>()
                        {
                            {nameof(RB_Class_LessonPlanDetails_ViewModel.Summary),itemDetails.Summary}
                        };
                        if (flag)
                        {
                            flag = ClassLessonPlanDetailsRepository.Update(fileds, new WhereHelper(nameof(RB_Class_LessonPlanDetails_ViewModel.LessonPlanDetailsId), itemDetails.LessonPlanDetailsId));
                        }
                    }


                }
            }
            return flag;
        }


        /// <summary>
        /// 新增/修改老师教案
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool GetUpdateClassLessPlanSummary(Class_LessonPlan_ViewModel model, UserInfo user)
        {
            bool flag = true;
            if (model.LessonPlanList != null && model.LessonPlanList.Any())
            {
                foreach (var item in model.LessonPlanList)
                {
                    Dictionary<string, object> fileds = new Dictionary<string, object>()
                        {
                            {nameof(RB_Class_LessonPlan_ViewModel.Summary),item.Summary},
                               {nameof(RB_Class_LessonPlan_ViewModel.ProjectPic),item.ProjectPic}
                        };
                    if (flag)
                    {
                        flag = ClassLessonPlanRepository.Update(fileds, new WhereHelper(nameof(RB_Class_LessonPlan_ViewModel.LessonPlanId), item.LessonPlanId));
                    }

                    #region 备课通知
                    var classInfo = classRepository.GetEntity(item.ClassId);
                    var recipientPath = HttpUtility.UrlEncode($"/course/prepareclassDetails?ClassId={item.ClassId}&ClassPlanId={item.ClassPlanId}&TeacherId={user.AccountId}");

                    var notifyObjs = accountRepository.GetWorkUserIdByDictRepository("Push_TeachPreparing");
                    if (notifyObjs != null && notifyObjs.Any())
                    {
                        notifyObjs.ForEach(x =>
                        {
                            var content = $"<font color='info'>课后反馈通知</font> 有老师完成了课后反馈工作\n>**概要信息** \n>反馈老师:<font color='comment'>{user.AccountName}</font>\n>备课标题:<font color='comment'>{item.LessonPlan}(第{item.CourseNum}课)</font>\n>目标班级:<font color='comment'>{classInfo.ClassName}</font> \n>上课日期:<font color='warning'>{item.ClassDate.Value:yyyy年MM月dd日}</font>\n>请点击:[查看反馈内容]({Config.ErpUrl}/autologin?loginId={x.Id}&target={recipientPath})";
                            PushWorkChatHelper.PushToWorkChat(content, x.WorkUserId, "课后反馈通知");
                        });
                    }
                    #endregion
                }
                if (flag)
                {
                    Dictionary<string, object> fileds = new Dictionary<string, object>()
                            {
                                {nameof(RB_Class_Plan_ViewModel.FanKuiStatus),1},
                            };
                    class_PlanRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Plan_ViewModel.ClassPlanId), model.LessonPlanList.FirstOrDefault().ClassPlanId));
                }
            }
            return flag;
        }


        /// <summary>
        /// 获取老师教案详情分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_LessonPlanDetails_ViewModel> GetLessonPlanDetailsListRepository(RB_Class_LessonPlanDetails_ViewModel query)
        {
            return ClassLessonPlanDetailsRepository.GetLessonPlanDetailsListRepository(query);
        }


        /// <summary>
        /// 获取老师教案项目分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_LessonPlanProjects_ViewModel> GetLessonPlanProjectsListRepository(RB_Class_LessonPlanProjects_ViewModel query)
        {
            return ClassLessonPlanProjectsRepository.GetLessonPlanProjectsListRepository(query);
        }

        /// <summary>
        /// 获取老师教案分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_LessonPlan_ViewModel> GetLessonPlanPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Class_LessonPlan_ViewModel query)
        {
            return ClassLessonPlanRepository.GetLessonPlanPageListRepository(pageIndex, pageSize, out rowsCount, query);
        }


        /// <summary>
        /// 获取老师教案列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_LessonPlan_ViewModel> GetLessonPlanListRepository(RB_Class_LessonPlan_ViewModel query)
        {
            return ClassLessonPlanRepository.GetLessonPlanListRepository(query);
        }

        /// <summary>
        /// 获取老师计划列表
        /// </summary>
        /// <param name="classId">班级编号</param>
        /// <param name="monthStr">月份</param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetTeacherPlanModule(RB_Class_ViewModel model)
        {
            var timeList = new List<RB_Class_Time_ViewModel>();
            var planList = class_PlanRepository.GetTeacherPlanListRepository(new RB_Class_Plan_ViewModel() { School_Id = model.School_Id, TeacherId = model.Teacher_Id, Group_Id = model.Group_Id, StartTime = model.StartTime, EndTime = model.EndTime });

            if (planList != null && planList.Any())
            {
                string Ids = string.Join(",", planList.Select(qitem => qitem.ClassPlanId));
                if (!string.IsNullOrEmpty(Ids))
                {
                    timeList = class_TimeRepository.GetClassTimeList_V2(new RB_Class_Time_ViewModel() { QClassPlanIds = Ids });
                }
                string ClassIds = string.Join(",", planList.GroupBy(x => x.ClassId).Select(x => x.Key));
                var orderStudentList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel()
                {
                    ClassIds = ClassIds,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id
                });
                //2021-07-19 Add By:W临时上课邀请
                var tempGuestList = order_GuestRepository.GetTempInvitationGuest(new Model.ViewModel.EduTask.RB_Temporary_Invitation_ViewModel
                {
                    ClassIds = ClassIds,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id
                });
                string timeIds = string.Join(",", timeList.Select(x => x.ClassTimeId));
                var checkList = classCheckRepository.GetClassCheckList(new RB_Class_Check_ViewModel
                {
                    ClassTimeIds = timeIds,
                    Group_Id = model.Group_Id

                });

                foreach (var item in planList.OrderBy(x => x.ClassDate))
                {
                    item.PlanTimeList = new List<RB_Class_Time_ViewModel>();
                    item.PlanTimeList = timeList.Where(x => x.ClassId == item.ClassId && (x.ClassPlanId == item.ClassPlanId || item.ClassDate == Convert.ToDateTime(Common.ConvertHelper.FormatDate(x.NewPlanDateTime)))).ToList();

                    foreach (var itemTime in item.PlanTimeList)
                    {
                        itemTime.GuestList = new List<RB_Order_Guest_ViewModel>();
                        var tempList = new List<RB_Order_Guest_ViewModel>();
                        tempList.AddRange(orderStudentList.Where(x => x.ClassId == itemTime.ClassId && (x.GuestState == GuestStateEnum.Normal || x.GuestState == GuestStateEnum.StopClassesApplyIng || ((x.GuestState == GuestStateEnum.StopClasses || x.GuestState == GuestStateEnum.Graduate) && x.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(x.ChangeEffectTime)) >= item.ClassDate))).ToList());
                        if (tempGuestList != null && tempGuestList.Any())
                        {
                            tempList.AddRange(tempGuestList.Where(x => x.ClassId == itemTime.ClassId && itemTime.ClassTimeId == x.ClassTimeId && (x.GuestState == GuestStateEnum.Normal || x.GuestState == GuestStateEnum.StopClassesApplyIng || ((x.GuestState == GuestStateEnum.StopClasses || x.GuestState == GuestStateEnum.Graduate) && x.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(x.ChangeEffectTime)) >= item.ClassDate))).ToList());
                        }
                        foreach (var sItem in tempList)
                        {
                            itemTime.GuestList.Add(new RB_Order_Guest_ViewModel()
                            {
                                Id = sItem.Id,
                                GuestName = sItem.GuestName,
                                IsCheck = 0
                            });
                        }

                        foreach (var itemCheck in itemTime.GuestList)
                        {
                            //0-正常,1-缺勤,2-未签到
                            itemCheck.IsCheck = checkList?.Where(y => y.OrderGuestId == itemCheck.Id && y.ClassTimeId == itemTime.ClassTimeId).FirstOrDefault()?.CheckStatus ?? 2;
                        }
                    }
                }
            }
            return planList;
        }

        /// <summary>
        /// 获取备案评论分页列表
        /// </summary>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">每页显示条数</param>
        /// <param name="rowsCount">总条数</param>
        /// <param name="query">查询条件</param>
        /// <returns></returns>
        public List<RB_Class_LessonComment_ViewModel> GetLessonCommentList(RB_Class_LessonComment_ViewModel query)
        {
            return classLessonCommentRepository.GetLessonCommentList(query);
        }

        /// <summary>
        /// 评论/删除评论
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public bool SetLessonComment(RB_Class_LessonComment_ViewModel model)
        {
            bool flag = false;
            if (model.LessonCommentId == 0)
            {
                flag = classLessonCommentRepository.Insert(model) > 0;
                if (flag && model.Score > 0)
                {
                    Dictionary<string, object> fileds = new Dictionary<string, object>()
                    {
                        {nameof(RB_Class_Plan.ParentFanKuiStatus),1}
                    };
                    class_PlanRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Plan.ClassPlanId), model.ClassPlanId));
                }
            }
            else
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Class_LessonComment_ViewModel.Score),model.Score},
                     {nameof(RB_Class_LessonComment_ViewModel.Comment),model.Comment}
                };
                flag = classLessonCommentRepository.Update(fileds, new WhereHelper(nameof(RB_Class_LessonComment_ViewModel.LessonCommentId), model.LessonCommentId));
            }
            return flag;
        }
        /// <summary>
        /// 评论/删除评论
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool DelLessonComment(RB_Class_LessonComment_ViewModel model)
        {

            Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Class_LessonComment_ViewModel.Status),1}
                };
            return classLessonCommentRepository.Update(fileds, new WhereHelper(nameof(RB_Class_LessonComment_ViewModel.LessonCommentId), model.LessonCommentId));


        }
        #endregion

        #region 根据学生id获取最近的上课信息
        /// <summary>
        /// 根据学生id获取教师账户
        /// </summary>
        /// <param name="teacherIds"></param>
        /// <returns></returns>
        public List<RB_Class_ViewModel> GetListByStudentId(int Student_Id, int Group_Id)
        {
            var list = classRepository.GetListByStudentId(Student_Id, Group_Id);
            if (list != null && list.Any())
            {
                string classPlanIds = string.Join(",", list.Select(x => x.ClassPlanId));
                var timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel { QClassPlanIds = classPlanIds, Group_Id = Group_Id });
                if (timeList != null && timeList.Any())
                {
                    foreach (var item in list)
                    {
                        item.ClassTimeList = new List<RB_Class_Time_ViewModel>();
                        item.ClassTimeList = timeList.Where(x => x.ClassPlanId == item.ClassPlanId).ToList();
                        item.ClassTimeList.ForEach(x => x.NewPlanDateTime = item.ClassDate.Value.ToString("yyyy-MM-dd") + " " + x.StartTime);
                    }
                }
            }
            return list;
        }



        /// <summary>
        /// 获取学生上课计划列表
        /// </summary>
        /// <param name="classId">班级编号</param>
        /// <param name="monthStr">月份</param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetStudentPlanModule(RB_Class_Plan_ViewModel model)
        {
            var timeList = new List<RB_Class_Time_ViewModel>();
            var planList = class_PlanRepository.GetStudentPlanListRepository(model);
            if (planList != null && planList.Any())
            {
                string Ids = string.Join(",", planList.Select(qitem => qitem.ClassPlanId));
                if (!string.IsNullOrEmpty(Ids))
                {
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { QClassPlanIds = Ids });
                }
                string ClassIds = string.Join(",", planList.GroupBy(x => x.ClassId).Select(x => x.Key));
                foreach (var item in planList)
                {
                    item.PlanTimeList = new List<RB_Class_Time_ViewModel>();
                    item.PlanTimeList = timeList.Where(x => x.ClassPlanId == item.ClassPlanId).ToList();
                }
            }
            return planList;
        }


        /// <summary>
        /// 获取app约课
        /// </summary>
        /// <param name="Group_Id"></param>
        /// <returns></returns>
        public List<RB_Class_ViewModel> GetStuAppointment(int Group_Id)
        {
            return classRepository.GetStuAppointment(Group_Id);
        }


        #endregion

        #region  教师上课挂件查询
        /// <summary>
        /// 获取班级上课时间
        /// </summary>
        /// <param name="classIds"></param>
        /// <returns></returns>
        public List<RB_Class_Time_Extend> GetClassTimeByRoomId(int RoomId, int Group_Id)
        {
            return class_TimeRepository.GetClassTimeByRoomId(RoomId, Group_Id);
        }

        /// <summary>
        /// 获取班级上课时间
        /// </summary>
        /// <param name="classIds"></param>
        /// <returns></returns>
        public List<RB_Class_Time_Extend> GetClassTimeByClassId(int ClassId, int Group_Id)
        {
            return class_TimeRepository.GetClassTimeByClassId(ClassId, Group_Id);
        }

        /// <summary>
        /// 获取班级上课时间
        /// </summary>
        /// <param name="classIds"></param>
        /// <returns></returns>
        public List<RB_Class_Time_Extend> GetClassTimeByTId(int TId, int Group_Id)
        {
            return class_TimeRepository.GetClassTimeByTId(TId, Group_Id);
        }


        /// <summary>
        /// 计算当前班级完成课时
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int GetNowClassHours(RB_Class_Time_Extend model)
        {
            int classHours = 0;
            //班级完成的总分钟数
            var FinishMinutes = classCheckRepository.GetClassFinishMinutesRepository(model.ClassId.ToString())?.FirstOrDefault()?.FinishMinutes ?? 0;
            //基础课时分钟数
            var BasicMinutes = class_ConfigRepository.GetClassMinutesRepository(model.ClassId);
            var nowHours = model.NewEndPlanDateTime.Value.Subtract(model.NewPlanDateTime.Value).TotalSeconds;
            if (FinishMinutes > 0)
            {
                //完成课时数
                classHours = Convert.ToInt32((FinishMinutes + Convert.ToDecimal(nowHours)) / BasicMinutes);
            }
            else
            {
                classHours = Convert.ToInt32(FinishMinutes / BasicMinutes);
            }
            return classHours;
        }

        /// <summary>
        /// 班级签到完成学习分钟数以及课时
        /// </summary>
        /// <param name="classIds">班级编号</param>
        /// <returns></returns>
        public List<GuestFinishMinute_ViewModel> GetClassFinishMinutesRepository(string classIds)
        {
            return classCheckRepository.GetClassFinishMinutesRepository(classIds);
        }

        /// <summary>
        /// 更新课堂随拍
        /// </summary>
        /// <param name="SuiPai"></param>
        /// <param name="Id"></param>
        /// <returns></returns>
        public bool UpdateTimeSuiPai(string SuiPai, int Id)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                { nameof(RB_Class_Time_ViewModel.SuiPai),SuiPai},
            };
            return class_TimeRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_ViewModel.ClassTimeId), Id));
        }


        /// <summary>
        /// 更新课堂上课状态
        /// </summary>
        /// <param name="SuiPai"></param>
        /// <param name="Id"></param>
        /// <returns></returns>
        public bool UpdateTimeClassStatus(int classStatus, int Id)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    { nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
                };
            if (classStatus == 1)
            {
                fileds = new Dictionary<string, object>()
                {
                    { nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
                    { nameof(RB_Class_Time_ViewModel.InClassTime),System.DateTime.Now},
                };
            }
            else if (classStatus == 2)
            {
                fileds = new Dictionary<string, object>()
                {
                    { nameof(RB_Class_Time_ViewModel.ClassOverTime),System.DateTime.Now},
                    { nameof(RB_Class_Time_ViewModel.ClassStatus),classStatus},
                };
            }

            return class_TimeRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_ViewModel.ClassTimeId), Id));
        }

        /// <summary>
        /// 更新课堂视频
        /// </summary>
        /// <param name="SuiPai"></param>
        /// <param name="Id"></param>
        /// <returns></returns>
        public bool UpdateTimeClassVideo(string videoUrl, int Id)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                { nameof(RB_Class_Time_ViewModel.VideoUrl),videoUrl},
            };
            return class_TimeRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_ViewModel.ClassTimeId), Id));
        }
        #endregion


        #region 班级课程关联管理

        /// <summary>
        /// 新增修改班级关联课程
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetClassCourseModule(List<RB_Class_Course_Extend> list)
        {
            bool flag = false;
            foreach (var model in list)
            {
                var newModel = class_CourseRepository.GetClassCourseListRepository(new RB_Class_Course_Extend()
                {
                    CourseId = model.CourseId,
                    ClassId = model.ClassId
                })?.FirstOrDefault();
                model.Id = newModel?.Id ?? 0;
                if (model.Id > 0)
                {
                    Dictionary<string, object> fileds = new Dictionary<string, object>()
                    {
                        {nameof(RB_Class_Course_Extend.UpdateBy),model.UpdateBy },
                        {nameof(RB_Class_Course_Extend.UpdateTime),model.UpdateTime },
                    };
                    flag = class_CourseRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Course_Extend.Id), model.Id));
                }
                else
                {
                    var newId = class_CourseRepository.Insert(model);
                    model.Id = newId;
                    flag = newId > 0;
                }
            }
            return flag;
        }

        /// <summary>
        /// 获取班级关联课程列表
        /// </summary>
        /// <param name="query"></param>
        public List<RB_Class_Course_Extend> GetClassCourseListModule(RB_Class_Course_Extend query)
        {
            return class_CourseRepository.GetClassCourseListRepository(query);
        }

        /// <summary>
        /// 删除班级关联课程
        /// </summary>
        /// <param name="Id"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public bool RemoveClassCourseModule(int Id, out string message)
        {
            message = "";
            var classCourse = class_CourseRepository.GetEntity(Id);
            var orderList = orderRepository.GetOrderListRepository(new RB_Order_ViewModel()
            {
                ClassId = classCourse.ClassId,
                CourseId = classCourse.CourseId,
                OrderState = OrderStateEnum.Normal
            });
            if (orderList != null && orderList.Count > 0)
            {
                message = "此关联课程下有正常的订单,不能取消!";
                return false;
            }
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Class_Course_Extend.Status),(int)DateStateEnum.Delete },
            };
            var flag = class_CourseRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Course_Extend.Id), Id));
            return flag;
        }
        #endregion

        /// <summary>
        /// 上课计划统计
        /// </summary>
        /// <param name="query">查询条件</param>
        /// <param name="ClassType">课程类型(0-全部,1-正常,2-试听课)</param>
        /// <returns></returns>
        public object GetClassPlanStatisticalModule(RB_Class_Plan_ViewModel query, out List<object> result, int ClassType = 0)
        {
            result = new List<object>();
            List<object> mondayList = new List<object>();
            List<object> tuesdayList = new List<object>();
            List<object> wednesdayList = new List<object>();
            List<object> thursdayList = new List<object>();
            List<object> fridayList = new List<object>();
            List<object> saturdayList = new List<object>();
            List<object> sundayList = new List<object>();
            var startTime = Convert.ToDateTime(Common.ConvertHelper.GetWeekMonday(query.StartTime));
            var endTime = Convert.ToDateTime(Common.ConvertHelper.GetWeekSunday(query.EndTime));
            TimeSpan sp = endTime.Subtract(startTime);
            var days = sp.Days + 1;

            //正常上课计划列表
            var list = new List<RB_Class_Plan_ViewModel>();
            //试听课列表
            var reserveList = new List<RB_Reserve_Class_Extend>();

            var reserveQuery = new RB_Reserve_Class_Extend()
            {
                StartClassDate = query.StartTime,
                EndClassDate = query.EndTime,
                TeacherId = query.TeacherId,
                ClassRoomId = query.ClassRoomId
            };
            if (ClassType == 0)
            {
                list = class_PlanRepository.GetClassPlanStatisticalRepository(query);
                reserveList = reserve_ClassRepository.GetReserveClassListRepository(reserveQuery);
            }
            else if (ClassType == 1)
            {
                list = class_PlanRepository.GetClassPlanStatisticalRepository(query);
            }
            else if (ClassType == 2)
            {
                reserveList = reserve_ClassRepository.GetReserveClassListRepository(reserveQuery);
            }

            if (list != null || reserveList != null)
            {
                var timeList = new List<RB_Class_Time_ViewModel>();
                var guestList = new List<RB_Order_Guest_ViewModel>();
                var tempGuestList = new List<RB_Order_Guest_ViewModel>();//2021-07-20 Add By:W临时上课邀请
                if (list != null && list.Count > 0)
                {
                    string classIds = string.Join(",", list.Select(qitem => qitem.ClassId));
                    string planIds = string.Join(",", list.Select(qitem => qitem.ClassPlanId));
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { QClassIds = classIds, QClassPlanIds = planIds });
                    guestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel() { ClassIds = classIds });
                    tempGuestList = order_GuestRepository.GetTempInvitationGuest(new Model.ViewModel.EduTask.RB_Temporary_Invitation_ViewModel { ClassIds = classIds, ClassPlanIds = planIds });
                }
                var visitorList = new List<RB_Visitor_Reserve_Extend>();
                if (reserveList != null && reserveList.Count > 0)
                {
                    string reserveClassIds = string.Join(",", reserveList.Select(qitem => qitem.ReserveClassId));
                    visitorList = visitor_ReserveRepository.GetVisitorReserveListRepository(new Model.ViewModel.Reserve.RB_Visitor_Reserve_Extend()
                    {
                        Q_ReserveClassIds = reserveClassIds
                    });
                }

                for (var i = 0; i < days; i++)
                {
                    var ClassDate = startTime.AddDays(i);
                    List<object> subList = new List<object>();
                    var tempList = list.Where(qitem => qitem.ClassDate == ClassDate).OrderBy(qitem => qitem.StartTime);
                    foreach (var subItem in tempList)
                    {
                        var tempTimeList = timeList?.Where(qitem => qitem.ClassPlanId == subItem.ClassPlanId)?.ToList()?.OrderBy(qitem => qitem.StartTime);
                        var currentDate = Common.ConvertHelper.FormatDate(ClassDate) + " " + (tempTimeList?.FirstOrDefault()?.StartTime ?? "");
                        var tempTimeGuestList = new List<RB_Order_Guest_ViewModel>();

                        tempTimeGuestList.AddRange(guestList.Where(qitem => qitem.ClassId == subItem.ClassId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= subItem.ClassDate))));

                        if (tempGuestList != null && tempGuestList.Any())
                        {
                            tempTimeGuestList.AddRange(tempGuestList.Where(qitem => qitem.ClassId == subItem.ClassId && subItem.ClassPlanId == qitem.ClassPlanId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= subItem.ClassDate))));
                        }
                        subList.Add(new
                        {
                            ClassType = 1,
                            subItem.ClassId,
                            subItem.ClassName,
                            subItem.CourseName,
                            subItem.RoomName,
                            subItem.TeacherName,
                            subItem.CompleteProgress,
                            subItem.Ranks,
                            subItem.TotalPlanNum,
                            TimeStr = Common.ConvertHelper.GetTimeStr(currentDate),
                            StartTime = tempTimeList?.FirstOrDefault()?.StartTime ?? "",
                            EndTime = tempTimeList?.LastOrDefault()?.EndTime ?? "",
                            GuestList = tempTimeGuestList?.Select(qitem => new { qitem.GuestName })
                        });
                    }

                    var tempReserveList = reserveList.Where(qitem => qitem.ClassDate == ClassDate).OrderBy(qitem => qitem.ClassTime);
                    foreach (var subItem in tempReserveList)
                    {
                        var currentDate = Common.ConvertHelper.FormatDate(ClassDate) + " " + (subItem?.ClassTime ?? "");
                        subList.Add(new
                        {
                            ClassType = 2,
                            ClassId = subItem.ReserveClassId,
                            ClassName = "试听课",
                            CourseName = subItem.ClassContent,
                            subItem.RoomName,
                            subItem.TeacherName,
                            Ranks = 0,
                            TotalPlanNum = 0,
                            TimeStr = Common.ConvertHelper.GetTimeStr(currentDate),
                            StartTime = subItem.ClassTime,
                            subItem.EndTime,
                            CompleteProgress = -1,
                            GuestList = visitorList?.Where(qitem => qitem.ReserveClassId == subItem.ReserveClassId)?.Select(qitem => new { GuestName = qitem.VisitorName })
                        });
                    }
                    var obj = new
                    {
                        ClassDate = Common.ConvertHelper.FormatDate(ClassDate),
                        WeekStr = Common.ConvertHelper.GetWeekDay(ClassDate),
                        SubList = subList
                    };
                    result.Add(obj);
                    switch (ClassDate.DayOfWeek)
                    {
                        case DayOfWeek.Monday:
                            mondayList.Add(obj);
                            break;
                        case DayOfWeek.Tuesday:
                            tuesdayList.Add(obj);
                            break;
                        case DayOfWeek.Wednesday:
                            wednesdayList.Add(obj);
                            break;
                        case DayOfWeek.Thursday:
                            thursdayList.Add(obj);
                            break;
                        case DayOfWeek.Friday:
                            fridayList.Add(obj);
                            break;
                        case DayOfWeek.Saturday:
                            saturdayList.Add(obj);
                            break;
                        case DayOfWeek.Sunday:
                            sundayList.Add(obj);
                            break;
                    }
                }
            }
            return new { mondayList, tuesdayList, wednesdayList, thursdayList, fridayList, saturdayList, sundayList };
        }

        /// <summary>
        /// 获取指定日期的试听课
        /// </summary>
        /// <param name="StartTime"></param>
        /// <param name="EndTime"></param>
        /// <returns></returns>
        public object GetDateTrialLessonModule(string StartTime,string EndTime)
        {
            List<object> list = new List<object>();
            var reserveQuery = new RB_Reserve_Class_Extend()
            {
                StartClassDate = StartTime,
                EndClassDate = EndTime,
            };
            var reserveList = reserve_ClassRepository.GetReserveClassListRepository(reserveQuery);
            var visitorList = new List<RB_Visitor_Reserve_Extend>();
            if (reserveList != null && reserveList.Count > 0)
            {
                string reserveClassIds = string.Join(",", reserveList.Select(qitem => qitem.ReserveClassId));
                visitorList = visitor_ReserveRepository.GetVisitorReserveListRepository(new Model.ViewModel.Reserve.RB_Visitor_Reserve_Extend()
                {
                    Q_ReserveClassIds = reserveClassIds
                });
            }
            foreach (var item in reserveList)
            {
                list.Add(new
                {
                    ClassId = item.ReserveClassId,
                    ClassName = "试听课",
                    CourseName = item.ClassContent,
                    item.RoomName,
                    item.TeacherName,
                    ClassDate=Common.ConvertHelper.FormatDate(item.ClassDate),
                    TimeStr = Common.ConvertHelper.GetTimeStr(item.ClassDate),
                    StartTime = item.ClassTime,
                    item.EndTime,
                    GuestList = visitorList?.Where(qitem => qitem.ReserveClassId == item.ReserveClassId)
                    ?.Select(qitem => new
                    {
                        GuestName = qitem.VisitorName,
                        StuTel = Common.Plugin.StringHelper.ReplaceMobile(qitem.StuTel)
                    })
                });
            }
            return list;
        }



        /// <summary>
        /// 获取教师课时统计
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public object GetTeacherClassHoursStatisticalModule(RB_Class_Plan_ViewModel query)
        {
            List<object> result = new List<object>();
            var BasicMinutes = class_ConfigRepository.GetBasicMinutesRepository(query.Group_Id);
            var list = class_PlanRepository.GetClassPlanStatisticalRepository(query);
            if (list != null)
            {
                var groupList = list.GroupBy(qitem => new { qitem.Teacher_Id, qitem.TeacherName }).Select(qitem => new { qitem.Key.Teacher_Id, qitem.Key.TeacherName });
                foreach (var item in groupList)
                {
                    var totalClassMinutes = list.Where(qitem => qitem.Teacher_Id == item.Teacher_Id)?.Sum(qitem => qitem.ClassMinutes) ?? 0;
                    var obj = new
                    {
                        item.TeacherName,
                        TeacherId = item.Teacher_Id,
                        ClassHours = totalClassMinutes / BasicMinutes
                    };
                    result.Add(obj);
                }
            }
            return result;
        }


        /// <summary>
        /// 教室使用记录
        /// </summary>
        /// <param name="query">查询条件</param>
        /// <param name="ClassType">课程类型(0-全部,1-正常,2-试听课)</param>
        /// <returns></returns>
        public object GetClassUseStatisticalModule(RB_Class_Plan_ViewModel query, int ClassType = 0)
        {
            List<object> mondayList = new List<object>();
            List<object> tuesdayList = new List<object>();
            List<object> wednesdayList = new List<object>();
            List<object> thursdayList = new List<object>();
            List<object> fridayList = new List<object>();
            List<object> saturdayList = new List<object>();
            List<object> sundayList = new List<object>();
            var startTime = Convert.ToDateTime(Common.ConvertHelper.GetWeekMonday(query.StartTime));
            var endTime = Convert.ToDateTime(Common.ConvertHelper.GetWeekSunday(query.EndTime));
            TimeSpan sp = endTime.Subtract(startTime);
            var days = sp.Days + 1;

            //正常上课计划列表
            var list = new List<RB_Class_Plan_ViewModel>();
            //试听课列表
            var reserveList = new List<RB_Reserve_Class_Extend>();
            List<RB_Class_RoomUseLog_ViewModel> roomUserLogList = new List<RB_Class_RoomUseLog_ViewModel>();
            var reserveQuery = new RB_Reserve_Class_Extend()
            {
                StartClassDate = query.StartTime,
                EndClassDate = query.EndTime,
                TeacherId = query.TeacherId,
                ClassRoomId = query.ClassRoomId
            };
            if (ClassType == 0)
            {
                list = class_PlanRepository.GetClassPlanStatisticalRepository(query);
                reserveList = reserve_ClassRepository.GetReserveClassListRepository(reserveQuery);
            }
            else if (ClassType == 1)
            {
                list = class_PlanRepository.GetClassPlanStatisticalRepository(query);
            }
            else if (ClassType == 2)
            {
                reserveList = reserve_ClassRepository.GetReserveClassListRepository(reserveQuery);
            }

            if (list != null || reserveList != null)
            {
                var timeList = new List<RB_Class_Time_ViewModel>();
                var guestList = new List<RB_Order_Guest_ViewModel>();
                var tempGuestList = new List<RB_Order_Guest_ViewModel>();//2021-07-19 Add By:W临时上课邀请
                List<int> classRoomId = new List<int>();

                if (list != null && list.Any())
                {
                    classRoomId.AddRange(list.Select(x => x.ClassRoomId).ToList());
                }

                if (reserveList != null && reserveList.Any())
                {
                    classRoomId.AddRange(reserveList.Select(x => x.ClassRoomId).ToList());
                }

                string roomIds = string.Join(",", classRoomId.Select(x => x).Distinct());
                if (!string.IsNullOrWhiteSpace(roomIds))
                {
                    roomUserLogList = class_RoomUseLogRepository.GetClassRoomUseLogListRepository(new RB_Class_RoomUseLog_ViewModel { StartTime = query.StartTime, EndTime = query.EndTime, QRoomIds = roomIds });
                }
                if (list != null && list.Count > 0)
                {
                    string classIds = string.Join(",", list.Select(qitem => qitem.ClassId));
                    string planIds = string.Join(",", list.Select(qitem => qitem.ClassPlanId));
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { QClassIds = classIds, QClassPlanIds = planIds });
                    guestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel() { ClassIds = classIds });
                    tempGuestList = order_GuestRepository.GetTempInvitationGuest(new Model.ViewModel.EduTask.RB_Temporary_Invitation_ViewModel { ClassIds = classIds });
                }
                var visitorList = new List<RB_Visitor_Reserve_Extend>();
                if (reserveList != null && reserveList.Count > 0)
                {
                    string reserveClassIds = string.Join(",", reserveList.Select(qitem => qitem.ReserveClassId));
                    visitorList = visitor_ReserveRepository.GetVisitorReserveListRepository(new Model.ViewModel.Reserve.RB_Visitor_Reserve_Extend()
                    {
                        Q_ReserveClassIds = reserveClassIds
                    });
                }

                for (var i = 0; i < days; i++)
                {
                    var ClassDate = startTime.AddDays(i);
                    List<object> subList = new List<object>();
                    var tempRoomUseLogList = roomUserLogList.Where(qitem => qitem.CreateTime.ToString("yyyy-MM-dd") == ClassDate.ToString("yyyy-MM-dd")).OrderBy(qitem => qitem.CreateTime);
                    foreach (var subItem in tempRoomUseLogList)
                    {
                        subList.Add(new
                        {
                            Id = subItem.RoomErrorId,
                            ClassType = 2,
                            ClassId = 0,
                            ClassName = subItem.ErrorTitle,
                            CourseName = subItem.ErrorContent,
                            RoomName = "",
                            TeacherName = "",
                            TimeStr = Common.ConvertHelper.GetTimeStr(subItem.CreateTime),
                            StartTime = subItem.CreateTime.ToString("HHLmm"),
                            EndTime = subItem.UpdateTime.HasValue ? subItem.UpdateTime.Value.ToString("HHLmm") : "未知",
                            CompleteProgress = -1,
                            GuestList = new List<string>(),
                            Type = subItem.ErrorType,// 0-班级,1-使用记录,2-异常记录
                        });
                    }


                    var tempList = list.Where(qitem => qitem.ClassDate == ClassDate).OrderBy(qitem => qitem.StartTime);
                    foreach (var subItem in tempList)
                    {
                        var tempTimeList = timeList?.Where(qitem => qitem.ClassPlanId == subItem.ClassPlanId)?.ToList()?.OrderBy(qitem => qitem.StartTime);
                        var currentDate = Common.ConvertHelper.FormatDate(ClassDate) + " " + (tempTimeList?.FirstOrDefault()?.StartTime ?? "");

                        foreach (var item in tempTimeList)
                        {
                            var tempTimeGuestList = new List<RB_Order_Guest_ViewModel>();
                            tempTimeGuestList.AddRange(guestList.Where(qitem => qitem.ClassId == subItem.ClassId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= subItem.ClassDate))));
                            tempTimeGuestList.AddRange(tempGuestList.Where(qitem => qitem.ClassId == subItem.ClassId && item.ClassTimeId == qitem.ClassTimeId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= subItem.ClassDate))));
                            subList.Add(new
                            {
                                Id = item?.ClassTimeId ?? 0,
                                ClassType = 1,
                                subItem.ClassId,
                                subItem.ClassName,
                                subItem.CourseName,
                                subItem.RoomName,
                                subItem.TeacherName,
                                subItem.CompleteProgress,
                                TimeStr = Common.ConvertHelper.GetTimeStr(currentDate),
                                StartTime = item?.StartTime ?? "",
                                EndTime = item?.EndTime ?? "",
                                GuestList = tempTimeGuestList?.Select(qitem => new { qitem.GuestName }),
                                Type = 0,// 0-班级,1-使用记录,2-异常记录
                            });
                        }

                    }

                    var tempReserveList = reserveList.Where(qitem => qitem.ClassDate == ClassDate).OrderBy(qitem => qitem.ClassTime);
                    foreach (var subItem in tempReserveList)
                    {
                        var currentDate = Common.ConvertHelper.FormatDate(ClassDate) + " " + (subItem?.ClassTime ?? "");
                        subList.Add(new
                        {
                            Id = subItem.ReserveClassId,
                            ClassType = 2,
                            ClassId = subItem.ReserveClassId,
                            ClassName = "试听课",
                            CourseName = subItem.ClassContent,
                            subItem.RoomName,
                            subItem.TeacherName,
                            TimeStr = Common.ConvertHelper.GetTimeStr(currentDate),
                            StartTime = subItem.ClassTime,
                            subItem.EndTime,
                            CompleteProgress = -1,
                            GuestList = visitorList?.Where(qitem => qitem.ReserveClassId == subItem.ReserveClassId)?.Select(qitem => new { GuestName = qitem.VisitorName }),
                            Type = 0,// 0-班级,1-使用记录,2-异常记录
                        });
                    }
                    var obj = new
                    {
                        ClassDate = Common.ConvertHelper.FormatDate(ClassDate),
                        WeekStr = Common.ConvertHelper.GetWeekDay(ClassDate),
                        SubList = subList
                    };
                    switch (ClassDate.DayOfWeek)
                    {
                        case DayOfWeek.Monday:
                            mondayList.Add(obj);
                            break;
                        case DayOfWeek.Tuesday:
                            tuesdayList.Add(obj);
                            break;
                        case DayOfWeek.Wednesday:
                            wednesdayList.Add(obj);
                            break;
                        case DayOfWeek.Thursday:
                            thursdayList.Add(obj);
                            break;
                        case DayOfWeek.Friday:
                            fridayList.Add(obj);
                            break;
                        case DayOfWeek.Saturday:
                            saturdayList.Add(obj);
                            break;
                        case DayOfWeek.Sunday:
                            sundayList.Add(obj);
                            break;
                    }
                }
            }
            return new { mondayList, tuesdayList, wednesdayList, thursdayList, fridayList, saturdayList, sundayList };
        }


        /// <summary>
        /// 教师-我的排课
        /// </summary>
        /// <param name="query">查询条件</param>
        /// <param name="ClassType">课程类型(0-全部,1-正常,2-试听课)</param>
        /// <returns></returns>
        public object GetTeacherPlanStatisticalModule(RB_Class_Plan_ViewModel query, int ClassType = 0)
        {
            List<object> mondayList = new List<object>();
            List<object> tuesdayList = new List<object>();
            List<object> wednesdayList = new List<object>();
            List<object> thursdayList = new List<object>();
            List<object> fridayList = new List<object>();
            List<object> saturdayList = new List<object>();
            List<object> sundayList = new List<object>();
            var startTime = Convert.ToDateTime(Common.ConvertHelper.GetWeekMonday(query.StartTime));
            var endTime = Convert.ToDateTime(Common.ConvertHelper.GetWeekSunday(query.EndTime));
            TimeSpan sp = endTime.Subtract(startTime);
            var days = sp.Days + 1;

            //正常上课计划列表
            var list = new List<RB_Class_Plan_ViewModel>();
            //试听课列表
            var reserveList = new List<RB_Reserve_Class_Extend>();

            var reserveQuery = new RB_Reserve_Class_Extend()
            {
                StartClassDate = query.StartTime,
                EndClassDate = query.EndTime,
                TeacherId = query.TeacherId,
                ClassRoomId = query.ClassRoomId
            };
            if (ClassType == 0)
            {
                list = class_PlanRepository.GetClassPlanStatisticalRepository(query);
                reserveList = reserve_ClassRepository.GetReserveClassListRepository(reserveQuery);
            }
            else if (ClassType == 1)
            {
                list = class_PlanRepository.GetClassPlanStatisticalRepository(query);
            }
            else if (ClassType == 2)
            {
                reserveList = reserve_ClassRepository.GetReserveClassListRepository(reserveQuery);
            }

            if (list != null || reserveList != null)
            {
                var timeList = new List<RB_Class_Time_ViewModel>();
                var guestList = new List<RB_Order_Guest_ViewModel>();
                var tempGuestList = new List<RB_Order_Guest_ViewModel>();//2021-07-19 Add By:W临时上课邀请
                var feedBackList = new List<RB_Class_FeedBack_ViewModel>();//上课反馈
                if (list != null && list.Count > 0)
                {
                    string classIds = string.Join(",", list.Select(qitem => qitem.ClassId));
                    string planIds = string.Join(",", list.Select(qitem => qitem.ClassPlanId));
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { QClassIds = classIds, QClassPlanIds = planIds });
                    guestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel() { ClassIds = classIds });
                    tempGuestList = order_GuestRepository.GetTempInvitationGuest(new Model.ViewModel.EduTask.RB_Temporary_Invitation_ViewModel { ClassIds = classIds });
                    feedBackList = class_FeedBackRepository.GetClassFeedBackList(new RB_Class_FeedBack_ViewModel() { Q_ClassIds = classIds });
                }
                var visitorList = new List<RB_Visitor_Reserve_Extend>();
                if (reserveList != null && reserveList.Count > 0)
                {
                    string reserveClassIds = string.Join(",", reserveList.Select(qitem => qitem.ReserveClassId));
                    visitorList = visitor_ReserveRepository.GetVisitorReserveListRepository(new Model.ViewModel.Reserve.RB_Visitor_Reserve_Extend()
                    {
                        Q_ReserveClassIds = reserveClassIds
                    });
                }

                for (var i = 0; i < days; i++)
                {
                    var ClassDate = startTime.AddDays(i);
                    List<object> subList = new List<object>();

                    var tempList = list.Where(qitem => qitem.ClassDate == ClassDate).OrderBy(qitem => qitem.StartTime);
                    foreach (var subItem in tempList)
                    {
                        var tempTimeList = timeList?.Where(qitem => qitem.ClassPlanId == subItem.ClassPlanId)?.ToList()?.OrderBy(qitem => qitem.StartTime);
                        var currentDate = Common.ConvertHelper.FormatDate(ClassDate) + " " + (tempTimeList?.FirstOrDefault()?.StartTime ?? "");
                        foreach (var item in tempTimeList)
                        {
                            var tempTimeGuestList = new List<RB_Order_Guest_ViewModel>();
                            tempTimeGuestList.AddRange(guestList.Where(qitem => qitem.ClassId == subItem.ClassId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= subItem.ClassDate))));
                            tempTimeGuestList.AddRange(tempGuestList.Where(qitem => qitem.ClassId == subItem.ClassId && item.ClassTimeId == qitem.ClassTimeId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= subItem.ClassDate))));
                            int feedBackStatus = 0;//0-未反馈,1-部分,2-已反馈
                            var nowFeedBackList = feedBackList.Where(x => x.ClassTimeId == item.ClassTimeId && x.ClassId == item.ClassId);
                            if (tempTimeGuestList != null && tempTimeGuestList.Any())
                            {
                                if (tempTimeGuestList.Count() > nowFeedBackList.Count())
                                {
                                    feedBackStatus = 1;
                                }
                                else if (tempTimeGuestList.Count() == nowFeedBackList.Count())
                                {
                                    feedBackStatus = 2;

                                }
                            }
                            subList.Add(new
                            {
                                Id = item?.ClassTimeId ?? 0,
                                ClassType = 1,
                                subItem.ClassId,
                                subItem.ClassName,
                                subItem.CourseName,
                                subItem.RoomName,
                                subItem.TeacherName,
                                subItem.CompleteProgress,
                                subItem.TotalPlanNum,
                                subItem.Ranks,
                                TimeStr = Common.ConvertHelper.GetTimeStr(currentDate),
                                StartTime = item?.StartTime ?? "",
                                EndTime = item?.EndTime ?? "",
                                FeedBackStatus = feedBackStatus,
                                GuestList = tempTimeGuestList?.Select(qitem => new { qitem.GuestName })
                            });
                        }

                    }

                    var tempReserveList = reserveList.Where(qitem => qitem.ClassDate == ClassDate).OrderBy(qitem => qitem.ClassTime);
                    foreach (var subItem in tempReserveList)
                    {
                        var currentDate = Common.ConvertHelper.FormatDate(ClassDate) + " " + (subItem?.ClassTime ?? "");
                        subList.Add(new
                        {
                            Id = subItem.ReserveClassId,
                            ClassType = 2,
                            ClassId = subItem.ReserveClassId,
                            ClassName = "试听课",
                            CourseName = subItem.ClassContent,
                            subItem.RoomName,
                            subItem.TeacherName,
                            TotalPlanNum = 0,
                            Ranks = 0,
                            TimeStr = Common.ConvertHelper.GetTimeStr(currentDate),
                            StartTime = subItem.ClassTime,
                            subItem.EndTime,
                            CompleteProgress = -1,
                            FeedBackStatus = 0,
                            GuestList = visitorList?.Where(qitem => qitem.ReserveClassId == subItem.ReserveClassId)?.Select(qitem => new { GuestName = qitem.VisitorName }),

                        });
                    }
                    var obj = new
                    {
                        ClassDate = Common.ConvertHelper.FormatDate(ClassDate),
                        WeekStr = Common.ConvertHelper.GetWeekDay(ClassDate),
                        SubList = subList
                    };
                    switch (ClassDate.DayOfWeek)
                    {
                        case DayOfWeek.Monday:
                            mondayList.Add(obj);
                            break;
                        case DayOfWeek.Tuesday:
                            tuesdayList.Add(obj);
                            break;
                        case DayOfWeek.Wednesday:
                            wednesdayList.Add(obj);
                            break;
                        case DayOfWeek.Thursday:
                            thursdayList.Add(obj);
                            break;
                        case DayOfWeek.Friday:
                            fridayList.Add(obj);
                            break;
                        case DayOfWeek.Saturday:
                            saturdayList.Add(obj);
                            break;
                        case DayOfWeek.Sunday:
                            sundayList.Add(obj);
                            break;
                    }
                }
            }
            return new { mondayList, tuesdayList, wednesdayList, thursdayList, fridayList, saturdayList, sundayList };
        }



        /// <summary>
        /// 获取班级上课记录
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<object> GetTeacherPlan(int pageIndex, int pageSize, out long rowsCount, RB_Class_Plan_ViewModel query)
        {
            List<object> result = new List<object>();
            var list = class_PlanRepository.GetTeacherPlan(pageIndex, pageSize, out rowsCount, query);
            if (list != null && list.Any())
            {
                var guestList = new List<RB_Order_Guest_ViewModel>();
                var tempGuestList = new List<RB_Order_Guest_ViewModel>();//2021-07-19 Add By:W临时上课邀请
                var feedBackList = new List<RB_Class_FeedBack_ViewModel>();//上课反馈
                var visitorList = new List<RB_Visitor_Reserve_Extend>();
                if (list.Any(x => x.ClassType == 1))
                {
                    string classIds = string.Join(",", list.Where(x => x.ClassType == 1).Select(qitem => qitem.ClassId));
                    guestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel() { ClassIds = classIds });
                    tempGuestList = order_GuestRepository.GetTempInvitationGuest(new Model.ViewModel.EduTask.RB_Temporary_Invitation_ViewModel { ClassIds = classIds });
                    feedBackList = class_FeedBackRepository.GetClassFeedBackList(new RB_Class_FeedBack_ViewModel() { Q_ClassIds = classIds });
                }
                if (list.Any(x => x.ClassType == 2))
                {
                    string reserveClassIds = string.Join(",", list.Select(qitem => qitem.ClassTimeId));
                    visitorList = visitor_ReserveRepository.GetVisitorReserveListRepository(new Model.ViewModel.Reserve.RB_Visitor_Reserve_Extend()
                    {
                        Q_ReserveClassIds = reserveClassIds
                    });
                }
                foreach (var item in list)
                {
                    var currentDate = Common.ConvertHelper.FormatDate(item.ClassDate) + " " + (item.StartTime ?? "");
                    var tempTimeGuestList = new List<RB_Order_Guest_ViewModel>();
                    int feedBackStatus = 0;//0-未反馈,1-部分,2-已反馈
                    if (item.ClassType == 1)
                    {
                        tempTimeGuestList.AddRange(guestList.Where(qitem => qitem.ClassId == item.ClassId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= item.ClassDate))));
                        tempTimeGuestList.AddRange(tempGuestList.Where(qitem => qitem.ClassId == item.ClassId && item.ClassTimeId == qitem.ClassTimeId && (qitem.GuestState == GuestStateEnum.Normal || qitem.GuestState == GuestStateEnum.StopClassesApplyIng || ((qitem.GuestState == GuestStateEnum.StopClasses || qitem.GuestState == GuestStateEnum.Graduate) && qitem.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(qitem.ChangeEffectTime)) >= item.ClassDate))));

                        var nowFeedBackList = feedBackList.Where(x => x.ClassTimeId == item.ClassTimeId && x.ClassId == item.ClassId);
                        if (tempTimeGuestList != null && tempTimeGuestList.Any())
                        {
                            if (tempTimeGuestList.Count() > nowFeedBackList.Count())
                            {
                                feedBackStatus = 1;
                            }
                            else if (tempTimeGuestList.Count() == nowFeedBackList.Count())
                            {
                                feedBackStatus = 2;

                            }
                        }
                    }
                    result.Add(new
                    {
                        Id = item?.ClassTimeId ?? 0,
                        item.ClassType,
                        item.ClassId,
                        item.ClassName,
                        item.CourseName,
                        item.RoomName,
                        item.TeacherName,
                        item.TotalPlanNum,
                        ClassDate = item.ClassDate.ToString("yyyy-MM-dd"),
                        item.Ranks,
                        TimeStr = Common.ConvertHelper.GetTimeStr(currentDate),
                        StartTime = item?.StartTime ?? "",
                        EndTime = item?.EndTime ?? "",
                        FeedBackStatus = feedBackStatus,
                        GuestList = item.ClassType == 1 ? tempTimeGuestList?.Select(qitem => new { qitem.GuestName }) : visitorList?.Where(qitem => qitem.ReserveClassId == item.ClassTimeId)?.Select(qitem => new { GuestName = qitem.VisitorName }),
                    });
                }
            }
            return result;
        }

        /// <summary>
        /// 查询指定计划的上课课时
        /// </summary>
        /// <param name="planId"></param>
        /// <returns></returns>
        public double GetCurrentPlanStudyHoursRepository(int planId)
        {
            return class_PlanRepository.GetCurrentPlanStudyHoursRepository(planId);
        }

        /// <summary>
        /// 更新历史班号
        /// </summary>
        /// <returns></returns>
        public bool UpdateHistoryClassNo()
        {
            var list = classRepository.GetClassListRepository(new RB_Class_ViewModel() { Group_Id = 100000 });
            list = list.OrderBy(x => x.OpenTime).ThenBy(x => x.ClassId).ToList();
            foreach (var model in list)
            {
                #region 生成班级号
                model.ClassNo = "";
                var classTypeModel = class_TypeRepository.GetEntity(model.ClassType);
                if (classTypeModel != null)
                {
                    model.ClassNo = classTypeModel.ClassNoPrefix;
                }
                //查询最大的字母
                int CNum = classRepository.GetMaxClassNoPrefix(model.OpenTime.ToString("yyyy-MM-dd"));
                if (CNum == 0)
                {
                    model.ClassNo += model.OpenTime.ToString("yyyyMMdd") + "A";
                    model.ClassLetterNum = 1;
                }
                else
                {
                    string ClassNoLetterStr = Edu.Common.Config.ClassNoLetterStr;
                    model.ClassNo += model.OpenTime.ToString("yyyyMMdd") + ClassNoLetterStr.Substring(CNum, 1);
                    model.ClassLetterNum = CNum + 1;
                }
                #endregion
                Dictionary<string, object> keyValues = new Dictionary<string, object>()
                {
                    { nameof(RB_Class_ViewModel.ClassNo),model.ClassNo},
                    { nameof(RB_Class_ViewModel.ClassLetterNum),model.ClassLetterNum},
                };
                List<WhereHelper> wheres = new List<WhereHelper>()
                {
                    new WhereHelper()
                    {
                         FiledName=nameof(RB_Class_ViewModel.ClassId),
                         FiledValue=model.ClassId,
                         OperatorEnum=OperatorEnum.Equal
                    }
                };
                classRepository.Update(keyValues, wheres);
            }
            return true;
        }

        /// <summary>
        /// 返回明日未备课的老师列表
        /// </summary>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetNotPerparingTeachModule()
        {
            return class_PlanRepository.GetNotPerparingTeachRepository();
        }


        #region 教师-我的班级
        /// <summary>
        /// 获取班级分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <param name="isGetStepPrice">是否查询阶梯价格</param>
        /// <returns></returns>
        public List<RB_Class_ViewModel> GetTeacherClassPageList(int pageIndex, int pageSize, out long rowsCount, RB_Class_ViewModel query, bool isGetStepPrice = false)
        {
            var list = classRepository.GetClassPageListRepository(pageIndex, pageSize, out rowsCount, query);
            if (list != null && list.Count > 0)
            {
                var classTimeList = new List<RB_Class_Time_ViewModel>();
                var stepPriceList = new List<RB_Class_StepPrice_ViewModel>();
                var otherCourseList = new List<RB_Class_Course_Extend>();
                var maxPlanDateList = new List<RB_Class_Plan_ViewModel>();
                string ids = string.Join(",", list.Select(qitem => qitem.ClassId));
                if (!string.IsNullOrEmpty(ids))
                {
                    classTimeList = class_TimeRepository.GetClassTimeListRepository(ids);
                    otherCourseList = GetClassCourseListModule(new RB_Class_Course_Extend() { QClassIds = ids });
                    maxPlanDateList = class_PlanRepository.GetClassPlanMaxDataRepository(new RB_Class_Plan_ViewModel()
                    {
                        QClassIds = ids
                    });
                }
                if (isGetStepPrice)
                {
                    stepPriceList = class_StepPriceRepository.GetClassStepPriceListRepository(new RB_Class_StepPrice_ViewModel() { QClassIds = ids })?.ToList() ?? new List<RB_Class_StepPrice_ViewModel>();
                }

                //课程计划上课日期
                foreach (var item in list)
                {
                    var finish = maxPlanDateList?.Where(qitem => qitem.ClassId == item.ClassId)?.FirstOrDefault()?.ClassDate;
                    item.FinishTimeStr = Common.ConvertHelper.FormatDate(finish);
                    item.NewPlanDateTime = classTimeList?.Where(qitem => qitem.ClassId == item.ClassId)?.FirstOrDefault()?.NewPlanDateTime;

                    if (isGetStepPrice)
                    {
                        item.ClassStepPriceList = stepPriceList?.Where(qitem => qitem.ClassId == item.ClassId)?.ToList() ?? new List<RB_Class_StepPrice_ViewModel>();
                    }
                    item.OtherCourseList = otherCourseList?.Where(qitem => qitem.ClassId == item.ClassId)?.ToList() ?? new List<RB_Class_Course_Extend>();
                }
            }
            return list;
        }

        #endregion

        #region 教师-学员管理
        /// <summary>
        /// 获取分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="demodel"></param>
        /// <param name="orderIds"></param>
        /// <returns></returns>
        public List<RB_Order_Guest_ViewModel> GetTeacherStudentPage(int pageIndex, int pageSize, out long rowsCount, RB_Order_Guest_ViewModel demodel)
        {
            var orderstudentList = order_GuestRepository.GetTeacherStudentPage(pageIndex, pageSize, out rowsCount, demodel);
            return orderstudentList;
        }

        /// <summary>
        /// 获取非本班学员的学员
        /// </summary>
        /// <param name="demodel"></param>
        /// <returns></returns>
        public List<RB_Order_Guest_ViewModel> GetNotClassStudentList(RB_Order_Guest_ViewModel demodel)
        {
            var orderstudentList = order_GuestRepository.GetNotClassStudentList(demodel);
            return orderstudentList;
        }

        #endregion

        #region 财务轧账
        /// <summary>
        /// 验证是否可以修改签到数据
        /// </summary>
        /// <param name="monthStr"></param>
        /// <param name="schoolId"></param>
        /// <param name="group_Id"></param>
        /// <returns></returns>
        public string ValidateClassCheckFinance(string monthStr, int schoolId, int group_Id)
        {
            var ralist = rollingAccountRepository.GetList(new Model.ViewModel.Finance.RB_RollingAccount_Extend() { GroupId = group_Id, Month = monthStr, State = 1 });
            if (ralist.Any())
            {
                if (ralist.Where(x => x.SchoolIds == "-1" || ("," + x.SchoolIds + ",").Contains("," + schoolId + ",")).Any())
                {
                    return "该单据所在交易日期已关帐,无法修改签到数据";
                }
            }
            return "";
        }

        #endregion

        #region 临时上课邀请学生
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="demodel"></param>
        /// <returns></returns>
        public List<RB_Order_Guest_ViewModel> GetTempInvitationGuest(Model.ViewModel.EduTask.RB_Temporary_Invitation_ViewModel demodel)
        {
            return order_GuestRepository.GetTempInvitationGuest(demodel);
        }

        #endregion

        #region 甲鹤小程序商品信息
        /// <summary>
        /// 同步班级到甲鹤小程序
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetGoodsSpecificationValue(RB_Class_ViewModel model)
        {
            bool flag = false;
            var courseModel = courseRepository.GetEntity(model.CouseId).RefMapperTo<RB_Course_ViewModel>();
            if (courseModel != null && courseModel.MallGoodsId > 0)
            {
                if (courseModel.SalePlatList != null && courseModel.SalePlatList.Any(x => x == 4) && model.ClassStatus == ClassStatusEnum.NonOpenClass)//课程关联到了小程序
                {
                    RB_Goods_Extend demodel = new RB_Goods_Extend
                    {
                        MallBaseId = Convert.ToInt32(Config.JHMallBaseId),
                        TenantId = Convert.ToInt32(Config.JHTenantId),
                        SpecificationList = new List<RB_Goods_Specification_Extend>(),
                        SpecificationPriceList = new List<RB_Goods_SpecificationPrice_Extend>(),
                        Id = courseModel.MallGoodsId,
                        CreateDate = DateTime.Now
                    };
                    RB_Goods_Specification_Extend modelSpecification = new RB_Goods_Specification_Extend
                    {
                        Id = 0,//暂定
                        EnabledImage = 2,
                        Name = "开班日期",
                        Sort = 1,
                        SpecificationValueList = new List<RB_Goods_SpecificationValue_Extend>()
                    };
                    //查询课程对应班级开课时间大于今天的班级
                    var classList = classRepository.GetClassAndCourseListRepository(new RB_Class_ViewModel { CouseId = model.CouseId, StartTime = System.DateTime.Now.ToString("yyyy-MM-dd") }).Where(x => x.ClassStatus == Common.Enum.Course.ClassStatusEnum.NonOpenClass && x.OpenTime > System.DateTime.Now).ToList();
                    if (classList != null && classList.Any())
                    {
                        int Sort = 1;
                        foreach (var item in classList)
                        {
                            RB_Goods_SpecificationValue_Extend modelSpecificationValue = new RB_Goods_SpecificationValue_Extend
                            {
                                Id = 0,
                                Image = "",
                                ImagePath = "",
                                Name = item.OpenTime.ToString("MM月dd日"),
                                Sort = Sort,///暂定1
                                ClassId = item.ClassId
                            };
                            modelSpecification.SpecificationValueList.Add(modelSpecificationValue);
                            RB_Goods_SpecificationPrice_Extend pModel = new RB_Goods_SpecificationPrice_Extend()
                            {
                                Commission = 0,
                                CostMoney = 0,
                                GoodsNumbers = item.ClassNo,
                                GoodsWeight = 0,
                                InventoryNum = item.ClassPersion - item.OrderStudentCount,//暂定
                                SellingPrice = item.SellPrice,
                                SpecificationSort = Sort.ToString(),//暂定
                                AttrList = new object()
                            };
                            demodel.SpecificationPriceList.Add(pModel);
                            Sort += 1;
                        }
                    }
                    demodel.SpecificationList.Add(modelSpecification);


                    #region 删除规格
                    var slist = goods_SpecificationRepository.GetList(new RB_Goods_Specification_Extend() { GoodsId = demodel.Id, TenantId = demodel.TenantId, MallBaseId = demodel.MallBaseId });
                    var svlist = goods_SpecificationValueRepository.GetList(new RB_Goods_SpecificationValue_Extend() { GoodsId = demodel.Id, TenantId = demodel.TenantId, MallBaseId = demodel.MallBaseId });
                    var splist = goods_SpecificationPriceRepository.GetList(new RB_Goods_SpecificationPrice_Extend() { GoodsId = demodel.Id, TenantId = demodel.TenantId, MallBaseId = demodel.MallBaseId });
                    if (slist != null && slist.Any())
                    {
                        //删除后新增
                        goods_SpecificationRepository.DeleteBatch(slist);
                    }
                    if (svlist != null && svlist.Any())
                    {
                        goods_SpecificationValueRepository.DeleteBatch(svlist);
                    }
                    if (splist != null && splist.Any())
                    {
                        goods_SpecificationPriceRepository.DeleteBatch(splist);
                    }
                    #endregion


                    #region 新增规格
                    foreach (var item in demodel.SpecificationList)
                    {
                        int sid = goods_SpecificationRepository.Insert(new RB_Goods_Specification()
                        {
                            CreateDate = demodel.CreateDate,
                            EnabledImage = item.EnabledImage,
                            GoodsId = courseModel.MallGoodsId,
                            Id = 0,
                            MallBaseId = demodel.MallBaseId,
                            Name = item.Name,
                            Sort = item.Sort,
                            Status = 0,
                            TenantId = demodel.TenantId
                        });
                        if (sid > 0)
                        {
                            foreach (var qitem in item.SpecificationValueList)
                            {
                                goods_SpecificationValueRepository.Insert(new RB_Goods_SpecificationValue()
                                {
                                    CreateDate = demodel.CreateDate,
                                    GoodsId = courseModel.MallGoodsId,
                                    Id = 0,
                                    Image = qitem.Image,
                                    MallBaseId = demodel.MallBaseId,
                                    Name = qitem.Name,
                                    Sort = qitem.Sort,
                                    Status = 0,
                                    TenantId = demodel.TenantId,
                                    SpecificationId = sid,
                                    ClassId = qitem.ClassId
                                });
                            }
                        }
                    }
                    foreach (var item in demodel.SpecificationPriceList)
                    {
                        goods_SpecificationPriceRepository.Insert(new RB_Goods_SpecificationPrice()
                        {
                            CreateDate = demodel.CreateDate,
                            GoodsId = courseModel.MallGoodsId,
                            Id = 0,
                            GoodsNumbers = item.GoodsNumbers,
                            GoodsWeight = item.GoodsWeight,
                            InventoryNum = item.InventoryNum,
                            MallBaseId = demodel.MallBaseId,
                            SellingPrice = item.SellingPrice,
                            SpecificationSort = item.SpecificationSort,
                            Status = 0,
                            TenantId = demodel.TenantId,
                            UpdateDate = demodel.UpdateDate,
                            Commission = item.Commission,
                            CostMoney = item.CostMoney
                        });
                    }
                    #endregion
                }
                else
                {

                    var svlist = goods_SpecificationValueRepository.GetList(new RB_Goods_SpecificationValue_Extend() { GoodsId = courseModel.MallGoodsId, TenantId = Convert.ToInt32(Config.JHTenantId), MallBaseId = Convert.ToInt32(Config.JHMallBaseId) });

                    var splist = goods_SpecificationPriceRepository.GetList(new RB_Goods_SpecificationPrice_Extend() { GoodsId = courseModel.MallGoodsId, TenantId = Convert.ToInt32(Config.JHTenantId), MallBaseId = Convert.ToInt32(Config.JHMallBaseId) });
                    if (svlist != null && svlist.Any(x => x.ClassId == model.ClassId))
                    {
                        var svModel = svlist.Where(x => x.ClassId == model.ClassId).FirstOrDefault();
                        var spModel = splist.Where(x => x.SortNum == svModel.Sort).FirstOrDefault();
                        if (svModel != null && svModel.Id > 0)
                        {
                            goods_SpecificationValueRepository.Delete(svModel);
                        }
                        if (spModel != null && spModel.Id > 0)
                        {
                            goods_SpecificationPriceRepository.Delete(spModel);
                        }
                    }

                }
            }
            return flag;
        }
        #endregion

        #region 学生小程序获取我的课表

        /// <summary>
        /// 获取老师计划列表
        /// </summary>
        /// <param name="classId">班级编号</param>
        /// <param name="monthStr">月份</param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetStundentPlanModule(RB_Class_ViewModel model)
        {
            var timeList = new List<RB_Class_Time_ViewModel>();
            var planList = class_PlanRepository.GetClassPlanStatisticalRepository(new RB_Class_Plan_ViewModel() { School_Id = model.School_Id, ClassId = model.ClassId, Group_Id = model.Group_Id, StartTime = model.StartTime, EndTime = model.EndTime });

            if (planList != null && planList.Any())
            {
                string Ids = string.Join(",", planList.Select(qitem => qitem.ClassPlanId));
                if (!string.IsNullOrEmpty(Ids))
                {
                    timeList = class_TimeRepository.GetClassTimeList_V2(new RB_Class_Time_ViewModel() { QClassPlanIds = Ids });
                }
                string ClassIds = string.Join(",", planList.GroupBy(x => x.ClassId).Select(x => x.Key));
                var orderStudentList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel()
                {
                    ClassIds = ClassIds,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id
                });
                //2021-07-19 Add By:W临时上课邀请
                var tempGuestList = order_GuestRepository.GetTempInvitationGuest(new Model.ViewModel.EduTask.RB_Temporary_Invitation_ViewModel
                {
                    ClassIds = ClassIds,
                    Group_Id = model.Group_Id,
                    School_Id = model.School_Id
                });
                string timeIds = string.Join(",", timeList.Select(x => x.ClassTimeId));
                var checkList = classCheckRepository.GetClassCheckList(new RB_Class_Check_ViewModel
                {
                    ClassTimeIds = timeIds,
                    Group_Id = model.Group_Id

                });

                foreach (var item in planList.OrderBy(x => x.ClassDate))
                {
                    item.PlanTimeList = new List<RB_Class_Time_ViewModel>();
                    item.PlanTimeList = timeList.Where(x => x.ClassId == item.ClassId && (x.ClassPlanId == item.ClassPlanId || item.ClassDate == Convert.ToDateTime(Common.ConvertHelper.FormatDate(x.NewPlanDateTime)))).ToList();

                    foreach (var itemTime in item.PlanTimeList)
                    {
                        itemTime.GuestList = new List<RB_Order_Guest_ViewModel>();
                        var tempList = new List<RB_Order_Guest_ViewModel>();
                        tempList.AddRange(orderStudentList.Where(x => x.ClassId == itemTime.ClassId
                        && (x.GuestState == GuestStateEnum.Normal || x.GuestState == GuestStateEnum.StopClassesApplyIng || ((x.GuestState == GuestStateEnum.StopClasses || x.GuestState == GuestStateEnum.Graduate)
                        && x.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(x.ChangeEffectTime)) >= item.ClassDate))).ToList());
                        if (tempGuestList != null && tempGuestList.Any())
                        {
                            tempList.AddRange(tempGuestList.Where(x => x.ClassId == itemTime.ClassId
                            && itemTime.ClassTimeId == x.ClassTimeId
                            && (x.GuestState == GuestStateEnum.Normal || x.GuestState == GuestStateEnum.StopClassesApplyIng || ((x.GuestState == GuestStateEnum.StopClasses || x.GuestState == GuestStateEnum.Graduate)
                            && x.ChangeEffectTime.HasValue && Convert.ToDateTime(Common.ConvertHelper.FormatDate(x.ChangeEffectTime)) >= item.ClassDate))).ToList());
                        }
                        foreach (var sItem in tempList)
                        {
                            itemTime.GuestList.Add(new RB_Order_Guest_ViewModel()
                            {
                                Id = sItem.Id,
                                GuestName = sItem.GuestName,
                                IsCheck = 0,
                                StudentId = sItem.StudentId
                            });
                        }

                        foreach (var itemCheck in itemTime.GuestList)
                        {
                            //0-正常,1-缺勤,2-未签到
                            itemCheck.IsCheck = checkList?.Where(y => y.OrderGuestId == itemCheck.Id && y.ClassTimeId == itemTime.ClassTimeId).FirstOrDefault()?.CheckStatus ?? -1;
                        }
                    }
                }
            }
            return planList;
        }

        /// <summary>
        /// 获取老师计划列表
        /// </summary>
        /// <param name="classId">班级编号</param>
        /// <param name="monthStr">月份</param>
        /// <returns></returns>
        public List<RB_Class_Plan_ViewModel> GetStundentScheduleList(RB_Class_ViewModel model)
        {
            var planList = class_PlanRepository.GetClassPlanStatisticalRepository(new RB_Class_Plan_ViewModel() { School_Id = model.School_Id, ClassId = model.ClassId, Group_Id = model.Group_Id, StartTime = model.StartTime, EndTime = model.EndTime });
            return planList;
        }

        #endregion

        #region 上课反馈记录
        /// <summary>
        /// 反馈意见
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public bool SetFeedBack(List<RB_Class_FeedBack_ViewModel> list)
        {
            bool flag = false;
            foreach (var item in list)
            {
                if (item.FeedBackId == 0)
                {
                    flag = class_FeedBackRepository.Insert(item) > 0;
                }
                else
                {
                    Dictionary<string, object> fileds = new Dictionary<string, object>()
                    {
                        {nameof(RB_Class_FeedBack_ViewModel.Score),item.Score },
                        {nameof(RB_Class_FeedBack_ViewModel.Comment),item.Comment },
                        {nameof(RB_Class_FeedBack_ViewModel.Photo),item.Photo }
                    };
                    flag = class_FeedBackRepository.Update(fileds, new WhereHelper(nameof(RB_Class_FeedBack_ViewModel.FeedBackId), item.FeedBackId));
                }
            }
            return flag;
        }


        /// <summary>
        /// 获取班级反馈列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_FeedBack_ViewModel> GetClassFeedBackList(RB_Class_FeedBack_ViewModel query)
        {
            return class_FeedBackRepository.GetClassFeedBackList(query);
        }



        /// <summary>
        /// 获取班级反馈分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Class_FeedBack_ViewModel> GetClassFeedBackPageListRepository(int pageIndex, int pageSize, out long rowsCount, RB_Class_FeedBack_ViewModel query)
        {
            return class_FeedBackRepository.GetClassFeedBackPageListRepository(pageIndex, pageSize, out rowsCount, query);
        }
        #endregion

        /// <summary>
        /// 同业小程序获取学习学习情况
        /// </summary>
        /// <param name="student_stuId"></param>
        /// <returns></returns>
        public object AppCustomerGetClassPlan(int student_stuId)
        {
            List<object> list = new List<object>();
            var stuOrderList = student_OrderGuestRepository.GetStrOrderGuestListRepository(new RB_Student_OrderGuest_ViewModel()
            {
                Student_Id = student_stuId
            });
            if (stuOrderList != null && stuOrderList.Count > 0)
            {
                string guestIds = string.Join(",", stuOrderList.Select(qitem => qitem.GuestId));
                var checkList = classCheckRepository.GetClassCheckListRepository(new RB_Class_Check_ViewModel()
                {
                    QOrderGuestIds = guestIds
                })?.OrderByDescending(qitem => qitem.ClassDate)?.ToList();

                var groupList = checkList.GroupBy(qitem => new { qitem.OrderId, qitem.ClassName, qitem.CourseName,  })
                    .OrderByDescending(qitem => qitem.Key.OrderId)
                    .Select(qitem => new { qitem.Key.OrderId, qitem.Key.ClassName, qitem.Key.CourseName });
                foreach (var item in groupList)
                {
                    List<object> subList = new List<object>();
                    var tempSubList = checkList?.Where(qitem => qitem.OrderId == item.OrderId)?.OrderByDescending(qitem => qitem.ClassDate)?.ToList();
                    var tempOrder = stuOrderList?.FirstOrDefault(qitem => qitem.OrderId == item.OrderId);
                    list.Add(new
                    {
                        item.OrderId,
                        item.ClassName,
                        item.CourseName,
                  
                        TotalHours= tempOrder?.TotalHours??0,
                        CompleteHours= tempOrder?.CompleteHours??0,
                        SubList = tempSubList?.Select(qitem => new
                        {
                            ClassData = Common.ConvertHelper.FormatDate2(qitem.ClassDate),
                            qitem.StartTime,
                            qitem.EndTime,
                            qitem.TeacherName,
                            qitem.TeacherHead,
                            qitem.RoomName,
                        }),
                    });
                }
            }

            return list;
        }

        /// <summary>
        /// 获取学员当前订单
        /// </summary>
        /// <param name="student_stuId"></param>
        public void GetStudentCurrentOrderModule(int student_stuId, out int newClassStatus, out string classStatusName, out int classId, out decimal SurplusClassHours)
        {
            newClassStatus = 0;
            classStatusName = "";
            SurplusClassHours = 0;
            classId = 0;
            ClassStatusEnum classStatus = 0;
            GuestStateEnum StuGuestState = 0;
            List<object> list = new List<object>();
            var stuOrderList = student_OrderGuestRepository.GetStrOrderGuestListRepository(new RB_Student_OrderGuest_ViewModel()
            {
                Student_Id = student_stuId
            });
            if (stuOrderList != null && stuOrderList.Count > 0)
            {
                var firstModel = stuOrderList.Where(qitem =>
                  qitem.OrderState == OrderStateEnum.Normal
                  && qitem.ClassStatus != ClassStatusEnum.EndClass
                  && (qitem.TotalHours - qitem.CompleteHours) > 0)
                     ?.OrderBy(qitem => qitem.OrderId)
                     ?.FirstOrDefault();
                classId = firstModel?.ClassId ?? 0;
                classStatus = firstModel?.ClassStatus ?? 0;
                StuGuestState = firstModel?.StuGuestState ?? 0;
                SurplusClassHours = (firstModel?.TotalHours ?? 0) - (firstModel?.CompleteHours ?? 0);
                if (SurplusClassHours < 0)
                {
                    SurplusClassHours = 0;
                }
            }

            if (classStatus == ClassStatusEnum.NonOpenClass)
            {
                newClassStatus = 0;
                classStatusName = "未开班";
            }
            else
            {
                switch (StuGuestState)
                {
                    case GuestStateEnum.Normal:
                        newClassStatus = 1;
                        classStatusName = "学习中";
                        break;
                    case GuestStateEnum.DropOut:
                        newClassStatus = 2;
                        classStatusName = "已休学";
                        break;
                    case GuestStateEnum.StopClasses:
                        newClassStatus = 3;
                        classStatusName = "欠费";
                        break;
                    case GuestStateEnum.Graduate:
                        newClassStatus = 4;
                        classStatusName = "已结束";
                        break;
                }
            }
        }
    }
}