⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 terminaldata.cpp

📁 基于指纹技术的学生考勤系统
💻 CPP
字号:
// TerminalData.cpp : implementation file
//

#include "stdafx.h"
#include "FPSys.h"
#include "TerminalData.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTerminalData dialog
extern CDatabase m_db;
extern CString strVerifyMode[3]={"指纹","密码","ID号+密码+指纹"};
CTerminalData::CTerminalData(CWnd* pParent /*=NULL*/)
	: CDialog(CTerminalData::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTerminalData)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CTerminalData::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTerminalData)
	DDX_Control(pDX, IDC_CHECK_READNEW, m_checkReadnew);
	DDX_Control(pDX, IDC_CHECK_TIME, m_checkTime);
	DDX_Control(pDX, IDC_DTP_BEGIN, m_dtpBegin);
	DDX_Control(pDX, IDC_DTP_FINISH, m_dtpFinish);
	DDX_Control(pDX, IDC_LIST_TEMINALDATA, m_cTerminalData);
	DDX_Control(pDX, IDC_FK528KMCTRL1, m_cfkData);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTerminalData, CDialog)
	//{{AFX_MSG_MAP(CTerminalData)
	ON_BN_CLICKED(IDC_BTN_ALLGLOGDATA, OnBtnAllglogdata)
	ON_BN_CLICKED(IDC_BTN_CTRLTEMINAL, OnBtnCtrlteminal)
	ON_BN_CLICKED(IDC_BTN_GETATTENDDATA, OnBtnGetattenddata)
	ON_BN_CLICKED(IDC_BTN_REMOVEDATA, OnBtnRemovedata)
	ON_BN_CLICKED(IDC_BTN_REMOVETEMINAL, OnBtnRemoveteminal)
	ON_BN_CLICKED(IDC_BTN_SAVETODB, OnBtnSavetodb)
	ON_BN_CLICKED(IDC_CHECK_READNEW, OnCheckReadnew)
	ON_BN_CLICKED(IDC_CHECK_TIME, OnCheckTime)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTerminalData message handlers

void CTerminalData::OnBtnAllglogdata() 
{
	// TODO: Add your control notification handler code here
	long dwTMachineNumber;
	long dwEnrollNumber;
	long dwEMachineNumber;
	long dwVerifyMode;
	long dwYear,dwMonth;
	long dwDay, dwHour,dwMinute;
	m_cTerminalData.DeleteAllItems();

	if(!m_cfkData.ReadAllGLogData(dwMachineNumber))
	{
		MessageBox("读取信息失败!");
		return;
	}
	while(m_cfkData.GetAllGLogData(dwMachineNumber,&dwTMachineNumber,&dwEnrollNumber,
			&dwEMachineNumber,&dwVerifyMode,&dwYear,&dwMonth,&dwDay,&dwHour,&dwMinute))
	{
		if(1==m_checkTime.GetCheck())
		{
			BOOL IsIn;
			IsIn=ComparTime(dwYear,dwMonth,dwDay);
			if(!IsIn)
				continue;
		}
		if(1==m_checkReadnew.GetCheck())
		{
			BOOL IsIn;
			IsIn=IsInData(dwEnrollNumber,dwYear,dwMonth,dwDay,dwHour,dwMinute);
			if(IsIn)				//表示数据库已有该记录,则不显示出来
				continue;
		}
		InsertIntoItem(dwTMachineNumber,dwEnrollNumber,dwEMachineNumber,dwVerifyMode,
						dwYear,dwMonth,dwDay,dwHour,dwMinute);
	}
	m_cfkData.SetReadMark(false);	
}

void CTerminalData::OnBtnCtrlteminal() 
{
	// TODO: Add your control notification handler code here
	CTerminalCtrl dlg;
	dlg.DoModal();
}

void CTerminalData::OnBtnGetattenddata() 
{
	// TODO: Add your control notification handler code here
	long dwTMachineNumber;
	long dwEnrollNumber;
	long dwEMachineNumber;
	long dwVerifyMode;
	long dwYear,dwMonth;
	long dwDay, dwHour,dwMinute;
	if(m_cTerminalData.GetItemCount()!=-1)
		m_cTerminalData.DeleteAllItems();
	if(!m_cfkData.ReadGeneralLogData(dwMachineNumber))
	{
		MessageBox("读取信息失败!");
		return;
	}
	while(m_cfkData.GetGeneralLogData(dwMachineNumber,&dwTMachineNumber,&dwEnrollNumber,
			&dwEMachineNumber,&dwVerifyMode,&dwYear,&dwMonth,&dwDay,&dwHour,&dwMinute))
	{
		if(1==m_checkTime.GetCheck())
		{
			BOOL IsIn;
			IsIn=ComparTime(dwYear,dwMonth,dwDay);
			if(!IsIn)
				continue;
		}
		if(1==m_checkReadnew.GetCheck())
		{
			BOOL IsIn;
			IsIn=IsInData(dwEnrollNumber,dwYear,dwMonth,dwDay,dwHour,dwMinute);
			if(IsIn)				//表示数据库已有该记录,则不显示出来
				continue;
		}
		InsertIntoItem(dwTMachineNumber,dwEnrollNumber,dwEMachineNumber,dwVerifyMode,
						dwYear,dwMonth,dwDay,dwHour,dwMinute);
	}
	m_cfkData.SetReadMark(false);	
}

void CTerminalData::OnBtnRemovedata() 
{
	// TODO: Add your control notification handler code here
	m_cTerminalData.DeleteAllItems();
}

void CTerminalData::OnBtnRemoveteminal() 
{
	// TODO: Add your control notification handler code here
	
}

void CTerminalData::OnBtnSavetodb() 
{
	// TODO: Add your control notification handler code here
	/****************************************************************************************
	需要保存的数据包括: 考勤号,考勤时间(具体日期,包括时间),考勤机号,
	考勤类型(此值可由考勤时间与制度时间比较得出),考勤类型(指纹或密码)
	*****************************************************************************************/
	long iAttID,iMachineNum,iVerifyMod,iAttTypeID;
	CString strTime;
	
	int nIndex=m_cTerminalData.GetItemCount();
	for(int i=0;i<nIndex;i++)
	{
		CString tmp;
		tmp=m_cTerminalData.GetItemText(i,1);					//考勤号
		iAttID=atoi(tmp);
		
		strTime=m_cTerminalData.GetItemText(i,2);				//时间
		
		tmp=m_cTerminalData.GetItemText(i,3);					//考勤方式
		iVerifyMod=atoi(tmp);

		tmp=m_cTerminalData.GetItemText(i,4);	
		iMachineNum=atoi(tmp);									//考勤机号
		//下面处理出考勤类型
		/*******************取得考勤时间***********************************/
		int iHour;
		iHour=atoi(strTime.Mid(11,2));
		int iMinute;
		iMinute=atoi(strTime.Mid(14,2));
		int t=iHour*60+iMinute;
		/*******************取得考勤时间差*********************************/
		LPCTSTR FILE_NAME=".\\time.ini";
		int late=GetPrivateProfileInt("Time","Late",0,FILE_NAME);
		int lateID=GetPrivateProfileInt("Time","AttendID1",0,FILE_NAME);

		int absent=GetPrivateProfileInt("Time","Absent",0,FILE_NAME);
		int absentID=GetPrivateProfileInt("Time","AttendID2",0,FILE_NAME);
		
		int leave=GetPrivateProfileInt("Time","Leave",0,FILE_NAME);
		int leaveID=GetPrivateProfileInt("Time","AttendID3",0,FILE_NAME);
		/*******************取得上课时间段*********************************/
		/**************需要要时间段,上课时间,下课时间**********************/
		//CString ScheduleID,Uptime,Downtime;
		int iCount;
		TRY{
			BOOL IsSchedule=FALSE;
			int t1,t2;
			int iScheduleId;

			CRecordset rs(&m_db);
			rs.Open(CRecordset::dynaset,"select *from tab_CourseTime");
			while(!rs.IsEOF())
				rs.MoveNext();
			iCount=rs.GetRecordCount();		//获得记录条数
			rs.MoveFirst();
			while(!rs.IsEOF())
			{
				//下面取得每个每一行的数据并进行比较
				CString sUptime,sDowntime;
				CDBVariant var;
				rs.GetFieldValue((short)0,var,SQL_C_SLONG);
				if(var.m_dwType!=DBVT_NULL)
					iScheduleId=var.m_iVal;
				var.Clear();
				rs.GetFieldValue(1,sUptime);
				rs.GetFieldValue(2,sDowntime);
				t1=atoi(sUptime.Mid(11,2))*60+atoi(sUptime.Mid(14,2));
				t2=atoi(sDowntime.Mid(11,2))*60+atoi(sDowntime.Mid(14,2));
				if(CompareTime(t,t1,t2))
				{	IsSchedule=TRUE;break;}
				iCount--;
				rs.MoveNext();
			}
			if(iCount==0 && !IsSchedule)
			{
				CString str;
				str.Format("%d",i+1);
				m_DisableData+=str+" ";
			//	MessageBox(str);
				continue;
			}
			CString tmp;
			tmp.Format("%d",i+1);
			//由上面 while 循环知道了是在哪个时段的考勤,下面处理出考勤类型
			iAttTypeID=DealAttendIDOut(t,t1,t2);	/*返回0(正常),1(迟到),2(旷课),3(早退)*/
			if(!InsertToDB(iAttID,strTime,iAttTypeID,iMachineNum,iVerifyMod))
				m_IsInDB+=tmp+" ";
		}
		CATCH(CDBException,ex)
		{
			AfxMessageBox(ex->m_strError);
			AfxMessageBox(ex->m_strStateNativeOrigin);
		}
		AND_CATCH(CMemoryException,pEx)
		{
			pEx->ReportError();
			AfxMessageBox("memory exception");
		}
		AND_CATCH(CException,e)
		{
			TCHAR szError[100];
			e->GetErrorMessage(szError,100);
			AfxMessageBox(szError);
		}
		END_CATCH
	}
	CString msg;
	msg.Format("第"+m_DisableData+"为无效数据,"+"第"+m_IsInDB+"为重复数据");//+"第"+m_IsStore+"保存成功");
	GetDlgItem(IDC_STATIC_MSG)->SetWindowText(msg);
	MessageBox("所有有效数据已保存至数据库中!");
}

void CTerminalData::OnCheckReadnew() 
{
	// TODO: Add your control notification handler code here
	
}

void CTerminalData::OnCheckTime() 
{
	// TODO: Add your control notification handler code here
	if(1==m_checkTime.GetCheck())
	{
		GetDlgItem(IDC_DTP_BEGIN)->EnableWindow(TRUE);
		GetDlgItem(IDC_DTP_FINISH)->EnableWindow(TRUE);
	}
	else
	{
		GetDlgItem(IDC_DTP_BEGIN)->EnableWindow(FALSE);
		GetDlgItem(IDC_DTP_FINISH)->EnableWindow(FALSE);
	}
}

BOOL CTerminalData::ComparTime(long dwYear, long dwMonth, long dwDay)
{
	long lBegin,lFinish;
	CString sYear,sMonth,sDay;
	CTime ctime;

	m_dtpBegin.GetTime(ctime);
	sYear.Format("%d",ctime.GetYear());
	sMonth.Format("%d",ctime.GetMonth());
	sDay.Format("%d",ctime.GetDay());
	//0000 00 00
	lBegin=atoi(sYear)*10000+atoi(sMonth)*100+atoi(sDay);
	
	m_dtpFinish.GetTime(ctime);
	sYear.Format("%d",ctime.GetYear());
	sMonth.Format("%d",ctime.GetMonth());
	sDay.Format("%d",ctime.GetDay());
	lFinish=atoi(sYear)*10000+atoi(sMonth)*100+atoi(sDay);

	long temp;
	temp=dwYear*10000+dwMonth*100+dwDay;

	if(temp>=lBegin && temp<=lFinish)
		return TRUE;
	else
		return FALSE;
}

BOOL CTerminalData::IsInData(long dwEnrollNumber, long dwYear, long dwMonth, long dwDay, long dwHour, long dwMinute)
{
	CString t;
	CString sMo,sD,sH,sMi;
	if(dwMonth>10)
		sMo.Format("%d",dwMonth);
	else
		sMo.Format("0%d",dwMonth);
	if(dwDay>10)
		sD.Format("%d",dwDay);
	else
		sD.Format("0%d",dwDay);
	if(dwHour>10)
		sH.Format("%d",dwHour);
	else
		sH.Format("0%d",dwHour);
	if(dwMinute>10)
		sMi.Format("%d",dwMinute);
	else
		sMi.Format("0%d",dwMinute);

	t.Format("%d-%s-%s %s:%s:00",dwYear,sMo,sD,sH,sMi);
//	MessageBox(t);
	CString sql;
	sql.Format("select *from tab_AttendInfomation where AttendID=%d and TheDay>=%d",dwEnrollNumber,atoi(t));
	TRY{
		CRecordset rs(&m_db);
		rs.Open(CRecordset::dynaset,sql);
		if(!rs.IsEOF())
			return TRUE;
		return FALSE;	
	}	
	CATCH(CDBException,ex)
	{
		AfxMessageBox(ex->m_strError);
		AfxMessageBox(ex->m_strStateNativeOrigin);
	}
	AND_CATCH(CMemoryException,pEx)
	{
		pEx->ReportError();
		AfxMessageBox("memory exception");
	}
	AND_CATCH(CException,e)
	{
		TCHAR szError[100];
		e->GetErrorMessage(szError,100);
		AfxMessageBox(szError);
	}
	END_CATCH
}

void CTerminalData::InsertIntoItem(long dwTMachineNumber, long dwEnrollNumber, long dwEMachineNumber, long dwVerifyMode, long dwYear, long dwMonth, long dwDay, long dwHour, long dwMinute)
{
	int nIndex=m_cTerminalData.GetItemCount();
	int id=nIndex+1;
	LV_ITEM lvItem;
	lvItem.mask=LVIF_TEXT;
	lvItem.iItem=nIndex;
	lvItem.iSubItem=0;
	CString strEnrollNumber,strTime,strMachineNumber;
	
	CString temp;
	temp.Format("%d",id);
	strEnrollNumber.Format("%d",dwEnrollNumber);
	//	m_cTime(dwYear,dwMonth,dwDay,dwHour,dwMinute,0);
	CString strMonth,strDay,strHour,strMinute;
	if(dwMonth<10)
		strMonth.Format("0%d",dwMonth);
	else
		strMonth.Format("%d",dwMonth);
	if(dwDay<10)
		strDay.Format("0%d",dwDay);
	else
		strDay.Format("%d",dwDay);
	if(dwHour<10)
		strHour.Format("0%d",dwHour);
	else
		strHour.Format("%d",dwHour);
	if(dwMinute<10)
		strMinute.Format("0%d",dwMinute);
	else
		strMinute.Format("%d",dwMinute);
	
	strTime.Format("%d-%s-%s %s:%s",dwYear,strMonth,strDay,strHour,strMinute);
	
	strMachineNumber.Format("%d",dwMachineNumber);
	lvItem.pszText=(char*)(LPCTSTR)temp;					//编号
	m_cTerminalData.InsertItem(&lvItem);
	m_cTerminalData.SetItemText(nIndex,1,strEnrollNumber);	//考勤号
	m_cTerminalData.SetItemText(nIndex,3,strVerifyMode[dwVerifyMode-1]);
	m_cTerminalData.SetItemText(nIndex,2,strTime);
	m_cTerminalData.SetItemText(nIndex,4,strMachineNumber);
	id++;
}

int CTerminalData::DealAttendIDOut(int t, int t1, int t2)
{
	LPCTSTR FILE_NAME=".\\time.ini";
	CString strCaption;
	GetPrivateProfileString("Time","Caption","Default Caption",
							strCaption.GetBuffer(MAX_PATH),MAX_PATH,FILE_NAME);

	int late=GetPrivateProfileInt("Time","Late",0,FILE_NAME);
	int absent=GetPrivateProfileInt("Time","Absent",0,FILE_NAME);
	int leave=GetPrivateProfileInt("Time","Leave",0,FILE_NAME);

	int id1=GetPrivateProfileInt("Time","AttendID1",0,FILE_NAME);
	int id2=GetPrivateProfileInt("Time","AttendID2",0,FILE_NAME);
	int id3=GetPrivateProfileInt("Time","AttendID3",0,FILE_NAME);

	if(t<=t1 || t>=t2)		// 正常考勤
		return 0;
	if(t-t1<late)			//迟到情况
		return id1;	
	if(t-t1>late)				//旷课或早退情况
	{
		if((t2-t)>=leave)		//早退
			return id2;
		else
			return id3;			//旷课
	}
}

BOOL CTerminalData::InsertToDB(long iAttID, CString strTime, long iAttTypeID, long iMachineNum, long iVerifyMod)
{
	CString sql;
	TRY{
		sql.Format("select *from tab_AttendInfomation where AttendID=%d and TheDay='%s' ",
					iAttID,strTime);		
		CRecordset rs(&m_db);
		rs.Open(CRecordset::dynaset,sql);
		if(!rs.IsEOF())
			return FALSE;
		sql.Format("Insert into tab_AttendInfomation(AttendID,TheDay,AttendTypeID,VerifyMode,"
			"MachineNum) values(%ld,'%s',%ld,%ld,%ld)",
			iAttID,strTime,iAttTypeID,iVerifyMod,iMachineNum);
		TRACE(sql);
		m_db.ExecuteSQL(sql);
		return TRUE;
	}
	CATCH(CDBException,ex)
	{
		AfxMessageBox(ex->m_strError);
		AfxMessageBox(ex->m_strStateNativeOrigin);
	}
	AND_CATCH(CMemoryException,pEx)
	{
		pEx->ReportError();
		AfxMessageBox("memory exception");
	}
	AND_CATCH(CException,e)
	{
		TCHAR szError[100];
		e->GetErrorMessage(szError,100);
		AfxMessageBox(szError);
	}
	END_CATCH
}

BOOL CTerminalData::CompareTime(int t, int t1, int t2)
{
	if(t>t1-5 && t<t2+5)	//属于该时段内的考勤
		return true;
	else 
		return false;
}

BOOL CTerminalData::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	DWORD dwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|
					LVS_EX_ONECLICKACTIVATE|LVS_EX_UNDERLINEHOT;
	m_cTerminalData.SetExtendedStyle(dwExStyle);
	m_cTerminalData.InsertColumn(0,"编号",LVCFMT_CENTER,80);
	m_cTerminalData.InsertColumn(1,"考勤号",LVCFMT_CENTER,80);
	m_cTerminalData.InsertColumn(3,"考勤方式",LVCFMT_CENTER,120);
	m_cTerminalData.InsertColumn(2,"考勤时间",LVCFMT_CENTER,140);
	m_cTerminalData.InsertColumn(4,"考勤机号",LVCFMT_CENTER,100);

	GetDlgItem(IDC_DTP_BEGIN)->EnableWindow(FALSE);
	GetDlgItem(IDC_DTP_FINISH)->EnableWindow(FALSE);
	
	m_cfkData.SetReadMark(false);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -