using System.Linq;
using System.Timers;
using System.Configuration;
using System;
namespace BLL
{
    public class RealNameMonitorService
    {
        #region 启动监视器 系统启动5分钟
        /// 
        /// 监视组件
        /// 
        private static Timer messageTimer;
        /// 
        /// 启动监视器,不一定能成功,根据系统设置决定对监视器执行的操作 系统启动5分钟
        /// 
        public static void StartMonitor()
        {
            int adTimeJ = Funs.GetNewInt(ConfigurationManager.AppSettings["Intervaltime"]) ?? 60;
            //var getSynchroSet = Funs.DB.RealName_SynchroSet.FirstOrDefault();
            //if (getSynchroSet != null && getSynchroSet.Intervaltime.HasValue)
            //{
            //    adTimeJ = getSynchroSet.Intervaltime.Value;
            //}
            if (messageTimer != null)
            {
                messageTimer.Stop();
                messageTimer.Dispose();
                messageTimer = null;
            }
            if (adTimeJ > 0)
            {
                messageTimer = new Timer
                {
                    AutoReset = true
                };
                messageTimer.Elapsed += new ElapsedEventHandler(AdUserInProcess);
                messageTimer.Interval = 1000 * 60 * adTimeJ;// 60分钟 60000 * adTimeJ;
                messageTimer.Start();
            }
        }
        public static void StartUpdateSitePerson()
        {
            //var getSynchroSet = Funs.DB.RealName_SynchroSet.FirstOrDefault();
            //if (getSynchroSet != null && getSynchroSet.Intervaltime.HasValue)
            //{
            //    adTimeJ = getSynchroSet.Intervaltime.Value;
            //}
            if (messageTimer != null)
            {
                messageTimer.Stop();
                messageTimer.Dispose();
                messageTimer = null;
            }
            messageTimer = new Timer
            {
                AutoReset = true
            };
            messageTimer.Elapsed += new ElapsedEventHandler(UpdateSitePerson);
            messageTimer.Interval = 1000 * 60 * 30;// 60分钟 60000 * adTimeJ;
            messageTimer.Start();
        }
        /// 
        /// 流程确认 定时执行 系统启动5分钟
        /// 
        /// Timer组件
        /// 事件参数
        private static void AdUserInProcess(object sender, ElapsedEventArgs e)
        {
            try
            {
                SynchroSetService.PushCollCompany();
                var getRProjects = from x in Funs.DB.RealName_Project
                                   select x;
                if (getRProjects.Count() > 0)
                {
                    foreach (var item in getRProjects)
                    {
                        var getSynchroSet = Funs.DB.RealName_SynchroSet.FirstOrDefault(x => x.ProCode == item.ProCode);
                        if (getSynchroSet != null && !string.IsNullOrEmpty(item.JTproCode))
                        {
                            SynchroSetService.InsertRealNamePushLog(null, item.ProCode, "实名制定时器", "sucess", "200", item.ProName, "成功", null);
                            SynchroSetService.PushProCollCompany(item.ProCode);
                            SynchroSetService.PushAttendance(item.ProCode);
                            UpdateSitePerson(null, null);
                            //SynchroSetService.updatePersonsExitTime(item.ProCode);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                StartMonitor();
                ErrLogInfo.WriteLog(ex, "数据接口定时器", "RealNameMonitorService.AdUserInProcess");
            }
        }
        /// 
        /// 流程确认 定时执行 系统启动5分钟
        /// 
        /// Timer组件
        /// 事件参数
        private static void UpdateSitePerson(object sender, ElapsedEventArgs e)
        {
            try
            {
                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                {
                    var persons = from x in db.SitePerson_Person
                                  join y in db.Base_Project on x.ProjectId equals y.ProjectId
                                  join z in db.RealName_Project on y.JTProjectCode equals z.ProCode
                                  join p in db.Project_ProjectUnit on new { x.UnitId, x.ProjectId } equals new { p.UnitId, p.ProjectId }
                                  join v in db.ProjectData_TeamGroup on x.TeamGroupId equals v.TeamGroupId
                                  join w in db.Base_WorkPost on x.WorkPostId equals w.WorkPostId
                                  where z.JTproCode != null && x.IsCardNoOK == true && v.TeamId.HasValue && !x.OutTime.HasValue
                                  && p.IsSynchro == true
                                  select x;
                    var personInOutNows = from x in db.RealName_PersonInOutNow select x;
                    foreach (var person in persons)
                    {
                        var personInOutNow = personInOutNows.OrderByDescending(x => x.ChangeTime).FirstOrDefault();
                        if (personInOutNow == null)
                        {
                            person.OutTime = DateTime.Now;
                        }
                        else if (personInOutNow.ChangeTime < DateTime.Now.AddDays(-3))
                        {
                            person.OutTime = personInOutNow.ChangeTime;
                        }
                    }
                    db.SubmitChanges();
                }
            }
            catch (Exception ex)
            {
                StartMonitor();
                ErrLogInfo.WriteLog(ex, "数据接口定时器", "RealNameMonitorService.AdUserInProcess");
            }
        }
        #endregion
        #region 启动监视器 系统启动5分钟-实名制出入记录去重
        /// 
        /// 监视组件
        /// 
        private static Timer InOutmessageTimer;
        /// 
        /// 启动监视器,不一定能成功,根据系统设置决定对监视器执行的操作 系统启动5分钟
        /// 
        public static void StartInOutMonitor()
        {
            if (InOutmessageTimer != null)
            {
                InOutmessageTimer.Stop();
                InOutmessageTimer.Dispose();
                InOutmessageTimer = null;
            }
            InOutmessageTimer = new Timer
            {
                AutoReset = true
            };
            InOutmessageTimer.Elapsed += new ElapsedEventHandler(PersonInOutProcess);
            InOutmessageTimer.Interval = 1000 * 60 * 30;// 60分钟 60000 * adTimeJ;
            InOutmessageTimer.Start();
        }
        /// 
        /// 流程确认 定时执行 系统启动5分钟
        /// 
        /// Timer组件
        /// 事件参数
        private static void PersonInOutProcess(object sender, ElapsedEventArgs e)
        {
            int delCount = 0;
            try
            {
                var result = (from x in Funs.DB.RealName_PersonInOutNow
                              select new
                              {
                                  x.ProjectId,
                                  date = x.ChangeTime.Value.Date,
                                  x.IdcardNumber,
                                  x.IsIn
                              }).Distinct();
                foreach (var item in result)
                {
                    var getDateRecords = from x in Funs.DB.RealName_PersonInOutNow
                                         where x.ProjectId == item.ProjectId && x.ChangeTime.Value >= item.date.Date && x.ChangeTime.Value < item.date.Date.AddDays(1)
                                         && x.IdcardNumber == item.IdcardNumber
                                         select x;
                    var getInRecords = getDateRecords.Where(x => x.IsIn == true);
                    if (getInRecords.Count() > 1)
                    {
                        DateTime? minChangeTime = getInRecords.Min(x => x.ChangeTime);
                        var getDeleteInR = from x in getInRecords
                                           where x.ChangeTime != minChangeTime
                                           select x;
                        if (getDeleteInR.Count() > 0)
                        {
                            delCount += getDeleteInR.Count();
                            Funs.DB.RealName_PersonInOutNow.DeleteAllOnSubmit(getDeleteInR);
                            Funs.DB.SubmitChanges();
                        }
                    }
                    var getOutRecords = getDateRecords.Where(x => x.IsIn == false);
                    if (getOutRecords.Count() > 1)
                    {
                        DateTime? maxChangeTime = getOutRecords.Max(x => x.ChangeTime);
                        var getDeleteOutR = from x in getOutRecords
                                            where x.ChangeTime != maxChangeTime
                                            select x;
                        if (getDeleteOutR.Count() > 0)
                        {
                            delCount += getDeleteOutR.Count();
                            Funs.DB.RealName_PersonInOutNow.DeleteAllOnSubmit(getDeleteOutR);
                            Funs.DB.SubmitChanges();
                        }
                    }
                    if (delCount >= 10000)
                    {
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                if (BLL.Funs.DBList.ContainsKey(System.Threading.Thread.CurrentThread.ManagedThreadId))
                {
                    BLL.Funs.DBList.Remove(System.Threading.Thread.CurrentThread.ManagedThreadId);
                }
            }
        }
        #endregion
        #region 启动监视器  定时清理推送日志
        /// 
        /// 监视组件
        /// 
        private static Timer messageTimer1;
        /// 
        /// 定时清理推送日志
        /// 
        public static void StartMonitorDeletePushLog()
        {
            int adTimeJ = 60 * 4;
            if (messageTimer1 != null)
            {
                messageTimer1.Stop();
                messageTimer1.Dispose();
                messageTimer1 = null;
            }
            if (adTimeJ > 0)
            {
                messageTimer1 = new Timer
                {
                    AutoReset = true
                };
                messageTimer1.Elapsed += new ElapsedEventHandler(DeletePushLog);
                messageTimer1.Interval = 1000 * 60 * adTimeJ;// 60分钟 60000 * adTimeJ;
                messageTimer1.Start();
            }
        }
        /// 
        /// 流程确认 定时执行 系统启动5分钟
        /// 
        /// Timer组件
        /// 事件参数
        private static void DeletePushLog(object sender, ElapsedEventArgs e)
        {
            try
            {
                /// 3天推送实名制日志
                var getPushLogs = Funs.DB.RealName_PushLog.Where(x => x.PushTime.Value.AddHours(6) < DateTime.Now);
                if (getPushLogs.Count() > 0)
                {
                    Funs.DB.RealName_PushLog.DeleteAllOnSubmit(getPushLogs);
                    Funs.DB.SubmitChanges();
                }
                /// 3个月操作日志
                var getSys_Logs = Funs.DB.Sys_Log.Where(x => x.OperationTime.Value.AddDays(15) < DateTime.Now);
                if (getSys_Logs.Count() > 0)
                {
                    Funs.DB.Sys_Log.DeleteAllOnSubmit(getSys_Logs);
                    Funs.DB.SubmitChanges();
                }
                /// 1个月推送消息日志
                var getSys_HttpLogs = Funs.DB.Sys_HttpLog.Where(x => x.LogTime.Value.AddDays(15) < DateTime.Now);
                if (getSys_HttpLogs.Count() > 0)
                {
                    Funs.DB.Sys_HttpLog.DeleteAllOnSubmit(getSys_HttpLogs);
                    Funs.DB.SubmitChanges();
                }
            }
            catch (Exception ex)
            {
            }
        }
        #endregion
        #region 启动监视器  定时清理推送日志
        /// 
        /// 监视组件
        /// 
        private static Timer messageTimer2;
        /// 
        /// 定时清理推送日志
        /// 
        public static void StartMonitorCleanAttendance()
        {
            int adTimeJ = 60 * 12;
            if (messageTimer2 != null)
            {
                messageTimer2.Stop();
                messageTimer2.Dispose();
                messageTimer2 = null;
            }
            if (adTimeJ > 0)
            {
                messageTimer2 = new Timer
                {
                    AutoReset = true
                };
                messageTimer2.Elapsed += new ElapsedEventHandler(CleanAttendance);
                messageTimer2.Interval = 1000 * 60 * adTimeJ;// 60分钟 60000 * adTimeJ;
                messageTimer2.Start();
            }
        }
        /// 
        /// 流程确认 定时执行 系统启动5分钟
        /// 
        /// Timer组件
        /// 事件参数
        private static void CleanAttendance(object sender, ElapsedEventArgs e)
        {
            try
            {
                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                {
                    /// 清理实名制未同步历史数据
                    var getLastList = from x in db.SitePerson_PersonInOutNow
                                      where x.ChangeTime <= DateTime.Now.AddHours(-48)
                                      select x;
                    if (getLastList.Count() > 0)
                    {
                        db.SitePerson_PersonInOutNow.DeleteAllOnSubmit(getLastList);
                        db.SubmitChanges();
                    }
                }
                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                {
                    /// 清理出入记录
                    var getRecords = from x in db.T_d_facerecord where x.DateTimeRecord.Value.AddDays(1) < DateTime.Now select x;
                    if (getRecords.Count() > 0)
                    {
                        foreach (var item in getRecords)
                        {
                            if (item.InOrOut == "进门")
                            {
                                var getDelRecordsIn = from x in db.T_d_facerecord
                                                      where x.ProjectId == item.ProjectId && x.EmployNO == item.EmployNO && x.InOrOut == item.InOrOut
                                                      && x.DateTimeRecord.Value.Year == item.DateTimeRecord.Value.Year
                                                      && x.DateTimeRecord.Value.Month == item.DateTimeRecord.Value.Month
                                                      && x.DateTimeRecord.Value.Day == item.DateTimeRecord.Value.Day
                                                      && x.DateTimeRecord > item.DateTimeRecord
                                                      select x;
                                if (getDelRecordsIn.Count() > 0)
                                {
                                    db.T_d_facerecord.DeleteAllOnSubmit(getDelRecordsIn);
                                    db.SubmitChanges();
                                }
                            }
                            else
                            {
                                var getDelRecordsOut = from x in db.T_d_facerecord
                                                       where x.ProjectId == item.ProjectId && x.EmployNO == item.EmployNO && x.InOrOut == item.InOrOut
                                                       && x.DateTimeRecord.Value.Year == item.DateTimeRecord.Value.Year
                                                       && x.DateTimeRecord.Value.Month == item.DateTimeRecord.Value.Month
                                                       && x.DateTimeRecord.Value.Day == item.DateTimeRecord.Value.Day
                                                       && x.DateTimeRecord < item.DateTimeRecord
                                                       select x;
                                if (getDelRecordsOut.Count() > 0)
                                {
                                    db.T_d_facerecord.DeleteAllOnSubmit(getDelRecordsOut);
                                    db.SubmitChanges();
                                }
                            }
                        }
                    }
                }
                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                {
                    var getVRecords = from x in db.T_d_validcardevent
                                      where x.RecordDateTime.Value.AddDays(1) < DateTime.Now
                                      select x;
                    if (getVRecords.Count() > 0)
                    {
                        foreach (var item in getVRecords)
                        {
                            if (item.InOrOut == 1)
                            {
                                var getDelVRecordsIn = from x in db.T_d_validcardevent
                                                       where x.ProjectId == item.ProjectId && x.IDCardNo == item.IDCardNo && x.InOrOut == item.InOrOut
                                                       && x.RecordDateTime.Value.Year == item.RecordDateTime.Value.Year
                                                       && x.RecordDateTime.Value.Month == item.RecordDateTime.Value.Month
                                                       && x.RecordDateTime.Value.Day == item.RecordDateTime.Value.Day
                                                       && x.RecordDateTime > item.RecordDateTime
                                                       select x;
                                if (getDelVRecordsIn.Count() > 0)
                                {
                                    db.T_d_validcardevent.DeleteAllOnSubmit(getDelVRecordsIn);
                                    db.SubmitChanges();
                                }
                            }
                            else
                            {
                                var getDelVRecordsOut = from x in db.T_d_validcardevent
                                                        where x.ProjectId == item.ProjectId && x.IDCardNo == item.IDCardNo && x.InOrOut == item.InOrOut
                                                        && x.RecordDateTime.Value.Year == item.RecordDateTime.Value.Year
                                                        && x.RecordDateTime.Value.Month == item.RecordDateTime.Value.Month
                                                        && x.RecordDateTime.Value.Day == item.RecordDateTime.Value.Day
                                                        && x.RecordDateTime < item.RecordDateTime
                                                        select x;
                                if (getDelVRecordsOut.Count() > 0)
                                {
                                    db.T_d_validcardevent.DeleteAllOnSubmit(getDelVRecordsOut);
                                    db.SubmitChanges();
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
        #endregion
        #region 启动监视器 系统启动5分钟
        /// 
        /// 启动监视器,不一定能成功,根据系统设置决定对监视器执行的操作 系统启动5分钟
        /// 
        public static void StartMonitorProject()
        {
            try
            {
                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                {
                    var getRProjects = from x in db.RealName_Project
                                       select x;
                    if (getRProjects.Count() > 0)
                    {
                        foreach (var item in getRProjects)
                        {
                            var getSynchroSet = db.RealName_SynchroSet.FirstOrDefault(x => x.ProCode == item.ProCode);
                            if (getSynchroSet != null && !string.IsNullOrEmpty(item.JTproCode))
                            {
                                int adTimeJ = Funs.GetNewInt(ConfigurationManager.AppSettings["Intervaltime"]) ?? 30;
                                Timer messageTimerProject = new Timer();
                                if (messageTimerProject != null)
                                {
                                    messageTimerProject.Stop();
                                    messageTimerProject.Dispose();
                                    messageTimerProject = null;
                                }
                                if (adTimeJ > 0)
                                {
                                    messageTimerProject = new Timer
                                    {
                                        AutoReset = true
                                    };
                                    messageTimerProject.Elapsed += (sender, args) => AdUserInProcess(sender, item.ProCode);
                                    //messageTimer.Elapsed += new ElapsedEventHandler(AdUserInProcess);
                                    messageTimerProject.Interval = 1000 * 60 * 5;// adTimeJ;// 60分钟 60000 * adTimeJ;
                                    messageTimerProject.Start();
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                StartMonitorProject();
            }
        }
        /// 
        /// 流程确认 定时执行 系统启动5分钟
        /// 
        /// Timer组件
        /// 事件参数
        public static void AdUserInProcess(object sender, string ProCode)
        {
            try
            {
                SynchroSetService.PushCollCompany();
                if (!string.IsNullOrEmpty(ProCode))
                {
                    SynchroSetService.InsertRealNamePushLog(null, ProCode, "实名制定时器", "sucess", "200", ProCode, "成功", null);
                    SynchroSetService.PushProCollCompany(ProCode);
                    SynchroSetService.PushAttendance(ProCode);
                    SynchroSetService.updatePersonsExitTime(ProCode);
                }
            }
            catch (Exception ex)
            {
                ErrLogInfo.WriteLog(ex, "数据接口定时器", "RealNameMonitorService.AdUserInProcess");
            }
        }
        #endregion
    }
}