|
@@ -2,7 +2,7 @@
|
|
|
from __future__ import annotations
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
from collections import defaultdict
|
|
from collections import defaultdict
|
|
|
-from datetime import datetime
|
|
|
|
|
|
|
+from datetime import date, datetime
|
|
|
from decimal import Decimal
|
|
from decimal import Decimal
|
|
|
from typing import Optional
|
|
from typing import Optional
|
|
|
|
|
|
|
@@ -434,6 +434,28 @@ def resolve_delivery_customer_summary(
|
|
|
return legacy or None
|
|
return legacy or None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def collect_unique_delivery_date_strings(deliveries) -> list[str]:
|
|
|
|
|
+ """送货段 delivery_time → 去重升序 YYYY-MM-DD。"""
|
|
|
|
|
+ days: set[date] = set()
|
|
|
|
|
+ for row in deliveries or []:
|
|
|
|
|
+ raw = getattr(row, "delivery_time", None)
|
|
|
|
|
+ if raw is None or raw == "":
|
|
|
|
|
+ continue
|
|
|
|
|
+ if isinstance(raw, datetime):
|
|
|
|
|
+ days.add(raw.date())
|
|
|
|
|
+ elif isinstance(raw, date):
|
|
|
|
|
+ days.add(raw)
|
|
|
|
|
+ else:
|
|
|
|
|
+ text = str(raw).strip()
|
|
|
|
|
+ if not text:
|
|
|
|
|
+ continue
|
|
|
|
|
+ try:
|
|
|
|
|
+ days.add(datetime.strptime(text[:10], "%Y-%m-%d").date())
|
|
|
|
|
+ except ValueError:
|
|
|
|
|
+ continue
|
|
|
|
|
+ return [d.isoformat() for d in sorted(days)]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def attach_plan_stops_to_item(
|
|
def attach_plan_stops_to_item(
|
|
|
plan_item,
|
|
plan_item,
|
|
|
plan: PlPlan,
|
|
plan: PlPlan,
|