diff --git a/backend/app/services/pl_plan_stop_service.py b/backend/app/services/pl_plan_stop_service.py index 5297d6009..9ff5b8c3a 100644 --- a/backend/app/services/pl_plan_stop_service.py +++ b/backend/app/services/pl_plan_stop_service.py @@ -2,7 +2,7 @@ from __future__ import annotations from collections import defaultdict -from datetime import datetime +from datetime import date, datetime from decimal import Decimal from typing import Optional @@ -434,6 +434,28 @@ def resolve_delivery_customer_summary( 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( plan_item, plan: PlPlan, diff --git a/backend/tests/test_pl_delivery_times_aggregate.py b/backend/tests/test_pl_delivery_times_aggregate.py new file mode 100644 index 000000000..5e22c48b1 --- /dev/null +++ b/backend/tests/test_pl_delivery_times_aggregate.py @@ -0,0 +1,29 @@ +from datetime import date, datetime + +from app.services.pl_plan_stop_service import collect_unique_delivery_date_strings + + +class _D: + def __init__(self, delivery_time): + self.delivery_time = delivery_time + + +def test_collect_unique_sorted_yyyy_mm_dd(): + rows = [ + _D(datetime(2026, 9, 14, 10, 0, 0)), + _D(datetime(2026, 9, 12, 8, 0, 0)), + _D(date(2026, 9, 12)), + _D(None), + _D(""), + _D("2026-09-13"), + ] + assert collect_unique_delivery_date_strings(rows) == [ + "2026-09-12", + "2026-09-13", + "2026-09-14", + ] + + +def test_collect_empty(): + assert collect_unique_delivery_date_strings([]) == [] + assert collect_unique_delivery_date_strings([_D(None)]) == []