using System.Linq; using System.Timers; using System; using System.Net.Mail; using System.Net; using System.Collections.Generic; using Model; using System.Data.SqlClient; using System.Data; using NPOI.SS.Formula.Functions; using System.Reflection; using System.Text; namespace BLL { public static class GJSXMonitorService { public static Model.SGGLDB db = Funs.DB; /// /// 关键事项超期预警定时提醒发送邮箱 /// public static void OverdueWarningSendEmail() { try { Model.SGGLDB db = Funs.DB; //取未关闭且已经超期的数据 string strSql = @"select DATEDIFF(DAY, CompleteDate, isnull(CloseDate,getdate())) AS DateDiffDays ,a.GJSXID,a.ProjectId,a.Detail,a.createDate,Base_Project.ProjectName,Base_Unit.UnitName,a.CloseDate,a.IsManypeople,a.CompleteDate,a.AttachUrl ,case a.state when 2 then '正在进行' when 3 then '待办' when 0 then '已关闭' when 1 then '开放' end as state ,CNProfessionalName = STUFF((SELECT ',' + Base_CNProfessional.ProfessionalName FROM dbo.Base_CNProfessional where PATINDEX('%,' + RTRIM(Base_CNProfessional.CNProfessionalId) + ',%', ',' + a.CNProfessional_ID + ',') > 0 FOR XML PATH('')), 1, 1,'') ,QuestionTypeName = STUFF((SELECT ',' + Base_QuestionType.QuestionTypeName FROM dbo.Base_QuestionType where PATINDEX('%,' + RTRIM(Base_QuestionType.QuestionTypeID) + ',%', ',' + a.QuestionTypeID + ',') > 0 FOR XML PATH('')), 1, 1,'') ,GJSXTypeName = STUFF((SELECT ',' + Base_GJSXType.GJSXTypeName FROM dbo.Base_GJSXType where PATINDEX('%,' + RTRIM(Base_GJSXType.GJSXTypeID) + ',%', ',' + a.GJSXTypeID + ',') > 0 FOR XML PATH('')), 1, 1,'') ,a.UserID,b.UserName --,b.Email as UserEmail ,a.User_ReceiveID as User_ReceiveUserId ,User_ReceiveUserName = STUFF((SELECT ',' + p2.UserName FROM dbo.Sys_User as p2 where PATINDEX('%,' + RTRIM(p2.UserId) + ',%', ',' + a.User_ReceiveID + ',') > 0 FOR XML PATH('')), 1, 1,'') --,User_ReceiveUserEmail = STUFF((SELECT ',' + p2.Email FROM dbo.Sys_User as p2 where PATINDEX('%,' + RTRIM(p2.UserId) + ',%', ',' + a.User_ReceiveID + ',') > 0 FOR XML PATH('')), 1, 1,'') ,a.user_Acceptance as User_AcceptanceUserId ,User_AcceptanceUserName = STUFF((SELECT ',' + p2.UserName FROM dbo.Sys_User as p2 where PATINDEX('%,' + RTRIM(p2.UserId) + ',%', ',' + a.user_Acceptance + ',') > 0 FOR XML PATH('')), 1, 1,'') --,User_AcceptanceUserEmail = STUFF((SELECT ',' + p2.Email FROM dbo.Sys_User as p2 where PATINDEX('%,' + RTRIM(p2.UserId) + ',%', ',' + a.user_Acceptance + ',') > 0 FOR XML PATH('')), 1, 1,'') ,a.CsUsers as User_CsUserIds ,User_CsUsers = STUFF((SELECT ',' + p2.UserName FROM dbo.Sys_User as p2 where PATINDEX('%,' + RTRIM(p2.UserId) + ',%', ',' + a.CsUsers + ',') > 0 FOR XML PATH('')), 1, 1,'') --,User_CsUsersUserEmail = STUFF((SELECT ',' + p2.Email FROM dbo.Sys_User as p2 where PATINDEX('%,' + RTRIM(p2.UserId) + ',%', ',' + a.CsUsers + ',') > 0 FOR XML PATH('')), 1, 1,'') from GJSX as a left join Sys_User as b on a.UserId = b.UserId left join[dbo].[Base_Project] on a.ProjectId = Base_Project.ProjectId left join[dbo].[Base_Unit] on a.UnitId = Base_Unit.UnitId where 1=1 and a.state<>'0' and GETDATE()>a.CompleteDate "; List listStr = new List(); SqlParameter[] parameter = listStr.ToArray(); DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter); // 使用LINQ将DataTable转换为List var lstOverdue = table.AsEnumerable().Select(row => new GJSXItem { DateDiffDays = Convert.ToInt32(row["DateDiffDays"]), GJSXID = row["GJSXID"].ToString(), ProjectId = row["ProjectId"].ToString(), ProjectName = row["ProjectName"].ToString(), UnitName = row["UnitName"].ToString(), Detail = row["Detail"].ToString(), CNProfessionalName = row["CNProfessionalName"].ToString(), QuestionTypeName = row["QuestionTypeName"].ToString(), GJSXTypeName = row["GJSXTypeName"].ToString(), UserID = row["UserID"].ToString(), UserName = row["UserName"].ToString(), //UserEmail = row["UserEmail"].ToString(), User_ReceiveUserId = row["User_ReceiveUserId"].ToString(), User_ReceiveUserName = row["User_ReceiveUserName"].ToString(), //User_ReceiveUserEmail = row["User_ReceiveUserEmail"].ToString(), User_AcceptanceUserId = row["User_AcceptanceUserId"].ToString(), User_AcceptanceUserName = row["User_AcceptanceUserName"].ToString(), //User_AcceptanceUserEmail = row["User_AcceptanceUserEmail"].ToString(), User_CsUserIds = row["User_CsUserIds"].ToString(), User_CsUsers = row["User_CsUsers"].ToString(), //User_CsUsersUserEmail = row["User_CsUsersUserEmail"].ToString(), CompleteDate = Convert.ToDateTime(row["CompleteDate"].ToString()) }).ToList(); #region 根据用户聚合推送,多个事项合并推送 //获取有邮箱的用户 var userIds = BLL.UserService.GetUserHaveEmailList(); if (userIds.Any() && lstOverdue.Any()) { var lstProject = lstOverdue.Select(x => new { x.ProjectId, x.ProjectName }).Distinct().ToList(); foreach (var pro in lstProject) { var lstProjectOverdue = lstOverdue.Where(x => x.ProjectId == pro.ProjectId).ToList(); if (lstProjectOverdue.Any()) { string projectName = pro.ProjectName; foreach (var user in userIds) { MailMessage mail = new MailMessage(); //邮件主题 mail.Subject = $"关键事项超期预警提醒——{projectName}"; //mail.To.Add(user.Email); mail.To.Add("1784803958@qq.com"); mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析 StringBuilder tbodyStr = new StringBuilder(); int index = 1; //责任人为本人 var acceptanceItems = lstProjectOverdue.Where(x => x.User_AcceptanceUserId.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList(); if (acceptanceItems.Any()) { foreach (var item in acceptanceItems) { tbodyStr.Append($"{index}本人负责{item.UnitName}{item.Detail}{item.GJSXTypeName}{item.UserName}{item.User_AcceptanceUserName}{item.CompleteDate.ToShortDateString()}{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}"); index++; } } //发起人为本人 var userItems = lstProjectOverdue.Where(x => x.UserID == user.UserId).OrderByDescending(x => x.DateDiffDays).ToList(); if (userItems.Any()) { foreach (var item in userItems) { tbodyStr.Append($"{index}本人发起{item.UnitName}{item.Detail}{item.GJSXTypeName}{item.UserName}{item.User_AcceptanceUserName}{item.CompleteDate.ToShortDateString()}{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}"); index++; } } //跟踪人为本人--x.User_ReceiveUserId != null && x.User_ReceiveUserId != "" && var receiveItems = lstProjectOverdue.Where(x => x.User_ReceiveUserId.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList(); if (receiveItems.Any()) { foreach (var item in receiveItems) { tbodyStr.Append($"{index}本人跟踪{item.UnitName}{item.Detail}{item.GJSXTypeName}{item.UserName}{item.User_AcceptanceUserName}{item.CompleteDate.ToShortDateString()}{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}"); index++; } } //抄送人为本人 var csUserItems = lstProjectOverdue.Where(x => x.User_CsUserIds.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList(); if (csUserItems.Any()) { foreach (var item in csUserItems) { tbodyStr.Append($"{index}抄送本人{item.UnitName}{item.Detail}{item.GJSXTypeName}{item.UserName}{item.User_AcceptanceUserName}{item.CompleteDate.ToShortDateString()}{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}"); index++; } } //邮件正文 string bodyStr = @"

关键事项超期预警提醒

请点击此处,查看详细信息,并及时处置关闭 " + tbodyStr.ToString() + "
序号 类型 责任单位 事项描述 事项类别 发起人 责任人 约定完成时间 超期时间(天)
"; mail.Body = bodyStr; PushEmail(mail); } } } } #endregion } catch (Exception ex) { } } /// /// 发送邮件 /// /// private static void PushEmail(MailMessage mail) { //获取发送邮箱配置 Email_Pop pops = BLL.Email_PopService.GetEmail_Pop("7EC5E991-B7A0-495A-90ED-2BE15370C959"); if (pops != null) { SmtpClient client = new SmtpClient(pops.EmailFwq);//替换为你的SMTP服务器地址 client.Port = int.Parse(pops.EmailDk);//587或465如果使用SSL client.EnableSsl = true;//如果服务器支持SSL,设置为true client.DeliveryMethod = SmtpDeliveryMethod.Network; client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential(pops.EmailYx, pops.EmailPass);//替换为你的邮箱和服务授权码 mail.From = new MailAddress(pops.EmailYx);//发件人邮箱地址 try { client.Send(mail); //Console.WriteLine("Email sent successfully."); } catch (Exception ex) { //Console.WriteLine("Email sending failed: " + ex.Message); } } } } }