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) { 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; if (tbProcess.SelectedIndex < 0) tbProcess.SelectedIndex = 0; //사용자 목록을 선택한다 UpdateUserList(); refrehData(); binit = true; } void UpdateUserList() { var ta = new dsPRJTableAdapters.vJobReportForUserListTableAdapter(); cmbUser.Items.Clear(); //일반사용자 목록 가져온다 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); //해당 공정의 인원만 처리한다 foreach (var dr in userlist) { //var dr = item.First(); cmbUser.Items.Add(String.Format("[{0}] {1}", dr.id, dr.name)); } if (tbProcess.SelectedIndex > 0) cmbUser.Text = string.Format("[{0}] {1}", FCOMMON.info.Login.no, FCOMMON.info.Login.nameK); if (cmbUser.SelectedIndex < 0) cmbUser.SelectedIndex = 0; //기본전체로 선택해준다. } void refrehData() { //근문일수,시간 // var vSD = dts.Value.ToShortDateString(); //var vED = dte.Value.ToShortDateString(); string prcname = tbProcess.SelectedIndex < 1 ? "%" : tbProcess.Text.Trim(); var taH = new dsReportTableAdapters.UserScheduleTableTableAdapter(); var username = cmbUser.Text.Trim(); var uid = username.Substring(1, username.IndexOf("]") - 1);// "395552"; taH.Fill(this.dsReport.UserScheduleTable, FCOMMON.info.Login.gcode, "%" + uid + "%"); //this.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout); //this.reportViewer1.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.PageWidth; //this.reportViewer1.RefreshReport(); //그리드뷰 생성 this.dv1.Rows.Clear(); this.dv1.Columns.Clear(); fp1.ActiveSheet.RowCount = 0; fp1.ActiveSheet.Columns.Clear(); var wekklist = new string[] { "일", "월", "화", "수", "목", "금", "토" }; //날짜에 해당하는 열을 먼저 생성한다 dv1.Columns.Add("dvcu_pidx", "*"); dv1.Columns.Add("dvcu_title", "프로젝트"); dv1.Columns.Add("dvcu_title", "시작"); dv1.Columns.Add("dvcu_title", "만료"); 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 = "만료"; //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(int.Parse(curwwstr)); int ww = 0; foreach (dsReport.UserScheduleTableRow dr in dsReport.UserScheduleTable.Rows) { 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); dv1.ColumnHeadersDefaultCellStyle.Font = wwfont; foreach (var item in wwlist.OrderBy(t => t)) { var wwname = item.ToString("0000"); var yy1 = wwname.Substring(0, 2); var ww1 = wwname.Substring(2); dv1.Columns.Add("dvcu_ww" + item, $"w{ww1}\ny{yy1}"); dv1.Columns[dv1.Columns.Count - 1].Tag = item; dv1.Columns[dv1.Columns.Count - 1].DefaultCellStyle.NullValue = ""; dv1.Columns[dv1.Columns.Count - 1].DefaultCellStyle.Format = "N2"; dv1.Columns[dv1.Columns.Count - 1].DefaultCellStyle.Font = wwfont; dv1.Columns[dv1.Columns.Count - 1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; fp1.ActiveSheet.Columns.Add(colidx, 1); fp1.ActiveSheet.Columns[colidx++].Label = $"w{ww1}\ny{yy1}"; } //프로젝트별로 데이터를 표시한다. var grp_list = dsReport.UserScheduleTable.GroupBy(t => t.name).OrderBy(t => t.Key); var ridx = 0; foreach (var grp in grp_list) { var prjname = grp.Key; var sdate = grp.Max(t => t.sdate); var ddate = grp.Max(t => t.ddate); 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 = 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 = row; i < dv1.ColumnCount; i++) { var col = dv1.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.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 = 35; fp1.ActiveSheet.Columns[1].Width = 250; fp1.ActiveSheet.Columns[2].Width = 75; fp1.ActiveSheet.Columns[3].Width = 75; //cell formation foreach (DataGridViewRow dr in this.dv1.Rows) { for (int i = 4; i < dv1.ColumnCount; i++) { var cell = dr.Cells[i]; if (cell.Value == null) { cell.Style.BackColor = Color.White; continue; } if (cell.Value.ToString().Equals("O")) cell.Style.BackColor = Color.Green; else cell.Style.BackColor = Color.White; } } dv1.AutoResizeColumns(); return; dv1.Columns.Add("dvcu_hrs", "합계(h)"); dv1.Columns[dv1.Columns.Count - 1].DefaultCellStyle.BackColor = Color.LightGray; dv1.Columns.Add("dvcu_hrs", "비율(%)"); dv1.Columns[dv1.Columns.Count - 1].DefaultCellStyle.Format = "N2"; var TotHrs = dsReport.JobProjectTimes.Sum(t => t.hrs); //데이터를 추가한다. foreach (var dr in dsReport.JobProjectTimes.OrderByDescending(t => t.PrjStatus + t.PrjName).GroupBy(t => t.pidx)) { var pidx = dr.Key; var fdr = dr.First(); List row = new List(); row.Add(dr.Key); if (dr.Key == -1) { row.Add("--"); row.Add("비 프로젝트 업무"); } else { row.Add(fdr.PrjStatus); if (fdr.PrjName.isEmpty()) { row.Add($"{fdr.title}"); } else { row.Add($"{fdr.PrjName}"); } } //row.Add("--"); foreach (var item in wwlist) { var wwsum = dsReport.JobProjectTimes.Where(t => t.ww == item.ToString()).Sum(t => t.hrs); var wwhrs = 0.0; var hrsdata = dr.Where(t => t.ww == item.ToString()); if (hrsdata.Any()) wwhrs = hrsdata.Sum(t => t.hrs); var perc = 0.0; if (wwsum > 0) perc = (wwhrs / wwsum) * 100.0; if (perc == 0.0) row.Add(null); else row.Add(perc); } row.Add(dr.Sum(t => t.hrs)); var tperc = 0.0; if (TotHrs > 0) tperc = (dr.Sum(t => t.hrs) / TotHrs) * 100.0; row.Add(tperc); if (dr.Key == -1) dv1.Rows.Insert(0, row.ToArray()); else dv1.Rows.Add(row.ToArray()); } dv1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; dv1.Columns[0].DefaultCellStyle.BackColor = Color.LightGray; dv1.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; for (int i = 0; i < this.dv1.ColumnCount; i++) { var col = this.dv1.Columns[i]; if (col.Name.StartsWith("dvcu_ww") == false) continue; foreach (DataGridViewRow dvrow in this.dv1.Rows) { var c = dvrow.Cells[col.Index]; var v = c.Value; double hrs = 0.0; if (v != null) hrs = double.Parse(v.ToString()); if (hrs > 0) { c.Style.BackColor = Color.Gold; } else { c.Style.BackColor = Color.White; } } } //첫줄은 색상을 변경해준다. if (dv1.RowCount > 0) { var dvrow = dv1.Rows[0]; for (int i = 0; i < this.dv1.ColumnCount; i++) { var c = dvrow.Cells[i]; c.Style.BackColor = Color.LightGray; } } this.dv1.AutoResizeColumns(); } private void btSave_Click(object sender, EventArgs e) { dv1.ExportData(string.Empty); } private void btRefresh_Click(object sender, EventArgs e) { refrehData(); } private void tbProcess_SelectedIndexChanged(object sender, EventArgs e) { if (binit == false) return; UpdateUserList(); } private void button1_Click(object sender, EventArgs e) { var newsize = dv1.Columns[2].Width < 10 ? 100 : 5; this.dv1.SuspendLayout(); for (int i = 3; i < this.dv1.ColumnCount - 2; i++) { this.dv1.Columns[i].Width = newsize; } this.dv1.ResumeLayout(); } private void linkLabel7_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { } private void linkLabel13_Click(object sender, EventArgs e) { //var lnk = sender as LinkLabel; //if (lnk.Text.Equals("상반기")) //{ // dts.Value = DateTime.Parse(DateTime.Now.Year.ToString("0000") + "-01-01"); // dte.Value = DateTime.Parse(DateTime.Now.Year.ToString("0000") + "-05-31"); //} //else if (lnk.Text.Equals("하반기")) //{ // dts.Value = DateTime.Parse(DateTime.Now.Year.ToString("0000") + "-06-01"); // dte.Value = DateTime.Parse(DateTime.Now.Year.ToString("0000") + "-12-31"); //} //else //{ // if (int.TryParse(lnk.Text.Substring(0, 2), out int mon) == false) return; // dts.Value = DateTime.Parse(DateTime.Now.Year.ToString("0000") + "-" + mon.ToString("00" + "-01")); // dte.Value = dts.Value.AddMonths(1).AddDays(-1); //} } private void linkLabel14_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { } } }