📄 attendancedlg.cpp
字号:
CWaitCursor wait;
Serialize(ar); // save mem_sCfgFile
ar.Close();
file.Close();
// m_sOpenPath=m_sSavePath;
m_iPay = sYearTotal[m_iMonths-1].iPay;
m_iMonths = -1;
}
}
if(m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.Format("%Y%m%d")==m_Time.Format("%Y%m%d"))
{
/* m_iPay = sYearTotal[m_iMonths].iPay;
m_iHoliday = sYearTotal[m_iMonths].iHoliday;
m_ArrayHoliday.SetSize(m_iHoliday);
for(int iIndex = 0; iIndex < m_iHoliday; ++iIndex)
m_ArrayHoliday[iIndex] = sYearTotal[m_iMonths].ArrayHoliday[iIndex];
for(int i=0;i<=m_iCurItem;i++)
sAttend[i] = sYearTotal[m_iMonths].sAttend[i];
*/ m_iCurItem = sYearTotal[m_iMonths].iDayItems;
sDuty.tAmOnDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOnDuty;
sDuty.tAmOffDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOffDuty;
sDuty.tPmOnDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOnDuty;
sDuty.tPmOffDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOffDuty;
sDuty.tNinOnDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOnDuty;
sDuty.tNinOffDuty=sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOffDuty;
sDuty.tWork=(sDuty.tAmOffDuty-sDuty.tAmOnDuty)+(sDuty.tPmOffDuty-sDuty.tPmOnDuty)+(sDuty.tNinOffDuty-sDuty.tNinOnDuty);
}
if(m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.Format("%Y%m")==m_Time.Format("%Y%m")
&& sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.GetDay()!=m_Time.GetDay())
{
sYearTotal[m_iMonths].iDayItems++;
m_iCurItem = sYearTotal[m_iMonths].iDayItems;
sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOnDuty=m_Time;
sYearTotal[m_iMonths].sAttend[m_iCurItem].tAmOffDuty=m_Time;
sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOnDuty=m_Time;
sYearTotal[m_iMonths].sAttend[m_iCurItem].tPmOffDuty=m_Time;
sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOnDuty=m_Time;
sYearTotal[m_iMonths].sAttend[m_iCurItem].tNinOffDuty=m_Time;
sYearTotal[m_iMonths].sAttend[m_iCurItem].tWork=m_Time-m_Time;
sDuty.tAmOnDuty=m_Time;
sDuty.tAmOffDuty=m_Time;
sDuty.tPmOnDuty=m_Time;
sDuty.tPmOffDuty=m_Time;
sDuty.tNinOnDuty=m_Time;
sDuty.tNinOffDuty=m_Time;
sDuty.tWork=m_Time-m_Time;
}
if(m_iMonths==-1 || (m_iMonths>=0 && sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.Format("%Y%m")!=m_Time.Format("%Y%m")))
{
m_iMonths++;
sYearTotal[m_iMonths].iPay = m_iMonths-1==-1 ? m_iPay : sYearTotal[m_iMonths-1].iPay;
if(m_iMonths==0)
{
CString s;
s.Format("%d元",sYearTotal[m_iMonths].iPay);
s = "祝贺您! 新的工作或新一年的工作又开始了!\n\n默认的或从上一年继承下来的月工资是:"+s;
s += "\n\n有没有变化? 如果有变化,请别忘记在\"月全勤工资\"一栏中改正过来!";
char* ch = s.GetBuffer(s.GetLength());
::MessageBox(NULL,ch,"提醒",MB_OK|MB_ICONQUESTION);
}
sYearTotal[m_iMonths].iFactPay =0;
sYearTotal[m_iMonths].iDayItems = 0;
/* m_ArrayHoliday.SetSize(m_iHoliday);
for(int iIndex = 0; iIndex < m_iHoliday; ++iIndex)
m_ArrayHoliday[iIndex] = sYearTotal[m_iMonths].ArrayHoliday[iIndex];
*/ sYearTotal[m_iMonths].sAttend[0].tAmOnDuty = m_Time;
sYearTotal[m_iMonths].sAttend[0].tAmOffDuty = m_Time;
sYearTotal[m_iMonths].sAttend[0].tPmOnDuty = m_Time;
sYearTotal[m_iMonths].sAttend[0].tPmOffDuty = m_Time;
sYearTotal[m_iMonths].sAttend[0].tNinOnDuty = m_Time;
sYearTotal[m_iMonths].sAttend[0].tNinOffDuty = m_Time;
sYearTotal[m_iMonths].sAttend[0].tWork=m_Time-m_Time;
sDuty.tAmOnDuty=m_Time;
sDuty.tAmOffDuty=m_Time;
sDuty.tPmOnDuty=m_Time;
sDuty.tPmOffDuty=m_Time;
sDuty.tNinOnDuty=m_Time;
sDuty.tNinOffDuty=m_Time;
sDuty.tWork=m_Time-m_Time;
m_iHoliday=0;
int year = sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetYear();
int mth = sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetMonth();
int monthday=MonthDay[mth-1];
if(mth==2 && fmod(year,4)==0)
monthday++;
int day = sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetDay();
int wk = sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.GetDayOfWeek();//1..7
int wks = day/7;
int surplus = fmod(day-1,7);//0..6
int wk1 = surplus>=wk ? wk+7-surplus : wk-surplus;
for(int i=0;i<monthday;i++)
{
wk = wk1+fmod(i,7);
if(wk>7) wk-=7;
if(wk==1 || wk==7)
{
//m_ArrayHoliday.Add(i+1);
sYearTotal[m_iMonths].ArrayHoliday[m_iHoliday] = i+1;//m_ArrayHoliday[m_iHoliday];
m_iHoliday++;
}
}
//m_iWorkDays=monthday-m_iHoliday;
sYearTotal[m_iMonths].iHoliday = m_iHoliday;
}
GetDutyData();
GetYearData();
m_bFirst=false;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CAttendanceDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CAttendanceDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CAttendanceDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
// Automation servers should not exit when a user closes the UI
// if a controller still holds on to one of its objects. These
// message handlers make sure that if the proxy is still in use,
// then the UI is hidden but the dialog remains around if it
// is dismissed.
void CAttendanceDlg::OnClose()
{
if (CanExit())
CDialog::OnClose();
}
void CAttendanceDlg::OnOK()
{
if (CanExit())
{
if(sYearTotal[0].sAttend[0].tAmOnDuty.GetYear()==m_Time.GetYear())
m_sAttendFile="考勤"+m_Time.Format("%Y年");
else
m_sAttendFile="考勤"+sYearTotal[0].sAttend[0].tAmOnDuty.Format("%Y年");
m_sAttendFile+=".atd";
CString filename=m_sSavePath+"\\"+m_sAttendFile;
m_sFileExt="atd";
CFile file;
if(file.Open(filename,CFile::modeWrite|CFile::modeCreate)!=0)
{
CArchive ar(&file,CArchive::store);
CWaitCursor wait;
Serialize(ar); // save mem_sCfgFile
ar.Close();
file.Close();
}
CDialog::OnOK();
}
}
void CAttendanceDlg::OnCancel()
{
if (CanExit())
CDialog::OnCancel();
}
BOOL CAttendanceDlg::CanExit()
{
// If the proxy object is still around, then the automation
// controller is still holding on to this application. Leave
// the dialog around, but hide its UI.
if (m_pAutoProxy != NULL)
{
ShowWindow(SW_HIDE);
return FALSE;
}
m_pChildFrame->ShowWindow(SW_SHOW); // destroy preview view
return TRUE;
}
void CAttendanceDlg::GetTableData()
{
m_ListAttend.DeleteAllItems();
CString str;
for(int j=0;j<=m_iCurItem;j++)
{
sAttend[j].tWork = sAttend[j].tAmOffDuty-sAttend[j].tAmOnDuty;
sAttend[j].tWork += sAttend[j].tPmOffDuty-sAttend[j].tPmOnDuty;
sAttend[j].tWork += sAttend[j].tNinOffDuty-sAttend[j].tNinOnDuty;
lvitem.iItem=j;
m_ListAttend.InsertItem(&lvitem);
str.Format("%d",sAttend[j].tAmOnDuty.GetDay());//j+1
m_ListAttend.SetItemText(j,0,str);
if(sAttend[j].tAmOnDuty!=0)
{
int n=sAttend[j].tAmOnDuty.GetDayOfWeek();
str=WeekTable[n-1];
m_ListAttend.SetItemText(j,1,str);
if(sAttend[j].tAmOnDuty==sAttend[j].tAmOffDuty)
{
str=_T(" ");
m_ListAttend.SetItemText(j,2,str);
m_ListAttend.SetItemText(j,3,str);
}
else
{
str=sAttend[j].tAmOnDuty.Format("%H:%M");
m_ListAttend.SetItemText(j,2,str);
str=sAttend[j].tAmOffDuty.Format("%H:%M");
m_ListAttend.SetItemText(j,3,str);
}
if(sAttend[j].tPmOnDuty==sAttend[j].tPmOffDuty)
{
str=_T(" ");
m_ListAttend.SetItemText(j,4,str);
m_ListAttend.SetItemText(j,5,str);
}
else
{
str=sAttend[j].tPmOnDuty.Format("%H:%M");
m_ListAttend.SetItemText(j,4,str);
str=sAttend[j].tPmOffDuty.Format("%H:%M");
m_ListAttend.SetItemText(j,5,str);
}
if(sAttend[j].tNinOnDuty==sAttend[j].tNinOffDuty)
{
str=_T(" ");
m_ListAttend.SetItemText(j,6,str);
m_ListAttend.SetItemText(j,7,str);
}
else
{
str=sAttend[j].tNinOnDuty.Format("%H:%M");
m_ListAttend.SetItemText(j,6,str);
str=sAttend[j].tNinOffDuty.Format("%H:%M");
m_ListAttend.SetItemText(j,7,str);
}
str=sAttend[j].tWork.Format("%H:%M");
m_ListAttend.SetItemText(j,8,str);
}
}
}
void CAttendanceDlg::Serialize(CArchive &ar)
{
if (ar.IsStoring() && m_sFileExt=="atd")
{
ar<<m_iTop;
ar<<m_iBottom;
ar<<m_iLeft;
ar<<m_iRight;
ar<<m_iMonths;
for(int i=0;i<=m_iMonths;i++)
{
ar<<sYearTotal[i].iPay;
ar<<sYearTotal[i].iFactPay;
ar<<sYearTotal[i].iHoliday;
for(int iIndex = 0; iIndex < sYearTotal[i].iHoliday; ++iIndex)
ar<<sYearTotal[i].ArrayHoliday[iIndex];
ar<<sYearTotal[i].iDayItems;
for(int j=0;j<=sYearTotal[i].iDayItems;j++)
{
ar<<sYearTotal[i].sAttend[j].tAmOnDuty;
ar<<sYearTotal[i].sAttend[j].tAmOffDuty;
ar<<sYearTotal[i].sAttend[j].tPmOnDuty;
ar<<sYearTotal[i].sAttend[j].tPmOffDuty;
ar<<sYearTotal[i].sAttend[j].tNinOnDuty;
ar<<sYearTotal[i].sAttend[j].tNinOffDuty;
}
}
}
else
{
ar>>m_iTop;
ar>>m_iBottom;
ar>>m_iLeft;
ar>>m_iRight;
ar>>m_iMonths;
for(int i=0;i<=m_iMonths;i++)
{
ar>>sYearTotal[i].iPay;
ar>>sYearTotal[i].iFactPay;
ar>>sYearTotal[i].iHoliday;
for(int iIndex = 0; iIndex < sYearTotal[i].iHoliday; ++iIndex)
ar>>sYearTotal[i].ArrayHoliday[iIndex];
ar>>sYearTotal[i].iDayItems;
for(int j=0;j<=sYearTotal[i].iDayItems;j++)
{
ar>>sYearTotal[i].sAttend[j].tAmOnDuty;
ar>>sYearTotal[i].sAttend[j].tAmOffDuty;
ar>>sYearTotal[i].sAttend[j].tPmOnDuty;
ar>>sYearTotal[i].sAttend[j].tPmOffDuty;
ar>>sYearTotal[i].sAttend[j].tNinOnDuty;//=sYearTotal[i].sAttend[j].tPmOffDuty;
ar>>sYearTotal[i].sAttend[j].tNinOffDuty;//=sYearTotal[i].sAttend[j].tPmOffDuty;
}
}
}
}
void CAttendanceDlg::OnColumnclickDuty(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty.GetYear()!=m_Time.GetYear())
{
*pResult = 0;
return;
}
int iSubItem=pNMListView->iSubItem;
UINT ui=pNMHDR->code;
bool b=sYearTotal[0].sAttend[0].tAmOnDuty.GetYear()==m_Time.GetYear();
switch(iSubItem)
{
case 0:
sDuty.tAmOnDuty=CTime::GetCurrentTime();
if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOnDuty=sDuty.tAmOnDuty;
case 1:
sDuty.tAmOffDuty=CTime::GetCurrentTime();
if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tAmOffDuty=sDuty.tAmOffDuty;
case 2:
sDuty.tPmOnDuty=CTime::GetCurrentTime();
if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tPmOnDuty=sDuty.tPmOnDuty;
case 3:
sDuty.tPmOffDuty=CTime::GetCurrentTime();
if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tPmOffDuty=sDuty.tPmOffDuty;
case 4:
sDuty.tNinOnDuty=CTime::GetCurrentTime();
if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tNinOnDuty=sDuty.tNinOnDuty;
case 5:
sDuty.tNinOffDuty=CTime::GetCurrentTime();
if(b) sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems].tNinOffDuty=sDuty.tNinOffDuty;
GetDutyData();
/* if(sAttend[m_iCurItem].tAmOnDuty.GetMonth()==m_Time.GetMonth())
{
sAttend[m_iCurItem]=sYearTotal[m_iMonths].sAttend[sYearTotal[m_iMonths].iDayItems];
m_ListAttend.DeleteItem(m_iCurItem);
lvitem.iItem=m_iCurItem;
m_ListAttend.InsertItem(&lvitem);
str.Format("%d",sAttend[m_iCurItem].tAmOnDuty.GetDay());//j+1
m_ListAttend.SetItemText(m_iCurItem,0,str);
sAttend[m_iCurItem].tWork = sAttend[m_iCurItem].tAmOffDuty-sAttend[m_iCurItem].tAmOnDuty;
sAttend[m_iCurItem].tWork += sAttend[m_iCurItem].tPmOffDuty-sAttend[m_iCurItem].tPmOnDuty;
n=sAttend[m_iCurItem].tAmOnDuty.GetDayOfWeek();
str=WeekTable[n-1];
m_ListAttend.SetItemText(m_iCurItem,1,str);
str=sAttend[m_iCurItem].tAmOnDuty.Format("%H:%M");
m_ListAttend.SetItemText(m_iCurItem,2,str);
str=sAttend[m_iCurItem].tAmOffDuty.Format("%H:%M");
m_ListAttend.SetItemText(m_iCurItem,3,str);
str=sAttend[m_iCurItem].tPmOnDuty.Format("%H:%M");
m_ListAttend.SetItemText(m_iCurItem,4,str);
str=sAttend[m_iCurItem].tPmOffDuty.Format("%H:%M");
m_ListAttend.SetItemText(m_iCurItem,5,str);
str=sAttend[m_iCurItem].tWork.Format("%H:%M");
m_ListAttend.SetItemText(m_iCurItem,6,str);
}
*/ if(b) GetYearData();
default:
break;
}
*pResult = 0;
}
void CAttendanceDlg::GetDutyData()
{
m_ListDuty.DeleteAllItems();
CString str;
lvitem.iItem=0;
m_ListDuty.InsertItem(&lvitem);
sDuty.tWork = sDuty.tAmOffDuty-sDuty.tAmOnDuty;
sDuty.tWork += sDuty.tPmOffDuty-sDuty.tPmOnDuty;
sDuty.tWork += sDuty.tNinOffDuty-sDuty.tNinOnDuty;
str=sDuty.tAmOnDuty.Format("%H:%M");
m_ListDuty.SetItemText(0,0,str);
str=sDuty.tAmOffDuty.Format("%H:%M");
m_ListDuty.SetItemText(0,1,str);
str=sDuty.tPmOnDuty.Format("%H:%M");
m_ListDuty.SetItemText(0,2,str);
str=sDuty.tPmOffDuty.Format("%H:%M");
m_ListDuty.SetItemText(0,3,str);
str=sDuty.tNinOnDuty.Format("%H:%M");
m_ListDuty.SetItemText(0,4,str);
str=sDuty.tNinOffDuty.Format("%H:%M");
m_ListDuty.SetItemText(0,5,str);
str=sDuty.tWork.Format("%H:%M");
m_ListDuty.SetItemText(0,6,str);
}
void CAttendanceDlg::OnHoliday()
{
// TODO: Add your control notification handler code here
CDualListDialog dlg;
dlg.m_pParentDlg=this;
if(dlg.DoModal()==IDOK)
{
m_dDayPay = (double)m_iPay/(double)m_iWorkDays;
m_iObtain=m_dFactWorks*m_dDayPay;
sYearTotal[m_iMonths].iHoliday = m_iHoliday;
for(int i=0;i<m_iHoliday;i++)
sYearTotal[m_iMonths].ArrayHoliday[i] = m_ArrayHoliday[i];
GetYearData();
//UpdateData(false);
}
}
void CAttendanceDlg::OnUpdatePay()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_UPDATE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
if(sYearTotal[m_iMonths].sAttend[0].tAmOnDuty.Format("%Y%m")!=m_Time.Format("%Y%m"))
return;
char buf[10];
int x=m_EdtPay.GetLine(0,buf,10);
buf[x]=0;
int i=atoi(buf);
if(i<0 || i>62000)
return;
m_iPay = i;
m_dDayPay = (double)m_iPay/(double)m_iWorkDays;
m_iObtain=m_dFactWorks*m_dDayPay;
sYearTotal[m_iMonths].iPay = m_iPay;
GetYearData();
// UpdateData(false);
}
void CAttendanceDlg::OnDelete()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -