diff --git a/SGGL/BLL/ZHGL/RealName/RealNameMonitorService.cs b/SGGL/BLL/ZHGL/RealName/RealNameMonitorService.cs index ac8db6da..760c39cc 100644 --- a/SGGL/BLL/ZHGL/RealName/RealNameMonitorService.cs +++ b/SGGL/BLL/ZHGL/RealName/RealNameMonitorService.cs @@ -7,7 +7,6 @@ namespace BLL { public class RealNameMonitorService { - #region 启动监视器 系统启动5分钟 /// /// 监视组件 @@ -79,5 +78,83 @@ namespace BLL } } #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 * 60;// 60分钟 60000 * adTimeJ; + InOutmessageTimer.Start(); + } + + /// + /// 流程确认 定时执行 系统启动5分钟 + /// + /// Timer组件 + /// 事件参数 + private static void PersonInOutProcess(object sender, ElapsedEventArgs e) + { + try + { + var result = (from x in Funs.DB.RealName_PersonInOutNow + group x by new + { + x.ProjectId, + date = x.ChangeTime.Value.Date, + x.IdcardNumber, + x.IsIn + } into g + where g.Count() > 1 + select new + { + g.First().ProjectId, + date = g.First().ChangeTime.Value.Date, + g.First().IdcardNumber, + g.First().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; + DateTime? minChangeTime = getDateRecords.Where(x => x.IsIn == true).Min(x => x.ChangeTime); + DateTime? maxChangeTime = getDateRecords.Where(x => x.IsIn == false).Max(x => x.ChangeTime); + var getDeleteR = from x in getDateRecords + where (minChangeTime.HasValue && x.IsIn == true && x.ChangeTime != minChangeTime) || + (maxChangeTime.HasValue && x.IsIn == false && x.ChangeTime != maxChangeTime) + select x; + if (getDeleteR.Count() > 0) + { + Funs.DB.RealName_PersonInOutNow.DeleteAllOnSubmit(getDeleteR); + Funs.DB.SubmitChanges(); + } + } + } + catch (Exception ex) + { + } + } + #endregion } } diff --git a/SGGL/FineUIPro.Web/Global.asax.cs b/SGGL/FineUIPro.Web/Global.asax.cs index 81b98dcb..f3a3d41c 100644 --- a/SGGL/FineUIPro.Web/Global.asax.cs +++ b/SGGL/FineUIPro.Web/Global.asax.cs @@ -47,8 +47,9 @@ ////实名制同步定时器 try { + BLL.RealNameMonitorService.StartInOutMonitor(); if (ConfigurationManager.AppSettings["EnableRealName"] == "True") - { + { BLL.RealNameMonitorService.StartMonitor(); } } diff --git a/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx b/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx index 0a3af0d6..9c362f3b 100644 --- a/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx +++ b/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx @@ -78,6 +78,9 @@ + diff --git a/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.cs b/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.cs index b56bf8b9..b1589406 100644 --- a/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.cs +++ b/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.cs @@ -25,7 +25,10 @@ namespace FineUIPro.Web.ZHGL.RealName this.drpProject.SelectedValue = this.CurrUser.LoginProjectId; this.drpProject.Readonly = true; } - + if (this.CurrUser.UserId == Const.hfnbdId) + { + this.btnDataProcess.Hidden = false; + } this.SetPage(); } } @@ -297,5 +300,50 @@ namespace FineUIPro.Web.ZHGL.RealName } } } + + /// + /// + /// + /// + /// + protected void btnDataProcess_Click(object sender, EventArgs e) + { + var result = (from x in Funs.DB.RealName_PersonInOutNow + group x by new + { + x.ProjectId, + date = x.ChangeTime.Value.Date, + x.IdcardNumber, + x.IsIn + } into g + where g.Count() > 1 + select new + { + g.First().ProjectId, + date = g.First().ChangeTime.Value.Date, + g.First().IdcardNumber, + g.First().IsIn + }).Distinct().Take(500); + + 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; + DateTime? minChangeTime = getDateRecords.Where(x => x.IsIn == true).Min(x=>x.ChangeTime); + DateTime? maxChangeTime = getDateRecords.Where(x => x.IsIn == false).Max(x => x.ChangeTime); + var getDeleteR = from x in getDateRecords + where (minChangeTime.HasValue && x.IsIn == true && x.ChangeTime != minChangeTime) || + (maxChangeTime.HasValue && x.IsIn == false && x.ChangeTime != maxChangeTime) + select x; + if (getDeleteR.Count() > 0) + { + Funs.DB.RealName_PersonInOutNow.DeleteAllOnSubmit(getDeleteR); + Funs.DB.SubmitChanges(); + } + } + Alert.ShowInTop("完成!", MessageBoxIcon.Success); + } } } \ No newline at end of file diff --git a/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.designer.cs b/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.designer.cs index f459940c..0f043932 100644 --- a/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.designer.cs +++ b/SGGL/FineUIPro.Web/ZHGL/RealName/SynchroSet.aspx.designer.cs @@ -182,5 +182,14 @@ namespace FineUIPro.Web.ZHGL.RealName { /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 /// protected global::FineUIPro.Button btnAttendance; + + /// + /// btnDataProcess 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::FineUIPro.Button btnDataProcess; } }