using Edu.AOP.CustomerAttribute;
using Edu.Common;
using Edu.Common.Enum;
using Edu.Common.Enum.Mall;
using Edu.Common.Plugin;
using Edu.Model.Entity.Mall;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.Mall;
using Edu.Model.ViewModel.Grade;
using Edu.Model.ViewModel.Question;
using Edu.Model.ViewModel.User;
using Edu.Repository.Course;
using Edu.Repository.Question;
using Edu.Repository.User;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using VT.FW.DB;
using Edu.Repository.Grade;
using Edu.Common.Enum.Question;
using System.Threading.Tasks;

namespace Edu.Module.Course
{
    /// <summary>
    /// 课程处理类
    /// </summary>
    public class CourseModule
    {
        /// <summary>
        /// 课程章节仓储层对象
        /// </summary>
        private readonly RB_Course_ChapterRepository chapterRepository = new RB_Course_ChapterRepository();

        /// <summary>
        /// 课程讨论仓储层对象
        /// </summary>
        private readonly RB_Course_DiscussRepository discussRepository = new RB_Course_DiscussRepository();

        /// <summary>
        /// 课程通知仓储层对象
        /// </summary>
        private readonly RB_Course_NoticeRepository noticeRepository = new RB_Course_NoticeRepository();

        /// <summary>
        /// 课程通知接收仓储层对象
        /// </summary>
        private readonly RB_Course_NoticeReviceRepository noticeReviceRepository = new RB_Course_NoticeReviceRepository();

        /// <summary>
        /// 课程设置仓储层对象
        /// </summary>
        private readonly RB_Course_SettingRepository settingRepository = new RB_Course_SettingRepository();

        /// <summary>
        /// 课程资料仓储层对象
        /// </summary>
        private readonly RB_Course_SourceRepository sourceRepository = new RB_Course_SourceRepository();

        /// <summary>
        /// 课程教案仓储层对象
        /// </summary>
        private readonly RB_Course_TeachPlanRepository teachPlanRepository = new RB_Course_TeachPlanRepository();

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

        /// <summary>
        /// 课程作业仓储层对象
        /// </summary>
        private readonly RB_Course_JobRepository courseJobRepository = new RB_Course_JobRepository();

        /// <summary>
        /// 课程作业详情仓储层对象
        /// </summary>
        private readonly RB_Course_JobDetailsRepository course_JobDetailsRepository = new RB_Course_JobDetailsRepository();

        /// <summary>
        /// 课程分类处理类
        /// </summary>
        private readonly CourseCategoryModule courseCategoryModule = new CourseCategoryModule();

        /// <summary>
        /// 课程阶梯价格仓储层对象
        /// </summary>
        private readonly RB_Course_StepPriceRepository course_StepPriceRepository = new RB_Course_StepPriceRepository();

        /// <summary>
        /// 课程优惠仓储层对象
        /// </summary>
        private readonly RB_Course_PreferentialRepository course_PreferentialRepository = new RB_Course_PreferentialRepository();

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

        /// <summary>
        /// 问题仓储层对象
        /// </summary>
        private readonly RB_QuestionRepository questionRepository = new RB_QuestionRepository();

        /// <summary>
        /// 班级仓储层对象
        /// </summary>
        private readonly RB_ClassRepository classRepository = new RB_ClassRepository();

        /// <summary>
        /// 班级基础配置仓储层对象
        /// </summary>
        private readonly RB_Class_ConfigRepository class_ConfigRepository = new RB_Class_ConfigRepository();

        /// <summary>
        /// 非法用户信息
        /// </summary>
        private readonly RB_Class_Time_UnKnowRepository unKnowRepository = new RB_Class_Time_UnKnowRepository();

        /// <summary>
        /// 课程单词仓储层对象
        /// </summary>
        private readonly RB_Course_WordsRepository course_WordsRepository = new RB_Course_WordsRepository();

        #region 课程管理

        public List<RB_Course_ViewModel> GetAllCourseChapterCountModule(int groupId, int courseId)
        {
            return courseRepository.GetCourseAllChapterCount(groupId, courseId) ?? new List<RB_Course_ViewModel>();
        }

        /// <summary>
        /// 获取课程列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Course_ViewModel> GetCourseListModule(RB_Course_ViewModel query)
        {
            var list = courseRepository.GetCourseListRepository(query);
            if (query.IsQPrice == 1 && list != null && list.Count > 0)
            {
                var ids = string.Join(",", list.Select(qitem => qitem.CourseId));
                var preferentialList = course_PreferentialRepository.GetCoursePreferentialListRepostory(new RB_Course_Preferential_Extend()
                {
                    QCourseIds = ids
                });
                foreach (var item in list)
                {
                    item.PreferentialList = preferentialList?.Where(qitem => qitem.CourseId == item.CourseId)?.OrderBy(qitem => qitem.PriceDiscountType)?.ToList() ?? new List<RB_Course_Preferential_Extend>();
                }
            }
            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_Course_ViewModel> GetCoursePageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Course_ViewModel query)
        {
            if (!string.IsNullOrWhiteSpace(query.QCateIds) && query.QCateIds != "0")
            {
                string cateIds = courseCategoryModule.GetChildCategoryStringModule(query.QCateIds);
                if (!string.IsNullOrWhiteSpace(cateIds))
                {
                    query.QCateIds = cateIds;
                }
            }
            var list = courseRepository.GetCoursePageListRepository(pageIndex, pageSize, out rowsCount, query);
            var bankTypeList=EnumHelper.EnumToList(typeof(LevelTypeEnum));
            if (list != null && list.Count > 0)
            {
                var ids = string.Join(",", list.Select(qitem => qitem.CourseId));
                var preferentialList = new List<RB_Course_Preferential_Extend>();
                List<RB_Teacher_ViewModel> teacherList = new List<RB_Teacher_ViewModel>();
                if (query.IsQPrice == 1)
                {
                    preferentialList = course_PreferentialRepository.GetCoursePreferentialListRepostory(new RB_Course_Preferential_Extend()
                    {
                        QCourseIds = ids
                    });
                }
                if (query.IsQTeacher == 1)
                {
                    var teacherids = string.Join(",", list.Where(qitem => !string.IsNullOrEmpty(qitem.Teacher_Ids)).Select(qitem => qitem.Teacher_Ids));
                    teacherList = teacherRepository.GetTeacherListRepository(new RB_Teacher_ViewModel() { QTIds = teacherids });
                }

                foreach (var item in list)
                {
                    item.OpenBankLevelList = new List<int>();
                    if (!string.IsNullOrEmpty(item.OpenBankLevel))
                    {
                        item.OpenBankLevelList = Common.Plugin.JsonHelper.DeserializeObject<List<int>>(item.OpenBankLevel);
                    }
                    item.OpenBankLevelNameList = new List<string>();
                    if (item.OpenBankLevelList != null && item.OpenBankLevelList.Count > 0)
                    {
                        foreach (var bItem in item.OpenBankLevelList)
                        {
                            var tempBank = bankTypeList.Where(qitem => qitem.Id == bItem).FirstOrDefault();
                            item.OpenBankLevelNameList.Add(tempBank.Name);
                        }
                    }
                    item.PreferentialList = preferentialList?.Where(qitem => qitem.CourseId == item.CourseId)?.OrderBy(qitem => qitem.PriceDiscountType)?.ToList() ?? new List<RB_Course_Preferential_Extend>();
                    item.TeacherList = new List<RB_Teacher_ViewModel>();
                    if (item.TeacherIdList != null && item.TeacherIdList.Count > 0)
                    {
                        foreach (var subItem in item.TeacherIdList)
                        {
                            var teacher = teacherList?.Where(qitem => qitem.TId == subItem)?.FirstOrDefault();
                            if (teacher != null && teacher.TId > 0)
                            {
                                item.TeacherList.Add(teacher);
                            }
                        }
                    }
                }
            }
            return list;
        }

        /// <summary>
        /// 根据课程编号获取课程实体
        /// </summary>
        /// <param name="CourseId"></param>
        /// <param name="IsGetDiscount">是否获取优惠信息</param>
        /// <returns></returns>
        public RB_Course_ViewModel GetCourseModule(object CourseId, int IsGetDiscount = 0)
        {
            var extModel = courseRepository.GetEntity<RB_Course_ViewModel>(CourseId);
            if (extModel != null && extModel.CourseId > 0)
            {
                var stepPriceList = course_StepPriceRepository.GetCourseStepPriceListRepository(new RB_Course_StepPrice_ViewModel()
                {
                    CourseId = extModel.CourseId
                });
                extModel.StepPriceList = stepPriceList ?? new List<RB_Course_StepPrice_ViewModel>();
                if (IsGetDiscount == 1)
                {
                    var coursePreferentiaList = GetCoursePreferentialListModule(new RB_Course_Preferential_Extend() { CourseId = extModel.CourseId });
                    extModel.PreferentialList = coursePreferentiaList ?? new List<RB_Course_Preferential_Extend>();
                }
                if (extModel.MallGoodsId > 0)//小程序端查询出当前商品对应的分类
                {
                    extModel.CategoryList = new List<RB_Goods_Category_Extend>();
                    var query = new RB_Goods_Category_Extend()
                    {
                        GoodsId = extModel.MallGoodsId,
                        TenantId = Convert.ToInt32(Config.JHTenantId),
                        MallBaseId = Convert.ToInt32(Config.JHMallBaseId)
                    };
                    var clist = courseRepository.GetGoodsCategoryListRepository(query);
                    extModel.CategoryList = clist;
                }
                if (!string.IsNullOrEmpty(extModel.OpenBankLevel))
                {
                    extModel.OpenBankLevelList = Common.Plugin.JsonHelper.DeserializeObject<List<int>>(extModel.OpenBankLevel);
                }
            }
            return extModel;
        }

        /// <summary>
        /// 新增修改课程
        /// </summary>
        /// <returns></returns>
        public virtual bool SetCourseModule(RB_Course_ViewModel model, out int courseId)
        {
            bool flag = courseRepository.SetCourseRepository(model, out courseId);
            return flag;
        }

        /// <summary>
        /// 是否显示章节编号
        /// </summary>
        /// <param name="CourseId"></param>
        /// <param name="IsShowChapterNo">是否显示章节编号(1-显示,0-不显示)</param>
        /// <returns></returns>
        public bool SetCourseIsShowChapterNoModule(int CourseId, int IsShowChapterNo)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_ViewModel.IsShowChapterNo),IsShowChapterNo },
            };
            bool flag = courseRepository.Update(fileds, new WhereHelper(nameof(RB_Course_ViewModel.CourseId), CourseId));
            return flag;
        }

        /// <summary>
        /// 设置课程教师
        /// </summary>
        /// <param name="CourseId"></param>
        /// <param name="Teacher_Id">教师编号</param>
        /// <returns></returns>
        public bool SetCourseTeacherModule(int CourseId, int Teacher_Id)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_ViewModel.Teacher_Ids),Teacher_Id },
            };
            bool flag = courseRepository.Update(fileds, new WhereHelper(nameof(RB_Course_ViewModel.CourseId), CourseId));
            return flag;
        }

        /// <summary>
        /// 修改课程状态
        /// </summary>
        /// <param name="CourseId"></param>
        /// <param name="Status">1-删除,0-启用</param>
        /// <param name="message"></param>
        /// <returns></returns>
        public bool RemoveCourseModule(int CourseId, int Status, out string message)
        {
            message = "";
            var classList = classRepository.GetClassListRepository(new RB_Class_ViewModel()
            {
                CouseId = CourseId
            });
            if (classList != null && classList.Count > 0)
            {
                message = "此课程下存在正常的班级信息,不能删除!";
                return false;
            }
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_ViewModel.Status),Status},
            };
            bool flag = courseRepository.Update(fileds, new WhereHelper(nameof(RB_Course_ViewModel.CourseId), CourseId));
            return flag;
        }

        #endregion

        #region 课程通知管理
        /// <summary>
        /// 获取课程通知分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Course_Notice_ViewModel> GetNoticePageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Course_Notice_ViewModel query)
        {
            return noticeRepository.GetNoticePageListRepository(pageIndex, pageSize, out rowsCount, query);
        }

        /// <summary>
        /// 新增修改课程通知
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetNoticeModule(RB_Course_Notice_ViewModel model)
        {
            bool flag;
            if (model.NoticeId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_Notice_ViewModel.Title),model.Title }
                };
                flag = noticeRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Notice_ViewModel.NoticeId), model.NoticeId));
            }
            else
            {
                var newId = noticeRepository.Insert(model);
                model.NoticeId = newId;
                flag = newId > 0;
            }
            return flag;
        }

        /// <summary>
        /// 获取课程通知实体
        /// </summary>
        /// <param name="NoticeId"></param>
        /// <returns></returns>
        public RB_Course_Notice_ViewModel GetNoticeModule(object NoticeId)
        {
            return noticeRepository.GetEntity<RB_Course_Notice_ViewModel>(NoticeId);
        }

        /// <summary>
        /// 根据通知编号删除通知
        /// </summary>
        /// <param name="NoticeId"></param>
        /// <returns></returns>
        public bool RemoveNoticeModule(object NoticeId)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Notice_ViewModel.Status), (int)DateStateEnum.Delete}
            };
            bool flag = noticeRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Notice_ViewModel.NoticeId), NoticeId));
            return flag;
        }

        /// <summary>
        /// 新增通知阅读
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool AddNoticeReviceModule(RB_Course_NoticeRevice_ViewModel model)
        {
            var newId = noticeReviceRepository.Insert(model);
            model.ReviceId = newId;
            return newId > 0;
        }

        #endregion

        #region 课程章节管理


        /// <summary>
        /// 获取课程章节列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Course_Chapter_ViewModel> GetChapterListModule(RB_Course_Chapter_ViewModel query, bool isQueryWords = false)
        {
            var list= chapterRepository.GetChapterListRepository(query);
            if (isQueryWords)
            {
                List<RB_Course_Words_Extend> courseWordsList = new List<RB_Course_Words_Extend>();
                if (query.CourseId > 0)
                {
                    courseWordsList = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend() { CourseId = query.CourseId }).OrderBy(qitem => qitem.ChapterId).ToList();
                }
                foreach (var item in list)
                {
                    Int32.TryParse(item.ChapterNo, out int ChapterNo);
                    item.WordsList = courseWordsList?.Where(qitem => qitem.ChapterId == ChapterNo).ToList();
                }
            }
            return list;
        }

        /// <summary>
        /// 批量导入课程章节和单词
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public virtual bool ImportChapterModule(RB_Course_Chapter_ViewModel query)
        {
            bool flag = false;
            var courseWordsList = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend()
            {
                Group_Id = query.Group_Id,
                QCourseIds = query.CourseIds
            });

            List<RB_Course_Words_Extend> wordsList = new List<RB_Course_Words_Extend>();
            List<RB_Course_Chapter_ViewModel> list = new List<RB_Course_Chapter_ViewModel>();
            var treeList = GetChapterTreeListModule(query);
            var oldTreeList = GetChapterTreeListModule(new RB_Course_Chapter_ViewModel()
            {
                Group_Id=query.Group_Id,
                CourseId=query.NewCourseId
            });
            var oldChapterNo = oldTreeList?.LastOrDefault()?.ChapterNo ?? "0";
            Int32.TryParse(oldChapterNo, out int oldChapterNum);
            int maxLength = oldChapterNum > 0 ? oldChapterNum : query.MaxLength;
            string[] ids = query.CourseIds.Split(',', System.StringSplitOptions.RemoveEmptyEntries);
            DateTime startTime = DateTime.Now;
            foreach (var item in ids)
            {
                var tempList = treeList.Where(x => x.CourseId.ToString().Equals(item)).ToList();
                var tempWordsList = courseWordsList.Where(qitem => qitem.CourseId.ToString().Equals(item))?.OrderBy(qitem => qitem.ChapterId)?.ToList();
                foreach (var subItem in tempList)
                {
                    maxLength++;
                    if (subItem.ParentId == 0)
                    {
                        subItem.WordsList = courseWordsList?.Where(qitem => qitem.CourseId == subItem.CourseId && qitem.ChapterId.ToString().Equals(subItem.ChapterNo))?.ToList();
                        if (subItem.ParentId == 0 && subItem.WordsList != null)
                        {
                            foreach (var sItem in subItem.WordsList)
                            {
                                wordsList.Add(new RB_Course_Words_Extend()
                                {
                                    Id = 0,
                                    CourseId = query.NewCourseId,
                                    ChapterId = maxLength,
                                    WordType = sItem.WordType,
                                    WordContent = sItem.WordContent,
                                    WordTone = sItem.WordTone,
                                    WordWrite = sItem.WordWrite,
                                    ChineseMean = sItem.ChineseMean,
                                    FileUrl = sItem.FileUrl,
                                    Status = sItem.Status,
                                    Group_Id = sItem.Group_Id,
                                    CreateBy = query.CreateBy,
                                    UpdateBy = query.CreateBy,
                                    UpdateTime = DateTime.Now,
                                    CreateTime = startTime,
                                });
                            }
                        }
                      
                    }
                    var parentModel = new RB_Course_Chapter_ViewModel()
                    {
                        ChapterId = 0,
                        CourseId = query.NewCourseId,
                        ChapterNo = maxLength.ToString(),
                        ChapterName = FormatNum(subItem.ChapterName, maxLength),
                        ChapterContent = subItem.ChapterContent,
                        ParentId = 0,
                        OpenStatus = 1,
                        Progress = 0,
                        CreateBy = query.CreateBy,
                        CreateTime = DateTime.Now,
                        UpdateBy = query.CreateBy,
                        UpdateTime = DateTime.Now,
                        Status = DateStateEnum.Normal,
                        School_Id = query.School_Id,
                        Group_Id = query.Group_Id,
                        SortNum = maxLength,
                        StudyHours = subItem.StudyHours,
                        StudyMinutes = subItem.StudyMinutes,
                        Objectives = subItem.Objectives,
                        Requirement = subItem.Requirement,
                        CourseRate = subItem.CourseRate,
                        CurrentHours = subItem.CurrentHours,
                        ChapterGradeNo = subItem.ChapterGradeNo
                    };
                    //父节点
                    list.Add(parentModel);

                    if (subItem.ChildList != null && subItem.ChildList.Count > 0)
                    {
                        TraverseChildChapter(subItem.ChildList,parentModel.ChapterNo, maxLength,subItem.ChapterId, query, ref list);
                    }
                }
            }
            if (list != null && list.Count > 0)
            {
                flag = chapterRepository.SetBatchInsertCourseChapterRepository(list);
            }
            var dataList = chapterRepository.GetChapterListRepository(new RB_Course_Chapter_ViewModel()
            {
                CourseId = query.NewCourseId,
                QCreateTime = Common.ConvertHelper.FormatTime(startTime)
            });
            List<RB_Course_Chapter_ViewModel> parentList = new List<RB_Course_Chapter_ViewModel>();
            foreach (var item in dataList.Where(qitem=>qitem.ParentId>0))
            {
                var tempModel = dataList.Where(qitem => qitem.ChapterNo == item.ParentId.ToString())?.FirstOrDefault();
                item.ParentId = tempModel?.ChapterId ?? 0;
                parentList.Add(item);
            }
            if (wordsList != null && wordsList.Count > 0)
            {
                course_WordsRepository.BatchInsertCourseWordsRepository(wordsList);
            }
            if (parentList != null && parentList.Count > 0)
            {
                chapterRepository.SetBatchUpdateChapterNoRepository(parentList);
            }

            SetBatchAllChapterCurrentHoursModule(query.NewCourseId);
            return flag;
        }

        /// <summary>
        /// 遍历子节点
        /// </summary>
        /// <param name="nodeList"></param>
        /// <param name="parentId"></param>
        public void TraverseChildChapter(List<ChapterTree_ViewModel> sourceList,string ChapterNo,int Num, int parentId, RB_Course_Chapter_ViewModel query, ref List<RB_Course_Chapter_ViewModel> list)
        {
            if (sourceList != null)
            {
                int subIndex = 0;
                foreach (var subItem in sourceList.Where(qitem => qitem.ParentId == parentId))
                {
                    subIndex++;

                    var oldNo = subItem.ChapterNo.Split('.');
                    oldNo[0] = ChapterNo;
                    string newChapterNo = string.Join(".", oldNo);
                    var model = new RB_Course_Chapter_ViewModel()
                    {
                        ChapterId = 0,
                        CourseId = query.NewCourseId,
                        ChapterNo = newChapterNo,
                        ChapterName = subItem.ChapterName,
                        ChapterContent = subItem.ChapterContent,
                        ParentId = Num,
                        OpenStatus = 1,
                        Progress = 0,
                        CreateBy = query.CreateBy,
                        CreateTime = DateTime.Now,
                        UpdateBy = query.CreateBy,
                        UpdateTime = DateTime.Now,
                        Status = DateStateEnum.Normal,
                        School_Id = query.School_Id,
                        Group_Id = query.Group_Id,
                        SortNum = 0,
                        StudyHours = subItem.StudyHours,
                        StudyMinutes = subItem.StudyMinutes,
                        Objectives = subItem.Objectives,
                        Requirement = subItem.Requirement,
                        CourseRate = subItem.CourseRate,
                        CurrentHours = subItem.CurrentHours,
                    };
                    list.Add(model);
                    if (subItem.ChildList != null && subItem.ChildList.Count > 0)
                    {
                        TraverseChildChapter(subItem.ChildList,subItem.ChapterNo, subIndex, subItem.ChapterId, query, ref list);
                    }
                }
            }
        }

        /// <summary>
        /// 重新生成单元标题序号
        /// </summary>
        /// <returns></returns>
        public string FormatNum(string name, int length)
        {
            Regex regex = new Regex(@"(?<=第)(.*?)(?=单|次|课|章|节)");
            string temp = regex.Match(name).Value;
            if (!string.IsNullOrEmpty(temp))
            {
                var newTemp = new WordToNumHelper().NumToChinese(length.ToString());
                name = name.Replace(temp, newTemp);
            }
            return name;
        }

        /// <summary>
        /// 获取课程章节树形列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<ChapterTree_ViewModel> GetChapterTreeListModule(RB_Course_Chapter_ViewModel query)
        {
            var list = GetChapterListModule(query);
            list.ForEach(x =>
            {
                Int32.TryParse(x.ChapterNo.Replace(".", ""), out int ChapterNo);
                x.SerialNumber = ChapterNo;
            });
            List<ChapterTree_ViewModel> treeList = GetChapterChild(list, 0);
            return treeList;
        }

        /// <summary>
        /// 获取课程章节树形列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<ChapterTree_ViewModel> GetChapterTreeListModule_V2(RB_Course_Chapter_ViewModel query)
        {
            var list = GetChapterListModule(query);
            list.ForEach(x =>
            {
                Int32.TryParse(x.ChapterNo.Replace(".", ""), out int ChapterNo);
                x.SerialNumber = ChapterNo;
            });
            List<ChapterTree_ViewModel> treeList = GetChapterChild_V2(list, 0);
            return treeList;
        }

        public List<ChapterTree_ViewModel> GetMatchHoursChapterModule(int courseId, double currentHours)
        {
            var list = chapterRepository.GetMatchHoursChapterRepository(courseId, currentHours);
            list.ForEach(x =>
            {
                x.SerialNumber = int.Parse(x.ChapterNo.Replace(".", ""));
            });
            List<ChapterTree_ViewModel> treeList = GetChapterChild(list, 0);
            return treeList;
        }


        /// <summary>
        /// 查询符合的课程章节
        /// </summary>
        /// <param name="courseId"></param>
        /// <param name="currentHours"></param>
        /// <returns></returns>
        public List<ChapterTree_ViewModel> GetMatchChapterRepository(int courseId, string currentHours)
        {
            var list = chapterRepository.GetMatchChapterRepository(courseId, currentHours);
            list.ForEach(x =>
            {
                x.SerialNumber = int.Parse(x.ChapterNo.Replace(".", ""));
            });
            List<ChapterTree_ViewModel> treeList = GetChapterChild(list, 0);
            return treeList;
        }

        /// <summary>
        /// 递归遍历所有章节
        /// </summary>
        /// <param name="sourceList">源数据</param>
        /// <param name="parentId">父节点编号</param>
        /// <returns></returns>
        public List<ChapterTree_ViewModel> GetChapterChild(List<RB_Course_Chapter_ViewModel> sourceList, int parentId)
        {
            List<ChapterTree_ViewModel> resultList = new List<ChapterTree_ViewModel>();
            //获取下级节点
            var subList = sourceList?.Where(qItem => qItem.ParentId == parentId).OrderBy(qitem => qitem.SerialNumber).ToList();
            //如果存在下级节点
            if (subList != null && subList.Count > 0)
            {
                foreach (var childItem in subList)
                {
                    var childModel = new ChapterTree_ViewModel()
                    {
                        ChapterId = childItem.ChapterId,
                        ParentId = childItem.ParentId,
                        ChapterContent = childItem.ChapterContent,
                        ChapterName = childItem.ChapterName,
                        ChapterNo = childItem.ChapterNo,
                        CourseId = childItem.CourseId,
                        ChildList = new List<ChapterTree_ViewModel>(),
                        OpenStatus = childItem.OpenStatus,
                        Progress = childItem.Progress,
                        StudyHours = childItem.StudyHours,
                        Objectives = childItem.Objectives,
                        Requirement = childItem.Requirement,
                        CourseRate = childItem.CourseRate,
                        StudyMinutes = childItem.StudyMinutes,
                        CurrentHours = childItem.CurrentHours,
                        CourseRateName = EnumHelper.ToName(childItem.CourseRate),
                        ChapterGradeNo = childItem.ChapterGradeNo
                    };
                    childModel.ChildList.AddRange(GetChapterChild(sourceList, childItem.ChapterId));
                    resultList.Add(childModel);
                }
            }
            return resultList;
        }

        /// <summary>
        /// 递归遍历所有章节
        /// </summary>
        /// <param name="sourceList">源数据</param>
        /// <param name="parentId">父节点编号</param>
        /// <returns></returns>
        public List<ChapterTree_ViewModel> GetChapterChild_V2(List<RB_Course_Chapter_ViewModel> sourceList, int parentId)
        {
            List<ChapterTree_ViewModel> resultList = new List<ChapterTree_ViewModel>();
            //获取下级节点
            var subList = sourceList?.Where(qItem => qItem.ParentId == parentId).OrderBy(qitem => qitem.SerialNumber).ToList();
            //如果存在下级节点
            if (subList != null && subList.Count > 0)
            {
                foreach (var childItem in subList)
                {
                    var childModel = new ChapterTree_ViewModel()
                    {
                        ChapterId = childItem.ChapterId,
                        ParentId = childItem.ParentId,
                        ChapterName = childItem.ChapterName,
                        ChapterNo = childItem.ChapterNo,
                        CourseId = childItem.CourseId,
                        ChildList = new List<ChapterTree_ViewModel>(),
                        OpenStatus = childItem.OpenStatus,
                        Progress = childItem.Progress
                    };
                    childModel.ChildList.AddRange(GetChapterChild_V2(sourceList, childItem.ChapterId));
                    resultList.Add(childModel);
                }
            }
            return resultList;
        }

        /// <summary>
        /// 批量导入课程章节信息
        /// </summary>
        /// <param name="courseId"></param>
        /// <returns></returns>
        public bool SetBatchAllChapterCurrentHoursModule(int courseId)
        {
            RB_Course_Chapter_ViewModel query = new RB_Course_Chapter_ViewModel()
            {
                CourseId = courseId
            };
            var result = GetChapterTreeListModule(query);
            List<RB_Course_Chapter_ViewModel> list = new List<RB_Course_Chapter_ViewModel>();
            var currentHours = 0.00;
            result.ForEach(x =>
            {
                if (x.ChildList != null && x.ChildList.Count > 0)
                {
                    list.Add(new RB_Course_Chapter_ViewModel()
                    {
                        ChapterId = x.ChapterId,
                        CurrentHours = -1.00
                    });
                    x.ChildList.ForEach(y =>
                    {
                        if (y.StudyHours > 0)
                        {
                            list.Add(new RB_Course_Chapter_ViewModel()
                            {
                                ChapterId = y.ChapterId,
                                CurrentHours = currentHours
                            });
                            currentHours += y.StudyHours;
                        }
                        else
                        {
                            list.Add(new RB_Course_Chapter_ViewModel()
                            {
                                ChapterId = y.ChapterId,
                                CurrentHours = -1.00
                            });
                        }
                    });
                }
                else
                {
                    if (x.StudyHours > 0)
                    {
                        list.Add(new RB_Course_Chapter_ViewModel()
                        {
                            ChapterId = x.ChapterId,
                            CurrentHours = currentHours
                        });
                        currentHours += x.StudyHours;
                    }
                    else
                    {
                        list.Add(new RB_Course_Chapter_ViewModel()
                        {
                            ChapterId = x.ChapterId,
                            CurrentHours = -1
                        });
                    }
                }
            });
            if (list != null && list.Count > 0)
            {
                return chapterRepository.SetBatchCurrentHoursRepository(list);
            }
            return false;
        }

        /// <summary>
        /// 新增修改课程章节
        /// </summary>
        /// <returns></returns>
        public bool SetChapterModule(RB_Course_Chapter_ViewModel model)
        {
            bool flag;
            if (model.StudyMinutes > 0)
            {
                model.StudyHours = model.StudyMinutes / Convert.ToDouble(class_ConfigRepository.GetBasicMinutesRepository(model.Group_Id));
            }
            if (model.ChapterId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_Chapter_ViewModel.ChapterNo) ,model.ChapterNo},
                    {nameof(RB_Course_Chapter_ViewModel.ChapterName) ,model.ChapterName},
                    {nameof(RB_Course_Chapter_ViewModel.ChapterContent) ,model.ChapterContent},
                    {nameof(RB_Course_Chapter_ViewModel.ParentId) ,model.ParentId},
                    {nameof(RB_Course_Chapter_ViewModel.StudyHours) ,model.StudyHours},
                    {nameof(RB_Course_Chapter_ViewModel.StudyMinutes) ,model.StudyMinutes},
                    {nameof(RB_Course_Chapter_ViewModel.Objectives) ,model.Objectives},
                    {nameof(RB_Course_Chapter_ViewModel.Requirement) ,model.Requirement},
                    {nameof(RB_Course_Chapter_ViewModel.CourseRate) ,model.CourseRate},
                };
                Common.Enum.Course.CourseRateEnum oldCourseRate = 0;
                if (model.ParentId == 0)
                {
                    fileds.Add(nameof(RB_Course_Chapter_ViewModel.SortNum), Convert.ToDouble(model.ChapterNo));
                    oldCourseRate = chapterRepository.GetEntity(model.ChapterId)?.CourseRate ?? Common.Enum.Course.CourseRateEnum.OTHER;
                }
                flag = chapterRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Chapter_ViewModel.ChapterId), model.ChapterId));
                if (flag && model.ParentId == 0) {                    
                    if (oldCourseRate != model.CourseRate) {
                        //修改了等级了  重新初始化
                        System.Threading.Tasks.Task.Run(() =>
                        {
                            chapterRepository.SetInitChapterGradeNo(model.CourseId, model.ChapterNo, model.Group_Id);
                        }); 
                    }
                }
            }
            else
            {
                if (model.ParentId == 0) {
                    //查询当前等级对应的NO
                    int CourseGradeId = chapterRepository.GetMaxChapterGradeNo(model.CourseId, model.ChapterNo, model.CourseRate, model.Group_Id);
                    model.ChapterGradeNo = CourseGradeId + 1;
                }
                var newId = chapterRepository.Insert(model);
                model.ChapterId = newId;
                flag = newId > 0;               
            }
            SetBatchAllChapterCurrentHoursModule(model.CourseId);
            return flag;
        }

        /// <summary>
        /// 批量更新当前课时
        /// </summary>
        /// <param name="courseId"></param>
        /// <returns></returns>
        public virtual List<RB_Course_Chapter_ViewModel> BatchUpdateChapterCurrentHoursModule(int courseId)
        {
            List<RB_Course_Chapter_ViewModel> chapterList = new List<RB_Course_Chapter_ViewModel>();
            List<ChapterTree_ViewModel> treeList = GetChapterTreeListModule(new RB_Course_Chapter_ViewModel() { CourseId = courseId });
            CalcChapterClassHours(treeList, chapterList);
            var resultList = chapterList;
            if (resultList != null && resultList.Count > 0)
            {
                for (var i = 0; i < resultList.Count; i++)
                {
                    resultList[i].CurrentHours = resultList.Where(qitem => qitem.SerialNumber <= (i + 1)).Sum(qitem => qitem.StudyHours);
                }
            }
            return resultList;
        }

        /// <summary>
        /// 计算
        /// </summary>
        /// <param name="treeList"></param>
        /// <param name="chapterList"></param>
        public void CalcChapterClassHours(List<ChapterTree_ViewModel> treeList, List<RB_Course_Chapter_ViewModel> chapterList)
        {
            foreach (var item in treeList)
            {
                RB_Course_Chapter_ViewModel model = new RB_Course_Chapter_ViewModel()
                {
                    ChapterId = item.ChapterId,
                    ChapterNo = item.ChapterNo,
                    ChapterName = item.ChapterName,
                    SerialNumber = chapterList.Count() + 1,
                };
                if (item.ChildList != null && item.ChildList.Count > 0)
                {
                    model.StudyHours = 0;
                }
                else
                {
                    model.StudyHours = item.StudyHours;
                }
                chapterList.Add(model);
                if (item.ChildList != null && item.ChildList.Count > 0)
                {
                    CalcChapterClassHours(item.ChildList, chapterList);
                }
            }
        }

        /// <summary>
        /// 获取章节实体类
        /// </summary>
        /// <param name="ChapterId"></param>
        /// <returns></returns>
        public RB_Course_Chapter_ViewModel GetChapterModule(object ChapterId)
        {
            return chapterRepository.GetEntity<RB_Course_Chapter_ViewModel>(ChapterId);
        }

        /// <summary>
        /// 删除章节
        /// </summary>
        /// <param name="ChapterId"></param>
        /// <returns></returns>
        public bool RemoveChapterModule(object ChapterId)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Chapter_ViewModel.Status) ,(int)DateStateEnum.Delete},
            };
            bool flag = chapterRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Chapter_ViewModel.ChapterId), ChapterId));
            return flag;
        }

        /// <summary>
        /// 批量删除章节
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public bool BatchRemoveChapterModule(RB_Course_Chapter_ViewModel model)
        {
            var flag = chapterRepository.DeleteBatchChpterRepository(model);
            SetBatchAllChapterCurrentHoursModule(model.CourseId);
            return flag;
        }

        /// <summary>
        /// 批量更新等级
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool BatchUpdateChapterRateModule(RB_Course_Chapter_ViewModel model)
        {
            return chapterRepository.SetBatchUpdateCourseRateRepository(model);
        }

        /// <summary>
        /// 设置章节开发状态
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetChapterOpenStatusModule(RB_Course_Chapter_ViewModel model)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Chapter_ViewModel.OpenStatus) ,model.OpenStatus},
                {nameof(RB_Course_Chapter_ViewModel.OpenStart) ,model.OpenStart},
                {nameof(RB_Course_Chapter_ViewModel.OpenEnd) ,model.OpenEnd},
            };
            bool flag = chapterRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Chapter_ViewModel.ChapterId), model.ChapterId));
            return flag;
        }

        /// <summary>
        /// 设置章节名称
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetChapterNameModule(RB_Course_Chapter_ViewModel model)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Chapter_ViewModel.ChapterName) ,model.ChapterName}
            };
            bool flag = chapterRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Chapter_ViewModel.ChapterId), model.ChapterId));
            return flag;
        }

        /// <summary>
        /// 批量更新编号
        /// </summary>
        /// <param name="chapters"></param>
        /// <returns></returns>
        public bool SetBatchChapterNoModule(List<RB_Course_Chapter_ViewModel> chapters)
        {
            var flag = chapterRepository.SetBatchUpdateChapterNoRepository(chapters);
            return flag;
        }

        /// <summary>
        /// 设置章节进度
        /// </summary>
        /// <param name="ChapterId"></param>
        /// <param name="Progress"></param>
        /// <returns></returns>
        public bool SetChapterProgressModule(object ChapterId, int Progress)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Chapter_ViewModel.Progress) ,Progress},
            };
            bool flag = chapterRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Chapter_ViewModel.ChapterId), ChapterId));
            return flag;
        }

        /// <summary>
        /// 重新更新课程章节
        /// </summary>
        public void RunCourseChapterModule()
        {
            var courseList = chapterRepository.GetCourseChapterListExtRepository();
            if (courseList != null && courseList.Count > 0)
            {
                foreach (var item in courseList)
                {
                   
                    //if (item.CourseId == 285 || item.CourseId == 215 )
                    //{
                    //    continue;
                    //}
                    //else
                    //{
                
                    //}

                    List<RB_Course_Chapter_ViewModel> result = new List<RB_Course_Chapter_ViewModel>();
                    var chapterQuery = new RB_Course_Chapter_ViewModel() { CourseId = item.CourseId };
                    var sourceList = GetChapterListModule(chapterQuery,isQueryWords:true);
                    var treeList= GetChapterTreeListModule(chapterQuery);
                    if (treeList != null && treeList.Count>0)
                    {
                        foreach (var tItem in treeList)
                        {
                            var rootModel= sourceList.Where(qitem => qitem.ChapterId == tItem.ChapterId).FirstOrDefault();
                            if (tItem.ChildList == null || (tItem.ChildList != null && tItem.ChildList.Count == 0))
                            {
                                var rootModel1 = JsonHelper.DeserializeObject<RB_Course_Chapter_ViewModel>(JsonHelper.Serialize(rootModel));
                                rootModel1.ChapterName += "(1)";
                                rootModel1.StudyHours = 2;
                                rootModel1.StudyMinutes = 90;
                                result.Add(rootModel1);

                                var rootModel2 = JsonHelper.DeserializeObject<RB_Course_Chapter_ViewModel>(JsonHelper.Serialize(rootModel));
                                rootModel2.ChapterName += "(2)";
                                rootModel2.StudyHours = 2;
                                rootModel2.StudyMinutes = 90;
                                rootModel.WordsList = new List<RB_Course_Words_Extend>();
                                result.Add(rootModel2);
                            }
                            else
                            {
                                var tempList = new List<RB_Course_Chapter_ViewModel>();
                                GetCourseChildList(tItem, sourceList,tempList);
                                if (tempList != null)
                                {
                                    result.AddRange(tempList);
                                }
                            }
                        }
                    }

                    if (result != null && result.Count > 0)
                    {
                        int index = 1;
                        List<RB_Course_Words_Extend> wordsList = new List<RB_Course_Words_Extend>();
                        foreach (var sItem in result)
                        {
                            sItem.ChapterId = 0;
                            sItem.SortNum = index;
                            sItem.ChapterNo = index.ToString();
                            string pattern = @"第[一二三四五六七八九十]次课";
                            string newStr = Regex.Replace(sItem.ChapterName, pattern, "");
                            string newTitle = string.Format("第{0}次课", new WordToNumHelper().NumToChinese(index.ToString())) + " " + newStr.Trim();
                            sItem.ChapterName = newTitle;


                            foreach (var subItem in sItem.WordsList)
                            {
                                subItem.Id = 0;
                                subItem.ChapterId = index;
                            }
                            if (sItem.WordsList != null && sItem.WordsList.Count > 0)
                            {
                                wordsList.AddRange(sItem.WordsList);
                            }
                            index++;
                        }
                        chapterRepository.DeleteByCourseIdRepository(item.CourseId);
                        course_WordsRepository.DeleteWordsByCourseIdRepository(item.CourseId);

                        chapterRepository.SetBatchInsertCourseChapterRepository(result);
                        if (wordsList != null && wordsList.Count > 0)
                        {
                            course_WordsRepository.BatchInsertCourseWordsRepository(wordsList);
                        }
                    }
                    string str = Common.Plugin.JsonHelper.Serialize(result);
                }
            }
        }

        /// <summary>
        /// 重新更新课程单词URL
        /// </summary>
        public void RunWordsUrlModule()
        {
            var list = course_WordsRepository.GetCourseWordsListRepository(new RB_Course_Words_Extend() { }).Where(qitem => string.IsNullOrEmpty(qitem.FileUrl)).ToList();
            string newPath = @"G:\WebFile\EduSystem\CourseWords";
            var fileList = Common.Plugin.FileHelper.GetFileList(newPath);
            if (list != null && list.Count > 0 && fileList != null && fileList.Count > 0)
            {
                //Task.Run(() =>
                //{
                    Dictionary<string, object> fileds = new Dictionary<string, object>();
                    foreach (var item in list.Where(qitem => string.IsNullOrEmpty(qitem.FileUrl)))
                    {
                        if (string.IsNullOrEmpty(item.FileUrl))
                        {
                            var tempWords = fileList.Where(qitem => (qitem.FileName.ToLower() == 
                            item.WordContent.ToLower()
                            .Replace("(", "(")
                            .Replace(")", ")")
                            .Replace("~", "〜")
                            .Replace("。","")
                            .Replace(@"\n","") + ".mp3")
                            )?.FirstOrDefault();
                            if (tempWords != null)
                            {
                                fileds.Clear();
                                string newFileUrl = @"/EduSystem/CourseWords/" + tempWords.FileName;
                                fileds.Add(nameof(RB_Course_Words_Extend.FileUrl), newFileUrl);
                                bool flag = course_WordsRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Words_Extend.Id), item.Id));
                            }
                        }
                    }
                //});
            }
        }

        /// <summary>
        /// 获取课程章节列表
        /// </summary>
        /// <param name="treeList"></param>
        /// <param name="chapterList"></param>
        public void GetCourseChildList(ChapterTree_ViewModel item,List<RB_Course_Chapter_ViewModel> sourceList,List<RB_Course_Chapter_ViewModel> resultList)
        {
            if (item != null )
            {
                if (item.ChildList != null && item.ChildList.Count > 0)
                {
                    int index = 0;
                    foreach (var subItem in item.ChildList)
                    {
                        var tempModel = sourceList?.Where(qitem => qitem.ChapterId == subItem.ChapterId)?.FirstOrDefault();
                        if (subItem.ChildList == null || (subItem.ChildList != null && subItem.ChildList.Count == 0))
                        {
                            if (tempModel != null)
                            {
                                string newName= item.ChapterName + " " + tempModel.ChapterName;
                                string pattern = @"第[一二三四五六七八九十]*次课";
                                newName = Regex.Replace(newName, pattern, "");
                                string pattern2 = @"第[一二三四五六七八九十]*课";
                                newName = Regex.Replace(newName, pattern2, "");
                                if (index == 0)
                                {
                                    tempModel.WordsList = sourceList?.Where(qitem => qitem.ChapterId == tempModel.ParentId)?.FirstOrDefault()?.WordsList ?? new List<RB_Course_Words_Extend>();
                                }
                                
                                tempModel.ChapterName = newName;
                                tempModel.StudyHours = 2;
                                tempModel.StudyMinutes = 90;
                                tempModel.ParentId = 0;
                                tempModel.ChapterId = 0;
                                resultList.Add(tempModel);
                                index++;
                            }
                        }
                        else
                        {
                            tempModel.WordsList = new List<RB_Course_Words_Extend>();
                            GetCourseChildList(subItem, sourceList,  resultList);
                        }
                    }
                }
            }
        }

        #endregion

        #region 课程讨论管理

        /// <summary>
        /// 获取课程讨论分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Course_Discuss_ViewModel> GetDiscussPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Course_Discuss_ViewModel query)
        {
            return discussRepository.GetDiscussPageListRepository(pageIndex, pageSize, out rowsCount, query);
        }

        /// <summary>
        /// 新增修改讨论话题
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetDiscussModule(RB_Course_Discuss_ViewModel model)
        {
            bool flag;
            if (model.DiscussId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_Discuss_ViewModel.DiscussTitle),model.DiscussTitle },
                    {nameof(RB_Course_Discuss_ViewModel.DiscussContent),model.DiscussContent },
                    {nameof(RB_Course_Discuss_ViewModel.DiscussUrl),model.DiscussUrl },
                };
                flag = discussRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Discuss_ViewModel.DiscussId), model.DiscussId));
            }
            else
            {
                var newId = discussRepository.Insert(model);
                model.DiscussId = newId;
                flag = newId > 0;
            }
            return flag;
        }

        /// <summary>
        /// 获取讨论话题
        /// </summary>
        /// <param name="DiscussId"></param>
        /// <returns></returns>
        public RB_Course_Discuss_ViewModel GetDiscussModule(object DiscussId)
        {
            return discussRepository.GetEntity<RB_Course_Discuss_ViewModel>(DiscussId);
        }

        /// <summary>
        /// 删除讨论话题
        /// </summary>
        /// <param name="DiscussId"></param>
        /// <returns></returns>
        public bool RemoveDiscussModule(object DiscussId)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Discuss_ViewModel.Status),(int)DateStateEnum.Delete },
            };
            bool flag = discussRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Discuss_ViewModel.DiscussId), DiscussId));
            return flag;
        }

        #endregion

        #region 课程配置
        /// <summary>
        /// 新增修改课程配置
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetCourseSettingModule(RB_Course_Setting_ViewModel model)
        {
            var oldModel = settingRepository.GetCourseSettingRepository(model);
            bool flag;
            if (oldModel != null && oldModel.SettingId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_Setting_ViewModel.AppIsCache),model.AppIsCache },
                    {nameof(RB_Course_Setting_ViewModel.PlayType),model.PlayType },
                };
                flag = settingRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Setting_ViewModel.SettingId), oldModel.SettingId));
            }
            else
            {
                var newId = settingRepository.Insert(model);
                model.SettingId = newId;
                flag = newId > 0;
            }
            return flag;
        }
        #endregion

        #region 课程资料管理

        /// <summary>
        /// 获取课程资料分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Course_Source_ViewModel> GetSourcePageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Course_Source_ViewModel query)
        {
            return sourceRepository.GetSourcePageListRepository(pageIndex, pageSize, out rowsCount, query);
        }

        /// <summary>
        /// 新增修改课程资料
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetCourseSourceModule(RB_Course_Source_ViewModel model)
        {
            bool flag;
            if (model.SourceId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_Source_ViewModel.SourceName),model.SourceName },
                    {nameof(RB_Course_Source_ViewModel.SourceType),model.SourceType },
                    {nameof(RB_Course_Source_ViewModel.SourceUrl),model.SourceUrl },
                    {nameof(RB_Course_Source_ViewModel.SourceSize),model.SourceSize },
                    {nameof(RB_Course_Source_ViewModel.ParentSourceId),model.ParentSourceId },
                };
                flag = sourceRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Source_ViewModel.SourceId), model.SourceId));
            }
            else
            {
                var newId = sourceRepository.Insert(model);
                model.SourceId = newId;
                flag = newId > 0;
            }
            return flag;
        }

        /// <summary>
        /// 根据编号获取课程资料实体
        /// </summary>
        /// <param name="SourceId"></param>
        /// <returns></returns>
        public RB_Course_Source_ViewModel GetCourseSourceModule(object SourceId)
        {
            return sourceRepository.GetEntity<RB_Course_Source_ViewModel>(SourceId);
        }


        /// <summary>
        /// 更新资料共享类型
        /// </summary>
        /// <param name="SourceId"></param>
        /// <param name="ShareType">共享类型</param>
        /// <returns></returns>
        public bool SetCourseSourceShareTypeModule(object SourceId, int ShareType)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Source_ViewModel.ShareType),ShareType},
            };
            bool flag = sourceRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Source_ViewModel.SourceId), SourceId));
            return flag;
        }

        /// <summary>
        /// 根据编号删除课程资料
        /// </summary>
        /// <param name="SourceId"></param>
        /// <returns></returns>
        public bool RemoveCourseSourceModule(object SourceId)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Source_ViewModel.Status),(int)DateStateEnum.Delete},
            };
            bool flag = sourceRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Source_ViewModel.SourceId), SourceId));
            return flag;
        }

        #endregion

        #region 课程教案管理

        /// <summary>
        /// 获取课程教案分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Course_TeachPlan_ViewModel> GetCourseTeachPlanPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Course_TeachPlan_ViewModel query)
        {
            return teachPlanRepository.GetCourseTeachPlanPageListRepository(pageIndex, pageSize, out rowsCount, query);
        }

        /// <summary>
        /// 添加修改课程教案
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetTeachPlanModule(RB_Course_TeachPlan_ViewModel model)
        {
            bool flag;
            if (model.PlanId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_TeachPlan_ViewModel.PlanName),model.PlanName },
                    {nameof(RB_Course_TeachPlan_ViewModel.ClassBefore),model.ClassBefore },
                    {nameof(RB_Course_TeachPlan_ViewModel.ClassIn),model.ClassIn },
                    {nameof(RB_Course_TeachPlan_ViewModel.ClassAfter),model.ClassAfter },
                    {nameof(RB_Course_TeachPlan_ViewModel.ParentPlanId),model.ParentPlanId },
                    {nameof(RB_Course_TeachPlan_ViewModel.SourceUrl),model.SourceUrl },
                    {nameof(RB_Course_TeachPlan_ViewModel.PlanFileExtension),model.PlanFileExtension },
                    {nameof(RB_Course_TeachPlan_ViewModel.PlanNodeType),model.PlanNodeType },
                    {nameof(RB_Course_TeachPlan_ViewModel.ExtUrl),model.ExtUrl },
                    {nameof(RB_Course_TeachPlan_ViewModel.Remark),model.Remark },
                    {nameof(RB_Course_TeachPlan_ViewModel.IsTop),model.IsTop },
                };
                flag = teachPlanRepository.Update(fileds, new WhereHelper(nameof(RB_Course_TeachPlan_ViewModel.PlanId), model.PlanId));
            }
            else
            {
                var newId = teachPlanRepository.Insert(model);
                model.PlanId = newId;
                flag = newId > 0;
            }
            return flag;
        }

        /// <summary>
        /// 根据编号获取教案实体
        /// </summary>
        /// <param name="PlanId"></param>
        /// <returns></returns>
        public RB_Course_TeachPlan_ViewModel GetTeachPlanModule(object PlanId)
        {
            return teachPlanRepository.GetEntity<RB_Course_TeachPlan_ViewModel>(PlanId);
        }

        /// <summary>
        /// 删除教案
        /// </summary>
        /// <param name="PlanId"></param>
        /// <returns></returns>
        public bool RemoveTeachPlanModule(object PlanId)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_TeachPlan_ViewModel.Status),(int)DateStateEnum.Delete },
            };
            bool flag = teachPlanRepository.Update(fileds, new WhereHelper(nameof(RB_Course_TeachPlan_ViewModel.PlanId), PlanId));
            return flag;
        }

        #endregion

        #region 课程作业管理

        /// <summary>
        /// 新增修改课程作业
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool SetCourseJobModule(RB_Course_Job_ViewModel model)
        {
            bool flag;
            if (model.JobId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_Job_ViewModel.JobName),model.JobName },
                    {nameof(RB_Course_Job_ViewModel.JobType),model.JobType },
                    {nameof(RB_Course_Job_ViewModel.ScoreType),model.ScoreType },
                    {nameof(RB_Course_Job_ViewModel.TopicType),model.TopicType },
                };
                flag = courseJobRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Job_ViewModel.JobId), model.JobId));
            }
            else
            {
                var newId = courseJobRepository.Insert(model);
                model.JobId = newId;
                flag = newId > 0;
            }
            var oldJobDetailsList = course_JobDetailsRepository.GetCourseJobDetailsListRepository(new RB_Course_JobDetails_ViewModel() { JobId = model.JobId });
            if (oldJobDetailsList == null || (oldJobDetailsList != null && oldJobDetailsList.Count == 0))
            {
                if (model.JobDetailsList != null && model.JobDetailsList.Count > 0)
                {
                    foreach (var item in model.JobDetailsList)
                    {
                        item.JobId = model.JobId;
                        item.QuestionId = SetQuestionModule(model, item);
                        flag = course_JobDetailsRepository.Insert(item) > 0;
                    }
                }
                else
                {
                    //现在没有详情列表【直接删除以前的详情列表】
                    if (model.JobDetailsList == null || (model.JobDetailsList != null && model.JobDetailsList.Count == 0))
                    {
                        course_JobDetailsRepository.RemoveCourseJobDetailsRepository(model.JobId);
                    }
                    //找出差异的数据
                    var deleteList = oldJobDetailsList.Where(qitem => !model.JobDetailsList.Any(oldItem => qitem.DetailsId == oldItem.DetailsId)).ToList();
                    foreach (var dItem in deleteList)
                    {
                        if (dItem.DetailsId > 0)
                        {
                            course_JobDetailsRepository.Delete(dItem.DetailsId);
                        }
                    }
                    foreach (var dItem in model.JobDetailsList)
                    {
                        dItem.QuestionId = SetQuestionModule(model, dItem);
                        dItem.JobId = model.JobId;
                        if (dItem.DetailsId == 0)
                        {
                            course_JobDetailsRepository.Insert(dItem);
                        }
                        else
                        {
                            course_JobDetailsRepository.Update(dItem);
                        }
                    }
                }
            }
            return flag;
        }

        /// <summary>
        /// 处理作业问题
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public int SetQuestionModule(RB_Course_Job_ViewModel jobModel, RB_Course_JobDetails_ViewModel item)
        {
            var model = new RB_Question_ViewModel()
            {
                QuestionId = item.QuestionId,
                CourseId = jobModel.CourseId,
                Title = item.Title,
                QuestionContent = item.QuestionContent,
                DifficultyType = item.DifficultyType,
                AnswerParse = item.AnswerParse,
                QuestionTypeId = item.QuestionTypeId,
                QuestionTypeName = item.QuestionTypeKey,
                Knowledge = item.Knowledge,
                CreateBy = jobModel.CreateBy,
                CreateTime = jobModel.CreateTime,
                UpdateBy = jobModel.UpdateBy,
                UpdateTime = jobModel.UpdateTime,
                IsUpdateJobExam = item.IsUpdateJobExam,
                Status = 0,
                SortNum = 0,
                Answer = item.Answer,
                IsMutex = item.IsMutex,
                Category = item.Category,
                LevelType = item.LevelType,
            };
            if (model.QuestionId > 0)
            {
                var newId = questionRepository.Insert(model);
                model.QuestionId = newId;
                if (newId > 0)
                {
                    Dictionary<string, object> sortFileds = new Dictionary<string, object>()
                    {
                       {nameof(RB_Question_ViewModel.SortNum),newId },
                    };
                    //更新问题排序
                    questionRepository.Update(sortFileds, new WhereHelper(nameof(RB_Question_ViewModel.QuestionId), newId));
                }
            }
            else
            {
                questionRepository.Update(model);
            }
            return model.QuestionId;
        }

        /// <summary>
        /// 设置作业其他配置
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetCourseJobOtherConfigModule(RB_Course_Job_ViewModel model)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Job_ViewModel.ReciveClass),model.ReciveClass },
                {nameof(RB_Course_Job_ViewModel.StartTime),model.StartTime },
                {nameof(RB_Course_Job_ViewModel.EndTime),model.EndTime },
                {nameof(RB_Course_Job_ViewModel.IsAllowDelay),model.IsAllowDelay },
                {nameof(RB_Course_Job_ViewModel.PassBasicScore),model.PassBasicScore },
                {nameof(RB_Course_Job_ViewModel.IsAgain),model.IsAgain },
                {nameof(RB_Course_Job_ViewModel.AgainTimes),model.AgainTimes },
                {nameof(RB_Course_Job_ViewModel.IsGetHighScore),model.IsGetHighScore },
                {nameof(RB_Course_Job_ViewModel.IsLookAnswer),model.IsLookAnswer },
                {nameof(RB_Course_Job_ViewModel.LookAnswerType),model.LookAnswerType },
                {nameof(RB_Course_Job_ViewModel.IsLookScore),model.IsLookScore },
                {nameof(RB_Course_Job_ViewModel.IsLookQTypeScore),model.IsLookQTypeScore },
                {nameof(RB_Course_Job_ViewModel.IsPaste),model.IsPaste },
                {nameof(RB_Course_Job_ViewModel.IsAgainShowTrueFalse),model.IsAgainShowTrueFalse },
                {nameof(RB_Course_Job_ViewModel.IsOutOrder),model.IsOutOrder },
                {nameof(RB_Course_Job_ViewModel.IsRandom),model.IsRandom },
                {nameof(RB_Course_Job_ViewModel.RandomNum),model.RandomNum },
                {nameof(RB_Course_Job_ViewModel.IsSendMsg),model.IsSendMsg },
                {nameof(RB_Course_Job_ViewModel.SendMsgHour),model.SendMsgHour },
                {nameof(RB_Course_Job_ViewModel.IsWork),model.IsWork },
                {nameof(RB_Course_Job_ViewModel.WorkProcess),model.WorkProcess },
                {nameof(RB_Course_Job_ViewModel.IsBlankobj),model.IsBlankobj },
                {nameof(RB_Course_Job_ViewModel.IsCompletionIngoreCase),model.IsCompletionIngoreCase },
                {nameof(RB_Course_Job_ViewModel.IsBlankIgnoreComma),model.IsBlankIgnoreComma },
                {nameof(RB_Course_Job_ViewModel.IsMultiHalfScore),model.IsMultiHalfScore },
                {nameof(RB_Course_Job_ViewModel.UpdateBy),model.UpdateBy },
                {nameof(RB_Course_Job_ViewModel.UpdateTime),model.UpdateTime },
             };
            var flag = courseJobRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Job_ViewModel.JobId), model.JobId));
            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_Course_Job_ViewModel> GetCourseJobPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Course_Job_ViewModel query)
        {
            return courseJobRepository.GetCourseJobPageListRepository(pageIndex, pageSize, out rowsCount, query);
        }

        /// <summary>
        /// 删除课程作业
        /// </summary>
        /// <param name="JobId">作业编号</param>
        /// <param name="Status">1-删除,0-恢复</param>
        /// <returns></returns>
        public bool RemoveCourseJobModule(int JobId, int Status)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Job_ViewModel.Status),Status },
            };
            var flag = courseJobRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Job_ViewModel.JobId), JobId));
            return flag;
        }
        #endregion

        #region 课程优惠设置

        /// <summary>
        /// 获取课程优惠列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Course_Preferential_Extend> GetCoursePreferentialListModule(RB_Course_Preferential_Extend query)
        {
            return course_PreferentialRepository.GetCoursePreferentialListRepostory(query);
        }

        /// <summary>
        /// 根据编号获取课程优惠信息
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        public RB_Course_Preferential_Extend GetCoursePreferentialModule(int Id)
        {
            return course_PreferentialRepository.GetCoursePreferentialListRepostory(new RB_Course_Preferential_Extend() { Id = Id })?.FirstOrDefault();
        }

        /// <summary>
        /// 新增修改课程优惠
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetCoursePreferentialModule(RB_Course_Preferential_Extend model)
        {
            bool flag = false;
            //买赠
            if (model.PriceDiscountType == Common.Enum.Course.CoursePriceDiscountEnum.BuySend)
            {
                model.PriceType = 0;
                model.PriceMoney = 0;
            }
            //非买赠
            else
            {
                model.BuyNum = 0;
                model.SendNum = 0;
            }
            if (model.Id > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_Preferential_Extend.PreferentialTerms),model.PreferentialTerms },
                    {nameof(RB_Course_Preferential_Extend.B2BCommissionType),model.B2BCommissionType },
                    {nameof(RB_Course_Preferential_Extend.B2BCommissionMoney),model.B2BCommissionMoney },
                    {nameof(RB_Course_Preferential_Extend.SaleCommissionType),model.SaleCommissionType },
                    {nameof(RB_Course_Preferential_Extend.SaleCommissionMoney),model.SaleCommissionMoney },
                    {nameof(RB_Course_Preferential_Extend.PriceDiscountType),model.PriceDiscountType },
                    {nameof(RB_Course_Preferential_Extend.BuyNum),model.BuyNum },
                    {nameof(RB_Course_Preferential_Extend.SendNum),model.SendNum },
                    {nameof(RB_Course_Preferential_Extend.PriceType),model.PriceType },
                    {nameof(RB_Course_Preferential_Extend.PriceMoney),model.PriceMoney },
                    {nameof(RB_Course_Preferential_Extend.UpdateBy),model.UpdateBy },
                    {nameof(RB_Course_Preferential_Extend.UpdateTime),model.UpdateTime },
                };
                flag = course_PreferentialRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Preferential_Extend.Id), model.Id));
            }
            else
            {
                var newId = course_PreferentialRepository.Insert(model);
                model.Id = newId;
                flag = newId > 0;
            }
            return flag;
        }

        /// <summary>
        /// 根据编删除课程优惠
        /// </summary>
        /// <param name="Id"></param>
        /// <param name="status"></param>
        /// <returns></returns>
        public bool RemoveCoursePreferentialModule(int Id, int status)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Course_Preferential_Extend.Status),status }
            };
            return course_PreferentialRepository.Update(fileds, new WhereHelper(nameof(RB_Course_Preferential_Extend.Id), Id));
        }

        /// <summary>
        /// 批量新增修改课程优惠信息
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool SetCoursePreferentialListModule(RB_Course_ViewModel courseModel, List<RB_Course_Preferential_Extend> list)
        {
            bool flag = false;
            if (courseModel.CourseId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Course_ViewModel.OriginalPrice),courseModel.OriginalPrice },
                    {nameof(RB_Course_ViewModel.SellPrice),courseModel.SellPrice },
                    {nameof(RB_Course_ViewModel.B2CRatio),courseModel.B2CRatio },
                    {nameof(RB_Course_ViewModel.B2CReNewRatio),courseModel.B2CReNewRatio },

                    {nameof(RB_Course_ViewModel.B2BRebateRatio),courseModel.B2BRebateRatio },
                    {nameof(RB_Course_ViewModel.B2BRebateRatioType),courseModel.B2BRebateRatioType },
                    {nameof(RB_Course_ViewModel.B2BRebateRatioValue),courseModel.B2BRebateRatioValue },

                    {nameof(RB_Course_ViewModel.B2BReNewRatio),courseModel.B2BReNewRatio },
                    {nameof(RB_Course_ViewModel.B2BReNewRatioType),courseModel.B2BReNewRatioType },
                    {nameof(RB_Course_ViewModel.B2BReNewRatioValue),courseModel.B2BReNewRatioValue },

                    {nameof(RB_Course_ViewModel.SchoolRebateRatio),courseModel.SchoolRebateRatio },
                    {nameof(RB_Course_ViewModel.SchoolRebateRatioType),courseModel.SchoolRebateRatioType },
                    {nameof(RB_Course_ViewModel.SchoolRebateRatioValue),courseModel.SchoolRebateRatioValue },

                    {nameof(RB_Course_ViewModel.SchoolReNewRatio),courseModel.SchoolReNewRatio },
                    {nameof(RB_Course_ViewModel.SchoolReNewRatioType),courseModel.SchoolReNewRatioType },
                    {nameof(RB_Course_ViewModel.SchoolReNewRatioValue),courseModel.SchoolReNewRatioValue },

                    {nameof(RB_Course_ViewModel.InnerRecommendRatio),courseModel.InnerRecommendRatio },
                    {nameof(RB_Course_ViewModel.InnerRecommendRatioType),courseModel.InnerRecommendRatioType },
                    {nameof(RB_Course_ViewModel.InnerRecommendRatioValue),courseModel.InnerRecommendRatioValue },

                    {nameof(RB_Course_ViewModel.InnerRecommendReNewRatio),courseModel.InnerRecommendReNewRatio },
                    {nameof(RB_Course_ViewModel.InnerRecommendReNewRatioType),courseModel.InnerRecommendReNewRatioType },
                    {nameof(RB_Course_ViewModel.InnerRecommendReNewRatioValue),courseModel.InnerRecommendReNewRatioValue },

                    {nameof(RB_Course_ViewModel.TransIntroductceRatio),courseModel.TransIntroductceRatio },
                    {nameof(RB_Course_ViewModel.TransIntroductceRatioType),courseModel.TransIntroductceRatioType },
                    {nameof(RB_Course_ViewModel.TransIntroductceRatioValue),courseModel.TransIntroductceRatioValue },

                    {nameof(RB_Course_ViewModel.TransIntroductceReNewRatio),courseModel.TransIntroductceReNewRatio },
                    {nameof(RB_Course_ViewModel.TransIntroductceReNewRatioType),courseModel.TransIntroductceReNewRatioType },
                    {nameof(RB_Course_ViewModel.TransIntroductceReNewRatioValue),courseModel.TransIntroductceReNewRatioValue },

                    {nameof(RB_Course_ViewModel.CommissionReType),courseModel.CommissionReType },

                    {nameof(RB_Course_ViewModel.B2CRbRatio),courseModel.B2CRbRatio },
                    {nameof(RB_Course_ViewModel.B2CRbRatioType),courseModel.B2CRbRatioType },
                    {nameof(RB_Course_ViewModel.B2CRbRatioValue),courseModel.B2CRbRatioValue },

                    {nameof(RB_Course_ViewModel.B2CRNRatio),courseModel.B2CRNRatio },
                    {nameof(RB_Course_ViewModel.B2CRNRatioType),courseModel.B2CRNRatioType },
                    {nameof(RB_Course_ViewModel.B2CRNRatioValue),courseModel.B2CRNRatioValue },
                };
                flag = courseRepository.Update(fileds, new WhereHelper(nameof(RB_Course_ViewModel.CourseId), courseModel.CourseId));
            }
            var oldList = GetCoursePreferentialListModule(new RB_Course_Preferential_Extend() { CourseId = courseModel.CourseId });
            //原来没有优惠数据
            if (oldList == null || (oldList != null && oldList.Count == 0))
            {
                foreach (var item in list)
                {
                    flag = course_PreferentialRepository.Insert(item) > 0;
                }
            }
            //原来有优惠数据
            else
            {
                if (list == null || (list != null && list.Count == 0))
                {
                    flag = course_PreferentialRepository.DeleteCoursePreferentialRepostory(courseModel.CourseId);
                }
                else
                {
                    //找出差异的数据
                    var deleteList = oldList.Where(qitem => !list.Any(oldItem => qitem.Id == oldItem.Id)).ToList();
                    foreach (var dItem in deleteList)
                    {
                        if (dItem.Id > 0)
                        {
                            flag = course_PreferentialRepository.Delete(dItem.Id) > 0;
                        }
                    }
                    foreach (var priceItem in list)
                    {
                        if (priceItem.Id == 0)
                        {
                            flag = course_PreferentialRepository.Insert(priceItem) > 0;
                        }
                        else
                        {
                            flag = course_PreferentialRepository.Update(priceItem);
                        }
                    }
                }

            }

            if (flag && courseModel.SalePlatList != null && courseModel.SalePlatList.Any(x => x == 4))//上架小程序端,则要同步到小程序
            {
                System.Threading.Tasks.Task.Run(() => UpdateMallGoodsPrice(courseModel, list));
            }
            return flag;
        }

        #endregion

        #region 非法访问用户

        /// <summary>
        /// 保存非法访问用信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetUnKnownUserModule(RB_Class_Time_UnKnowUser_ViewModel model)
        {
            bool flag;
            if (model.Id > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Class_Time_UnKnowUser_ViewModel.ClassTimeId) ,model.ClassTimeId},
                    {nameof(RB_Class_Time_UnKnowUser_ViewModel.UserAvatar) ,model.UserAvatar}
                };
                flag = chapterRepository.Update(fileds, new WhereHelper(nameof(RB_Class_Time_UnKnowUser_ViewModel.Id), model.Id));
            }
            else
            {
                var newId = unKnowRepository.Insert(model);
                model.Id = newId;
                flag = newId > 0;
            }
            return flag;
        }

        /// <summary>
        /// 查询指定课程的非法访问用户数据
        /// </summary>
        /// <returns></returns>
        public List<RB_Class_Time_UnKnowUser_ViewModel> GetUnKnowUserByClassTimeModule(int classId)
        {
            var list = unKnowRepository.GetUnKnowUsersByClassIdRepository(classId);
            return list;
        }

        #endregion

        #region 小程序商品


        /// <summary>
        /// 更新商品的售价-卖价;原价-基础收费以及优惠政策
        /// </summary>
        /// <param name="courseModel"></param>
        /// <param name="list"></param>
        /// <returns></returns>
        public bool UpdateMallGoodsPrice(RB_Course_ViewModel courseModel, List<RB_Course_Preferential_Extend> list)
        {
            bool flag = courseRepository.UpdateMallGoodsPriceRepository(courseModel, list);
            return flag;
        }
        #endregion
    }
}