#!/usr/bin/env python3 """回溯同步:对所有有到货批次或历史批次关联的订单重新计算实际到货数量/未到货数""" import sys import os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from services.db import query import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s [SYNC] %(message)s') def sync_order_arrival_totals(order_id, order_type): """Rebuild one order's summary fields strictly from its own batch rows.""" table_map = { 'domestic': ('domestic_orders', '实际到货日期'), 'overseas': ('overseas_orders', '实际到货日期'), 'packaging': ('packaging_orders', '到货日期'), } table_info = table_map[order_type] table, date_col = table_info rows = query("SELECT `数量` FROM " + table + " WHERE id=%s", (order_id,)) if not rows: return False aggregate = query("""SELECT COUNT(*) AS batch_count, COALESCE(SUM(arrival_qty), 0) AS total, MAX(arrival_date) AS latest_date FROM arrival_batches WHERE order_id=%s AND order_type=%s""", (order_id, order_type))[0] order_qty = int(rows[0].get('数量') or 0) if int(aggregate.get('batch_count') or 0) > 0: total = int(aggregate.get('total') or 0) latest_date = aggregate.get('latest_date') else: current_rows = query( "SELECT `实际到货数量`, `" + date_col + "` AS current_arrival_date FROM " + table + " WHERE id=%s", (order_id,) ) current = current_rows[0] if current_rows else {} total = int(current.get('实际到货数量') or 0) latest_date = current.get('current_arrival_date') unfinished = order_qty - total query("UPDATE " + table + " SET `实际到货数量`=%s, `未到货数`=%s, `" + date_col + "`=%s WHERE id=%s", (total, unfinished, latest_date, order_id)) logging.info(f'{order_type}.id={order_id}: 到货合计={total}, 未完结={unfinished}, 最近日期={latest_date}') return True def backfill_all(): print("=" * 60) print("按订单类型全量同步到货批次汇总") print("=" * 60) table_map = { 'domestic': 'domestic_orders', 'overseas': 'overseas_orders', 'packaging': 'packaging_orders', } for order_type, table in table_map.items(): rows = query("SELECT id FROM " + table + " ORDER BY id") count = 0 for row in rows: if sync_order_arrival_totals(row['id'], order_type): count += 1 print(f" {order_type}: 完成 {count}/{len(rows)} 个订单") print("全量回溯同步完成!") if __name__ == '__main__': backfill_all()