"""状态与乐观并发控制教学模拟；字典操作不是生产数据库事务。"""
from dataclasses import asdict, dataclass, replace


@dataclass(frozen=True)
class TaskState:
    task_id: str = "T9"
    revision: int = 1
    order_id: str = "A1042"
    pickup: str | None = None
    quality_verified: bool = False
    submission_authorized: bool = False
    source_event: str = "U17"


def apply_pickup(state: TaskState, slot: str, source_event: str) -> TaskState:
    # slot 在调用前已经过日期解析与业务格式校验，这里不处理自然语言。
    # 修改操作参数会使旧确认失效；不从“想改时间”推断“允许提交”。
    return replace(state, revision=state.revision + 1, pickup=slot,
                   submission_authorized=False, source_event=source_event)


def save(store: dict[str, TaskState], state: TaskState, expected: int) -> None:
    current = store[state.task_id]
    if current.revision != expected or state.revision != expected + 1:
        raise ValueError("状态冲突：重新读取，不能覆盖另一请求的修改")
    # 这里只在单进程顺序演示。生产使用 WHERE revision = expected 的条件更新。
    store[state.task_id] = state


if __name__ == "__main__":
    store = {"T9": TaskState()}
    old = store["T9"]
    new = apply_pickup(old, "2026-09-13T09:00:00+08:00", "U19")
    save(store, new, expected=1)
    print(asdict(store["T9"]))
    try:
        # 另一个请求还基于 revision 1，提交时会发现冲突。
        save(store, apply_pickup(old, "2026-09-12T14:00:00+08:00", "U18"), 1)
    except ValueError as error:
        print(error)
