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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace BLL
|
|
|
|
|
{
|
|
|
|
|
public static class GJSXMonitorService
|
|
|
|
|
{
|
|
|
|
|
public static Model.SGGLDB db = Funs.DB;
|
|
|
|
|
|
|
|
|
|
/// <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,'')
|
|
|
|
|
from GJSX as a
|
|
|
|
|
left join Sys_User as b on a.UserId = b.UserId
|
|
|
|
|
left join[dbo].[Base_Project] on a.ProjectId = Base_Project.ProjectId
|
|
|
|
|
left join[dbo].[Base_Unit] on a.UnitId = Base_Unit.UnitId
|
|
|
|
|
where 1=1 and a.state<>'0' and GETDATE()>a.CompleteDate ";
|
|
|
|
|
|
|
|
|
|
List<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();
|
|
|
|
|
if (userIds.Any() && lstOverdue.Any())
|
|
|
|
|
{
|
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)
|
|
|
|
|
{
|
|
|
|
|
var lstProjectOverdue = lstOverdue.Where(x => x.ProjectId == pro.ProjectId).ToList();
|
|
|
|
|
if (lstProjectOverdue.Any())
|
|
|
|
|
{
|
|
|
|
|
string projectName = pro.ProjectName;
|
|
|
|
|
foreach (var user in userIds)
|
|
|
|
|
{
|
|
|
|
|
MailMessage mail = new MailMessage();
|
|
|
|
|
//邮件主题
|
|
|
|
|
mail.Subject = $"关键事项超期预警提醒——{projectName}";
|
2025-03-31 18:43:58 +08:00
|
|
|
|
//mail.To.Add(user.Email);
|
|
|
|
|
mail.To.Add("1784803958@qq.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-03-22 18:57:34 +08:00
|
|
|
|
tbodyStr.Append($"<tr><td>{index}</td><td>本人负责</td><td>{item.UnitName}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</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 userItems = lstProjectOverdue.Where(x => x.UserID == user.UserId).OrderByDescending(x => x.DateDiffDays).ToList();
|
|
|
|
|
if (userItems.Any())
|
|
|
|
|
{
|
|
|
|
|
foreach (var item in userItems)
|
|
|
|
|
{
|
2025-03-22 18:57:34 +08:00
|
|
|
|
tbodyStr.Append($"<tr><td>{index}</td><td>本人发起</td><td>{item.UnitName}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</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-03-13 10:52:32 +08:00
|
|
|
|
var receiveItems = lstProjectOverdue.Where(x => x.User_ReceiveUserId.Contains(user.UserId)).OrderByDescending(x => x.DateDiffDays).ToList();
|
|
|
|
|
if (receiveItems.Any())
|
|
|
|
|
{
|
|
|
|
|
foreach (var item in receiveItems)
|
|
|
|
|
{
|
2025-03-22 18:57:34 +08:00
|
|
|
|
tbodyStr.Append($"<tr><td>{index}</td><td>本人跟踪</td><td>{item.UnitName}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</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-03-22 18:57:34 +08:00
|
|
|
|
tbodyStr.Append($"<tr><td>{index}</td><td>抄送本人</td><td>{item.UnitName}</td><td>{item.Detail}</td><td>{item.GJSXTypeName}</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++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//邮件正文
|
|
|
|
|
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>
|
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>
|
|
|
|
|
<th>事项描述</th>
|
|
|
|
|
<th>事项类别</th>
|
|
|
|
|
<th>发起人</th>
|
|
|
|
|
<th>责任人</th>
|
|
|
|
|
<th>约定完成时间</th>
|
|
|
|
|
<th>超期时间(天)</th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>" + tbodyStr.ToString() + "</tbody></table></body></html>";
|
|
|
|
|
|
|
|
|
|
mail.Body = bodyStr;
|
|
|
|
|
|
|
|
|
|
PushEmail(mail);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 发送邮件
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="mail"></param>
|
|
|
|
|
private static void PushEmail(MailMessage mail)
|
|
|
|
|
{
|
|
|
|
|
//获取发送邮箱配置
|
|
|
|
|
Email_Pop pops = BLL.Email_PopService.GetEmail_Pop("7EC5E991-B7A0-495A-90ED-2BE15370C959");
|
|
|
|
|
if (pops != null)
|
|
|
|
|
{
|
|
|
|
|
SmtpClient client = new SmtpClient(pops.EmailFwq);//替换为你的SMTP服务器地址
|
|
|
|
|
client.Port = int.Parse(pops.EmailDk);//587或465如果使用SSL
|
|
|
|
|
client.EnableSsl = true;//如果服务器支持SSL,设置为true
|
|
|
|
|
client.DeliveryMethod = SmtpDeliveryMethod.Network;
|
|
|
|
|
client.UseDefaultCredentials = false;
|
|
|
|
|
client.Credentials = new NetworkCredential(pops.EmailYx, pops.EmailPass);//替换为你的邮箱和服务授权码
|
|
|
|
|
mail.From = new MailAddress(pops.EmailYx);//发件人邮箱地址
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
client.Send(mail);
|
|
|
|
|
//Console.WriteLine("Email sent successfully.");
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
//Console.WriteLine("Email sending failed: " + ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|