239 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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 rJobReportPrj : Form
 | |
| 	{
 | |
| 		Boolean binit = false;
 | |
| 		public rJobReportPrj(string baseday)
 | |
| 		{
 | |
| 			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")).AddMonths(1).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();
 | |
| 
 | |
| 			//this.tbMon.Text = DateTime.Now.ToString("yyyy-MM");
 | |
| 			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.JobProjectTimesTableAdapter();
 | |
| 
 | |
| 			var username = cmbUser.Text.Trim();
 | |
| 
 | |
| 			var uid = username.Substring(1, username.IndexOf("]") - 1);// "395552";
 | |
| 
 | |
| 			taH.Fill(this.dsReport.JobProjectTimes, FCOMMON.info.Login.gcode, vSD, vED, 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();
 | |
| 
 | |
| 
 | |
| 			var wekklist = new string[] { "일", "월", "화", "수", "목", "금", "토" };
 | |
| 
 | |
| 			//날짜에 해당하는 열을 먼저 생성한다
 | |
| 
 | |
| 			dv1.Columns.Add("dvcu_pidx", "*");
 | |
| 			dv1.Columns.Add("dvcu_title", "프로젝트");
 | |
| 			//dv1.Columns.Add("dvcu_hrs", "시간");
 | |
| 
 | |
| 			//ww컬럼생성
 | |
| 			var wwlist = dsReport.JobProjectTimes.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)
 | |
| 			{
 | |
| 				dv1.Columns.Add("dvcu_ww" + item, $"{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.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.GroupBy(t => t.pidx))
 | |
| 			{
 | |
| 				var pidx = dr.Key;
 | |
| 				var fdr = dr.First();
 | |
| 
 | |
| 				List<object> row = new List<object>();
 | |
| 				row.Add(dr.Key);
 | |
| 				if (dr.Key == -1) row.Add("Other");
 | |
| 				else row.Add(fdr.title);
 | |
| 				//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[1].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.Gray;
 | |
| 				}
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 
 | |
| 			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();
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
