"""AI PMO 决策记录模型。""" from __future__ import annotations from typing import Any, Optional from sqlalchemy import BigInteger, Boolean, Float, ForeignKey, Integer, Text, VARCHAR from sqlalchemy.orm import Mapped, mapped_column from .base import Base from .types import JSONB class DecisionRecord(Base): __tablename__ = "decision_records" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) work_item_id: Mapped[int] = mapped_column( BigInteger, ForeignKey("work_items.id", ondelete="CASCADE"), nullable=False, index=True, ) decision_object_type: Mapped[str] = mapped_column(VARCHAR(40), nullable=False, default="portfolio") decision_object_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True) decision_level: Mapped[str] = mapped_column(VARCHAR(20), nullable=False, default="portfolio", index=True) context_snapshot: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) rationale: Mapped[Optional[str]] = mapped_column(Text, nullable=True) confidence: Mapped[Optional[float]] = mapped_column(Float, nullable=True) risk_score: Mapped[Optional[float]] = mapped_column(Float, nullable=True) budget_impact: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) resource_impact: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) simulation_result: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) policy_gate_hit: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, index=True) policy_gate_code: Mapped[Optional[str]] = mapped_column(VARCHAR(80), nullable=True, index=True) action_bundle: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) approval_requirement: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) execution_result: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True) final_outcome: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True, index=True)