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();
     }
 }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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();
            }
        }