Files
Groupware/SubProject/FPJ0000/JobReport_/fJobChartMenu.cs
2023-07-12 17:22:24 +09:00

524 lines
23 KiB
C#

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 fJobChartMenu : Form
{
Boolean binit = false;
public fJobChartMenu()
{
InitializeComponent();
Properties.Settings.Default["gwcs"] = FCOMMON.info.CS;
Properties.Settings.Default["EEEntities"] = FCOMMON.info.CS;
Properties.Settings.Default["EEEntitiesLayout"] = FCOMMON.info.CS;
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 fJobChartMenu_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.Show();
Application.DoEvents();
var file = FCOMMON.Util.CurrentPath + "ReportProjectSummary.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("--전체--");
var userList = FCOMMON.DBM.getUserTable(1);
//일반사용자 목록 가져온다
//IQueryable<IGrouping<String, vJobReportForUser>> userlist;
//공정구분없이 전체사용자를 가져온다
foreach (System.Data.DataRow item in userList.Rows)
{
var id = item.Field<string>("id");
var dispname = item.Field<string>("dispname");
var process = item.Field<string>("process");
if (tbProcess.SelectedIndex > 0 && tbProcess.Text.Equals(process) == false) continue;
cmbUser.Items.Add(dispname);
}
//if (tbProcess.SelectedIndex <= 0)
//{
//}
//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); //해당 공정의 인원만 처리한다
if (tbProcess.SelectedIndex > 0)
cmbUser.Text = string.Format("{1}({0})", FCOMMON.info.Login.no, FCOMMON.info.Login.nameK);
if (cmbUser.SelectedIndex < 0) cmbUser.SelectedIndex = 0; //기본전체로 선택해준다.
}
string getUserID()
{
var si = cmbUser.Text.LastIndexOf("(");
var ei = cmbUser.Text.LastIndexOf(")");
var retval = cmbUser.Text.Substring(si + 1, ei - si - 1);
return retval;
}
void refrehData()
{
var db = new EEEntities();
progressBar1.Value = 0;
progressBar1.Maximum = 10;
fpSpread1.Visible = false;
//조회공정
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, 4].Value = dts.Value;
//종료일:G4
this.fpSpread1.Sheets[0].Cells[3, 5].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, 6].Value = 0;
else this.fpSpread1.Sheets[0].Cells[3, 6].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<vJobReportForUser> baseData;
var userCount = 0;
if (cmbUser.SelectedIndex > 0)
{
//사용자번호
var UserNo = getUserID();// cmbUser.Text.Substring(1, cmbUser.Text.IndexOf(']') - 1);
userCount = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.id == UserNo).GroupBy(t=>t.id).Count();
}
else if (tbProcess.SelectedIndex > 0)
{
userCount = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.userProcess == tbProcess.Text).GroupBy(t => t.id).Count();
}
else
{
userCount = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode).GroupBy(t => t.id).Count();
}
//사용자로 그룹해서 수량을 세명 , 사용자 숫자가 된다.
this.fpSpread1.Sheets[0].Cells[3, 7].Value = userCount;// baseData.GroupBy(t => t.id).Count(); //인원수
var col = 0;
var row = 0;
//해당 그룹의 기간데이터를 가져온다
if (cmbUser.SelectedIndex > 0)
{
//사용자번호
var UserNo = getUserID();// 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[2].Cells[row, 0].Value = dr.name;
this.fpSpread1.Sheets[2].Cells[row, 1].Value = dr.id;
this.fpSpread1.Sheets[2].Cells[row, 2].Value = item.Sum(t => t.hrs);
this.fpSpread1.Sheets[2].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[3].Cells[row, col++].Value = item.id;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.name;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.pdate;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.userProcess;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.process;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.svalue;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.hrs;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.ot;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.requestpart;
this.fpSpread1.Sheets[3].Cells[row, col++].Value = item.package;
row += 1;
}
// var dtRaw = db.vJobReportForUser.Where(t => t.gcode == FCOMMON.info.Login.gcode && t.pdate.CompareTo(vSD) >= 0 && t.pdate.CompareTo(vED) <= 0);
//공정목록(우측으로 전개함)
col = 2;
var orTypeName = baseData.Where(t => t.svalue != "휴가").OrderBy(t => t.process).GroupBy(t => t.process);
this.fpSpread1.ActiveSheetIndex = 0;
foreach (var item in orTypeName)
{
var dr = item.FirstOrDefault();
this.fpSpread1.Sheets[0].Cells[6, col++].Value = dr.process;
if (col == 82) break; //목록개수를 넘었으니 더이상 진행하지 못한다 이것들은 모두 ETC에 넣는다
//col += 1;
}
//나머지 열을 * 로 채운다
for (int i = col; i < 82; i++)
{
this.fpSpread1.Sheets[0].Cells[6, i].Value = "*";
this.fpSpread1.Sheets[0].Columns[i].Visible = (i < 8);//.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;
var orProcess = baseData.OrderBy(t => t.requestpart).GroupBy(t => t.requestpart);
this.fpSpread1.Sheets[0].RowCount = 7 + orProcess.Count() + 1;
progressBar1.Value = 0;
progressBar1.Maximum = orProcess.Count();
foreach (var item in orProcess)
{
progressBar1.Value += 1;
var RequestPart = item.FirstOrDefault().requestpart;
this.fpSpread1.Sheets[0].Cells[row, 1].Value = RequestPart;
//2번부터는 데이터를 넣어야 한다
double sumOt = 0.0;
//double holytime = 0.0;
int coldata = 2;
for (int i = 2; i < 82; 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.process == 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;
}
//ETC영역계산
{
//전체합산데이터와, 2~10까지의 데이터가 일치하지 않으면 그것이 ETC이다
var etchr = item.Where(t => t.hrs != null).Sum(t => (float)t.hrs);
var etcot = item.Where(t => t.ot != null).Sum(t => (float)t.ot);
//현재데이터의 hrs의 합
var subtotal = 0f;
for (int i = 2; i < 82; i++)
{
var ivalue = fpSpread1.Sheets[0].Cells[row, i].Value;
if (ivalue != null)
{
subtotal = subtotal + float.Parse(ivalue.ToString());
}
}
var etcval = (etchr + etcot) - subtotal;
if (etcval != 0f)
Console.WriteLine("sdf");
fpSpread1.Sheets[0].Cells[row, 82].Value = etcval;
}
fpSpread1.Sheets[0].Cells[row, 83].CellType = numberCellType1;
fpSpread1.Sheets[0].Cells[row, 83].ParseFormatString = "N1";
fpSpread1.Sheets[0].Cells[row, 83].Formula = string.Format("SUM(C{0}:CD{0})+CE{0}", row + 1);
fpSpread1.Sheets[0].Cells[row, 83].BackColor = Color.Gold;
fpSpread1.Sheets[0].Cells[row, 83].Border = new ComplexBorder(left, top, right, bottom);
fpSpread1.Sheets[0].Cells[row, 83].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 83].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
//H8 /$I$4
if (sumOt == 0.0) fpSpread1.Sheets[0].Cells[row, 84].Value = null; //OT합계
else fpSpread1.Sheets[0].Cells[row, 84].Value = sumOt; //OT합계
// process 의 휴가시간을 다시 계산한다.
var = baseData.Where(t => t.requestpart == RequestPart && t.svalue == "휴가");
if ( == null || .Count() < 1)
{
fpSpread1.Sheets[0].Cells[row, 85].Value = null;// 0.0; //휴가시간
}
else fpSpread1.Sheets[0].Cells[row, 85].Value = .Sum(t => t.hrs); //휴가시간
fpSpread1.Sheets[0].Cells[row, 84].Border = new ComplexBorder(left, top, right, bottom);
fpSpread1.Sheets[0].Cells[row, 84].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 84].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 85].Border = new ComplexBorder(left, top, right, bottom);
fpSpread1.Sheets[0].Cells[row, 85].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 85].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
for (int i = 1; i <= 82; i++)
{
if (i == 82) fpSpread1.Sheets[0].Cells[row, i].BackColor = Color.LightGray;
else 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;
Application.DoEvents();
}
//합계데이터
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 <= 82; i++)
{
char basec = 'C';
char newc = (char)(basec + (i - 2));
fpSpread1.Sheets[0].Cells[row, i].Formula = "SUM(" + ColumnAdress(i + 1) + "8:" + ColumnAdress(i + 1) + 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;
}
fpSpread1.Sheets[0].Cells[row, 83].CellType = numberCellType1;
fpSpread1.Sheets[0].Cells[row, 83].ParseFormatString = "N1";
fpSpread1.Sheets[0].Cells[row, 83].Formula = string.Format("SUM(C{0}:CD{0})+CE{0}", row + 1);
fpSpread1.Sheets[0].Cells[row, 83].BackColor = Color.Gold;
fpSpread1.Sheets[0].Cells[row, 83].Border = new ComplexBorder(left, top, right, bottom);
fpSpread1.Sheets[0].Cells[row, 83].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 83].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 84].Border = new ComplexBorder(left, top, right, bottom);
fpSpread1.Sheets[0].Cells[row, 84].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 84].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 85].Border = new ComplexBorder(left, top, right, bottom);
fpSpread1.Sheets[0].Cells[row, 85].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
fpSpread1.Sheets[0].Cells[row, 85].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
//포션값추가
row += 1;
this.fpSpread1.Sheets[0].RowCount = 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;
FarPoint.Win.Spread.CellType.PercentCellType pct = new FarPoint.Win.Spread.CellType.PercentCellType();
//numberCellType1.NegativeRed = true;
//numberCellType1.NullDisplay = "--";
for (int i = 2; i <= 82; i++)
{
fpSpread1.Sheets[0].Cells[row, i].Formula = ColumnAdress(i + 1) + row.ToString() + "/" + "CF" + row.ToString();
//fpSpread1.Sheets[0].Cells[row, i].BackColor = Color.LightGray;
fpSpread1.Sheets[0].Cells[row, i].CellType = pct;
//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;
}
//CI8데이터 추가
//fpSpread1_Sheet1.ColumnCount += 1;
for (int i = 8; i < row ; i++)
{
var cellname = "CI" + i.ToString();
fpSpread1.Sheets[0].Cells[cellname].Formula = $"CF{i}/CF{row}";
fpSpread1.Sheets[0].Cells[cellname].CellType = pct;
fpSpread1.Sheets[0].Cells[cellname].Border = new ComplexBorder(left, top, right, bottom);
fpSpread1.Sheets[0].Cells[cellname].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
fpSpread1.Sheets[0].Cells[cellname].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
}
this.fpSpread1.Sheets[0].RowCount = row + 1;
fpSpread1.Visible = true;
//FCOMMON.Util.MsgI("조회 완료");
}
public string ColumnAdress(int col)
{
if (col <= 26)
{
return Convert.ToChar(col + 64).ToString();
}
int div = col / 26;
int mod = col % 26;
if (mod == 0) { mod = 26; div--; }
return ColumnAdress(div) + ColumnAdress(mod);
}
private void tbProcess_SelectedIndexChanged(object sender, EventArgs e)
{
if (binit == false) return;
UpdateUserList();
//if (tbProcess.SelectedIndex >= 0) refrehData();
}
private void btRefresh_Click(object sender, EventArgs e)
{
refrehData();
}
private void btSave_Click(object sender, EventArgs e)
{
var sd = new SaveFileDialog();
sd.Filter = "excel(*.xls)|*.xls";
sd.FilterIndex = 0;
sd.FileName = "작업분포.xls";
if (sd.ShowDialog() == DialogResult.OK)
{
fpSpread1.SaveExcel(sd.FileName);
FCOMMON.Util.MsgE("파일저장완료\n" + sd.FileName);
}
}
private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
//이전달
var sd = dts.Value.AddMonths(-1);
var ed = sd.AddMonths(1);
dts.Value = sd;
dte.Value = ed;
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
//다음달
var sd = dts.Value.AddMonths(1);
var ed = sd.AddMonths(1);
dts.Value = sd;
dte.Value = ed;
}
}
}