Update: Refactor to absolute imports, fix QPS limits, and enhance Gitea sync with SQLite support
This commit is contained in:
@@ -16,9 +16,9 @@ from typing import Dict, List, Optional, Tuple, Callable
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from ..utils.log_utils import get_logger
|
||||
from ..utils.file_utils import smart_read_excel
|
||||
from ...core.handlers.column_mapper import ColumnMapper
|
||||
from app.core.utils.log_utils import get_logger
|
||||
from app.core.utils.file_utils import smart_read_excel
|
||||
from app.core.handlers.column_mapper import ColumnMapper
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
@@ -43,6 +43,13 @@ class ProductDatabase:
|
||||
max_price REAL DEFAULT 0.0,
|
||||
price_count INTEGER DEFAULT 0
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS missing_barcodes (
|
||||
barcode TEXT PRIMARY KEY,
|
||||
name TEXT DEFAULT '',
|
||||
last_seen TEXT,
|
||||
source_file TEXT,
|
||||
count INTEGER DEFAULT 1
|
||||
);
|
||||
"""
|
||||
|
||||
_NEW_COLUMNS = {
|
||||
@@ -90,16 +97,68 @@ class ProductDatabase:
|
||||
def _migrate_schema(self):
|
||||
conn = self._connect()
|
||||
try:
|
||||
# 迁移 products 表
|
||||
cursor = conn.execute("PRAGMA table_info(products)")
|
||||
existing_cols = {row[1] for row in cursor.fetchall()}
|
||||
for col_name, col_type in self._NEW_COLUMNS.items():
|
||||
if col_name not in existing_cols:
|
||||
conn.execute(f"ALTER TABLE products ADD COLUMN {col_name} {col_type}")
|
||||
logger.info(f"数据库迁移: 添加列 {col_name}")
|
||||
|
||||
# 确保 missing_barcodes 表存在
|
||||
conn.execute("""
|
||||
CREATE TABLE IF NOT EXISTS missing_barcodes (
|
||||
barcode TEXT PRIMARY KEY,
|
||||
name TEXT DEFAULT '',
|
||||
last_seen TEXT,
|
||||
source_file TEXT,
|
||||
count INTEGER DEFAULT 1
|
||||
)
|
||||
""")
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
# ══════════════════════════════════════════════════════════════
|
||||
# 缺失条码记录
|
||||
# ══════════════════════════════════════════════════════════════
|
||||
|
||||
def record_missing_barcode(self, barcode: str, name: str = '', source_file: str = ''):
|
||||
"""记录缺失条码。"""
|
||||
barcode = str(barcode).strip()
|
||||
if not barcode:
|
||||
return
|
||||
now = datetime.now().isoformat(timespec='seconds')
|
||||
conn = self._connect()
|
||||
try:
|
||||
conn.execute("""
|
||||
INSERT INTO missing_barcodes (barcode, name, last_seen, source_file, count)
|
||||
VALUES (?, ?, ?, ?, 1)
|
||||
ON CONFLICT(barcode) DO UPDATE SET
|
||||
name = CASE WHEN excluded.name != '' THEN excluded.name ELSE name END,
|
||||
last_seen = excluded.last_seen,
|
||||
source_file = excluded.source_file,
|
||||
count = count + 1
|
||||
""", (barcode, name, now, os.path.basename(source_file)))
|
||||
conn.commit()
|
||||
logger.info(f"已记录缺失条码: {barcode} ({name})")
|
||||
except Exception as e:
|
||||
logger.error(f"记录缺失条码失败: {e}")
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_missing_barcodes(self, limit: int = 100) -> List[Dict]:
|
||||
"""获取缺失条码列表。"""
|
||||
conn = self._connect()
|
||||
conn.row_factory = sqlite3.Row
|
||||
try:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM missing_barcodes ORDER BY last_seen DESC LIMIT ?",
|
||||
(limit,)).fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
# ══════════════════════════════════════════════════════════════
|
||||
# 导入
|
||||
# ══════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user