"""弱信号模型。 技术/情绪/组织/市场四类弱信号采集与关联。 """ import uuid from datetime import datetime, timezone from sqlalchemy import DateTime, Float, ForeignKey, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base from app.core.types import JSONBType class WeakSignal(Base): """弱信号。""" __tablename__ = "weak_signals" 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) signal_type: Mapped[str] = mapped_column(String(50), nullable=False, comment="technical/sentiment/org/market") source: Mapped[str | None] = mapped_column(String(200), nullable=True, comment="信号来源") content: Mapped[str] = mapped_column(Text, nullable=False, comment="信号内容") confidence: Mapped[float] = mapped_column(Float, nullable=False, default=0.5, comment="置信度(0-1)") correlation_id: Mapped[str | None] = mapped_column(String(36), nullable=True, index=True, comment="关联组 ID") correlation_result: Mapped[dict | None] = mapped_column(JSONBType, nullable=True, comment="关联分析结果") risk_probability: Mapped[float | None] = mapped_column(Float, nullable=True, comment="风险概率(0-1)") status: Mapped[str] = mapped_column(String(20), nullable=False, default="new", comment="new/correlated/alerted/dismissed") detected_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) )