// ClyfzAttendanceDlg.cpp : 实现文件 // #include "stdafx.h" #include "lyfzAttendance.h" #include "lyfzAttendanceDlg.h" #include "DlgTimeChoose.h" #include "DlgConfig.h" #include "Global.h" #include "DBInterface.h" #include "DataManager.h" #include "FpClockCtrlMgr.h" #include "FKAttendCtrlMgr.h" #include "ClearMgrDlg.h" #include "md5.h" const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(_T("lyfzAoXinItray")); #ifdef _DEBUG #define new DEBUG_NEW #endif ClyfzAttendanceDlg *g_phWnd = NULL; // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // ClyfzAttendanceDlg 对话框 ClyfzAttendanceDlg::ClyfzAttendanceDlg(CWnd* pParent /*=NULL*/) : CDialog(ClyfzAttendanceDlg::IDD, pParent) , m_trayIcon(IDR_MAINFRAME) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_dwRecord = 0; m_isNotify = TRUE; m_bNoticeTray = TRUE; m_bAutoRuning = AfxGetApp()->GetProfileInt(_T("lyfzAoXin"), _T("autoruning"), 0); memset(&m_Devicecfg, 0, sizeof(DEVICECFG)); } void ClyfzAttendanceDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_FP_CLOCKCTRL1, m_FP_CLOCK); DDX_Control(pDX, IDC_RICHEDIT21, m_TipsMsgWnd); DDX_Control(pDX, IDC_LIST3, m_ctrlListShow); } BEGIN_MESSAGE_MAP(ClyfzAttendanceDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_TIMER() ON_WM_DESTROY() ON_WM_CLOSE() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_MESSAGE(MSG_TRAY_NOTIFICATION, OnTrayNotification) ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskBarCreated) ON_COMMAND(Menu_Exit, &ClyfzAttendanceDlg::OnExit) ON_COMMAND(Menu_AutoRun, &ClyfzAttendanceDlg::OnAutorun) ON_COMMAND(Menu_ShowWindow, &ClyfzAttendanceDlg::OnShowwindow) ON_COMMAND(Menu_ReadAllLog, &ClyfzAttendanceDlg::OnReadalllog) ON_COMMAND(Menu_InitAttend, &ClyfzAttendanceDlg::OnInitAttend) ON_MESSAGE(MSG_SHOWPROMPTING, &ClyfzAttendanceDlg::ShowPrompting) ON_MESSAGE(MSG_SHOWREALTIMELOG, &ClyfzAttendanceDlg::ShowRealTimeLog) ON_BN_CLICKED(IDC_Config_BTN, &ClyfzAttendanceDlg::OnBnClickedConfig) ON_BN_CLICKED(IDC_ConnectSet_BTN, &ClyfzAttendanceDlg::OnBnClickedConnectSet) ON_BN_CLICKED(IDC_Black_BTN, &ClyfzAttendanceDlg::OnBnClickedBlack) ON_BN_CLICKED(IDC_Save_BTN, &ClyfzAttendanceDlg::OnBnClickedSaveBtn) ON_BN_CLICKED(IDC_FileLog_BTN, &ClyfzAttendanceDlg::OnBnClickedFilelogBtn) ON_BN_CLICKED(IDC_AllSubmit_BTN, &ClyfzAttendanceDlg::OnBnClickedAllsubmitBtn) ON_BN_CLICKED(IDC_SelSubmit_BTN, &ClyfzAttendanceDlg::OnBnClickedSelsubmitBtn) ON_BN_CLICKED(IDC_DelLog_BTN, &ClyfzAttendanceDlg::OnBnClickedDelLogBtn) ON_BN_CLICKED(IDC_RealTimeConfirm_BTN, &ClyfzAttendanceDlg::OnBnClickedRealtimeconfirmBtn) ON_BN_CLICKED(IDC_StopConfirm_BTN, &ClyfzAttendanceDlg::OnBnClickedStopconfirmBtn) ON_WM_DESTROY() //ON_BN_CLICKED(IDC_DB_CONNECT, &ClyfzAttendanceDlg::OnBnClickedDbConnect) ON_BN_CLICKED(IDC_ClearMgr_BTN, &ClyfzAttendanceDlg::OnBnClickedClearMgrBtn) END_MESSAGE_MAP() // ClyfzAttendanceDlg 消息处理程序 BOOL ClyfzAttendanceDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 g_hwnd = GetSafeHwnd(); g_phWnd = this; InitTrayIcon(); InitCtrlList(); ChangeCtrlStatus(1); //连接数据库 CDBInterface* pDBInterface = CDBInterface::GetInstance(); pDBInterface->GetIniInfo(); // 这一段,应该放在升级包里处理比较统一; if ( pDBInterface->OpenDatabase() ) ReadUserInfo();//获取员工信息 else pDBInterface->SolveDBError(WSAECONNRESET); if ( m_bAutoRuning ) { ShowWindow(SW_HIDE); OnBnClickedConnectSet(); } //读取ocx.ini文件 ReadConnectInfo(m_Devicecfg); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } /////////////////////////////////////////////////////////////////////////////// // 函数:ReadUserInfo // 说明:获取在职员工信息 // 参数: // 返回值:0成功,-1失败 // /////////////////////////////////////////////////////////////////////////////// int ClyfzAttendanceDlg::ReadUserInfo() { CDBInterface* pDBInterface = CDBInterface::GetInstance(); if(!pDBInterface->IsOpen()) return -1; m_strArrayRenyuan.RemoveAll(); //获取员工信息renyuan CString strfilter = _T("dimission='在职'"); std::vector vFieldName; vFieldName.push_back(_T("id")); vFieldName.push_back(_T("name")); vFieldName.push_back(_T("sex")); vFieldName.push_back(_T("loginno1")); vFieldName.push_back(_T("loginno2")); pDBInterface->GetDataBySelect(m_strArrayRenyuan, NAME_renyuan1, vFieldName, &strfilter); if(m_strArrayRenyuan.GetSize() == 0) { //查询新表dbo.View_UserInfo vFieldName.clear(); vFieldName.push_back(_T("Account")); vFieldName.push_back(_T("UserName")); vFieldName.push_back(_T("sex")); vFieldName.push_back(_T("loginnoID1")); vFieldName.push_back(_T("loginnoID2")); pDBInterface->GetDataBySelect(m_strArrayRenyuan, NAME_renyuan2, vFieldName, &strfilter); } return 0; } void ClyfzAttendanceDlg::InitCtrlList() { m_ctrlListShow.InsertColumn(0,_T("记录号")); m_ctrlListShow.SetColumnWidth(0,80); m_ctrlListShow.InsertColumn(1,_T("员工")); m_ctrlListShow.SetColumnWidth(1,100); m_ctrlListShow.InsertColumn( 2, _T("部门")); m_ctrlListShow.SetColumnWidth( 2, 100 ); m_ctrlListShow.InsertColumn( 3, _T("性别")); m_ctrlListShow.SetColumnWidth( 3, 100 ); m_ctrlListShow.InsertColumn( 4, _T("指纹ID")); m_ctrlListShow.SetColumnWidth( 4, 100 ); m_ctrlListShow.InsertColumn( 5, _T("打卡状态")); m_ctrlListShow.SetColumnWidth( 5, 100 ); m_ctrlListShow.InsertColumn( 6, _T("打卡时间")); m_ctrlListShow.SetColumnWidth( 6, 200); m_ctrlListShow.SetExtendedStyle(m_ctrlListShow.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); } void ClyfzAttendanceDlg::OnExit() { if(g_pCMachineMgrBase) { g_pCMachineMgrBase->CloseDevice(); delete g_pCMachineMgrBase; g_pCMachineMgrBase = NULL; } CDialog::OnOK(); } void ClyfzAttendanceDlg::OnShowwindow() { // TODO: 在此添加命令处理程序代码 ShowWindow(SW_SHOWNORMAL); } void ClyfzAttendanceDlg::OnAutorun() { m_bAutoRuning = !m_bAutoRuning; AfxGetApp()->WriteProfileInt(_T("lyfzAoXin"), _T("autoruning"), m_bAutoRuning); AddAutoSysRun((CHAR*)g_ModuleFileName, m_bAutoRuning); } void ClyfzAttendanceDlg::OnReadalllog() { CString strShow; TCHAR szOldLog[MAX_PATH] = {0}; wsprintf(szOldLog, _T("%s\\AllLog.txt"), g_ModulePath); if( FALSE == ::PathFileExists(szOldLog) ) { //LOG4C((LOG_NOTICE,"%s:不存在",szOldLog)); strShow.Format(_T("AllLog.txt不存在...")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); return; } CStringArray array; CStdioFile fp; if( !fp.Open(szOldLog, CFile::modeRead) ) { LOG4C((LOG_NOTICE,"%s:打开文件",szOldLog)); return; } CString strEnrollNumber; // 指纹ID; CString strDateTime; // 指纹登记时间; CString strTemp; fp.ReadString(strTemp); CString strFinder = _T(""); // Jeff.AllLog.txt里是用tab键分隔数据的; std::vector vtAllLog; STAllLog tagAllLog; // Jeff.一条记录里有4个tab键; LOG4C((LOG_NOTICE,"%s:read ready",szOldLog)); while( !feof(fp.m_pStream) ) { // Jeff.读一行数据; fp.ReadString(strTemp); // Jeff.第一个tab键前的数据是记录数; int pos = strTemp.Find(strFinder); if(pos == -1) { // WriteLogin("返回1"); continue; } strTemp = strTemp.Right(strTemp.GetLength()-pos-1); // Jeff.第二个tab键前的数据是指纹ID号; pos = strTemp.Find(strFinder); if(pos == -1) { //WriteLogin("返回2"); continue; } strEnrollNumber = strTemp.Left(pos); strTemp=strTemp.Right(strTemp.GetLength()-pos-1); // Jeff.第三个tab键前的数据是Verify(验证什么未知)字段; pos = strTemp.Find(strFinder); if(pos == -1) { //WriteLogin("返回3"); continue; } strTemp = strTemp.Right(strTemp.GetLength()-pos-1); // Jeff.第四个tab键前的数据是InOut字段; pos = strTemp.Find(strFinder); if(pos == -1) { //WriteLogin("返回4"); continue; } // Jeff.最后的字段内容是指纹登记时间; strDateTime = strTemp.Right(strTemp.GetLength()-pos-1); strEnrollNumber.TrimLeft(); strEnrollNumber.TrimRight(); strDateTime.TrimLeft(); strDateTime.TrimRight(); strDateTime.Replace(_T("/"), _T("-")); tagAllLog.strEnrollNumber = strEnrollNumber; tagAllLog.strDateTime = strDateTime; vtAllLog.push_back(tagAllLog); } strShow.Format(_T("读取AllLog.txt完毕,记录数=%d,即将提交数据..."),vtAllLog.size()); SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0); Sleep(10); CDataManager::GetInstance()->ReadOldLog(vtAllLog); } // 从文件中读出数据,并初始指纹机里的管理数据. void ClyfzAttendanceDlg::OnInitAttend() { // 获取指定文件. CString strFindFile = _T(""); CString lpszFilter = _T("(dat*.dat)|*.dat||"); DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT; CFileDialog dlg(TRUE, _T("default Files (*dat)"), NULL, dwFlags, lpszFilter, NULL); dlg.m_ofn.lpstrTitle=_T("请加载相关的指纹机数据文件"); if(dlg.DoModal() == IDCANCEL) return ; strFindFile = dlg.GetPathName(); // 加载指定数据; if ( g_pCMachineMgrBase->USBReadSuperLogData(strFindFile.GetBuffer())) { TRACE("11111"); } strFindFile.ReleaseBuffer(); } void ClyfzAttendanceDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void ClyfzAttendanceDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 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; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR ClyfzAttendanceDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void ClyfzAttendanceDlg::InitTrayIcon() { m_trayIcon.SetNotificationWnd(this, MSG_TRAY_NOTIFICATION); m_trayIcon.SetIcon(IDI_ATTENDANCE, g_strDefaultTip.c_str()); m_trayIcon.SetIconInfos((INT)IDI_ATTENDANCE, (INT)IDI_WARNING, (UINT)IDI_TRANSPARENT); m_trayIcon.SetDefaultTip(g_strDefaultTip.c_str()); } LRESULT ClyfzAttendanceDlg::OnTaskBarCreated(WPARAM wp, LPARAM lp) { Shell_NotifyIcon(NIM_ADD, &m_trayIcon.m_nid); return 0; } LRESULT ClyfzAttendanceDlg::OnTrayNotification(WPARAM wp, LPARAM lp) { if(wp != IDR_MAINFRAME) return m_trayIcon.OnTrayNotification(wp, lp); switch(lp) { case WM_RBUTTONUP: TrayRight(); break; case WM_LBUTTONUP: TaskNotifyIcon(); break; default: break; } return 0; } void ClyfzAttendanceDlg::TrayRight() { CMenu menu; if (!menu.LoadMenu(IDR_MENU1)) return ; CMenu* pSubMenu = menu.GetSubMenu(0); if (!pSubMenu) return ; if(m_bAutoRuning) pSubMenu->CheckMenuItem(Menu_AutoRun, MF_BYCOMMAND | MF_CHECKED); else pSubMenu->CheckMenuItem(Menu_AutoRun, MF_BYCOMMAND | MF_UNCHECKED); CPoint point; GetCursorPos(&point); ::SetForegroundWindow(m_hWnd); pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); } void ClyfzAttendanceDlg::TaskNotifyIcon() { if ( !m_bNoticeTray ) { m_trayIcon.SetIcon(IDI_ATTENDANCE, g_strDefaultTip.c_str()); ShowWindow(SW_SHOWNORMAL); m_bNoticeTray = TRUE; } else { m_trayIcon.SetIcon(IDI_ATTENDANCE, g_strDefaultTip.c_str()); ShowWindow(SW_HIDE); m_bNoticeTray = FALSE; } } //按扭状态0=全部失效, 1==只有(软件配置/连接)可用, 2=只有连接不可用 void ClyfzAttendanceDlg::ChangeCtrlStatus(int nType) { GetDlgItem(IDC_Config_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_ConnectSet_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_Black_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_Save_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_AllSubmit_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_FileLog_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_DelLog_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_SelSubmit_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_StopConfirm_BTN)->EnableWindow(FALSE); switch(nType) { case 1: { GetDlgItem(IDC_Config_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_ConnectSet_BTN)->EnableWindow(TRUE); } break; case 2: { //GetDlgItem(IDC_Config_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_Black_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_Save_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_AllSubmit_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_FileLog_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_DelLog_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_SelSubmit_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(TRUE); } break; } } //软件配置 void ClyfzAttendanceDlg::OnBnClickedConfig() { // TODO: 在此添加控件通知处理程序代码 CString strShow = _T(""); CDlgConfig dlg; dlg.m_lpCfg = &m_Devicecfg; if ( dlg.DoModal() != IDOK ) { strShow.Format(_T("取消选择提交!!!")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); return; } CDBInterface* pdb = CDBInterface::GetInstance(); if(pdb->IsOpen()) pdb->CloseDatabase(); pdb->GetIniInfo(); if(!pdb->OpenDatabase()) return; ReadUserInfo(); } //连接设置 void ClyfzAttendanceDlg::OnBnClickedConnectSet() { // TODO: 在此添加控件通知处理程序代码 if(!InitDeviceData()) { MessageBox(_T("初始化设备数据失败")); return; } if(!g_pCMachineMgrBase->OpenDevice()) return; ChangeCtrlStatus(2); //设备置为不可考勤状态 //m_FP_CLOCK.EnableDevice(g_lMachineNumber, 0); } //提示信息 LRESULT ClyfzAttendanceDlg::ShowPrompting(WPARAM wParam, LPARAM lParam) { int nShowType = lParam; CString strMSG = *(CString*)wParam; static CHARFORMAT cf; cf.cbSize = sizeof(CHARFORMAT); static COleDateTime oletime; oletime=COleDateTime::GetCurrentTime(); strMSG.Format(_T("%s: #%s.\r"),oletime.Format(_T("%Y/%m/%d %H:%M:%S")),strMSG); //strMSG += ".\r"; if ( nShowType == 1) // 错误信息提示 { // 显示前,设置字体颜色; //m_EditShow.GetDefaultCharFormat(cf); m_TipsMsgWnd.GetDefaultCharFormat(cf); cf.dwMask=CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_BOLD; cf.dwEffects = (unsigned long)~(CFE_UNDERLINE | CFE_BOLD | CFE_AUTOCOLOR); //cf.dwEffects ^= CFE_AUTOCOLOR; cf.crTextColor = RGB(255, 0, 0); cf.yHeight = 180; memset(cf.szFaceName, 0, LF_FACESIZE); // memcpy(cf.szFaceName, "楷体_GB2312", sizeof("楷体_GB2312")); memcpy(cf.szFaceName, _T("宋体"), sizeof(_T("宋体"))); m_TipsMsgWnd.SetSelectionCharFormat(cf); m_TipsMsgWnd.SetSel(-1,-1); m_TipsMsgWnd.ReplaceSel(strMSG); } else // 成功信息提示; { m_TipsMsgWnd.GetDefaultCharFormat(cf); cf.dwMask=CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_BOLD; cf.dwEffects = (unsigned long)~(CFE_UNDERLINE | CFE_BOLD | CFE_AUTOCOLOR); //cf.dwEffects ^= CFE_AUTOCOLOR; cf.crTextColor = RGB(0, 0, 255); cf.yHeight = 180; memset(cf.szFaceName, 0, LF_FACESIZE); // memcpy(cf.szFaceName, "楷体_GB2312", sizeof("楷体_GB2312")); memcpy(cf.szFaceName, _T("宋体"), sizeof(_T("宋体"))); m_TipsMsgWnd.SetSelectionCharFormat(cf); m_TipsMsgWnd.SetSel(-1,-1); m_TipsMsgWnd.ReplaceSel(strMSG); } m_TipsMsgWnd.PostMessage(WM_VSCROLL, SB_BOTTOM,0); return 0; } LRESULT ClyfzAttendanceDlg::ShowRealTimeLog(WPARAM wParam,LPARAM lParam) { long nEnrollNumber = *(long*)wParam; DATE nDateTime = *(DATE*)lParam; //static DWORD dwRecord = 0;//用成员变量代替; wchar_t wszEnrollNumber[10] = {0}; char szEnrollNumber[10] = {0}; _ltoa_s(nEnrollNumber,szEnrollNumber,10); Char2WChar(wszEnrollNumber, szEnrollNumber); BOOL bExist = FALSE; int nSize = m_strArrayRenyuan.GetSize(); for ( int i = 0; i < nSize; i++) { if ( _tcscmp(m_strArrayRenyuan.ElementAt(i).ElementAt(3), wszEnrollNumber) == 0 || _tcscmp(m_strArrayRenyuan.ElementAt(i).ElementAt(4), wszEnrollNumber) == 0 ) { bExist = TRUE; CString strRecord; strRecord.Format(_T("%d"),m_dwRecord); m_ctrlListShow.InsertItem(m_dwRecord,strRecord); m_ctrlListShow.SetItemText(m_dwRecord,1,m_strArrayRenyuan.ElementAt(i).ElementAt(0)); m_ctrlListShow.SetItemText(m_dwRecord,2,m_strArrayRenyuan.ElementAt(i).ElementAt(1)); m_ctrlListShow.SetItemText(m_dwRecord,3,m_strArrayRenyuan.ElementAt(i).ElementAt(2)); //m_ctrlListShow.SetItemText(m_dwRecord,4,m_strArrayRenyuan.ElementAt(i).ElementAt(3)); m_ctrlListShow.SetItemText(m_dwRecord, 4, wszEnrollNumber); COleDateTime tagOleTime(nDateTime); CString strMode = _T(""); GetVerifyMode(tagOleTime.GetSecond(), strMode); m_ctrlListShow.SetItemText(m_dwRecord, 5, strMode); m_ctrlListShow.SetItemText(m_dwRecord, 6, tagOleTime.Format(_T("%Y-%m-%d %H:%M:00"))); m_dwRecord++; break; } } if ( !bExist ) { CString strRecord; strRecord.Format(_T("%d"), m_dwRecord); m_ctrlListShow.InsertItem(m_dwRecord, strRecord); m_ctrlListShow.SetItemText(m_dwRecord,1,_T("无此指纹员工")); m_ctrlListShow.SetItemText(m_dwRecord,2,_T("无此指纹员工")); m_ctrlListShow.SetItemText(m_dwRecord,3,_T("无此指纹员工")); strRecord.Format(_T("%ld"),nEnrollNumber); m_ctrlListShow.SetItemText(m_dwRecord,4,strRecord); COleDateTime tagOleTime(nDateTime); CString strMode = _T(""); GetVerifyMode(tagOleTime.GetSecond(), strMode); m_ctrlListShow.SetItemText(m_dwRecord, 5, strMode); m_ctrlListShow.SetItemText(m_dwRecord,6,tagOleTime.Format(_T("%Y-%m-%d %H:%M:%S"))); m_dwRecord++; } int nItem = m_ctrlListShow.GetTopIndex(); int nCount = m_ctrlListShow.GetItemCount(); CRect rc; m_ctrlListShow.GetItemRect(nItem, rc, LVIR_BOUNDS); CSize sz(0, (nCount-nItem)*rc.Height()); m_ctrlListShow.Scroll(sz);//m_List1.SendMessage(WM_VSCROLL,SB_LINERIGHT,0); //m_ctrlListShow.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED); m_ctrlListShow.SetItemState(nCount,LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ctrlListShow.SetFocus(); return 0; } int ClyfzAttendanceDlg::GetVerifyMode(const int nMode, CString& strMode) { /* 指向long型变量的指针,该变量接收已考勤用户的确认方式值 参数说明: 1:指纹 2:密码 3:感应卡 4:返回 5:外出 6:按钮开门   7:软件开门 8:长时间开门(强制开门) 9:强制关门 10:识别成功但不开门 11:非法开门报警 12:上班 13:下班 14:加班上班 15:加班下班 */ switch(nMode) { case VERIFYMODE_FINGER: strMode = _T("指纹"); break; case VERIFYMODE_PWD: strMode = _T("密码"); break; case VERIFYMODE_INDUCTIONCARD: strMode = _T("感应卡"); break; case VERIFYMODE_RETURN: strMode = _T("返回"); break; case VERIFYMODE_OUT: strMode = _T("外出"); break; case VERIFYMODE_BTNOPENDOOR: strMode = _T("按钮开门"); break; case VERIFYMODE_SOWAREOPENDOOR: strMode = _T("软件开门"); break; case VERIFYMODE_LONGTIMEOPENDOOR: strMode = _T("长时间开门"); break; case VERIFYMODE_FORCEDTOCLOSE: strMode = _T("强制关门"); break; case VERIFYMODE_NOTOPENDOOR: strMode = _T("识别成功但不开门"); break; case VERIFYMODE_TOALARM: strMode = _T("非法开门报警"); break; case VERIFYMODE_ONWORK: strMode = _T("上班"); break; case VERIFYMODE_OFFWORK: strMode = _T("下班"); break; case VERIFYMODE_ONWORKOVERTIME: strMode = _T("加班上班"); break; case VERIFYMODE_OFFWORKOVERTIME: strMode = _T("加班下班"); break; } return 1; } //断开 void ClyfzAttendanceDlg::OnBnClickedBlack() { // TODO: 在此添加控件通知处理程序代码 if(g_pCMachineMgrBase) { g_pCMachineMgrBase->CloseDevice(); delete g_pCMachineMgrBase; g_pCMachineMgrBase = NULL; } ChangeCtrlStatus(1); } //保存记录 void ClyfzAttendanceDlg::OnBnClickedSaveBtn() { // TODO: 在此添加控件通知处理程序代码 CString strShow; CString strRet = ExportListToExcel(&m_ctrlListShow, _T("LoginData")); if ( strRet == "") { return; } strShow.Format(_T("备份当前列表数据于%s.xls中成功"), strRet); SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0); } //文件记录 void ClyfzAttendanceDlg::OnBnClickedFilelogBtn() { // TODO: 在此添加控件通知处理程序代码 CString lpszFilter = _T("(Excel*.xls)|*.xls||"); DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT|OFN_ENABLESIZING; CFileDialog dlg(TRUE, _T("default Files (*xls)"), NULL, dwFlags, lpszFilter, NULL); dlg.m_ofn.lpstrTitle=_T("请加载相关图层"); // 最多可以打开20个文件 dlg.m_ofn.nMaxFile = 20 * MAX_PATH; dlg.m_ofn.lpstrFile = new TCHAR[dlg.m_ofn.nMaxFile]; ZeroMemory(dlg.m_ofn.lpstrFile, sizeof(TCHAR) * dlg.m_ofn.nMaxFile); // 显示文件对话框,获得文件名集合 int retval = dlg.DoModal(); if(retval==IDCANCEL) return ; POSITION pos_file; pos_file = dlg.GetStartPosition(); CArray ary_filename; while(pos_file != NULL) ary_filename.Add(dlg.GetNextPathName(pos_file)); int nFileCount = ary_filename.GetSize(); // 清屏; m_ctrlListShow.DeleteAllItems(); m_dwRecord = 0; //根据扩展名读取相关文件 for(int i=0; iIsThreadRuning()) { // 全部提交前,先停止实时提交; CDataManager::GetInstance()->EndofRealTimeSubmitThread(); strShow.Format(_T("停止实时采集数据")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); } // 清屏; m_ctrlListShow.DeleteAllItems(); m_dwRecord = 0; strShow.Format(_T("全部数据正在提交,指纹机不可用,请等待提交完毕.......")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0); // 禁用全部按钮; ChangeCtrlStatus(); if(CDataManager::GetInstance()->StartSubmitAllThread() == 0) { // 创建线程失败; CString strShow = _T("全部提交失败,请重试"); SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 1); return; } else { SetTimer(2,1000,NULL); } } //选择提交 void ClyfzAttendanceDlg::OnBnClickedSelsubmitBtn() { // TODO: 在此添加控件通知处理程序代码 // 读取指纹机全部记录,通过筛选获取指定时间的记录; KillTimer(3); CString strShow; if( CDataManager::GetInstance()->IsThreadRuning()) { // 全部提交前,先停止实时提交; CDataManager::GetInstance()->EndofRealTimeSubmitThread(); strShow.Format(_T("停止实时采集数据")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); } // 选择提交前,先备份当前list记录; if( m_ctrlListShow.GetItemCount() && MessageBox(_T("选择提交前,是否备份当前列表数据于xls文件中?"), _T("提示"), MB_YESNO|MB_ICONQUESTION) == IDYES ) //IDNO { CString strRet = ExportListToExcel(&m_ctrlListShow, _T("LoginData")); if(strRet == _T("")) { strShow.Format(_T("打开文件失败")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); return; } strShow.Format(_T("备份当前列表数据于%s中成功"), strRet.GetBuffer(strRet.GetLength()-1)); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); strRet.ReleaseBuffer(); } // 清屏; m_ctrlListShow.DeleteAllItems(); m_dwRecord = 0; //读取数据 std::vector vtGeneralLogData; if(g_pCMachineMgrBase->ReadAllGlLogData(&vtGeneralLogData) == -1) return; DlgTimeChoose dlg; if ( dlg.DoModal() != IDOK ) { strShow.Format(_T("取消选择提交!!!")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); return; } std::vector::iterator it = vtGeneralLogData.begin(); for ( ;it != vtGeneralLogData.end(); ) { // 删除不符合条件的记录; COleDateTime tagDT(it->dwYear, it->dwMonth, it->dwDay, it->dwHour, it->dwMinute, 0); if ( tagDT <= dlg.m_BeginTime1 || tagDT >= dlg.m_EndTime1) it = vtGeneralLogData.erase(it); else ++it; } if ( vtGeneralLogData.size() == 0 ) { // 指定时间段没有数据; strShow.Format(_T("指定时间段没有数据!!!")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); return; } DWORD dwTime = GetTickCount(); DWORD dwRealCount = CDataManager::GetInstance()->WriteIntoDatabase(&vtGeneralLogData); dwTime = GetTickCount() - dwTime; strShow.Format(_T("指定时间段的记录共%d条,去除重复的共提交到数据库%d条记录,耗时%d毫秒"), vtGeneralLogData.size(), dwRealCount, dwTime); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0); //UpdateData(FALSE); //m_ctrlListShow.Invalidate(); CString strRet = ExportListToExcel(&m_ctrlListShow,_T("LoginData")); if ( strRet == "" ) { strShow = _T("选择提交前备份指纹机全部登进数据于xls中失败,请手动保存"); SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 1); } else { strShow.Format(_T("选择提交前备份指纹机全部登进数据于%s.xls中成功"), strRet.GetBuffer(strRet.GetLength()-1));// Debug下,这样用strShow自己format自己的用法,会产生栈越界; SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0); strRet.ReleaseBuffer(); } } //删除记录 void ClyfzAttendanceDlg::OnBnClickedDelLogBtn() { // TODO: 在此添加控件通知处理程序代码 CString strShow; // 删除前,提示备份处理; MessageBox(_T("删除指纹机打卡数据前,需要提交全部数据并保存于文件中"), _T("提示"), MB_OK | MB_ICONQUESTION); if( CDataManager::GetInstance()->IsThreadRuning()) {// 全部提交前,先停止实时提交; CDataManager::GetInstance()->EndofRealTimeSubmitThread(); strShow.Format(_T("停止实时采集数据")); SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 1); } // 清屏; m_ctrlListShow.DeleteAllItems(); UpdateData(FALSE); m_dwRecord = 0; strShow.Format(_T("删除前全部数据正在提交,指纹机不可用,请等待提交完毕.......")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0); std::vector vtGeneralLogData; DWORD dwCount = g_pCMachineMgrBase->ReadAllGlLogData(&vtGeneralLogData); // 不用1的.因为提交全部时,要禁止使用指纹机; DWORD dwTime = GetTickCount(); DWORD dwRealCount = CDataManager::GetInstance()->WriteIntoDatabase(&vtGeneralLogData); // 不使用PostMessage来处理; dwTime = GetTickCount() - dwTime; if ( dwCount == 0) { strShow.Format(_T("指纹机无记录!!!"),dwCount,dwRealCount,dwTime); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow, 1); return; } strShow.Format(_T("全部记录共%d条,去除重复的共提交到数据库%d条记录,耗时%d毫秒"), dwCount, dwRealCount, dwTime); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0); // 提交到数据库完毕后,备份于xls文件中; // int n = m_ctrlListShow.GetItemCount(); // m_ctrlListShow.Invalidate(); AfxMessageBox(_T("请确保所有数据已上传并备份")); CString strRet = ExportListToExcel(&m_ctrlListShow,_T("LoginData")); if ( strRet == _T("")) { strShow = _T("删除前备份指纹机全部登进数据于xls中失败,请重新尝试"); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); m_ctrlListShow.DeleteAllItems(); UpdateData(FALSE); m_dwRecord = 0; vector vtGeneralLogData; g_pCMachineMgrBase->ReadAllGlLogData(&vtGeneralLogData); // 不用1的.因为提交全部时,要禁止使用指纹机; ChangeCtrlStatus(2); return; } else { m_ctrlListShow.DeleteAllItems(); UpdateData(FALSE); m_dwRecord = 0; strShow.Format(_T("删除前备份指纹机全部登进数据于%s.xls中成功"), strRet.GetBuffer(strRet.GetLength()-1));// Debug下,这样用strShow自己format自己的用法,会产生栈越界; SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0); strRet.ReleaseBuffer(); } // 备份完毕,删除指纹机数据; // 未发布前,禁用 g_pCMachineMgrBase->DelLogData(); strShow.Format(_T("指纹机全部登进数据已完成删除,不可恢复")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); } //实时提交 void ClyfzAttendanceDlg::OnBnClickedRealtimeconfirmBtn() { // TODO: 在此添加控件通知处理程序代码 SetTimer(3, 60*1000, NULL); GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_StopConfirm_BTN)->EnableWindow(TRUE); CString strShow; strShow.Format(_T("启动实时采集数据")); SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0); } //停止提交 void ClyfzAttendanceDlg::OnBnClickedStopconfirmBtn() { // TODO: 在此添加控件通知处理程序代码 KillTimer(3); CString strShow; strShow.Format(_T("停止实时采集数据")); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1); GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(TRUE); GetDlgItem(IDC_StopConfirm_BTN)->EnableWindow(FALSE); } void ClyfzAttendanceDlg::OnTimer(UINT_PTR nIDEvent) { if ( nIDEvent == 2) { if ( CDataManager::GetInstance()->IsSubmitAllThreadRuning() == FALSE) { // LOG4C((LOG_NOTICE, "启动log日志 全部提交完成")); KillTimer(2); // 启用全部按钮; ChangeCtrlStatus(2); CString strErrorDescriptor = _T("全部提交完成"); SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strErrorDescriptor,0); } } if( nIDEvent == 3) { if(CDBInterface::GetInstance()->IsOpen() && g_pCMachineMgrBase->IsOpenDevice()) { if(CDataManager::GetInstance()->IsThreadRuning() == TRUE) return; // 注意,实际提交只适用没有大量数据囤积的情况;线程周期为100ms,所有处理必须在一个周期内完成; //m_pFKAttendImpl->ResumeAttendThread();// 线程挂起时,会占用FK接口函数;不能使用挂起,只能结束 CDataManager::GetInstance()->StartRealTimeSubmitThread(); } } CDialog::OnTimer(nIDEvent); } void ClyfzAttendanceDlg::OnDestroy() { if(g_pCMachineMgrBase) { g_pCMachineMgrBase->CloseDevice(); delete g_pCMachineMgrBase; g_pCMachineMgrBase = NULL; } CDialog::OnDestroy(); // TODO: 在此处添加消息处理程序代码 } void ClyfzAttendanceDlg::OnClose() { ShowWindow(SW_HIDE); } //连接数据库 void ClyfzAttendanceDlg::OnBnClickedDbConnect() { // TODO: 在此添加控件通知处理程序代码 } void ClyfzAttendanceDlg::OnBnClickedClearMgrBtn() { // TODO: 在此添加控件通知处理程序代码 if(!CDBInterface::GetInstance()->IsOpen()) { MessageBox(_T("没有连接数据库")); return; } CClearMgrDlg dlg; if(dlg.DoModal() == IDCANCEL) return; CString strAccount = dlg.m_strAccount; CString strPSD = dlg.m_strPSD; if(strAccount == _T("")) { MessageBox(_T("请输入帐号")); return; } if(strPSD == _T("")) { MessageBox(_T("请输入密码")); return; } CString strFilter = _T(""); CString strTableName = _T(""); strFilter = _T("Account='") + strAccount + _T("' and PWD='") + strPSD + _T("'"); CDBInterface::GetInstance()->GetTableNameByType(NAME_renyuan2, strTableName); if(CDBInterface::GetInstance()->GetSelectCount(&strTableName, &strFilter) <= 0) { LOG4C((LOG_NOTICE, "读取新数据库")); WCHAR szwBuffer[256] = {0}; char szBuffer[256] = {0}; WChar2Char(szBuffer, strPSD); CMD5 iMD5; iMD5.GenerateMD5((unsigned char*)szBuffer, strlen(szBuffer)); string strss = iMD5.ToString(); Char2WChar(szwBuffer, strss.c_str()); strPSD = szwBuffer; strFilter = _T("Account='") + strAccount + _T("' and PWD='") + strPSD + _T("'"); CDBInterface::GetInstance()->GetTableNameByType(NAME_renyuan2, strTableName); if(CDBInterface::GetInstance()->GetSelectCount(&strTableName, &strFilter) <= 0) { MessageBox(_T("帐号或密码不正确")); return; } } LOG4C((LOG_NOTICE, "纹机是否已连接")); if(g_pCMachineMgrBase->IsOpenDevice() == 0) { MessageBox(_T("请确保指纹机已连接")); return; } LOG4C((LOG_NOTICE, "清除管理员")); if(g_pCMachineMgrBase->BenumbAllManager() == 0) { MessageBox(_T("清除失败")); return; } MessageBox(_T("清除成功")); } ///////////////////////////////////////////////////////////////////////////// /* 函数:ReadConnectInfo 描述:读取指纹机配置文件 参数: int& nType 返回机器类型 返回: */ ///////////////////////////////////////////////////////////////////////////// void ClyfzAttendanceDlg::ReadConnectInfo(DEVICECFG& cfg) { WCHAR szFile[MAX_PATH + 1] = {0};// = ".\\OTA710C.ini"; wsprintf(szFile, _T("%s\\GC0307.ini"), g_ModulePath); // 1.公共信息; cfg.nMachineType = GetPrivateProfileInt(_T("CommonInfo"), _T("MachineType"), 0, szFile); cfg.nType = GetPrivateProfileInt(_T("CommonInfo"), _T("ConnectType"), 0, szFile); WCHAR wszMachineNumber[MAX_PATH + 1] = {0}; GetPrivateProfileString(_T("CommonInfo"), _T("MachineNumber"), _T(""), wszMachineNumber, MAX_PATH, szFile); char szMachineNumber[MAX_PATH + 1] = {0}; WChar2Char(szMachineNumber, wszMachineNumber); cfg.lMachineNumber = atol(szMachineNumber); WCHAR wszLicense[MAX_PATH + 1] = {0}; GetPrivateProfileString(_T("CommonInfo"), _T("License"), _T(""), wszLicense, MAX_PATH, szFile); char szLicense[MAX_PATH + 1] = { 0 }; WChar2Char(szLicense, wszLicense); cfg.lLicense = atol(szLicense); // 2.串口信息; cfg.lComPort = GetPrivateProfileInt(_T("SerialInfo"), _T("SerialPort"), 0, szFile); cfg.lBaudRate = GetPrivateProfileInt(_T("SerialInfo"), _T("Rate"), 0, szFile); cfg.lWaitDialTime = GetPrivateProfileInt(_T("SerialInfo"), _T("WaitDialTime"), 0, szFile); memset(cfg.szTelNumber, 0, sizeof(WCHAR)*(MAX_PATH)); GetPrivateProfileString(_T("SerialInfo"), _T("TelNumber"), _T(""), cfg.szTelNumber, MAX_PATH, szFile); // 3.网络信息; memset(cfg.szIpAddress, 0, sizeof(WCHAR)*(MAX_PATH)); GetPrivateProfileString(_T("NetInfo"), _T("IP"), _T(""), cfg.szIpAddress, MAX_PATH, szFile); cfg.lPort = GetPrivateProfileInt(_T("NetInfo"), _T("Port"), 0, szFile); cfg.lTimeOut = GetPrivateProfileInt(_T("NetInfo"), _T("TimeOut"), 0, szFile); cfg.lProtocolType = GetPrivateProfileInt(_T("NetInfo"), _T("ProtocolType"), 0, szFile); cfg.lNetPassword = GetPrivateProfileInt(_T("NetInfo"), _T("NetPassword"), 0, szFile); } ///////////////////////////////////////////////////////////////////////////// /* 函数:InitDeviceData 描述:初始化设备数据 参数: int& nType 返回机器类型 返回: */ ///////////////////////////////////////////////////////////////////////////// int ClyfzAttendanceDlg::InitDeviceData() { if(g_pCMachineMgrBase) OnBnClickedBlack(); if(g_pCMachineMgrBase == NULL) { switch(m_Devicecfg.nMachineType) { case 0: //奥芯 g_pCMachineMgrBase = (CMachineMgrBase*)new CFpClockCtrlMgr((CWnd*)&m_FP_CLOCK); break; case 1: //鑫澳康 g_pCMachineMgrBase = (CMachineMgrBase*)new CFKAttendCtrlMgr((CWnd*)&m_FKAttend); break; } return g_pCMachineMgrBase->InitMgrCfg(&m_Devicecfg); } return 1; }