197 lines
8.0 KiB
Markdown
197 lines
8.0 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Project Overview
|
|
|
|
This is a data synchronization system (BLD_sync) that extracts data from:
|
|
- **Microsoft Access databases** (.accdb) located on network shares
|
|
- **Excel files** (.xlsm) containing production execution cards and contract data
|
|
|
|
And synchronizes it to:
|
|
- **Microsoft SQL Server** (CompanyDB) with multiple schemas organized by data type
|
|
|
|
The system supports both full initialization sync and incremental sync driven by a change log table.
|
|
|
|
## Architecture
|
|
|
|
### Data Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
|
│ Network File Sources │
|
|
│ Access DBs (\\192.168.110.114\生产进度表\) │
|
|
│ Excel Files (\\192.168.110.113\生产执行卡\) │
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
|
│ Sync Scripts │
|
|
│ • etl_manager.py - Main ETL orchestrator (primary) │
|
|
│ • sync_excel_to_sql.py - Excel to SQL sync (legacy/alternative) │
|
|
│ • migration.py - Legacy customer product type migration │
|
|
│ • run_incremental_sync.py - Change log driven incremental sync │
|
|
│ • init_full_sync.py - Full table truncation/reload │
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
|
│ SQL Server (CompanyDB) │
|
|
│ Schemas: productionContractData, productWarehousing, │
|
|
│ workshopOne/Two/Three, machining, contractPlanning, │
|
|
│ inspectionRecords, partsWarehouse, etc. │
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Key Components
|
|
|
|
**etl_manager.py** - Primary ETL orchestrator
|
|
- `DataSynchronizer` class manages Excel to SQL sync
|
|
- Supports incremental sync via file modification time comparison
|
|
- Caches Excel files locally in `excel_cache/` directory
|
|
- Uses SQLAlchemy with `fast_executemany=True` for bulk operations
|
|
- Generates `contractData` table via MERGE statement from `executionCardData`
|
|
|
|
**config.py** - Central configuration
|
|
- `SYNC_MAPPING`: Nested dict mapping Access files → tables → SQL targets
|
|
- `EXCEL_CONFIGS`: List of Excel file configs with sheet names and field mappings
|
|
- `TABLE_SCHEMA`: Column type definitions for data cleaning
|
|
- `NTFY_CONFIG`: Push notification settings
|
|
- `LOG_TABLE_CONFIG`: Change log table schema for incremental sync
|
|
|
|
**db_utils.py** - Database connection utilities
|
|
- `get_sql_conn()`: SQL Server connection via pyodbc
|
|
- `get_access_conn()`: Access database connection
|
|
- `fmt_table()`: Safe table name formatting `[schema].[table]`
|
|
- `generate_insert_sql()`: Dynamic INSERT statement generation
|
|
|
|
**ntfy_utils.py** - Push notifications
|
|
- Sends alerts to ntfy server on errors/completion
|
|
- Uses Bearer token authentication
|
|
|
|
**run_incremental_sync.py** - Log-driven incremental sync
|
|
- Polls `TableChangeLog` table for unsynced records (`Synced=0`)
|
|
- Queries by `TableAddress` to match configured file paths
|
|
- Processes deletions and insertions in batches
|
|
- Long-running service with configurable polling interval
|
|
|
|
**init_full_sync.py** - Full table reload
|
|
- Truncates target tables and reloads all data from Access
|
|
- Handles IDENTITY_INSERT ON/OFF for tables with identity columns
|
|
- Progress logging with row counts and throughput metrics
|
|
|
|
## Common Development Tasks
|
|
|
|
### Install Dependencies
|
|
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### Run Full Initial Sync (Reload All Data)
|
|
|
|
```bash
|
|
python init_full_sync.py
|
|
```
|
|
|
|
### Run Excel to SQL Sync (Standard)
|
|
|
|
```bash
|
|
python etl_manager.py
|
|
```
|
|
|
|
Force sync all files (ignore modification times):
|
|
```bash
|
|
python etl_manager.py --force
|
|
```
|
|
|
|
### Run Incremental Sync Service (Change Log Driven)
|
|
|
|
```bash
|
|
python run_incremental_sync.py
|
|
```
|
|
|
|
### Run Legacy Migration Script
|
|
|
|
```bash
|
|
python migration.py
|
|
```
|
|
|
|
Edit `FORCE_UPDATE = True` in `migration.py` to force full refresh.
|
|
|
|
## Configuration Management
|
|
|
|
**Main Config File**: `config.py`
|
|
- Contains all database credentials, file paths, and mapping configurations
|
|
- Modify `SYNC_MAPPING` to add new Access files/tables
|
|
- Modify `EXCEL_CONFIGS` for new Excel sources
|
|
|
|
**Alternative Config**: `update_config.py`
|
|
- Used by `sync_excel_to_sql.py`
|
|
- Similar structure but different variable names
|
|
- Contains `EXECUTION_CARD_FIELDS`, `CONTRACT_DATA_MAPPING`
|
|
|
|
## Important Implementation Details
|
|
|
|
### SQL Server Connection
|
|
- Uses ODBC Driver 18 for SQL Server
|
|
- Requires `TrustServerCertificate=yes` due to self-signed cert
|
|
- SQLAlchemy URL: `mssql+pyodbc:///?odbc_connect=...`
|
|
- Always enable `fast_executemany=True` for bulk operations
|
|
|
|
### Access Database Connection
|
|
- Driver: `{Microsoft Access Driver (*.mdb, *.accdb)}`
|
|
- Direct file path connection via pyodbc
|
|
|
|
### Data Cleaning
|
|
- Integer fields: `pd.to_numeric().round().astype('Int64')`
|
|
- String fields: Truncate to max length, replace empty with None
|
|
- Date fields: Convert to `date()` objects, None for NaT
|
|
- Duplicate removal: Based on primary key (usually `ID` or `总排号`)
|
|
|
|
### Identity Column Handling
|
|
Tables with identity columns require:
|
|
```sql
|
|
SET IDENTITY_INSERT [schema].[table] ON
|
|
-- perform inserts
|
|
SET IDENTITY_INSERT [schema].[table] OFF
|
|
```
|
|
|
|
See `has_identity_column()` in `init_full_sync.py` for detection logic.
|
|
|
|
### File Path Matching in Incremental Sync
|
|
The change log table stores paths in VBA format:
|
|
- Network: `;DATABASE=\\server\share\file.accdb`
|
|
- Local: `LOCAL:\path\to\file.accdb` or `LOCAL=\path\to\file.accdb`
|
|
|
|
The code constructs multiple match patterns for robust matching.
|
|
|
|
## Database Schema Organization
|
|
|
|
SQL Server schemas by function:
|
|
- `warehouseOutbound` - Execution card data, contract data, customer product types
|
|
- `productionContractData` - Contract data by year (25年/26年压力表/温度计)
|
|
- `productWarehousing` - Finished product inspection/warehousing records
|
|
- `workshopOne/Two/Three` - Workshop production records
|
|
- `machining` - Machining process records (膜片焊接, 喷涂寄出, etc.)
|
|
- `contractPlanning` - Work order assignment records
|
|
- `inspectionRecords` - Quality inspection records
|
|
- `partsWarehouse` - Component inventory records
|
|
- `thermometerRecord` - Thermometer calibration/testing records
|
|
- `solderingData` - Soldering operation records
|
|
- `TIGWelding` - TIG welding records
|
|
- `executionCardIssuanceRecord` - Execution card issuance records
|
|
|
|
## Notifications
|
|
|
|
The system uses [ntfy](https://ntfy.sh/) for push notifications:
|
|
- Configured in `NTFY_CONFIG` within `config.py`
|
|
- Sends on: errors, critical failures, task completion
|
|
- Authenticated via Bearer token
|
|
|
|
## Logging
|
|
|
|
- File logs: `log/` directory with timestamp rotation
|
|
- Console output: With emoji prefixes for status (✅ ❌ ⚠️ 🔄)
|
|
- Incremental sync: Uses `TimedRotatingFileHandler` for daily log files
|