using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace FPJ0000.JobReport_ { public partial class rJobReportPrjSche : Form { Boolean binit = false; public rJobReportPrjSche() { InitializeComponent(); this.WindowState = FormWindowState.Maximized; } private void rJobReport_Load(object sender, EventArgs e) { var myCI = new System.Globalization.CultureInfo("ko-KR"); var myCal = myCI.Calendar; var myCWR = myCI.DateTimeFormat.CalendarWeekRule; DayOfWeek myFirstDOW = myCI.DateTimeFormat.FirstDayOfWeek; var dat = myCal.GetWeekOfYear(DateTime.Now, myCWR, myFirstDOW); tbWW.Tag = dat; tbWW.Text = $"ww{dat:00}"; this.tbProcess.Items.Clear(); tbProcess.Items.Add("--전체--"); var taProcess = new dsReportTableAdapters.ProcessListTableAdapter(); var dtProcessList = taProcess.GetData(FCOMMON.info.Login.gcode); foreach (dsReport.ProcessListRow dr in dtProcessList.Rows) tbProcess.Items.Add(dr.processs); //this.tbProcess.Text = FCOMMON.info.Login.process; tbProcess.SelectedIndex = 0; tbProcess.Enabled = false; //사용자 목록을 선택한다 UpdateUserList(); refrehData(); binit = true; } void UpdateUserList() { var ta = new dsPRJTableAdapters.vJobReportForUserListTableAdapter(); cmbUser.Items.Clear(); cmbUser.Items.Add("--전체--"); ; //일반사용자 목록 가져온다 dsPRJ.vJobReportForUserListDataTable userlist; if (tbProcess.SelectedIndex <= 0) { //공정구분없이 전체사용자를 가져온다 userlist = ta.GetData(FCOMMON.info.Login.gcode, "%"); // db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode).OrderBy(t => t.name).GroupBy(t => t.name); } else { userlist = ta.GetData(FCOMMON.info.Login.gcode, tbProcess.Text); //db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.userProcess == tbProcess.Text).OrderBy(t => t.name).GroupBy(t => t.name); } //if (tbProcess.SelectedIndex != 0) userlist = userlist.Where(t => t.processs == tbProcess.Text); //해당 공정의 인원만 처리한다 uids = new List(); names = new List(); foreach (var dr in userlist) { //var dr = item.First(); cmbUser.Items.Add(String.Format("[{0}] {1}", dr.id.Trim(), dr.name.Trim())); uids.Add(dr.id.Trim()); names.Add(dr.name.Trim()); } //if (tbProcess.SelectedIndex > 0) cmbUser.Text = string.Format("[{0}] {1}", FCOMMON.info.Login.no, FCOMMON.info.Login.nameK); if (cmbUser.SelectedIndex < 0 && cmbUser.Items.Count > 0) cmbUser.SelectedIndex = 0; //기본전체로 선택해준다. } List uids, names; void refrehData() { //근문일수,시간 // var vSD = dts.Value.ToShortDateString(); //var vED = dte.Value.ToShortDateString(); var curww = int.Parse(DateTime.Now.ToString("yy") + "00") + int.Parse(tbWW.Tag.ToString()); string prcname = tbProcess.SelectedIndex < 1 ? "%" : tbProcess.Text.Trim(); var taH = new dsReportTableAdapters.UserScheduleTableTableAdapter(); var username = cmbUser.Text.Trim(); var userfilter = "%"; var uid = string.Empty; if (cmbUser.SelectedIndex > 0) { uid = username.Substring(1, username.IndexOf("]") - 1);// "395552"; userfilter = cmbUser.SelectedIndex == 0 ? "%" : "%" + uid + "%"; } taH.Fill(this.dsReport.UserScheduleTable, FCOMMON.info.Login.gcode, userfilter); //담당자별로 데이터를 쪼개야한다 230209 var dtnew = new dsReport.UserScheduleTableDataTable(); foreach (dsReport.UserScheduleTableRow dr in dsReport.UserScheduleTable) { var userlist = dr.uid.Replace(",", "/").Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); var namelist = dr.uidname.Replace(",", "/").Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < userlist.Length; i++) { var userid = userlist[i].Trim(); if (uid.isEmpty() == false && uid.Equals(userid) == false) continue; var usernm = userid; if (userlist.Length == namelist.Length) usernm = namelist[i].Trim(); //없는 사용자 제외 if (uids.Contains(userid) == false && names.Contains(usernm) == false) continue; //모든 컬럼의 데이터를 쓴다 단 idx는 제외한다 var newdr = dtnew.NewUserScheduleTableRow(); newdr.idx = dtnew.Rows.Count; newdr.uid = userid.Trim(); newdr.uidname = usernm.Trim(); foreach (DataColumn dc in dtnew.Columns) { var colname = dc.ColumnName.ToLower(); if (colname.Equals("idx")) continue; if (colname.Equals("uid")) continue; if (colname.Equals("uidname")) continue; newdr[colname] = dr[colname]; } newdr.userprocess = newdr.userprocess.Trim(); dtnew.AddUserScheduleTableRow(newdr); } } //this.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout); //this.reportViewer1.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.PageWidth; //this.reportViewer1.RefreshReport(); //그리드뷰 생성 fp1.ActiveSheet.RowCount = 0; fp1.ActiveSheet.Columns.Clear(); var wekklist = new string[] { "일", "월", "화", "수", "목", "금", "토" }; var colidx = 0; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = "공정"; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = "담당자"; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = "사번"; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = "상태"; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = "프로젝트"; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = "시작"; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = "만료"; //dv1.Columns.Add("dvcu_hrs", "시간"); //오늘의WW추가 //var myCI = new System.Globalization.CultureInfo("ko-KR"); //var myCal = myCI.Calendar; //var myCWR = myCI.DateTimeFormat.CalendarWeekRule; //DayOfWeek myFirstDOW = myCI.DateTimeFormat.FirstDayOfWeek; //var dat = myCal.GetWeekOfYear(DateTime.Now, myCWR, myFirstDOW); //var curwwstr = (DateTime.Now.Year - 2000).ToString() + dat.ToString("00"); //ww컬럼생성 List wwlist = new List(); wwlist.Add(curww); int ww = 0; foreach (dsReport.UserScheduleTableRow dr in dtnew) { if (dr.sw.Equals("00-00") == false) { ww = int.Parse(dr.sw.Replace("-", "")); if (wwlist.Contains(ww) == false) wwlist.Add(ww); } if (dr.ew.Equals("00-00") == false) { ww = int.Parse(dr.ew.Replace("-", "")); if (wwlist.Contains(ww) == false) wwlist.Add(ww); } if (dr.swa.Equals("00-00") == false) { ww = int.Parse(dr.swa.Replace("-", "")); if (wwlist.Contains(ww) == false) wwlist.Add(ww); } if (dr.ewa.Equals("00-00") == false) { ww = int.Parse(dr.ewa.Replace("-", "")); if (wwlist.Contains(ww) == false) wwlist.Add(ww); } } //var wwlist = dsReport.UserScheduleTable.GroupBy(t => t.ww).Select(t => int.Parse(t.Key)).OrderBy(t => t).ToList(); var wwfont = new Font("Consolas", 8f); var curyystr = DateTime.Now.ToString("yy"); foreach (var item in wwlist.OrderBy(t => t)) { var wwname = item.ToString("0000"); var yy1 = wwname.Substring(0, 2); var ww1 = wwname.Substring(2); fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx].Tag = item; if (item == curww) //이번주라면? { fp1.ActiveSheet.Columns[colidx].Label = $"(ww{ww1:00})"; fp1.ActiveSheet.Columns[colidx].BackColor = Color.LightSlateGray; } else { if (curyystr.Equals(yy1)) fp1.ActiveSheet.Columns[colidx].Label = $"ww{ww1:00}"; //같은년도 else fp1.ActiveSheet.Columns[colidx].Label = $"ww{ww1:00}\ny{yy1}"; //다른년도 } colidx += 1; } //사용자별로 그룹을 먼저 짓는다 var ridx = 0; var gidx = 0; if (radioButton1.Checked) { //var grp_prc = dtnew.GroupBy(t => t.userprocess).OrderBy(t => t.Key); //foreach (var prc in grp_prc) { gidx += 1; var grp_user = dtnew.GroupBy(t => t.uid).OrderBy(t => t.Key); foreach (var user in grp_user) { //프로젝트별로 데이터를 표시한다. var grp_list = user.GroupBy(t => t.name).OrderBy(t => t.Key); foreach (var grp in grp_list) { var prjname = grp.Key; var sdate = grp.Max(t => t.sdate); var ddate = grp.Max(t => t.ddate); var uname = grp.Max(t => t.uidname); var status = grp.Max(t => t.status); var processName = grp.Max(t => t.userprocess); //string[] columns = new string[dv1.ColumnCount]; var row = 0; //columns[row++] = grp.Max(t => t.idx).ToString(); //columns[row++] = prjname; //columns[row++] = sdate; //columns[row++] = ddate; var cidx = 0; fp1.ActiveSheet.RowCount += 1;//.AddRows(ridx, 1); var ctdef = new FarPoint.Win.Spread.CellType.TextCellType(); ctdef.WordWrap = true; ctdef.Multiline = true; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = $"{processName}"; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = $"{uname}"; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = $"{user.Key}"; if (status.Equals("진행")) { fp1.ActiveSheet.Cells[ridx, cidx].BackColor = Color.White; fp1.ActiveSheet.Cells[ridx, cidx + 1].BackColor = Color.White; } else if (status.Equals("검토")) { fp1.ActiveSheet.Cells[ridx, cidx].BackColor = Color.SkyBlue; fp1.ActiveSheet.Cells[ridx, cidx + 1].BackColor = Color.SkyBlue; } fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = status;// grp.Max(t => t.idx); fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = prjname; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = sdate; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = ddate; //세부항목데이터를 넣는다 foreach (var dr in grp) { //예측일 var sw = dr.sw; if (sw.Equals("00-00")) continue; var ew = dr.ew; if (ew.Equals("00-00")) continue; var isw = int.Parse(sw.Replace("-", "")); var iew = int.Parse(ew.Replace("-", "")); bool first = true; int startcol = -1; int endcol = -1; for (int i = 4; i < fp1.ActiveSheet.ColumnCount; i++) { var col = fp1.ActiveSheet.Columns[i]; if (col.Tag == null) continue; var colno = int.Parse(col.Tag.ToString()); if (colno >= isw && colno <= iew) { // columns[i] = "O"; if (dr.complete || dr.progress > 99) fp1.ActiveSheet.Cells[ridx, i].BackColor = Color.Lime; else if (dr.progress < 50) fp1.ActiveSheet.Cells[ridx, i].BackColor = Color.Tomato; else fp1.ActiveSheet.Cells[ridx, i].BackColor = Color.Gold; if (first) { fp1.ActiveSheet.Cells[ridx, i].Value = dr.title + "\n" + dr.progress.ToString("N0") + "%"; fp1.ActiveSheet.Cells[ridx, i].Note = dr.title + "\n" + dr.progress.ToString("N0") + "%"; first = false; startcol = i; } else { endcol = i; } } fp1.ActiveSheet.Cells[ridx, i].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; fp1.ActiveSheet.Cells[ridx, i].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, i].Font = new Font("맑은 고딕", 7); fp1.ActiveSheet.Cells[ridx, i].CellType = ctdef; } if (startcol != -1 && endcol != -1) { fp1.ActiveSheet.AddSpanCell(ridx, startcol, 1, (endcol - startcol + 1)); // fp1.ActiveSheet.Cells[ridx, startcol].CellType = ctdef; } } // dv1.Rows.Add(columns); ridx += 1; } } } } else { //프로젝트 담당자 var grp_prj = dtnew.GroupBy(t => t.name).OrderBy(t => t.Key); foreach (var prj in grp_prj) { var grp_user = prj.GroupBy(t => t.uid).OrderBy(t => t.Key); foreach (var user in grp_user) { //프로젝트별로 데이터를 표시한다. var grp_prc = user.GroupBy(t => t.userprocess).OrderBy(t => t.Key); foreach (var prc in grp_prc) { var prjname = prc.Key; var sdate = prc.Max(t => t.sdate); var ddate = prc.Max(t => t.ddate); var uname = prc.Max(t => t.uidname); var status = prc.Max(t => t.status); //string[] columns = new string[dv1.ColumnCount]; var row = 0; //columns[row++] = grp.Max(t => t.idx).ToString(); //columns[row++] = prjname; //columns[row++] = sdate; //columns[row++] = ddate; var cidx = 0; fp1.ActiveSheet.RowCount += 1;//.AddRows(ridx, 1); var ctdef = new FarPoint.Win.Spread.CellType.TextCellType(); ctdef.WordWrap = true; ctdef.Multiline = true; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = prc.Key; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = uname; if (status.Equals("진행")) { fp1.ActiveSheet.Cells[ridx, cidx].BackColor = Color.White; fp1.ActiveSheet.Cells[ridx, cidx + 1].BackColor = Color.White; } else if (status.Equals("검토")) { fp1.ActiveSheet.Cells[ridx, cidx].BackColor = Color.SkyBlue; fp1.ActiveSheet.Cells[ridx, cidx + 1].BackColor = Color.SkyBlue; } fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = status;// grp.Max(t => t.idx); fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = prj.Key; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = sdate; fp1.ActiveSheet.Cells[ridx, cidx].CellType = ctdef; fp1.ActiveSheet.Cells[ridx, cidx].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, cidx++].Value = ddate; //세부항목데이터를 넣는다 foreach (var dr in prc) { //예측일 var sw = dr.sw; if (sw.Equals("00-00")) continue; var ew = dr.ew; if (ew.Equals("00-00")) continue; var isw = int.Parse(sw.Replace("-", "")); var iew = int.Parse(ew.Replace("-", "")); bool first = true; int startcol = -1; int endcol = -1; for (int i = 4; i < fp1.ActiveSheet.ColumnCount; i++) { var col = fp1.ActiveSheet.Columns[i]; if (col.Tag == null) continue; var colno = int.Parse(col.Tag.ToString()); if (colno >= isw && colno <= iew) { // columns[i] = "O"; if (dr.complete || dr.progress > 99) fp1.ActiveSheet.Cells[ridx, i].BackColor = Color.Lime; else if (dr.progress < 50) fp1.ActiveSheet.Cells[ridx, i].BackColor = Color.Tomato; else fp1.ActiveSheet.Cells[ridx, i].BackColor = Color.Gold; if (first) { fp1.ActiveSheet.Cells[ridx, i].Value = dr.title + "\n" + dr.progress.ToString("N0") + "%"; fp1.ActiveSheet.Cells[ridx, i].Note = dr.title + "\n" + dr.progress.ToString("N0") + "%"; first = false; startcol = i; } else { endcol = i; } } fp1.ActiveSheet.Cells[ridx, i].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; fp1.ActiveSheet.Cells[ridx, i].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fp1.ActiveSheet.Cells[ridx, i].Font = new Font("맑은 고딕", 7); fp1.ActiveSheet.Cells[ridx, i].CellType = ctdef; } if (startcol != -1 && endcol != -1) { fp1.ActiveSheet.AddSpanCell(ridx, startcol, 1, (endcol - startcol + 1)); // fp1.ActiveSheet.Cells[ridx, startcol].CellType = ctdef; } } // dv1.Rows.Add(columns); ridx += 1; } } } } fp1.ActiveSheet.FrozenColumnCount = 7; fp1.ActiveSheet.AllowNoteEdit = true; fp1.ActiveSheet.AutoUpdateNotes = true; for (int i = 0; i < fp1.ActiveSheet.RowCount; i++) { fp1.ActiveSheet.Rows[i].Height = 40; } fp1.ActiveSheet.Columns[0].Width = 90; fp1.ActiveSheet.Columns[1].Width = 50; fp1.ActiveSheet.Columns[2].Width = 50; fp1.ActiveSheet.Columns[3].Width = 35; fp1.ActiveSheet.Columns[4].Width = 250; fp1.ActiveSheet.Columns[5].Width = 75; fp1.ActiveSheet.Columns[6].Width = 75; return; } private void btSave_Click(object sender, EventArgs e) { //dv1.ExportData(string.Empty); var sd = new SaveFileDialog(); sd.Filter = "excel file|*.xlsx"; if (sd.ShowDialog() != DialogResult.OK) return; fp1.SaveExcel(sd.FileName); if (FCOMMON.Util.MsgQ("저장된 파일을 열까요?") == DialogResult.Yes) FCOMMON.Util.RunExplorer(sd.FileName); } private void btRefresh_Click(object sender, EventArgs e) { refrehData(); } private void tbProcess_SelectedIndexChanged(object sender, EventArgs e) { if (binit == false) return; UpdateUserList(); } private void cmbUser_SelectedIndexChanged(object sender, EventArgs e) { if (binit == false) return; refrehData(); } private void label2_Click(object sender, EventArgs e) { } } }