using FarPoint.Win; 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 rJobReportUser : Form { Boolean binit = false; public rJobReportUser() { InitializeComponent(); this.WindowState = FormWindowState.Maximized; this.dts.Value = DateTime.Parse(DateTime.Now.AddMonths(-1).ToString("yyyy-MM-01")); this.dte.Value = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1); } 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(); //엑셀파일불러오기 var file = FCOMMON.Util.CurrentPath + "ReportForUser.xlsx"; this.fpSpread1.OpenExcel(file); if (this.fpSpread1.Sheets.Count > 1) this.fpSpread1.ActiveSheetIndex = 0; //refrehData(); binit = true; } void UpdateUserList() { var db = new EEEntities(); cmbUser.Items.Clear(); cmbUser.Items.Add("--전체--"); //일반사용자 목록 가져온다 IQueryable> userlist; if (tbProcess.SelectedIndex <= 0) { //공정구분없이 전체사용자를 가져온다 userlist = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode).OrderBy(t => t.name).GroupBy(t => t.name); } else { userlist = 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 item 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 db = new EEEntities(); //조회공정 this.fpSpread1.Sheets[0].Cells[3, 2].Value = tbProcess.Text; //담당자 this.fpSpread1.Sheets[0].Cells[3, 3].Value = cmbUser.Text; //시작일:F4 this.fpSpread1.Sheets[0].Cells[3, 5].Value = dts.Value; //종료일:G4 this.fpSpread1.Sheets[0].Cells[3, 6].Value = dte.Value; //근문일수,시간 var vSD = dts.Value.ToShortDateString(); var vED = dte.Value.ToShortDateString(); //휴가일수확인 var drDays = db.HolidayLIst.Where(t => t.free == false && t.pdate.CompareTo(vSD) >= 0 && t.pdate.CompareTo(vED) <= 0); //근무일수적용 if (drDays == null || drDays.Count() < 1) this.fpSpread1.Sheets[0].Cells[3, 7].Value = 0; else this.fpSpread1.Sheets[0].Cells[3, 7].Value = drDays.Count(); ComplexBorderSide left = new ComplexBorderSide(Color.Gray, 1); ComplexBorderSide top = new ComplexBorderSide(Color.Gray, 1); ComplexBorderSide right = new ComplexBorderSide(Color.Gray, 1); ComplexBorderSide bottom = new ComplexBorderSide(Color.Gray, 1); //사용자목록을 가져온다 List baseData; if (cmbUser.SelectedIndex > 0) { //사용자번호 var UserNo = cmbUser.Text.Substring(1, cmbUser.Text.IndexOf(']') - 1); baseData = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.id == UserNo).OrderBy(t => t.name).ToList(); } else if (tbProcess.SelectedIndex > 0) { baseData = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.userProcess == tbProcess.Text).OrderBy(t => t.name).ToList(); } else { baseData = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode).OrderBy(t => t.name).ToList(); } //사용자로 그룹해서 수량을 세명 , 사용자 숫자가 된다. this.fpSpread1.Sheets[0].Cells[3, 9].Value = baseData.GroupBy(t => t.id).Count(); //인원수 var col = 0; var row = 0; //해당 그룹의 기간데이터를 가져온다 if (cmbUser.SelectedIndex > 0) { //사용자번호 var UserNo = cmbUser.Text.Substring(1, cmbUser.Text.IndexOf(']') - 1); baseData = db.vJobReportForUser .Where(t => t.gcode == FCOMMON.info.Login.gcode && t.id == UserNo && t.pdate.CompareTo(vSD) >= 0 && t.pdate.CompareTo(vED) <= 0) .OrderBy(t => t.name) .OrderBy(t => t.pdate) .ToList(); } else if (tbProcess.SelectedIndex > 0) { baseData = db.vJobReportForUser .Where(t => t.gcode == FCOMMON.info.Login.gcode && t.pdate.CompareTo(vSD) >= 0 && t.pdate.CompareTo(vED) <= 0 && t.userProcess == tbProcess.Text) .OrderBy(t => t.name) .OrderBy(t => t.pdate) .ToList(); } else { baseData = db.vJobReportForUser .Where(t => t.gcode == FCOMMON.info.Login.gcode && t.pdate.CompareTo(vSD) >= 0 && t.pdate.CompareTo(vED) <= 0) .OrderBy(t => t.name) .OrderBy(t => t.pdate) .ToList(); } col = 0; row = 1; fpSpread1.Sheets[1].RowCount = baseData.GroupBy(t => t.id).Count() + 1; foreach (var item in baseData.GroupBy(t => t.id)) //사용자별로 그룹을 해서 { var dr = item.FirstOrDefault(); this.fpSpread1.Sheets[1].Cells[row, 0].Value = dr.name; this.fpSpread1.Sheets[1].Cells[row, 1].Value = dr.id; this.fpSpread1.Sheets[1].Cells[row, 2].Value = item.Sum(t => t.hrs); this.fpSpread1.Sheets[1].Cells[row, 3].Value = item.Sum(t => t.ot); row += 1; } fpSpread1.Sheets[1].ColumnCount = 5; fpSpread1.Sheets[1].RowCount = row + 1; //Raw dat a표시 row = 1; this.fpSpread1.Sheets[2].RowCount = baseData.Count + 1; foreach (var item in baseData) { col = 0; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.id; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.name; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.pdate; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.userProcess; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.process; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.svalue; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.hrs; this.fpSpread1.Sheets[2].Cells[row, col++].Value = item.ot; row += 1; } // var dtRaw = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.pdate.CompareTo(vSD) >= 0 && t.pdate.CompareTo(vED) <= 0); //인원분석보고용타입설1 col = 2; var orTypeName = baseData.Where(t => t.svalue != "휴가").OrderBy(t => t.svalue).GroupBy(t => t.svalue); this.fpSpread1.ActiveSheetIndex = 0; foreach (var item in orTypeName) { var dr = item.FirstOrDefault(); this.fpSpread1.Sheets[0].Cells[6, col++].Value = dr.svalue; //col += 1; } for (int i = col; i <= 6; i++) this.fpSpread1.Sheets[0].Cells[6, i].Value = "*"; System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("ko-KR", false); FarPoint.Win.Spread.CellType.NumberCellType numberCellType1 = new FarPoint.Win.Spread.CellType.NumberCellType(); numberCellType1.NegativeRed = true; numberCellType1.NullDisplay = "--"; //프로세스목록을 먼저 기록한다 row = 7; this.fpSpread1.Sheets[0].RowCount = 101; var orProcess = baseData.OrderBy(t => t.process).GroupBy(t => t.process); foreach (var item in orProcess) { var processName = item.FirstOrDefault().process; this.fpSpread1.Sheets[0].Cells[row, 1].Value = processName; //2번부터는 데이터를 넣어야 한다 double sumOt = 0.0; double holytime = 0.0; int coldata = 2; for (int i = 2; i <= 6; i++) { var colName = fpSpread1.Sheets[0].Cells[6, i].Value.ToString(); //이 이름에 해당하는 데이터의 시간을 가져온다 double ot = 0.0; double hrs = 0.0; if (colName != "*") { //double holytime = 0.0; var timeList = item.Where(t => t.svalue == colName); if (timeList != null) { hrs = (double)timeList.Sum(t => t.hrs); ot = (double)timeList.Sum(t => t.ot); sumOt += ot; } } if (ot + hrs == 0.0) fpSpread1.Sheets[0].Cells[row, coldata].Value = null; else fpSpread1.Sheets[0].Cells[row, coldata].Value = ot + hrs; //없음으로한다 coldata += 1; } fpSpread1.Sheets[0].Cells[row, 7].CellType = numberCellType1; fpSpread1.Sheets[0].Cells[row, 7].ParseFormatString = "N1"; fpSpread1.Sheets[0].Cells[row, 8].CellType = numberCellType1; fpSpread1.Sheets[0].Cells[row, 8].ParseFormatString = "N1"; fpSpread1.Sheets[0].Cells[row, 7].Formula = string.Format("SUM(C{0}:G{0})+K{0}", row + 1); fpSpread1.Sheets[0].Cells[row, 8].Formula = string.Format("H{0}/$I$4", row + 1); //H8 /$I$4 if(sumOt == 0.0) fpSpread1.Sheets[0].Cells[row, 9].Value = null; //OT합계 else fpSpread1.Sheets[0].Cells[row, 9].Value = sumOt ; //OT합계 // process 의 휴가시간을 다시 계산한다. var 휴가데이터 = baseData.Where(t => t.process == processName && t.svalue == "휴가"); if (휴가데이터 == null || 휴가데이터.Count() < 1) { fpSpread1.Sheets[0].Cells[row, 10].Value = null;// 0.0; //휴가시간 } else fpSpread1.Sheets[0].Cells[row, 10].Value = 휴가데이터.Sum(t => t.hrs); //휴가시간 for (int i = 1; i <= 10; i++) { fpSpread1.Sheets[0].Cells[row, i].BackColor = Color.White; fpSpread1.Sheets[0].Cells[row, i].Border = new ComplexBorder(left, top, right, bottom); fpSpread1.Sheets[0].Cells[row, i].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; fpSpread1.Sheets[0].Cells[row, i].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; } row += 1; } //합계데이터 fpSpread1.Sheets[0].Cells[row, 1].Value = "합계"; fpSpread1.Sheets[0].Cells[row, 1].BackColor = Color.LightGray; fpSpread1.Sheets[0].Cells[row, 1].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; fpSpread1.Sheets[0].Cells[row, 1].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; fpSpread1.Sheets[0].Cells[row, 1].Border = new ComplexBorder(left, top, right, bottom); for (int i = 2; i < 11; i++) { char basec = 'C'; char newc = (char)(basec + (i - 2)); fpSpread1.Sheets[0].Cells[row, i].Formula = "SUM(" + newc.ToString() + "8:" + newc.ToString() + row.ToString() + ")"; fpSpread1.Sheets[0].Cells[row, i].BackColor = Color.LightGray; fpSpread1.Sheets[0].Cells[row, i].CellType = numberCellType1; fpSpread1.Sheets[0].Cells[row, i].ParseFormatString = "N1"; fpSpread1.Sheets[0].Cells[row, i].CellType = numberCellType1; fpSpread1.Sheets[0].Cells[row, i].ParseFormatString = "N1"; fpSpread1.Sheets[0].Cells[row, i].Border = new ComplexBorder(left, top, right, bottom); fpSpread1.Sheets[0].Cells[row, i].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center; fpSpread1.Sheets[0].Cells[row, i].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center; } this.fpSpread1.Sheets[0].RowCount = row + 1; // this.ta.Fill(this.dsReport.JobReportDay, tbMon.Text, FCOMMON.info.Login.gcode); // //this.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout); // //this.reportViewer1.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.PageWidth; // //this.reportViewer1.RefreshReport(); // //그리드뷰 생성 // this.dataGridView1.Rows.Clear(); // this.dataGridView1.Columns.Clear(); // var Process = tbProcess.Text.Trim(); // if (Process == "%" || tbProcess.SelectedIndex == 0) Process = ""; // var wekklist = new string[] { "일","월","화","수","목","금","토" }; // //날짜에 해당하는 열을 먼저 생성한다 // dataGridView1.Columns.Add("dvcu_damdang", "사원명"); //// dataGridView1.Columns.Add("dvcu_process", "공정"); // var daylist = dsReport.JobReportDay.OrderBy(t=>t.pdate).GroupBy(t => t.pdate); // foreach (var dayitem in daylist) // { // var dtValue = DateTime.Parse(dayitem.Key); // if(dtValue.DayOfWeek == DayOfWeek.Saturday || dtValue.DayOfWeek == DayOfWeek.Sunday) // { // var week = wekklist[(int)dtValue.DayOfWeek]; // this.dataGridView1.Columns.Add("dvcu_pdate", dayitem.Key.Substring(8, 2) + "(" + week.ToString() + ")"); // } // else // { // this.dataGridView1.Columns.Add("dvcu_pdate", dayitem.Key.Substring(8, 2) ); // } // this.dataGridView1.Columns[this.dataGridView1.Columns.Count -1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // } // dataGridView1.Columns.Add("dvcu_sum", "합계"); // this.dataGridView1.Columns[this.dataGridView1.Columns.Count - 1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // foreach (var item in dsReport.JobReportDay.Where(t=>t.processs.Contains(Process)).OrderBy(t => t.uname + t.uid).GroupBy(t => t.uname)) // { // //사용자별로 데이터를 가져온다. // var username = item.Key; // var userid = item.FirstOrDefault().uid; // List rowdata = new List(); // rowdata.Add(username); // // rowdata.Add(item.FirstOrDefault().processs); // //이 사용자의 데이터를 날짜별로 정렬해서 가져온다. // var sum = 0.0; // var sumOT = 0.0; // for (int i = 1; i < this.dataGridView1.Columns.Count-1; i++) // { // var col = this.dataGridView1.Columns[i]; // var dayStr = col.HeaderText.Substring(0, 2); // var daydata = dsReport.JobReportDay.Where(t => t.uid == userid && t.pdate.EndsWith(dayStr)).FirstOrDefault(); // if (daydata != null) // { // sum += daydata.hrs; // sumOT += daydata.ot; // rowdata.Add((daydata.hrs.ToString() + "+" + daydata.ot.ToString())); // } // else rowdata.Add("--"); // } // rowdata.Add(sum.ToString() + "+" + sumOT.ToString()); // this.dataGridView1.Rows.Add(rowdata.ToArray()); // } // foreach(DataGridViewRow dvrow in this.dataGridView1.Rows) // { // for(int i = 1;i < this.dataGridView1.ColumnCount-1;i++) // { // var cellvalue = "--"; // if(dvrow.Cells[i].Value != null) cellvalue= dvrow.Cells[i].Value.ToString(); // if (cellvalue == "--") dvrow.Cells[i].Style.ForeColor = Color.Gray; // else // { // var datasplbu = cellvalue.Split('+'); // double hrs; // double ot; // if (double.TryParse(datasplbu[1], out ot) == false) ot = 0; // if(double.TryParse(datasplbu[0],out hrs)) // { // if (hrs > 8.0) dvrow.Cells[i].Style.ForeColor = Color.Blue; // else if (hrs < 8.0) dvrow.Cells[i].Style.ForeColor = Color.Red; // else // { // if (ot == 0) // dvrow.Cells[i].Style.ForeColor = Color.Black; // else // dvrow.Cells[i].Style.ForeColor = Color.Magenta; // } // } // else // { // FCOMMON.Util.MsgE("숫자변경실패 " + cellvalue); // dvrow.Cells[i].Style.ForeColor = Color.Red; // } // } // } // } // this.dataGridView1.AutoResizeColumns(); } private void button1_Click(object sender, EventArgs e) { refrehData(); } private void tbProcess_SelectedIndexChanged(object sender, EventArgs e) { if (binit == false) return; UpdateUserList(); //if (tbProcess.SelectedIndex >= 0) refrehData(); } private void panel1_Paint(object sender, PaintEventArgs e) { } } }