219 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Data.SqlClient;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using System.Threading.Tasks;
 | |
| 
 | |
| namespace JobReportMailService
 | |
| {
 | |
|     partial class Program
 | |
|     {
 | |
| 
 | |
|         static void WorkWeek()
 | |
|         {
 | |
|             if (DateTime.Now.DayOfWeek != DayOfWeek.Monday)
 | |
|             {
 | |
|                 Console.WriteLine("주간 업무일지 보고는 월요일에만 작동 합니다");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             Console.WriteLine("업무일지 미 작성자(주간) 추출 작업을 시작 합니다");
 | |
| 
 | |
|             var db = new EEEntities();
 | |
| 
 | |
|             //메일양식이 지정되어있는지 체크
 | |
|             var MailJW = db.MailForm.Where(t => t.gcode == vGcode & t.cate == "JW").FirstOrDefault();
 | |
| 
 | |
|             if (MailJW == null)
 | |
|             {
 | |
|                 //토,일요일에는 동작하지 않는다
 | |
|                 Console.WriteLine("업무일지 미작성(주간) 메일 양식이 입력되지 않았습니다");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             //기준일자는 오늘부터 -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();
 | |
| 
 | |
|             //오늘날짜로 주간 데이터가 등록되어있느지 확인한다.
 | |
|             db = new EEEntities();
 | |
|             var Existweek = db.MailData.Where(t => t.gcode == vGcode && t.cate == "JW" && t.wuid == "395552" && t.pdate == str_dt).Any();
 | |
|             if (Existweek)
 | |
|             {
 | |
|                 Console.WriteLine($"주간일자({str_dt}) 보고 메일이 이미 등록되어 있습니다");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             //대상 사용자 목록을 추출한다
 | |
|              db = new EEEntities();
 | |
|             var users = db.vJobReportForUser.Where(t => t.gcode == vGcode).GroupBy(t => t.id);
 | |
|             Dictionary<string, string> uids = new Dictionary<string, string>();
 | |
|             foreach (var user in users)
 | |
|             {
 | |
|                 //해당 사용자의 오늘 날짜로 등록된 자동 데이터가 있다면 대상에 넣지 않는다
 | |
|                 var userinfo = user.FirstOrDefault();
 | |
| 
 | |
|                 //퇴사자 확인
 | |
|                  db = new EEEntities();
 | |
|                 var userdata = db.vGroupUser.Where(t => t.id == userinfo.id).FirstOrDefault();
 | |
|                 if (userdata != null && string.IsNullOrEmpty(userdata.outdate) == false) continue;
 | |
| 
 | |
|                 //이 대상의 이메일이 받는 사람에 제외되어있다면 처리하지 않는다.
 | |
|                 var exxptolist = MailJW.exceptmail.ToUpper().Split(';');                
 | |
|                 if(exxptolist.Contains(userdata.email.ToUpper())==false)
 | |
|                 {
 | |
|                     //모두대상으로 처리한다
 | |
|                     if(userdata.email.ToUpper() != ("BongSeok.Jung@amkor.co.kr").ToUpper())
 | |
|                     uids.Add(userinfo.id, userinfo.name);
 | |
|                 }
 | |
|                 else Console.WriteLine("주간 제외대상자임 " + userdata.email );
 | |
|             }
 | |
| 
 | |
| 
 | |
|             Console.WriteLine($"{uids.Count} 명의 전체 사용자가 확인 되었습니다");
 | |
| 
 | |
|             //먼저 날짜목록을 가져온다
 | |
|             db = new EEEntities();
 | |
|             var lstDate = db.JobReport
 | |
|                 .Where(t => t.gcode == vGcode && t.pdate.CompareTo(str_sd) >= 0 && t.pdate.CompareTo(str_ed) < 0)
 | |
|                 .OrderBy(t => t.pdate)
 | |
|                 .GroupBy(t => t.pdate).ToList();
 | |
| 
 | |
|             //날짜대로 루프를 돈다
 | |
|             List<DateTime> days = new List<DateTime>();
 | |
|             foreach (var dateitem in lstDate)
 | |
|             {
 | |
|                 var jobdata = dateitem.FirstOrDefault();
 | |
|                 var dt = DateTime.Parse(jobdata.pdate);
 | |
|                 if (dt.DayOfWeek == DayOfWeek.Sunday || dt.DayOfWeek == DayOfWeek.Saturday) continue;
 | |
| 
 | |
|                 //이 날짜가 휴일인지 체크한다.
 | |
|                 db = new EEEntities();
 | |
|                 var Holyinfo = db.HolidayLIst.Where(t => t.pdate == jobdata.package).FirstOrDefault();
 | |
|                 if (Holyinfo != null && Holyinfo.free != null && (bool)(Holyinfo.free)) continue;
 | |
| 
 | |
|                 //이날짜에는 8시간을 근무 해야 한다
 | |
|                 days.Add(DateTime.Parse(jobdata.pdate));
 | |
|             }
 | |
|             Console.WriteLine($"{days.Count} 건의 일자가 확인 되었습니다(기간:{str_sd}~{str_ed}");
 | |
| 
 | |
|             //사용자 목록과 날짜 목록을 모두 수집했다
 | |
|             List<ReportUserData> totWarnList = new List<ReportUserData>();
 | |
|             foreach (var uid in uids)
 | |
|             {
 | |
|                 //이사용자의 날짜별 근무시간을 확인한다.
 | |
|                 db = new EEEntities();
 | |
|                 var UserDatas = db.vJobReportForUser.Where(t => t.gcode == vGcode && t.id == uid.Key && t.pdate.CompareTo(str_sd) >= 0 && t.pdate.CompareTo(str_ed) < 0).ToList();
 | |
| 
 | |
|                 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 = 0.0;
 | |
|                     if (userdata.Any()) hrs = (double)userdata.Sum(t => t.hrs);
 | |
| 
 | |
|                     //자료를 입력하지 않았거나, 입력시간이 8시간 미만이면 경고한다
 | |
|                     if (hrs < 8.0)
 | |
|                     {
 | |
|                         //WarnList.Add(dt, hrs);
 | |
|                         totWarnList.Add(new ReportUserData { date = dt, hrs = hrs, uid = uid.Key, uname = uid.Value }); //전체알림시에 사용하는 목록
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             if (totWarnList.Count > 0)
 | |
|             {
 | |
|                 Console.WriteLine($"주간 경고 데이터는 {totWarnList.Count} 건 입니다");
 | |
| 
 | |
|                 //오늘잘짜로 등록된 자료가 있으면 처리하지 안흔다.
 | |
|                 //해당 사용자의 오늘 날짜로 등록된 자동 데이터가 있다면 대상에 넣지 않는다
 | |
|                 db = new EEEntities();
 | |
| 
 | |
|                 var mail_subject = MailJW.subject;
 | |
|                 var mail_to = MailJW.tolist;//.Replace("{담당자}", userinfo.email);
 | |
|                 var pmail_cc = new List<string>(); //
 | |
|                 if (MailJW.cc != null) pmail_cc = MailJW.cc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).ToList();//.Replace("{담당자}", userinfo.email);
 | |
|                 var mail_bcc = string.Empty;
 | |
|                 if (MailJW.bcc != null) mail_bcc = MailJW.bcc;//.Replace("{담당자}", userinfo.email);
 | |
|                 var mail_body = MailJW.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();
 | |
|                 foreach (var item in usergrplist)
 | |
|                 {
 | |
|                     var fitem = item.FirstOrDefault();
 | |
|                     db = new EEEntities();
 | |
|                     var userinfo = db.vGroupUser.Where(t => t.id == fitem.uid).FirstOrDefault();
 | |
|                     var username = string.Empty;
 | |
|                     if (userinfo != null)
 | |
|                     {
 | |
|                         if (string.IsNullOrEmpty(userinfo.email) == false)
 | |
|                         {
 | |
|                             //if (pmail_cc.Contains(userinfo.email) == false)
 | |
|                             //    pmail_cc.Add(userinfo.email);
 | |
|                         }
 | |
|                         username = userinfo.name;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 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}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, MailJW.exceptmail);
 | |
|                 if (string.IsNullOrEmpty(mail_to) == false)
 | |
|                 {
 | |
|                     db.MailData.Add(new MailData
 | |
|                     {
 | |
|                         gcode = vGcode,
 | |
|                         cate = "JW",
 | |
|                         subject = mail_subject,
 | |
|                         fromlist = "EETGW@amkor.co.kr",
 | |
|                         tolist = MailSort(mail_to, MailJW.exceptmail),
 | |
|                         bcc = mail_bcc,
 | |
|                         cc = MailSort(mail_cc, MailJW.exceptmailcc),
 | |
|                         pdate = DateTime.Now.ToShortDateString(),
 | |
|                         body = mail_body.Replace("{내용}", vmail_body),
 | |
|                         wuid = "395552",
 | |
|                         wdate = DateTime.Now,
 | |
|                     });
 | |
|                     db.SaveChanges();
 | |
|                     Console.WriteLine("주간 알림데이터가 등록되었습니다");
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     Console.WriteLine("받는사람이 소거되어 메일을 생성하지 않습니다");
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| }
 | 
