using Edu.Model.Entity.EduTask; using Edu.Model.ViewModel.EduTask; using System; using System.Collections.Generic; using System.Text; using System.Linq; using Edu.Common.Enum.Course; using System.Threading.Tasks; using Edu.Model.ViewModel.Course; using Edu.Model.ViewModel.Grade; using Edu.Repository.Grade; namespace Edu.Repository.EduTask { /// /// 上课计划调整仓储层 /// public class RB_Change_ClassPlanRepository : BaseRepository { /// /// 班级上课计划仓储层对象 /// private readonly RB_Class_PlanRepository class_PlanRepository = new RB_Class_PlanRepository(); /// /// 班级上课计划上课时间仓储层对象 /// private readonly RB_Class_TimeRepository class_TimeRepository = new RB_Class_TimeRepository(); /// /// 教室仓储层对象 /// private readonly RB_Class_RoomRepository class_RoomRepository = new RB_Class_RoomRepository(); /// /// 教师仓储层对象 /// private readonly User.RB_TeacherRepository teacherRepository = new User.RB_TeacherRepository(); /// /// 教务单据仓储层对象 /// private readonly RB_Education_ReceiptRepository education_ReceiptRepository = new RB_Education_ReceiptRepository(); /// /// 课程日志记录表 /// private readonly Log.RB_Class_LogRepository classLogRepository = new Log.RB_Class_LogRepository(); /// /// 获取调课计划列表 /// /// /// public List GetChangeClassPlanListRepository(RB_Change_ClassPlan_ViewModel query) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.*,IFNULL(B.ClassName,'') AS ClassName FROM RB_Change_ClassPlan AS A LEFT JOIN rb_class AS B ON A.ClassId=B.ClassId WHERE 1=1 "); if (query != null) { if (!string.IsNullOrEmpty(query.Q_Change_ClassPlan_Ids)) { builder.AppendFormat(@" AND A.{0} IN ({1}) ", nameof(RB_Change_ClassPlan_ViewModel.Id), query.Q_Change_ClassPlan_Ids); } } return Get(builder.ToString()).ToList(); } /// /// 审核通过后更新调课信息 /// /// /// public bool UpdateChangeClassPlan(object Id) { //查询当前调课信息 bool flag = false; var receiptModel = education_ReceiptRepository.GetEntity(Id); if (receiptModel == null || receiptModel.Id == 0) { return false; } if (receiptModel.ReceiptType != Common.Enum.Finance.ReceiptTypeEnum.ChangeClass) { return false; } var model = GetEntity(receiptModel.RelationId); if (model == null || model.Id == 0) { return false; } else {//更新信息 string logContent = ""; StringBuilder builder = new StringBuilder(); List classLogList = new List(); if (model.MoveType == 1)//固定日期 { List oldChangePlanItemList = new List(); List newChangePlanItemList = new List(); //原数据 if (!string.IsNullOrWhiteSpace(model.SourceData)) { oldChangePlanItemList = Common.Plugin.JsonHelper.DeserializeObject>(model.SourceData); } //目标数据 if (!string.IsNullOrWhiteSpace(model.TargetData)) { newChangePlanItemList = Common.Plugin.JsonHelper.DeserializeObject>(model.TargetData); } if (model.ChangeType == 1)//1.调课 { foreach (var item in oldChangePlanItemList) { var newChangePlanItemModel = newChangePlanItemList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault(); if (item.ClassDate != newChangePlanItemModel.ClassDate) { logContent += string.Format("日期由【{0}】修改为【{1}】.", Common.ConvertHelper.FormatDate(item.ClassDate), Common.ConvertHelper.FormatDate(newChangePlanItemModel.ClassDate)); builder.AppendFormat(" update RB_Class_Plan SET ClassDate='{0}' where ClassPlanId ={1};", Common.ConvertHelper.FormatDate(newChangePlanItemModel.ClassDate), item.ClassPlanId); } foreach (var itemOldTime in item.PlanTimeList)//修改或者删除之前的 { var newTimeModel = newChangePlanItemModel.PlanTimeList.Where(x => x.ClassTimeId > 0 && x.ClassTimeId == itemOldTime.ClassTimeId).FirstOrDefault();//以前与现在都有只是修改了日期 if (newTimeModel != null && newTimeModel.ClassTimeId > 0) { if (newTimeModel.StartTime != itemOldTime.StartTime) { logContent += string.Format("{0}上课开始时间由【{1}】修改为【{2}】.", Common.ConvertHelper.FormatDate(newChangePlanItemModel.ClassDate), itemOldTime.StartTime, newTimeModel.EndTime); } if (newTimeModel.EndTime != itemOldTime.EndTime) { logContent += string.Format("{0}上课结束时间由【{1}】修改为【{2}】.", Common.ConvertHelper.FormatDate(newChangePlanItemModel.ClassDate), itemOldTime.EndTime, newTimeModel.EndTime); } if (newTimeModel.StartTime != itemOldTime.StartTime || newTimeModel.EndTime != itemOldTime.EndTime) { builder.AppendFormat(" update rb_class_time SET StartTime='{0}' ,EndTime='{1}' where ClassTimeId ={2};", newTimeModel.StartTime, newTimeModel.EndTime, newTimeModel.ClassTimeId); } } else { builder.AppendFormat(" DELETE FROM rb_class_time where classtimeId in({0});", itemOldTime.ClassTimeId); logContent += string.Format("删除{0}上课时间【{1}】-【{2}】.", Common.ConvertHelper.FormatDate(item.ClassDate), itemOldTime.StartTime, itemOldTime.EndTime); } } foreach (var itemNewTime in newChangePlanItemModel.PlanTimeList.Where(x => x.ClassTimeId == 0))//新增上课时间 { builder.AppendFormat("INSERT into rb_class_time (ClassId,ClassPlanId,StartTime,EndTime,Group_Id,School_Id,ClassStatus)VALUES({0},{1},'{2}','{3}',{4},{5},{6});", model.ClassId, item.ClassPlanId, itemNewTime.StartTime, itemNewTime.EndTime, model.Group_Id, model.School_Id, 0); logContent += string.Format("{0}新增上课开始时间【{1}】-【{2}】.", Common.ConvertHelper.FormatDate(item.ClassDate), itemNewTime.StartTime, itemNewTime.EndTime); } } } else if (model.ChangeType == 2 || model.ChangeType == 3)//更新老师或者更新教室 { if (model.ChangeType == 2) { builder.AppendFormat(" update RB_Class_Plan SET TeacherId={0} where ClassPlanId in({1})", newChangePlanItemList.FirstOrDefault().TeacherId, string.Join(",", oldChangePlanItemList.Select(x => x.ClassPlanId))); string tIds = string.Join(",", oldChangePlanItemList.Select(x => x.TeacherId)) + "," + newChangePlanItemList.FirstOrDefault().TeacherId; var teacherList = teacherRepository.GetTeacherListRepository(new Model.ViewModel.User.RB_Teacher_ViewModel() { QTIds = tIds }); foreach (var item in oldChangePlanItemList) { logContent += string.Format(Common.ConvertHelper.FormatDate(item.ClassDate) + "的讲师由【{0}】修改为【{1}】.", (teacherList?.Where(qitem => qitem.TId == item.TeacherId)?.FirstOrDefault()?.TeacherName ?? ""), (teacherList?.Where(qitem => qitem.TId == newChangePlanItemList.FirstOrDefault().TeacherId)?.FirstOrDefault()?.TeacherName ?? "") ); } } else if (model.ChangeType == 3) { builder.AppendFormat(" update RB_Class_Plan SET ClassRoomId={0} where ClassPlanId in({1})", newChangePlanItemList.FirstOrDefault().ClassRoomId, string.Join(",", oldChangePlanItemList.Select(x => x.ClassPlanId))); string roomIds = string.Join(",", oldChangePlanItemList.Select(x => x.ClassRoomId)) + "," + newChangePlanItemList.FirstOrDefault().ClassRoomId; var roomList = class_RoomRepository.GetClassRoomListRepository(new RB_Class_Room_ViewModel() { QRoomIds = roomIds }); foreach (var item in oldChangePlanItemList) { logContent += string.Format(Common.ConvertHelper.FormatDate(item.ClassDate) + "的教室由【{0}】修改为【{1}】.", (roomList?.Where(qitem => qitem.RoomId == item.ClassRoomId)?.FirstOrDefault()?.RoomName ?? ""), (roomList?.Where(qitem => qitem.RoomId == newChangePlanItemList.FirstOrDefault().ClassRoomId)?.FirstOrDefault()?.RoomName ?? "") ); } } } else if (model.ChangeType == 4)//取消课程 { var oldPlanList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel() { ClassId = model.ClassId, QClassPlanIds = string.Join(",", oldChangePlanItemList.Select(x => x.ClassPlanId)), }); List deletePlanList = new List(); List deletePlanTimeList = new List(); foreach (var item in oldPlanList.GroupBy(x => x.ClassPlanId)) { var tempPlanTimeList = oldPlanList.Where(x => x.ClassPlanId == item.Key); var oldPlanTimeModel = oldChangePlanItemList.Where(x => x.ClassPlanId == item.Key).FirstOrDefault(); if (tempPlanTimeList.Count() == oldPlanTimeModel.PlanTimeList.Count()) { deletePlanList.Add(item.Key); } deletePlanTimeList.AddRange(oldPlanTimeModel.PlanTimeList.Select(x => x.ClassTimeId)); } foreach (var item in oldChangePlanItemList) { foreach (var itemTime in item.PlanTimeList) { logContent += string.Format("删除{0}上课时间【{1} - {2}】.", Common.ConvertHelper.FormatDate(item.ClassDate), itemTime.StartTime, itemTime.EndTime); } } if (deletePlanList != null && deletePlanList.Any()) { builder.AppendFormat(" UPDATE RB_Class_Plan SET Status=1 WHERE ClassPlanId IN({0});", string.Join(",", deletePlanList.Select(x => x))); } if (deletePlanTimeList != null && deletePlanTimeList.Any()) { builder.AppendFormat(" DELETE FROM rb_class_time WHERE classtimeId IN({0});", string.Join(",", deletePlanTimeList.Select(x => x))); } } } else { //全局修改 AllChangePlanItem allChangePlanModel = new AllChangePlanItem(); //目标数据 if (!string.IsNullOrWhiteSpace(model.TargetData)) { allChangePlanModel = Common.Plugin.JsonHelper.DeserializeObject(model.TargetData); } if (model.ChangeType == 1) { var oldPlanList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel() { ClassId = model.ClassId, StartTime = model.CreateTime.ToString("yyyy-MM-dd 00:00:00") }); #region 班级计划 //默认上课时间 var defaultPlanTimeList = new List(); var BasicMinutes = allChangePlanModel.ClassHourMinute; foreach (var tItem in allChangePlanModel.DefaultTimeList) { ClassTimeItem tModel = new ClassTimeItem() { DateList = new List(), TimeList = new List() }; 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); } } //班级上课计划列表 List classPlanList = new List(); if (allChangePlanModel.ClassHours > 0) { var srartDate = Convert.ToDateTime(allChangePlanModel.OpenTimeStr); //按周排课和按月排课 if (allChangePlanModel.ClassStyle == ClassStyleEnum.Week || allChangePlanModel.ClassStyle == ClassStyleEnum.Month) { int i = 0; decimal totalHours = 0; while (allChangePlanModel.ClassHours > totalHours) { var newDate = srartDate.AddDays(i); foreach (var item in allChangePlanModel.WeekDayList) { var planModel = new RB_Class_Plan_ViewModel() { ClassId = model.ClassId, ClassPlanId = 0, ClassRoomId = allChangePlanModel.ClassRoomId, Group_Id = model.Group_Id, School_Id = model.School_Id, PlanTimeList = new List(), TeacherId = allChangePlanModel.TeacherId, ClassDate = newDate }; if (allChangePlanModel.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, allChangePlanModel.ClassHourMinute, 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, allChangePlanModel.ClassHourMinute, 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, allChangePlanModel.ClassHourMinute, 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, allChangePlanModel.ClassHourMinute, 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, allChangePlanModel.ClassHourMinute, 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, allChangePlanModel.ClassHourMinute, 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, allChangePlanModel.ClassHourMinute, BasicMinutes); totalHours += dayHours; classPlanList.Add(planModel); } } break; } } else if (allChangePlanModel.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, allChangePlanModel.ClassHourMinute, BasicMinutes); totalHours += dayHours; classPlanList.Add(planModel); } } } } i++; } } //固定日期 else if (allChangePlanModel.ClassStyle == ClassStyleEnum.FixedDate) { foreach (var item in allChangePlanModel.WeekDayList) { var planModel = new RB_Class_Plan_ViewModel() { ClassId = model.ClassId, ClassPlanId = 0, ClassRoomId = allChangePlanModel.ClassRoomId, Group_Id = model.Group_Id, School_Id = model.School_Id, PlanTimeList = new List(), TeacherId = allChangePlanModel.TeacherId, 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, allChangePlanModel.ClassHourMinute, BasicMinutes); classPlanList.Add(planModel); } } } //约课 else { } } Task.Run(() => { if (oldPlanList != null && oldPlanList.Any())//删除剩余的排课日期和时间 { string ids = string.Join(",", oldPlanList.Select(qitem => qitem.ClassPlanId)); if (!string.IsNullOrEmpty(ids)) { flag = class_TimeRepository.DeleteClassTimeByPlanIdsRepository(ids); if (flag) { flag = class_PlanRepository.DeleteClassPlanRepository(ids); } } } if (classPlanList != null && classPlanList.Any()) { foreach (var item in classPlanList) { if (!class_PlanRepository.CheckExistsRepository(item)) { //添加班级上课计划 var newClassPlanId = class_PlanRepository.Insert(item); flag = newClassPlanId > 0; if (item.PlanTimeList != null && item.PlanTimeList.Any() && newClassPlanId > 0) { foreach (var subItem in item.PlanTimeList) { subItem.ClassTimeId = 0; subItem.ClassPlanId = newClassPlanId; subItem.ClassId = model.ClassId; subItem.Group_Id = model.Group_Id; subItem.School_Id = model.School_Id; //添加班级上课计划的上课时间 class_TimeRepository.Insert(subItem); } } } } if (flag) { classLogRepository.AddClassLogRepository( new Model.Entity.Log.RB_Class_Log() { LogType = Common.Enum.Course.ClassLogTypeEnum.Class, LogContent = "从" + allChangePlanModel.OpenTimeStr + "开始" + (Common.Plugin.EnumHelper.ToName(allChangePlanModel.ClassStyle)), ClassId = model.ClassId, Group_Id = model.Group_Id, School_Id = model.School_Id, CreateBy = model.CreateBy }); } } }); #endregion } else if (model.ChangeType == 2 || model.ChangeType == 3) { if (model.ChangeType == 2) { builder.AppendFormat(" UPDATE RB_Class_Plan SET TeacherId={0} WHERE DATE_FORMAT(ClassDate,'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d')", allChangePlanModel.TeacherId, model.TakeEffectTime.Value.ToString("yyyy-MM-dd")); string tIds = allChangePlanModel.TeacherId.ToString(); var teacherList = teacherRepository.GetTeacherListRepository(new Model.ViewModel.User.RB_Teacher_ViewModel() { QTIds = tIds }); logContent += string.Format("全局将讲师修改为【{0}】.", (teacherList?.Where(qitem => qitem.TId == allChangePlanModel.TeacherId)?.FirstOrDefault()?.TeacherName ?? "")); } else if (model.ChangeType == 3) { builder.AppendFormat(" UPDATE RB_Class_Plan SET ClassRoomId={0} WHERE DATE_FORMAT(ClassDate,'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d')", allChangePlanModel.ClassRoomId, model.TakeEffectTime.Value.ToString("yyyy-MM-dd")); string roomIds = allChangePlanModel.ClassRoomId.ToString(); var roomList = class_RoomRepository.GetClassRoomListRepository(new RB_Class_Room_ViewModel() { QRoomIds = roomIds }); logContent += string.Format("全局将教室修改为【{0}】.", (roomList?.Where(qitem => qitem.RoomId == allChangePlanModel.ClassRoomId)?.FirstOrDefault()?.RoomName ?? "")); } } else if (model.ChangeType == 4) { var oldPlanList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel() { ClassId = model.ClassId, StartTime = model.TakeEffectTime.Value.ToString("yyyy-MM-dd") }); if (oldPlanList != null && oldPlanList.Any())//删除剩余的排课日期和时间 { if (oldPlanList != null && oldPlanList.Any()) { builder.AppendFormat(" UPDATE RB_Class_Plan SET Status=1 WHERE ClassPlanId IN({0});", string.Join(",", oldPlanList.Select(x => x.ClassPlanId))); builder.AppendFormat(" DELETE FROM rb_class_time WHERE ClassPlanId IN({0});", string.Join(",", oldPlanList.Select(x => x.ClassPlanId))); } } } } if (!string.IsNullOrWhiteSpace(builder.ToString())) { flag = class_PlanRepository.Execute(builder.ToString()) > 0; } if (!string.IsNullOrEmpty(logContent) && flag) { classLogRepository.AddClassLogRepository( new Model.Entity.Log.RB_Class_Log() { LogType = ClassLogTypeEnum.Class, LogContent = logContent, ClassId = model.ClassId, Group_Id = model.Group_Id, School_Id = model.School_Id, CreateBy = model.CreateBy }); } } return flag; } /// /// 计算每天课时 /// /// /// /// /// private decimal CalcDayClassHoursModule(List timeList, List classTimeList, int ClassHourMinute, int BasicMinutes) { decimal dayClassHours = 0; decimal 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 += Convert.ToDecimal(span.TotalMinutes); } } if (ClassHourMinute > 0) { dayClassHours = dayMinutes / ClassHourMinute; } else { dayClassHours = dayMinutes / BasicMinutes; } return dayClassHours; } } }