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
{
2026-04-23 11:36:49 +08:00
//
2025-07-14 15:04:34 +08:00
/// <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}" ;
}
2025-11-19 20:02:57 +08:00
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 ;
}
2025-09-20 16:45:17 +08:00
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}" ;
2025-11-19 20:02:57 +08:00
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 ;
}
2025-09-22 20:39:23 +08:00
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}" ;
2025-11-19 20:02:57 +08:00
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 ;
}
2025-09-22 20:39:23 +08:00
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 ( )
{
2025-11-19 20:02:57 +08:00
//try
//{
Model . SGGLDB db = Funs . DB ;
//取未关闭且已经超期的数据
2025-03-13 10:52:32 +08:00
2025-11-19 20:02:57 +08:00
string strSql = @"select
2025-03-13 10:52:32 +08:00
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
2025-11-19 20:02:57 +08:00
List < SqlParameter > listStr = new List < SqlParameter > ( ) ;
SqlParameter [ ] parameter = listStr . ToArray ( ) ;
2025-03-13 10:52:32 +08:00
2025-11-19 20:02:57 +08:00
DataTable table = SQLHelper . GetDataTableRunText ( strSql , parameter ) ;
2025-03-13 10:52:32 +08:00
2025-11-19 20:02:57 +08:00
// 使用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 )
2025-03-13 10:52:32 +08:00
{
2025-11-19 20:02:57 +08:00
//if (allnum > 50) { break; }
var lstProjectOverdue = lstOverdue . Where ( x = > x . ProjectId = = pro . ProjectId ) . ToList ( ) ;
if ( lstProjectOverdue . Any ( ) )
2025-03-13 10:52:32 +08:00
{
2025-11-19 20:02:57 +08:00
string projectName = pro . ProjectName ;
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +08:00
#region 事 项 预 警 提 醒 相 关 人 员
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +08:00
foreach ( var user in userIds )
{
//if (allnum > 100) { break; }
MailMessage mail = new MailMessage ( ) ;
//邮件主题
mail . Subject = $"关键事项预警提醒——{projectName}" ;
try
2025-03-13 10:52:32 +08:00
{
2025-04-02 17:59:57 +08:00
mail . To . Add ( user . Email ) ;
//mail.To.Add("test@test.com");
2025-11-19 20:02:57 +08:00
}
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解析
2025-03-13 10:52:32 +08:00
2025-11-19 20:02:57 +08:00
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 )
2025-03-13 10:52:32 +08:00
{
2025-11-19 20:02:57 +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>" ) ;
index + + ;
2025-03-13 10:52:32 +08:00
}
2025-11-19 20:02:57 +08:00
}
//发起人为本人
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 )
2025-03-13 10:52:32 +08:00
{
2025-11-19 20:02:57 +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>" ) ;
index + + ;
2025-03-13 10:52:32 +08:00
}
2025-11-19 20:02:57 +08:00
}
//跟踪人为本人--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 )
2025-03-13 10:52:32 +08:00
{
2025-11-19 20:02:57 +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>" ) ;
index + + ;
2025-03-13 10:52:32 +08:00
}
2025-11-19 20:02:57 +08:00
}
//抄送人为本人
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 )
2025-03-13 10:52:32 +08:00
{
2025-11-19 20:02:57 +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>" ) ;
index + + ;
2025-03-13 10:52:32 +08:00
}
2025-11-19 20:02:57 +08:00
}
//邮件正文
string bodyStr = @"<html>
2025-03-13 10:52:32 +08:00
<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>" ;
2025-11-19 20:02:57 +08:00
mail . Body = bodyStr ;
if ( index > 1 )
{
try
2025-04-02 16:30:42 +08:00
{
2025-11-19 20:02:57 +08:00
//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-11-19 20:02:57 +08:00
}
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +08:00
#endregion
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +08:00
#region 事 项 逾 期 提 醒 项 目 主 管 和 项 目 经 理
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +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
2025-11-19 20:02:57 +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 ) ; }
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +08:00
var remindUsers = userIds . Where ( x = > remindUserIds . Contains ( x . UserId ) ) ;
foreach ( var user in remindUsers )
{
MailMessage mail = new MailMessage ( ) ;
//邮件主题
mail . Subject = $"关键事项逾期提醒——{projectName}" ;
try
2025-09-16 19:27:36 +08:00
{
mail . To . Add ( user . Email ) ;
//mail.To.Add("test@test.com");
2025-11-19 20:02:57 +08:00
}
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解析
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +08:00
StringBuilder tbodyStr = new StringBuilder ( ) ;
2025-09-16 19:27:36 +08:00
2025-11-19 20:02:57 +08:00
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 )
2025-09-16 19:27:36 +08:00
{
2025-11-19 20:02:57 +08:00
if ( ! string . IsNullOrWhiteSpace ( item . User_CsUserIds ) & & ! item . User_CsUserIds . Contains ( user . UserId ) )
2025-09-16 19:27:36 +08:00
{
2025-11-19 20:02:57 +08:00
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
}
}
2025-11-19 20:02:57 +08:00
}
if ( projectSupervisorIds . Contains ( user . UserId ) & & ! 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 )
2025-09-16 19:27:36 +08:00
{
2025-11-19 20:02:57 +08:00
if ( ! string . IsNullOrWhiteSpace ( item . User_CsUserIds ) & & ! item . User_CsUserIds . Contains ( user . UserId ) )
2025-09-16 19:27:36 +08:00
{
2025-11-19 20:02:57 +08:00
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
}
}
2025-11-19 20:02:57 +08:00
}
//邮件正文
string bodyStr = @"<html>
2025-09-16 19:27:36 +08:00
<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>" ;
2025-11-19 20:02:57 +08:00
mail . Body = bodyStr ;
if ( index > 1 )
{
try
2025-09-16 19:27:36 +08:00
{
2025-11-19 20:02:57 +08:00
//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
}
}
2025-03-13 10:52:32 +08:00
}
2025-11-19 20:02:57 +08:00
#endregion
2025-03-13 10:52:32 +08:00
}
}
2025-11-19 20:02:57 +08:00
}
2025-03-13 10:52:32 +08:00
2025-11-19 20:02:57 +08:00
#endregion
2025-03-13 10:52:32 +08:00
2025-11-19 20:02:57 +08:00
//}
//catch (Exception ex)
//{
// 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
}
}
}