diff --git a/Sub/Console_SendMail/DataBaseManager.cs b/Sub/Console_SendMail/DataBaseManager.cs index 769216f..d06035d 100644 --- a/Sub/Console_SendMail/DataBaseManager.cs +++ b/Sub/Console_SendMail/DataBaseManager.cs @@ -88,6 +88,25 @@ namespace Console_SendMail } } + + public static string GetUserEmail(string gcode, string uid) + { + if (string.IsNullOrEmpty(gcode) || string.IsNullOrEmpty(uid)) return string.Empty; + var slq = "select isnull(email,'') from vGroupUser" + + $" where gcode = '{gcode}'" + + $" and id = '{uid}'"; + try + { + return ExecuteScalar(slq); + } + catch + { + return string.Empty; + } + + } + + public static string GetUserTel(string gcode, string uid) { var slq = "select isnull(tel,'') from vGroupUser" + diff --git a/Sub/Console_SendMail/Program.cs b/Sub/Console_SendMail/Program.cs index d034a57..4b88751 100644 --- a/Sub/Console_SendMail/Program.cs +++ b/Sub/Console_SendMail/Program.cs @@ -13,6 +13,7 @@ namespace Console_SendMail static DateTime ChkMakeAutoTime = DateTime.Now.AddDays(-1); static DateTime ChkSendMailTime = DateTime.Now.AddDays(-1); static DateTime ChkMakeSchDayWeekTime = DateTime.Now.AddDays(-1); + static DateTime ChkMakePrjUpdateWeekTime = DateTime.Now.AddDays(-1); static DateTime ChkMakeSchDay = DateTime.Now.AddDays(-1); static DateTime ChkNoSchedule = DateTime.Now.AddDays(-1); static DateTime ChkJobreportDay = DateTime.Now.AddDays(-1); @@ -66,12 +67,12 @@ namespace Console_SendMail static void Main(string[] args) { - Console.WriteLine("mail start"); + Console.WriteLine($"mail start ver 2508051140"); while (true) { - - //메일대기내역전송 - var tsSendMail = DateTime.Now - ChkSendMailTime; + + //메일대기내역전송 + var tsSendMail = DateTime.Now - ChkSendMailTime; if (tsSendMail.TotalMilliseconds > 1000) { try { SendMail(); } @@ -86,6 +87,16 @@ namespace Console_SendMail try { MakeAutoMail(); } catch { } finally { ChkMakeAutoTime = DateTime.Now; } + } + + //프로젝트업데이트알림 + var tsPrjUpdateweek = DateTime.Now - ChkMakePrjUpdateWeekTime; + if (tsPrjUpdateweek.TotalMinutes > 30 && DateTime.Now.DayOfWeek == DayOfWeek.Monday && DateTime.Now.Hour >= 10 && DateTime.Now.Hour <= 18) + { + + try { Mail_MakeUpdateRequireProject(); } + catch { } + finally { ChkMakePrjUpdateWeekTime = DateTime.Now; } } ///스케쥴 기한 알림(주) @@ -98,6 +109,7 @@ namespace Console_SendMail finally { ChkMakeSchDayWeekTime = DateTime.Now; } } + ///스케쥴 기한 알림(일) var tsScheDay = DateTime.Now - ChkMakeSchDay; if (tsScheDay.TotalMinutes > 30 && DateTime.Now.DayOfWeek != DayOfWeek.Saturday && diff --git a/Sub/Console_SendMail/Properties/AssemblyInfo.cs b/Sub/Console_SendMail/Properties/AssemblyInfo.cs index 7e2cedb..144eaf4 100644 --- a/Sub/Console_SendMail/Properties/AssemblyInfo.cs +++ b/Sub/Console_SendMail/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 // 기본값으로 할 수 있습니다. // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("25.06.16.1530")] -[assembly: AssemblyFileVersion("25.06.16.1530")] +[assembly: AssemblyVersion("25.08.05.1130")] +[assembly: AssemblyFileVersion("25.08.05.1130")] diff --git a/Sub/Console_SendMail/_MailService.cs b/Sub/Console_SendMail/_MailService.cs index bfaaced..9f729b9 100644 --- a/Sub/Console_SendMail/_MailService.cs +++ b/Sub/Console_SendMail/_MailService.cs @@ -4,6 +4,8 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; using System.Linq; using System.Text; @@ -210,7 +212,7 @@ namespace Console_SendMail newdr.cc = string.Empty; newdr.pdate = DateTime.Now.ToShortDateString(); newdr.body = string.Join("
", NoMailList.ToList()); - newdr.wuid = "dev"; + newdr.wuid = "dev"; newdr.wdate = DateTime.Now; if (System.Diagnostics.Debugger.IsAttached) { @@ -403,7 +405,7 @@ namespace Console_SendMail newdr.cc = MailSort(mail_cc, MailForm.exceptmailcc); newdr.pdate = DateTime.Now.ToShortDateString(); newdr.body = mail_body.Replace("{내용}", vmail_body); - newdr.wuid = "dev"; + newdr.wuid = "dev"; newdr.wdate = DateTime.Now; if (System.Diagnostics.Debugger.IsAttached) { @@ -433,7 +435,7 @@ namespace Console_SendMail taJobReportDateList.Dispose(); } - public static void Mail_NoSchedule() + public static void Mail_NoSchedule() { var taForm = new DSMailTableAdapters.MailFormTableAdapter(); var taMailData = new DSMailTableAdapters.MailDataTableAdapter(); @@ -779,6 +781,7 @@ namespace Console_SendMail taMailPrjSche.Dispose(); } + /// /// 스케쥴기한임박알림(주) /// @@ -823,8 +826,8 @@ namespace Console_SendMail if (Existweek) return; //대상 사용자 목록을 추출한다 - var users = new DSMail.vMailingProjectScheduleDataTable(); - taMailPrjSche.Fill(users, vGcode); + var datas = new DSMail.vMailingProjectScheduleDataTable(); + taMailPrjSche.Fill(datas, vGcode); //var users = db.vMailingProjectSchedule.ToList();// .vJobReportForUser.Where(t => t.gcode == Pub.vGcode).GroupBy(t => t.id); //Console.WriteLine($"[{vGcode}] {users.Count} 명의 데이터가 확인 되었습니다");// (); @@ -840,7 +843,7 @@ namespace Console_SendMail body.AppendLine("스케쥴"); body.AppendLine(""); - var gp = users.GroupBy(t => t.idx); + var gp = datas.GroupBy(t => t.idx); foreach (var row in gp) { var prc = row.Sum(t => t.progress) / row.Count(); @@ -970,6 +973,240 @@ namespace Console_SendMail taMailPrjSche.Dispose(); } + + + /// + /// 프로젝트업데이트요청(주) + /// + public static void Mail_MakeUpdateRequireProject() + { + + var taForm = new DSMailTableAdapters.MailFormTableAdapter(); + var taMailData = new DSMailTableAdapters.MailDataTableAdapter(); + //var taMailPrjSche = new DSMailTableAdapters.vMailingProjectScheduleTableAdapter(); + var vCate = "PN"; + try + { + Console.WriteLine("프로젝트업데이트요청(주) 미 작성자 추출 작업을 시작 합니다"); + var gcodelist = DatabaseManager.getGroupListWithoutGcode("gcode", "MailForm", "gcode is not null and gcode <> 'DEV'"); + + //var db = new EEEntities(); + + //기준일자는 오늘부터 -15일이다 + //var sd = DateTime.Now.AddDays(-15); + //var ed = DateTime.Now; + //var str_sd = sd.ToShortDateString(); + //var str_ed = ed.ToShortDateString(); + var str_dt = DateTime.Now.ToShortDateString(); + var sql = "select (select isnull(max(pdate),'') from ProjectsHistory where pidx = Projects.idx) as LastHistory," + + " idx,status,name,sdate,ddate,orderno as CR,crdue,dbo.getUserName(isnull(championid,usermanager)) as NameChampion," + + " dbo.getUserName(isnull(designid,usermain)) as NameDesign,dbo.getUserName(isnull(epanelid,userhw2)) as NameEPanel," + + " dbo.getUserName(isnull(softwareid,usersub)) as NameSoftware,championid as IdChampion,designid as IdDesign," + + " epanelid as IdEPanel,softwareid as IdSoftware " + + " from Projects where gcode = @gcode and status = '진행'" + + $" and pdate >= '{DateTime.Now.AddYears(-3).ToShortDateString()}'"; + var cs = Properties.Settings.Default.cs; + var cn = new System.Data.SqlClient.SqlConnection(cs); + var cmd = new SqlCommand(sql, cn); + cmd.Parameters.Add("gcode", System.Data.SqlDbType.VarChar); + cn.Open(); + + + //대상 그룹코드를 모두 확인한다 + foreach (var vGcode in gcodelist) + { + //메일기능이 꺼져있다면 처리하지 않는다. + var usemail = DatabaseManager.GetGroupEnableMail(vGcode); + if (usemail == false) continue; + + //메일양식이 지정되어있는지 체크 + var MailJD = taForm.GetData(vGcode, vCate).FirstOrDefault(); + if (MailJD == null) continue; + if (MailJD.exceptmail == null) MailJD.exceptmail = string.Empty; + if (MailJD.exceptmailcc == null) MailJD.exceptmailcc = string.Empty; + if (string.IsNullOrEmpty(MailJD.subject) || string.IsNullOrEmpty(MailJD.tolist)) continue; + + //오늘날짜로 데이터가 등록되어있느지 확인한다. + var Existweek = taMailData.GetData(vGcode, str_dt, vCate).Where(t => t.tolist.Equals("chikyun.kim@amkor.co.kr") == false && t.wuid.Equals("debug") == false).Any(); + if (Existweek) return; + + cmd.Parameters[0].Value = vGcode; + + //메일데이터 생성 + var body = new System.Text.StringBuilder(); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + body.AppendLine(""); + + var gp = cmd.ExecuteReader(); + + List emaillist = new List(); + while (gp.Read()) + { + var lasthistory = gp[0]?.ToString() ?? string.Empty; + var prjidx = gp["idx"]?.ToString() ?? string.Empty; + var prjname = gp["name"]?.ToString() ?? string.Empty; + var prjstart = gp["sdate"]?.ToString() ?? string.Empty; + var prjend = gp["ddate"]?.ToString() ?? string.Empty; + + var NameChampion = gp["NameChampion"]?.ToString() ?? string.Empty; + var NameDesign = gp["NameDesign"]?.ToString() ?? string.Empty; + var NameEPanel = gp["NameEPanel"]?.ToString() ?? string.Empty; + var NameSoftware = gp["NameSoftware"]?.ToString() ?? string.Empty; + + var IdChampion = gp["IdChampion"]?.ToString() ?? string.Empty; + var IdDesign = gp["IdDesign"]?.ToString() ?? string.Empty; + var IdEPanel = gp["IdEPanel"]?.ToString() ?? string.Empty; + var IdSoftware = gp["IdSoftware"]?.ToString() ?? string.Empty; + + if (string.IsNullOrEmpty(lasthistory) == false) + { + //일주일 전이라면 넘어간다. + if (DateTime.TryParse(lasthistory, out DateTime lastindate)) + { + if (lastindate >= DateTime.Now.AddDays(-7)) continue; + } + } + + //담당자의 메일주소를 취합해야한다. + var email_champion = DatabaseManager.GetUserEmail(vGcode, IdChampion); + var email_design = DatabaseManager.GetUserEmail(vGcode, IdDesign); + var email_epanel = DatabaseManager.GetUserEmail(vGcode, IdEPanel); + var email_software = DatabaseManager.GetUserEmail(vGcode, IdSoftware); + if (string.IsNullOrEmpty(email_champion) ==false && emaillist.Contains(email_champion) == false) emaillist.Add(email_champion); + if (string.IsNullOrEmpty(email_design) == false && emaillist.Contains(email_design) == false) emaillist.Add(email_design); + if (string.IsNullOrEmpty(email_epanel) == false && emaillist.Contains(email_epanel) == false) emaillist.Add(email_epanel); + if (string.IsNullOrEmpty(email_software) == false && emaillist.Contains(email_software) == false) emaillist.Add(email_software); + + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine($""); + body.AppendLine(""); + } + body.AppendLine("
idxProjectLastUpdateChampionDesignEPanelSoftwareStartDue
{prjidx}{prjname}{lasthistory}{NameChampion}{NameDesign}{NameEPanel}{NameSoftware}{prjstart}{prjend}
"); + + //일별경고(월요일제외) + var mail_subject = MailJD.subject;//.Replace("{담당자}", userinfo.name).Replace("{사번}", userinfo.id); + var mail_to = MailJD.tolist; + if (emaillist.Any() && mail_to.Contains("{")) mail_to = mail_to.Replace("{담당자}", string.Join(";", emaillist)); + + var mail_cc = string.Empty; // + if (MailJD.cc != null) mail_cc = MailJD.cc;//.Replace("{담당자}", userinfo.email); + if (emaillist.Any() && mail_cc.Contains("{")) mail_cc = mail_cc.Replace("{담당자}", string.Join(";", emaillist)); + + + var mail_bcc = string.Empty; + if (MailJD.bcc != null) mail_bcc = MailJD.bcc;//.Replace("{담당자}", userinfo.email); + if (emaillist.Any() && mail_bcc.Contains("{")) mail_bcc = mail_bcc.Replace("{담당자}", string.Join(";", emaillist)); + + + var mail_body = MailJD.body;//.Replace("{담당자}", userinfo.name); + //mail_body = mail_body.Replace("{사번}", userinfo.id); + + //메일본문을 생성해서 진행해야함 + var mail_content = mail_body; + if (mail_content.Contains("{data}")) + mail_content = mail_content.Replace("{data}", body.ToString()); + else + mail_content += "
" + body.ToString(); + + //메일데이터를 생성한다. + //mail_to = "chikyun.kim@amkor.co.kr"; + //mail_bcc = string.Empty; + //mail_cc = string.Empty; + + mail_to = MailSort(mail_to, MailJD.exceptmail); + if (string.IsNullOrEmpty(mail_to) == false) + { + using (var dt = new DSMail.MailDataDataTable()) + { + var newdr = dt.NewMailDataRow(); + newdr.gcode = vGcode; + newdr.cate = vCate; + newdr.subject = mail_subject; + newdr.fromlist = "eetgw@amkor.co.kr"; + newdr.tolist = mail_to;// MailSort(mail_to, MailJD.exceptmail); + newdr.bcc = mail_bcc; + newdr.cc = MailSort(mail_cc, MailJD.exceptmailcc); + newdr.pdate = DateTime.Now.ToShortDateString(); + newdr.body = mail_content; + newdr.wuid = "dev";// "dev"; + newdr.wdate = DateTime.Now; + + if (System.Diagnostics.Debugger.IsAttached) + { + newdr.tolist = "chikyun.kim@amkor.co.kr"; + newdr.bcc = string.Empty; + newdr.cc = string.Empty; + newdr.wuid = "debug"; + } + newdr.EndEdit(); + dt.AddMailDataRow(newdr); + var cnt = taMailData.Update(dt);// db.SaveChanges(); + Console.WriteLine($"[{vGcode}] 메일 전송 완료(프로젝트업데이트)"); + } + } + } + + cmd.Dispose(); + cn.Close(); + cn.Dispose(); + } + catch (Exception ex) + { + + using (var dt = new DSMail.MailDataDataTable()) + { + var newdr = dt.NewMailDataRow(); + newdr.gcode = "EET1P"; + newdr.cate = "ER"; + newdr.subject = "[ERROR] 프로젝트업데이트(주) 메일작성 실패"; + newdr.fromlist = "chikyun.kim@amkor.co.kr"; + newdr.tolist = "chikyun.kim@amkor.co.kr"; + newdr.bcc = string.Empty; + newdr.cc = string.Empty; + newdr.pdate = DateTime.Now.ToShortDateString(); + newdr.body = ex.Message; + newdr.wuid = "dev";// "dev"; + newdr.wdate = DateTime.Now; + if (System.Diagnostics.Debugger.IsAttached) + { + newdr.tolist = "chikyun.kim@amkor.co.kr"; + newdr.bcc = string.Empty; + newdr.cc = string.Empty; + newdr.wuid = "debug"; + } + newdr.EndEdit(); + dt.AddMailDataRow(newdr); + var cnt = taMailData.Update(dt); + } + + } + finally + { + ChkMakeSchDayWeekTime = DateTime.Now; + } + + taForm.Dispose(); + taMailData.Dispose(); + } + /// /// 전송되지 않은 메일을 확인하고 그것을 전송한다 /// @@ -1099,7 +1336,7 @@ namespace Console_SendMail } catch (Exception eX) { - Console.WriteLine("[sendmail] : "+ eX.Message); + Console.WriteLine("[sendmail] : " + eX.Message); sendMsg = eX.Message; msgupdate = true; } @@ -1117,7 +1354,7 @@ namespace Console_SendMail var ucnt = cmd.ExecuteNonQuery(); } } - catch + catch { //sendMsg = eX.Message; //msgupdate = true; @@ -1211,7 +1448,7 @@ namespace Console_SendMail newdr.body = dr.body; newdr.aidx = dr.idx; newdr.atime = dr.stime; - newdr.wuid = "dev"; + newdr.wuid = "dev"; newdr.wdate = DateTime.Now; if (System.Diagnostics.Debugger.IsAttached) { @@ -1233,7 +1470,7 @@ namespace Console_SendMail } } } - catch + catch { } @@ -1297,7 +1534,7 @@ namespace Console_SendMail " and isnull(conf,0) = 0" + " and datediff(day, getdate(), sdate ) between - 100 and 2" + " order by sdate desc"; - cmd.CommandText = sql; + cmd.CommandText = sql; var dar = cmd.ExecuteReader(); @@ -1337,7 +1574,7 @@ namespace Console_SendMail body.AppendLine($"[{uid}] {username}"); body.AppendLine($"{cate}"); body.AppendLine($"{sdate}"); - body.AppendLine($"{edate}"); + body.AppendLine($"{edate}"); body.AppendLine($"{v_days}"); body.AppendLine($"{v_time}"); body.AppendLine($"{remark}"); @@ -1431,7 +1668,7 @@ namespace Console_SendMail } } - + taForm.Dispose(); taMailData.Dispose();