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"]) ?? 30;
            //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();
            }
        }
        /// 
        /// 流程确认 定时执行 系统启动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.ProCode))
                        {
                            SynchroSetService.PushProCollCompany(item.ProCode);
                            //SynchroSetService.PushCollTeam(item.ProCode);
                            //SynchroSetService.getCollTeam(item.ProCode);
                            SynchroSetService.PushPersons(Const.BtnAdd, item.ProCode, null);
                            SynchroSetService.PushPersons(Const.BtnModify, item.ProCode, null);
                            SynchroSetService.PushAttendance(item.ProCode);
                        }
                    }
                }
            }
            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
    }
}