using BLL.Common; using Model; using Newtonsoft.Json; using System; using System.Linq; using System.Timers; namespace BLL { public class YunMouService { #region 启动监视器 系统启动5分钟 /// /// 监视组件 /// private static Timer messageTimer; private static string token; private static string consumerId; /// /// 启动监视器,不一定能成功,根据系统设置决定对监视器执行的操作 系统启动5分钟 /// public static void StartMonitor() { token = YunMouHelper.getToken(); consumerId = YunMouHelper.addConsumer(token); if (messageTimer != null) { messageTimer.Stop(); messageTimer.Dispose(); messageTimer = null; } messageTimer = new Timer { AutoReset = true }; messageTimer.Elapsed += new ElapsedEventHandler(InProcess); messageTimer.Interval = 4000 * 60;// 10分钟 messageTimer.Start(); } /// /// 流程确认 定时执行 系统启动5分钟 /// /// Timer组件 /// 事件参数 private static void InProcess(object sender, ElapsedEventArgs e) { //自动调用 DoSynchDataNew(); } #endregion /// /// 手动调用 /// public static void manualOperation(string tokenSd, string consumerIdSd) { DoSynchData(tokenSd, consumerIdSd); } /// /// /// public static void DoSynchData(string tokenSd = "", string consumerIdSd = "") { try { if (string.IsNullOrEmpty(token)) { token = tokenSd; } if (string.IsNullOrEmpty(consumerId)) { consumerId = consumerIdSd; } ////获取token //token = YunMouHelper.getToken(); ////创建消费者消费者如果5分钟未调用拉取消息接口将被删除。 //consumerId = YunMouHelper.addConsumer(token); ErrLogInfo.WriteLog(token + ";" + consumerId); string content = YunMouHelper.consumerMessage(consumerId, token); //调用消息队列第一次 ErrLogInfo.WriteLog(content); var j2 = JsonConvert.DeserializeObject(content); //消费者首次拉取消息时需要与消息通道建立连接,此次调用实际拉到消息列表为空, //再次调用即可拉取到消息,30秒内必须再次调用拉取消息接口,否则将断开与消息通道的连接。 //因此拉取间隔需要在30秒以内,否则每次拉到的消息是空的 if (j2.data.Count > 0) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { for (int i = 0; i < j2.data.Count; i++) { var msg = JsonConvert.DeserializeObject(j2.data[i]["content"].ToString()); if (!string.IsNullOrEmpty(Convert.ToString(msg.employeeNo))) { string deviceSerial = Convert.ToString(msg.deviceSerial); string employeeNo = Convert.ToString(msg.employeeNo); DateTime dateTime = Convert.ToDateTime(Convert.ToString(msg.dateTime)); var devices = Funs.DB.Project_Devices.FirstOrDefault(x => x.DeviceSerial == deviceSerial); Model.SitePerson_PersonInOut newInOut = new Model.SitePerson_PersonInOut { ProjectId = devices.ProjectId, IdentityCard = employeeNo, IsIn = true, ChangeTime = dateTime, InOutWay = Const.InOutWay_1, }; InsertInOut(newInOut); } } } } else { //修改 如果为空循环调用最多5次 for (int y = 0; y < 5; y++) { //如果为空再调一次 content = YunMouHelper.consumerMessage(consumerId, token); //调用消息队列第二次 ErrLogInfo.WriteLog(content+"调用消息队列" + (y + 2).ToString()); j2 = JsonConvert.DeserializeObject(content); if (j2.data.Count > 0) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { for (int i = 0; i < j2.data.Count; i++) { var msg = JsonConvert.DeserializeObject(j2.data[i]["content"].ToString()); if (!string.IsNullOrEmpty(Convert.ToString(msg.employeeNo))) { string deviceSerial = Convert.ToString(msg.deviceSerial); string employeeNo = Convert.ToString(msg.employeeNo); DateTime dateTime = Convert.ToDateTime(Convert.ToString(msg.dateTime)); var devices = Funs.DB.Project_Devices.FirstOrDefault(x => x.DeviceSerial == deviceSerial); //身份证号时 if (employeeNo.Length == 18) { Model.SitePerson_PersonInOut newInOut = new Model.SitePerson_PersonInOut { ProjectId = devices.ProjectId, IdentityCard = employeeNo, IsIn = true, ChangeTime = dateTime, InOutWay = Const.InOutWay_1, }; InsertInOut(newInOut); } } } //提交偏移量 var msgOffset = YunMouHelper.offsets(consumerId, token); } //有值跳出循环 break; } } } } catch (Exception ex) { var erro = ex.Message; ErrLogInfo.WriteLog(ex.Message); } } public static void DoSynchDataNew() { try { ////获取token //token = YunMouHelper.getToken(); ////创建消费者消费者如果5分钟未调用拉取消息接口将被删除。 //consumerId = YunMouHelper.addConsumer(token); ErrLogInfo.WriteLog(token + ";" + consumerId+ "调用消息队列参数"); string content = YunMouHelper.consumerMessage(consumerId, token); //调用消息队列第一次 ErrLogInfo.WriteLog(content ); var j2 = JsonConvert.DeserializeObject(content); //消费者首次拉取消息时需要与消息通道建立连接,此次调用实际拉到消息列表为空, //再次调用即可拉取到消息,30秒内必须再次调用拉取消息接口,否则将断开与消息通道的连接。 //因此拉取间隔需要在30秒以内,否则每次拉到的消息是空的 if (j2.data.Count > 0) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { for (int i = 0; i < j2.data.Count; i++) { try { var msg = JsonConvert.DeserializeObject(j2.data[i]["content"].ToString()); if (!string.IsNullOrEmpty(Convert.ToString(msg.employeeNo))) { string deviceSerial = Convert.ToString(msg.deviceSerial); string employeeNo = Convert.ToString(msg.employeeNo); DateTime dateTime = Convert.ToDateTime(Convert.ToString(msg.dateTime)); var devices = db.Project_Devices.FirstOrDefault(x => x.DeviceSerial == deviceSerial); Model.SitePerson_PersonInOut newInOut = new Model.SitePerson_PersonInOut { ProjectId = devices.ProjectId, IdentityCard = employeeNo, IsIn = true, ChangeTime = dateTime, InOutWay = Const.InOutWay_1, }; InsertInOut(newInOut); } } catch (Exception e) { ErrLogInfo.WriteLog(e.StackTrace); } } } } else { //修改 如果为空循环调用最多5次 for (int y = 0; y < 5; y++) { //如果为空再调一次 content = YunMouHelper.consumerMessage(consumerId, token); //调用消息队列第二次 ErrLogInfo.WriteLog(content+ "调用消息队列" + (y + 2).ToString()); j2 = JsonConvert.DeserializeObject(content); if (j2.data.Count > 0) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { for (int i = 0; i < j2.data.Count; i++) { try { var msg = JsonConvert.DeserializeObject(j2.data[i]["content"].ToString()); if (!string.IsNullOrEmpty(Convert.ToString(msg.employeeNo))) { string deviceSerial = Convert.ToString(msg.deviceSerial); string employeeNo = Convert.ToString(msg.employeeNo); DateTime dateTime = Convert.ToDateTime(Convert.ToString(msg.dateTime)); var devices = Funs.DB.Project_Devices.FirstOrDefault(x => x.DeviceSerial == deviceSerial); //身份证号时 // if (employeeNo.Length == 18) { Model.SitePerson_PersonInOut newInOut = new Model.SitePerson_PersonInOut { ProjectId = devices.ProjectId, IdentityCard = employeeNo, IsIn = true, ChangeTime = dateTime, InOutWay = Const.InOutWay_1, }; InsertInOut(newInOut); } } } catch (Exception e) { ErrLogInfo.WriteLog(e.StackTrace); } } //提交偏移量 var msgOffset = YunMouHelper.offsets(consumerId, token); } //有值跳出循环 break; } } } } catch (Exception ex) { var erro = ex.Message; ErrLogInfo.WriteLog(ex.Message ); } } #region 根据考勤时间进入考勤 public static void InsertInOut(Model.SitePerson_PersonInOut model) { //考勤时间配置不为空的情况 var Kqgl_DateManageModel = Funs.DB.Kqgl_DateManage.FirstOrDefault(x => x.ProjectId == model.ProjectId); if (Kqgl_DateManageModel != null) { var changeTime = Convert.ToDateTime(model.ChangeTime); var nowTime = TimeSpan.Parse(changeTime.ToString("HH:mm:ss"));//当前时间的时分秒 #region 根据规则判断是进门还是出门 TimeSpan AmStartTime1 = TimeSpan.Parse(Kqgl_DateManageModel.AmStartTime1.ToString()); TimeSpan AmStartTime2 = TimeSpan.Parse(Kqgl_DateManageModel.AmStartTime2.ToString()); TimeSpan AmEndTime1 = TimeSpan.Parse(Kqgl_DateManageModel.AmEndTime1.ToString()); TimeSpan AmEndTime2 = TimeSpan.Parse(Kqgl_DateManageModel.AmEndTime2.ToString()); TimeSpan PmStartTime1 = TimeSpan.Parse(Kqgl_DateManageModel.PmStartTime1.ToString()); TimeSpan PmStartTime2 = TimeSpan.Parse(Kqgl_DateManageModel.PmStartTime2.ToString()); TimeSpan PmEndTime1 = TimeSpan.Parse(Kqgl_DateManageModel.PmEndTime1.ToString()); TimeSpan PmEndTime2 = TimeSpan.Parse(Kqgl_DateManageModel.PmEndTime2.ToString()); TimeSpan time1 = new TimeSpan(0, Convert.ToInt32(Kqgl_DateManageModel.LateTime), 0); TimeSpan time2 = new TimeSpan(0, Convert.ToInt32(Kqgl_DateManageModel.LeaveTime), 0); //允许迟到x分钟 AmStartTime2 = AmStartTime2.Add(time2); PmStartTime2 = PmStartTime2.Add(time2); //允许早退x分钟 AmEndTime1 = AmEndTime1.Add(-time1); PmEndTime1 = PmEndTime1.Add(-time1); SitePerson_Person personModel = null; if (!string.IsNullOrEmpty(model.PersonId)) { personModel = Funs.DB.SitePerson_Person.FirstOrDefault(x => x.SitePersonId == model.PersonId && x.ProjectId == model.ProjectId); model.IdentityCard = personModel.IdentityCard; } else { personModel = Funs.DB.SitePerson_Person.FirstOrDefault(x => x.IdentityCard == model.IdentityCard && x.ProjectId == model.ProjectId); } if (personModel != null) { //状态:0上午上班 1上午下班 2下午上班 3下午下班 var state = ""; //如果是在进场时间内 if (nowTime >= AmStartTime1 && nowTime <= AmStartTime2) { model.IsIn = true; state = "0"; } if (nowTime >= PmStartTime1 && nowTime <= PmStartTime2) { model.IsIn = true; state = "2"; } if (nowTime >= AmEndTime1 && nowTime <= AmEndTime2) { model.IsIn = false; state = "1"; } if (nowTime >= PmEndTime1 && nowTime <= PmEndTime2) { model.IsIn = false; state = "3"; } Model.SGGLDB db = Funs.DB; #region 这个人该时间点内有数据的话,就删掉(上班打卡时间取最早不删除,下班取最晚,删除早的) var objTime1 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + AmStartTime1.ToString()); var objTime2 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + AmStartTime2.ToString()); var objTime3 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + AmEndTime1.ToString()); var objTime4 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + AmEndTime2.ToString()); var objTime5 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + PmStartTime1.ToString()); var objTime6 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + PmStartTime2.ToString()); var objTime7 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + PmEndTime1.ToString()); var objTime8 = Convert.ToDateTime(Convert.ToDateTime(changeTime).ToString("yyyy-MM-dd") + " " + PmEndTime2.ToString()); //1.上午上班 var result1 = db.SitePerson_PersonInOut.Where(x => x.ProjectId == model.ProjectId && x.IdentityCard == personModel.IdentityCard && x.ChangeTime >= objTime1 && x.ChangeTime <= objTime2 ).ToList(); //2.上午下班 var result2 = db.SitePerson_PersonInOut.Where(x => x.ProjectId == model.ProjectId && x.IdentityCard == personModel.IdentityCard && x.ChangeTime >= objTime3 && x.ChangeTime <= objTime4 ).ToList(); //3.下午上班 var result3 = db.SitePerson_PersonInOut.Where(x => x.ProjectId == model.ProjectId && x.IdentityCard == personModel.IdentityCard && x.ChangeTime >= objTime5 && x.ChangeTime <= objTime6 ).ToList(); //4.下午下班 var result4 = db.SitePerson_PersonInOut.Where(x => x.ProjectId == model.ProjectId && x.IdentityCard == personModel.IdentityCard && x.ChangeTime >= objTime7 && x.ChangeTime <= objTime8 ).ToList(); //上班打卡时间取最早,下班取最晚 if (result1.Count > 0 && state == "0") { //db.SitePerson_PersonInOut.DeleteAllOnSubmit(result1); //db.SubmitChanges(); } else if (result1.Count == 0 && state == "0") { PersonInOutService.AddPersonInOut(model); } if (result2.Count > 0 && state == "1") { db.SitePerson_PersonInOut.DeleteAllOnSubmit(result2); db.SubmitChanges(); PersonInOutService.AddPersonInOut(model); } else if (result2.Count == 0 && state == "1") { PersonInOutService.AddPersonInOut(model); } if (result3.Count > 0 && state == "2") { //db.SitePerson_PersonInOut.DeleteAllOnSubmit(result3); //db.SubmitChanges(); } else if (result3.Count == 0 && state == "2") { PersonInOutService.AddPersonInOut(model); } if (result4.Count > 0 && state == "3") { db.SitePerson_PersonInOut.DeleteAllOnSubmit(result4); db.SubmitChanges(); PersonInOutService.AddPersonInOut(model); } else if (result4.Count == 0 && state == "3") { PersonInOutService.AddPersonInOut(model); } #endregion } #endregion } } #endregion } }