| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 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; | 
					
						
							| 
									
										
										
										
											2025-04-02 16:18:06 +08:00
										 |  |  |  | using System.Net.Security; | 
					
						
							|  |  |  |  | using System.Security.Cryptography.X509Certificates; | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  | using System.Threading.Tasks; | 
					
						
							|  |  |  |  | using System.Threading; | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  | using Quartz.Util; | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace BLL | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     public static class GJSXMonitorService | 
					
						
							|  |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |         //public static Model.SGGLDB db = Funs.DB; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |         /// 关键事项新增通知提醒责任人、抄送人 | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="gjsxId"></param> | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |         public static void GJSXNoticeSendEmail(string gjsxId) | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |             List<string> userIds = new List<string>(); | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |             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.GJSXID = '{gjsxId}'  ";
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             List<SqlParameter> listStr = new List<SqlParameter>(); | 
					
						
							|  |  |  |  |             SqlParameter[] parameter = listStr.ToArray(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             // 使用LINQ将DataTable转换为List<GJSXItem> | 
					
						
							|  |  |  |  |             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(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             var gItem = lstOverdue.FirstOrDefault(); | 
					
						
							| 
									
										
										
										
											2025-09-20 16:45:17 +08:00
										 |  |  |  |             if (gItem != null) | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                 userIds.Add(gItem.User_AcceptanceUserId); | 
					
						
							|  |  |  |  |                 if (!string.IsNullOrWhiteSpace(gItem.User_CsUserIds)) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     userIds.AddRange(gItem.User_CsUserIds.Split(',')); | 
					
						
							|  |  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-09-20 16:45:17 +08:00
										 |  |  |  |                 foreach (var userId in userIds) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     var user = UserService.GetUserByUserId(userId); | 
					
						
							|  |  |  |  |                     if (!string.IsNullOrWhiteSpace(user.Email)) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         MailMessage mail = new MailMessage(); | 
					
						
							|  |  |  |  |                         //邮件主题 | 
					
						
							|  |  |  |  |                         if (userId == gItem.User_AcceptanceUserId) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             mail.Subject = $"你有新的关键事项了——{gItem.ProjectName}"; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             mail.Subject = $"有新的关键事项抄送你了——{gItem.ProjectName}"; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         mail.To.Add(user.Email); | 
					
						
							|  |  |  |  |                         //mail.To.Add("test@test.com"); | 
					
						
							|  |  |  |  |                         mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析 | 
					
						
							|  |  |  |  |                                                //邮件正文 | 
					
						
							|  |  |  |  |                         string bodyStr = $@"<html>
 | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  | <head> | 
					
						
							|  |  |  |  | <style> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | </style> | 
					
						
							|  |  |  |  | </head> | 
					
						
							|  |  |  |  | <body> | 
					
						
							|  |  |  |  | <h2>新的关键事项信息</h2> | 
					
						
							|  |  |  |  | <p>项目名称:{gItem.ProjectName}</p> | 
					
						
							|  |  |  |  | <p>事项编号:{gItem.GJSXID}</p> | 
					
						
							|  |  |  |  | <p>责任单位:{gItem.UnitName}</p> | 
					
						
							|  |  |  |  | <p>专业:{gItem.CNProfessionalName}</p> | 
					
						
							|  |  |  |  | <p>事项类别:{gItem.GJSXTypeName}</p> | 
					
						
							|  |  |  |  | <p>紧急程度:{gItem.QuestionTypeName}</p> | 
					
						
							|  |  |  |  | <p>事项描述:{gItem.Detail}</p> | 
					
						
							|  |  |  |  | <p>提出人:{gItem.UserName}</p> | 
					
						
							|  |  |  |  | <p>责任人:{gItem.User_AcceptanceUserName}</p> | 
					
						
							|  |  |  |  | <p>跟踪人:{gItem.User_ReceiveUserName}</p> | 
					
						
							|  |  |  |  | <p>抄送人:{gItem.User_CsUsers}</p> | 
					
						
							|  |  |  |  | <p>约定完成日期:{gItem.CompleteDate.ToShortDateString()}</p> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <h2>智慧施工管理信息系统</h2> | 
					
						
							|  |  |  |  | <a href='https://zhgd.cwcec.com/'>请点击此处,进入智慧施工管理信息系统,查看事项详情</a> | 
					
						
							|  |  |  |  | <p>登录账号:{user.Account}</p> | 
					
						
							|  |  |  |  | <p>登录密码:CWCEC.+身份证号后四位(示例:CWCEC.1234)</p> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | </body> | 
					
						
							|  |  |  |  | </html>";
 | 
					
						
							| 
									
										
										
										
											2025-09-20 16:45:17 +08:00
										 |  |  |  |                         //< p > 登录密码:{ user.RawPassword}</ p > | 
					
						
							|  |  |  |  |                         mail.Body = bodyStr; | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-20 16:45:17 +08:00
										 |  |  |  |                         try | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             bool send = PushEmail(mail); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         catch (Exception ex) | 
					
						
							|  |  |  |  |                         { | 
					
						
							| 
									
										
										
										
											2025-09-23 16:56:08 +08:00
										 |  |  |  |                             //ErrLogInfo.WriteLog($"关键事项通知提醒责任人;项目名称:{gItem.ProjectName},事项编号:{gItem.GJSXID}", ex); | 
					
						
							|  |  |  |  |                             ErrLogInfo.WriteLog($"【新增关键事项通知提醒责任人邮箱提醒异常】邮箱:{user.Email};项目名称:{gItem.ProjectName},事项编号:{gItem.GJSXID};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}"); | 
					
						
							|  |  |  |  |                             continue; | 
					
						
							| 
									
										
										
										
											2025-09-20 16:45:17 +08:00
										 |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 关键事项申请关闭通知提醒提出人和跟踪人 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="gjsxId"></param> | 
					
						
							|  |  |  |  |         /// <param name="detail"></param> | 
					
						
							|  |  |  |  |         public static void GJSXApplyCloseNoticeSendEmail(string gjsxId, string detail) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             List<string> userIds = new List<string>(); | 
					
						
							|  |  |  |  |             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.GJSXID = '{gjsxId}'  ";
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             List<SqlParameter> listStr = new List<SqlParameter>(); | 
					
						
							|  |  |  |  |             SqlParameter[] parameter = listStr.ToArray(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter); | 
					
						
							|  |  |  |  |             // 使用LINQ将DataTable转换为List<GJSXItem> | 
					
						
							|  |  |  |  |             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(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             var gItem = lstOverdue.FirstOrDefault(); | 
					
						
							|  |  |  |  |             if (gItem != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 userIds.Add(gItem.UserID); | 
					
						
							|  |  |  |  |                 userIds.Add(gItem.User_ReceiveUserId); | 
					
						
							|  |  |  |  |                 foreach (var userId in userIds) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     var user = UserService.GetUserByUserId(userId); | 
					
						
							|  |  |  |  |                     if (!string.IsNullOrWhiteSpace(user.Email)) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         MailMessage mail = new MailMessage(); | 
					
						
							|  |  |  |  |                         //邮件主题 | 
					
						
							|  |  |  |  |                         mail.Subject = $"有新的事项申请关闭——{gItem.ProjectName}"; | 
					
						
							|  |  |  |  |                         mail.To.Add(user.Email); | 
					
						
							|  |  |  |  |                         //mail.To.Add("test@test.com"); | 
					
						
							|  |  |  |  |                         mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析 | 
					
						
							|  |  |  |  |                                                //邮件正文 | 
					
						
							|  |  |  |  |                         string bodyStr = $@"<html>
 | 
					
						
							|  |  |  |  | <head> | 
					
						
							|  |  |  |  | <style> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | </style> | 
					
						
							|  |  |  |  | </head> | 
					
						
							|  |  |  |  | <body> | 
					
						
							|  |  |  |  | <h2>事项申请关闭</h2> | 
					
						
							|  |  |  |  | <p>项目名称:{gItem.ProjectName}</p> | 
					
						
							|  |  |  |  | <p>事项编号:{gItem.GJSXID}</p> | 
					
						
							|  |  |  |  | <p>责任单位:{gItem.UnitName}</p> | 
					
						
							|  |  |  |  | <p>专业:{gItem.CNProfessionalName}</p> | 
					
						
							|  |  |  |  | <p>事项类别:{gItem.GJSXTypeName}</p> | 
					
						
							|  |  |  |  | <p>紧急程度:{gItem.QuestionTypeName}</p> | 
					
						
							|  |  |  |  | <p>事项描述:{gItem.Detail}</p> | 
					
						
							|  |  |  |  | <p>提出人:{gItem.UserName}</p> | 
					
						
							|  |  |  |  | <p>责任人:{gItem.User_AcceptanceUserName}</p> | 
					
						
							|  |  |  |  | <p>跟踪人:{gItem.User_ReceiveUserName}</p> | 
					
						
							|  |  |  |  | <p>抄送人:{gItem.User_CsUsers}</p> | 
					
						
							|  |  |  |  | <p>约定完成日期:{gItem.CompleteDate.ToShortDateString()}</p> | 
					
						
							|  |  |  |  | <p>申请关闭说明:{detail}</p> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <h2>智慧施工管理信息系统</h2> | 
					
						
							|  |  |  |  | <a href='https://zhgd.cwcec.com/'>请点击此处,进入智慧施工管理信息系统,查看事项详情</a> | 
					
						
							|  |  |  |  | <p>登录账号:{user.Account}</p> | 
					
						
							|  |  |  |  | <p>登录密码:CWCEC.+身份证号后四位(示例:CWCEC.1234)</p> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | </body> | 
					
						
							|  |  |  |  | </html>";
 | 
					
						
							|  |  |  |  |                         //< p > 登录密码:{ user.RawPassword}</ p > | 
					
						
							|  |  |  |  |                         mail.Body = bodyStr; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         try | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             bool send = PushEmail(mail); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         catch (Exception ex) | 
					
						
							|  |  |  |  |                         { | 
					
						
							| 
									
										
										
										
											2025-09-23 16:56:08 +08:00
										 |  |  |  |                             //ErrLogInfo.WriteLog($"关键事项申请关闭通知提醒责任人;项目名称:{gItem.ProjectName},事项编号:{gItem.GJSXID}", ex); | 
					
						
							|  |  |  |  |                             ErrLogInfo.WriteLog($"【申请关闭通知提醒责任人邮箱提醒异常】邮箱:{user.Email};项目名称:{gItem.ProjectName},事项编号:{gItem.GJSXID};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}"); | 
					
						
							|  |  |  |  |                             continue; | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 关键事项驳回申请关闭通知提醒责任人 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="gjsxId"></param> | 
					
						
							|  |  |  |  |         /// <param name="detail"></param> | 
					
						
							| 
									
										
										
										
											2025-09-22 20:42:24 +08:00
										 |  |  |  |         public static void GJSXDisallowApplyCloseNoticeSendEmail(string gjsxId, string detail) | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |         { | 
					
						
							|  |  |  |  |             List<string> userIds = new List<string>(); | 
					
						
							|  |  |  |  |             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.GJSXID = '{gjsxId}'  ";
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             List<SqlParameter> listStr = new List<SqlParameter>(); | 
					
						
							|  |  |  |  |             SqlParameter[] parameter = listStr.ToArray(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter); | 
					
						
							|  |  |  |  |             // 使用LINQ将DataTable转换为List<GJSXItem> | 
					
						
							|  |  |  |  |             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(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             var gItem = lstOverdue.FirstOrDefault(); | 
					
						
							|  |  |  |  |             if (gItem != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 userIds.Add(gItem.User_AcceptanceUserId); | 
					
						
							|  |  |  |  |                 foreach (var userId in userIds) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     var user = UserService.GetUserByUserId(userId); | 
					
						
							|  |  |  |  |                     if (!string.IsNullOrWhiteSpace(user.Email)) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         MailMessage mail = new MailMessage(); | 
					
						
							|  |  |  |  |                         //邮件主题 | 
					
						
							|  |  |  |  |                         mail.Subject = $"有事项申请关闭被驳回了——{gItem.ProjectName}"; | 
					
						
							|  |  |  |  |                         mail.To.Add(user.Email); | 
					
						
							|  |  |  |  |                         //mail.To.Add("test@test.com"); | 
					
						
							|  |  |  |  |                         mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析 | 
					
						
							|  |  |  |  |                                                //邮件正文 | 
					
						
							|  |  |  |  |                         string bodyStr = $@"<html>
 | 
					
						
							|  |  |  |  | <head> | 
					
						
							|  |  |  |  | <style> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | </style> | 
					
						
							|  |  |  |  | </head> | 
					
						
							|  |  |  |  | <body> | 
					
						
							|  |  |  |  | <h2>事项申请关闭被驳回</h2> | 
					
						
							|  |  |  |  | <p>项目名称:{gItem.ProjectName}</p> | 
					
						
							|  |  |  |  | <p>事项编号:{gItem.GJSXID}</p> | 
					
						
							|  |  |  |  | <p>责任单位:{gItem.UnitName}</p> | 
					
						
							|  |  |  |  | <p>专业:{gItem.CNProfessionalName}</p> | 
					
						
							|  |  |  |  | <p>事项类别:{gItem.GJSXTypeName}</p> | 
					
						
							|  |  |  |  | <p>紧急程度:{gItem.QuestionTypeName}</p> | 
					
						
							|  |  |  |  | <p>事项描述:{gItem.Detail}</p> | 
					
						
							|  |  |  |  | <p>提出人:{gItem.UserName}</p> | 
					
						
							|  |  |  |  | <p>责任人:{gItem.User_AcceptanceUserName}</p> | 
					
						
							|  |  |  |  | <p>跟踪人:{gItem.User_ReceiveUserName}</p> | 
					
						
							|  |  |  |  | <p>抄送人:{gItem.User_CsUsers}</p> | 
					
						
							|  |  |  |  | <p>约定完成日期:{gItem.CompleteDate.ToShortDateString()}</p> | 
					
						
							|  |  |  |  | <p>驳回申请关闭说明:{detail}</p> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <h2>智慧施工管理信息系统</h2> | 
					
						
							|  |  |  |  | <a href='https://zhgd.cwcec.com/'>请点击此处,进入智慧施工管理信息系统,查看事项详情</a> | 
					
						
							|  |  |  |  | <p>登录账号:{user.Account}</p> | 
					
						
							|  |  |  |  | <p>登录密码:CWCEC.+身份证号后四位(示例:CWCEC.1234)</p> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | </body> | 
					
						
							|  |  |  |  | </html>";
 | 
					
						
							|  |  |  |  |                         //< p > 登录密码:{ user.RawPassword}</ p > | 
					
						
							|  |  |  |  |                         mail.Body = bodyStr; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                         try | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             bool send = PushEmail(mail); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         catch (Exception ex) | 
					
						
							|  |  |  |  |                         { | 
					
						
							| 
									
										
										
										
											2025-09-23 16:56:08 +08:00
										 |  |  |  |                             //ErrLogInfo.WriteLog($"关键事项申请关闭驳回通知提醒责任人;项目名称:{gItem.ProjectName},事项编号:{gItem.GJSXID}", ex); | 
					
						
							|  |  |  |  |                             ErrLogInfo.WriteLog($"【驳回申请关闭通知提醒责任人邮箱提醒异常】邮箱:{user.Email};项目名称:{gItem.ProjectName},事项编号:{gItem.GJSXID};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}"); | 
					
						
							|  |  |  |  |                             continue; | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 关键事项超期预警定时提醒发送邮箱 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         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,'')  | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                                 from GJSX as a  | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                     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 | 
					
						
							| 
									
										
										
										
											2025-09-23 16:43:36 +08:00
										 |  |  |  |                                 where 1=1 and Base_Project.ProjectState=1 and a.state<>'0' and a.state<>'1' and (GETDATE()>a.CompleteDate or DATEDIFF(DAY, CompleteDate, isnull(CloseDate,getdate()))=-7 or DATEDIFF(DAY, CompleteDate, isnull(CloseDate,getdate()))=-6 or DATEDIFF(DAY, CompleteDate, isnull(CloseDate,getdate()))=-1 )   ";
 | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |                 List<SqlParameter> listStr = new List<SqlParameter>(); | 
					
						
							|  |  |  |  |                 SqlParameter[] parameter = listStr.ToArray(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 使用LINQ将DataTable转换为List<GJSXItem> | 
					
						
							|  |  |  |  |                 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(); | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-08 10:49:09 +08:00
										 |  |  |  |                 //userIds = userIds.Where(x => x.UserName == "张邦兴" || x.UserName == "申银行").ToList(); | 
					
						
							| 
									
										
										
										
											2025-10-23 10:35:47 +08:00
										 |  |  |  |                 //userIds = userIds.Where(x => x.UserName == "白金潮" || x.UserName == "申银行").ToList(); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                 if (userIds.Any() && lstOverdue.Any()) | 
					
						
							|  |  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  |                     //int allnum = 0; | 
					
						
							| 
									
										
										
										
											2025-03-15 16:23:28 +08:00
										 |  |  |  |                     var lstProject = lstOverdue.Select(x => new { x.ProjectId, x.ProjectName }).Distinct().ToList(); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                     foreach (var pro in lstProject) | 
					
						
							|  |  |  |  |                     { | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  |                         //if (allnum > 50) { break; } | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                         var lstProjectOverdue = lstOverdue.Where(x => x.ProjectId == pro.ProjectId).ToList(); | 
					
						
							|  |  |  |  |                         if (lstProjectOverdue.Any()) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             string projectName = pro.ProjectName; | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                             #region 事项预警提醒相关人员 | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                             foreach (var user in userIds) | 
					
						
							|  |  |  |  |                             { | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  |                                 //if (allnum > 100) { break; } | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                 MailMessage mail = new MailMessage(); | 
					
						
							|  |  |  |  |                                 //邮件主题 | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                 mail.Subject = $"关键事项预警提醒——{projectName}"; | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  |                                 mail.To.Add(user.Email); | 
					
						
							|  |  |  |  |                                 //mail.To.Add("test@test.com"); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                 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) | 
					
						
							|  |  |  |  |                                     { | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                                         tbodyStr.Append($"<tr><td>{index}</td><td>本人负责</td><td>{item.UnitName}</td><td>{item.GJSXID}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</td><td>{item.QuestionTypeName}</td><td>{item.UserName}</td><td>{item.User_AcceptanceUserName}</td><td>{item.CompleteDate.ToShortDateString()}</td><td>{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : item.DateDiffDays < -1 ? "还有一周就逾期了" : "半")}</td></tr>"); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                         index++; | 
					
						
							|  |  |  |  |                                     } | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 //发起人为本人 | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                                 var userItems = lstProjectOverdue.Where(x => x.UserID == user.UserId && x.DateDiffDays > -1).OrderByDescending(x => x.DateDiffDays).ToList(); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                 if (userItems.Any()) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     foreach (var item in userItems) | 
					
						
							|  |  |  |  |                                     { | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                         tbodyStr.Append($"<tr><td>{index}</td><td>本人发起</td><td>{item.UnitName}</td><td>{item.GJSXID}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</td><td>{item.QuestionTypeName}</td><td>{item.UserName}</td><td>{item.User_AcceptanceUserName}</td><td>{item.CompleteDate.ToShortDateString()}</td><td>{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}</td></tr>"); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                         index++; | 
					
						
							|  |  |  |  |                                     } | 
					
						
							|  |  |  |  |                                 } | 
					
						
							| 
									
										
										
										
											2025-03-15 16:23:28 +08:00
										 |  |  |  |                                 //跟踪人为本人--x.User_ReceiveUserId != null && x.User_ReceiveUserId != "" && | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                                 var receiveItems = lstProjectOverdue.Where(x => x.User_ReceiveUserId.Contains(user.UserId) && x.DateDiffDays > -1).OrderByDescending(x => x.DateDiffDays).ToList(); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                 if (receiveItems.Any()) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							|  |  |  |  |                                     foreach (var item in receiveItems) | 
					
						
							|  |  |  |  |                                     { | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                         tbodyStr.Append($"<tr><td>{index}</td><td>本人跟踪</td><td>{item.UnitName}</td><td>{item.GJSXID}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</td><td>{item.QuestionTypeName}</td><td>{item.UserName}</td><td>{item.User_AcceptanceUserName}</td><td>{item.CompleteDate.ToShortDateString()}</td><td>{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}</td></tr>"); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                         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) | 
					
						
							|  |  |  |  |                                     { | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                                         tbodyStr.Append($"<tr><td>{index}</td><td>抄送本人</td><td>{item.UnitName}</td><td>{item.GJSXID}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</td><td>{item.QuestionTypeName}</td><td>{item.UserName}</td><td>{item.User_AcceptanceUserName}</td><td>{item.CompleteDate.ToShortDateString()}</td><td>{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : item.DateDiffDays < -1 ? "还有一周就逾期了" : "半")}</td></tr>"); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                                         index++; | 
					
						
							|  |  |  |  |                                     } | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 //邮件正文 | 
					
						
							|  |  |  |  |                                 string bodyStr = @"<html>
 | 
					
						
							|  |  |  |  | <head> | 
					
						
							|  |  |  |  | <style> | 
					
						
							|  |  |  |  |     table { | 
					
						
							|  |  |  |  |         border-collapse: collapse; | 
					
						
							|  |  |  |  |         width: 100%; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     th, td { | 
					
						
							|  |  |  |  |         border: 1px solid black; | 
					
						
							|  |  |  |  |         padding: 8px; | 
					
						
							|  |  |  |  |         text-align: left; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | </style> | 
					
						
							|  |  |  |  | </head> | 
					
						
							|  |  |  |  | <body> | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  | <h2>关键事项预警提醒</h2> | 
					
						
							| 
									
										
										
										
											2025-03-13 15:06:04 +08:00
										 |  |  |  | <a href='https://zhgd.cwcec.com/'>请点击此处,查看详细信息,并及时处置关闭</a> | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  | <table> | 
					
						
							|  |  |  |  | <thead> | 
					
						
							|  |  |  |  |     <tr> | 
					
						
							|  |  |  |  |         <th>序号</th> | 
					
						
							|  |  |  |  |         <th>类型</th> | 
					
						
							|  |  |  |  |         <th>责任单位</th> | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |         <th>事项编号</th> | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |         <th>事项描述</th> | 
					
						
							|  |  |  |  |         <th>事项类别</th> | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |         <th>紧急程度</th> | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |         <th>发起人</th> | 
					
						
							|  |  |  |  |         <th>责任人</th> | 
					
						
							|  |  |  |  |         <th>约定完成时间</th> | 
					
						
							|  |  |  |  |         <th>超期时间(天)</th> | 
					
						
							|  |  |  |  |     </tr> | 
					
						
							|  |  |  |  | </thead> | 
					
						
							|  |  |  |  | <tbody>" + tbodyStr.ToString() + "</tbody></table></body></html>";
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 mail.Body = bodyStr; | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  |                                 if (index > 1) | 
					
						
							| 
									
										
										
										
											2025-04-02 16:30:42 +08:00
										 |  |  |  |                                 { | 
					
						
							| 
									
										
										
										
											2025-09-23 16:56:08 +08:00
										 |  |  |  |                                     try | 
					
						
							|  |  |  |  |                                     { | 
					
						
							|  |  |  |  |                                         //allnum++; | 
					
						
							|  |  |  |  |                                         bool send = PushEmail(mail); | 
					
						
							|  |  |  |  |                                         //Thread.Sleep(1000); //暂停1秒 | 
					
						
							|  |  |  |  |                                     } | 
					
						
							|  |  |  |  |                                     catch (Exception ex) | 
					
						
							|  |  |  |  |                                     { | 
					
						
							|  |  |  |  |                                         ErrLogInfo.WriteLog($"【邮箱提醒异常】邮箱:{user.Email};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}"); | 
					
						
							|  |  |  |  |                                         continue; | 
					
						
							|  |  |  |  |                                     } | 
					
						
							| 
									
										
										
										
											2025-04-02 16:30:42 +08:00
										 |  |  |  |                                 } | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                             } | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |                             #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                             #region 事项逾期提醒项目主管和项目经理 | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-21 09:53:14 +08:00
										 |  |  |  |                             var projectSupervisors = ProjectUserService.GetProjectUserByRoleId(pro.ProjectId,Const.ProjectSupervisor); | 
					
						
							|  |  |  |  |                             var projectManagers = ProjectUserService.GetProjectUserByRoleId(pro.ProjectId, Const.ProjectManager); | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |                             List<string> remindUserIds = new List<string>(); | 
					
						
							|  |  |  |  |                             List<string> projectSupervisorIds = projectSupervisors.Select(x => x.UserId).ToList(); | 
					
						
							|  |  |  |  |                             List<string> projectManagerIds = projectManagers.Select(x => x.UserId).ToList(); | 
					
						
							|  |  |  |  |                             if (projectSupervisorIds.Any()) { remindUserIds.AddRange(projectSupervisorIds); } | 
					
						
							|  |  |  |  |                             if (projectManagerIds.Any()) { remindUserIds.AddRange(projectManagerIds); } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             var remindUsers = userIds.Where(x => remindUserIds.Contains(x.UserId)); | 
					
						
							|  |  |  |  |                             foreach (var user in remindUsers) | 
					
						
							|  |  |  |  |                             { | 
					
						
							|  |  |  |  |                                 MailMessage mail = new MailMessage(); | 
					
						
							|  |  |  |  |                                 //邮件主题 | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                 mail.Subject = $"关键事项逾期提醒——{projectName}"; | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |                                 mail.To.Add(user.Email); | 
					
						
							|  |  |  |  |                                 //mail.To.Add("test@test.com"); | 
					
						
							|  |  |  |  |                                 mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 StringBuilder tbodyStr = new StringBuilder(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 int index = 0; | 
					
						
							|  |  |  |  |                                 if (projectManagerIds.Contains(user.UserId)) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                     index = 0; | 
					
						
							|  |  |  |  |                                     //超期当日提醒项目经理 | 
					
						
							| 
									
										
										
										
											2025-09-22 20:39:23 +08:00
										 |  |  |  |                                     var lstProjectOverdue1 = lstProjectOverdue.Where(x => x.DateDiffDays == 0 || x.DateDiffDays == -1).ToList(); | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                     //超期一周的重要、紧急事项提醒项目经理 | 
					
						
							|  |  |  |  |                                     var lstProjectOverdue7 = lstProjectOverdue.Where(x => x.DateDiffDays >= 7 && x.QuestionTypeName != "一般").ToList(); | 
					
						
							|  |  |  |  |                                     lstProjectOverdue1.AddRange(lstProjectOverdue7); | 
					
						
							|  |  |  |  |                                     foreach (var item in lstProjectOverdue1) | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |                                     { | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                         if (!item.User_CsUserIds.Contains(user.UserId)) | 
					
						
							|  |  |  |  |                                         { | 
					
						
							|  |  |  |  |                                             index++; | 
					
						
							|  |  |  |  |                                             tbodyStr.Append($"<tr><td>{index}</td><td>事项逾期</td><td>{item.UnitName}</td><td>{item.GJSXID}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</td><td>{item.QuestionTypeName}</td><td>{item.UserName}</td><td>{item.User_AcceptanceUserName}</td><td>{item.CompleteDate.ToShortDateString()}</td><td>{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}</td></tr>"); | 
					
						
							|  |  |  |  |                                         } | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |                                     } | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 if (projectSupervisorIds.Contains(user.UserId) && !projectManagerIds.Contains(user.UserId)) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                     //超期两周的重要、紧急事项提醒项目主管 | 
					
						
							|  |  |  |  |                                     var lstProjectOverdue14 = lstProjectOverdue.Where(x => x.DateDiffDays >= 13).ToList(); | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |                                     index = 0; | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                     foreach (var item in lstProjectOverdue14) | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |                                     { | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |                                         if (!item.User_CsUserIds.Contains(user.UserId)) | 
					
						
							|  |  |  |  |                                         { | 
					
						
							|  |  |  |  |                                             index++; | 
					
						
							|  |  |  |  |                                             tbodyStr.Append($"<tr><td>{index}</td><td>事项逾期</td><td>{item.UnitName}</td><td>{item.GJSXID}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</td><td>{item.QuestionTypeName}</td><td>{item.UserName}</td><td>{item.User_AcceptanceUserName}</td><td>{item.CompleteDate.ToShortDateString()}</td><td>{(item.DateDiffDays > 0 ? item.DateDiffDays.ToString() : "半")}</td></tr>"); | 
					
						
							|  |  |  |  |                                         } | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |                                     } | 
					
						
							|  |  |  |  |                                 } | 
					
						
							|  |  |  |  |                                 //邮件正文 | 
					
						
							|  |  |  |  |                                 string bodyStr = @"<html>
 | 
					
						
							|  |  |  |  | <head> | 
					
						
							|  |  |  |  | <style> | 
					
						
							|  |  |  |  |     table { | 
					
						
							|  |  |  |  |         border-collapse: collapse; | 
					
						
							|  |  |  |  |         width: 100%; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     th, td { | 
					
						
							|  |  |  |  |         border: 1px solid black; | 
					
						
							|  |  |  |  |         padding: 8px; | 
					
						
							|  |  |  |  |         text-align: left; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | </style> | 
					
						
							|  |  |  |  | </head> | 
					
						
							|  |  |  |  | <body> | 
					
						
							|  |  |  |  | <h2>关键事项超期预警提醒</h2> | 
					
						
							|  |  |  |  | <a href='https://zhgd.cwcec.com/'>请点击此处,查看详细信息,并及时处置关闭</a> | 
					
						
							|  |  |  |  | <table> | 
					
						
							|  |  |  |  | <thead> | 
					
						
							|  |  |  |  |     <tr> | 
					
						
							|  |  |  |  |         <th>序号</th> | 
					
						
							|  |  |  |  |         <th>类型</th> | 
					
						
							|  |  |  |  |         <th>责任单位</th> | 
					
						
							|  |  |  |  |         <th>事项编号</th> | 
					
						
							|  |  |  |  |         <th>事项描述</th> | 
					
						
							|  |  |  |  |         <th>事项类别</th> | 
					
						
							| 
									
										
										
										
											2025-09-21 11:11:50 +08:00
										 |  |  |  |         <th>紧急程度</th> | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |         <th>发起人</th> | 
					
						
							|  |  |  |  |         <th>责任人</th> | 
					
						
							|  |  |  |  |         <th>约定完成时间</th> | 
					
						
							|  |  |  |  |         <th>超期时间(天)</th> | 
					
						
							|  |  |  |  |     </tr> | 
					
						
							|  |  |  |  | </thead> | 
					
						
							|  |  |  |  | <tbody>" + tbodyStr.ToString() + "</tbody></table></body></html>";
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                                 mail.Body = bodyStr; | 
					
						
							|  |  |  |  |                                 if (index > 1) | 
					
						
							|  |  |  |  |                                 { | 
					
						
							| 
									
										
										
										
											2025-09-23 16:56:08 +08:00
										 |  |  |  |                                     try | 
					
						
							|  |  |  |  |                                     { | 
					
						
							|  |  |  |  |                                         //allnum++; | 
					
						
							|  |  |  |  |                                         bool send = PushEmail(mail); | 
					
						
							|  |  |  |  |                                         //Thread.Sleep(1000); //暂停1秒 | 
					
						
							|  |  |  |  |                                     } | 
					
						
							|  |  |  |  |                                     catch (Exception ex) | 
					
						
							|  |  |  |  |                                     { | 
					
						
							|  |  |  |  |                                         ErrLogInfo.WriteLog($"【邮箱提醒异常】邮箱:{user.Email};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}"); | 
					
						
							|  |  |  |  |                                         continue; | 
					
						
							|  |  |  |  |                                     } | 
					
						
							| 
									
										
										
										
											2025-09-16 19:27:36 +08:00
										 |  |  |  |                                 } | 
					
						
							|  |  |  |  |                             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             #endregion | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 #endregion | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             catch (Exception ex) | 
					
						
							|  |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-04-02 14:48:38 +08:00
										 |  |  |  |                 ErrLogInfo.WriteLog("关键事项邮件预警", ex); | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 发送邮件 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         /// <param name="mail"></param> | 
					
						
							| 
									
										
										
										
											2025-04-01 10:51:20 +08:00
										 |  |  |  |         private static bool PushEmail(MailMessage mail) | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  |             //await Task.Delay(1000); //等待1000毫秒 | 
					
						
							| 
									
										
										
										
											2025-04-02 16:18:06 +08:00
										 |  |  |  |             // 忽略SSL证书验证 | 
					
						
							|  |  |  |  |             ServicePointManager.ServerCertificateValidationCallback = | 
					
						
							|  |  |  |  |                 delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     return true; | 
					
						
							|  |  |  |  |                 }; | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |             //获取发送邮箱配置 | 
					
						
							|  |  |  |  |             Email_Pop pops = BLL.Email_PopService.GetEmail_Pop("7EC5E991-B7A0-495A-90ED-2BE15370C959"); | 
					
						
							|  |  |  |  |             if (pops != null) | 
					
						
							|  |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-04-01 10:51:20 +08:00
										 |  |  |  |                 mail.From = new MailAddress(pops.EmailYx);//发件人邮箱地址 | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                 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);//替换为你的邮箱和服务授权码 | 
					
						
							| 
									
										
										
										
											2025-04-02 17:59:57 +08:00
										 |  |  |  |                 client.Timeout = 6000;//6秒超时 | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                 try | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     client.Send(mail); | 
					
						
							| 
									
										
										
										
											2025-04-02 14:48:38 +08:00
										 |  |  |  |                     client.Dispose();//释放资源 | 
					
						
							| 
									
										
										
										
											2025-04-01 10:51:20 +08:00
										 |  |  |  |                     return true; | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                     //Console.WriteLine("Email sent successfully."); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 catch (Exception ex) | 
					
						
							|  |  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2025-07-14 15:04:34 +08:00
										 |  |  |  |                     ErrLogInfo.WriteLog(mail.Subject, ex); | 
					
						
							| 
									
										
										
										
											2025-04-01 10:51:20 +08:00
										 |  |  |  |                     return false; | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |                     //Console.WriteLine("Email sending failed: " + ex.Message); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-04-01 10:51:20 +08:00
										 |  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2025-03-13 10:52:32 +08:00
										 |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |