SGGL_SHJ/SGGL/BLL/OpenService/YunMouService.cs

441 lines
21 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using BLL.Common;
using Model;
using Newtonsoft.Json;
using System;
using System.Linq;
using System.Timers;
namespace BLL
{
public class YunMouService
{
#region 5
/// <summary>
/// 监视组件
/// </summary>
private static Timer messageTimer;
private static string token;
private static string consumerId;
/// <summary>
/// 启动监视器,不一定能成功,根据系统设置决定对监视器执行的操作 系统启动5分钟
/// </summary>
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();
}
/// <summary>
/// 流程确认 定时执行 系统启动5分钟
/// </summary>
/// <param name="sender">Timer组件</param>
/// <param name="e">事件参数</param>
private static void InProcess(object sender, ElapsedEventArgs e)
{
//自动调用
DoSynchDataNew();
}
#endregion
/// <summary>
/// 手动调用
/// </summary>
public static void manualOperation(string tokenSd, string consumerIdSd)
{
DoSynchData(tokenSd, consumerIdSd);
}
/// <summary>
///
/// </summary>
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<dynamic>(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<dynamic>(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<dynamic>(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<dynamic>(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
}
}