using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Threading; using System.Net.NetworkInformation; using System.Data.OracleClient; using System.Diagnostics; using MySql.Data.MySqlClient; namespace ZktecoAttendenceService { public partial class DevicePolling : Form { static MySqlConnection connection; static ConnectionClass ObjConnectionClass = new ConnectionClass(); AttendanceDAO attendanceDAO = new AttendanceDAO(); AttendanceMachineUserDAO attendanceMachineUserDAO = new AttendanceMachineUserDAO(); WriteToTxtFile WriteFile_obj = new WriteToTxtFile(); public zkemkeeper.CZKEMClass axCZKEM1 = new zkemkeeper.CZKEMClass(); private bool bIsConnected = false;//the boolean value identifies whether the device is connected private int iMachineNumber = 0;//the serial number of the device.After connecting the device ,this value will be changed. DataTable dtMachines = new DataTable(); DataTable dtPAth = new DataTable(); List empList = new List(); public DevicePolling() { InitializeComponent(); } private void DevicePolling_Load(object sender, EventArgs e) { //timer1.Enabled = true; //timer1.Interval = 100; //timer1.Start(); WriteFile_obj.WriteToFile("--Service is started at " + DateTime.Now, "ZKTECOAttendance"); List responses = StartPooling(); foreach (var response in responses) { WriteFile_obj.WriteToFile(response, "ZKTECOAttendance"); } WriteFile_obj.WriteToFile("--Service is stopped at " + DateTime.Now, "ZKTECOAttendance"); Application.Exit(); } public List StartPooling() { try { List responses = new List(); AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO(); AttendanceMachineUserDAO attendanceMachineUserDAO = new AttendanceMachineUserDAO(); using (var connection = ObjConnectionClass.Connection()) { if (ObjConnectionClass.OpenConnection(connection)) { var machines = attendanceMachineDAO.getAttendanceMachines(connection, "0"); foreach (var machine in machines) { if (machine.MachineIp == "192.168.50.8") { bool isConnected = axCZKEM1.Connect_Net(machine.MachineIp, Convert.ToInt32(machine.PortNumber)); if (isConnected) { axCZKEM1.EnableDevice(Convert.ToInt32(machine.MachineId), false); if (machine.MachineId != "100") { machine.Status = "SYNCING"; attendanceMachineDAO.update(machine, connection); responses.AddRange(poolMachineData(machine.MachineIp, machine.PortNumber, Convert.ToInt16(machine.MachineId), connection)); machine.Status = "IDLE"; DateTime now = DateTime.Now.AddMinutes(-5); machine.LastSyncDate = now; Console.WriteLine(machine.MachineId + " => " + machine.LastSyncDate); attendanceMachineDAO.update(machine, connection); List newResponses = new List(); GetAllFaceInfo(axCZKEM1, machine); attendanceMachineUserDAO.UpdateTotalEmpInMachines(machine.MachineId, empList.Count, connection); newResponses = attendanceMachineUserDAO.DeleteFromDbAndMachine(axCZKEM1, empList, machine, connection); if (newResponses.Count != 0) { responses.AddRange(newResponses); } //Saving the templates to the database //SaveTemplateDb saveTemplateDb = new SaveTemplateDb(); //saveTemplateDb.InsertFaceIntoDb(machine, connection, axCZKEM1); empList = new List(); axCZKEM1.EnableDevice(Convert.ToInt32(machine.MachineId), true); Cursor = Cursors.Default; axCZKEM1.Disconnect(); } else { machine.Status = "SYNCING"; attendanceMachineDAO.updateColony(machine, connection); responses.AddRange(poolMachineDataColony(machine.MachineIp, machine.PortNumber, Convert.ToInt16(machine.MachineId),connection)); machine.Status = "IDLE"; DateTime now = DateTime.Now.AddMinutes(-5); machine.LastSyncDate = now; Console.WriteLine(machine.MachineId + " => " + machine.LastSyncDate); attendanceMachineDAO.updateColony(machine, connection); axCZKEM1.EnableDevice(Convert.ToInt32(machine.MachineId), true); Cursor = Cursors.Default; axCZKEM1.Disconnect(); } } else { responses.Add("MACHINE : " + machine.MachineIp + " : NOT CONNECTED"); machine.Status = "NOT CONNECTED"; attendanceMachineDAO.update(machine, connection); } } } } } return responses; } catch { Exception ex = new Exception(); return null; } } public List poolMachineDataColony(string ip, int port, int machineId, MySqlConnection connection) { List responses = new List(); int idwErrorCode = 0; int countAttendance = 0; bool allRecordsSaved = true; // Flag to track if all records are saved successfully // Ensure axCZKEM1 is initialized before using it if (axCZKEM1 == null) { responses.Add($"MACHINE: {ip} - ERROR: SDK Not Initialized"); return responses; } try { // Connect to the machine bool isConnected = axCZKEM1.Connect_Net(ip, port); if (!isConnected) { axCZKEM1.GetLastError(ref idwErrorCode); responses.Add($"MACHINE: {ip} - ERROR: Unable to connect (Code {idwErrorCode})"); return responses; } // Disable the device during data retrieval axCZKEM1.EnableDevice(machineId, false); string sdwEnrollNumber; int idwVerifyMode, idwInOutMode, idwYear, idwMonth, idwDay, idwHour, idwMinute, idwSecond, idwWorkcode = 0; if (axCZKEM1.ReadAllGLogData(machineId)) // Read all attendance logs { while (axCZKEM1.SSR_GetGeneralLogData(machineId, out sdwEnrollNumber, out idwVerifyMode, out idwInOutMode, out idwYear, out idwMonth, out idwDay, out idwHour, out idwMinute, out idwSecond, ref idwWorkcode)) { try { DateTime date = new DateTime(idwYear, idwMonth, idwDay, idwHour, idwMinute, idwSecond); Attendance log = new Attendance(sdwEnrollNumber, date, false, machineId.ToString(), "1", ip, DateTime.Now); attendanceDAO.AddColony(log, connection); countAttendance++; responses.Add($"MACHINE: {ip} - EMP NO: {sdwEnrollNumber} - TIME: {date}"); } catch (Exception ex) { responses.Add($"MACHINE: {ip} - ERROR: {ex.Message}"); allRecordsSaved = false; // Mark as false if any record fails } } // **Clear Attendance Logs Only If All Records Are Saved** if (allRecordsSaved) { if (axCZKEM1.ClearGLog(machineId)) { responses.Add($"MACHINE: {ip} - ATTENDANCE LOGS CLEARED SUCCESSFULLY"); } else { axCZKEM1.GetLastError(ref idwErrorCode); responses.Add($"MACHINE: {ip} - ERROR: Failed to clear logs (Code {idwErrorCode})"); } } else { responses.Add($"MACHINE: {ip} - LOGS NOT CLEARED: Some records failed to save."); } } else { axCZKEM1.GetLastError(ref idwErrorCode); responses.Add($"MACHINE: {ip} - NO DATA (Error Code {idwErrorCode})"); } } catch (Exception ex) { responses.Add($"MACHINE: {ip} - ERROR: {ex.Message}"); } finally { // Re-enable the device and disconnect axCZKEM1.EnableDevice(machineId, true); axCZKEM1.Disconnect(); } return responses; } int errorCode = 0; public List poolMachineData(string ip, int port, int machineId, MySqlConnection connection) { List responses = new List(); List attendanceLogs = new List(); string sdwEnrollNumber = ""; int idwVerifyMode = 0; int idwInOutMode = 0; int idwYear = 0; int idwMonth = 0; int idwDay = 0; int idwHour = 0; int idwMinute = 0; int idwSecond = 0; int idwWorkcode = 0; try { DateTime today = DateTime.Today; DateTime startTime = new DateTime(today.Year, today.Month, today.Day, 4, 0, 0); // 4:00 AM DateTime endTime = new DateTime(today.Year, today.Month, today.Day, 16, 0, 0); // 4:00 PM string startTimeFormatted = startTime.ToString("yyyy-MM-dd HH:mm:ss"); string endTimeFormatted = endTime.ToString("yyyy-MM-dd HH:mm:ss"); //if(axCZKEM1.ReadGeneralLogData(machineId)) if (axCZKEM1.ReadAllGLogData(machineId)) // Connect and read attendance records //if (axCZKEM1.ReadTimeGLogData(machineId, startTimeFormatted, endTimeFormatted)) // read all the attendance records into memory { while (axCZKEM1.SSR_GetGeneralLogData(machineId, out sdwEnrollNumber, out idwVerifyMode, out idwInOutMode, out idwYear, out idwMonth, out idwDay, out idwHour, out idwMinute, out idwSecond, ref idwWorkcode)) // get records from memory { DateTime date = new DateTime(idwYear, idwMonth, idwDay, idwHour, idwMinute, idwSecond); Attendance log = new Attendance(sdwEnrollNumber, date, false, machineId.ToString(), "1", ip, DateTime.Now); attendanceLogs.Add(log); // Add to the bulk insert list // Optionally log the retrieved record responses.Add($"MACHINE: {ip}, EMP NO: {sdwEnrollNumber}, TIME: {date}"); } // Perform bulk insert for all records2 try { if (attendanceLogs.Count > 0) { attendanceDAO.BulkInsert(attendanceLogs, connection); // Bulk insert method responses.Add($"Successfully inserted {attendanceLogs.Count} records for MACHINE: {ip}"); // Clear logs from the machine axCZKEM1.ClearGLog(machineId); } else { responses.Add($"MACHINE: {ip} - No attendance logs found."); } } catch (Exception ex) { responses.Add($"Error during bulk insert: {ex.Message}"); } } else { axCZKEM1.GetLastError(ref errorCode); // Get the last error code responses.Add($"MACHINE: {ip} - No data available."); //MessageBox.Show(errorCode.ToString()); ; } return responses; } catch (Exception ex) { responses.Add($"Error: {ex.Message}"); return responses; } } public List GetAllFaceInfo(zkemkeeper.CZKEMClass axCZKEM1, AttendanceMachine machine) { bool Bconnect = false; string sdwEnrollNumber = string.Empty, sName = string.Empty, sPassword = string.Empty; int iPrivilege = 0, iFaceIndex = 0, iFlag = 0, iTmpLength = 0; bool bEnabled = false; //Bconnect = axCZKEM1.Connect_Net(machine.MachineIp, Convert.ToInt32(machine.PortNumber)); //axCZKEM1.EnableDevice(Convert.ToInt16(machine.MachineId), false);//disable the device //if (Bconnect == true) //{ //objZkeeper.ReadAllUserID(machineNumber); axCZKEM1.ReadAllTemplate(Convert.ToInt16(machine.MachineId)); while (axCZKEM1.SSR_GetAllUserInfo(Convert.ToInt16(machine.MachineId), out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled)) { empList.Add(sdwEnrollNumber); } //} return empList; } public string GetTotalFromMachine(int MachineID) { string response = ""; string sdwEnrollNumber = string.Empty, sName = string.Empty, sPassword = string.Empty; int iPrivilege = 0, iFaceIndex = 0, iFlag = 0, iTmpLength = 0; bool bEnabled = false; axCZKEM1.ReadAllUserID(MachineID); //axCZKEM1.ReadAllTemplate(MachineID); int totalCount = 0; while (axCZKEM1.SSR_GetAllUserInfo(MachineID, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled)) { totalCount++; } attendanceMachineUserDAO.UpdateTotalEmpInMachines(MachineID.ToString(), totalCount, connection); response = "MACHINE : " + MachineID + ", TOTAL EMP : " + totalCount + ""; return response; } static string GetMonthName(int monthNum) { return GetMonthName(monthNum, false); } static string GetMonthName(int monthNum, bool abbreviate) { if (monthNum < 1 || monthNum > 12) throw new ArgumentOutOfRangeException("monthNum"); DateTime date = new DateTime(1, monthNum, 1); if (abbreviate) return date.ToString("MMM"); else return date.ToString("MMMM"); } private void timer1_Tick(object sender, EventArgs e) { StartPooling(); } } }