"""月报模型。 被投企业按月提交的经营报告,支持 AI 解析。 """ import uuid from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base from app.core.types import JSONBType class MonthlyReport(Base): """月报。""" __tablename__ = "monthly_reports" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) company_id: Mapped[str] = mapped_column(String(36), ForeignKey("companies.id"), nullable=False, index=True) period_year: Mapped[int] = mapped_column(Integer, nullable=False, comment="报告年份") period_month: Mapped[int] = mapped_column(Integer, nullable=False, comment="报告月份(1-12)") status: Mapped[str] = mapped_column( String(50), nullable=False, default="draft", comment="状态:draft/submitted/ai_parsed/reviewed", ) raw_content: Mapped[str | None] = mapped_column(Text, nullable=True, comment="原始内容") structured_data: Mapped[dict | None] = mapped_column(JSONBType, nullable=True, comment="结构化指标数据") ai_summary: Mapped[str | None] = mapped_column(Text, nullable=True, comment="AI 生成的摘要") ai_concerns: Mapped[dict | None] = mapped_column(JSONBType, nullable=True, comment="AI 关注点列表") submitted_by: Mapped[str | None] = mapped_column(String(36), ForeignKey("users.id"), nullable=True) submitted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) reviewed_by: Mapped[str | None] = mapped_column(String(36), ForeignKey("users.id"), nullable=True) reviewed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), )