Bläddra i källkod

feat(pl): aggregate unique delivery dates from stop rows

Provide YYYY-MM-DD dedupe helper for plan list deliveryTimes.

Co-authored-by: Cursor <cursoragent@cursor.com>
wuzilong 1 månad sedan
förälder
incheckning
9c5a1cfb8e

+ 23 - 1
backend/app/services/pl_plan_stop_service.py

@@ -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,

+ 29 - 0
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)]) == []