0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

配送イベントの到着順が逆でも状態を戻さない:Pythonで証拠付きサマリーを作る

0
Posted at

問題:通知の到着順は、業務上の順序と一致しない

日本の販売店から倉庫を経て韓国へ送るような経路では、販売店・倉庫・運送会社が別々の時刻にイベントを送ります。倉庫の受領通知が先に届き、販売店の発送通知が後から届くこともあります。最後に到着した通知だけを画面表示に使うと、「受領済み」が「発送済み」に戻ってしまいます。

ここでは、イベントの到着順ではなく、定義した業務上の進行順位で表示状態を選ぶ小さな関数を作ります。架空の例であり、実サービスの内部実装や顧客データではありません。

到着順と業務上の進行順の模式図

まず、証拠を持つイベントだけを対象にする

イベントには種類、発生時刻、出典を持たせます。時刻にタイムゾーンがない、出典が空、または未知の種類なら、推測して補いません。入力を破棄した理由を本番環境で追跡するには別の検証ログが必要ですが、この最小例では表示状態を unknown にします。

入力検証の3つの独立したケース

from dataclasses import dataclass
from datetime import datetime, timezone

RANK = {
    "seller_dispatched": 1,
    "warehouse_received": 2,
    "packed": 3,
    "carrier_handoff": 4,
}

@dataclass(frozen=True)
class Event:
    kind: str
    at: datetime
    source: str

def summarize(events: list[Event]) -> dict:
    valid = [
        e for e in events
        if e.kind in RANK
        and e.at.utcoffset() is not None
        and e.source.strip()
    ]
    if not valid:
        return {"status": "unknown", "as_of": None, "evidence": None}
    best = max(valid, key=lambda e: (RANK[e.kind], e.at))
    return {
        "status": best.kind,
        "as_of": best.at.isoformat(),
        "evidence": best.source,
    }

同じ順位のイベントが複数あれば発生時刻が新しいものを選びます。異なる順位では時刻より進行順位を優先します。これは表示用サマリーの規則であり、元イベントを削除・上書きする規則ではありません。取り消しや返品は別のイベント型と状態遷移を定義する必要があります。

到着順を入れ替えてテストする

u = lambda hour: datetime(2026, 10, 2, hour, tzinfo=timezone.utc)
received = Event("warehouse_received", u(11), "warehouse scan")
dispatched = Event("seller_dispatched", u(9), "seller notice")

assert summarize([received, dispatched])["status"] == "warehouse_received"
assert summarize([dispatched, received]) == summarize([received, dispatched])
assert summarize([])["status"] == "unknown"
assert summarize([Event("packed", datetime(2026, 10, 2, 9), "scan")])["status"] == "unknown"
assert summarize([Event("packed", u(9), "")])["status"] == "unknown"

Python 3.10 以降の標準ライブラリだけで動きます。上の5つの assert はローカルで通しました。時刻や順位は仮定です。実際の運用では、配送事業者ごとのイベント定義、重複通知、訂正通知、返品・キャンセル、時計ずれ、保存期間、個人情報の扱いを別途設計してください。

顧客向け文言は証拠の範囲に合わせる

seller_dispatched は「販売店から発送された」という出典付きの観測です。倉庫への到着を意味しません。warehouse_received も梱包完了や国際運送会社への引渡しを意味しません。表示には発生時刻と出典を添え、未確認の次工程を既成事実として書かない方が安全です。

日本から韓国への転送という文脈で使用する場合、経路と現在の案内は Kimfast の日本向け案内 を別途確認できます。ただし、このページは上記コードの仕様や性能を保証する資料ではありません。

所属・制作注記: 私は Kimfast のコンテンツ・マーケティング業務に関わっています。本文と図はAI補助を使って作成し、コード例とテスト条件は確認しました。実際の配送履歴・顧客実績は扱っていません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?