Files
group_fqcd_jr/app/model/platform.py
T

120 lines
6.3 KiB
Python

from datetime import datetime
from decimal import Decimal
from typing import Any
from sqlalchemy import (
JSON,
BigInteger,
DateTime,
Integer,
Numeric,
String,
Text,
UniqueConstraint,
)
from sqlalchemy.dialects.mysql import BIGINT, DATETIME
from sqlalchemy.orm import Mapped, mapped_column
from app.model.base import Base
class RequestIdempotency(Base):
__tablename__ = "request_idempotency"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
user_id: Mapped[int] = mapped_column(BigInteger, nullable=False)
session_id: Mapped[str] = mapped_column(String(64), nullable=False)
agent_type: Mapped[str] = mapped_column(String(32), nullable=False)
idempotency_key: Mapped[str] = mapped_column(String(64), nullable=False)
request_hash: Mapped[str] = mapped_column(String(64), nullable=False)
trace_id: Mapped[str] = mapped_column(String(64), nullable=False)
status: Mapped[str] = mapped_column(String(16), nullable=False, default="processing")
result_message_id: Mapped[int | None] = mapped_column(BigInteger)
error_code: Mapped[str | None] = mapped_column(String(64))
locked_until: Mapped[datetime | None] = mapped_column(DateTime)
expire_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
__table_args__ = (UniqueConstraint("user_id", "agent_type", "idempotency_key"),)
class AgentRun(Base):
__tablename__ = "agent_run"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
run_id: Mapped[str] = mapped_column(String(36), unique=True, nullable=False)
idempotency_id: Mapped[int] = mapped_column(BigInteger, unique=True, nullable=False)
session_id: Mapped[str] = mapped_column(String(64), nullable=False)
user_id: Mapped[int] = mapped_column(BigInteger, nullable=False)
agent_type: Mapped[str] = mapped_column(String(32), nullable=False)
trace_id: Mapped[str] = mapped_column(String(64), unique=True, nullable=False)
request_message_id: Mapped[int] = mapped_column(BigInteger, nullable=False)
result_message_id: Mapped[int | None] = mapped_column(BigInteger)
status: Mapped[str] = mapped_column(String(24), nullable=False, default="queued")
attempt_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
worker_id: Mapped[str | None] = mapped_column(String(128))
locked_until: Mapped[datetime | None] = mapped_column(DateTime)
error_code: Mapped[str | None] = mapped_column(String(64))
result_version: Mapped[int | None] = mapped_column(Integer)
cancel_requested_at: Mapped[datetime | None] = mapped_column(DateTime)
started_at: Mapped[datetime | None] = mapped_column(DateTime)
completed_at: Mapped[datetime | None] = mapped_column(DateTime)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
class DomainEventOutbox(Base):
__tablename__ = "domain_event_outbox"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
event_id: Mapped[str] = mapped_column(String(36), unique=True, nullable=False)
event_type: Mapped[str] = mapped_column(String(64), nullable=False)
aggregate_type: Mapped[str] = mapped_column(String(32), nullable=False)
aggregate_id: Mapped[str] = mapped_column(String(64), nullable=False)
trace_id: Mapped[str] = mapped_column(String(64), nullable=False)
payload: Mapped[dict[str, Any]] = mapped_column(JSON, nullable=False)
status: Mapped[str] = mapped_column(String(16), nullable=False, default="pending")
retry_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
next_retry_at: Mapped[datetime | None] = mapped_column(DateTime)
last_error: Mapped[str | None] = mapped_column(Text)
occurred_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
published_at: Mapped[datetime | None] = mapped_column(DateTime)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
class OutboxDelivery(Base):
__tablename__ = "outbox_delivery"
__table_args__ = (
UniqueConstraint("event_id", "consumer_name", name="uk_outbox_delivery_event_consumer"),
)
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
event_id: Mapped[str] = mapped_column(String(36), nullable=False)
consumer_name: Mapped[str] = mapped_column(String(64), nullable=False)
delivered_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
class HandoverTicket(Base):
__tablename__ = "svc_handover_ticket"
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
ticket_no: Mapped[str] = mapped_column(String(32), unique=True, nullable=False)
session_id: Mapped[str] = mapped_column(String(64), nullable=False)
customer_id: Mapped[int | None] = mapped_column(BigInteger)
source_agent: Mapped[str] = mapped_column(
String(32), nullable=False, default="customer_service"
)
source_message_id: Mapped[int | None] = mapped_column(BigInteger)
intent: Mapped[str | None] = mapped_column(String(32))
confidence: Mapped[Decimal | None] = mapped_column(Numeric(5, 4))
priority: Mapped[str] = mapped_column(String(8), nullable=False, default="P1")
reason_code: Mapped[str] = mapped_column(String(64), nullable=False)
reason_detail: Mapped[str | None] = mapped_column(String(500))
conversation_summary: Mapped[str | None] = mapped_column(Text)
source_references: Mapped[list[dict[str, Any]] | None] = mapped_column(JSON)
status: Mapped[str] = mapped_column(String(16), nullable=False, default="pending")
assigned_to: Mapped[int | None] = mapped_column(BIGINT(unsigned=True))
assigned_at: Mapped[datetime | None] = mapped_column(DATETIME(fsp=6))
accepted_at: Mapped[datetime | None] = mapped_column(DATETIME(fsp=6))
resolved_at: Mapped[datetime | None] = mapped_column(DATETIME(fsp=6))
closed_at: Mapped[datetime | None] = mapped_column(DATETIME(fsp=6))
resolution: Mapped[str | None] = mapped_column(Text)
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)
updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)