邮件发送失败问题处理
This commit is contained in:
parent
3d78e0bbe5
commit
b889ca30ac
|
|
@ -109,8 +109,16 @@ namespace BLL
|
|||
{
|
||||
mail.Subject = $"有新的关键事项抄送你了——{gItem.ProjectName}";
|
||||
}
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
try
|
||||
{
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrLogInfo.WriteLog($"【邮箱提醒异常】{user.UserName}邮箱:{user.Email};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}");
|
||||
continue;
|
||||
}
|
||||
mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析
|
||||
//邮件正文
|
||||
string bodyStr = $@"<html>
|
||||
|
|
@ -235,8 +243,16 @@ namespace BLL
|
|||
MailMessage mail = new MailMessage();
|
||||
//邮件主题
|
||||
mail.Subject = $"有新的事项申请关闭——{gItem.ProjectName}";
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
try
|
||||
{
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrLogInfo.WriteLog($"【邮箱提醒异常】{user.UserName}邮箱:{user.Email};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}");
|
||||
continue;
|
||||
}
|
||||
mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析
|
||||
//邮件正文
|
||||
string bodyStr = $@"<html>
|
||||
|
|
@ -361,8 +377,16 @@ namespace BLL
|
|||
MailMessage mail = new MailMessage();
|
||||
//邮件主题
|
||||
mail.Subject = $"有事项申请关闭被驳回了——{gItem.ProjectName}";
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
try
|
||||
{
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrLogInfo.WriteLog($"【邮箱提醒异常】{user.UserName}邮箱:{user.Email};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}");
|
||||
continue;
|
||||
}
|
||||
mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析
|
||||
//邮件正文
|
||||
string bodyStr = $@"<html>
|
||||
|
|
@ -418,12 +442,12 @@ namespace BLL
|
|||
/// </summary>
|
||||
public static void OverdueWarningSendEmail()
|
||||
{
|
||||
try
|
||||
{
|
||||
Model.SGGLDB db = Funs.DB;
|
||||
//取未关闭且已经超期的数据
|
||||
//try
|
||||
//{
|
||||
Model.SGGLDB db = Funs.DB;
|
||||
//取未关闭且已经超期的数据
|
||||
|
||||
string strSql = @"select
|
||||
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
|
||||
|
|
@ -447,112 +471,121 @@ namespace BLL
|
|||
left join[dbo].[Base_Unit] on a.UnitId = Base_Unit.UnitId
|
||||
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 ) ";
|
||||
|
||||
List<SqlParameter> listStr = new List<SqlParameter>();
|
||||
SqlParameter[] parameter = listStr.ToArray();
|
||||
List<SqlParameter> listStr = new List<SqlParameter>();
|
||||
SqlParameter[] parameter = listStr.ToArray();
|
||||
|
||||
DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter);
|
||||
DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter);
|
||||
|
||||
// 使用LINQ将DataTable转换为List<GJSXItem>
|
||||
var lstOverdue = table.AsEnumerable().Select(row => new GJSXItem
|
||||
// 使用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();
|
||||
|
||||
//userIds = userIds.Where(x => x.UserName == "张小松" || x.UserName == "詹佩佩").ToList();
|
||||
//userIds = userIds.Where(x => x.UserName == "申银行").ToList();
|
||||
if (userIds.Any() && lstOverdue.Any())
|
||||
{
|
||||
//int allnum = 0;
|
||||
var lstProject = lstOverdue.Select(x => new { x.ProjectId, x.ProjectName }).Distinct().ToList();
|
||||
foreach (var pro in lstProject)
|
||||
{
|
||||
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();
|
||||
|
||||
//userIds = userIds.Where(x => x.UserName == "申银行").ToList();
|
||||
if (userIds.Any() && lstOverdue.Any())
|
||||
{
|
||||
//int allnum = 0;
|
||||
var lstProject = lstOverdue.Select(x => new { x.ProjectId, x.ProjectName }).Distinct().ToList();
|
||||
foreach (var pro in lstProject)
|
||||
//if (allnum > 50) { break; }
|
||||
var lstProjectOverdue = lstOverdue.Where(x => x.ProjectId == pro.ProjectId).ToList();
|
||||
if (lstProjectOverdue.Any())
|
||||
{
|
||||
//if (allnum > 50) { break; }
|
||||
var lstProjectOverdue = lstOverdue.Where(x => x.ProjectId == pro.ProjectId).ToList();
|
||||
if (lstProjectOverdue.Any())
|
||||
string projectName = pro.ProjectName;
|
||||
|
||||
#region 事项预警提醒相关人员
|
||||
|
||||
foreach (var user in userIds)
|
||||
{
|
||||
string projectName = pro.ProjectName;
|
||||
|
||||
#region 事项预警提醒相关人员
|
||||
|
||||
foreach (var user in userIds)
|
||||
//if (allnum > 100) { break; }
|
||||
MailMessage mail = new MailMessage();
|
||||
//邮件主题
|
||||
mail.Subject = $"关键事项预警提醒——{projectName}";
|
||||
try
|
||||
{
|
||||
//if (allnum > 100) { break; }
|
||||
MailMessage mail = new MailMessage();
|
||||
//邮件主题
|
||||
mail.Subject = $"关键事项预警提醒——{projectName}";
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrLogInfo.WriteLog($"【邮箱提醒异常】{user.UserName}邮箱:{user.Email};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}");
|
||||
continue;
|
||||
}
|
||||
mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析
|
||||
|
||||
StringBuilder tbodyStr = new StringBuilder();
|
||||
int index = 1;
|
||||
//责任人为本人
|
||||
var acceptanceItems = lstProjectOverdue.Where(x => !string.IsNullOrWhiteSpace(x.User_AcceptanceUserId) && x.User_AcceptanceUserId.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (acceptanceItems.Any())
|
||||
StringBuilder tbodyStr = new StringBuilder();
|
||||
int index = 1;
|
||||
//责任人为本人
|
||||
var acceptanceItems = lstProjectOverdue.Where(x => !string.IsNullOrWhiteSpace(x.User_AcceptanceUserId) && x.User_AcceptanceUserId.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (acceptanceItems.Any())
|
||||
{
|
||||
foreach (var item in acceptanceItems)
|
||||
{
|
||||
foreach (var item in acceptanceItems)
|
||||
{
|
||||
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>");
|
||||
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() : item.DateDiffDays < -1 ? "还有一周就逾期了" : "半")}</td></tr>");
|
||||
index++;
|
||||
}
|
||||
//发起人为本人
|
||||
var userItems = lstProjectOverdue.Where(x => x.UserID == user.UserId && x.DateDiffDays > -1).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (userItems.Any())
|
||||
}
|
||||
//发起人为本人
|
||||
var userItems = lstProjectOverdue.Where(x => x.UserID == user.UserId && x.DateDiffDays > -1).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (userItems.Any())
|
||||
{
|
||||
foreach (var item in userItems)
|
||||
{
|
||||
foreach (var item in userItems)
|
||||
{
|
||||
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>");
|
||||
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>");
|
||||
index++;
|
||||
}
|
||||
//跟踪人为本人--x.User_ReceiveUserId != null && x.User_ReceiveUserId != "" &&
|
||||
var receiveItems = lstProjectOverdue.Where(x => !string.IsNullOrWhiteSpace(x.User_ReceiveUserId) && x.User_ReceiveUserId.Contains(user.UserId) && x.DateDiffDays > -1).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (receiveItems.Any())
|
||||
}
|
||||
//跟踪人为本人--x.User_ReceiveUserId != null && x.User_ReceiveUserId != "" &&
|
||||
var receiveItems = lstProjectOverdue.Where(x => !string.IsNullOrWhiteSpace(x.User_ReceiveUserId) && x.User_ReceiveUserId.Contains(user.UserId) && x.DateDiffDays > -1).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (receiveItems.Any())
|
||||
{
|
||||
foreach (var item in receiveItems)
|
||||
{
|
||||
foreach (var item in receiveItems)
|
||||
{
|
||||
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>");
|
||||
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>");
|
||||
index++;
|
||||
}
|
||||
//抄送人为本人
|
||||
var csUserItems = lstProjectOverdue.Where(x =>!string.IsNullOrWhiteSpace(x.User_CsUserIds)&& x.User_CsUserIds.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (csUserItems.Any())
|
||||
}
|
||||
//抄送人为本人
|
||||
var csUserItems = lstProjectOverdue.Where(x => !string.IsNullOrWhiteSpace(x.User_CsUserIds) && x.User_CsUserIds.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList();
|
||||
if (csUserItems.Any())
|
||||
{
|
||||
foreach (var item in csUserItems)
|
||||
{
|
||||
foreach (var item in csUserItems)
|
||||
{
|
||||
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>");
|
||||
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() : item.DateDiffDays < -1 ? "还有一周就逾期了" : "半")}</td></tr>");
|
||||
index++;
|
||||
}
|
||||
//邮件正文
|
||||
string bodyStr = @"<html>
|
||||
}
|
||||
//邮件正文
|
||||
string bodyStr = @"<html>
|
||||
<head>
|
||||
<style>
|
||||
table {
|
||||
|
|
@ -587,82 +620,91 @@ namespace BLL
|
|||
</thead>
|
||||
<tbody>" + tbodyStr.ToString() + "</tbody></table></body></html>";
|
||||
|
||||
mail.Body = bodyStr;
|
||||
if (index > 1)
|
||||
mail.Body = bodyStr;
|
||||
if (index > 1)
|
||||
{
|
||||
try
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 事项逾期提醒项目主管和项目经理
|
||||
|
||||
var projectSupervisors = ProjectUserService.GetProjectUserByRoleId(pro.ProjectId, Const.ProjectSupervisor);
|
||||
var projectManagers = ProjectUserService.GetProjectUserByRoleId(pro.ProjectId, Const.ProjectManager);
|
||||
|
||||
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();
|
||||
//邮件主题
|
||||
mail.Subject = $"关键事项逾期提醒——{projectName}";
|
||||
try
|
||||
{
|
||||
mail.To.Add(user.Email);
|
||||
//mail.To.Add("test@test.com");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrLogInfo.WriteLog($"【邮箱提醒异常】{user.UserName}邮箱:{user.Email};时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")};异常信息:{ex.Message}");
|
||||
continue;
|
||||
}
|
||||
mail.IsBodyHtml = true;//确保邮件正文被当作HTML解析
|
||||
|
||||
StringBuilder tbodyStr = new StringBuilder();
|
||||
|
||||
int index = 0;
|
||||
if (projectManagerIds.Contains(user.UserId))
|
||||
{
|
||||
index = 0;
|
||||
//超期当日提醒项目经理
|
||||
var lstProjectOverdue1 = lstProjectOverdue.Where(x => x.DateDiffDays == 0 || x.DateDiffDays == -1).ToList();
|
||||
//超期一周的重要、紧急事项提醒项目经理
|
||||
var lstProjectOverdue7 = lstProjectOverdue.Where(x => x.DateDiffDays >= 7 && x.QuestionTypeName != "一般").ToList();
|
||||
lstProjectOverdue1.AddRange(lstProjectOverdue7);
|
||||
foreach (var item in lstProjectOverdue1)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(item.User_CsUserIds) && !item.User_CsUserIds.Contains(user.UserId))
|
||||
{
|
||||
//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;
|
||||
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>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 事项逾期提醒项目主管和项目经理
|
||||
|
||||
var projectSupervisors = ProjectUserService.GetProjectUserByRoleId(pro.ProjectId,Const.ProjectSupervisor);
|
||||
var projectManagers = ProjectUserService.GetProjectUserByRoleId(pro.ProjectId, Const.ProjectManager);
|
||||
|
||||
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)
|
||||
if (projectSupervisorIds.Contains(user.UserId) && !projectManagerIds.Contains(user.UserId))
|
||||
{
|
||||
MailMessage mail = new MailMessage();
|
||||
//邮件主题
|
||||
mail.Subject = $"关键事项逾期提醒——{projectName}";
|
||||
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))
|
||||
//超期两周的紧急事项提醒项目主管
|
||||
var lstProjectOverdue14 = lstProjectOverdue.Where(x => x.DateDiffDays >= 13 && x.QuestionTypeName == "紧急").ToList();
|
||||
//var lstProjectOverdue14 = lstProjectOverdue.Where(x => x.DateDiffDays >= 13).ToList();
|
||||
index = 0;
|
||||
foreach (var item in lstProjectOverdue14)
|
||||
{
|
||||
index = 0;
|
||||
//超期当日提醒项目经理
|
||||
var lstProjectOverdue1 = lstProjectOverdue.Where(x => x.DateDiffDays == 0 || x.DateDiffDays == -1).ToList();
|
||||
//超期一周的重要、紧急事项提醒项目经理
|
||||
var lstProjectOverdue7 = lstProjectOverdue.Where(x => x.DateDiffDays >= 7 && x.QuestionTypeName != "一般").ToList();
|
||||
lstProjectOverdue1.AddRange(lstProjectOverdue7);
|
||||
foreach (var item in lstProjectOverdue1)
|
||||
if (!string.IsNullOrWhiteSpace(item.User_CsUserIds) && !item.User_CsUserIds.Contains(user.UserId))
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(item.User_CsUserIds) && !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>");
|
||||
}
|
||||
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>");
|
||||
}
|
||||
}
|
||||
if (projectSupervisorIds.Contains(user.UserId) && !projectManagerIds.Contains(user.UserId))
|
||||
{
|
||||
//超期两周的重要、紧急事项提醒项目主管
|
||||
var lstProjectOverdue14 = lstProjectOverdue.Where(x => x.DateDiffDays >= 13).ToList();
|
||||
index = 0;
|
||||
foreach (var item in lstProjectOverdue14)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(item.User_CsUserIds) && !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>");
|
||||
}
|
||||
}
|
||||
}
|
||||
//邮件正文
|
||||
string bodyStr = @"<html>
|
||||
}
|
||||
//邮件正文
|
||||
string bodyStr = @"<html>
|
||||
<head>
|
||||
<style>
|
||||
table {
|
||||
|
|
@ -697,35 +739,35 @@ namespace BLL
|
|||
</thead>
|
||||
<tbody>" + tbodyStr.ToString() + "</tbody></table></body></html>";
|
||||
|
||||
mail.Body = bodyStr;
|
||||
if (index > 1)
|
||||
mail.Body = bodyStr;
|
||||
if (index > 1)
|
||||
{
|
||||
try
|
||||
{
|
||||
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;
|
||||
}
|
||||
//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;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrLogInfo.WriteLog("关键事项邮件预警", ex);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
//}
|
||||
//catch (Exception ex)
|
||||
//{
|
||||
// ErrLogInfo.WriteLog("关键事项邮件预警", ex);
|
||||
//}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -6,7 +6,7 @@
|
|||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<_PublishTargetUrl>G:\发布\五环WebApi</_PublishTargetUrl>
|
||||
<History>True|2025-11-17T06:41:29.0529618Z||;True|2025-11-17T12:28:22.9224307+08:00||;True|2025-11-17T11:17:50.1481769+08:00||;True|2025-11-07T14:46:56.1446809+08:00||;True|2025-11-05T09:32:06.4998794+08:00||;True|2025-11-04T16:39:28.2175670+08:00||;True|2025-11-04T16:39:02.3610432+08:00||;True|2025-11-04T15:44:06.1295264+08:00||;True|2025-10-31T16:41:11.6570385+08:00||;True|2025-10-30T15:58:05.2014433+08:00||;True|2025-10-29T16:22:27.7866967+08:00||;True|2025-10-29T11:19:32.1187038+08:00||;True|2025-10-24T15:59:19.4176668+08:00||;True|2025-10-23T10:17:32.2384443+08:00||;True|2025-10-23T10:09:35.0601937+08:00||;True|2025-10-23T09:59:27.2018799+08:00||;True|2025-09-29T15:39:36.8617347+08:00||;True|2025-09-29T11:28:10.9193152+08:00||;True|2025-09-29T10:59:58.2893583+08:00||;True|2025-09-23T16:56:39.6344263+08:00||;True|2025-09-23T16:44:57.4175593+08:00||;True|2025-09-23T16:44:35.0478492+08:00||;True|2025-09-23T16:06:50.5843534+08:00||;True|2025-09-22T20:54:35.9805610+08:00||;True|2025-09-22T20:45:58.7044128+08:00||;True|2025-09-22T20:40:46.7449595+08:00||;True|2025-09-22T15:14:22.9602725+08:00||;True|2025-09-22T15:08:27.5989706+08:00||;True|2025-09-22T14:54:19.5237685+08:00||;True|2025-09-18T09:53:17.9300539+08:00||;True|2025-09-16T19:11:12.4383069+08:00||;True|2025-09-02T11:14:00.9580707+08:00||;True|2025-09-02T10:52:20.0445598+08:00||;True|2025-08-29T17:56:01.6245615+08:00||;True|2025-08-29T17:55:41.2802685+08:00||;True|2025-08-09T21:27:40.2103961+08:00||;True|2025-08-06T15:31:52.1166645+08:00||;True|2025-08-04T18:56:13.9675910+08:00||;True|2025-07-23T11:12:18.0134770+08:00||;True|2025-07-23T10:36:09.9990536+08:00||;True|2025-07-23T10:35:51.8814789+08:00||;True|2025-07-21T17:46:45.4620710+08:00||;True|2025-07-21T17:40:43.9871097+08:00||;True|2025-07-21T17:29:11.9275869+08:00||;True|2025-07-21T17:05:21.7763763+08:00||;True|2025-07-18T17:55:59.4892329+08:00||;True|2025-07-18T11:08:56.2628896+08:00||;True|2025-07-18T10:53:44.2534260+08:00||;True|2025-07-18T10:27:52.6751668+08:00||;True|2025-07-18T10:03:09.1785776+08:00||;True|2025-07-18T10:02:38.1252107+08:00||;True|2025-07-17T18:19:07.5837609+08:00||;True|2025-07-17T15:40:11.9126705+08:00||;True|2025-07-11T17:54:03.0298703+08:00||;True|2025-07-11T16:19:50.3283029+08:00||;True|2025-07-11T15:49:22.5920473+08:00||;True|2025-07-02T14:39:27.0436873+08:00||;True|2025-07-02T11:18:29.1208369+08:00||;True|2025-07-01T15:52:16.6767496+08:00||;True|2025-07-01T10:14:59.0471052+08:00||;True|2025-06-28T11:40:36.0544739+08:00||;True|2025-06-27T15:10:24.4628086+08:00||;True|2025-06-27T10:31:14.8332810+08:00||;True|2025-06-27T10:13:13.3022394+08:00||;True|2025-06-26T23:51:04.1304509+08:00||;True|2025-06-26T23:34:06.4223762+08:00||;True|2025-06-26T22:42:08.9018138+08:00||;True|2025-06-26T22:16:01.8954571+08:00||;True|2025-06-26T21:19:42.2638204+08:00||;True|2025-06-25T23:22:39.7267591+08:00||;True|2025-06-25T23:19:33.2378458+08:00||;True|2025-06-25T22:18:16.2863303+08:00||;True|2025-06-25T22:10:29.2540175+08:00||;True|2025-06-25T22:00:58.5212166+08:00||;True|2025-06-25T22:00:31.2531214+08:00||;True|2025-06-25T18:33:01.5770030+08:00||;True|2025-06-25T17:47:33.7779622+08:00||;True|2025-06-25T17:40:26.9905954+08:00||;True|2025-06-20T11:24:58.4099232+08:00||;True|2025-06-19T16:42:45.2358810+08:00||;True|2025-06-16T19:28:10.6447738+08:00||;True|2025-06-12T11:00:02.3559090+08:00||;True|2025-06-12T10:40:29.0324520+08:00||;True|2025-06-04T23:24:01.0324973+08:00||;True|2025-06-04T18:39:41.7304136+08:00||;True|2025-06-04T11:23:17.3803405+08:00||;True|2025-06-04T11:04:32.4212196+08:00||;True|2025-05-26T19:19:09.7246357+08:00||;True|2025-05-26T19:16:39.1283077+08:00||;True|2025-05-26T19:09:24.1561616+08:00||;True|2025-04-07T16:11:44.5172315+08:00||;True|2025-04-02T18:10:22.8695984+08:00||;True|2025-04-02T17:59:51.2978116+08:00||;True|2025-04-02T17:50:55.8630437+08:00||;True|2025-04-02T17:49:22.5114405+08:00||;True|2025-04-02T17:47:11.0650205+08:00||;True|2025-04-02T17:39:09.8576853+08:00||;True|2025-04-02T17:38:15.3079030+08:00||;True|2025-04-02T17:22:03.6735964+08:00||;True|2025-04-02T17:19:04.4220913+08:00||;</History>
|
||||
<History>True|2025-11-19T11:50:54.0090859Z||;True|2025-11-19T19:29:28.5861506+08:00||;True|2025-11-19T19:14:02.6887533+08:00||;True|2025-11-19T19:08:28.7856694+08:00||;True|2025-11-17T14:41:29.0529618+08:00||;True|2025-11-17T12:28:22.9224307+08:00||;True|2025-11-17T11:17:50.1481769+08:00||;True|2025-11-07T14:46:56.1446809+08:00||;True|2025-11-05T09:32:06.4998794+08:00||;True|2025-11-04T16:39:28.2175670+08:00||;True|2025-11-04T16:39:02.3610432+08:00||;True|2025-11-04T15:44:06.1295264+08:00||;True|2025-10-31T16:41:11.6570385+08:00||;True|2025-10-30T15:58:05.2014433+08:00||;True|2025-10-29T16:22:27.7866967+08:00||;True|2025-10-29T11:19:32.1187038+08:00||;True|2025-10-24T15:59:19.4176668+08:00||;True|2025-10-23T10:17:32.2384443+08:00||;True|2025-10-23T10:09:35.0601937+08:00||;True|2025-10-23T09:59:27.2018799+08:00||;True|2025-09-29T15:39:36.8617347+08:00||;True|2025-09-29T11:28:10.9193152+08:00||;True|2025-09-29T10:59:58.2893583+08:00||;True|2025-09-23T16:56:39.6344263+08:00||;True|2025-09-23T16:44:57.4175593+08:00||;True|2025-09-23T16:44:35.0478492+08:00||;True|2025-09-23T16:06:50.5843534+08:00||;True|2025-09-22T20:54:35.9805610+08:00||;True|2025-09-22T20:45:58.7044128+08:00||;True|2025-09-22T20:40:46.7449595+08:00||;True|2025-09-22T15:14:22.9602725+08:00||;True|2025-09-22T15:08:27.5989706+08:00||;True|2025-09-22T14:54:19.5237685+08:00||;True|2025-09-18T09:53:17.9300539+08:00||;True|2025-09-16T19:11:12.4383069+08:00||;True|2025-09-02T11:14:00.9580707+08:00||;True|2025-09-02T10:52:20.0445598+08:00||;True|2025-08-29T17:56:01.6245615+08:00||;True|2025-08-29T17:55:41.2802685+08:00||;True|2025-08-09T21:27:40.2103961+08:00||;True|2025-08-06T15:31:52.1166645+08:00||;True|2025-08-04T18:56:13.9675910+08:00||;True|2025-07-23T11:12:18.0134770+08:00||;True|2025-07-23T10:36:09.9990536+08:00||;True|2025-07-23T10:35:51.8814789+08:00||;True|2025-07-21T17:46:45.4620710+08:00||;True|2025-07-21T17:40:43.9871097+08:00||;True|2025-07-21T17:29:11.9275869+08:00||;True|2025-07-21T17:05:21.7763763+08:00||;True|2025-07-18T17:55:59.4892329+08:00||;True|2025-07-18T11:08:56.2628896+08:00||;True|2025-07-18T10:53:44.2534260+08:00||;True|2025-07-18T10:27:52.6751668+08:00||;True|2025-07-18T10:03:09.1785776+08:00||;True|2025-07-18T10:02:38.1252107+08:00||;True|2025-07-17T18:19:07.5837609+08:00||;True|2025-07-17T15:40:11.9126705+08:00||;True|2025-07-11T17:54:03.0298703+08:00||;True|2025-07-11T16:19:50.3283029+08:00||;True|2025-07-11T15:49:22.5920473+08:00||;True|2025-07-02T14:39:27.0436873+08:00||;True|2025-07-02T11:18:29.1208369+08:00||;True|2025-07-01T15:52:16.6767496+08:00||;True|2025-07-01T10:14:59.0471052+08:00||;True|2025-06-28T11:40:36.0544739+08:00||;True|2025-06-27T15:10:24.4628086+08:00||;True|2025-06-27T10:31:14.8332810+08:00||;True|2025-06-27T10:13:13.3022394+08:00||;True|2025-06-26T23:51:04.1304509+08:00||;True|2025-06-26T23:34:06.4223762+08:00||;True|2025-06-26T22:42:08.9018138+08:00||;True|2025-06-26T22:16:01.8954571+08:00||;True|2025-06-26T21:19:42.2638204+08:00||;True|2025-06-25T23:22:39.7267591+08:00||;True|2025-06-25T23:19:33.2378458+08:00||;True|2025-06-25T22:18:16.2863303+08:00||;True|2025-06-25T22:10:29.2540175+08:00||;True|2025-06-25T22:00:58.5212166+08:00||;True|2025-06-25T22:00:31.2531214+08:00||;True|2025-06-25T18:33:01.5770030+08:00||;True|2025-06-25T17:47:33.7779622+08:00||;True|2025-06-25T17:40:26.9905954+08:00||;True|2025-06-20T11:24:58.4099232+08:00||;True|2025-06-19T16:42:45.2358810+08:00||;True|2025-06-16T19:28:10.6447738+08:00||;True|2025-06-12T11:00:02.3559090+08:00||;True|2025-06-12T10:40:29.0324520+08:00||;True|2025-06-04T23:24:01.0324973+08:00||;True|2025-06-04T18:39:41.7304136+08:00||;True|2025-06-04T11:23:17.3803405+08:00||;True|2025-06-04T11:04:32.4212196+08:00||;True|2025-05-26T19:19:09.7246357+08:00||;True|2025-05-26T19:16:39.1283077+08:00||;True|2025-05-26T19:09:24.1561616+08:00||;True|2025-04-07T16:11:44.5172315+08:00||;True|2025-04-02T18:10:22.8695984+08:00||;True|2025-04-02T17:59:51.2978116+08:00||;True|2025-04-02T17:50:55.8630437+08:00||;True|2025-04-02T17:49:22.5114405+08:00||;True|2025-04-02T17:47:11.0650205+08:00||;</History>
|
||||
<LastFailureDetails />
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
|
|
@ -86,22 +86,22 @@
|
|||
<publishTime>10/28/2024 14:02:50</publishTime>
|
||||
</File>
|
||||
<File Include="bin/App_global.asax.compiled">
|
||||
<publishTime>11/17/2025 14:41:27</publishTime>
|
||||
<publishTime>11/19/2025 19:50:52</publishTime>
|
||||
</File>
|
||||
<File Include="bin/App_global.asax.dll">
|
||||
<publishTime>11/17/2025 14:41:27</publishTime>
|
||||
<publishTime>11/19/2025 19:50:52</publishTime>
|
||||
</File>
|
||||
<File Include="bin/Aspose.Words.dll">
|
||||
<publishTime>12/06/2024 20:13:58</publishTime>
|
||||
</File>
|
||||
<File Include="bin/BLL.dll">
|
||||
<publishTime>11/17/2025 14:41:05</publishTime>
|
||||
<publishTime>11/19/2025 19:50:42</publishTime>
|
||||
</File>
|
||||
<File Include="bin/BLL.dll.config">
|
||||
<publishTime>12/26/2024 09:46:52</publishTime>
|
||||
</File>
|
||||
<File Include="bin/BLL.pdb">
|
||||
<publishTime>11/17/2025 14:41:05</publishTime>
|
||||
<publishTime>11/19/2025 19:50:42</publishTime>
|
||||
</File>
|
||||
<File Include="bin/BouncyCastle.Crypto.dll">
|
||||
<publishTime>12/18/2020 05:32:28</publishTime>
|
||||
|
|
@ -389,13 +389,13 @@
|
|||
<publishTime>02/09/2013 00:42:28</publishTime>
|
||||
</File>
|
||||
<File Include="bin/WebAPI.dll">
|
||||
<publishTime>11/17/2025 14:41:08</publishTime>
|
||||
<publishTime>11/19/2025 19:50:43</publishTime>
|
||||
</File>
|
||||
<File Include="bin/WebAPI.pdb">
|
||||
<publishTime>11/17/2025 14:41:08</publishTime>
|
||||
<publishTime>11/19/2025 19:50:43</publishTime>
|
||||
</File>
|
||||
<File Include="bin/WebAPI.xml">
|
||||
<publishTime>11/17/2025 14:41:08</publishTime>
|
||||
<publishTime>11/19/2025 19:50:43</publishTime>
|
||||
</File>
|
||||
<File Include="bin/WebGrease.dll">
|
||||
<publishTime>01/23/2014 21:57:34</publishTime>
|
||||
|
|
@ -479,7 +479,7 @@
|
|||
<publishTime>10/28/2024 14:02:50</publishTime>
|
||||
</File>
|
||||
<File Include="PrecompiledApp.config">
|
||||
<publishTime>11/17/2025 14:41:10</publishTime>
|
||||
<publishTime>11/19/2025 19:50:44</publishTime>
|
||||
</File>
|
||||
<File Include="Scripts/bootstrap.js">
|
||||
<publishTime>10/28/2024 14:02:50</publishTime>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>
|
||||
<LastActiveSolutionConfig>Release|Any CPU</LastActiveSolutionConfig>
|
||||
<UseIISExpress>true</UseIISExpress>
|
||||
<Use64BitIISExpress />
|
||||
<IISExpressSSLPort />
|
||||
|
|
|
|||
Loading…
Reference in New Issue