71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
def resolve_published_batch(
|
|
markers: list[dict[str, Any]],
|
|
requested_date: str,
|
|
legacy_date: str = "",
|
|
) -> tuple[dict[str, Any] | None, dict[str, Any], dict[str, Any] | None]:
|
|
requested_marker = next(
|
|
(
|
|
item for item in markers
|
|
if str(item.get("trade_date") or "") == requested_date
|
|
),
|
|
None,
|
|
)
|
|
published = next(
|
|
(item for item in markers if item.get("status") == "complete"),
|
|
None,
|
|
)
|
|
if published is None and legacy_date:
|
|
published = {
|
|
"trade_date": legacy_date,
|
|
"status": "complete",
|
|
"legacy_inferred": True,
|
|
"completed": [],
|
|
"skipped": [],
|
|
"failed": [],
|
|
}
|
|
|
|
request_status = dict(requested_marker or {})
|
|
request_status.setdefault("trade_date", requested_date)
|
|
request_status.setdefault("status", "pending")
|
|
descriptor = _published_descriptor(published, requested_date, request_status)
|
|
if descriptor and descriptor["is_fallback"]:
|
|
request_status["retaining_trade_date"] = descriptor["trade_date"]
|
|
return published, request_status, descriptor
|
|
|
|
|
|
def _published_descriptor(
|
|
marker: dict[str, Any] | None,
|
|
requested_date: str,
|
|
request_status: dict[str, Any],
|
|
) -> dict[str, Any] | None:
|
|
if marker is None:
|
|
return None
|
|
trade_date = str(marker.get("trade_date") or "")
|
|
is_fallback = trade_date != requested_date
|
|
status = str(request_status.get("status") or "pending")
|
|
notice = ""
|
|
if is_fallback:
|
|
if status == "running":
|
|
notice = "所选日期候选正在生成,当前保留上一成功批次"
|
|
elif status in {"failed", "partial"}:
|
|
notice = "所选日期候选未完整发布,当前保留上一成功批次"
|
|
else:
|
|
notice = "所选日期候选尚未发布,当前展示最近成功批次"
|
|
return {
|
|
"trade_date": trade_date,
|
|
"status": "complete",
|
|
"started_at": marker.get("started_at") or "",
|
|
"finished_at": marker.get("finished_at") or marker.get("updated_at") or "",
|
|
"library_version": int(marker.get("library_version") or 0),
|
|
"completed_count": len(marker.get("completed") or []),
|
|
"skipped_count": len(marker.get("skipped") or []),
|
|
"legacy_inferred": bool(marker.get("legacy_inferred")),
|
|
"is_fallback": is_fallback,
|
|
"notice": notice,
|
|
}
|