TMAttLog
🇹🇭 ภาษาไทย
TMAttLog คือระบบ .NET C# สำหรับดึงข้อมูลการลงเวลาเข้า-ออก (Time & Attendance) จากเครื่องสแกนลายนิ้วมือ ZKTeco และส่งข้อมูลต่อไปยัง Payroll databases บนเซิร์ฟเวอร์กลาง — เป็น internal tool ที่พัฒนาขึ้นเองสำหรับบริษัทในเครือ MCIC
โครงสร้าง Solution (.sln)
Project ประเภท หน้าที่ TMAttLog WinForms GUI ดึงข้อมูลจาก ZKTeco + backup ไป SQL Server (ใช้งานแบบ manual) TMAttLogTaskProcessor Console / Headless Logic เดียวกับ GUI — รันเป็น Scheduled Task อัตโนมัติ (MCIC เท่านั้น) TMAttLogTaskProcessorVN Console / Stub Vietnam version — ยังไม่ implement TMAttLog2PayrollTaskProcessor Console / Headless Stage 2: อ่านข้อมูลจาก International DB แล้วส่งต่อ Payroll databases ทั้งหมด TMAttLog2PayrollTaskProcessorVN Console / Stub Vietnam payroll version — ยังไม่ implement
สถาปัตยกรรมระบบ (Data Flow)
ZKTeco Machine (TCP/IP :4370)
↓ zkemkeeper COM SDK (CZKEMClass)
att2000.mdb (MS Access, network share)
\\172.18.88.214\BusinessData\HR Attandance\
├── MCIC\att2000.mdb ← ไทย
└── MCICVN\att2000.mdb ← เวียดนาม
↓ OLE DB (Jet 4.0)
↓ JOIN: USERINFO (ACno ↔ PRS_E_CARD) + GeneralLogData (timestamp)
SQL Server 172.18.88.202 — DB: International
├── AttendanceLog_TBL ← raw ZKTeco logs (incremental)
└── AttendanceTM_TBL ← processed + PRS_E_CARD (incremental)
↓ TMAttLog2PayrollTaskProcessor (รันทุกวัน เวลาเดิม)
↓ filter: เมื่อวาน–วันนี้
Multiple Payroll DBs (172.18.88.202)
PAYROLL_MCIC50 → TMSTAMP (Main MCIC TH)
PAYROLL_MCIC50_02 → TMSTAMP
PAYROLL_MCIC50_03 → TMSTAMP
PAYROLL_LF50 → TMSTAMP
PAYROLL_VALLEY50 → TMSTAMP
PAYROLL_EX50 → TMSTAMP
PAYROLL_MCICVN → TMSTAMP (MCIC Vietnam)
PAYROLL_NNP50 → TMSTAMP
PAYROLL_ALIEN50 → TMSTAMP
PAYROLL_MCIC50 (special machines 199–299) → TMSTAMP_OTH
Platform Class รองรับ ZMM (newer)zkemkeeper.CZKEMClass✅ GetGeneralLogData ZEM (older)zkemkeeper.CZKEMClass✅ ReadGeneralLogData → SSR_GetGeneralLogData
เชื่อมต่อผ่าน TCP/IP: Connect_Net(ip, 4370)
หลัง backup สำเร็จ: ล้างข้อมูลใน machine ด้วย ClearGLog()
Database Schema (ตารางสำคัญ)
att2000.mdb (MS Access — ZKTeco native)
ตาราง คอลัมน์สำคัญ หมายเหตุ USERINFOBadgenumber (ACno), SSN (= PRS_E_CARD), NAMEพนักงาน GeneralLogDataenrollNumber, dwTMachineNumber, timestampLog ดิบ
International (SQL Server — staging)
ตาราง คอลัมน์สำคัญ หมายเหตุ AttendanceLog_TBLraw logs Incremental (MAX TMTIME) AttendanceTM_TBLPRS_E_CARD, TMM_DATE, MachineNoProcessed, incremental
PAYROLL_xxxx (SQL Server — payroll target)
ตาราง คอลัมน์สำคัญ หมายเหตุ PERSONALINFOPRS_EMP, PRS_E_CARDEmployee ID mapping TMSTAMPTMM_KEY, TMM_EMP, TMM_DATE, TMM_STAMP_1..14สูงสุด 14 stamp ต่อวัน TMSTAMP_OTHเหมือน TMSTAMP สำหรับ special machines (MachineNo 199–299)
Machine Number Convention
ช่วง MachineNo ประเภท ตาราง target < 199 Normal machines TMSTAMP (ทุก payroll DB)199–299 Special machines TMSTAMP_OTH บน PAYROLL_MCIC50 เท่านั้น≥ 300 Other (ไม่ประมวลผล) —
Connection Strings ที่ใช้งาน
Database Connection International (staging) Data Source=172.18.88.202;Initial Catalog=International;User ID=payroll;Password=paysql@2011PAYROLL_MCIC50 (main) Initial Catalog=PAYROLL_MCIC50att2000.mdb access Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\172.18.88.214\BusinessData\...
วิธีการทำงาน (Step by Step)
Stage 1 — TMAttLog / TMAttLogTaskProcessor:
LoadUserInfo() — อ่าน USERINFO จาก att2000.mdb (ACno ↔ PRS_E_CARD)
ConnectToDevice() — TCP/IP connect ไปยัง ZKTeco machine
SelectPlatformAndRetrieveData() — ดึง logs ตาม platform (ZMM/ZEM)
PrepareTimeData() — JOIN userinfo + log → DATATM list
BackupMachineLogs() → AttendanceLog_TBL (incremental)
BackupTimeData() → AttendanceTM_TBL (incremental, มี PRS_E_CARD)
ClearAttendanceData() — ล้าง log ใน machine (ClearGLog())
Stage 2 — TMAttLog2PayrollTaskProcessor (รันทุกวัน):
SetAutoDateRange() — กำหนดช่วง: เมื่อวาน–วันนี้
SearchDatabase() — อ่าน AttendanceTM_TBL ช่วงวันที่นั้น
แยก normal (< 199) vs special (199–299) machines
UpdateMCICDatabases() — upsert TMSTAMP ใน payroll DB ทั้งหมด (7 DB)
UpdateSpecialDatabases() — upsert TMSTAMP_OTH บน MC50 เท่านั้น
Incremental Backup Logic
ตรวจ MAX(TMTIME) ที่มีอยู่แล้วใน target table
Insert เฉพาะ records ที่ใหม่กว่า — ป้องกัน duplicate
TMSTAMP: ถ้ามี record วันนั้นอยู่แล้ว → merge timestamps แล้ว update (ไม่ใช่ insert)
SQL Server parameter limit: batch 1000 records เพื่อหลีกเลี่ยง 2100-param limit
CCTV Integration — ระบบ CCTV + biometrics ที่ใช้คู่กัน (Dahua)
Dahua.Api — C# wrapper สำหรับ Dahua NVR (face recognition attendance)
Odoo HR — HR module ของ Odoo ที่อาจเชื่อมต่อระบบ payroll
🇬🇧 English
TMAttLog is a .NET C# system that pulls time-and-attendance data from ZKTeco fingerprint/card machines and pushes it into Payroll databases on a central SQL Server. It is an internal tool built for MCIC group companies.
Solution Structure
Project Type Purpose TMAttLog WinForms GUI Interactive: pull ZKTeco data + backup to SQL Server TMAttLogTaskProcessor Console / Headless Same logic as GUI — runs as Scheduled Task (MCIC only) TMAttLogTaskProcessorVN Console / Stub Vietnam version — not yet implemented TMAttLog2PayrollTaskProcessor Console / Headless Stage 2: reads from International DB and pushes to all Payroll DBs TMAttLog2PayrollTaskProcessorVN Console / Stub Vietnam payroll version — not yet implemented
System Architecture (Data Flow)
ZKTeco Machine (TCP/IP :4370)
↓ zkemkeeper COM SDK (CZKEMClass)
att2000.mdb (MS Access, network share)
\\172.18.88.214\BusinessData\HR Attandance\
├── MCIC\att2000.mdb ← Thailand
└── MCICVN\att2000.mdb ← Vietnam
↓ OLE DB (Jet 4.0)
↓ JOIN: USERINFO (ACno ↔ PRS_E_CARD) + GeneralLogData (timestamp)
SQL Server 172.18.88.202 — DB: International
├── AttendanceLog_TBL ← raw ZKTeco logs (incremental append)
└── AttendanceTM_TBL ← processed with PRS_E_CARD (incremental)
↓ TMAttLog2PayrollTaskProcessor (runs daily)
↓ date range: yesterday–today
Multiple Payroll DBs (172.18.88.202)
PAYROLL_MCIC50 → TMSTAMP
PAYROLL_MCIC50_02 → TMSTAMP
PAYROLL_MCIC50_03 → TMSTAMP
PAYROLL_LF50 → TMSTAMP
PAYROLL_VALLEY50 → TMSTAMP
PAYROLL_EX50 → TMSTAMP
PAYROLL_MCICVN → TMSTAMP
PAYROLL_NNP50 → TMSTAMP
PAYROLL_ALIEN50 → TMSTAMP
PAYROLL_MCIC50 (MachineNo 199–299) → TMSTAMP_OTH
Platform API Method Notes ZMM (newer)GetGeneralLogDataDirect bulk retrieval ZEM (older)ReadGeneralLogData → SSR_GetGeneralLogDataIterator pattern
Connect: Connect_Net(ip, 4370) via TCP/IP
After successful backup: clear device logs with ClearGLog()
Key Database Tables
att2000.mdb (ZKTeco Access DB):
USERINFO: Badgenumber (ACno), SSN (= PRS_E_CARD), NAME
GeneralLogData: enrollNumber, machine number, timestamp
International (SQL Server staging):
AttendanceLog_TBL: raw device logs, incremental
AttendanceTM_TBL: processed records with PRS_E_CARD, TMM_DATE, MachineNo
PAYROLL_xxxx (SQL Server payroll target):
PERSONALINFO: PRS_EMP (int), PRS_E_CARD (string) — employee ID mapping
TMSTAMP: TMM_KEY, TMM_EMP, TMM_DATE, TMM_STAMP_1..14 — up to 14 time stamps per employee per day
TMSTAMP_OTH: same structure as TMSTAMP — for special machines (MachineNo 199–299)
Machine Number Routing
MachineNo Range Category Target Table < 199 Normal TMSTAMP (all payroll DBs)199–299 Special TMSTAMP_OTH on PAYROLL_MCIC50 only≥ 300 Other (skipped) —
Stage 1 Processing Steps
LoadUserInfo() — read USERINFO from att2000.mdb (ACno ↔ PRS_E_CARD mapping)
ConnectToDevice() — TCP/IP connect to ZKTeco machine
SelectPlatformAndRetrieveData() — pull logs per platform (ZMM/ZEM)
PrepareTimeData() — JOIN userinfo + raw logs → DATATM list
BackupMachineLogs() → insert new records into AttendanceLog_TBL (incremental)
BackupTimeData() → insert new records into AttendanceTM_TBL (incremental, includes PRS_E_CARD)
ClearAttendanceData() — wipe logs from machine (ClearGLog())
Stage 2 Processing Steps
Auto date range: yesterday → today
Read AttendanceTM_TBL for the date range
Separate normal (< 199) vs special (199–299) records
Upsert TMSTAMP in all 7 payroll databases (merge existing timestamps)
Upsert TMSTAMP_OTH on MC50 for special machines
CCTV Integration — CCTV + biometric systems (Dahua) used alongside ZKTeco
Dahua.Api — C# wrapper for Dahua NVR (face recognition attendance)
Odoo HR — Odoo HR module; potential payroll integration target