Files
Groupware/Project/StateMachine/_MailService.cs
2023-05-30 11:03:12 +09:00

1213 lines
61 KiB
C#

/*
* Backgroudn worker
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace Project
{
public partial class fMain
{
void Mail_JobReportDay()
{
// addmsg("업무일지 미 작성자 추출 작업을 시작 합니다");
var vCate = "JD";
var taMailForm = new DSMailTableAdapters.MailFormTableAdapter();
var taMailData = new DSMailTableAdapters.MailDataTableAdapter();
var taPrjList = new DSMailTableAdapters.ProjectsIngListTableAdapter();
var taSche = new DSMailTableAdapters.EETGW_ProjectsScheduleTableAdapter();
var taJobReport = new DSMailTableAdapters.JobReportTableAdapter();
var taHolidayList = new DSMailTableAdapters.HolidayLIstTableAdapter();
var taGroupUser = new DSMailTableAdapters.vGroupUserTableAdapter();
var taJobReportDateList = new DSMailTableAdapters.JobReportDateListTableAdapter();
//기준일자는 오늘부터 -15일이다
//var basedate = new DateTime(2022, 05, 20);// DateTime.Now;
var basedate = DateTime.Now;
var sd = basedate.AddDays(-15);
var ed = basedate.AddDays(-1);
var str_sd = sd.ToShortDateString();
var str_ed = ed.ToShortDateString();
var str_dt = basedate.ToShortDateString();
var gcodelist = FCOMMON.DBM.getGroupListWithoutGcode("gcode", "MailForm", "gcode is not null and gcode <> 'DEV'");
foreach (var vGcode in gcodelist)
{
//메일정보가 등록되지 않았다면 처리하지 않는다
var MailForm = taMailForm.GetData(vGcode, vCate).FirstOrDefault();
if (MailForm == null) continue;
if (MailForm.exceptmail == null) MailForm.exceptmail = string.Empty;
if (MailForm.exceptmailcc == null) MailForm.exceptmailcc = string.Empty;
if (string.IsNullOrEmpty(MailForm.subject) || string.IsNullOrEmpty(MailForm.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) continue;
List<string> NoMailList = new List<string>();
NoMailList.Add($"그룹\t사번\t성명\t경고일");
//대상 사용자 목록을 추출한다;
var users = taGroupUser.GetData(vGcode);
Dictionary<string, DSMail.vGroupUserRow> uids = new Dictionary<string, DSMail.vGroupUserRow>();
foreach (var userinfo in users)
{
//적용대상제거
if (userinfo.useJobReport == false || userinfo.useUserState == false)
continue;
//퇴사자 확인
if (string.IsNullOrEmpty(userinfo.outdate) == false && userinfo.outdate.CompareTo(str_dt) < 1)
continue;
//이 대상의 이메일이 받는 사람에 제외되어있다면 처리하지 않는다.
var exxptolist = MailForm.exceptmail.ToUpper().Split(';');
if (exxptolist.Contains(userinfo.email.ToUpper())) continue;
//메일대상자로 선정한다
uids.Add(userinfo.id, userinfo); //자동생성된 자료가 없는 경우에만 처리한다
}
//먼저 날짜목록을 가져온다
var dtDateList = taJobReportDateList.GetData(vGcode, str_sd, str_ed);//
//날짜대로 루프를 돈다
List<DateTime> days = new List<DateTime>();
foreach (var jobdata in dtDateList)
{
//날짜입력데이터 확인
if (DateTime.TryParse(jobdata.pdate, out DateTime dt) == false) continue;
//토,일요일에는 동작하지 않는다
if (dt.DayOfWeek == DayOfWeek.Sunday || dt.DayOfWeek == DayOfWeek.Saturday) continue;
//이 날짜가 휴일인지 체크한다.
var Holyinfo = taHolidayList.GetData(jobdata.pdate).FirstOrDefault();
if (Holyinfo != null && Holyinfo.free == true) continue;
//이날짜에는 8시간을 근무 해야 한다
days.Add(DateTime.Parse(jobdata.pdate));
}
//사용자 목록과 날짜 목록을 모두 수집했다
List<ReportUserData> totWarnList = new List<ReportUserData>();
foreach (var userinfo in uids)
{
//이사용자의 기간내 근무데이터를 확인
var UserDatas = taJobReport.GetData(vGcode, userinfo.Key, str_sd, str_ed);
Dictionary<DateTime, double?> WarnList = new Dictionary<DateTime, double?>();
foreach (var dt in days.OrderBy(t => t))
{
var dtstr = dt.ToShortDateString();
var userdata = UserDatas.Where(t => t.pdate == dtstr); //해당날짜의 데이터를 확인한다.
var hrs = 0f;
if (userdata.Any()) hrs = (float)userdata.Sum(t => t.hrs);
//입력시간이 8시간 미만이면 경고한다
if (hrs < 8f)
{
WarnList.Add(dt, hrs);
totWarnList.Add(new ReportUserData { date = dt, hrs = hrs, uid = userinfo.Key, uname = userinfo.Value.name }); //전체알림시에 사용하는 목록
}
}
//경고데이터가 있는 경우에만 메일 발송
if (WarnList.Any())
{
if (string.IsNullOrEmpty(userinfo.Value.email))
{
NoMailList.Add($"{vGcode}\t{userinfo.Key}\t{userinfo.Value}\t{WarnList.Count}");
//addmsg($"[{vGcode}] {userinfo.Value}({userinfo.Key}) 의 메일 정보가 존재하지 않습니다");
}
else
{
//일별경고(월요일제외)
var mail_subject = MailForm.subject.Replace("{담당자}", userinfo.Value.name).Replace("{사번}", userinfo.Value.id);
var mail_to = MailForm.tolist.Replace("{담당자}", userinfo.Value.email);
var mail_cc = string.Empty; //
if (MailForm.cc != null) mail_cc = MailForm.cc.Replace("{담당자}", userinfo.Value.email);
var mail_bcc = string.Empty;
if (MailForm.bcc != null) mail_bcc = MailForm.bcc.Replace("{담당자}", userinfo.Value.email);
var mail_body = MailForm.body.Replace("{담당자}", userinfo.Value.name);
mail_body = mail_body.Replace("{사번}", userinfo.Value.id);
//메일본문을 생성해서 진행해야함
var mail_content = "<p>일자별 정보</p>";
mail_content += $"<br/>조회기간 : {str_sd}~{str_ed}";
mail_content += "<br/><table border='1' cellspacing='1' cellpadding='1'><tr><td>날짜</td><td>요일</td><td>시간</td></tr>";
foreach (var warnitem in WarnList)
{
mail_content += $"<tr><td>{warnitem.Key.ToShortDateString()}</td><td>{warnitem.Key.DayOfWeek.ToString()}</td><td>{warnitem.Value:N1}</td></tr>";
}
mail_content += "</table>";
//메일데이터를 생성한다.
//mail_to = "chikyun.kim@amkor.co.kr";
//mail_bcc = string.Empty;
//mail_cc = string.Empty;
mail_to = MailSort(mail_to, MailForm.exceptmail);
if (string.IsNullOrEmpty(mail_to) == false)
{
//db = new EEEntities();
using (var dt = new DSMail.MailDataDataTable())
{
var newdr = dt.NewMailDataRow();
newdr.gcode = vGcode;
newdr.cate = vCate;
newdr.subject = mail_subject;
newdr.fromlist = userinfo.Value.email;
newdr.tolist = MailSort(mail_to, MailForm.exceptmail);
newdr.bcc = mail_bcc;
newdr.cc = MailSort(mail_cc, MailForm.exceptmailcc);
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.body = mail_body.Replace("{내용}", mail_content);
newdr.wuid = FCOMMON.info.Login.no;// "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);
if (cnt == 1) System.Threading.Thread.Sleep(500);
}
}
}
}
}
//첫줄은 제목이므로 2줄이상 있어야 한다
if (NoMailList.Count > 1)
{
using (var dt = new DSMail.MailDataDataTable())
{
var newdr = dt.NewMailDataRow();
newdr.gcode = "EET1P";
newdr.cate = "ERR";
newdr.subject = $"[GW] {vGcode} - 업무일지 담당자 이메일 경고";
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 = string.Join("<br/>", NoMailList.ToList());
newdr.wuid = FCOMMON.info.Login.no;// "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);
if (cnt == 1) System.Threading.Thread.Sleep(500);
}
}
}
taMailForm.Dispose();
taMailData.Dispose();
taJobReport.Dispose();
taHolidayList.Dispose();
taGroupUser.Dispose();
taJobReportDateList.Dispose();
}
void Mail_JobReportWeek()
{
var vCate = "JW";
var taMailForm = new DSMailTableAdapters.MailFormTableAdapter();
var taMailData = new DSMailTableAdapters.MailDataTableAdapter();
var taPrjList = new DSMailTableAdapters.ProjectsIngListTableAdapter();
var taSche = new DSMailTableAdapters.EETGW_ProjectsScheduleTableAdapter();
var taJobReport = new DSMailTableAdapters.JobReportTableAdapter();
var taHolidayList = new DSMailTableAdapters.HolidayLIstTableAdapter();
var taGroupUser = new DSMailTableAdapters.vGroupUserTableAdapter();
var taJobReportDateList = new DSMailTableAdapters.JobReportDateListTableAdapter();
//기준일자는 오늘부터 -15일이다
var sd = DateTime.Now.AddDays(-15);
var ed = DateTime.Now.AddDays(-1);
var str_sd = sd.ToShortDateString();
var str_ed = ed.ToShortDateString();
var str_dt = DateTime.Now.ToShortDateString();
var gcodelist = FCOMMON.DBM.getGroupListWithoutGcode("gcode", "MailForm", "gcode is not null and gcode <> 'DEV'");
foreach (var vGcode in gcodelist)
{
//메일양식이 지정되어있는지 체크
var MailForm = taMailForm.GetData(vGcode, vCate).FirstOrDefault();
if (MailForm == null) continue;
if (MailForm.exceptmail == null) MailForm.exceptmail = string.Empty;
if (MailForm.exceptmailcc == null) MailForm.exceptmailcc = string.Empty;
if (string.IsNullOrEmpty(MailForm.subject) || string.IsNullOrEmpty(MailForm.tolist)) continue;
//오늘날짜로 주간 데이터가 등록되어있느지 확인한다.
//var Existweek = taMailData.GetData(vGcode, str_dt, vCate).Any();
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) continue;
//대상 사용자 목록을 추출한다
var users = taGroupUser.GetData(vGcode);
Dictionary<string, DSMail.vGroupUserRow> uids = new Dictionary<string, DSMail.vGroupUserRow>();
foreach (var userinfo in users)
{
//적용대상제거
if (userinfo.useJobReport == false || userinfo.useUserState == false)
continue;
//퇴사자 확인
if (string.IsNullOrEmpty(userinfo.outdate) == false && userinfo.outdate.CompareTo(str_dt) < 1)
continue;
//이 대상의 이메일이 받는 사람에 제외되어있다면 처리하지 않는다.
var exxptolist = MailForm.exceptmail.ToUpper().Split(';');
if (exxptolist.Contains(userinfo.email.ToUpper())) continue;
//메일대상자로 선정한다
uids.Add(userinfo.id, userinfo); //자동생성된 자료가 없는 경우에만 처리한다
}
var dtDateList = taJobReportDateList.GetData(vGcode, str_sd, str_ed);//
//날짜대로 루프를 돈다
List<DateTime> days = new List<DateTime>();
foreach (var jobdata in dtDateList)
{
// var jobdata = dateitem.FirstOrDefault();
var dt = DateTime.Parse(jobdata.pdate);
if (dt.DayOfWeek == DayOfWeek.Sunday || dt.DayOfWeek == DayOfWeek.Saturday) continue;
//이 날짜가 휴일인지 체크한다.
var Holyinfo = taHolidayList.GetData(jobdata.pdate).FirstOrDefault();
//var Holyinfo = db.HolidayLIst.Where(t => t.pdate == jobdata.pdate).FirstOrDefault();
if (Holyinfo != null && Holyinfo.free == true) continue;
//이날짜에는 8시간을 근무 해야 한다
days.Add(DateTime.Parse(jobdata.pdate));
}
// addmsg($"[{vGcode}] {days.Count} 건의 일자가 확인 되었습니다(기간:{str_sd}~{str_ed}");
//사용자 목록과 날짜 목록을 모두 수집했다
List<ReportUserData> totWarnList = new List<ReportUserData>();
foreach (var uid in uids)
{
//이사용자의 날짜별 근무시간을 확인한다.
var UserDatas = taJobReport.GetData(vGcode, uid.Key, str_sd, str_ed);
Dictionary<DateTime, double?> WarnList = new Dictionary<DateTime, double?>();
foreach (var dt in days.OrderBy(t => t))
{
var dtstr = dt.ToShortDateString();
var userdata = UserDatas.Where(t => t.pdate == dtstr); //해당날짜의 데이터를 확인한다.
var hrs = 0f;
if (userdata.Any()) hrs = (float)userdata.Sum(t => t.hrs);
//자료를 입력하지 않았거나, 입력시간이 8시간 미만이면 경고한다
if (hrs < 8f)
{
//WarnList.Add(dt, hrs);
totWarnList.Add(new ReportUserData { date = dt, hrs = hrs, uid = uid.Key, uname = uid.Value.name }); //전체알림시에 사용하는 목록
}
}
}
if (totWarnList.Count > 0)
{
//addmsg($"[{vGcode}] 주간 경고 데이터는 {totWarnList.Count} 건 입니다");
//오늘잘짜로 등록된 자료가 있으면 처리하지 안흔다.
//해당 사용자의 오늘 날짜로 등록된 자동 데이터가 있다면 대상에 넣지 않는다
//db = new EEEntities();
var mail_subject = MailForm.subject;
var mail_to = MailForm.tolist;//.Replace("{담당자}", userinfo.email);
var pmail_cc = new List<string>(); //
if (MailForm.cc != null) pmail_cc = MailForm.cc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList();//.Replace("{담당자}", userinfo.email);
var mail_bcc = string.Empty;
if (MailForm.bcc != null) mail_bcc = MailForm.bcc;//.Replace("{담당자}", userinfo.email);
var mail_body = MailForm.body;//.Replace("{담당자}", userinfo.name);
//메일본문을 생성해서 진행해야함
var vmail_body = "<p>담당자별 정보</p>";
vmail_body += "<br/>조회기간 : " + sd.ToShortDateString() + "~" + ed.ToShortDateString();
////참고데이터를 추가한다
var usergrplist = totWarnList.OrderBy(t => t.uname).GroupBy(t => t.uid).ToList();
vmail_body += "<br/><table border='1' cellspacing='1' cellpadding='1'><tr><td>담당자</td><td>일자별시간</td></tr>";
var mail_cc = string.Join(";", pmail_cc); //모든 대상을 세미콜론으로 붙인다.
foreach (var warnitem in usergrplist)
{
var item = warnitem.FirstOrDefault();
vmail_body += $"<tr><td>{item.uname}({item.uid})</td><td>";
foreach (var ii in warnitem.OrderBy(t => t.date))
{
vmail_body += $" {ii.date.ToString("MM/dd")}({ii.hrs:N1}h)";
}
vmail_body += "</td></tr>";
}
vmail_body += "</table>";
//메일데이터를 생성한다.
//mail_bcc = string.Empty;
//mail_cc = string.Empty;
//mail_to = "chikyun.kim@amkor.co.kr";
//db = new EEEntities();
mail_to = MailSort(mail_to, MailForm.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;
newdr.bcc = mail_bcc;
newdr.cc = MailSort(mail_cc, MailForm.exceptmailcc);
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.body = mail_body.Replace("{내용}", vmail_body);
newdr.wuid = FCOMMON.info.Login.no;// "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);
if (cnt == 1) System.Threading.Thread.Sleep(1000);
}
}
}
}
taMailForm.Dispose();
taMailData.Dispose();
taPrjList.Dispose();
taSche.Dispose();
taJobReport.Dispose();
taHolidayList.Dispose();
taGroupUser.Dispose();
taJobReportDateList.Dispose();
}
void Mail_NoSchedule()
{
var taForm = new DSMailTableAdapters.MailFormTableAdapter();
var taMailData = new DSMailTableAdapters.MailDataTableAdapter();
var taPrjList = new DSMailTableAdapters.ProjectsIngListTableAdapter();
var taSche = new DSMailTableAdapters.EETGW_ProjectsScheduleTableAdapter();
var vCate = "SN";
try
{
//기준일자는 오늘부터 -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 gcodelist = FCOMMON.DBM.getGroupListWithoutGcode("gcode", "MailForm", "gcode is not null and gcode <> 'DEV'");
foreach (var vGcode in gcodelist)
{
//메일양식이 지정되어있는지 체크
var MailForm = taForm.GetData(vGcode, vCate).FirstOrDefault();
if (MailForm == null) continue;
if (MailForm.exceptmail == null) MailForm.exceptmail = string.Empty;
if (MailForm.exceptmailcc == null) MailForm.exceptmailcc = string.Empty;
if (string.IsNullOrEmpty(MailForm.subject) || string.IsNullOrEmpty(MailForm.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) continue;
var projects = taPrjList.GetData(vGcode);
//addmsg($"[{vGcode}] {projects.Count} 건의 데이터가 확인 되었습니다");
//메일데이터 생성
var body = new System.Text.StringBuilder();
body.AppendLine("<table border='1' cellspacing='1' cellpadding='1' style='text-align:center;'>");
body.AppendLine("<tr>");
body.AppendLine("<td>시작일</td>");
body.AppendLine("<td>상태</td>");
body.AppendLine("<td>번호</td>");
body.AppendLine("<td>Project</td>");
body.AppendLine("<td>요청</td>");
body.AppendLine("<td>Champion</td>");
body.AppendLine("<td>협업</td>");
body.AppendLine("<td>만료일</td>");
body.AppendLine("<td>수량</td>");
body.AppendLine("<td>외주금액</td>");
body.AppendLine("<td>자체금액</td>");
body.AppendLine("<td>절감액</td>");
body.AppendLine("<td>CR/CF</td>");
body.AppendLine("</tr>");
//var gp = projects.GroupBy(t => t.idx);
foreach (var row in projects)
{
//스케쥴에서 데이터를 찾는다.
var cnt = taSche.GetData(vGcode, row.idx).Any();
if (cnt == true) continue;
body.AppendLine($"<tr>");
body.AppendLine($"<td>{row.sdate}</td>");
body.AppendLine($"<td>{row.status}</td>");
body.AppendLine($"<td>{row.idx}</td>");
body.AppendLine($"<td>{row.name}</td>");
body.AppendLine($"<td>{row.reqstaff}</td>");
body.AppendLine($"<td>{row.userManager}</td>");
body.AppendLine($"<td>{row.usermain}/{row.usersub}/{row.userhw2}</td>");
body.AppendLine($"<td>{row.edate}</td>");
body.AppendLine($"<td>{row.cnt}</td>");
body.AppendLine($"<td>{row.costo}</td>");
body.AppendLine($"<td>{row.costn}</td>");
body.AppendLine($"<td>{row.costo - row.costn}</td>");
body.AppendLine($"<td>{row.orderno}</td>");
body.AppendLine($"</tr>");
}
body.AppendLine("</table>");
//일별경고(월요일제외)
//if (MailForm != null)
{
var mail_subject = MailForm.subject;//.Replace("{담당자}", userinfo.name).Replace("{사번}", userinfo.id);
var mail_to = MailForm.tolist;//.Replace("{담당자}", userinfo.email);
var mail_cc = string.Empty; //
if (MailForm.cc != null) mail_cc = MailForm.cc;//.Replace("{담당자}", userinfo.email);
var mail_bcc = string.Empty;
if (MailForm.bcc != null) mail_bcc = MailForm.bcc;//.Replace("{담당자}", userinfo.email);
var mail_body = MailForm.body;
//메일본문을 생성해서 진행해야함
var mail_content = mail_body.Replace("{data}", body.ToString());
mail_to = MailSort(mail_to, MailForm.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, MailForm.exceptmail);
newdr.bcc = mail_bcc;
newdr.cc = MailSort(mail_cc, MailForm.exceptmailcc);
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.body = mail_content;
newdr.wuid = FCOMMON.info.Login.no;// "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);
taMailData.Update(dt);
}
}
}
}
}
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 = FCOMMON.info.Login.no;// "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);
}
}
taForm.Dispose();
taMailData.Dispose();
taSche.Dispose();
taPrjList.Dispose();
}
/// <summary>
/// 스케쥴기한임박알림(일)
/// </summary>
void MakeScheduleDay()
{
var taForm = new DSMailTableAdapters.MailFormTableAdapter();
var taMailData = new DSMailTableAdapters.MailDataTableAdapter();
var taMailPrjSche = new DSMailTableAdapters.vMailingProjectScheduleTableAdapter();
var vCate = "SJ";
try
{
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 gcodelist = FCOMMON.DBM.getGroupListWithoutGcode("gcode", "MailForm", "gcode is not null and gcode <> 'DEV'");
foreach (var vGcode in gcodelist)
{
//메일양식이 지정되어있는지 체크
var MailForm = taForm.GetData(vGcode, vCate).FirstOrDefault();
if (MailForm == null) continue;
if (MailForm.exceptmail == null) MailForm.exceptmail = string.Empty;
if (MailForm.exceptmailcc == null) MailForm.exceptmailcc = string.Empty;
if (string.IsNullOrEmpty(MailForm.subject) || string.IsNullOrEmpty(MailForm.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) continue;
//대상 사용자 목록을 추출한다
//var ta = new DataSet1TableAdapters.vMailingProjectScheduleTableAdapter();
var users = new DSMail.vMailingProjectScheduleDataTable();
taMailPrjSche.Fill(users, vGcode);
//var users = db.vMailingProjectSchedule.ToList();// .vJobReportForUser.Where(t => t.gcode == Pub.vGcode).GroupBy(t => t.id);
//addmsg($"[{vGcode}] {users.Count} 명의 데이터가 확인 되었습니다");
//메일데이터 생성
var body = new System.Text.StringBuilder();
body.AppendLine("<table border='1' cellspacing='1' cellpadding='1' style='text-align:center;'>");
body.AppendLine("<tr>");
body.AppendLine("<td>진행(%)</td>");
body.AppendLine("<td>Project</td>");
body.AppendLine("<td>Champion</td>");
body.AppendLine("<td>등록일</td>");
body.AppendLine("<td>스케쥴</td>");
body.AppendLine("</tr>");
var gp = users.GroupBy(t => t.idx);
foreach (var row in gp)
{
var prc = row.Sum(t => t.progress) / row.Count();
var dr = row.FirstOrDefault();
body.AppendLine($"<tr>");
body.AppendLine($"<td>{prc}</td>");
body.AppendLine($"<td>[{dr.idx}] {dr.name}</td>");
body.AppendLine($"<td>{dr.userManager}</td>");
body.AppendLine($"<td>{dr.pdate}</td>");
body.AppendLine("<td>");
body.AppendLine("<table border='1' cellspacing='1' cellpadding='1' style='text-align:center;'>");
body.AppendLine("<tr>");
body.AppendLine("<td rowspan='2'>No</td><td rowspan='2'>Title</td><td colspan='2'>Plan(ww)</td><td colspan='2'>Actual(ww)</td><td>진행</td><td>비고</td>");
body.AppendLine("</tr>");
body.AppendLine("<tr>");
body.AppendLine("<td>시작</td><td>완료</td><td>시작</td><td>완료</td><td>%</td><td>&nbsp;</td>");
body.AppendLine("</tr>");
var ll = row.OrderBy(t => t.seq).ToList();
foreach (var srow in ll)
{
body.AppendLine($"<tr>");
body.AppendLine($"<td>{srow.seq}</td>");
body.AppendLine($"<td>{srow.title}</td>");
body.AppendLine($"<td>{srow.sw}</td>");
body.AppendLine($"<td>{srow.ew}</td>");
body.AppendLine($"<td>{srow.swa}</td>");
body.AppendLine($"<td>{srow.ewa}</td>");
body.AppendLine($"<td>{srow.progress}</td>");
body.AppendLine($"<td>{srow.memo}</td>");
body.AppendLine($"</tr>");
}
body.AppendLine("</table>");
body.AppendLine("</td>");
//여기에 스케쥴이 들어가야한다
body.AppendLine($"</tr>");
}
body.AppendLine("</table>");
//일별경고(월요일제외)
//if (MailJD != null)
//{
var mail_subject = MailForm.subject;//.Replace("{담당자}", userinfo.name).Replace("{사번}", userinfo.id);
var mail_to = MailForm.tolist;//.Replace("{담당자}", userinfo.email);
var mail_cc = string.Empty; //
if (MailForm.cc != null) mail_cc = MailForm.cc;//.Replace("{담당자}", userinfo.email);
var mail_bcc = string.Empty;
if (MailForm.bcc != null) mail_bcc = MailForm.bcc;//.Replace("{담당자}", userinfo.email);
var mail_body = MailForm.body;//.Replace("{담당자}", userinfo.name);
//mail_body = mail_body.Replace("{사번}", userinfo.id);
//메일본문을 생성해서 진행해야함
var mail_content = mail_body.Replace("{data}", body.ToString());
//메일데이터를 생성한다.
//mail_to = "chikyun.kim@amkor.co.kr";
//mail_bcc = string.Empty;
//mail_cc = string.Empty;
mail_to = MailSort(mail_to, MailForm.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, MailForm.exceptmailcc);
newdr.pdate = DateTime.Now.ToShortDateString();
newdr.body = mail_content;
newdr.wuid = FCOMMON.info.Login.no;// "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);
taMailData.Update(dt);
}
}
//}
}
}
catch (Exception ex)
{
using (var dt = new DSMail.MailDataDataTable())
{
var newdr = dt.NewMailDataRow();
newdr.gcode = "EET1P";
newdr.cate = "ER";
newdr.subject = "[ERROR] 스케쥴(day) 메일작성 실패";
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 = FCOMMON.info.Login.no;// "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);
}
}
taMailData.Dispose();
taForm.Dispose();
taMailPrjSche.Dispose();
}
/// <summary>
/// 스케쥴기한임박알림(주)
/// </summary>
void MakeScheduleDayWeek()
{
var taForm = new DSMailTableAdapters.MailFormTableAdapter();
var taMailData = new DSMailTableAdapters.MailDataTableAdapter();
var taMailPrjSche = new DSMailTableAdapters.vMailingProjectScheduleTableAdapter();
var vCate = "SP";
try
{
Console.WriteLine("스케쥴기한임박자료(주) 미 작성자 추출 작업을 시작 합니다");
var gcodelist = FCOMMON.DBM.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 gcodelist = db.MailForm.GroupBy(t => t.gcode).ToList();
foreach (var vGcode in gcodelist)
{
//메일양식이 지정되어있는지 체크
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;
//대상 사용자 목록을 추출한다
var users = new DSMail.vMailingProjectScheduleDataTable();
taMailPrjSche.Fill(users, vGcode);
//var users = db.vMailingProjectSchedule.ToList();// .vJobReportForUser.Where(t => t.gcode == Pub.vGcode).GroupBy(t => t.id);
//Console.WriteLine($"[{vGcode}] {users.Count} 명의 데이터가 확인 되었습니다");// ();
//메일데이터 생성
var body = new System.Text.StringBuilder();
body.AppendLine("<table border='1' cellspacing='1' cellpadding='1' style='text-align:center;'>");
body.AppendLine("<tr>");
body.AppendLine("<td>진행(%)</td>");
body.AppendLine("<td>Project</td>");
body.AppendLine("<td>Champion</td>");
body.AppendLine("<td>등록일</td>");
body.AppendLine("<td>스케쥴</td>");
body.AppendLine("</tr>");
var gp = users.GroupBy(t => t.idx);
foreach (var row in gp)
{
var prc = row.Sum(t => t.progress) / row.Count();
var dr = row.FirstOrDefault();
body.AppendLine($"<tr>");
body.AppendLine($"<td>{prc}</td>");
body.AppendLine($"<td>[{dr.idx}] {dr.name}</td>");
body.AppendLine($"<td>{dr.userManager}</td>");
body.AppendLine($"<td>{dr.pdate}</td>");
body.AppendLine("<td>");
body.AppendLine("<table border='1' cellspacing='1' cellpadding='1' style='text-align:center;'>");
body.AppendLine("<tr>");
body.AppendLine("<td rowspan='2'>No</td><td rowspan='2'>Title</td><td colspan='2'>Plan(ww)</td><td colspan='2'>Actual(ww)</td><td>진행</td><td>비고</td>");
body.AppendLine("</tr>");
body.AppendLine("<tr>");
body.AppendLine("<td>시작</td><td>완료</td><td>시작</td><td>완료</td><td>%</td><td>&nbsp;</td>");
body.AppendLine("</tr>");
var ll = row.OrderBy(t => t.seq).ToList();
foreach (var srow in ll)
{
body.AppendLine($"<tr>");
body.AppendLine($"<td>{srow.seq}</td>");
body.AppendLine($"<td>{srow.title}</td>");
body.AppendLine($"<td>{srow.sw}</td>");
body.AppendLine($"<td>{srow.ew}</td>");
body.AppendLine($"<td>{srow.swa}</td>");
body.AppendLine($"<td>{srow.ewa}</td>");
body.AppendLine($"<td>{srow.progress}</td>");
body.AppendLine($"<td>{srow.memo}</td>");
body.AppendLine($"</tr>");
}
body.AppendLine("</table>");
body.AppendLine("</td>");
//여기에 스케쥴이 들어가야한다
body.AppendLine($"</tr>");
}
body.AppendLine("</table>");
//일별경고(월요일제외)
var mail_subject = MailJD.subject;//.Replace("{담당자}", userinfo.name).Replace("{사번}", userinfo.id);
var mail_to = MailJD.tolist;//.Replace("{담당자}", userinfo.email);
var mail_cc = string.Empty; //
if (MailJD.cc != null) mail_cc = MailJD.cc;//.Replace("{담당자}", userinfo.email);
var mail_bcc = string.Empty;
if (MailJD.bcc != null) mail_bcc = MailJD.bcc;//.Replace("{담당자}", userinfo.email);
var mail_body = MailJD.body;//.Replace("{담당자}", userinfo.name);
//mail_body = mail_body.Replace("{사번}", userinfo.id);
//메일본문을 생성해서 진행해야함
var mail_content = mail_body.Replace("{data}", 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 = FCOMMON.info.Login.no;// "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);
taMailData.Update(dt);// db.SaveChanges();
Console.WriteLine($"[{vGcode}] 메일 전송 완료(스케쥴day)");
}
}
}
}
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 = FCOMMON.info.Login.no;// "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();
taMailPrjSche.Dispose();
}
/// <summary>
/// 전송되지 않은 메일을 확인하고 그것을 전송한다
/// </summary>
void SendMail()
{
//메일서버역할이 있다.
try
{
var cn = new System.Data.SqlClient.SqlConnection(Properties.Settings.Default.gwcs);
var cmd = new System.Data.SqlClient.SqlCommand("", cn);
cn.Open();
//1개의데이터 가져오기
cmd.CommandText = "SELECT top 1 * FROM MailData WHERE ISNULL(SendOK, 0) = 0 order by wdate";
var dar = cmd.ExecuteReader();
var list_from = string.Empty;// getMaillist(dar["fromlist"]);
var list_to = string.Empty;// getMaillist(dar["tolist"]);
var list_bcc = string.Empty;// getMaillist(dar["bcc"]);
var list_cc = string.Empty;//getMaillist(dar["cc"]);
var subject = string.Empty;// getdbdata(dar["subject"]).Trim();
var body = string.Empty;//getdbdata(dar["body"]).Trim();
var idx = -1;
while (dar.Read())
{
list_from = getMaillist(dar["fromlist"]);
list_to = getMaillist(dar["tolist"]);
list_bcc = getMaillist(dar["bcc"]);
list_cc = getMaillist(dar["cc"]);
subject = getdbdata(dar["subject"]).Trim();
body = getdbdata(dar["body"]).Trim();
idx = (int)dar["idx"];
}
dar.Close();
string sendMsg = "";
if (list_from == "")
{
sendMsg = ("보내는 주소가 없습니다");
}
else if (subject.Trim() == "")
{
sendMsg = ("메일 제목이 없습니다");
}
else if (body.Trim() == "")
{
sendMsg = ("본문이 없습니다");
}
else if (list_to == "")
{
sendMsg = ("받는 주소가 없습니다");
}
if (idx > 0)
{
if (sendMsg.isEmpty() == false)
{
//오류가 있다
try
{
cmd.CommandText = "UPDATE MailData SET SendOK = 1, SendMsg = @msg WHERE(idx = @idx) and isnull(sendok,0) = 0";
cmd.Parameters.Clear();
cmd.Parameters.Add("msg", System.Data.SqlDbType.VarChar).Value = sendMsg;
cmd.Parameters.Add("idx", System.Data.SqlDbType.Int).Value = idx;
//Console.WriteLine(string.Format("Send Complete index={0},Msg={1}", dar["idx"], sendMsg));
//ta.UpdateSendOK(sendMsg, dr.idx);
var ucnt = cmd.ExecuteNonQuery();
if (ucnt == 1)
{
Console.WriteLine("send mail to" + list_to + ",subject=" + getdbdata(subject));
}
}
catch (Exception eX)
{
sendMsg = eX.Message;
}
}
else
{
//var body = getdbdata(dar["body"]);
body +=
"<p>" +
"<br />이 메일은 EET 프로그램에서 자동 발신 되었습니다." +
"<br />메일이 잘못 전송 되었다면 [<a href='chikyun.kim@amkor.co.kr'>chikyun.kim@amkor.co.kr</a>] 로 문의 주시기 바랍니다" +
"</p>";
//전송을 해야 함
var mc = new System.Net.Mail.SmtpClient("10.101.10.6");
var msg = new System.Net.Mail.MailMessage
(list_from,
list_to,
subject,
body);
if (list_bcc != "") msg.Bcc.Add(list_bcc);
if (list_cc != "") msg.CC.Add(list_cc);
msg.IsBodyHtml = true;
bool msgupdate = false;
try
{
sendMsg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
cmd.CommandText = "UPDATE MailData SET SendOK = 1, SendMsg = @msg WHERE(idx = @idx) and isnull(sendok,0) = 0";
cmd.Parameters.Clear();
cmd.Parameters.Add("msg", System.Data.SqlDbType.VarChar).Value = sendMsg;
cmd.Parameters.Add("idx", System.Data.SqlDbType.Int).Value = idx;
//Console.WriteLine(string.Format("Send Complete index={0},Msg={1}", dar["idx"], sendMsg));
//ta.UpdateSendOK(sendMsg, dr.idx);
var ucnt = cmd.ExecuteNonQuery();
if (ucnt == 1)
{
mc.Send(msg);
Console.WriteLine("send mail to" + list_to + ",subject=" + getdbdata(subject));
}
}
catch (Exception eX)
{
sendMsg = eX.Message;
msgupdate = true;
}
try
{
if (msgupdate)
{
cmd.CommandText = "UPDATE MailData SET SendMsg = @msg WHERE idx = @idx ";
cmd.Parameters.Clear();
cmd.Parameters.Add("idx", System.Data.SqlDbType.Int).Value = idx;
var ucnt = cmd.ExecuteNonQuery();
}
}
catch (Exception eX)
{
//sendMsg = eX.Message;
//msgupdate = true;
}
}
}
cmd.Dispose();
cn.Close();
}
catch (Exception ex)
{
}
finally
{
ChkSendMailTime = DateTime.Now;
}
}
/// <summary>
/// 자동생성 메일 작성
/// </summary>
void MakeAutoMail()
{
try
{
var taData = new dsMSSQLTableAdapters.MailDataTableAdapter();
var taList = new dsMSSQLTableAdapters.MailAutoTableAdapter();
var dtList = taList.GetByAutoSend();
var dtInsert = new dsMSSQL.MailDataDataTable();
//대상
Console.WriteLine("Make Auto Send Mail Data (" + dtList.Rows.Count.ToString() + ")");
foreach (dsMSSQL.MailAutoRow dr in dtList)
{
//시간정보가 없는 애들은 처리 하지 않음
if (dr.stime.IndexOf(":") == -1) continue;
if (dr.sday == null || dr.sday.Length < 2) continue;
//발신시간을 넘어야 한다
var curTime = DateTime.Now.ToString("HH:mm");
if (string.Compare(curTime, dr.stime) < 0) continue; //지정된 시간 이전이면 생성 안한다
//자동생성 구분용 카테고리
var cate = string.Format("{0},{1}", dr.sday[0], dr.sday[1]);
//동륵일
var pdate = DateTime.Now.ToString("yyyy-MM-dd");
//같은날, 같은 atime aidx pdate 의 같이 있으면 이미 생성된것이므로 추가하지 않는다
var existData = taData.FindAutoData(dr.idx, dr.stime, pdate, cate);
//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();
var PreMakeCount = (int)(existData);
if (PreMakeCount > 0) continue;
//전송간격과 대상
if (dr.sday[0] == 1)
{
//week
var bitString = Convert.ToString(dr.sday[1], 2).PadLeft(8, '0').ToArray();
var weeknum = (int)(DateTime.Now.DayOfWeek);
if (bitString[weeknum + 1] == '0') continue;
}
else
{
//month
if (dr.sday[1] != DateTime.Now.Day) continue;
}
//같은날, 같은 atime aidx pdate 의 같이 있으면 이미 생성된것이므로 추가하지 않는다
//생성해야할 자료라면 만들어 준다
var newdr = dtInsert.NewMailDataRow();
newdr.pdate = pdate;// DateTime.Now.ToString("yyyy-MM-dd");
newdr.gcode = dr.gcode;
newdr.fromlist = dr.fromlist;
newdr.tolist = dr.tolist;
newdr.bcc = dr.bcc;
newdr.cate = cate;// string.Format("{0},{1}", dr.sday[0], dr.sday[1]); //cate에 해당 자료를 기록한다.
newdr.cc = dr.cc;
newdr.subject = dr.subject;
newdr.body = dr.body;
newdr.aidx = dr.idx;
newdr.atime = dr.stime;
newdr.wuid = FCOMMON.info.Login.no;// "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();
dtInsert.AddMailDataRow(newdr);
try
{
taData.Update(newdr);
Console.WriteLine("auto make : " + newdr.tolist + ",subject=" + newdr.subject);
}
catch (Exception eX)
{
Console.WriteLine("auto make error : " + eX.Message);
}
}
}
catch (Exception ex)
{
}
finally
{
ChkMakeAutoTime = DateTime.Now;
}
}
}
}