lyfzAttendanceDlg.cpp 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291
  1. // ClyfzAttendanceDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "lyfzAttendance.h"
  5. #include "lyfzAttendanceDlg.h"
  6. #include "DlgTimeChoose.h"
  7. #include "DlgConfig.h"
  8. #include "Global.h"
  9. #include "DBInterface.h"
  10. #include "DataManager.h"
  11. #include "FpClockCtrlMgr.h"
  12. #include "FKAttendCtrlMgr.h"
  13. #include "ClearMgrDlg.h"
  14. #include "md5.h"
  15. const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(_T("lyfzAoXinItray"));
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #endif
  19. ClyfzAttendanceDlg *g_phWnd = NULL;
  20. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  21. class CAboutDlg : public CDialog
  22. {
  23. public:
  24. CAboutDlg();
  25. // 对话框数据
  26. enum { IDD = IDD_ABOUTBOX };
  27. protected:
  28. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  29. // 实现
  30. protected:
  31. DECLARE_MESSAGE_MAP()
  32. };
  33. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  34. {
  35. }
  36. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  37. {
  38. CDialog::DoDataExchange(pDX);
  39. }
  40. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  41. END_MESSAGE_MAP()
  42. // ClyfzAttendanceDlg 对话框
  43. ClyfzAttendanceDlg::ClyfzAttendanceDlg(CWnd* pParent /*=NULL*/)
  44. : CDialog(ClyfzAttendanceDlg::IDD, pParent)
  45. , m_trayIcon(IDR_MAINFRAME)
  46. {
  47. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  48. m_dwRecord = 0;
  49. m_isNotify = TRUE;
  50. m_bNoticeTray = TRUE;
  51. m_bAutoRuning = AfxGetApp()->GetProfileInt(_T("lyfzAoXin"), _T("autoruning"), 0);
  52. memset(&m_Devicecfg, 0, sizeof(DEVICECFG));
  53. }
  54. void ClyfzAttendanceDlg::DoDataExchange(CDataExchange* pDX)
  55. {
  56. CDialog::DoDataExchange(pDX);
  57. DDX_Control(pDX, IDC_FP_CLOCKCTRL1, m_FP_CLOCK);
  58. DDX_Control(pDX, IDC_RICHEDIT21, m_TipsMsgWnd);
  59. DDX_Control(pDX, IDC_LIST3, m_ctrlListShow);
  60. }
  61. BEGIN_MESSAGE_MAP(ClyfzAttendanceDlg, CDialog)
  62. ON_WM_SYSCOMMAND()
  63. ON_WM_PAINT()
  64. ON_WM_TIMER()
  65. ON_WM_DESTROY()
  66. ON_WM_CLOSE()
  67. ON_WM_QUERYDRAGICON()
  68. //}}AFX_MSG_MAP
  69. ON_MESSAGE(MSG_TRAY_NOTIFICATION, OnTrayNotification)
  70. ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskBarCreated)
  71. ON_COMMAND(Menu_Exit, &ClyfzAttendanceDlg::OnExit)
  72. ON_COMMAND(Menu_AutoRun, &ClyfzAttendanceDlg::OnAutorun)
  73. ON_COMMAND(Menu_ShowWindow, &ClyfzAttendanceDlg::OnShowwindow)
  74. ON_COMMAND(Menu_ReadAllLog, &ClyfzAttendanceDlg::OnReadalllog)
  75. ON_COMMAND(Menu_InitAttend, &ClyfzAttendanceDlg::OnInitAttend)
  76. ON_MESSAGE(MSG_SHOWPROMPTING, &ClyfzAttendanceDlg::ShowPrompting)
  77. ON_MESSAGE(MSG_SHOWREALTIMELOG, &ClyfzAttendanceDlg::ShowRealTimeLog)
  78. ON_BN_CLICKED(IDC_Config_BTN, &ClyfzAttendanceDlg::OnBnClickedConfig)
  79. ON_BN_CLICKED(IDC_ConnectSet_BTN, &ClyfzAttendanceDlg::OnBnClickedConnectSet)
  80. ON_BN_CLICKED(IDC_Black_BTN, &ClyfzAttendanceDlg::OnBnClickedBlack)
  81. ON_BN_CLICKED(IDC_Save_BTN, &ClyfzAttendanceDlg::OnBnClickedSaveBtn)
  82. ON_BN_CLICKED(IDC_FileLog_BTN, &ClyfzAttendanceDlg::OnBnClickedFilelogBtn)
  83. ON_BN_CLICKED(IDC_AllSubmit_BTN, &ClyfzAttendanceDlg::OnBnClickedAllsubmitBtn)
  84. ON_BN_CLICKED(IDC_SelSubmit_BTN, &ClyfzAttendanceDlg::OnBnClickedSelsubmitBtn)
  85. ON_BN_CLICKED(IDC_DelLog_BTN, &ClyfzAttendanceDlg::OnBnClickedDelLogBtn)
  86. ON_BN_CLICKED(IDC_RealTimeConfirm_BTN, &ClyfzAttendanceDlg::OnBnClickedRealtimeconfirmBtn)
  87. ON_BN_CLICKED(IDC_StopConfirm_BTN, &ClyfzAttendanceDlg::OnBnClickedStopconfirmBtn)
  88. ON_WM_DESTROY()
  89. //ON_BN_CLICKED(IDC_DB_CONNECT, &ClyfzAttendanceDlg::OnBnClickedDbConnect)
  90. ON_BN_CLICKED(IDC_ClearMgr_BTN, &ClyfzAttendanceDlg::OnBnClickedClearMgrBtn)
  91. END_MESSAGE_MAP()
  92. // ClyfzAttendanceDlg 消息处理程序
  93. BOOL ClyfzAttendanceDlg::OnInitDialog()
  94. {
  95. CDialog::OnInitDialog();
  96. // 将“关于...”菜单项添加到系统菜单中。
  97. // IDM_ABOUTBOX 必须在系统命令范围内。
  98. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  99. ASSERT(IDM_ABOUTBOX < 0xF000);
  100. CMenu* pSysMenu = GetSystemMenu(FALSE);
  101. if (pSysMenu != NULL)
  102. {
  103. BOOL bNameValid;
  104. CString strAboutMenu;
  105. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  106. ASSERT(bNameValid);
  107. if (!strAboutMenu.IsEmpty())
  108. {
  109. pSysMenu->AppendMenu(MF_SEPARATOR);
  110. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  111. }
  112. }
  113. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  114. // 执行此操作
  115. SetIcon(m_hIcon, TRUE); // 设置大图标
  116. SetIcon(m_hIcon, FALSE); // 设置小图标
  117. // TODO: 在此添加额外的初始化代码
  118. g_hwnd = GetSafeHwnd();
  119. g_phWnd = this;
  120. InitTrayIcon();
  121. InitCtrlList();
  122. ChangeCtrlStatus(1);
  123. //连接数据库
  124. CDBInterface* pDBInterface = CDBInterface::GetInstance();
  125. pDBInterface->GetIniInfo();
  126. // 这一段,应该放在升级包里处理比较统一;
  127. if ( pDBInterface->OpenDatabase() )
  128. ReadUserInfo();//获取员工信息
  129. else
  130. pDBInterface->SolveDBError(WSAECONNRESET);
  131. if ( m_bAutoRuning )
  132. {
  133. ShowWindow(SW_HIDE);
  134. OnBnClickedConnectSet();
  135. }
  136. //读取ocx.ini文件
  137. ReadConnectInfo(m_Devicecfg);
  138. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  139. }
  140. ///////////////////////////////////////////////////////////////////////////////
  141. // 函数:ReadUserInfo
  142. // 说明:获取在职员工信息
  143. // 参数:
  144. // 返回值:0成功,-1失败
  145. //
  146. ///////////////////////////////////////////////////////////////////////////////
  147. int ClyfzAttendanceDlg::ReadUserInfo()
  148. {
  149. CDBInterface* pDBInterface = CDBInterface::GetInstance();
  150. if(!pDBInterface->IsOpen())
  151. return -1;
  152. m_strArrayRenyuan.RemoveAll();
  153. //获取员工信息renyuan
  154. CString strfilter = _T("dimission='在职'");
  155. std::vector<CString> vFieldName;
  156. vFieldName.push_back(_T("id"));
  157. vFieldName.push_back(_T("name"));
  158. vFieldName.push_back(_T("sex"));
  159. vFieldName.push_back(_T("loginno1"));
  160. vFieldName.push_back(_T("loginno2"));
  161. pDBInterface->GetDataBySelect(m_strArrayRenyuan, NAME_renyuan1, vFieldName, &strfilter);
  162. if(m_strArrayRenyuan.GetSize() == 0)
  163. {
  164. //查询新表dbo.View_UserInfo
  165. vFieldName.clear();
  166. vFieldName.push_back(_T("Account"));
  167. vFieldName.push_back(_T("UserName"));
  168. vFieldName.push_back(_T("sex"));
  169. vFieldName.push_back(_T("loginnoID1"));
  170. vFieldName.push_back(_T("loginnoID2"));
  171. pDBInterface->GetDataBySelect(m_strArrayRenyuan, NAME_renyuan2, vFieldName, &strfilter);
  172. }
  173. return 0;
  174. }
  175. void ClyfzAttendanceDlg::InitCtrlList()
  176. {
  177. m_ctrlListShow.InsertColumn(0,_T("记录号"));
  178. m_ctrlListShow.SetColumnWidth(0,80);
  179. m_ctrlListShow.InsertColumn(1,_T("员工"));
  180. m_ctrlListShow.SetColumnWidth(1,100);
  181. m_ctrlListShow.InsertColumn( 2, _T("部门"));
  182. m_ctrlListShow.SetColumnWidth( 2, 100 );
  183. m_ctrlListShow.InsertColumn( 3, _T("性别"));
  184. m_ctrlListShow.SetColumnWidth( 3, 100 );
  185. m_ctrlListShow.InsertColumn( 4, _T("指纹ID"));
  186. m_ctrlListShow.SetColumnWidth( 4, 100 );
  187. m_ctrlListShow.InsertColumn( 5, _T("打卡状态"));
  188. m_ctrlListShow.SetColumnWidth( 5, 100 );
  189. m_ctrlListShow.InsertColumn( 6, _T("打卡时间"));
  190. m_ctrlListShow.SetColumnWidth( 6, 200);
  191. m_ctrlListShow.SetExtendedStyle(m_ctrlListShow.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  192. }
  193. void ClyfzAttendanceDlg::OnExit()
  194. {
  195. if(g_pCMachineMgrBase)
  196. {
  197. g_pCMachineMgrBase->CloseDevice();
  198. delete g_pCMachineMgrBase;
  199. g_pCMachineMgrBase = NULL;
  200. }
  201. CDialog::OnOK();
  202. }
  203. void ClyfzAttendanceDlg::OnShowwindow()
  204. {
  205. // TODO: 在此添加命令处理程序代码
  206. ShowWindow(SW_SHOWNORMAL);
  207. }
  208. void ClyfzAttendanceDlg::OnAutorun()
  209. {
  210. m_bAutoRuning = !m_bAutoRuning;
  211. AfxGetApp()->WriteProfileInt(_T("lyfzAoXin"), _T("autoruning"), m_bAutoRuning);
  212. AddAutoSysRun((CHAR*)g_ModuleFileName, m_bAutoRuning);
  213. }
  214. void ClyfzAttendanceDlg::OnReadalllog()
  215. {
  216. CString strShow;
  217. TCHAR szOldLog[MAX_PATH] = {0};
  218. wsprintf(szOldLog, _T("%s\\AllLog.txt"), g_ModulePath);
  219. if( FALSE == ::PathFileExists(szOldLog) )
  220. {
  221. //LOG4C((LOG_NOTICE,"%s:不存在",szOldLog));
  222. strShow.Format(_T("AllLog.txt不存在..."));
  223. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  224. return;
  225. }
  226. CStringArray array;
  227. CStdioFile fp;
  228. if( !fp.Open(szOldLog, CFile::modeRead) )
  229. {
  230. LOG4C((LOG_NOTICE,"%s:打开文件",szOldLog));
  231. return;
  232. }
  233. CString strEnrollNumber; // 指纹ID;
  234. CString strDateTime; // 指纹登记时间;
  235. CString strTemp;
  236. fp.ReadString(strTemp);
  237. CString strFinder = _T(""); // Jeff.AllLog.txt里是用tab键分隔数据的;
  238. std::vector<STAllLog> vtAllLog;
  239. STAllLog tagAllLog;
  240. // Jeff.一条记录里有4个tab键;
  241. LOG4C((LOG_NOTICE,"%s:read ready",szOldLog));
  242. while( !feof(fp.m_pStream) )
  243. {
  244. // Jeff.读一行数据;
  245. fp.ReadString(strTemp);
  246. // Jeff.第一个tab键前的数据是记录数;
  247. int pos = strTemp.Find(strFinder);
  248. if(pos == -1)
  249. {
  250. // WriteLogin("返回1");
  251. continue;
  252. }
  253. strTemp = strTemp.Right(strTemp.GetLength()-pos-1);
  254. // Jeff.第二个tab键前的数据是指纹ID号;
  255. pos = strTemp.Find(strFinder);
  256. if(pos == -1)
  257. {
  258. //WriteLogin("返回2");
  259. continue;
  260. }
  261. strEnrollNumber = strTemp.Left(pos);
  262. strTemp=strTemp.Right(strTemp.GetLength()-pos-1);
  263. // Jeff.第三个tab键前的数据是Verify(验证什么未知)字段;
  264. pos = strTemp.Find(strFinder);
  265. if(pos == -1)
  266. {
  267. //WriteLogin("返回3");
  268. continue;
  269. }
  270. strTemp = strTemp.Right(strTemp.GetLength()-pos-1);
  271. // Jeff.第四个tab键前的数据是InOut字段;
  272. pos = strTemp.Find(strFinder);
  273. if(pos == -1)
  274. {
  275. //WriteLogin("返回4");
  276. continue;
  277. }
  278. // Jeff.最后的字段内容是指纹登记时间;
  279. strDateTime = strTemp.Right(strTemp.GetLength()-pos-1);
  280. strEnrollNumber.TrimLeft();
  281. strEnrollNumber.TrimRight();
  282. strDateTime.TrimLeft();
  283. strDateTime.TrimRight();
  284. strDateTime.Replace(_T("/"), _T("-"));
  285. tagAllLog.strEnrollNumber = strEnrollNumber;
  286. tagAllLog.strDateTime = strDateTime;
  287. vtAllLog.push_back(tagAllLog);
  288. }
  289. strShow.Format(_T("读取AllLog.txt完毕,记录数=%d,即将提交数据..."),vtAllLog.size());
  290. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0);
  291. Sleep(10);
  292. CDataManager::GetInstance()->ReadOldLog(vtAllLog);
  293. }
  294. // 从文件中读出数据,并初始指纹机里的管理数据.
  295. void ClyfzAttendanceDlg::OnInitAttend()
  296. {
  297. // 获取指定文件.
  298. CString strFindFile = _T("");
  299. CString lpszFilter = _T("(dat*.dat)|*.dat||");
  300. DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT;
  301. CFileDialog dlg(TRUE, _T("default Files (*dat)"), NULL, dwFlags, lpszFilter, NULL);
  302. dlg.m_ofn.lpstrTitle=_T("请加载相关的指纹机数据文件");
  303. if(dlg.DoModal() == IDCANCEL)
  304. return ;
  305. strFindFile = dlg.GetPathName();
  306. // 加载指定数据;
  307. if ( g_pCMachineMgrBase->USBReadSuperLogData(strFindFile.GetBuffer()))
  308. {
  309. TRACE("11111");
  310. }
  311. strFindFile.ReleaseBuffer();
  312. }
  313. void ClyfzAttendanceDlg::OnSysCommand(UINT nID, LPARAM lParam)
  314. {
  315. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  316. {
  317. CAboutDlg dlgAbout;
  318. dlgAbout.DoModal();
  319. }
  320. else
  321. {
  322. CDialog::OnSysCommand(nID, lParam);
  323. }
  324. }
  325. // 如果向对话框添加最小化按钮,则需要下面的代码
  326. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  327. // 这将由框架自动完成。
  328. void ClyfzAttendanceDlg::OnPaint()
  329. {
  330. if (IsIconic())
  331. {
  332. CPaintDC dc(this); // 用于绘制的设备上下文
  333. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  334. // 使图标在工作区矩形中居中
  335. int cxIcon = GetSystemMetrics(SM_CXICON);
  336. int cyIcon = GetSystemMetrics(SM_CYICON);
  337. CRect rect;
  338. GetClientRect(&rect);
  339. int x = (rect.Width() - cxIcon + 1) / 2;
  340. int y = (rect.Height() - cyIcon + 1) / 2;
  341. // 绘制图标
  342. dc.DrawIcon(x, y, m_hIcon);
  343. }
  344. else
  345. {
  346. CDialog::OnPaint();
  347. }
  348. }
  349. //当用户拖动最小化窗口时系统调用此函数取得光标
  350. //显示。
  351. HCURSOR ClyfzAttendanceDlg::OnQueryDragIcon()
  352. {
  353. return static_cast<HCURSOR>(m_hIcon);
  354. }
  355. void ClyfzAttendanceDlg::InitTrayIcon()
  356. {
  357. m_trayIcon.SetNotificationWnd(this, MSG_TRAY_NOTIFICATION);
  358. m_trayIcon.SetIcon(IDI_ATTENDANCE, g_strDefaultTip.c_str());
  359. m_trayIcon.SetIconInfos((INT)IDI_ATTENDANCE, (INT)IDI_WARNING, (UINT)IDI_TRANSPARENT);
  360. m_trayIcon.SetDefaultTip(g_strDefaultTip.c_str());
  361. }
  362. LRESULT ClyfzAttendanceDlg::OnTaskBarCreated(WPARAM wp, LPARAM lp)
  363. {
  364. Shell_NotifyIcon(NIM_ADD, &m_trayIcon.m_nid);
  365. return 0;
  366. }
  367. LRESULT ClyfzAttendanceDlg::OnTrayNotification(WPARAM wp, LPARAM lp)
  368. {
  369. if(wp != IDR_MAINFRAME)
  370. return m_trayIcon.OnTrayNotification(wp, lp);
  371. switch(lp)
  372. {
  373. case WM_RBUTTONUP:
  374. TrayRight();
  375. break;
  376. case WM_LBUTTONUP:
  377. TaskNotifyIcon();
  378. break;
  379. default:
  380. break;
  381. }
  382. return 0;
  383. }
  384. void ClyfzAttendanceDlg::TrayRight()
  385. {
  386. CMenu menu;
  387. if (!menu.LoadMenu(IDR_MENU1))
  388. return ;
  389. CMenu* pSubMenu = menu.GetSubMenu(0);
  390. if (!pSubMenu)
  391. return ;
  392. if(m_bAutoRuning)
  393. pSubMenu->CheckMenuItem(Menu_AutoRun, MF_BYCOMMAND | MF_CHECKED);
  394. else
  395. pSubMenu->CheckMenuItem(Menu_AutoRun, MF_BYCOMMAND | MF_UNCHECKED);
  396. CPoint point;
  397. GetCursorPos(&point);
  398. ::SetForegroundWindow(m_hWnd);
  399. pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
  400. }
  401. void ClyfzAttendanceDlg::TaskNotifyIcon()
  402. {
  403. if ( !m_bNoticeTray )
  404. {
  405. m_trayIcon.SetIcon(IDI_ATTENDANCE, g_strDefaultTip.c_str());
  406. ShowWindow(SW_SHOWNORMAL);
  407. m_bNoticeTray = TRUE;
  408. }
  409. else
  410. {
  411. m_trayIcon.SetIcon(IDI_ATTENDANCE, g_strDefaultTip.c_str());
  412. ShowWindow(SW_HIDE);
  413. m_bNoticeTray = FALSE;
  414. }
  415. }
  416. //按扭状态0=全部失效, 1==只有(软件配置/连接)可用, 2=只有连接不可用
  417. void ClyfzAttendanceDlg::ChangeCtrlStatus(int nType)
  418. {
  419. GetDlgItem(IDC_Config_BTN)->EnableWindow(FALSE);
  420. GetDlgItem(IDC_ConnectSet_BTN)->EnableWindow(FALSE);
  421. GetDlgItem(IDC_Black_BTN)->EnableWindow(FALSE);
  422. GetDlgItem(IDC_Save_BTN)->EnableWindow(FALSE);
  423. GetDlgItem(IDC_AllSubmit_BTN)->EnableWindow(FALSE);
  424. GetDlgItem(IDC_FileLog_BTN)->EnableWindow(FALSE);
  425. GetDlgItem(IDC_DelLog_BTN)->EnableWindow(FALSE);
  426. GetDlgItem(IDC_SelSubmit_BTN)->EnableWindow(FALSE);
  427. GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(FALSE);
  428. GetDlgItem(IDC_StopConfirm_BTN)->EnableWindow(FALSE);
  429. switch(nType)
  430. {
  431. case 1:
  432. {
  433. GetDlgItem(IDC_Config_BTN)->EnableWindow(TRUE);
  434. GetDlgItem(IDC_ConnectSet_BTN)->EnableWindow(TRUE);
  435. }
  436. break;
  437. case 2:
  438. {
  439. //GetDlgItem(IDC_Config_BTN)->EnableWindow(TRUE);
  440. GetDlgItem(IDC_Black_BTN)->EnableWindow(TRUE);
  441. GetDlgItem(IDC_Save_BTN)->EnableWindow(TRUE);
  442. GetDlgItem(IDC_AllSubmit_BTN)->EnableWindow(TRUE);
  443. GetDlgItem(IDC_FileLog_BTN)->EnableWindow(TRUE);
  444. GetDlgItem(IDC_DelLog_BTN)->EnableWindow(TRUE);
  445. GetDlgItem(IDC_SelSubmit_BTN)->EnableWindow(TRUE);
  446. GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(TRUE);
  447. }
  448. break;
  449. }
  450. }
  451. //软件配置
  452. void ClyfzAttendanceDlg::OnBnClickedConfig()
  453. {
  454. // TODO: 在此添加控件通知处理程序代码
  455. CString strShow = _T("");
  456. CDlgConfig dlg;
  457. dlg.m_lpCfg = &m_Devicecfg;
  458. if ( dlg.DoModal() != IDOK )
  459. {
  460. strShow.Format(_T("取消选择提交!!!"));
  461. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  462. return;
  463. }
  464. CDBInterface* pdb = CDBInterface::GetInstance();
  465. if(pdb->IsOpen())
  466. pdb->CloseDatabase();
  467. pdb->GetIniInfo();
  468. if(!pdb->OpenDatabase())
  469. return;
  470. ReadUserInfo();
  471. }
  472. //连接设置
  473. void ClyfzAttendanceDlg::OnBnClickedConnectSet()
  474. {
  475. // TODO: 在此添加控件通知处理程序代码
  476. if(!InitDeviceData())
  477. {
  478. MessageBox(_T("初始化设备数据失败"));
  479. return;
  480. }
  481. if(!g_pCMachineMgrBase->OpenDevice())
  482. return;
  483. ChangeCtrlStatus(2);
  484. //设备置为不可考勤状态
  485. //m_FP_CLOCK.EnableDevice(g_lMachineNumber, 0);
  486. }
  487. //提示信息
  488. LRESULT ClyfzAttendanceDlg::ShowPrompting(WPARAM wParam, LPARAM lParam)
  489. {
  490. int nShowType = lParam;
  491. CString strMSG = *(CString*)wParam;
  492. static CHARFORMAT cf;
  493. cf.cbSize = sizeof(CHARFORMAT);
  494. static COleDateTime oletime;
  495. oletime=COleDateTime::GetCurrentTime();
  496. strMSG.Format(_T("%s: #%s.\r"),oletime.Format(_T("%Y/%m/%d %H:%M:%S")),strMSG);
  497. //strMSG += ".\r";
  498. if ( nShowType == 1) // 错误信息提示
  499. {
  500. // 显示前,设置字体颜色;
  501. //m_EditShow.GetDefaultCharFormat(cf);
  502. m_TipsMsgWnd.GetDefaultCharFormat(cf);
  503. cf.dwMask=CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_BOLD;
  504. cf.dwEffects = (unsigned long)~(CFE_UNDERLINE | CFE_BOLD | CFE_AUTOCOLOR);
  505. //cf.dwEffects ^= CFE_AUTOCOLOR;
  506. cf.crTextColor = RGB(255, 0, 0);
  507. cf.yHeight = 180;
  508. memset(cf.szFaceName, 0, LF_FACESIZE);
  509. // memcpy(cf.szFaceName, "楷体_GB2312", sizeof("楷体_GB2312"));
  510. memcpy(cf.szFaceName, _T("宋体"), sizeof(_T("宋体")));
  511. m_TipsMsgWnd.SetSelectionCharFormat(cf);
  512. m_TipsMsgWnd.SetSel(-1,-1);
  513. m_TipsMsgWnd.ReplaceSel(strMSG);
  514. }
  515. else // 成功信息提示;
  516. {
  517. m_TipsMsgWnd.GetDefaultCharFormat(cf);
  518. cf.dwMask=CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_BOLD;
  519. cf.dwEffects = (unsigned long)~(CFE_UNDERLINE | CFE_BOLD | CFE_AUTOCOLOR);
  520. //cf.dwEffects ^= CFE_AUTOCOLOR;
  521. cf.crTextColor = RGB(0, 0, 255);
  522. cf.yHeight = 180;
  523. memset(cf.szFaceName, 0, LF_FACESIZE);
  524. // memcpy(cf.szFaceName, "楷体_GB2312", sizeof("楷体_GB2312"));
  525. memcpy(cf.szFaceName, _T("宋体"), sizeof(_T("宋体")));
  526. m_TipsMsgWnd.SetSelectionCharFormat(cf);
  527. m_TipsMsgWnd.SetSel(-1,-1);
  528. m_TipsMsgWnd.ReplaceSel(strMSG);
  529. }
  530. m_TipsMsgWnd.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
  531. return 0;
  532. }
  533. LRESULT ClyfzAttendanceDlg::ShowRealTimeLog(WPARAM wParam,LPARAM lParam)
  534. {
  535. long nEnrollNumber = *(long*)wParam;
  536. DATE nDateTime = *(DATE*)lParam;
  537. //static DWORD dwRecord = 0;//用成员变量代替;
  538. wchar_t wszEnrollNumber[10] = {0};
  539. char szEnrollNumber[10] = {0};
  540. _ltoa_s(nEnrollNumber,szEnrollNumber,10);
  541. Char2WChar(wszEnrollNumber, szEnrollNumber);
  542. BOOL bExist = FALSE;
  543. int nSize = m_strArrayRenyuan.GetSize();
  544. for ( int i = 0; i < nSize; i++)
  545. {
  546. if ( _tcscmp(m_strArrayRenyuan.ElementAt(i).ElementAt(3), wszEnrollNumber) == 0 || _tcscmp(m_strArrayRenyuan.ElementAt(i).ElementAt(4), wszEnrollNumber) == 0 )
  547. {
  548. bExist = TRUE;
  549. CString strRecord;
  550. strRecord.Format(_T("%d"),m_dwRecord);
  551. m_ctrlListShow.InsertItem(m_dwRecord,strRecord);
  552. m_ctrlListShow.SetItemText(m_dwRecord,1,m_strArrayRenyuan.ElementAt(i).ElementAt(0));
  553. m_ctrlListShow.SetItemText(m_dwRecord,2,m_strArrayRenyuan.ElementAt(i).ElementAt(1));
  554. m_ctrlListShow.SetItemText(m_dwRecord,3,m_strArrayRenyuan.ElementAt(i).ElementAt(2));
  555. //m_ctrlListShow.SetItemText(m_dwRecord,4,m_strArrayRenyuan.ElementAt(i).ElementAt(3));
  556. m_ctrlListShow.SetItemText(m_dwRecord, 4, wszEnrollNumber);
  557. COleDateTime tagOleTime(nDateTime);
  558. CString strMode = _T("");
  559. GetVerifyMode(tagOleTime.GetSecond(), strMode);
  560. m_ctrlListShow.SetItemText(m_dwRecord, 5, strMode);
  561. m_ctrlListShow.SetItemText(m_dwRecord, 6, tagOleTime.Format(_T("%Y-%m-%d %H:%M:00")));
  562. m_dwRecord++;
  563. break;
  564. }
  565. }
  566. if ( !bExist )
  567. {
  568. CString strRecord;
  569. strRecord.Format(_T("%d"), m_dwRecord);
  570. m_ctrlListShow.InsertItem(m_dwRecord, strRecord);
  571. m_ctrlListShow.SetItemText(m_dwRecord,1,_T("无此指纹员工"));
  572. m_ctrlListShow.SetItemText(m_dwRecord,2,_T("无此指纹员工"));
  573. m_ctrlListShow.SetItemText(m_dwRecord,3,_T("无此指纹员工"));
  574. strRecord.Format(_T("%ld"),nEnrollNumber);
  575. m_ctrlListShow.SetItemText(m_dwRecord,4,strRecord);
  576. COleDateTime tagOleTime(nDateTime);
  577. CString strMode = _T("");
  578. GetVerifyMode(tagOleTime.GetSecond(), strMode);
  579. m_ctrlListShow.SetItemText(m_dwRecord, 5, strMode);
  580. m_ctrlListShow.SetItemText(m_dwRecord,6,tagOleTime.Format(_T("%Y-%m-%d %H:%M:%S")));
  581. m_dwRecord++;
  582. }
  583. int nItem = m_ctrlListShow.GetTopIndex();
  584. int nCount = m_ctrlListShow.GetItemCount();
  585. CRect rc;
  586. m_ctrlListShow.GetItemRect(nItem, rc, LVIR_BOUNDS);
  587. CSize sz(0, (nCount-nItem)*rc.Height());
  588. m_ctrlListShow.Scroll(sz);//m_List1.SendMessage(WM_VSCROLL,SB_LINERIGHT,0);
  589. //m_ctrlListShow.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
  590. m_ctrlListShow.SetItemState(nCount,LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
  591. m_ctrlListShow.SetFocus();
  592. return 0;
  593. }
  594. int ClyfzAttendanceDlg::GetVerifyMode(const int nMode, CString& strMode)
  595. {
  596. /*
  597. 指向long型变量的指针,该变量接收已考勤用户的确认方式值
  598. 参数说明:
  599. 1:指纹 2:密码 3:感应卡 4:返回 5:外出
  600. 6:按钮开门   7:软件开门 8:长时间开门(强制开门) 9:强制关门 10:识别成功但不开门
  601. 11:非法开门报警 12:上班 13:下班 14:加班上班 15:加班下班
  602. */
  603. switch(nMode)
  604. {
  605. case VERIFYMODE_FINGER:
  606. strMode = _T("指纹");
  607. break;
  608. case VERIFYMODE_PWD:
  609. strMode = _T("密码");
  610. break;
  611. case VERIFYMODE_INDUCTIONCARD:
  612. strMode = _T("感应卡");
  613. break;
  614. case VERIFYMODE_RETURN:
  615. strMode = _T("返回");
  616. break;
  617. case VERIFYMODE_OUT:
  618. strMode = _T("外出");
  619. break;
  620. case VERIFYMODE_BTNOPENDOOR:
  621. strMode = _T("按钮开门");
  622. break;
  623. case VERIFYMODE_SOWAREOPENDOOR:
  624. strMode = _T("软件开门");
  625. break;
  626. case VERIFYMODE_LONGTIMEOPENDOOR:
  627. strMode = _T("长时间开门");
  628. break;
  629. case VERIFYMODE_FORCEDTOCLOSE:
  630. strMode = _T("强制关门");
  631. break;
  632. case VERIFYMODE_NOTOPENDOOR:
  633. strMode = _T("识别成功但不开门");
  634. break;
  635. case VERIFYMODE_TOALARM:
  636. strMode = _T("非法开门报警");
  637. break;
  638. case VERIFYMODE_ONWORK:
  639. strMode = _T("上班");
  640. break;
  641. case VERIFYMODE_OFFWORK:
  642. strMode = _T("下班");
  643. break;
  644. case VERIFYMODE_ONWORKOVERTIME:
  645. strMode = _T("加班上班");
  646. break;
  647. case VERIFYMODE_OFFWORKOVERTIME:
  648. strMode = _T("加班下班");
  649. break;
  650. }
  651. return 1;
  652. }
  653. //断开
  654. void ClyfzAttendanceDlg::OnBnClickedBlack()
  655. {
  656. // TODO: 在此添加控件通知处理程序代码
  657. if(g_pCMachineMgrBase)
  658. {
  659. g_pCMachineMgrBase->CloseDevice();
  660. delete g_pCMachineMgrBase;
  661. g_pCMachineMgrBase = NULL;
  662. }
  663. ChangeCtrlStatus(1);
  664. }
  665. //保存记录
  666. void ClyfzAttendanceDlg::OnBnClickedSaveBtn()
  667. {
  668. // TODO: 在此添加控件通知处理程序代码
  669. CString strShow;
  670. CString strRet = ExportListToExcel(&m_ctrlListShow, _T("LoginData"));
  671. if ( strRet == "")
  672. {
  673. return;
  674. }
  675. strShow.Format(_T("备份当前列表数据于%s.xls中成功"), strRet);
  676. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0);
  677. }
  678. //文件记录
  679. void ClyfzAttendanceDlg::OnBnClickedFilelogBtn()
  680. {
  681. // TODO: 在此添加控件通知处理程序代码
  682. CString lpszFilter = _T("(Excel*.xls)|*.xls||");
  683. DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT|OFN_ENABLESIZING;
  684. CFileDialog dlg(TRUE, _T("default Files (*xls)"), NULL, dwFlags, lpszFilter, NULL);
  685. dlg.m_ofn.lpstrTitle=_T("请加载相关图层");
  686. // 最多可以打开20个文件
  687. dlg.m_ofn.nMaxFile = 20 * MAX_PATH;
  688. dlg.m_ofn.lpstrFile = new TCHAR[dlg.m_ofn.nMaxFile];
  689. ZeroMemory(dlg.m_ofn.lpstrFile, sizeof(TCHAR) * dlg.m_ofn.nMaxFile);
  690. // 显示文件对话框,获得文件名集合
  691. int retval = dlg.DoModal();
  692. if(retval==IDCANCEL)
  693. return ;
  694. POSITION pos_file;
  695. pos_file = dlg.GetStartPosition();
  696. CArray<CString, CString> ary_filename;
  697. while(pos_file != NULL)
  698. ary_filename.Add(dlg.GetNextPathName(pos_file));
  699. int nFileCount = ary_filename.GetSize();
  700. // 清屏;
  701. m_ctrlListShow.DeleteAllItems();
  702. m_dwRecord = 0;
  703. //根据扩展名读取相关文件
  704. for(int i=0; i<nFileCount; i++)
  705. {
  706. CString str_ext;
  707. str_ext = ary_filename.GetAt(i).Right(3);
  708. if ( str_ext.CollateNoCase(_T("xls")) != 0 )
  709. {
  710. str_ext.Format(_T("文件:%s 不是xls文件,无法读取..."),ary_filename.GetAt(i));
  711. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&str_ext,1);
  712. continue;
  713. }
  714. ReadExcelToList(&m_ctrlListShow, ary_filename.GetAt(i), m_dwRecord);
  715. str_ext.Format(_T("文件:%s 导入成功..."),ary_filename.GetAt(i));
  716. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&str_ext,0);
  717. }
  718. delete []dlg.m_ofn.lpstrFile;
  719. dlg.m_ofn.lpstrFile=NULL;
  720. ++m_dwRecord;
  721. }
  722. //全部提交
  723. void ClyfzAttendanceDlg::OnBnClickedAllsubmitBtn()
  724. {
  725. // TODO: 在此添加控件通知处理程序代码
  726. KillTimer(3);
  727. CString strShow;
  728. if( m_ctrlListShow.GetItemCount() && MessageBox(_T("全部提交前,是否备份当前列表数据于xls文件中?"), _T("提示"), MB_YESNO|MB_ICONQUESTION) == IDYES ) //IDNO
  729. {
  730. CString strRet = ExportListToExcel(&m_ctrlListShow, _T("LoginData"));
  731. if(strRet == _T(""))
  732. {
  733. strShow.Format(_T("打开文件失败"));
  734. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  735. return;
  736. }
  737. strShow.Format(_T("备份当前列表数据于%s中成功"), strRet.GetBuffer(strRet.GetLength()-1));
  738. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  739. strRet.ReleaseBuffer();
  740. }
  741. if( CDataManager::GetInstance()->IsThreadRuning())
  742. {
  743. // 全部提交前,先停止实时提交;
  744. CDataManager::GetInstance()->EndofRealTimeSubmitThread();
  745. strShow.Format(_T("停止实时采集数据"));
  746. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  747. }
  748. // 清屏;
  749. m_ctrlListShow.DeleteAllItems();
  750. m_dwRecord = 0;
  751. strShow.Format(_T("全部数据正在提交,指纹机不可用,请等待提交完毕......."));
  752. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0);
  753. // 禁用全部按钮;
  754. ChangeCtrlStatus();
  755. if(CDataManager::GetInstance()->StartSubmitAllThread() == 0)
  756. {
  757. // 创建线程失败;
  758. CString strShow = _T("全部提交失败,请重试");
  759. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 1);
  760. return;
  761. }
  762. else
  763. {
  764. SetTimer(2,1000,NULL);
  765. }
  766. }
  767. //选择提交
  768. void ClyfzAttendanceDlg::OnBnClickedSelsubmitBtn()
  769. {
  770. // TODO: 在此添加控件通知处理程序代码
  771. // 读取指纹机全部记录,通过筛选获取指定时间的记录;
  772. KillTimer(3);
  773. CString strShow;
  774. if( CDataManager::GetInstance()->IsThreadRuning())
  775. {
  776. // 全部提交前,先停止实时提交;
  777. CDataManager::GetInstance()->EndofRealTimeSubmitThread();
  778. strShow.Format(_T("停止实时采集数据"));
  779. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  780. }
  781. // 选择提交前,先备份当前list记录;
  782. if( m_ctrlListShow.GetItemCount() && MessageBox(_T("选择提交前,是否备份当前列表数据于xls文件中?"), _T("提示"), MB_YESNO|MB_ICONQUESTION) == IDYES ) //IDNO
  783. {
  784. CString strRet = ExportListToExcel(&m_ctrlListShow, _T("LoginData"));
  785. if(strRet == _T(""))
  786. {
  787. strShow.Format(_T("打开文件失败"));
  788. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  789. return;
  790. }
  791. strShow.Format(_T("备份当前列表数据于%s中成功"), strRet.GetBuffer(strRet.GetLength()-1));
  792. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  793. strRet.ReleaseBuffer();
  794. }
  795. // 清屏;
  796. m_ctrlListShow.DeleteAllItems();
  797. m_dwRecord = 0;
  798. //读取数据
  799. std::vector<STGeneralLogData> vtGeneralLogData;
  800. if(g_pCMachineMgrBase->ReadAllGlLogData(&vtGeneralLogData) == -1)
  801. return;
  802. DlgTimeChoose dlg;
  803. if ( dlg.DoModal() != IDOK )
  804. {
  805. strShow.Format(_T("取消选择提交!!!"));
  806. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  807. return;
  808. }
  809. std::vector<STGeneralLogData>::iterator it = vtGeneralLogData.begin();
  810. for ( ;it != vtGeneralLogData.end(); )
  811. {
  812. // 删除不符合条件的记录;
  813. COleDateTime tagDT(it->dwYear, it->dwMonth, it->dwDay, it->dwHour, it->dwMinute, 0);
  814. if ( tagDT <= dlg.m_BeginTime1 || tagDT >= dlg.m_EndTime1)
  815. it = vtGeneralLogData.erase(it);
  816. else
  817. ++it;
  818. }
  819. if ( vtGeneralLogData.size() == 0 )
  820. {
  821. // 指定时间段没有数据;
  822. strShow.Format(_T("指定时间段没有数据!!!"));
  823. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  824. return;
  825. }
  826. DWORD dwTime = GetTickCount();
  827. DWORD dwRealCount = CDataManager::GetInstance()->WriteIntoDatabase(&vtGeneralLogData);
  828. dwTime = GetTickCount() - dwTime;
  829. strShow.Format(_T("指定时间段的记录共%d条,去除重复的共提交到数据库%d条记录,耗时%d毫秒"), vtGeneralLogData.size(), dwRealCount, dwTime);
  830. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0);
  831. //UpdateData(FALSE);
  832. //m_ctrlListShow.Invalidate();
  833. CString strRet = ExportListToExcel(&m_ctrlListShow,_T("LoginData"));
  834. if ( strRet == "" )
  835. {
  836. strShow = _T("选择提交前备份指纹机全部登进数据于xls中失败,请手动保存");
  837. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 1);
  838. }
  839. else
  840. {
  841. strShow.Format(_T("选择提交前备份指纹机全部登进数据于%s.xls中成功"), strRet.GetBuffer(strRet.GetLength()-1));// Debug下,这样用strShow自己format自己的用法,会产生栈越界;
  842. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0);
  843. strRet.ReleaseBuffer();
  844. }
  845. }
  846. //删除记录
  847. void ClyfzAttendanceDlg::OnBnClickedDelLogBtn()
  848. {
  849. // TODO: 在此添加控件通知处理程序代码
  850. CString strShow;
  851. // 删除前,提示备份处理;
  852. MessageBox(_T("删除指纹机打卡数据前,需要提交全部数据并保存于文件中"), _T("提示"), MB_OK | MB_ICONQUESTION);
  853. if( CDataManager::GetInstance()->IsThreadRuning())
  854. {// 全部提交前,先停止实时提交;
  855. CDataManager::GetInstance()->EndofRealTimeSubmitThread();
  856. strShow.Format(_T("停止实时采集数据"));
  857. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 1);
  858. }
  859. // 清屏;
  860. m_ctrlListShow.DeleteAllItems();
  861. UpdateData(FALSE);
  862. m_dwRecord = 0;
  863. strShow.Format(_T("删除前全部数据正在提交,指纹机不可用,请等待提交完毕......."));
  864. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0);
  865. std::vector<STGeneralLogData> vtGeneralLogData;
  866. DWORD dwCount = g_pCMachineMgrBase->ReadAllGlLogData(&vtGeneralLogData); // 不用1的.因为提交全部时,要禁止使用指纹机;
  867. DWORD dwTime = GetTickCount();
  868. DWORD dwRealCount = CDataManager::GetInstance()->WriteIntoDatabase(&vtGeneralLogData); // 不使用PostMessage来处理;
  869. dwTime = GetTickCount() - dwTime;
  870. if ( dwCount == 0)
  871. {
  872. strShow.Format(_T("指纹机无记录!!!"),dwCount,dwRealCount,dwTime);
  873. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow, 1);
  874. return;
  875. }
  876. strShow.Format(_T("全部记录共%d条,去除重复的共提交到数据库%d条记录,耗时%d毫秒"), dwCount, dwRealCount, dwTime);
  877. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,0);
  878. // 提交到数据库完毕后,备份于xls文件中;
  879. // int n = m_ctrlListShow.GetItemCount();
  880. // m_ctrlListShow.Invalidate();
  881. AfxMessageBox(_T("请确保所有数据已上传并备份"));
  882. CString strRet = ExportListToExcel(&m_ctrlListShow,_T("LoginData"));
  883. if ( strRet == _T(""))
  884. {
  885. strShow = _T("删除前备份指纹机全部登进数据于xls中失败,请重新尝试");
  886. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  887. m_ctrlListShow.DeleteAllItems();
  888. UpdateData(FALSE);
  889. m_dwRecord = 0;
  890. vector<STGeneralLogData> vtGeneralLogData;
  891. g_pCMachineMgrBase->ReadAllGlLogData(&vtGeneralLogData); // 不用1的.因为提交全部时,要禁止使用指纹机;
  892. ChangeCtrlStatus(2);
  893. return;
  894. }
  895. else
  896. {
  897. m_ctrlListShow.DeleteAllItems();
  898. UpdateData(FALSE);
  899. m_dwRecord = 0;
  900. strShow.Format(_T("删除前备份指纹机全部登进数据于%s.xls中成功"), strRet.GetBuffer(strRet.GetLength()-1));// Debug下,这样用strShow自己format自己的用法,会产生栈越界;
  901. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0);
  902. strRet.ReleaseBuffer();
  903. }
  904. // 备份完毕,删除指纹机数据;
  905. // 未发布前,禁用
  906. g_pCMachineMgrBase->DelLogData();
  907. strShow.Format(_T("指纹机全部登进数据已完成删除,不可恢复"));
  908. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  909. }
  910. //实时提交
  911. void ClyfzAttendanceDlg::OnBnClickedRealtimeconfirmBtn()
  912. {
  913. // TODO: 在此添加控件通知处理程序代码
  914. SetTimer(3, 60*1000, NULL);
  915. GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(FALSE);
  916. GetDlgItem(IDC_StopConfirm_BTN)->EnableWindow(TRUE);
  917. CString strShow;
  918. strShow.Format(_T("启动实时采集数据"));
  919. SendMessage(MSG_SHOWPROMPTING, (WPARAM)&strShow, 0);
  920. }
  921. //停止提交
  922. void ClyfzAttendanceDlg::OnBnClickedStopconfirmBtn()
  923. {
  924. // TODO: 在此添加控件通知处理程序代码
  925. KillTimer(3);
  926. CString strShow;
  927. strShow.Format(_T("停止实时采集数据"));
  928. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strShow,1);
  929. GetDlgItem(IDC_RealTimeConfirm_BTN)->EnableWindow(TRUE);
  930. GetDlgItem(IDC_StopConfirm_BTN)->EnableWindow(FALSE);
  931. }
  932. void ClyfzAttendanceDlg::OnTimer(UINT_PTR nIDEvent)
  933. {
  934. if ( nIDEvent == 2)
  935. {
  936. if ( CDataManager::GetInstance()->IsSubmitAllThreadRuning() == FALSE)
  937. {
  938. // LOG4C((LOG_NOTICE, "启动log日志 全部提交完成"));
  939. KillTimer(2);
  940. // 启用全部按钮;
  941. ChangeCtrlStatus(2);
  942. CString strErrorDescriptor = _T("全部提交完成");
  943. SendMessage(MSG_SHOWPROMPTING,(WPARAM)&strErrorDescriptor,0);
  944. }
  945. }
  946. if( nIDEvent == 3)
  947. {
  948. if(CDBInterface::GetInstance()->IsOpen() && g_pCMachineMgrBase->IsOpenDevice())
  949. {
  950. if(CDataManager::GetInstance()->IsThreadRuning() == TRUE)
  951. return;
  952. // 注意,实际提交只适用没有大量数据囤积的情况;线程周期为100ms,所有处理必须在一个周期内完成;
  953. //m_pFKAttendImpl->ResumeAttendThread();// 线程挂起时,会占用FK接口函数;不能使用挂起,只能结束
  954. CDataManager::GetInstance()->StartRealTimeSubmitThread();
  955. }
  956. }
  957. CDialog::OnTimer(nIDEvent);
  958. }
  959. void ClyfzAttendanceDlg::OnDestroy()
  960. {
  961. if(g_pCMachineMgrBase)
  962. {
  963. g_pCMachineMgrBase->CloseDevice();
  964. delete g_pCMachineMgrBase;
  965. g_pCMachineMgrBase = NULL;
  966. }
  967. CDialog::OnDestroy();
  968. // TODO: 在此处添加消息处理程序代码
  969. }
  970. void ClyfzAttendanceDlg::OnClose()
  971. {
  972. ShowWindow(SW_HIDE);
  973. }
  974. //连接数据库
  975. void ClyfzAttendanceDlg::OnBnClickedDbConnect()
  976. {
  977. // TODO: 在此添加控件通知处理程序代码
  978. }
  979. void ClyfzAttendanceDlg::OnBnClickedClearMgrBtn()
  980. {
  981. // TODO: 在此添加控件通知处理程序代码
  982. if(!CDBInterface::GetInstance()->IsOpen())
  983. {
  984. MessageBox(_T("没有连接数据库"));
  985. return;
  986. }
  987. CClearMgrDlg dlg;
  988. if(dlg.DoModal() == IDCANCEL)
  989. return;
  990. CString strAccount = dlg.m_strAccount;
  991. CString strPSD = dlg.m_strPSD;
  992. if(strAccount == _T(""))
  993. {
  994. MessageBox(_T("请输入帐号"));
  995. return;
  996. }
  997. if(strPSD == _T(""))
  998. {
  999. MessageBox(_T("请输入密码"));
  1000. return;
  1001. }
  1002. CString strFilter = _T("");
  1003. CString strTableName = _T("");
  1004. strFilter = _T("Account='") + strAccount + _T("' and PWD='") + strPSD + _T("'");
  1005. CDBInterface::GetInstance()->GetTableNameByType(NAME_renyuan2, strTableName);
  1006. if(CDBInterface::GetInstance()->GetSelectCount(&strTableName, &strFilter) <= 0)
  1007. {
  1008. LOG4C((LOG_NOTICE, "读取新数据库"));
  1009. WCHAR szwBuffer[256] = {0};
  1010. char szBuffer[256] = {0};
  1011. WChar2Char(szBuffer, strPSD);
  1012. CMD5 iMD5;
  1013. iMD5.GenerateMD5((unsigned char*)szBuffer, strlen(szBuffer));
  1014. string strss = iMD5.ToString();
  1015. Char2WChar(szwBuffer, strss.c_str());
  1016. strPSD = szwBuffer;
  1017. strFilter = _T("Account='") + strAccount + _T("' and PWD='") + strPSD + _T("'");
  1018. CDBInterface::GetInstance()->GetTableNameByType(NAME_renyuan2, strTableName);
  1019. if(CDBInterface::GetInstance()->GetSelectCount(&strTableName, &strFilter) <= 0)
  1020. {
  1021. MessageBox(_T("帐号或密码不正确"));
  1022. return;
  1023. }
  1024. }
  1025. LOG4C((LOG_NOTICE, "纹机是否已连接"));
  1026. if(g_pCMachineMgrBase->IsOpenDevice() == 0)
  1027. {
  1028. MessageBox(_T("请确保指纹机已连接"));
  1029. return;
  1030. }
  1031. LOG4C((LOG_NOTICE, "清除管理员"));
  1032. if(g_pCMachineMgrBase->BenumbAllManager() == 0)
  1033. {
  1034. MessageBox(_T("清除失败"));
  1035. return;
  1036. }
  1037. MessageBox(_T("清除成功"));
  1038. }
  1039. /////////////////////////////////////////////////////////////////////////////
  1040. /*
  1041. 函数:ReadConnectInfo
  1042. 描述:读取指纹机配置文件
  1043. 参数:
  1044. int& nType 返回机器类型
  1045. 返回:
  1046. */
  1047. /////////////////////////////////////////////////////////////////////////////
  1048. void ClyfzAttendanceDlg::ReadConnectInfo(DEVICECFG& cfg)
  1049. {
  1050. WCHAR szFile[MAX_PATH + 1] = {0};// = ".\\OTA710C.ini";
  1051. wsprintf(szFile, _T("%s\\GC0307.ini"), g_ModulePath);
  1052. // 1.公共信息;
  1053. cfg.nMachineType = GetPrivateProfileInt(_T("CommonInfo"), _T("MachineType"), 0, szFile);
  1054. cfg.nType = GetPrivateProfileInt(_T("CommonInfo"), _T("ConnectType"), 0, szFile);
  1055. WCHAR wszMachineNumber[MAX_PATH + 1] = {0};
  1056. GetPrivateProfileString(_T("CommonInfo"), _T("MachineNumber"), _T(""), wszMachineNumber, MAX_PATH, szFile);
  1057. char szMachineNumber[MAX_PATH + 1] = {0};
  1058. WChar2Char(szMachineNumber, wszMachineNumber);
  1059. cfg.lMachineNumber = atol(szMachineNumber);
  1060. WCHAR wszLicense[MAX_PATH + 1] = {0};
  1061. GetPrivateProfileString(_T("CommonInfo"), _T("License"), _T(""), wszLicense, MAX_PATH, szFile);
  1062. char szLicense[MAX_PATH + 1] = { 0 };
  1063. WChar2Char(szLicense, wszLicense);
  1064. cfg.lLicense = atol(szLicense);
  1065. // 2.串口信息;
  1066. cfg.lComPort = GetPrivateProfileInt(_T("SerialInfo"), _T("SerialPort"), 0, szFile);
  1067. cfg.lBaudRate = GetPrivateProfileInt(_T("SerialInfo"), _T("Rate"), 0, szFile);
  1068. cfg.lWaitDialTime = GetPrivateProfileInt(_T("SerialInfo"), _T("WaitDialTime"), 0, szFile);
  1069. memset(cfg.szTelNumber, 0, sizeof(WCHAR)*(MAX_PATH));
  1070. GetPrivateProfileString(_T("SerialInfo"), _T("TelNumber"), _T(""), cfg.szTelNumber, MAX_PATH, szFile);
  1071. // 3.网络信息;
  1072. memset(cfg.szIpAddress, 0, sizeof(WCHAR)*(MAX_PATH));
  1073. GetPrivateProfileString(_T("NetInfo"), _T("IP"), _T(""), cfg.szIpAddress, MAX_PATH, szFile);
  1074. cfg.lPort = GetPrivateProfileInt(_T("NetInfo"), _T("Port"), 0, szFile);
  1075. cfg.lTimeOut = GetPrivateProfileInt(_T("NetInfo"), _T("TimeOut"), 0, szFile);
  1076. cfg.lProtocolType = GetPrivateProfileInt(_T("NetInfo"), _T("ProtocolType"), 0, szFile);
  1077. cfg.lNetPassword = GetPrivateProfileInt(_T("NetInfo"), _T("NetPassword"), 0, szFile);
  1078. }
  1079. /////////////////////////////////////////////////////////////////////////////
  1080. /*
  1081. 函数:InitDeviceData
  1082. 描述:初始化设备数据
  1083. 参数:
  1084. int& nType 返回机器类型
  1085. 返回:
  1086. */
  1087. /////////////////////////////////////////////////////////////////////////////
  1088. int ClyfzAttendanceDlg::InitDeviceData()
  1089. {
  1090. if(g_pCMachineMgrBase)
  1091. OnBnClickedBlack();
  1092. if(g_pCMachineMgrBase == NULL)
  1093. {
  1094. switch(m_Devicecfg.nMachineType)
  1095. {
  1096. case 0: //奥芯
  1097. g_pCMachineMgrBase = (CMachineMgrBase*)new CFpClockCtrlMgr((CWnd*)&m_FP_CLOCK);
  1098. break;
  1099. case 1: //鑫澳康
  1100. g_pCMachineMgrBase = (CMachineMgrBase*)new CFKAttendCtrlMgr((CWnd*)&m_FKAttend);
  1101. break;
  1102. }
  1103. return g_pCMachineMgrBase->InitMgrCfg(&m_Devicecfg);
  1104. }
  1105. return 1;
  1106. }