private static void RemoveLinkage(AllInOneContext.AllInOneContext db, DutyCheckGroup group) { //手动移除级联属性 if (group.CheckDutySiteSchedules != null) { List <DutyCheckSiteSchedule> delList = new List <DutyCheckSiteSchedule>(); foreach (DutyCheckSiteSchedule rp in group.CheckDutySiteSchedules) { DutyCheckSiteSchedule del = db.Set <DutyCheckSiteSchedule>() .FirstOrDefault(p => p.CheckDutySiteId.Equals(rp.CheckDutySiteId) && p.CheckManId.Equals(rp.CheckManId)); if (del != null) { delList.Add(del); } } db.Set <DutyCheckSiteSchedule>().RemoveRange(delList); db.SaveChanges(); } }
/// <summary> /// 根据安排表生成实地查勤 /// </summary> /// <param name="dgs"></param> public static bool GetAbsoultedDutyCheckLog(DutyGroupSchedule dgs) { if (dgs == null) { return(false); } bool isOK = false; //补全数据 DutyGroupSchedule model = CompletionData(dgs); //组装网络查勤员数据 Queue <Staff> checkMans = new Queue <Staff>(); //网络查勤员队列 foreach (DutyGroupScheduleDetail detail in model.DutyGroupScheduleDetails) { checkMans.Enqueue(detail.CheckMan); } //取所有哨位信息 Dictionary <Guid, Queue <DutyCheckSiteSchedule> > groupStaff = new Dictionary <Guid, Queue <DutyCheckSiteSchedule> >(); Dictionary <Guid, Queue <DutyCheckSiteSchedule> > allStaffs = new Dictionary <Guid, Queue <DutyCheckSiteSchedule> >(); // foreach (DutyCheckSiteSchedule dss in model.DutyGroupScheduleDetails[0].CheckDutySiteSchedule) { //groupStaff.Add(dss.CheckDutySite.MonitorySiteId, new Queue<DutyCheckSiteSchedule>()); //allStaffs.Add(dss.CheckDutySite.MonitorySiteId, new Queue<DutyCheckSiteSchedule>()); if (dss.CheckDutySiteId != null) { groupStaff.Add(dss.CheckDutySiteId.Value, new Queue <DutyCheckSiteSchedule>()); allStaffs.Add(dss.CheckDutySiteId.Value, new Queue <DutyCheckSiteSchedule>()); } } //取哨位对应的组员信息 foreach (DutyGroupScheduleDetail detail in model.DutyGroupScheduleDetails) { foreach (DutyCheckSiteSchedule dss in detail.CheckDutySiteSchedule) { if (dss.CheckDutySiteId != null) { if (groupStaff.ContainsKey(dss.CheckDutySiteId.Value)) { groupStaff[dss.CheckDutySiteId.Value].Enqueue(dss); } if (allStaffs.ContainsKey(dss.CheckDutySiteId.Value)) { allStaffs[dss.CheckDutySiteId.Value].Enqueue(dss); } } } } //过滤过期的时间 if (model.EndDate <= DateTime.Now) { return(false); } //计算有效天数 int days = (int)(model.EndDate.Date - model.StartDate.Date).TotalDays + 1; if (days <= 0) { Console.WriteLine("生成分组查勤表无效,时间已过期!"); return(false); } DateTime validtime = DateTime.Now; if (model.StartDate <= DateTime.Now && model.EndDate >= DateTime.Now) { for (int i = 0; i < days; i++) { if (model.StartDate.AddDays(i) >= DateTime.Now.Date) { validtime = model.StartDate.AddDays(i); break; } } validtime = new DateTime(validtime.Year, validtime.Month, validtime.Day, 0, 0, 0); } else if (model.StartDate > DateTime.Now) { validtime = new DateTime(model.StartDate.Year, model.StartDate.Month, model.StartDate.Day, 0, 0, 0); } days = (int)(model.EndDate.Date - validtime.Date).TotalDays + 1; if (days == 0) { return(false); } //实际人员轮值总数 int allCount = days * model.Schedule.ScheduleCycle.DayPeriods[0].TimePeriods.Count() - 1; //计算出实际人员的循环情况 for (int i = 0; i < allCount; i++) { foreach (var data in groupStaff) { DutyCheckSiteSchedule staff = groupStaff[data.Key].Dequeue(); //循环进队 allStaffs[data.Key].Enqueue(staff); //重新进队 groupStaff[data.Key].Enqueue(staff); } } //根据时段循环分配组员 List <DutyCheckLog> logs = new List <DutyCheckLog>(); for (int i = 0; i < days; i++) { try { DateTime time = validtime.AddDays(i); foreach (TimePeriod tp in model.Schedule.ScheduleCycle.DayPeriods[0].TimePeriods) { //判断当天的数据,已经失效的时段不再生成记录 if (time == DateTime.Now.Date) { DateTime startTime = new DateTime(time.Year, time.Month, time.Day, tp.StartTime.Hour, tp.StartTime.Minute, tp.StartTime.Second); DateTime endTime = new DateTime(time.Year, time.Month, time.Day, tp.EndTime.Hour, tp.EndTime.Minute, tp.EndTime.Second); if (startTime > DateTime.Now || endTime < DateTime.Now) { continue; } } //组装网络查勤员数据 Staff staff = checkMans.Dequeue(); DutyCheckLog log = GetCheckManLog(model.OrganizationId, time, tp, staff.StaffId); logs.Add(log); checkMans.Enqueue(staff); foreach (var data in allStaffs) { DutyCheckSiteSchedule dss = allStaffs[data.Key].Dequeue(); DutyCheckLog sitelog = GetSiteLog(model, time, tp, dss, model.Schedule.ScheduleCycle.DayPeriods[0].DayPeriodId); logs.Add(sitelog); } } } catch (Exception ex) { isOK = false; return(isOK); } } //实际保存记录 using (var db = new AllInOneContext.AllInOneContext()) { //建立事务 using (var tran = db.Database.BeginTransaction()) { try { //先移除已排班但尚未执行的记录 var del = db.DutyCheckLog .Where(p => p.PlanDate >= model.StartDate && p.PlanDate <= model.EndDate && p.StatusId == new Guid("361ADFE9-E58A-4C88-B191-B742CC212443")); if (del != null && del.Count() != 0) { db.DutyCheckLog.RemoveRange(del.ToList()); db.SaveChanges(); } //新增 foreach (DutyCheckLog log in logs) { string txt = JsonConvert.SerializeObject(log); db.DutyCheckLog.Add(log); } db.SaveChanges(); tran.Commit(); isOK = true; } catch (Exception ex) { isOK = false; } } } return(isOK); }
/// <summary> /// 获取查勤点日志 /// </summary> /// <param name="model">计划实体</param> /// <param name="time">计划时间</param> /// <param name="tp">时间段</param> /// <param name="dss">检查点人员安排明细</param> /// <returns></returns> private static DutyCheckLog GetSiteLog(DutyGroupSchedule model, DateTime time, TimePeriod tp, DutyCheckSiteSchedule dss, Guid dayPeriod) { return(new DutyCheckLog { DutyCheckLogId = Guid.NewGuid(), TimePeriod = tp, DutyCheckSiteScheduleId = dss.DutyCheckSiteScheduleId, PlanDate = time, DutyCheckStaffId = dss.CheckManId, OrganizationId = model.OrganizationId, StatusId = new Guid("361ADFE9-E58A-4C88-B191-B742CC212443"), //未开始 RecordTypeId = new Guid("a0002016-e009-b019-e001-abcd18000002"), //实地查勤 DayPeriodId = dayPeriod, }); }
private static void RemoveLinkage(AllInOneContext.AllInOneContext db, DutyGroupSchedule dutyGroupSchedule) { //删除未进行的查勤记录 var dellog = db.DutyCheckLog .Where(p => p.PlanDate >= dutyGroupSchedule.StartDate && p.PlanDate <= dutyGroupSchedule.EndDate && p.StatusId == new Guid("361ADFE9-E58A-4C88-B191-B742CC212443")); if (dellog != null && dellog.Count() != 0) { db.DutyCheckLog.RemoveRange(dellog.ToList()); db.SaveChanges(); } List <DutyGroupScheduleDetail> mainList = new List <DutyGroupScheduleDetail>(); if (dutyGroupSchedule.DutyGroupScheduleDetails != null) { List <DutyCheckSiteSchedule> dutyCheckSiteSchedulelList = new List <DutyCheckSiteSchedule>(); foreach (DutyGroupScheduleDetail detail in dutyGroupSchedule.DutyGroupScheduleDetails) { // 解除DutyCheckSiteSchedule Many To Many if (detail.CheckDutySiteSchedule != null) { foreach (DutyCheckSiteSchedule rp in detail.CheckDutySiteSchedule) { DutyCheckSiteSchedule del = db.Set <DutyCheckSiteSchedule>() .FirstOrDefault(p => p.DutyCheckSiteScheduleId.Equals(rp.DutyCheckSiteScheduleId)); if (del != null) { dutyCheckSiteSchedulelList.Add(del); } } } } db.Set <DutyCheckSiteSchedule>().RemoveRange(dutyCheckSiteSchedulelList); db.SaveChanges(); // DutyGroupScheduleDetail Many To Many List <DutyGroupScheduleDetail> detailList = new List <DutyGroupScheduleDetail>(); foreach (DutyGroupScheduleDetail detail in dutyGroupSchedule.DutyGroupScheduleDetails) { DutyGroupScheduleDetail del = db.Set <DutyGroupScheduleDetail>() .FirstOrDefault(p => p.DutyGroupScheduleDetailId.Equals(detail.DutyGroupScheduleDetailId)); if (del != null) { detailList.Add(del); } } db.Set <DutyGroupScheduleDetail>().RemoveRange(detailList); db.SaveChanges(); } // 解除EmergencyTeam Many To Many if (dutyGroupSchedule.EmergencyTeam != null) { List <EmergencyTeam> delList = new List <EmergencyTeam>(); foreach (EmergencyTeam rp in dutyGroupSchedule.EmergencyTeam) { EmergencyTeam del = db.Set <EmergencyTeam>() .FirstOrDefault(p => p.DutyGroupScheduleId.Equals(rp.DutyGroupScheduleId) && p.StaffId.Equals(rp.StaffId)); if (del != null) { delList.Add(del); } } db.Set <EmergencyTeam>().RemoveRange(delList); db.SaveChanges(); } // 解除Reservegroup Many To Many if (dutyGroupSchedule.Reservegroup != null) { List <Reservegroup> delList = new List <Reservegroup>(); foreach (Reservegroup rp in dutyGroupSchedule.Reservegroup) { Reservegroup del = db.Set <Reservegroup>() .FirstOrDefault(p => p.DutyGroupScheduleId.Equals(rp.DutyGroupScheduleId) && p.StaffId.Equals(rp.StaffId)); if (del != null) { delList.Add(del); } } db.Set <Reservegroup>().RemoveRange(delList); db.SaveChanges(); } }