TMAttLog

🇹🇭 ภาษาไทย

TMAttLog คือระบบ .NET C# สำหรับดึงข้อมูลการลงเวลาเข้า-ออก (Time & Attendance) จากเครื่องสแกนลายนิ้วมือ ZKTeco และส่งข้อมูลต่อไปยัง Payroll databases บนเซิร์ฟเวอร์กลาง — เป็น internal tool ที่พัฒนาขึ้นเองสำหรับบริษัทในเครือ MCIC

โครงสร้าง Solution (.sln)

Projectประเภทหน้าที่
TMAttLogWinForms GUIดึงข้อมูลจาก ZKTeco + backup ไป SQL Server (ใช้งานแบบ manual)
TMAttLogTaskProcessorConsole / HeadlessLogic เดียวกับ GUI — รันเป็น Scheduled Task อัตโนมัติ (MCIC เท่านั้น)
TMAttLogTaskProcessorVNConsole / StubVietnam version — ยังไม่ implement
TMAttLog2PayrollTaskProcessorConsole / HeadlessStage 2: อ่านข้อมูลจาก International DB แล้วส่งต่อ Payroll databases ทั้งหมด
TMAttLog2PayrollTaskProcessorVNConsole / StubVietnam 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

ZKTeco SDK & Device Platforms

PlatformClassรองรับ
ZMM (newer)zkemkeeper.CZKEMClassGetGeneralLogData
ZEM (older)zkemkeeper.CZKEMClassReadGeneralLogDataSSR_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 logsIncremental (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
< 199Normal machinesTMSTAMP (ทุก payroll DB)
199–299Special machinesTMSTAMP_OTH บน PAYROLL_MCIC50 เท่านั้น
≥ 300Other (ไม่ประมวลผล)

Connection Strings ที่ใช้งาน

DatabaseConnection
International (staging)Data Source=172.18.88.202;Initial Catalog=International;User ID=payroll;Password=paysql@2011
PAYROLL_MCIC50 (main)Initial Catalog=PAYROLL_MCIC50
att2000.mdb accessProvider=Microsoft.Jet.OLEDB.4.0;Data Source=\\172.18.88.214\BusinessData\...

วิธีการทำงาน (Step by Step)

Stage 1 — TMAttLog / TMAttLogTaskProcessor:

  1. LoadUserInfo() — อ่าน USERINFO จาก att2000.mdb (ACno ↔ PRS_E_CARD)
  2. ConnectToDevice() — TCP/IP connect ไปยัง ZKTeco machine
  3. SelectPlatformAndRetrieveData() — ดึง logs ตาม platform (ZMM/ZEM)
  4. PrepareTimeData() — JOIN userinfo + log → DATATM list
  5. BackupMachineLogs()AttendanceLog_TBL (incremental)
  6. BackupTimeData()AttendanceTM_TBL (incremental, มี PRS_E_CARD)
  7. ClearAttendanceData() — ล้าง log ใน machine (ClearGLog())

Stage 2 — TMAttLog2PayrollTaskProcessor (รันทุกวัน):

  1. SetAutoDateRange() — กำหนดช่วง: เมื่อวาน–วันนี้
  2. SearchDatabase() — อ่าน AttendanceTM_TBL ช่วงวันที่นั้น
  3. แยก normal (< 199) vs special (199–299) machines
  4. UpdateMCICDatabases() — upsert TMSTAMP ใน payroll DB ทั้งหมด (7 DB)
  5. 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

ProjectTypePurpose
TMAttLogWinForms GUIInteractive: pull ZKTeco data + backup to SQL Server
TMAttLogTaskProcessorConsole / HeadlessSame logic as GUI — runs as Scheduled Task (MCIC only)
TMAttLogTaskProcessorVNConsole / StubVietnam version — not yet implemented
TMAttLog2PayrollTaskProcessorConsole / HeadlessStage 2: reads from International DB and pushes to all Payroll DBs
TMAttLog2PayrollTaskProcessorVNConsole / StubVietnam 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

ZKTeco SDK & Device Platforms

PlatformAPI MethodNotes
ZMM (newer)GetGeneralLogDataDirect bulk retrieval
ZEM (older)ReadGeneralLogDataSSR_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 RangeCategoryTarget Table
< 199NormalTMSTAMP (all payroll DBs)
199–299SpecialTMSTAMP_OTH on PAYROLL_MCIC50 only
≥ 300Other (skipped)

Stage 1 Processing Steps

  1. LoadUserInfo() — read USERINFO from att2000.mdb (ACno ↔ PRS_E_CARD mapping)
  2. ConnectToDevice() — TCP/IP connect to ZKTeco machine
  3. SelectPlatformAndRetrieveData() — pull logs per platform (ZMM/ZEM)
  4. PrepareTimeData() — JOIN userinfo + raw logs → DATATM list
  5. BackupMachineLogs() → insert new records into AttendanceLog_TBL (incremental)
  6. BackupTimeData() → insert new records into AttendanceTM_TBL (incremental, includes PRS_E_CARD)
  7. ClearAttendanceData() — wipe logs from machine (ClearGLog())

Stage 2 Processing Steps

  1. Auto date range: yesterday → today
  2. Read AttendanceTM_TBL for the date range
  3. Separate normal (< 199) vs special (199–299) records
  4. Upsert TMSTAMP in all 7 payroll databases (merge existing timestamps)
  5. 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