关键事项新增时补充即时通知责任人功能
This commit is contained in:
parent
a0f84b2c88
commit
91416aed38
|
@ -14,13 +14,131 @@ using System.Net.Security;
|
|||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using Quartz.Util;
|
||||
|
||||
|
||||
namespace BLL
|
||||
{
|
||||
public static class GJSXMonitorService
|
||||
{
|
||||
public static Model.SGGLDB db = Funs.DB;
|
||||
//public static Model.SGGLDB db = Funs.DB;
|
||||
|
||||
/// <summary>
|
||||
/// 关键事项通知提醒责任人
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="gjsxId"></param>
|
||||
public static void GJSXNoticeSendEmail(string userId, string gjsxId)
|
||||
{
|
||||
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();
|
||||
var user = UserService.GetUserByUserId(userId);
|
||||
if (gItem != null && !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>
|
||||
|
||||
<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)
|
||||
{
|
||||
ErrLogInfo.WriteLog($"关键事项通知提醒责任人;项目名称:{gItem.ProjectName},事项编号:{gItem.GJSXID}", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 关键事项超期预警定时提醒发送邮箱
|
||||
|
@ -179,7 +297,7 @@ namespace BLL
|
|||
<th>序号</th>
|
||||
<th>类型</th>
|
||||
<th>责任单位</th>
|
||||
<th>事项ID</th>
|
||||
<th>事项编号</th>
|
||||
<th>事项描述</th>
|
||||
<th>事项类别</th>
|
||||
<th>发起人</th>
|
||||
|
@ -245,7 +363,7 @@ namespace BLL
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrLogInfo.WriteLog("关键事项发送邮件预警", ex);
|
||||
ErrLogInfo.WriteLog(mail.Subject, ex);
|
||||
return false;
|
||||
//Console.WriteLine("Email sending failed: " + ex.Message);
|
||||
}
|
||||
|
|
|
@ -374,6 +374,37 @@ namespace BLL
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据用户Id判断用户是否有维护邮箱
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public static bool IsUserHaveEmail(string userId)
|
||||
{
|
||||
bool result = false;
|
||||
if (!string.IsNullOrWhiteSpace(userId))
|
||||
{
|
||||
var userEmail = (from x in Funs.DB.Sys_User where x.UserId == userId select x.Email).FirstOrDefault();
|
||||
result = !string.IsNullOrWhiteSpace(userEmail);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据用户Id获取用户邮箱
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetUserEmailByUserId(string userId)
|
||||
{
|
||||
string result = string.Empty;
|
||||
Model.Sys_User user = Funs.DB.Sys_User.FirstOrDefault(e => e.UserId == userId);
|
||||
if (user != null)
|
||||
{
|
||||
result = user.Email;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取有邮箱的用户
|
||||
/// </summary>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -25,22 +25,18 @@
|
|||
<f:Form ID="Form_edit" ShowBorder="false" ShowHeader="false" AutoScroll="true"
|
||||
BodyPadding="10px" runat="server" RedStarPosition="BeforeText" LabelAlign="Right">
|
||||
<Rows>
|
||||
<f:FormRow>
|
||||
<f:FormRow Hidden="true">
|
||||
<Items>
|
||||
<f:TextBox ID="txtGJSXID" runat="server" Label="编号" Hidden="true" MaxLength="20" LabelWidth="110px">
|
||||
</f:TextBox>
|
||||
<f:DropDownList ID="DropUnitId" runat="server" Label="责任单位" AutoPostBack="true" OnSelectedIndexChanged="DropUnitId_SelectedIndexChanged" MaxLength="50" LabelWidth="110px">
|
||||
</f:DropDownList>
|
||||
<f:DropDownList ID="DropCNProfessional_ID" runat="server" Label="专业" MaxLength="50" LabelWidth="110px" EnableCheckBoxSelect="true" EnableMultiSelect="true">
|
||||
</f:DropDownList>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
<f:FormRow>
|
||||
<Items>
|
||||
<f:TextBox ID="txtUserID" runat="server" Label="提出人" MaxLength="20" Readonly="true" AutoPostBack="true" OnTextChanged="TextBox_TextChanged" LabelWidth="110px">
|
||||
</f:TextBox>
|
||||
<f:DatePicker ID="Date_CreateDate" runat="server" Label="提出日期" Readonly="true" LabelWidth="110px">
|
||||
</f:DatePicker>
|
||||
<f:DropDownList ID="DropUnitId" runat="server" Label="责任单位" AutoPostBack="true" OnSelectedIndexChanged="DropUnitId_SelectedIndexChanged" MaxLength="50" LabelWidth="110px" Required="true" ShowRedStar="true">
|
||||
</f:DropDownList>
|
||||
<f:DropDownList ID="DropCNProfessional_ID" runat="server" Label="专业" MaxLength="50" LabelWidth="110px" EnableCheckBoxSelect="true" EnableMultiSelect="true">
|
||||
</f:DropDownList>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
<f:FormRow>
|
||||
|
@ -56,12 +52,28 @@
|
|||
<f:DropDownList ID="DropUser_Acceptance" runat="server" Label="责任人" EmptyText="支持模糊匹配" AutoSelectFirstItem="false" Required="true" ShowRedStar="true" MaxLength="50" LabelWidth="110px"
|
||||
EnableCheckBoxSelect="true" EnableEdit="true">
|
||||
</f:DropDownList>
|
||||
<f:DatePicker ID="Date_CompleteDate" runat="server" Label="要求完成日期" MinDate="<%# DateTime.Now.AddDays(1) %>" ShowRedStar="true" LabelWidth="110px">
|
||||
</f:DatePicker>
|
||||
<f:RadioButtonList ID="rblNotice" runat="server" Label="即时邮件通知" LabelWidth="110px" Width="320px" AutoColumnWidth="true">
|
||||
<f:RadioItem Value="1" Text="是" Selected="true" />
|
||||
<f:RadioItem Value="0" Text="否" />
|
||||
</f:RadioButtonList>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
<f:FormRow>
|
||||
<Items>
|
||||
<f:DropDownList ID="DropUser_ReceiveID" runat="server" Label="跟踪人" EmptyText="支持模糊匹配" AutoSelectFirstItem="false" MaxLength="50" LabelWidth="110px"
|
||||
EnableCheckBoxSelect="true" EnableEdit="true"
|
||||
OnSelectedIndexChanged="DropUser_ReceiveID_TextChanged" AutoPostBack="true">
|
||||
</f:DropDownList>
|
||||
<f:DatePicker ID="Date_CompleteDate" runat="server" Label="要求完成日期" MinDate="<%# DateTime.Now.AddDays(1) %>" ShowRedStar="true" LabelWidth="110px">
|
||||
</f:DatePicker>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
<f:FormRow>
|
||||
<Items>
|
||||
<f:TextBox ID="txtUserID" runat="server" Label="提出人" MaxLength="20" Readonly="true" AutoPostBack="true" OnTextChanged="TextBox_TextChanged" LabelWidth="110px">
|
||||
</f:TextBox>
|
||||
<f:DatePicker ID="Date_CreateDate" runat="server" Label="提出日期" Readonly="true" LabelWidth="110px">
|
||||
</f:DatePicker>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
<f:FormRow>
|
||||
|
|
|
@ -705,6 +705,8 @@ namespace FineUIPro.Web.PZHGL.GJSX
|
|||
/// <param name="e"></param>
|
||||
protected void btnsubmit_Click(object sender, EventArgs e)
|
||||
{
|
||||
#region 数据验证
|
||||
|
||||
if (this.DropUnitId.SelectedValue == Const._Null)
|
||||
{
|
||||
Alert.ShowInParent("请选择单位!", MessageBoxIcon.Warning);
|
||||
|
@ -725,7 +727,8 @@ namespace FineUIPro.Web.PZHGL.GJSX
|
|||
Alert.ShowInParent("事项类别!", MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
if (this.DropUser_Acceptance.SelectedValue == null || this.DropUser_Acceptance.SelectedValue == Const._Null)
|
||||
var DropUser_AcceptanceId = this.DropUser_Acceptance.SelectedValue;
|
||||
if (DropUser_AcceptanceId == null || DropUser_AcceptanceId == Const._Null)
|
||||
{
|
||||
Alert.ShowInParent("请选择责任人!", MessageBoxIcon.Warning);
|
||||
return;
|
||||
|
@ -741,12 +744,18 @@ namespace FineUIPro.Web.PZHGL.GJSX
|
|||
return;
|
||||
}
|
||||
|
||||
////勾选邮件即时通知责任人,先判断责任人是否已维护邮箱
|
||||
//if (this.Date_CompleteDate.Text == "")
|
||||
//{
|
||||
// Alert.ShowInParent("请选择要求完成日期!", MessageBoxIcon.Warning);
|
||||
// return;
|
||||
//}
|
||||
string rNotice = this.rblNotice.SelectedValue;
|
||||
//勾选邮件即时通知责任人,先判断责任人是否已维护邮箱
|
||||
if (rNotice == "1")
|
||||
{
|
||||
if (!BLL.UserService.IsUserHaveEmail(DropUser_AcceptanceId))
|
||||
{
|
||||
Alert.ShowInParent("请先给责任人维护邮箱!", MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
string EditType = Request.Params["EditType"];
|
||||
|
||||
|
@ -754,6 +763,14 @@ namespace FineUIPro.Web.PZHGL.GJSX
|
|||
if (string.IsNullOrEmpty(ID))
|
||||
{
|
||||
save("2");
|
||||
//勾选邮件即时通知责任人,邮箱通知提醒关键事项
|
||||
if (rNotice == "1")
|
||||
{
|
||||
if (BLL.UserService.IsUserHaveEmail(DropUser_AcceptanceId))
|
||||
{
|
||||
GJSXMonitorService.GJSXNoticeSendEmail(DropUser_AcceptanceId, this.txtGJSXID.Text.Trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -86,24 +86,6 @@ namespace FineUIPro.Web.PZHGL.GJSX
|
|||
/// </remarks>
|
||||
protected global::FineUIPro.DropDownList DropCNProfessional_ID;
|
||||
|
||||
/// <summary>
|
||||
/// txtUserID 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.TextBox txtUserID;
|
||||
|
||||
/// <summary>
|
||||
/// Date_CreateDate 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.DatePicker Date_CreateDate;
|
||||
|
||||
/// <summary>
|
||||
/// DropQuestionTypeID 控件。
|
||||
/// </summary>
|
||||
|
@ -132,13 +114,13 @@ namespace FineUIPro.Web.PZHGL.GJSX
|
|||
protected global::FineUIPro.DropDownList DropUser_Acceptance;
|
||||
|
||||
/// <summary>
|
||||
/// Date_CompleteDate 控件。
|
||||
/// rblNotice 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.DatePicker Date_CompleteDate;
|
||||
protected global::FineUIPro.RadioButtonList rblNotice;
|
||||
|
||||
/// <summary>
|
||||
/// DropUser_ReceiveID 控件。
|
||||
|
@ -149,6 +131,33 @@ namespace FineUIPro.Web.PZHGL.GJSX
|
|||
/// </remarks>
|
||||
protected global::FineUIPro.DropDownList DropUser_ReceiveID;
|
||||
|
||||
/// <summary>
|
||||
/// Date_CompleteDate 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.DatePicker Date_CompleteDate;
|
||||
|
||||
/// <summary>
|
||||
/// txtUserID 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.TextBox txtUserID;
|
||||
|
||||
/// <summary>
|
||||
/// Date_CreateDate 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.DatePicker Date_CreateDate;
|
||||
|
||||
/// <summary>
|
||||
/// drpCsUsers 控件。
|
||||
/// </summary>
|
||||
|
|
Loading…
Reference in New Issue