using System; using System.Collections.Generic; using System.Linq; using System.Text; using Bowin.Common.Linq; using Bowin.Common.Linq.Entity; using EMIS.ViewModel.PaymentManage; using EMIS.ViewModel; using EMIS.Entities; using EMIS.DataLogic.PaymentManage; using System.Linq.Expressions; using EMIS.ViewModel.EducationManage; using EMIS.DataLogic.Common.CalendarManage; using EMIS.DataLogic.EducationSchedule; using EMIS.CommonLogic.EducationSchedule; namespace EMIS.CommonLogic.PaymentManage { public class WorktimeAdjustmentServices : BaseServices, IWorktimeAdjustmentServices { public WorktimeAdjustmentDAL WorktimeAdjustmentDAL { get; set; } public SchoolYearDAL SchoolYearDAL { get; set; } public ActivitieDAL ActivitieDAL { get; set; } public Lazy EducationSchedulingStopServices { get; set; } public IEducationSchedulingAdjustmentServices EducationSchedulingAdjustmentServices { get; set; } public IGridResultSet GetWorktimeAdjustmentViewList(ConfiguretView worktimeAdjustmentConditionView, Guid? schoolyearID, Guid? coursematerialID, Guid? teacherUserID, int? worktimeAdjustmentTypeID, int? pageIndex, int? pageSize) { Expression> exp = (x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE); Expression> courseExp = (x => true); Expression> schoolyearExp = (x => true); if (schoolyearID.HasValue) { schoolyearExp = schoolyearExp.And(x => x.SchoolyearID == schoolyearID); } if (coursematerialID.HasValue) { courseExp = courseExp.And(x => x.CoursematerialID == coursematerialID); } if (teacherUserID.HasValue) { exp = exp.And(x => x.UserID == teacherUserID); } if (worktimeAdjustmentTypeID.HasValue) { exp = exp.And(x => x.WorktimeAdjustmentTypeID == worktimeAdjustmentTypeID); } var query = WorktimeAdjustmentDAL.GetWorktimeAdjustmentViewQueryable(exp, courseExp, schoolyearExp); if (!string.IsNullOrEmpty(worktimeAdjustmentConditionView.ConditionValue) && !string.IsNullOrEmpty(worktimeAdjustmentConditionView.Attribute)) query = query.DynamicWhere(worktimeAdjustmentConditionView.Attribute, worktimeAdjustmentConditionView.Condition, worktimeAdjustmentConditionView.ConditionValue); query = query.OrderByDescending(x => x.SchoolyearCode) .ThenBy(x => x.WorktimeAdjustmentID) .ThenBy(x => x.TeacherName) .ThenBy(x => x.CourseCode); return query.ToGridResultSet(pageIndex, pageSize); } public List GetWorktimeAdjustmentViewList(ConfiguretView worktimeAdjustmentConditionView, Guid? schoolyearID, Guid? coursematerialID, Guid? teacherUserID, int? worktimeAdjustmentTypeID) { Expression> exp = (x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE); Expression> courseExp = (x => true); Expression> schoolyearExp = (x => true); if (schoolyearID.HasValue) { schoolyearExp = schoolyearExp.And(x => x.SchoolyearID == schoolyearID); } if (coursematerialID.HasValue) { courseExp = courseExp.And(x => x.CoursematerialID == coursematerialID); } if (teacherUserID.HasValue) { exp = exp.And(x => x.UserID == teacherUserID); } if (worktimeAdjustmentTypeID.HasValue) { exp = exp.And(x => x.WorktimeAdjustmentTypeID == worktimeAdjustmentTypeID); } var query = WorktimeAdjustmentDAL.GetWorktimeAdjustmentViewQueryable(exp, courseExp, schoolyearExp); if (!string.IsNullOrEmpty(worktimeAdjustmentConditionView.ConditionValue) && !string.IsNullOrEmpty(worktimeAdjustmentConditionView.Attribute)) query = query.DynamicWhere(worktimeAdjustmentConditionView.Attribute, worktimeAdjustmentConditionView.Condition, worktimeAdjustmentConditionView.ConditionValue); query = query.OrderByDescending(x => x.SchoolyearCode) .ThenBy(x => x.WorktimeAdjustmentID) .ThenBy(x => x.TeacherName) .ThenBy(x => x.CourseCode); return query.ToList(); } public WorktimeAdjustmentView GetWorktimeAdjustmentView(Guid? worktimeAdjustmentID) { var query = WorktimeAdjustmentDAL.GetWorktimeAdjustmentViewQueryable(x => x.WorktimeAdjustmentID == worktimeAdjustmentID, (x => true), (x => true)); return query.FirstOrDefault(); } public void Save(WorktimeAdjustmentView worktimeAdjustmentView) { TP_WorktimeAdjustment worktimeAdjustment = new TP_WorktimeAdjustment(); if (worktimeAdjustmentView.WorktimeAdjustmentID == null || worktimeAdjustmentView.WorktimeAdjustmentID == Guid.Empty) { worktimeAdjustment = new TP_WorktimeAdjustment(); worktimeAdjustment.WorktimeAdjustmentID = Guid.NewGuid(); SetNewStatus(worktimeAdjustment); UnitOfWork.Add(worktimeAdjustment); } else { worktimeAdjustment = WorktimeAdjustmentDAL.WorktimeAdjustmentRepository.GetSingle(x => x.WorktimeAdjustmentID == worktimeAdjustmentView.WorktimeAdjustmentID); if (worktimeAdjustment == null) { throw new Exception("未能找到需要修改的数据,数据可能已被其他用户更改。"); } SetModifyStatus(worktimeAdjustment); } worktimeAdjustment.EducationMissionClassID = worktimeAdjustmentView.EducationMissionClassID; worktimeAdjustment.AdjustDate = worktimeAdjustmentView.AdjustDate; worktimeAdjustment.UserID = worktimeAdjustmentView.UserID; worktimeAdjustment.WorktimeAdjustmentTypeID = worktimeAdjustmentView.WorktimeAdjustmentTypeID; worktimeAdjustment.Worktime = worktimeAdjustmentView.Worktime; UnitOfWork.Commit(); } public void Delete(IList worktimeAdjustmentIDList) { if (worktimeAdjustmentIDList.Count > 0) { UnitOfWork.Delete(x => worktimeAdjustmentIDList.Contains(x.WorktimeAdjustmentID)); } } public IGridResultSet GetEducationMissionClassList(ConfiguretView missionClassConditionView, Guid? schoolyearID, Guid? userID, DateTime? adjustDate, Guid? collegeID, int? gradeYearID, int? standardID, Guid? coursematerialID, int? pageIndex, int? pageSize) { Expression> exp = (x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE); Expression> teacherExp = (x => true); Expression> scheduleExp = (x => true); if (schoolyearID.HasValue) { scheduleExp = scheduleExp.And(x => x.SchoolyearID == schoolyearID); } if (userID.HasValue) { teacherExp = teacherExp.And(x => x.UserID == userID); } if (adjustDate.HasValue) { if (schoolyearID.HasValue) { var schoolyear = SchoolYearDAL.GetSchoolYearQueryable(x => x.SchoolyearID == schoolyearID).First(); var adjustWeekNum = Convert.ToInt32(Math.Ceiling(adjustDate.Value.Subtract(schoolyear.FirstWeek.Value).TotalDays / 7)); var adjustWeekday = (int)adjustDate.Value.DayOfWeek; scheduleExp = scheduleExp.And(x => x.Weekday == adjustWeekday && x.ES_EducationSchedulingWeekNum.Any(w => w.WeekNum == adjustWeekNum)); } else { scheduleExp = scheduleExp.And(x => false); } } if (collegeID.HasValue) { exp = exp.And(x => x.CF_Classmajor.Any(w => w.CF_Grademajor.CF_Facultymajor.CollegeID == collegeID)); } if (gradeYearID.HasValue) { exp = exp.And(x => x.CF_Classmajor.Any(w => w.CF_Grademajor.GradeID == gradeYearID)); } if (standardID.HasValue) { exp = exp.And(x => x.CF_Classmajor.Any(w => w.CF_Grademajor.CF_Facultymajor.StandardID == standardID)); } if (coursematerialID.HasValue) { exp = exp.And(x => x.CoursematerialID == coursematerialID); } var query = WorktimeAdjustmentDAL.GetEducationMissionClassViewQueryable(exp, teacherExp, scheduleExp); if (!string.IsNullOrEmpty(missionClassConditionView.ConditionValue) && !string.IsNullOrEmpty(missionClassConditionView.Attribute)) query = query.DynamicWhere(missionClassConditionView.Attribute, missionClassConditionView.Condition, missionClassConditionView.ConditionValue); query = query.OrderBy(x => x.Name); return query.ToGridResultSet(pageIndex, pageSize); } public void GenerateChargeAgainst(Guid schoolyearID) { var activitieList = ActivitieDAL.GetActivitiesQueryable(x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE).ToList(); var schoolyear = SchoolYearDAL.GetSchoolYearQueryable(x => x.SchoolyearID == schoolyearID).First(); var schoolyearEndDate = schoolyear.FirstWeek.Value.AddDays(4 + (((schoolyear.WeeksNum ?? 0) - 1) * 7)); #region 校历节假日 var activitieDateList = activitieList.Where(x => (new DateTime(schoolyear.FirstWeek.Value.Year, x.ActivitiesTimeMonth.Value, x.ActivitiesTimeDay.Value) >= schoolyear.FirstWeek.Value && new DateTime(schoolyear.FirstWeek.Value.Year, x.ActivitiesTimeMonth.Value, x.ActivitiesTimeDay.Value) <= schoolyearEndDate)) .Select(x => new DateTime(schoolyear.FirstWeek.Value.Year, x.ActivitiesTimeMonth.Value, x.ActivitiesTimeDay.Value)) .Concat(activitieList.Where(x => (new DateTime(schoolyearEndDate.Year, x.ActivitiesTimeMonth.Value, x.ActivitiesTimeDay.Value) >= schoolyear.FirstWeek.Value && new DateTime(schoolyearEndDate.Year, x.ActivitiesTimeMonth.Value, x.ActivitiesTimeDay.Value) <= schoolyearEndDate)) .Select(x => new DateTime(schoolyearEndDate.Year, x.ActivitiesTimeMonth.Value, x.ActivitiesTimeDay.Value))).Distinct().ToList(); var weekdayList = activitieDateList.Select(x => new { AdjustDate = x, Weekday = (int)x.DayOfWeek, WeekNum = Convert.ToInt32(Math.Ceiling(x.Subtract(schoolyear.FirstWeek.Value).TotalDays / 7)) }).ToList(); var scheduleQuery = WorktimeAdjustmentDAL.GetWorktimeSchedulingViewQueryable(x => x.SchoolyearID == schoolyearID); var weekdayAndNumList = weekdayList.Select(x => new { x.Weekday, x.WeekNum }).ToList(); var weekdayAndNumScheduleList = scheduleQuery.SelectByKeys(weekdayAndNumList); #endregion #region 停课记录 var schedulingStopEndStatus = EducationSchedulingStopServices.Value.GetCorrectEndStatus(); var schedulingStop = WorktimeAdjustmentDAL.GetWorktimeSchedulingViewByStopQueryable( x => x.RecordStatus == schedulingStopEndStatus, x => x.SchoolyearID == schoolyearID).ToList(); #endregion #region 调课补课记录 var schedulingAdjustmentEndStatus = EducationSchedulingAdjustmentServices.GetCorrectEndStatus(); var schedulingAdjustment = WorktimeAdjustmentDAL.GetWorktimeSchedulingViewByAdjustmentQueryable( x => x.RecordStatus == schedulingStopEndStatus, x => x.SchoolyearID == schoolyearID).ToList(); #endregion var scheduleList = weekdayAndNumScheduleList .Join(weekdayList, (x => new { Weekday = x.Weekday ?? 0, WeekNum = x.WeekNum ?? 0 }), (x => new { x.Weekday, x.WeekNum }), ((x, y) => new { x.EducationMissionClassID, y.AdjustDate, x.UserID, x.Worktime })).Concat( schedulingStop.Select(x => new { x.EducationMissionClassID, AdjustDate = schoolyear.FirstWeek.Value.AddDays((double)((x.WeekNum - 1) * 7 + (x.Weekday == 0 ? 7 : x.Weekday) - 1)), x.UserID, x.Worktime }) ); var achedulingAdjustmentList = schedulingAdjustment.Select(x => new { x.EducationMissionClassID, AdjustDate = schoolyear.FirstWeek.Value.AddDays((double)((x.WeekNum - 1) * 7 + (x.Weekday == 0 ? 7 : x.Weekday) - 1)), x.UserID, x.Worktime }); var existsAdjustmentList = WorktimeAdjustmentDAL.WorktimeAdjustmentRepository.Entities.SelectByKeys( scheduleList.Select(x => new { x.EducationMissionClassID, x.AdjustDate, x.UserID }).ToList() ); var deleteAdjustmentList = WorktimeAdjustmentDAL.WorktimeAdjustmentRepository.Entities.SelectByKeys( achedulingAdjustmentList.Select(x => new { x.EducationMissionClassID, x.AdjustDate, x.UserID }).ToList() ); var delID = deleteAdjustmentList.Select(x => x.WorktimeAdjustmentID).ToList(); var adjustmenntList = WorktimeAdjustmentDAL.WorktimeAdjustmentRepository.Entities.ToList(); var insertList = new List(); var updateList = new List(); foreach (var schedule in scheduleList) { if (!existsAdjustmentList.Any(x => x.EducationMissionClassID == schedule.EducationMissionClassID && x.UserID == schedule.UserID && x.AdjustDate == schedule.AdjustDate && x.WorktimeAdjustmentTypeID == (int)TP_WorktimeAdjustmentType.ChargeAgainst)) { var adjustment = new TP_WorktimeAdjustment { WorktimeAdjustmentID = Guid.NewGuid(), EducationMissionClassID = schedule.EducationMissionClassID, AdjustDate = schedule.AdjustDate, UserID = schedule.UserID, WorktimeAdjustmentTypeID = (int)TP_WorktimeAdjustmentType.ChargeAgainst, Worktime = schedule.Worktime }; this.SetNewStatus(adjustment); insertList.Add(adjustment); } //else if (existsAdjustmentList.Any(x => x.EducationMissionClassID == schedule.EducationMissionClassID // && x.UserID == schedule.UserID && x.AdjustDate == schedule.AdjustDate // && x.WorktimeAdjustmentTypeID == (int)TP_WorktimeAdjustmentType.ChargeAgainst)) //{ // var adjustment = adjustmenntList.Where(x => x.EducationMissionClassID == schedule.EducationMissionClassID && x.UserID == schedule.UserID // && x.AdjustDate == schedule.AdjustDate && x.WorktimeAdjustmentTypeID == (int)TP_WorktimeAdjustmentType.ChargeAgainst).FirstOrDefault(); //} } UnitOfWork.Delete(x => delID.Contains(x.WorktimeAdjustmentID)); UnitOfWork.BulkInsert(insertList); } } }