using System; using System.Collections.Generic; using System.Linq; using System.Text; using Edu.Common.Enum.Course; using Edu.Common.Enum.System; using System.Web; using Edu.Model.Entity.Grade; using Edu.Model.ViewModel.Course; using Edu.Model.ViewModel.Grade; using Edu.Model.ViewModel.Sell; using Spire.Pdf.Exporting.XPS.Schema; using VT.FW.DB; using VT.FW.DB.Dapper; using Edu.Model.Entity.Sell; using Edu.Model.Entity.User; using Edu.Model.ViewModel.User; using Org.BouncyCastle.Bcpg.OpenPgp; using Castle.Core.Internal; using Edu.Model.ViewModel.Scroll; using Edu.Common.Plugin; using System.Text.RegularExpressions; namespace Edu.Repository.Grade { /// <summary> /// 学员签到仓储层 /// </summary> public class RB_Class_CheckRepository : BaseRepository<RB_Class_Check> { /// <summary> /// 获取签到记录列表 /// </summary> /// <param name="query"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassCheckListRepository(RB_Class_Check_ViewModel query) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.*,IFNULL(B.GuestName,'') AS GuestName,IFNULL(C.ClassName,'') AS ClassName,IFNULL(D.CourseName,'') AS CourseName,IFNULL(E.RoomName,'') AS RoomName ,IFNULL(F.TeacherName,'') AS TeacherName,IFNULL(B.OrderId,0) AS OrderId,IFNULL(F.TeacherHead,'') AS TeacherHead,ct.StartTime,ct.EndTime FROM RB_Class_Check AS A LEFT JOIN rb_order_guest AS B ON A.OrderGuestId=B.Id LEFT JOIN rb_class AS C ON A.ClassId=C.ClassId LEFT JOIN rb_course AS D ON C.CouseId=D.CourseId LEFT JOIN rb_class_room AS E ON A.ClassRoomId=E.RoomId LEFT JOIN rb_teacher AS F ON A.TeacherId=F.TId LEFT JOIN rb_class_time ct on ct.ClassTimeId = A.ClassTimeId WHERE 1=1 AND A.Status=0 "); if (query != null) { if (query.Group_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id); } if (query.School_Id > 0) { //builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.School_Id), query.School_Id); } if (query.ClassId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId); } if (!string.IsNullOrEmpty(query.Q_ClassIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds); } if (query.OrderGuestId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId); } if (!string.IsNullOrEmpty(query.QClassPlanIds)) { builder.AppendFormat(" AND ct.ClassPlanId IN({0}) ", query.QClassPlanIds); } if (!string.IsNullOrEmpty(query.QOrderGuestIds)) { builder.AppendFormat(" AND A.{0} IN({1}) ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.QOrderGuestIds); } if (!string.IsNullOrWhiteSpace(query.StartDate)) { builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate); } if (!string.IsNullOrWhiteSpace(query.EndDate)) { builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')<=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate); } } return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取签到列表 /// </summary> /// <param name="query"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassCheckStatistics(RB_Class_Check_ViewModel query) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.ClassId,A.ClassDate,COUNT(0) AS CheckNum FROM RB_Class_Check AS A WHERE 1=1 AND `Status` =0 and CheckStatus =0 "); if (query != null) { if (query.Group_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id); } if (query.School_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.School_Id), query.School_Id); } if (query.ClassId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId); } if (!string.IsNullOrEmpty(query.Q_ClassIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds); } if (!string.IsNullOrWhiteSpace(query.StartDate)) { builder.AppendFormat(" AND A.{0} >='{1}' ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate); } if (!string.IsNullOrWhiteSpace(query.EndDate)) { builder.AppendFormat(" AND A.{0} <='{1} 23:59:59' ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate); } } builder.AppendFormat(" GROUP BY A.ClassId,A.ClassDate "); return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取签到列表 /// </summary> /// <param name="query"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassCheckStatisticsForYK(RB_Class_Check_ViewModel query) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT C.ClassPlanId as ClassTimeId,A.ClassDate,COUNT(0) AS CheckNum FROM RB_Class_Check AS A inner join rb_class_time C on A.ClassTimeId = C.ClassTimeId WHERE 1=1 AND A.`Status` =0 and A.CheckStatus =0 "); if (query != null) { if (query.Group_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id); } if (!string.IsNullOrEmpty(query.QClassPlanIds)) { builder.AppendFormat(" AND C.ClassPlanId in({0}) ", query.QClassPlanIds); } if (!string.IsNullOrWhiteSpace(query.StartDate)) { builder.AppendFormat(" AND A.{0} >='{1}' ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate); } if (!string.IsNullOrWhiteSpace(query.EndDate)) { builder.AppendFormat(" AND A.{0} <='{1} 23:59:59' ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate); } } builder.AppendFormat(" GROUP BY C.ClassPlanId,A.ClassDate "); return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 班级总人数 /// </summary> /// <param name="classId"></param> /// <returns></returns> public int GetClassToalPeopleNum(int classId, int groupId) { string sql = $@"SELECT count(*) AS Num FROM(SELECT OrderGuestId FROM rb_class_check WHERE `Status`=0 AND Group_Id={groupId} AND ClassId ={classId} GROUP BY OrderGuestId)t"; var obj = ExecuteScalar(sql); if (obj != null) { return Convert.ToInt32(obj); } else { return 0; } } /// <summary> /// 获取平均上课率 /// </summary> /// <param name="classId"></param> /// <param name="group_Id"></param> /// <returns></returns> public decimal GetClassAvgTakeClassRate(int classId, int group_Id) { string sql1 = $@"SELECT COUNT(0) AS TotalNum FROM rb_class_check WHERE `Status`=0 AND Group_Id={group_Id} AND ClassId = {classId};"; string sql2 = $@"SELECT COUNT(0) AS TotalNum FROM rb_class_check WHERE `Status`=0 AND Group_Id={group_Id} AND CheckStatus =0 AND ClassId = {classId};"; var obj1 = ExecuteScalar(sql1); var obj2 = ExecuteScalar(sql2); int Num1 = Convert.ToInt32(obj1 ?? "0"), Num2 = Convert.ToInt32(obj2 ?? "0"); if (Num1 == 0) { return 0; } decimal avgClassRate = Math.Round(Convert.ToDecimal(Num2) / Num1, 2, MidpointRounding.AwayFromZero); return avgClassRate; } /// <summary> /// 学员完成学习分钟数 /// </summary> /// <param name="guestIds">学员编号</param> /// <returns></returns> public List<GuestFinishMinute_ViewModel> GetGuestFinishMinutesRepository(string guestIds, int ClassCheckId = 0) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.OrderGuestId AS GuestId,SUM(A.StudyNum) AS FinishMinutes,SUM(A.CurrentDeductionHours) AS FinishClassHours FROM rb_class_check AS A WHERE A.`Status`=0 "); if (!string.IsNullOrEmpty(guestIds)) { builder.AppendFormat(" AND A.OrderGuestId IN({0})", guestIds); } if (ClassCheckId > 0) { builder.AppendFormat(" AND A.ClassCheckId<>{0} ", ClassCheckId); } builder.AppendFormat(" GROUP BY A.OrderGuestId "); return Get<GuestFinishMinute_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 班级签到完成学习分钟数 /// </summary> /// <param name="classIds">班级编号</param> /// <returns></returns> public List<GuestFinishMinute_ViewModel> GetClassFinishMinutesRepository(string classIds) { string where = ""; if (!string.IsNullOrEmpty(classIds)) { where += string.Format(" AND A.ClassId IN({0}) ", classIds); } StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.ClassId,SUM(A.FinishMinutes) AS FinishMinutes,SUM(A.CurrentDeductionHours) AS FinishClassHours FROM ( SELECT A.ClassId,A.ClassDate,B.ClassPlanId,C.ClassTimeId,a.CurrentDeductionHours ,TIMESTAMPDIFF(MINUTE,(DATE_FORMAT(CONCAT('2021-01-01 ',C.StartTime,':00'),'%Y-%m-%d %H:%i')),(DATE_FORMAT(CONCAT('2021-01-01 ',C.EndTime,':00'), '%Y-%m-%d %H:%i'))) AS FinishMinutes FROM rb_class_check AS A INNER JOIN rb_class_plan AS B ON A.ClassId=B.ClassId AND A.ClassDate=B.ClassDate AND B.`Status`=0 INNER JOIN rb_class_time AS C ON B.ClassPlanId=C.ClassPlanId WHERE 1=1 {0} GROUP BY A.ClassId,A.ClassDate,B.ClassPlanId,C.ClassTimeId ) AS A WHERE 1=1 GROUP BY A.ClassId ", where); return Get<GuestFinishMinute_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取班级签到列表 /// </summary> /// <param name="query"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassCheckList(RB_Class_Check_ViewModel query) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.* FROM RB_Class_Check AS A WHERE 1=1 "); if (query != null) { if (query.Group_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id); } if (query.School_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.School_Id), query.School_Id); } if (query.ClassId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId); } if (query.ClassCheckId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassCheckId), query.ClassCheckId); } if (query.OrderGuestId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId); } if (!string.IsNullOrEmpty(query.QOrderGuestIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.QOrderGuestIds); } if (!string.IsNullOrEmpty(query.Q_ClassIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds); } if (!string.IsNullOrEmpty(query.Q_ClassTimeIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassTimeId), query.Q_ClassTimeIds); } if (!string.IsNullOrWhiteSpace(query.StartDate)) { builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate); } if (!string.IsNullOrWhiteSpace(query.EndDate)) { builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')<=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate); } if (query.ClassTimeId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassTimeId), query.ClassTimeId); } if (!string.IsNullOrWhiteSpace(query.ClassTimeIds)) { builder.AppendFormat(" AND A.{0} in ({1}) ", nameof(RB_Class_Check_ViewModel.ClassTimeId), query.ClassTimeIds); } } return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取班级签到列表 /// </summary> /// <param name="query"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassCheckList_V2(RB_Class_Check_ViewModel query) { StringBuilder builder = new StringBuilder(); builder.AppendFormat($@" SELECT A.*,sog.Student_Id as StuId FROM RB_Class_Check AS A inner join rb_student_orderguest sog on A.OrderGuestId = sog.GuestId WHERE 1=1 "); if (query != null) { if (query.Group_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id); } if (query.School_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.School_Id), query.School_Id); } if (query.ClassId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId); } if (query.ClassCheckId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassCheckId), query.ClassCheckId); } if (query.OrderGuestId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId); } if (query.StuId > 0) { builder.AppendFormat(" AND sog.Student_Id ={0} ", query.StuId); } if (!string.IsNullOrEmpty(query.Q_ClassIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds); } if (!string.IsNullOrEmpty(query.Q_ClassTimeIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassTimeId), query.Q_ClassTimeIds); } if (!string.IsNullOrWhiteSpace(query.StartDate)) { builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')>=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate); } if (!string.IsNullOrWhiteSpace(query.EndDate)) { builder.AppendFormat(" AND DATE_FORMAT(A.{0},'%Y-%m-%d')<=DATE_FORMAT('{1}','%Y-%m-%d') ", nameof(RB_Class_Check_ViewModel.ClassDate), query.EndDate); } if (query.ClassTimeId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassTimeId), query.ClassTimeId); } if (!string.IsNullOrWhiteSpace(query.ClassTimeIds)) { builder.AppendFormat(" AND A.{0} in ({1}) ", nameof(RB_Class_Check_ViewModel.ClassTimeId), query.ClassTimeIds); } } return Get<RB_Class_Check_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取学生的上课时间 /// </summary> /// <param name="groupId"></param> /// <param name="guestIds"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassGuestStudentTimeList(int groupId, string guestIds, string xFStartTime, string xFEndTime) { string where = ""; if (!string.IsNullOrEmpty(xFStartTime)) { where += $@" and ClassDate >= '{xFStartTime}'"; } if (!string.IsNullOrEmpty(xFEndTime)) { where += $@" and ClassDate <= '{xFEndTime} 23:59:59'"; } string sql = $@"SELECT OrderGuestId, SUM(CurrentDeductionHours) as CurrentDeductionHours FROM rb_class_check where `Status`=0 and Group_Id ={groupId} and OrderGuestId in ({guestIds}) {where} group by OrderGuestId"; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } /// <summary> /// 获取订单每月 消费课时 /// </summary> /// <param name="groupId"></param> /// <param name="orderIds"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassStudentHoursListForOrderMonth(int groupId, string orderIds) { string sql = $@"SELECT g.OrderId,DATE_FORMAT(c.ClassDate,'%Y-%m') as MonthDateStr,SUM(c.CurrentDeductionHours) CurrentDeductionHours FROM rb_order_guest g left join rb_class_check c on g.Id = c.OrderGuestId WHERE g.Group_Id ={groupId} and g.`Status`=0 and c.`Status` =0 and g.OrderId in({orderIds}) group by g.OrderId,DATE_FORMAT(c.ClassDate,'%Y-%m');"; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } #region 学生出勤管理 /// <summary> /// 获取学生签到数据 /// </summary> /// <param name="demodel"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetStudentAttendanceDayStatistics(RB_Class_Check_ViewModel query) { DynamicParameters parameters = new DynamicParameters(); StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.*,IFNULL(B.GuestName,'') AS GuestName,IFNULL(C.ClassName,'') AS ClassName,C.ClassNo,IFNULL(D.CourseName,'') AS CourseName,IFNULL(E.RoomName,'') AS RoomName ,IFNULL(F.TeacherName,'') AS TeacherName,CONCAT(ct.StartTime,'~',ct.EndTime) as TimeBucket FROM RB_Class_Check AS A left join rb_class_time ct on ct.ClassTimeId = A.ClassTimeId LEFT JOIN rb_order_guest AS B ON A.OrderGuestId=B.Id LEFT JOIN rb_class AS C ON A.ClassId=C.ClassId LEFT JOIN rb_course AS D ON C.CouseId=D.CourseId LEFT JOIN rb_class_room AS E ON A.ClassRoomId=E.RoomId LEFT JOIN rb_teacher AS F ON A.TeacherId=F.TId WHERE 1=1 AND A.Status=0 "); if (query != null) { if (query.Group_Id > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id); } if (query.School_Id >= 0) { builder.AppendFormat(" AND C.{0}={1} ", nameof(RB_Class_Check_ViewModel.School_Id), query.School_Id); } if (query.ClassId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.ClassId), query.ClassId); } if (query.CouseId > 0) { builder.AppendFormat(" AND C.{0}={1} ", nameof(RB_Class_Check_ViewModel.CouseId), query.CouseId); } if (query.CheckStatus > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.CheckStatus), query.CheckStatus); } if (!string.IsNullOrEmpty(query.Q_ClassIds)) { builder.AppendFormat(" AND A.{0} in({1}) ", nameof(RB_Class_Check_ViewModel.ClassId), query.Q_ClassIds); } if (query.OrderGuestId > 0) { builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId); } if (!string.IsNullOrEmpty(query.GuestName)) { builder.AppendFormat(" AND B.GuestName like @GuestName "); parameters.Add("GuestName", "%" + query.GuestName + "%"); } if (!string.IsNullOrWhiteSpace(query.StartDate)) { builder.AppendFormat(" AND A.{0} ='{1}' ", nameof(RB_Class_Check_ViewModel.ClassDate), query.StartDate); } } return Get<RB_Class_Check_ViewModel>(builder.ToString(), parameters).ToList(); } #endregion #region 报表统计 /// <summary> /// 获取教师时间范围内 累计上课时长 /// </summary> /// <param name="groupId"></param> /// <param name="userIds"></param> /// <param name="startMonth"></param> /// <param name="endMonth"></param> public List<RB_Class_Check_ViewModel> GetTeacherHoursList(int groupId, string userIds, string startMonth, string endMonth) { string sql = $@"SELECT tt.TeacherId,tt.ClassId,SUM(timestampdiff(MINUTE,CONCAT('2021-06-28 ',tt.StartTime),CONCAT('2021-06-28 ',tt.EndTime))) as StudyNum FROM( SELECT p.TeacherId,p.ClassId,p.ClassTimeId,t.StartTime,t.EndTime FROM rb_class_check p INNER JOIN rb_class_time t on p.ClassTimeId = t.ClassTimeId WHERE p.`Status`=0 and p.Group_Id ={groupId} and p.TeacherId in ({userIds}) and p.ClassDate >= '{startMonth}' and p.ClassDate <='{endMonth} 23:59:59' GROUP BY p.TeacherId,p.ClassId,p.ClassTimeId )tt GROUP BY tt.TeacherId,tt.ClassId;"; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } /// <summary> /// 获取学生时间范围内 累计上课时长 + 合同课时单价 /// </summary> /// <param name="groupId"></param> /// <param name="userIds"></param> /// <param name="startMonth"></param> /// <param name="endMonth"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetStudentHoursList(int groupId, string userIds, string startMonth, string endMonth) { string sql = $@"SELECT q.TeacherId,q.OrderGuestId,q.CurrentDeductionHours, case when q.ClassHours>0 and q.TotalSub >0 then (q.CourseFee - q.DiscountMoney / q.TotalSub * q.CourseFee) /q.ClassHours else 0 END AS UnitPrice FROM ( SELECT tt.TeacherId,tt.OrderGuestId,tt.CurrentDeductionHours ,IFNULL(o.PreferPrice,0) -IFNULL(o.TextbookFee,0) -IFNULL(o.CoursewareFee,0) as CourseFee ,IFNULL(o.DiscountMoney,0) as DiscountMoney ,IFNULL(o.PreferPrice,0) as TotalSub ,IFNULL(g.TotalHours,0) as ClassHours FROM( SELECT p.TeacherId,p.OrderGuestId,SUM(p.CurrentDeductionHours) as CurrentDeductionHours FROM rb_class_check p WHERE p.`Status`=0 and p.Group_Id ={groupId} and p.TeacherId in ({userIds}) and p.ClassDate >= '{startMonth}' and p.ClassDate <='{endMonth} 23:59:59' GROUP BY p.TeacherId,p.OrderGuestId )tt left join rb_order_guest g on g.Id = tt.OrderGuestId left join rb_order o on o.OrderId =g.OrderId GROUP BY tt.TeacherId,tt.OrderGuestId )q"; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } /// <summary> /// 获取老师课时统计明细 /// </summary> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="count"></param> /// <param name="teacherId"></param> /// <param name="schoolId"></param> /// <param name="classId"></param> /// <param name="startMonth"></param> /// <param name="endMonth"></param> /// <param name="group_Id"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetTeacherConsumptionHoursDetialPageList(int pageIndex, int pageSize, out long count, int teacherId, int schoolId, int classId, string startMonth, string endMonth, int group_Id) { string where = $@" "; if (teacherId > 0) { where += $@" and p.TeacherId ={teacherId}"; } if (schoolId >= 0) { where += $@" and case when cp.PlanType=2 then cp.School_Id ={schoolId} else c.School_Id ={schoolId} end"; } if (classId > 0) { where += $@" and p.ClassId ={classId}"; } string sql = $@" SELECT p.TeacherId,t2.TeacherName,t2.BaseHourFee,t2.BaseHoursEnabled,t2.EnableTime,t2.BaseHoursAdd,if(cp.PlanType=2,'预约课',c.ClassName) as ClassName,if(cp.PlanType=2,co2.CourseName,co.CourseName) as CourseName,p.ClassId,if(cp.PlanType=2,co2.AddHoursMoney,co.AddHoursMoney) as CourseAddHoursMoney, c.ClassType,c.ClassNo,if(cp.PlanType=2,s2.SName,s.SName) as SName,c.ClassHourMinute,if(cp.PlanType=2,cp.CourseId,c.CouseId) as CouseId,p.ClassDate,p.ClassTimeId,t.StartTime as StartDate,t.EndTime as EndDate,Max(p.CurrentDeductionHours) as CurrentDeductionHours FROM rb_class_check p INNER JOIN rb_class_time t on p.ClassTimeId = t.ClassTimeId inner join rb_class_plan cp on t.ClassPlanId = cp.ClassPlanId LEFT JOIN rb_teacher t2 on p.TeacherId = t2.TId LEFT JOIN rb_class c on p.ClassId = c.ClassId LEFT JOIN rb_course co on c.CouseId = co.CourseId left join rb_course co2 on cp.CourseId = co2.CourseId left join rb_school s on s.SId = c.School_Id left join rb_school s2 on s2.SId = cp.School_Id WHERE p.`Status`=0 and p.Group_Id ={group_Id} {where} and p.ClassDate >= '{startMonth}' and p.ClassDate <='{endMonth} 23:59:59' GROUP BY p.TeacherId,p.ClassId,p.ClassTimeId ORDER BY p.ClassDate ASC "; return GetPage<RB_Class_Check_ViewModel>(pageIndex, pageSize, out count, sql).ToList(); } /// <summary> /// 获取老师课时统计明细 /// </summary> /// <param name="teacherIds"></param> /// <param name="schoolId"></param> /// <param name="classId"></param> /// <param name="startMonth"></param> /// <param name="endMonth"></param> /// <param name="group_Id"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetTeacherConsumptionHoursDetialList(string teacherIds, int schoolId, int classId, string startMonth, string endMonth, int group_Id) { string where = $@" "; if (!string.IsNullOrEmpty(teacherIds) && teacherIds != "-1" && teacherIds != "0") { where += $@" and p.TeacherId in({teacherIds})"; } if (schoolId >= 0) { where += $@" and case when cp.PlanType=2 then cp.School_Id ={schoolId} else c.School_Id ={schoolId} end"; } if (classId > 0) { where += $@" and p.ClassId ={classId}"; } string sql = $@" SELECT p.TeacherId,t2.TeacherName,t2.BaseHourFee,t2.BaseHoursEnabled,t2.EnableTime,if(cp.PlanType=2,'预约课',c.ClassName) as ClassName,if(cp.PlanType=2,co2.CourseName,co.CourseName) as CourseName,if(cp.PlanType=2,co2.AddHoursMoney,co.AddHoursMoney) as CourseAddHoursMoney, p.ClassId,if(cp.PlanType=2,s2.SName,s.SName) as SName,c.ClassType,c.ClassNo,c.ClassHourMinute,if(cp.PlanType=2,cp.CourseId,c.CouseId) as CouseId,p.ClassDate,p.ClassTimeId,t.StartTime as StartDate,t.EndTime as EndDate,Max(p.CurrentDeductionHours) as CurrentDeductionHours FROM rb_class_check p INNER JOIN rb_class_time t on p.ClassTimeId = t.ClassTimeId inner join rb_class_plan cp on t.ClassPlanId = cp.ClassPlanId LEFT JOIN rb_teacher t2 on p.TeacherId = t2.TId LEFT JOIN rb_class c on p.ClassId = c.ClassId LEFT JOIN rb_course co on c.CouseId = co.CourseId left join rb_course co2 on cp.CourseId = co2.CourseId left join rb_school s on s.SId = c.School_Id left join rb_school s2 on s2.SId = cp.School_Id WHERE p.`Status`=0 and p.Group_Id ={group_Id} {where} and p.ClassDate >= '{startMonth}' and p.ClassDate <='{endMonth} 23:59:59' GROUP BY p.TeacherId,p.ClassId,p.ClassTimeId ORDER BY p.ClassDate ASC "; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } /// <summary> /// 获取学生课时统计明细 /// </summary> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <param name="count"></param> /// <param name="teacherId"></param> /// <param name="schoolId"></param> /// <param name="classId"></param> /// <param name="startMonth"></param> /// <param name="endMonth"></param> /// <param name="studentName"></param> /// <param name="orderId"></param> /// <param name="contractNo"></param> /// <param name="groupId"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetStudentConsumptionHoursDetialPageList(int pageIndex, int pageSize, out long count, int teacherId, int schoolId, int classId, string startMonth, string endMonth, string studentName, int orderId, string contractNo, int groupId, int StudentId) { string where = $@" "; if (teacherId > 0) { where += $@" and p.TeacherId ={teacherId}"; } if (schoolId >= 0) { where += $@" and case when cp.PlanType=2 then cp.School_Id ={schoolId} else c.School_Id ={schoolId} end"; } if (classId > 0) { where += $@" and case when cp.PlanType=2 then t2.ClassId ={classId} else p.ClassId ={classId} end"; } if (!string.IsNullOrEmpty(studentName)) { where += $@" and t2.GuestName like '%{studentName}%'"; } if (orderId > 0) { where += $@" and t2.OrderId ={orderId}"; } if (StudentId > 0) { where += $@" and t2.Id ={StudentId}"; } if (!string.IsNullOrEmpty(contractNo)) { where += $@" and ec.ContractNo ='{contractNo}'"; } string sql = $@" SELECT tt.*, case when tt.ClassHours>0 and tt.TotalSub >0 then (tt.CourseFee - tt.DiscountMoney / tt.TotalSub * tt.CourseFee) /tt.ClassHours else 0 END AS UnitPrice FROM ( SELECT p.OrderGuestId,p.CurrentDeductionHours,t2.GuestName,p.TeacherId,t3.TeacherName,t2.OrderId,ec.ContractNo,if(cp.PlanType=2,'预约课',c.ClassName) as ClassName,c.ClassNo,if(cp.PlanType=2,co2.CourseName,co.CourseName) as CourseName,p.ClassId,if(cp.PlanType=2,cp.CourseId,c.CouseId) as CouseId ,p.ClassDate,p.ClassTimeId,t.StartTime as StartDate,t.EndTime as EndDate,o.EnterID,o.HelpEnterId ,IFNULL(o.PreferPrice,0) -IFNULL(o.TextbookFee,0) -IFNULL(o.CoursewareFee,0) as CourseFee ,IFNULL(o.DiscountMoney,0) as DiscountMoney ,IFNULL(o.PreferPrice,0) as TotalSub ,IFNULL(t2.TotalHours,0) as ClassHours ,o.JoinType,o.TargetJoinType,o.SourceOrderId,o.TargetOrderId FROM rb_class_check p INNER JOIN rb_class_time t on p.ClassTimeId = t.ClassTimeId inner join rb_class_plan cp on t.ClassPlanId = cp.ClassPlanId LEFT JOIN rb_order_guest t2 on p.OrderGuestId = t2.Id LEFT JOIN rb_order o on o.OrderId = t2.OrderId LEFT JOIN rb_teacher t3 on p.TeacherId = t3.TId LEFT JOIN rb_class c on p.ClassId = c.ClassId LEFT JOIN rb_course co on c.CouseId = co.CourseId left join rb_course co2 on cp.CourseId = co2.CourseId LEFT JOIN rb_education_contract ec on ec.GuestId = p.OrderGuestId WHERE p.`Status`=0 and p.Group_Id ={groupId} {where} and p.ClassDate >= '{startMonth}' and p.ClassDate <='{endMonth} 23:59:59' ) tt ORDER BY tt.ClassDate ASC "; return GetPage<RB_Class_Check_ViewModel>(pageIndex, pageSize, out count, sql).ToList(); } /// <summary> /// 获取学生课时统计明细 /// </summary> /// <param name="teacherId"></param> /// <param name="schoolId"></param> /// <param name="classId"></param> /// <param name="startMonth"></param> /// <param name="endMonth"></param> /// <param name="studentName"></param> /// <param name="orderId"></param> /// <param name="contractNo"></param> /// <param name="groupId"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetStudentConsumptionHoursDetialList(int teacherId, int schoolId, int classId, string startMonth, string endMonth, string studentName, int orderId, string contractNo, int groupId, string classIds = "", int StudentId = 0) { string where = $@" "; if (teacherId > 0) { where += $@" and p.TeacherId ={teacherId}"; } if (schoolId >= 0) { where += $@" and case when cp.PlanType=2 then cp.School_Id ={schoolId} else c.School_Id ={schoolId} end"; } if (classId > 0) { where += $@" and case when cp.PlanType=2 then t2.ClassId ={classId} else p.ClassId ={classId} end"; } if (!string.IsNullOrEmpty(classIds) && classIds != "0") { where += $@" and case when cp.PlanType=2 then t2.ClassId in({classIds}) else p.ClassId in({classIds}) end"; } if (!string.IsNullOrEmpty(studentName)) { where += $@" and t2.GuestName like '%{studentName}%'"; } if (orderId > 0) { where += $@" and t2.OrderId ={orderId}"; } if (StudentId > 0) { where += $@" and t2.Id ={StudentId}"; } if (!string.IsNullOrEmpty(contractNo)) { where += $@" and ec.ContractNo ='{contractNo}'"; } string sql = $@" SELECT tt.*, case when tt.ClassHours>0 and tt.TotalSub >0 then (tt.CourseFee - tt.DiscountMoney / tt.TotalSub * tt.CourseFee) /tt.ClassHours else 0 END AS UnitPrice FROM ( SELECT p.OrderGuestId,p.CurrentDeductionHours,t2.GuestName,p.TeacherId,t3.TeacherName,t2.OrderId,ec.ContractNo,if(cp.PlanType=2,'预约课',c.ClassName) as ClassName,c.ClassNo,if(cp.PlanType=2,co2.CourseName,co.CourseName) as CourseName,p.ClassId,if(cp.PlanType=2,cp.CourseId,c.CouseId) as CouseId ,p.ClassDate,p.ClassTimeId,t.StartTime as StartDate,t.EndTime as EndDate,o.EnterID,o.HelpEnterId ,IFNULL(o.PreferPrice,0) -IFNULL(o.TextbookFee,0) -IFNULL(o.CoursewareFee,0) as CourseFee ,IFNULL(o.DiscountMoney,0) as DiscountMoney ,IFNULL(o.PreferPrice,0) as TotalSub ,IFNULL(t2.TotalHours,0) as ClassHours FROM rb_class_check p INNER JOIN rb_class_time t on p.ClassTimeId = t.ClassTimeId inner join rb_class_plan cp on t.ClassPlanId = cp.ClassPlanId LEFT JOIN rb_order_guest t2 on p.OrderGuestId = t2.Id LEFT JOIN rb_order o on o.OrderId = t2.OrderId LEFT JOIN rb_teacher t3 on p.TeacherId = t3.TId LEFT JOIN rb_class c on p.ClassId = c.ClassId LEFT JOIN rb_course co on c.CouseId = co.CourseId left join rb_course co2 on cp.CourseId = co2.CourseId LEFT JOIN rb_education_contract ec on ec.GuestId = p.OrderGuestId WHERE p.`Status`=0 and p.Group_Id ={groupId} {where} and p.ClassDate >= '{startMonth}' and p.ClassDate <='{endMonth} 23:59:59' ) tt ORDER BY tt.ClassDate ASC "; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } #endregion #region 营收报表 /// <summary> /// 获取班级已上课时 /// </summary> /// <param name="groupId"></param> /// <param name="classIds"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassLearnHoursList(int groupId, string classIds) { string sql = $@"SELECT t.ClassId,SUM(t.CurrentDeductionHours) AS CurrentDeductionHours FROM( SELECT case when cp.PlanType=2 then t2.ClassId else p.ClassId end as ClassId,p.ClassDate,p.ClassTimeId,MAX(p.CurrentDeductionHours) as CurrentDeductionHours FROM rb_class_check p INNER JOIN rb_class_time t on p.ClassTimeId = t.ClassTimeId inner join rb_class_plan cp on t.ClassPlanId = cp.ClassPlanId LEFT JOIN rb_order_guest t2 on p.OrderGuestId = t2.Id WHERE p.`Status` =0 and p.Group_Id ={groupId} and case when cp.PlanType=2 then t2.ClassId in({classIds}) else p.ClassId in({classIds}) end GROUP BY case when cp.PlanType=2 then t2.ClassId else p.ClassId end,p.ClassDate,p.ClassTimeId )t GROUP BY t.ClassId"; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } /// <summary> /// 获取班级学生已上课金额 /// </summary> /// <param name="groupId"></param> /// <param name="classIds"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetClassStuLearnMoneyList(int groupId, string classIds) { string sql = $@"SELECT hq.ClassId, SUM(hq.CurrentDeductionHours * hq.UnitPrice) AS UnitPrice FROM ( SELECT q.ClassId,q.OrderGuestId,q.CurrentDeductionHours, case when q.ClassHours>0 and q.TotalSub >0 then (q.CourseFee - q.DiscountMoney / q.TotalSub * q.CourseFee) /q.ClassHours else 0 END AS UnitPrice FROM ( SELECT tt.ClassId,tt.OrderGuestId,tt.CurrentDeductionHours ,IFNULL(o.PreferPrice,0) -IFNULL(o.TextbookFee,0) -IFNULL(o.CoursewareFee,0) as CourseFee ,IFNULL(o.DiscountMoney,0) as DiscountMoney ,IFNULL(o.PreferPrice,0) as TotalSub ,IFNULL(g.TotalHours,0) as ClassHours FROM( SELECT case when cp.PlanType=2 then t2.ClassId else p.ClassId end as ClassId,p.OrderGuestId,SUM(p.CurrentDeductionHours) as CurrentDeductionHours FROM rb_class_check p INNER JOIN rb_class_time t on p.ClassTimeId = t.ClassTimeId inner join rb_class_plan cp on t.ClassPlanId = cp.ClassPlanId LEFT JOIN rb_order_guest t2 on p.OrderGuestId = t2.Id WHERE p.`Status`=0 and p.Group_Id ={groupId} and case when cp.PlanType=2 then t2.ClassId in({classIds}) else p.ClassId in({classIds}) end GROUP BY case when cp.PlanType=2 then t2.ClassId else p.ClassId end,p.OrderGuestId )tt left join rb_order_guest g on g.Id = tt.OrderGuestId left join rb_order o on o.OrderId =g.OrderId GROUP BY tt.ClassId,tt.OrderGuestId )q)hq GROUP BY hq.ClassId"; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } #endregion #region 简易报表 /// <summary> /// 获取时间范围内的班级 /// </summary> /// <param name="startTime"></param> /// <param name="endTime"></param> /// <param name="classId"></param> /// <param name="classNo"></param> /// <param name="group_Id"></param> /// <returns></returns> public List<RB_Class_Check_ViewModel> GetAllClassNowMonthStatistics(string startTime, string endTime, int classId, string classNo, int schoolId, int group_Id) { string where = ""; if (classId > 0) { where += $@" and case when cp.PlanType=2 then t2.ClassId ={classId} else cc.ClassId ={classId} end"; } if (schoolId >= 0) { where += $@" and case when cp.PlanType=2 then cp.School_Id ={schoolId} else c.School_Id ={schoolId} end"; } if (!string.IsNullOrEmpty(classNo)) { where += " and c.ClassNo ='" + classNo + "'"; } string sql = $@" SELECT q.ClassId,q.ClassNo,q.ClassName,SUM(q.CurrentDeductionHours) AS CurrentDeductionHours FROM( SELECT case when cp.PlanType=2 then t2.ClassId else cc.ClassId end as ClassId,cc.ClassDate,cc.ClassTimeId,MAX(cc.CurrentDeductionHours) as CurrentDeductionHours, case when cp.PlanType=2 then c2.ClassName else c.ClassName end as ClassName,case when cp.PlanType=2 then c2.ClassNo else c.ClassNo end as ClassNo FROM rb_class_check cc INNER JOIN rb_class_time t on cc.ClassTimeId = t.ClassTimeId inner join rb_class_plan cp on t.ClassPlanId = cp.ClassPlanId LEFT JOIN rb_order_guest t2 on cc.OrderGuestId = t2.Id LEFT JOIN rb_class c on cc.ClassId = c.ClassId LEFT JOIN rb_class c2 on t2.ClassId = c2.ClassId WHERE cc.`Status` =0 and cc.Group_Id ={group_Id} and cc.ClassDate >='{startTime}' and cc.ClassDate <='{endTime} 23:59:59' {where} GROUP BY case when cp.PlanType=2 then t2.ClassId else cc.ClassId end,cc.ClassDate,cc.ClassTimeId)q GROUP BY q.ClassId"; return Get<RB_Class_Check_ViewModel>(sql).ToList(); } #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_Class_Check_ViewModel> GetClassCheckPageList(int pageIndex, int pageSize, out long rowsCount, RB_Class_Check_ViewModel query) { StringBuilder builderWhere = new StringBuilder(); StringBuilder builder = new StringBuilder(); StringBuilder builderMakeUp = new StringBuilder(); if (query != null) { if (query.Group_Id > 0) { builderWhere.AppendFormat(" AND a.{0}={1} ", nameof(RB_Class_Check_ViewModel.Group_Id), query.Group_Id); } if (query.OrderGuestId > 0) { builderWhere.AppendFormat(" AND a.{0}={1} ", nameof(RB_Class_Check_ViewModel.OrderGuestId), query.OrderGuestId); } if (query.CheckStatus > -1) { builderWhere.AppendFormat(" AND a.{0}={1} ", nameof(RB_Class_Check_ViewModel.CheckStatus), query.CheckStatus); if (query.CheckStatus == 1 && query.MakeUpStatus == 2) { builderMakeUp.AppendFormat(" INNER JOIN rb_student_makeup as stum on stum.ClassCheckId=a.ClassCheckId and stum.MakeUpStatus=2"); } } } builder.AppendFormat(@" SELECT A.*,IFNULL(B.GuestName,'') AS GuestName,IFNULL(C.ClassName,'') AS ClassName,C.ClassNo,IFNULL(D.CourseName,'') AS CourseName,IFNULL(E.RoomName,'') AS RoomName ,IFNULL(F.TeacherName,'') AS TeacherName,CONCAT(ct.StartTime,'~',ct.EndTime) as TimeBucket FROM RB_Class_Check AS A {0} left join rb_class_time ct on ct.ClassTimeId = A.ClassTimeId LEFT JOIN rb_order_guest AS B ON A.OrderGuestId=B.Id LEFT JOIN rb_class AS C ON A.ClassId=C.ClassId LEFT JOIN rb_course AS D ON C.CouseId=D.CourseId LEFT JOIN rb_class_room AS E ON A.ClassRoomId=E.RoomId LEFT JOIN rb_teacher AS F ON A.TeacherId=F.TId WHERE 1=1 AND A.Status=0 {1} ", builderMakeUp.ToString(), builderWhere.ToString()); return GetPage<RB_Class_Check_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList(); } #endregion /// <summary> /// 班课学员签到 /// </summary> /// <param name="list">学员信息</param> /// <param name="CheckType">1-班课,2-约课</param> /// <returns></returns> public bool StudentCheckRepository(List<RB_Class_Check_ViewModel> list,int CheckType) { bool flag = false; List<RB_Order_Guest_Extend> guestList = new List<RB_Order_Guest_Extend>(); List<RB_Order_ViewModel> orderList = new List<RB_Order_ViewModel>(); List<RB_Class_Time_ViewModel> classTimeList = new List<RB_Class_Time_ViewModel>(); List<Common.Message.PushMessageModel> pushList = new List<Common.Message.PushMessageModel>(); List<RB_Class_Check_ViewModel> oldCheckList = new List<RB_Class_Check_ViewModel>(); List<RB_Class_ViewModel> classList = new List<RB_Class_ViewModel>(); List<RB_Employee_Extend> empList = new List<RB_Employee_Extend>(); if (list != null && list.Count > 0) { string orderGuestIds = string.Join(",", list.Select(qitem => qitem.OrderGuestId).Distinct()); if (!string.IsNullOrEmpty(orderGuestIds)) { guestList= GetOrderGuestListRepository(orderGuestIds); oldCheckList = GetClassCheckList(new RB_Class_Check_ViewModel() { QOrderGuestIds = orderGuestIds }); } if (guestList != null && guestList.Count > 0) { string orderIds = string.Join(",", guestList.Select(qitem => qitem.OrderId).Distinct()); if (!string.IsNullOrEmpty(orderIds)) { orderList= GetOrderListRepository(orderIds); } } if (orderList != null && orderList.Count > 0) { string enterIDs = string.Join(",", orderList.Select(qitem => qitem.EnterID).Distinct()); if (!string.IsNullOrEmpty(enterIDs)) { empList= GetEmployeeListRepository(enterIDs); } } string classTimeIds = string.Join(",", list.Select(qitem => qitem.ClassTimeId).Distinct()); if (!string.IsNullOrEmpty(classTimeIds)) { classTimeList = GetClassTimeListRepository(classTimeIds,""); } string classIds = string.Join(",", list.Select(qitem => qitem.ClassId).Distinct()); if (!string.IsNullOrEmpty(classIds)) { classList= GetClassListRepository(classIds); } } foreach (var item in list) { var guestModel = guestList?.FirstOrDefault(qitem => qitem.Id == item.OrderGuestId) ?? new RB_Order_Guest_Extend(); item.CurrentDeductionHours = classTimeList?.FirstOrDefault(qitem => qitem.ClassTimeId == item.ClassTimeId)?.TimeHour ?? 2; decimal currentDeductionHours = item.CurrentDeductionHours; //if (item.CheckStatus == 2) //{ // currentDeductionHours = 0; //} if (item.ClassCheckId > 0) { Dictionary<string, object> fileds = new Dictionary<string, object>() { { nameof(RB_Class_Check_ViewModel.CheckStatus),item.CheckStatus}, { nameof(RB_Class_Check_ViewModel.StudyNum),item.StudyNum}, { nameof(RB_Class_Check_ViewModel.CurrentDeductionHours),currentDeductionHours}, }; List<WhereHelper> wheres = new List<WhereHelper>() { new WhereHelper (nameof(RB_Class_Check_ViewModel.ClassCheckId),item.ClassCheckId) }; flag = base.Update(fileds, wheres); } else { item.CurrentDeductionHours = currentDeductionHours; item.MakeUpStatus = 1; var newId = base.Insert(item); item.ClassCheckId = newId; flag = newId > 0; } var guestOldCheckList = oldCheckList?.Where(qitem => qitem.OrderGuestId == item.OrderGuestId && qitem.ClassTimeId != item.ClassTimeId)?.ToList() ?? new List<RB_Class_Check_ViewModel>(); decimal guestOldFinishHours = 0; if (guestOldCheckList != null && guestOldCheckList.Count > 0) { guestOldFinishHours = guestOldCheckList.Sum(qitem => qitem.CurrentDeductionHours); } if (flag) { //更新学员完成课时 var completeHours = guestOldFinishHours + currentDeductionHours; Dictionary<string, object> orderFileds = new Dictionary<string, object>() { {nameof(RB_Order_Guest_ViewModel.CompleteHours),completeHours } }; var orderModel = orderList?.FirstOrDefault(qitem => qitem.OrderId == guestModel.OrderId); string LogContent = ""; var shenyuHours = guestModel.TotalHours - completeHours; var classModel = classList?.FirstOrDefault(qitem => qitem.ClassId == guestModel.ClassId); var sellerInfo = empList?.FirstOrDefault(qitem => qitem.EmployeeId == orderModel.EnterID); if (shenyuHours > 0 && shenyuHours <= 12) { var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice; #region 即将结课提醒 (销售端) if (sellerInfo != null && !string.IsNullOrEmpty(sellerInfo?.WorkUserId ?? "")) { // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称 var path = $"/sale/myOrder?OrderId={guestModel.OrderId}"; path = HttpUtility.UrlEncode(path); string markdownContent = $"`结课预警` 学员即将结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId}\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Common.Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})"; Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel() { CategoryId = PushMessageCategoryEnum.SalePeople, Content = markdownContent, CoverImg = "", CreateByName = "系统", JumpUrl = "", WorkMsgType = "markdown", SendTime = DateTime.Now, SendType = 0, Title = "学员即将结课通知", Platform = 5, ReceiveId = sellerInfo?.WorkUserId }; pushList.Add(modelWork); } #endregion #region 即将结课提醒 (管理端) var queryNotifyManager = GetWorkUserIdByDictRepository("Push_EndClass"); if (queryNotifyManager != null && queryNotifyManager.Count > 0) { queryNotifyManager.ForEach(x => { // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称 var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}"; path = HttpUtility.UrlEncode(path); string markdownContent = $"`结课预警` 学员即将结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId} ({sellerInfo?.EmName ?? ""})\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Common.Config.ErpUrl}/autologin?loginId={x.Id}&target={path})"; Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel() { CategoryId = PushMessageCategoryEnum.SalePeople, Content = markdownContent, CoverImg = "", CreateByName = "系统", JumpUrl = "", WorkMsgType = "markdown", SendTime = DateTime.Now, SendType = 0, Title = "学员即将结课通知", Platform = 5, ReceiveId = x.WorkUserId }; pushList.Add(modelWork); }); } #endregion } else if (shenyuHours <= 0) { var shengyuMoney = orderModel.PreferPrice - orderModel.Income + orderModel.Refund - orderModel.PlatformTax - orderModel.DiscountMoney - orderModel.LessPrice; #region 即将结课提醒 (销售端) if (sellerInfo != null && !string.IsNullOrEmpty(sellerInfo?.WorkUserId ?? "")) { // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称 var path = $"/sale/myOrder?OrderId={guestModel.OrderId}"; path = HttpUtility.UrlEncode(path); string markdownContent = $"`结课通知` 学员已结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId}\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Common.Config.ErpUrl}/autologin?loginId={orderModel.EnterID}&target={path})"; Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel() { CategoryId = PushMessageCategoryEnum.SalePeople, Content = markdownContent, CoverImg = "", CreateByName = "系统", JumpUrl = "", WorkMsgType = "markdown", SendTime = DateTime.Now, SendType = 0, Title = "学员已结课通知", Platform = 5, ReceiveId = sellerInfo?.WorkUserId ?? "" }; pushList.Add(modelWork); } #endregion #region 即将结课提醒 (销售端) var queryNotifyManager = GetWorkUserIdByDictRepository("Push_EndClass"); if (queryNotifyManager != null && queryNotifyManager.Count > 0) { queryNotifyManager.ForEach(x => { // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称 var path = $"/sale/orderStatistics?OrderId={guestModel.OrderId}"; path = HttpUtility.UrlEncode(path); string markdownContent = $"`结课通知` 学员已结课通知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>剩余课时:<font color='warning'>{shenyuHours}</font>\n>是否续班:<font color='{(orderModel.RenewOrderId > 0 ? "info" : "warning")}'>{(orderModel.RenewOrderId > 0 ? "已续班(" + orderModel.RenewOrderId + ")" : "未续班")}</font>\n>关联单号:{guestModel.OrderId} ({sellerInfo?.EmName ?? ""})\n>\n>班级名称:<font>{classModel.ClassName}</font>\n>请点击:[查看详情]({Common.Config.ErpUrl}/autologin?loginId={x.Id}&target={path})"; Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel() { CategoryId = PushMessageCategoryEnum.SalePeople, Content = markdownContent, CoverImg = "", CreateByName = "系统", JumpUrl = "", WorkMsgType = "markdown", SendTime = DateTime.Now, SendType = 0, Title = "学员已结课通知", Platform = 5, ReceiveId = x.WorkUserId }; pushList.Add(modelWork); }); } #endregion } if (item.CheckStatus == 1) { #region 通知缺勤信息 var queryNotifyManager = GetWorkUserIdByDictRepository("Push_Absence"); if (queryNotifyManager != null && queryNotifyManager.Count > 0) { queryNotifyManager.ForEach(x => { // 学员名称(名称+电话),剩余课时,关联单号,待收金额,班级老师,班级名称 var path = $"/stuMan/studentManage?OrderId={guestModel.OrderId}"; path = HttpUtility.UrlEncode(path); string markdownContent = $"`缺勤通知` 学员缺勤信息告知\n>**概要信息** \n>学员名称:{guestModel.GuestName}({guestModel.Mobile})\n>缺勤时间:<font color='warning'>{Common.ConvertHelper.FormatDate(item.ClassDate)}</font>\n>关联单号:{guestModel.OrderId}\n>班级名称:<font>{classModel?.ClassName??""}</font>\n>请点击:[查看详情]({Common.Config.ErpUrl}/autologin?loginId={x.Id}&target={path})"; Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel() { CategoryId = PushMessageCategoryEnum.SalePeople, Content = markdownContent, CoverImg = "", CreateByName = "系统", JumpUrl = "", WorkMsgType = "markdown", SendTime = DateTime.Now, SendType = 0, Title = "学员缺勤通知", Platform = 5, ReceiveId = x.WorkUserId }; pushList.Add(modelWork); }); } #endregion } DynamicParameters guestParamters = new DynamicParameters(); string guestSql = "UPDATE RB_Order_Guest SET "; int guestIndex = 0; foreach (var gItem in orderFileds) { if (guestIndex > 0) { guestSql += ","; } guestSql += string.Format("{0}=@{0} ", gItem.Key); guestParamters.Add(string.Format("@{0}", gItem.Key), gItem.Value); guestIndex++; } guestSql += string.Format(" WHERE 1=1 AND Id=@Id "); guestParamters.Add("@Id", item.OrderGuestId); flag = base.Execute(guestSql, guestParamters) > 0; if (flag && !string.IsNullOrEmpty(LogContent)) { AddUserChangeLogRepository(new Model.Entity.Log.RB_User_ChangeLog() { Id = 0, Type = 3, CreateBy = item.CreateBy, CreateTime = DateTime.Now, Group_Id = item.Group_Id, LogContent = LogContent, School_Id = item.School_Id, SourceId = guestModel.Id }); } #region B2B同业推送 if (orderModel != null && orderModel.CustomerId > 0) { //最后5个课时做处理 if (completeHours > guestModel.ValidClassHours) { //已停课 AddStudentNoticeRepository(new Model.Entity.Log.RB_B2B_StudentNotice() { Id = 0, Type = 3, StudentId = guestModel.Id, CustomerId = orderModel.CustomerId, Title = "停课通知", Content = "学员" + guestModel.GuestName + " 有效课时消耗完毕,已自动停课,关联单号:" + guestModel.OrderId + "!", IsLook = 2, Status = 0, CreateBy = item.CreateBy, CreateTime = DateTime.Now, Group_Id = item.Group_Id, UpdateTime = DateTime.Now }); } else if (guestModel.TotalHours > guestModel.ValidClassHours && shenyuHours <= 5) { //即将欠费 AddStudentNoticeRepository(new Model.Entity.Log.RB_B2B_StudentNotice() { Id = 0, Type = 1, StudentId = guestModel.Id, CustomerId = orderModel.CustomerId, Title = "欠费预警", Content = "学员" + guestModel.GuestName + " 即将欠费,剩余课时" + shenyuHours + ",关联单号:" + guestModel.OrderId + "!", IsLook = 2, Status = 0, CreateBy = item.CreateBy, CreateTime = DateTime.Now, Group_Id = item.Group_Id, UpdateTime = DateTime.Now }); } else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours <= 5 && shenyuHours >= 0) { //即将结课 AddStudentNoticeRepository(new Model.Entity.Log.RB_B2B_StudentNotice() { Id = 0, Type = 2, StudentId = guestModel.Id, CustomerId = orderModel.CustomerId, Title = "结课预警", Content = "学员" + guestModel.GuestName + " 即将结课,剩余课时" + shenyuHours + ",关联单号:" + guestModel.OrderId + "!", IsLook = 2, Status = 0, CreateBy = item.CreateBy, CreateTime = DateTime.Now, Group_Id = item.Group_Id, UpdateTime = DateTime.Now }); } else if (guestModel.TotalHours == guestModel.ValidClassHours && shenyuHours == 0) { //已经结课 AddStudentNoticeRepository(new Model.Entity.Log.RB_B2B_StudentNotice() { Id = 0, Type = 4, StudentId = guestModel.Id, CustomerId = orderModel.CustomerId, Title = "结课通知", Content = "学员" + guestModel.GuestName + " 已结课,关联单号:" + guestModel.OrderId + "!", IsLook = 2, Status = 0, CreateBy = item.CreateBy, CreateTime = DateTime.Now, Group_Id = item.Group_Id, UpdateTime = DateTime.Now }); } } #endregion } } if (pushList != null && pushList.Count > 0) { new Common.Message.MessageHelper().SendMessage(pushList); } return flag; } /// <summary> /// 约课学员签到 /// </summary> /// <param name="list"></param> /// <returns></returns> public bool AppointStuCheckRepository(List<RB_Scroll_Appointment_ViewModel> list) { bool flag = false; if (list.Any()) { //查询所有的上课计划 string planIds = string.Join(",", list.Select(x => x.ClassPlanId).Distinct()); //再查询上课时间 var timeList = GetClassTimeListRepository("", planIds); string Date = DateTime.Now.ToString("yyyy-MM-dd"); string orderGuestIds = string.Join(",", list.Select(x => x.GuestId).Distinct()); var guestList= GetOrderGuestListRepository(orderGuestIds); var oldCheckList = GetClassCheckList(new RB_Class_Check_ViewModel() { QOrderGuestIds = orderGuestIds }); foreach (var item in list) { //更新约课为已上课 Dictionary<string, object> keyValues = new Dictionary<string, object>() { { nameof(RB_Scroll_Appointment_ViewModel.State), Common.Enum.Course.CourseAppointStateEnum.Coursed} }; List<WhereHelper> wheres = new List<WhereHelper>() { new WhereHelper() { FiledName = nameof(RB_Scroll_Appointment_ViewModel.Id), FiledValue = item.Id, OperatorEnum =OperatorEnum.Equal } }; string appointSql = string.Format(" UPDATE RB_Scroll_Appointment SET State={0} WHERE Id={1} ", (int)Common.Enum.Course.CourseAppointStateEnum.Coursed, item.Id); flag = base.Execute(appointSql) > 0; if (flag) { var clist = JsonHelper.DeserializeObject<List<CourseTimeModel>>(item.CourseTime); //更新 order_guest 表 上课章节 请假也暂时先算完成课时(请假应该是有补课的) var gmodel = guestList?.FirstOrDefault(qitem => qitem.Id == item.GuestId); var tempClassTimeList = timeList?.Where(qitem => qitem.ClassPlanId == item.ClassPlanId)?.ToList() ?? new List<RB_Class_Time_ViewModel>(); var guestOldCheckList = oldCheckList?.Where(qitem => qitem.OrderGuestId == item.GuestId && !tempClassTimeList.Any(sItem => sItem.ClassTimeId == qitem.ClassTimeId))?.ToList() ?? new List<RB_Class_Check_ViewModel>(); decimal guestOldFinishHours = 0; if (guestOldCheckList != null && guestOldCheckList.Count > 0) { guestOldFinishHours = guestOldCheckList.Sum(qitem => qitem.CurrentDeductionHours); } if (gmodel != null) { //ld 2022-03-08 修改为学员上课最大课时 Dictionary<string, object> keyValues1 = new Dictionary<string, object>(); var completeHours = guestOldFinishHours + clist.Sum(x => x.ClassHours); keyValues1.Add(nameof(Model.ViewModel.Sell.RB_Order_Guest_ViewModel.CourseChapterNo), item.ChapterNo); keyValues1.Add(nameof(Model.ViewModel.Sell.RB_Order_Guest_ViewModel.CompleteHours), completeHours); if (gmodel.TotalHours == completeHours) { keyValues1.Add(nameof(Model.ViewModel.Sell.RB_Order_Guest_ViewModel.GuestState), Common.Enum.Course.GuestStateEnum.Graduate); } if (keyValues1 != null && keyValues1.Count > 0) { DynamicParameters guestParamters = new DynamicParameters(); string guestSql = "UPDATE RB_Order_Guest SET "; int guestIndex = 0; foreach (var gItem in keyValues1) { if (guestIndex > 0) { guestSql += ","; } guestSql += string.Format("{0}=@{0} ", gItem.Key); guestParamters.Add(string.Format("@{0}", gItem.Key), gItem.Value); guestIndex++; } guestSql += string.Format(" WHERE 1=1 AND Id=@Id "); guestParamters.Add("@Id", gmodel.Id); flag = base.Execute(guestSql, guestParamters) > 0; } } if (item.AppointType != 3) { //写入签到数据表 (非重复上课的 才写入签到数据) var tlist = timeList.Where(x => x.ClassPlanId == item.ClassPlanId).ToList(); foreach (var qitem in tlist) { var ccModel = clist.Where(x => x.StartTime == qitem.StartTime).FirstOrDefault(); if (ccModel != null && !oldCheckList.Where(x => x.OrderGuestId == item.GuestId && x.ClassTimeId == qitem.ClassTimeId).Any()) { //没有数据的插入 (有数据情况 =》 请假数据) base.Insert(new RB_Class_Check() { ClassCheckId = 0, ClassId = 0, ClassDate = item.Date, Status = 0, ClassRoomId = item.RoomId, Group_Id = item.Group_Id, School_Id = qitem.School_Id, TeacherId = item.TeacherId, OrderGuestId = item.GuestId, CheckStatus = 0, CreateBy = 0, CreateTime = DateTime.Now, StudyNum = ccModel.Minutes, MakeUpStatus = 1, CurrentDeductionHours = ccModel.ClassHours, IsAbsentHours = 0, ClassTimeId = qitem.ClassTimeId }); } } } } } } return flag; } /// <summary> /// 新增日志 /// </summary> /// <param name="model"></param> private void AddUserChangeLogRepository(Model.Entity.Log.RB_User_ChangeLog model) { string sql = " INSERT INTO RB_User_ChangeLog(Type,CreateBy,CreateTime,Group_Id,LogContent,School_Id,SourceId) "; sql += " VALUES(@Type,@CreateBy,@CreateTime,@Group_Id,@LogContent,@School_Id,@SourceId) "; base.Execute(sql, model); } /// <summary> /// 新增学生消息通知 /// </summary> /// <param name="model"></param> private void AddStudentNoticeRepository(Model.Entity.Log.RB_B2B_StudentNotice model) { string sql = " INSERT INTO RB_B2B_StudentNotice(Type,StudentId,CustomerId,Title,Content,IsLook,Status,CreateBy,CreateTime,Group_Id,UpdateTime) "; sql += " VALUES(@Type,@StudentId,@CustomerId,@Title,@Content,@IsLook,@Status,@CreateBy,@CreateTime,@Group_Id,@UpdateTime) "; base.Execute(sql, model); } /// <summary> /// 根据订单编号获取订单列表 /// </summary> /// <param name="OrderIds"></param> /// <returns></returns> public List<RB_Order_ViewModel> GetOrderListRepository(string OrderIds) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.* FROM RB_Order AS A WHERE 1=1 AND A.OrderId IN({0}) ",OrderIds); return base.Get<RB_Order_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取学员列表 /// </summary> /// <param name="GuestIds"></param> /// <returns></returns> public List<RB_Order_Guest_Extend> GetOrderGuestListRepository(string GuestIds) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.* FROM rb_order_guest AS A WHERE 1=1 AND A.Id IN({0}) ",GuestIds); return base.Get<RB_Order_Guest_Extend>(builder.ToString()).ToList(); } /// <summary> /// 获取上课时段 /// </summary> /// <param name="ClassTimeIds"></param> /// <returns></returns> public List<RB_Class_Time_ViewModel> GetClassTimeListRepository(string ClassTimeIds,string PlanIds) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.* FROM RB_Class_Time AS A WHERE 1=1 "); if (!string.IsNullOrEmpty(ClassTimeIds)) { builder.AppendFormat(" AND A.ClassTimeId IN({0}) ", ClassTimeIds); } if (!string.IsNullOrEmpty(PlanIds)) { builder.AppendFormat(" AND A.ClassPlanId IN({0}) ", PlanIds); } return Get<RB_Class_Time_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取班级列表 /// </summary> /// <param name="ClassIds"></param> /// <returns></returns> public List<RB_Class_ViewModel> GetClassListRepository(string ClassIds) { StringBuilder builder = new StringBuilder(); builder.AppendFormat(@" SELECT A.* FROM RB_Class AS A WHERE 1=1 AND A.ClassId IN({0}) ",ClassIds); return Get<RB_Class_ViewModel>(builder.ToString()).ToList(); } /// <summary> /// 获取指定人员的企业微信ID /// </summary> /// <param name="id">教师编号</param> /// <returns></returns> public List<RB_Employee_Extend> GetEmployeeListRepository(string Ids) { string sql = $"SELECT EmployeeId,EmName,WorkUserId FROM RB_Employee WHERE EmployeeId IN({Ids})"; return base.Get<RB_Employee_Extend>(sql).ToList(); } /// <summary> /// 获取指定DictKey的推送人员信息 /// </summary> /// <param name="departmentIds"></param> /// <returns></returns> public List<RB_Account_ViewModel> GetWorkUserIdByDictRepository(string dictKey) { string sql = $"SELECT Id,WorkUserId FROM rb_account a where EXISTS(select DictKey from rb_dictvalue where DictKey='{dictKey}' and FIND_IN_SET(a.Id,Content)>0) and WorkUserId is not null"; return Get<RB_Account_ViewModel>(sql).ToList(); } } }