| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #!/usr/bin/env python3
- """
- 从历史出入库表(inbound_outbound)、地磅单表(weighing_slips)中提取不重复的车牌号,
- 初始化写入车牌号基础资料表(vehicles)。
- 使用方式(在 backend 目录下执行):
- python -m scripts.init_vehicles_from_history
- 或:
- uv run python -m scripts.init_vehicles_from_history
- """
- from __future__ import annotations
- import asyncio
- import sys
- from pathlib import Path
- # 将 backend 根目录加入 path,以便 import app
- backend_root = Path(__file__).resolve().parent.parent
- if str(backend_root) not in sys.path:
- sys.path.insert(0, str(backend_root))
- async def main() -> None:
- from sqlmodel import select
- from sqlmodel.ext.asyncio.session import AsyncSession
- from app.db.session import init_models, AsyncSessionLocal
- from app.models.inventory import InboundOutbound
- from app.models.master_data import Vehicle
- from app.models.weighing import WeighingSlip
- # 1. 确保所有表已创建(含 vehicles)
- await init_models()
- # 2. 从出入库表、地磅单表收集不重复车牌号(去空、去重,按原始大小写保留一个)
- seen_normalized: set[str] = set()
- vehicle_nos: list[str] = []
- async with AsyncSessionLocal() as session:
- # 出入库表:未删除记录的车牌号
- q_inv = select(InboundOutbound.vehicle_no).where(InboundOutbound.is_deleted == 0)
- result_inv = await session.exec(q_inv)
- for (v,) in result_inv.all():
- v = (v or "").strip()
- if not v:
- continue
- key = v.lower()
- if key not in seen_normalized:
- seen_normalized.add(key)
- vehicle_nos.append(v)
- # 地磅单表:未作废记录的车牌号
- q_ws = select(WeighingSlip.vehicle_no).where(WeighingSlip.is_voided == 0)
- result_ws = await session.exec(q_ws)
- for (v,) in result_ws.all():
- v = (v or "").strip()
- if not v:
- continue
- key = v.lower()
- if key not in seen_normalized:
- seen_normalized.add(key)
- vehicle_nos.append(v)
- if not vehicle_nos:
- print("未从出入库/地磅单表中发现任何车牌号,无需导入。")
- return
- # 3. 写入 vehicles 表(仅插入尚未存在的车牌号)
- from datetime import datetime
- added = 0
- skipped = 0
- async with AsyncSessionLocal() as session:
- existing = await session.exec(
- select(Vehicle.vehicle_no).where(Vehicle.is_deleted == 0)
- )
- existing_set = {row.lower() for row in existing.all()}
- for v in vehicle_nos:
- if v.lower() in existing_set:
- skipped += 1
- continue
- vehicle = Vehicle(
- vehicle_no=v,
- remarks=None,
- is_deleted=0,
- created_at=datetime.now().isoformat(),
- )
- session.add(vehicle)
- existing_set.add(v.lower())
- added += 1
- await session.commit()
- print(f"历史车牌号统计:共发现 {len(vehicle_nos)} 个不重复车牌号。")
- print(f"本次新增写入 vehicles 表:{added} 条;已存在跳过:{skipped} 条。")
- if __name__ == "__main__":
- asyncio.run(main())
|