|
|
using Entity.Sugar; using Euro.Transfer.Base; using Euro.Transfer.Model; using SqlSugar; using SqlSugar.Base; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using EasyBL; using System.Net.Mail;
namespace Euro.Transfer.Jobs.TaskTips { enum JobType { TaskTips, RunEIPTips, RunAttendanceLists, RunCreateAttendanceTips, RunClearFiles, CheckAnnualleaveAndMail } public class Job : ServiceTask {
/// <summary>
/// 任务开始
/// </summary>
protected override void Start() { try { //运行中
this.mIsRunning = true; var db = SugarBase.GetIntance(); var sCurrTime = DateTime.Now.ToString("HH:mm"); var sTaskTipsTimeID = Common.ConfigGetValue("", "TaskTipsTimeID"); var sEIPTipsTimeID = Common.ConfigGetValue("", "EIPTipsTimeID"); var sAttendanceTime = Common.ConfigGetValue("", "ReadAttendanceTime"); var sCreateAttendanceTips = Common.ConfigGetValue("", "CreateAttendanceTipsTime"); var sClearFilesTime = Common.ConfigGetValue("", "ClearFilesTime"); var CheckAnnualleave = Common.ConfigGetValue("", "ReadWenZhongAnnualleave"); var saSetTask = db.Queryable<OTB_SYS_SystemSetting>().Where(it => it.Effective == "Y" && it.SettingItem == sTaskTipsTimeID).ToList();
if (saSetTask.Count > 0) { foreach (OTB_SYS_SystemSetting set in saSetTask) { if (set.SettingValue.IndexOf(sCurrTime) > -1) { //执行工作项
this.RunTaskTips(set.OrgID); } } }
var saSetEIP = db.Queryable<OTB_SYS_SystemSetting>().Where(it => it.Effective == "Y" && it.SettingItem == sEIPTipsTimeID).ToList(); if (saSetEIP.Count > 0) { foreach (OTB_SYS_SystemSetting set in saSetEIP) { if (set.SettingValue.IndexOf(sCurrTime) > -1) { //执行工作项
this.RunEIPTips(set.OrgID); } } }
if (sAttendanceTime.IndexOf(sCurrTime) > -1) { WriteTaskLog("Start:" + JobType.RunAttendanceLists.ToString(), JobType.RunAttendanceLists);//記錄所有log
//讀取卡鐘打卡資料
this.RunAttendanceLists(); WriteTaskLog("End:" + JobType.RunAttendanceLists.ToString(), JobType.RunAttendanceLists);//記錄所有log
}
if (sCurrTime == sCreateAttendanceTips) { //產生未打卡定時提醒資料
this.RunCreateAttendanceTips(); } if (sCurrTime == sClearFilesTime) {
//执行清理廢除文件工作项
this.RunClearFiles(); }
if (sCurrTime == CheckAnnualleave) { WriteTaskLog("Start:" + JobType.CheckAnnualleaveAndMail.ToString(), JobType.CheckAnnualleaveAndMail); //檢查特休
CheckAnnualleaveAndMail(); WriteTaskLog("End:" + JobType.CheckAnnualleaveAndMail.ToString(), JobType.CheckAnnualleaveAndMail); } } catch (Exception error) { ErrorLog(error); } finally { //空闲
this.mIsRunning = false; } }
/// <summary>
/// 任务停止
/// </summary>
protected override void Stop() { this.mIsRunning = false; }
#region 执行代辦提醒邏輯
/// <summary>
/// 执行代辦提醒邏輯
/// </summary>
/// <param name="sOrgID">todo: describe sOrgID parameter on RunTaskTips</param>
protected void RunTaskTips(string sOrgID) { try { do { var db = SugarBase.GetIntance(); var saTasks = db.Queryable<OTB_SYS_Task, OTB_SYS_Members>((t, m) => t.OrgID == m.OrgID && t.CreateUser == m.MemberID) .Select((t, m) => new OTB_SYS_Task { OrgID = t.OrgID, EventID = t.EventID, EventName = t.EventName, Owner = t.Owner, StartDate = t.StartDate, EndDate = t.EndDate, Important = SqlFunc.IIF(t.Important == "M", "普通", "重要"), CreateUser = m.MemberName, TaskDescription = t.TaskDescription, SourceFrom = t.SourceFrom, Params = t.Params }) .Where(t => t.OrgID == sOrgID && ((t.Status == "U" && t.AlertTime == null) || (t.Status != "O" && t.Status != "D" && t.AlertTime >= DateTime.Now))).ToList();
if (saTasks.Count > 0) { var listMessages = new List<Message>(); foreach (OTB_SYS_Task task in saTasks) { var msg = new Message { Type = MessageType.SendToUser, Memo = "tips", ToOrgId = task.OrgID, ToUserId = task.Owner }; if (!listMessages.Any(x => (x.ToOrgId == msg.ToOrgId && x.ToUserId == msg.ToUserId))) { listMessages.Add(msg); } } foreach (Message message in listMessages) { if (hubClient.OnlineUsers.Any(x => (x.OrgId == message.ToOrgId && x.UserId == message.ToUserId))) { var listTaskInfos = new List<TaskInfo>(); foreach (OTB_SYS_Task _task in saTasks) { var sOrgId = _task.OrgID; var sUserId = _task.Owner; if (message.ToOrgId == sOrgId && message.ToUserId == sUserId) { var task = new TaskInfo { OrgID = sOrgId, Owner = sUserId, StartDate = _task.StartDate, EndDate = _task.EndDate == null ? _task.StartDate : _task.EndDate, EventID = _task.EventID, EventName = _task.EventName, Important = _task.Important, CreateUser = _task.CreateUser, SourceFrom = _task.SourceFrom, Params = _task.Params }; listTaskInfos.Add(task); } } message.Content = ServiceBase.JsonToString(listTaskInfos); hubClient.msgProxy.Invoke("Send", message); } } } } while (false); } catch (Exception error) { ErrorLog(error); } }
#endregion 执行代辦提醒邏輯
#region 执行考勤未打卡提醒邏輯
/// <summary>
/// 执行考勤未打卡提醒邏輯
/// </summary>
/// <param name="sOrgID">todo: describe sOrgID parameter on RunEIPTips</param>
protected void RunEIPTips(string sOrgID) { try { do { var db = SugarBase.GetIntance();
var rNow = DateTime.Now; var rStart = DateTime.Now; var rEnd = DateTime.Now; if (rNow.Day <= 5) { rStart = rStart.AddMonths(-1); rStart = new DateTime(rStart.Year, rStart.Month, 1); } else { rStart = new DateTime(rNow.Year, rNow.Month, 1); }
var saClockTips = db.Queryable<OTB_SYS_ClockTips>().Where(x => x.OrgID == sOrgID && x.TipsDate >= rStart && x.TipsDate <= rEnd).ToList();
if (saClockTips.Count > 0) { var listMessages = new List<Message>(); foreach (OTB_SYS_ClockTips tips in saClockTips) { var msg = new Message { Type = MessageType.SendToUser, Memo = "attendance", ToOrgId = tips.OrgID, ToUserId = tips.Owner }; if (!listMessages.Any(x => (x.ToOrgId == msg.ToOrgId && x.ToUserId == msg.ToUserId))) { listMessages.Add(msg); } } foreach (Message message in listMessages) { if (hubClient.OnlineUsers.Any(x => (x.OrgId == message.ToOrgId && x.UserId == message.ToUserId))) { var listClockTips = new List<ClockTipsInfo>(); foreach (OTB_SYS_ClockTips _tips in saClockTips) { var sOrgId = _tips.OrgID; var sUserId = _tips.Owner; if (message.ToOrgId == sOrgId && message.ToUserId == sUserId) { var tips = new ClockTipsInfo { OrgID = sOrgId, Owner = sUserId, NO = _tips.NO, Type = _tips.Type, Title = _tips.Title, Content = _tips.Content, Url = _tips.Url, CreateUser = _tips.CreateUser, CreateDate = _tips.CreateDate, Parm = "" }; listClockTips.Add(tips); } } message.Content = ServiceBase.JsonToString(listClockTips); hubClient.msgProxy.Invoke("Send", message); } } } } while (false); } catch (Exception error) { ErrorLog(error); } }
#endregion 执行考勤未打卡提醒邏輯
#region 轉入文字檔案
/// <summary>
/// 轉入文字檔案
/// </summary>
protected void RunAttendanceLists() { try { do { var db = SugarBase.GetIntance(); var ConfigSettings = new List<string>() { Common.ConfigGetValue("", "WorkTimePMKey"), Common.ConfigGetValue("", "WorkTimeAMKey") ,Common.ConfigGetValue("", "LatestShiftTimeKey"), Common.ConfigGetValue("", "DelayBufferTimeKey") }; var sAttendanceFilePath = Common.ConfigGetValue("", "AttendancePath");//打卡資料存放路徑
var AttendanceMethod = new AttendanceMethods(); var AttendanceRules = AttendanceMethod.GetAttendanceRule(db, ConfigSettings); //取得昨天、今日打卡名稱。
var LoadingDates = new DateTime[] { DateTime.Now.Date.AddDays(-1), DateTime.Now.Date }; var DeleteStartDate = LoadingDates[0].Date; var DeleteEndDate = LoadingDates[1].Date.AddSeconds(24 * 60 * 60 - 1);
var i = db.Deleteable<OTB_EIP_Attendance>().Where(x => x.CardDate.Date >= DeleteStartDate && x.CardDate.Date <= DeleteEndDate).ExecuteCommand(); WriteTaskLog("已刪除:" + i.ToString() + "筆,從" + DeleteStartDate + "到" + DeleteEndDate, JobType.RunAttendanceLists); var saAttendanceAdd = new List<OTB_EIP_Attendance>(); foreach (var date in LoadingDates) {
var CurrentDay = date.ToString("yyyyMMdd"); var LoadingFilesPath = sAttendanceFilePath + CurrentDay + ".Txt"; if (File.Exists(LoadingFilesPath)) { var AllLineDatas = File.ReadAllLines(LoadingFilesPath, Encoding.Default).Distinct().ToArray(); //固定時間為13點。
var CardDate = date.AddHours(13); var saCardAttendanceInfo = AttendanceMethod.CalculateAttendance(AllLineDatas, AttendanceRules, CardDate).OrderBy(c => c.CardId).ToList(); var saMembers = db.Queryable<OTB_SYS_Members>().Where(it => it.Effective == "Y" && it.IsAttendance == true).ToList();
//遍歷所有需要考勤的人,補全打卡信息用於初始化打卡資料
foreach (OTB_SYS_Members member in saMembers) { if (saCardAttendanceInfo.Any(x => (x.CardId == member.CardId && member.OrgID == x.OrgID))) { var oAttendanceInfo = saCardAttendanceInfo.First(x => x.CardId == member.CardId && member.OrgID == x.OrgID); if (oAttendanceInfo.StatusA != null && oAttendanceInfo.StatusA == true) { oAttendanceInfo.Memo = "遲到"; } if (oAttendanceInfo.StatusP != null && oAttendanceInfo.StatusP == true) { oAttendanceInfo.Memo = oAttendanceInfo.Memo == "" ? "早退" : oAttendanceInfo.Memo + ",早退"; } if (string.IsNullOrEmpty(oAttendanceInfo.SignOut)) { oAttendanceInfo.Memo = oAttendanceInfo.Memo == "" ? "(下班)未刷卡" : oAttendanceInfo.Memo + ",(下班)未刷卡"; } oAttendanceInfo.UserID = member.MemberID; saAttendanceAdd.Add(oAttendanceInfo); } else { //需要打卡又沒有抓到打卡資料的人默認未打卡
var oAttendanceInfo = new OTB_EIP_Attendance { OrgID = member.OrgID, UserID = member.MemberID, CardDate = CardDate, CardId = member.CardId, TimeA = "", TimeP = "", CardUserName = member.MemberName, Hours = "0", SignIn = "", SignOut = "", StatusP = true, StatusA = true, Memo = "未刷卡", CreateDate = DateTime.Now }; saAttendanceAdd.Add(oAttendanceInfo); } } } } if (saAttendanceAdd.Count > 0) { db.Insertable(saAttendanceAdd).ExecuteCommand(); WriteTaskLog("已新增:" + saAttendanceAdd.Count + "筆,從" + LoadingDates[0] + " 到 " + LoadingDates[1], JobType.RunAttendanceLists); }
} while (false); } catch (Exception error) { ErrorLog(error); } }
#endregion 轉入文字檔案
#region 执行清理後台產生的廢除文件
/// <summary>
/// 执行清理後台產生的廢除文件
/// </summary>
protected void RunClearFiles() { try { do { var sClearFilesPath = Common.ConfigGetValue("", "ClearFilesPath"); var rCurDate = DateTime.Now.AddDays(-7); if (Directory.Exists(sClearFilesPath)) { var filePathArr = Directory.GetFiles(sClearFilesPath); var fileCreateDate = new Dictionary<string, DateTime>(); foreach (string file in filePathArr) { var fi = new FileInfo(file); fileCreateDate[file] = fi.CreationTime; } fileCreateDate = fileCreateDate.OrderBy(f => f.Value).ToDictionary(f => f.Key, f => f.Value); foreach (KeyValuePair<string, DateTime> item in fileCreateDate) { if (item.Value <= rCurDate && File.Exists(item.Key)) { File.Delete(item.Key); } } } } while (false); } catch (Exception error) { ErrorLog(error); } }
#endregion 执行清理後台產生的廢除文件
#region 產生未打卡定時提醒資料
/// <summary>
/// 產生未打卡定時提醒資料
/// </summary>
protected void RunCreateAttendanceTips() { try { do { var db = SugarBase.GetIntance(); var sOrigID = Common.ConfigGetValue("", "TransferOrgID"); var rNow = DateTime.Now; var rCurDate = rNow.AddDays(-1); var saClockTips_Add = new List<OTB_SYS_ClockTips>(); var saAttendance = db.Queryable<OTB_EIP_Attendance>().Where(x => x.OrgID == sOrigID && x.CardDate.Date == rCurDate.Date).ToList();
var sCurYear = rCurDate.Year.ToString(); var oHolidays = db.Queryable<OTB_SYS_Holidays>().Single(x => x.OrgID == sOrigID && x.Year == sCurYear);
foreach (var attendance in saAttendance) { if (attendance.SignIn == "" && oHolidays.Holidays.IndexOf(rCurDate.ToString("yyyy-MM-dd")) == -1) { if (CheckTips(db, rCurDate, attendance.OrgID, attendance.UserID)) { var oClockTips = new OTB_SYS_ClockTips { OrgID = attendance.OrgID, ParentID = rCurDate.ToString("yyyyMMdd"), Owner = attendance.UserID, Type = nameof(attendance), Title = rCurDate.ToString("yyyy.MM.dd") + "日沒有打卡,也沒有對應的行事曆和EIP資訊,請至EIP填寫對應的申請單", Content = "", Url = "", CreateUser = "", TipsDate = rCurDate, CreateDate = rNow }; saClockTips_Add.Add(oClockTips); } } }
if (saClockTips_Add.Count > 0) { db.Insertable(saClockTips_Add).ExecuteCommand(); } } while (false); } catch (Exception error) { ErrorLog(error); } }
#endregion 產生未打卡定時提醒資料
/// <summary>
/// 檢核EIP申請資料與行事曆判斷是否需要填寫
/// </summary>
/// <param name="userId">结束时间</param>
/// <param name="db">todo: describe db parameter on CheckTips</param>
/// <param name="date">todo: describe date parameter on CheckTips</param>
/// <param name="origId">todo: describe origId parameter on CheckTips</param>
/// <returns>返回(秒)单位,比如: 0.00239秒</returns>
private static bool CheckTips(SqlSugarClient db, DateTime date, string origId, string userId) { var bToTips = true; do { var iCount_Calendar = db.Queryable<OTB_SYS_Calendar>().Count(x => x.OrgID == origId && x.UserID == userId && !x.DelStatus && (x.StartDate.Date == date.Date || x.EndDate.Date == date.Date || (x.StartDate <= date && x.EndDate >= date))); if (iCount_Calendar > 0) { bToTips = false; break; } var sStatus = "B,E,H-O"; //差勤異常
var iCount_AttendanceDiff = db.Queryable<OTB_EIP_AttendanceDiff>() .Count(x => x.OrgID == origId && x.AskTheDummy == userId && sStatus.Contains(x.Status) && x.FillBrushDate.Value.Date == date.Date); if (iCount_AttendanceDiff > 0) { bToTips = false; break; } //請假單
var iCount_Leave = db.Queryable<OTB_EIP_Leave>() .Count(x => x.OrgID == origId && x.AskTheDummy == userId && sStatus.Contains(x.Status) && (x.StartDate.Value.Date == date.Date || x.EndDate.Value.Date == date.Date || (x.StartDate <= date && x.EndDate >= date))); if (iCount_Leave > 0) { bToTips = false; break; } } while (false); return bToTips; }
/// <summary>
/// 程序执行时间测试
/// </summary>
/// <param name="dateBegin">开始时间</param>
/// <param name="dateEnd">结束时间</param>
/// <returns>返回(秒)单位,比如: 0.00239秒</returns>
private static double ExecDateDiff(DateTime dateBegin, DateTime dateEnd) { var ts1 = new TimeSpan(dateBegin.Ticks); var ts2 = new TimeSpan(dateEnd.Ticks); var ts3 = ts1.Subtract(ts2).Duration(); //你想转的格式
return ts3.TotalHours; }
/// <summary>
/// 檢查是否在時間區間內
/// </summary>
/// <param name="dateTime"></param>
/// <param name="StartDT"></param>
/// <param name="EndDT"></param>
/// <returns></returns>
public static bool CheckDateRange(DateTime dateTime, DateTime StartDT, DateTime EndDT) { var DataTicks = dateTime.Ticks; var StartTicks = StartDT.Ticks; var EndTicks = EndDT.Ticks; if (DataTicks >= StartTicks && DataTicks <= EndTicks) return true; else return false; }
/// <summary>
/// 特休提醒
/// </summary>
public static void CheckAnnualleaveAndMail() { var Job = JobType.CheckAnnualleaveAndMail; var TitleTemp = "<系統自動發信>{UserName}特休假即將失效通知"; var ContentTemp = "您於{EnableDate}-{ExpirationDate}剩餘的特休假即將在{ExpirationDate}失效,如需遞延最晚請於失效日前1個月向管理部提出書面申請,逾期未申請屆期將直接換算薪資發放。"; var ReplaceKeys = new { EnableDate = "{EnableDate}", ExpiredDate = "{ExpirationDate}", UserName = "{UserName}" }; var db = SugarBase.DB; try { do { var StartDT = DateTime.Now.Date; var EndDT = StartDT.AddDays(45);
var AvailableAnnualleaves = db.Queryable<OTB_EIP_WenZhong>() .Where(it => it.DelFlag == false && it.Notice == false && it.RemainHours > 0 && it.ExpirationDate.HasValue).ToList(); var ToBeExpiredAL = AvailableAnnualleaves.Where(c => CheckDateRange(c.ExpirationDate.Value, StartDT, EndDT)).OrderBy(c => c.OrgID).ToList(); if (ToBeExpiredAL.Count > 0) { var UpdateWenZhongs = new List<OTB_EIP_WenZhong>(); var Users = db.Queryable<OTB_SYS_Members>().Where(it => it.Effective == "Y").ToList();
var mailServices = new List<MailService>(); var AllOrgIDs = ToBeExpiredAL.Select(c => c.OrgID).ToList().Distinct(); foreach (var OrgID in AllOrgIDs) { mailServices.Add(new MailService(OrgID, false)); }
string LogMsg = @""; foreach (var Al in ToBeExpiredAL) { var FoundUser = Users.FirstOrDefault(c => c.Effective == "Y" && c.MemberID == Al.UserID && c.OrgID == Al.OrgID); if (FoundUser != null) { var OrgID = FoundUser.OrgID; var MailTitle = TitleTemp.Replace(ReplaceKeys.UserName, FoundUser.MemberName); var MailBody = ContentTemp.Replace(ReplaceKeys.EnableDate, Al.EnableDate.Value.ToString("yyyy/MM/dd")) .Replace(ReplaceKeys.ExpiredDate, Al.ExpirationDate.Value.ToString("yyyy/MM/dd"));
using (MailMessage mail = new MailMessage()) { var UseStmpEmailServer = mailServices.Where(c => c.OrgID == FoundUser.OrgID).First(); mail.To.Add(FoundUser.Email); mail.From = new MailAddress(UseStmpEmailServer.mailSetting["FromEmail"].ToString(), UseStmpEmailServer.mailSetting["FromName"].ToString(), System.Text.Encoding.UTF8); mail.Subject = MailTitle; mail.SubjectEncoding = Encoding.UTF8;//郵件標題編碼
mail.Body = MailBody; //郵件內容
mail.BodyEncoding = Encoding.UTF8;//郵件內容編碼
mail.IsBodyHtml = true;//是否是HTML郵件
var bSend = UseStmpEmailServer.SendMailNET_NoSelf(mail); if (bSend) { LogMsg += "寄送特休通知給: " + Al.UserName + ",特休期間從" + Al.EnableDate.Value.ToString("yyyy/MM/dd") + " 到 " + Al.ExpirationDate.Value.ToString("yyyy/MM/dd") + Environment.NewLine; Al.Notice = true; UpdateWenZhongs.Add(Al); } else { LogMsg += UseStmpEmailServer.ErrorMessages; } } }
} if (LogMsg.Length > 0) { WriteTaskLog(LogMsg, Job); } if (UpdateWenZhongs.Count > 0) { db.Updateable(UpdateWenZhongs).UpdateColumns(it => new { it.Notice }).ExecuteCommand(); } } } while (false); } catch (Exception error) { ErrorLog(error); } }
/// <summary>
/// 輸出錯誤資訊
/// </summary>
/// <param name="error"></param>
private static void ErrorLog(Exception error) { ServiceTools.WriteLog("", "Error:" + error.ToString() + "StackTrace:" + Environment.NewLine + error.StackTrace, true); }
private static void WriteTaskLog(string cont, JobType job) { var FolderName = job.ToString(); var path = System.Windows.Forms.Application.StartupPath.ToString() + @"\Tasks\" + FolderName + "\\";
if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } path += DateTime.Now.ToString("yyyy-MM-dd") + ".txt"; using (StreamWriter sw = new StreamWriter(path, true, Encoding.UTF8)) { sw.WriteLine(DateTime.Now); sw.WriteLine(cont); sw.WriteLine(""); sw.Close(); } } } }
|