中控考勤機接口開發


本文參考手冊:《TFT 系列脫機通訊開發包開發手冊》

 

業務需求:

1、定時同步考勤機的刷卡記錄到數據庫

2、推送人員信息到考勤機

 

主要內容:

1、定時同步考勤記錄到數據庫

2、用戶信息、指紋操作

3、考勤記錄批量操作

 

正文

1、定時任務

1-1、定義全局變量

 1         #region 窗體變量
 2         string USERID = "";//同步到數據庫的參數
 3         string CHARGE_TIME = "";//同步到數據庫的參數
 4         string VERIFYMODE = "";//同步到數據庫的參數
 5         string WORKCODE = "";//同步到數據庫的參數
 6         string PASSWORD = "";//同步到數據庫的參數
 7         string PRIVILEGE = "";//同步到數據庫的參數
 8         string ENABLE = "";//同步到數據庫的參數
 9         System.Timers.Timer atimer = new System.Timers.Timer(); //定時任務
10         #endregion    
11 
12         #region 考勤機變量
13         public CZKEMClass axCZKEM1 = new CZKEMClass();
14         private bool bIsConnected = false;
15         private int iMachineNumber = 1;
16 
17         string sdwEnrollNumber = "";//用戶ID
18         string sName = "";//姓名
19         string sPassword = "";//密碼
20         int iPrivilege = 0;
21         bool bEnabled = false;
22         string sCardnumber = "";//卡號
23         int dwWorkCode = 0;
24         int dwVerifyMode;
25         int dwInOutMode;
26         int dwYear;//刷卡時間
27         int dwMonth;
28         int dwDay;
29         int dwHour;
30         int dwMinute;
31         int dwSecond;
32         string verifyMode = "";
33         string privilege = "";
34         string enabled = "";
35         #endregion
View Code

 

1-2、連接考勤機

 1 #region 考勤機功能:打開連接
 2         private void connectZK()
 3         {
 4             //若IP、端口號為空則不能連接
 5             if (txtIP.Text.Trim() == "" || txtPort.Text.Trim() == "")
 6             {
 7                 WriteLog.Write("WARN", txtIP.Text, "打開連接時IP或端口不能為空");
 8                 return;
 9             }
10             //若狀態為已連接則先關閉連接
11             if (bIsConnected == true)
12             {
13                 disconnectZK();
14             }
15             //連接機器
16             int idwErrorCode = 0;
17             Cursor = Cursors.WaitCursor;
18             bIsConnected = axCZKEM1.Connect_Net(txtIP.Text, Convert.ToInt32(txtPort.Text));
19             if (bIsConnected == true)
20             {
21                 lblState.Text = "Current State:Connected";
22                 iMachineNumber = 1;//In fact,when you are using the tcp/ip communication,this parameter will be ignored,that is any integer will all right.Here we use 1.
23                 axCZKEM1.RegEvent(iMachineNumber, 65535);//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all)
24                 WriteLog.Write("INFO", txtIP.Text, "連接成功。");
25             }
26             else
27             {
28                 axCZKEM1.GetLastError(ref idwErrorCode);
29                 WriteLog.Write("WARN", txtIP.Text, "連接失敗。ErrorCode=" + idwErrorCode.ToString());
30             }
31             Cursor = Cursors.Default;
32         }
33         #endregion
34 
35         #region 考勤機功能:關閉連接
36         private void disconnectZK()
37         {
38             if (txtIP.Text.Trim() == "" || txtPort.Text.Trim() == "")
39             {
40                 WriteLog.Write("WARN", txtIP.Text, "關閉連接時IP或端口不能為空");
41                 return;
42             }
43 
44             Cursor = Cursors.WaitCursor;
45             if (bIsConnected)
46             {
47                 axCZKEM1.Disconnect();
48                 bIsConnected = false;
49                 lblState.Text = "Current State:DisConnected";
50                 WriteLog.Write("INFO", txtIP.Text, "連接關閉。");
51                 Cursor = Cursors.Default;
52                 return;
53             }
54             else
55             {
56                 Cursor = Cursors.Default;
57             }
58         }
59         #endregion
View Code

 

1-3、配置定時任務

這里使用.net工具箱提供的定時器System.Windows.Forms.Timer。

需要同步記錄或推送人員時再打開連接,否則可能會出現因連接時間過長導致連接失去響應。

 1 #region 定時任務配置
 2         private void timerSync_Tick(object sender, EventArgs e)
 3         {
 4             int nowhour = int.Parse(DateTime.Now.Hour.ToString());
 5             int nowminute = int.Parse(DateTime.Now.Minute.ToString());
 6             // 8:00~23:00
 7             if (nowhour >= 8 && nowhour <= 22)
 8             {
 9                 // 打開連接
10                 connectZK();
11                 if (bIsConnected == true)
12                 {
13                     // 同步刷卡
14                     getLogData();
15                     // 關閉連接
16                     disconnectZK();
17                 }
18             }
19             // 23:00
20             if (nowhour == 23 && nowminute == 00)
21             {
22                 // 打開連接
23                 connectZK();
24                 if (bIsConnected == true)
25                 {
26                     // 清空考勤機刷卡記錄
27                     clearRecord();
28                     // 推送人員
29                     pushEmp();
30                     // 關閉連接
31                     disconnectZK();
32                 }
33             }  
34         }
35         #endregion
View Code

 

1-4、同步刷卡記錄

 1 #region 任務-同步刷卡數據到MES數據庫
 2         private void getLogData()
 3         {
 4             if (bIsConnected == false)
 5             {
 6                 WriteLog.Write("WARN", "", "當前未連接考勤機");
 7                 return;
 8             }
 9             Cursor = Cursors.WaitCursor;
10             //先禁用機器
11             axCZKEM1.EnableDevice(iMachineNumber, false);
12             //獲取所有用戶的考勤記錄到緩存區
13             axCZKEM1.ReadAllGLogData(iMachineNumber);
14             while (axCZKEM1.SSR_GetGeneralLogData(iMachineNumber, out sdwEnrollNumber, out dwVerifyMode, out dwInOutMode, out dwYear, out dwMonth, out dwDay, out dwHour, out dwMinute, out dwSecond, ref dwWorkCode))//get user information from memory
15             {
16                 switch (dwVerifyMode)
17                 {
18                     case 0:
19                         verifyMode = "密碼驗證";
20                         break;
21                     case 1:
22                         verifyMode = "指紋驗證";
23                         break;
24                     case 2:
25                         verifyMode = "卡驗證";
26                         break;
27                     default:
28                         verifyMode = "其他驗證";
29                         break;
30                 }
31                 //循環獲取用戶信息
32                 axCZKEM1.SSR_GetUserInfo(iMachineNumber, sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled);
33                 if (axCZKEM1.GetStrCardNumber(out sCardnumber))//get the card number from the memory
34                 {
35                     switch (iPrivilege)
36                     {
37                         case 0:
38                             privilege = "普通用戶";
39                             break;
40                         case 3:
41                             privilege = "管理員";
42                             break;
43                         default:
44                             privilege = "其他權限";
45                             break;
46                     }
47                     switch (bEnabled)
48                     {
49                         case true:
50                             enabled = "啟用";
51                             break;
52                         case false:
53                             enabled = "禁用";
54                             break;
55                     }
56                     USERID = sdwEnrollNumber;
57                     CHARGE_TIME = dwYear.ToString() + "-" + dwMonth.ToString() + "-" + dwDay.ToString() + " " + dwHour.ToString() + ":" + dwMinute.ToString() + ":" + dwSecond.ToString();
58                     CHARGE_DATE = dwYear.ToString("0000") + "-" +dwMonth.ToString("00") + "-" + dwDay.ToString("00");
59                     VERIFYMODE = verifyMode;
60                     WORKCODE = dwWorkCode.ToString();
61                     //NAME = sName+ "\0";
62                     //NAME = NAME.Replace("\0", "");
63                     PASSWORD = sPassword;
64                     PRIVILEGE = privilege;
65                     ENABLE = enabled;
66                     string ID = dwYear.ToString() + dwMonth.ToString() + dwDay.ToString() + dwHour.ToString() + dwMinute.ToString() + dwSecond.ToString();
67                     DateTime now = DateTime.Now;
68                     string thisyear = now.Year.ToString();
69                     string thismonth = now.Month.ToString();
70                     string thisday = now.Day.ToString();
71                     // 僅同步當天的刷卡記錄
72                     if (dwYear.ToString() == thisyear && dwMonth.ToString() == thismonth && dwDay.ToString() == thisday)
73                     {
74                         // 這個調用插入數據庫的方法
75                         WriteLog.Write("INFO", "", "同步刷卡記錄到數據庫");
76                     }
77                 }
78             }
79             axCZKEM1.EnableDevice(iMachineNumber, true);//enable the device
80             Cursor = Cursors.Default;  
81         }
82         #endregion
View Code

 

1-5、推送數據庫中人員到考勤機

 1 private void pushEmp()
 2         {
 3             if (bIsConnected == false)
 4             {
 5                 WriteLog.Write("WARN", "", "當前未連接考勤機");
 6                 return;
 7             }
 8             //獲取orcale表推送狀態為0的人員,推送到考勤機
 9             DataTable pushdt = BllEmpSync.pushEmp();
10             string[] push_num = new string[pushdt.Rows.Count];
11             string[] push_name = new string[pushdt.Rows.Count];
12             string[] push_cardnum = new string[pushdt.Rows.Count];
13             WriteLog.Write("INFO", txtIP.Text, "開始推送人員信息...待推送人員數:" + pushdt.Rows.Count.ToString());
14             for (int i = 0; i < pushdt.Rows.Count; i++)
15             {
16                 DataRow dr = pushdt.Rows[i];
17                 push_num[i] = Convert.ToString(dr["T_USERID"]);
18                 push_name[i] = Convert.ToString(dr["T_USERNAME"]);
19                 push_cardnum[i] = Convert.ToString(dr["CARDID"]);
20                 axCZKEM1.SetStrCardNumber(push_cardnum[i]);
21                 //2、設置用戶信息
22                 bool a = axCZKEM1.SSR_SetUserInfo(iMachineNumber, push_num[i], push_name[i], push_num[i], 0, true);
23                 if (a) WriteLog.Write("INFO", txtIP.Text, "推送人員" + push_num[i] + "成功。");
24                 else WriteLog.Write("WARN", txtIP.Text, "推送人員" + push_num[i] + "失敗。");
25             }
26             BllEmpSync.updateEmp();
27         }
View Code

 

1-6、每天定時清空考勤機刷卡記錄

(防止同步時因數據太多而變卡,調用方法見2-7)

2、考勤機管理注:以下方法省略了考勤機的打開與關閉連接)

2-1、查詢考勤機內已注冊用戶

(注意:如果考勤機內沒有注冊指紋信息,代碼里面有查詢指紋,那么加載會變得非常慢。要提前注釋掉查詢指紋的代碼!)

 1         #region 考勤機功能:獲取用戶
 2         private void btnGetStrCardNumber_Click(object sender, EventArgs e)
 3         {
 4             if (bIsConnected == false)
 5             {
 6                 MessageBox.Show("Please connect the device first!", "Error");
 7                 return;
 8             }
 9             lvCard.Items.Clear();
10             lvCard.BeginUpdate();
11             Cursor = Cursors.WaitCursor;
12             //先禁用機器
13             axCZKEM1.EnableDevice(iMachineNumber, false);//disable the device
14             //獲取所有用戶的記錄到緩存區
15             axCZKEM1.ReadAllUserID(iMachineNumber);//獲取所有信息到緩存區(提高效率)
16             axCZKEM1.ReadAllTemplate(iMachineNumber);//獲取所有指紋信息到緩存區(提高效率)
17             while (axCZKEM1.SSR_GetAllUserInfo(iMachineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))//get user information from memory
18             {
19                 //循環獲取用戶信息
20                 if (axCZKEM1.GetStrCardNumber(out sCardnumber))//get the card number from the memory
21                 {
22                     ListViewItem list = new ListViewItem();
23                     list.Text = sdwEnrollNumber;
24                     list.SubItems.Add(sName);
25                     list.SubItems.Add(sCardnumber);
26                     list.SubItems.Add(iPrivilege.ToString());
27                     list.SubItems.Add(sPassword);
28                     if (bEnabled == true)
29                     {
30                         list.SubItems.Add("true");
31                     }
32                     else
33                     {
34                         list.SubItems.Add("false");
35                     }
36 
37                     for (int dwFingerIndex = 0; dwFingerIndex < 10; dwFingerIndex++)
38                     {
39                         if (axCZKEM1.SSR_GetUserTmpStr(iMachineNumber, sdwEnrollNumber, dwFingerIndex, out dwTmpData, out dwTmpLength))
40                         {
41                             list.SubItems.Add(dwTmpData);
42                         }
43                         else
44                         {
45                             list.SubItems.Add("");
46                         }
47                     }
48 
49                     lvCard.Items.Add(list);
50                 }
51             }
52             
53             axCZKEM1.EnableDevice(iMachineNumber, true);//enable the device
54             lvCard.EndUpdate();
55             Cursor = Cursors.Default;
56         }
57         #endregion
View Code

 

2-2、注冊單個用戶到考勤機

 1         #region 考勤機功能:注冊用戶
 2         private void btnSetStrCardNumber_Click(object sender, EventArgs e)
 3         {
 4             if (bIsConnected == false)
 5             {
 6                 MessageBox.Show("Please connect the device first!", "Error");
 7                 return;
 8             }
 9             //下發用戶到機器        
10             //1、設置卡號
11             //string CardNo = System.Convert.ToInt32(txtCardNo.Text, 16).ToString();//轉換16進制到十進制
12             axCZKEM1.SetStrCardNumber(txtCardNo.Text);
13             //2、設置用戶信息
14             axCZKEM1.SSR_SetUserInfo(iMachineNumber, "用戶ID", "用戶姓名", "密碼", 0, true);
15         }
16         #endregion
View Code

 

2-3、批量注冊用戶

 1         #region 考勤機功能:批量注冊用戶
 2         private void btnSetStrCardNumbers_Click(object sender, EventArgs e)
 3         {
 4             if (XCMessageBox.Show("確定?", XCMessageBox.Buttons.OKCancel, XCMessageBox.Icon.Question) == DialogResult.OK)
 5             {
 6                 System.Data.DataTable dt = getEmp();//getEmp()獲取數據庫中需要注冊的用戶
 7                 string[] useruid = new string[dt.Rows.Count];
 8                 string[] useruname = new string[dt.Rows.Count];
 9                 string[] cardid = new string[dt.Rows.Count];
10                 for (int i = 0; i < dt.Rows.Count; i++)
11                 {
12                     DataRow dr = dt.Rows[i];
13                     useruid[i] = Convert.ToString(dr["T_USERID"]);
14                     useruname[i] = Convert.ToString(dr["T_USERNAME"]);
15                     cardid[i] = Convert.ToString(dr["CARDID"]);
16                     //16進制轉10進制
17                     //string CardNo = System.Convert.ToInt32(cardid[i], 16).ToString();
18                     axCZKEM1.SetStrCardNumber(cardid[i]);
19                     //2、設置用戶信息
20                     bool a = axCZKEM1.SSR_SetUserInfo(iMachineNumber, useruid[i], useruname[i], useruid[i], 0, true);
21                 }
22             }  
23         }
24         #endregion
View Code

 

2-4、刪除用戶

 1         #region 考勤機功能:刪除用戶
 2         private void btnDelStrCardNumber_Click(object sender, EventArgs e)
 3         {
 4             if (bIsConnected == false)
 5             {
 6                 MessageBox.Show("Please connect the device first!", "Error");
 7                 return;
 8             }
 9             if (XCMessageBox.Show("確定?", XCMessageBox.Buttons.OKCancel, XCMessageBox.Icon.Question) == DialogResult.OK)
10             {
11                 axCZKEM1.SSR_DeleteEnrollData(iMachineNumber, "用戶ID", 12);
12             }
13         }
14         #endregion
View Code

 

2-5、增刪指紋

(這里有一點要注意:考勤機算法不同的話,增加指紋所調用的方法不同,使用前先查看考勤機算法)

 1         #region 考勤機功能:增刪指紋
 2         private void btnDelTmp_Click(object sender, EventArgs e)
 3         {
 4             if (bIsConnected == false)
 5             {
 6                 MessageBox.Show("Please connect the device first!", "Error");
 7                 return;
 8             }
 9             if (XCMessageBox.Show("確定?", XCMessageBox.Buttons.OKCancel, XCMessageBox.Icon.Question) == DialogResult.OK)
10             {
11                 bool a = axCZKEM1.SSR_DelUserTmp(iMachineNumber, "用戶ID", "(int)第幾個指紋");
12                 //bool a = axCZKEM1.SSR_DeleteEnrollDataExt(iMachineNumber, txtEmpNo.Text, 13);//刪除所有指紋
13             }
14         }
15 
16         private void btnAddTmp_Click(object sender, EventArgs e)
17         {
18             if (bIsConnected == false)
19             {
20                 MessageBox.Show("Please connect the device first!", "Error");
21                 return;
22             }
23             System.Data.DataTable dt = new System.Data.DataTable();
24             for (int i = 0; i < 10; i++)
25             {
26                 
27                 //循環獲取十個指紋
28                 dt = getEmpTmp(i.ToString());//獲取數據庫中第i個指紋
29                 for (int j = 0; j < dt.Rows.Count; j++)
30                 {
31                     
32                     //循環數據庫中的用戶數
33                     USERID = dt.Rows[j]["數據庫中用戶ID"].ToString();
34                     dwTmpData = dt.Rows[j]["數據庫中第i個指紋"].ToString();
35                     bool a = axCZKEM1.SetUserTmpExStr(iMachineNumber, USERID, i, 1, dwTmpData);
36                 }    
37             }
38 
39             //獲取算法版本
40             /*string sValue;
41             axCZKEM1.GetSysOption(1, "~ZKFPVersion", out sValue);
42             txtInfo.Text = sValue;*/
43         }
44         #endregion
View Code

 

2-6、清空考勤機所有注冊的用戶

 1         #region 考勤機功能:清空考勤機用戶
 2         private void btnDel_Click(object sender, EventArgs e)
 3         {
 4             if (bIsConnected == false)
 5             {
 6                 MessageBox.Show("Please connect the device first!", "Error");
 7                 return;
 8             }
 9             if (XCMessageBox.Show("確定?", XCMessageBox.Buttons.OKCancel, XCMessageBox.Icon.Question) == DialogResult.OK)
10             {
11                 Cursor = Cursors.WaitCursor;
12                 //先禁用機器
13                 axCZKEM1.EnableDevice(iMachineNumber, false);//disable the device
14                                                              //獲取所有用戶的記錄到緩存區
15                 axCZKEM1.ReadAllUserID(iMachineNumber);//獲取所有信息到緩存區(提高效率)
16                 while (axCZKEM1.SSR_GetAllUserInfo(iMachineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))//get user information from memory
17                 {
18                     axCZKEM1.SSR_DeleteEnrollDataExt(iMachineNumber, sdwEnrollNumber, 12);
19                 }
20 
21                 axCZKEM1.EnableDevice(iMachineNumber, true);//enable the device
22                 Cursor = Cursors.Default;
23             }
24         }
25         #endregion
View Code

 

2-7、清空考勤機所有刷卡記錄

 1         #region 考勤機功能:清空考勤記錄
 2         private void btnDelLogData_Click(object sender, EventArgs e)
 3         {
 4             if (bIsConnected == false)
 5             {
 6                 MessageBox.Show("Please connect the device first!", "Error");
 7                 return;
 8             }
 9             if (XCMessageBox.Show("確定?", XCMessageBox.Buttons.OKCancel, XCMessageBox.Icon.Question) == DialogResult.OK)
10             {
11                 axCZKEM1.ClearGLog(iMachineNumber);
12             }
13         }
14         #endregion
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM