diff --git a/backend/app/models/alert.py b/backend/app/models/alert.py index 97fea83..fb88470 100644 --- a/backend/app/models/alert.py +++ b/backend/app/models/alert.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Boolean, Float, ForeignKey, Index, func, Text +from sqlalchemy import String, Boolean, Float, ForeignKey, Index, func, Text, DateTime from sqlalchemy import Uuid, JSON from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -58,6 +58,7 @@ class Alert(Base): Boolean, default=False, nullable=False, ) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) diff --git a/backend/app/models/alert_setting.py b/backend/app/models/alert_setting.py index c745c49..30ddca7 100644 --- a/backend/app/models/alert_setting.py +++ b/backend/app/models/alert_setting.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Boolean, Float, ForeignKey, Index, func +from sqlalchemy import String, Boolean, Float, ForeignKey, Index, func, DateTime from sqlalchemy import Uuid from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -39,10 +39,12 @@ class AlertSetting(Base): comment="阈值(如评分下降超过5分触发)", ) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, diff --git a/backend/app/models/knowledge.py b/backend/app/models/knowledge.py index 950a0b9..31cff5b 100644 --- a/backend/app/models/knowledge.py +++ b/backend/app/models/knowledge.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Integer, ForeignKey, Index, func, Text +from sqlalchemy import String, Integer, ForeignKey, Index, func, Text, DateTime from sqlalchemy import Uuid from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -42,10 +42,12 @@ class KnowledgeBase(Base): nullable=True, ) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, @@ -93,10 +95,12 @@ class KnowledgeDocument(Base): # mapped_column("metadata") to avoid SQLAlchemy reserved keyword conflict extra_metadata: Mapped[dict | None] = mapped_column("metadata", JSONType, nullable=True) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, @@ -153,6 +157,7 @@ class KnowledgeChunk(Base): # mapped_column("metadata") to avoid SQLAlchemy reserved keyword conflict extra_metadata: Mapped[dict | None] = mapped_column("metadata", JSONType, nullable=True) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) @@ -192,6 +197,7 @@ class KnowledgeSearchLog(Base): results_count: Mapped[int] = mapped_column(Integer, server_default="0", nullable=False) latency_ms: Mapped[int] = mapped_column(Integer, server_default="0", nullable=False) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) diff --git a/backend/app/models/knowledge_graph.py b/backend/app/models/knowledge_graph.py index fb8550d..885b189 100644 --- a/backend/app/models/knowledge_graph.py +++ b/backend/app/models/knowledge_graph.py @@ -83,10 +83,12 @@ class KnowledgeEntity(Base): # 元数据 created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, @@ -151,6 +153,7 @@ class KnowledgeRelation(Base): # 元数据 created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) diff --git a/backend/app/models/lifecycle.py b/backend/app/models/lifecycle.py index f79fbaf..53846c6 100644 --- a/backend/app/models/lifecycle.py +++ b/backend/app/models/lifecycle.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Integer, ForeignKey, Index, func, Text +from sqlalchemy import String, Integer, ForeignKey, Index, func, Text, DateTime from sqlalchemy import Uuid from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -31,10 +31,12 @@ class LifecycleProject(Base): nullable=True, ) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, @@ -73,8 +75,8 @@ class ProjectStage(Base): ) stage_number: Mapped[int] = mapped_column(Integer, nullable=False) status: Mapped[str] = mapped_column(String(20), server_default="pending", nullable=False) - started_at: Mapped[datetime | None] = mapped_column(nullable=True) - completed_at: Mapped[datetime | None] = mapped_column(nullable=True) + started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) + completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) notes: Mapped[str | None] = mapped_column(Text, nullable=True) metrics: Mapped[dict | None] = mapped_column(JSONType, nullable=True) diff --git a/backend/app/models/monitoring_record.py b/backend/app/models/monitoring_record.py deleted file mode 100644 index 8662c57..0000000 --- a/backend/app/models/monitoring_record.py +++ /dev/null @@ -1,108 +0,0 @@ -import uuid -from datetime import datetime - -from sqlalchemy import String, Integer, Float, ForeignKey, Index, func -from sqlalchemy import Uuid -from sqlalchemy.orm import Mapped, mapped_column, relationship - -from app.database import Base, JSONType - - -class MonitoringRecord(Base): - __tablename__ = "monitoring_records" - - id: Mapped[uuid.UUID] = mapped_column( - Uuid(as_uuid=True), - primary_key=True, - default=uuid.uuid4, - ) - user_id: Mapped[str] = mapped_column( - String(36), - ForeignKey("users.id", ondelete="CASCADE"), - nullable=False, - ) - brand_id: Mapped[uuid.UUID] = mapped_column( - Uuid(as_uuid=True), - ForeignKey("brands.id", ondelete="CASCADE"), - nullable=False, - ) - content_id: Mapped[uuid.UUID | None] = mapped_column( - Uuid(as_uuid=True), - ForeignKey("contents.id", ondelete="SET NULL"), - nullable=True, - ) - query_id: Mapped[uuid.UUID | None] = mapped_column( - Uuid(as_uuid=True), - ForeignKey("queries.id", ondelete="SET NULL"), - nullable=True, - ) - task_type: Mapped[str] = mapped_column(String(50), nullable=False) - status: Mapped[str] = mapped_column( - String(20), server_default="pending", nullable=False, - ) - baseline_data: Mapped[dict | None] = mapped_column(JSONType, nullable=True) - current_data: Mapped[dict | None] = mapped_column(JSONType, nullable=True) - change_report: Mapped[dict | None] = mapped_column(JSONType, nullable=True) - interval_hours: Mapped[int] = mapped_column( - Integer, server_default="24", nullable=False, - ) - last_checked_at: Mapped[datetime | None] = mapped_column(nullable=True) - next_check_at: Mapped[datetime | None] = mapped_column(nullable=True) - created_at: Mapped[datetime] = mapped_column( - server_default=func.now(), - nullable=False, - ) - updated_at: Mapped[datetime] = mapped_column( - server_default=func.now(), - onupdate=func.now(), - nullable=False, - ) - - brand: Mapped["Brand"] = relationship("Brand") - user: Mapped["User"] = relationship("User") - - __table_args__ = ( - Index("idx_monitoring_records_user_id", "user_id"), - Index("idx_monitoring_records_brand_id", "brand_id"), - Index("idx_monitoring_records_status", "status"), - Index("idx_monitoring_records_next_check_at", "next_check_at"), - ) - - -class ContentBaseline(Base): - __tablename__ = "content_baselines" - - id: Mapped[uuid.UUID] = mapped_column( - Uuid(as_uuid=True), - primary_key=True, - default=uuid.uuid4, - ) - brand_id: Mapped[uuid.UUID] = mapped_column( - Uuid(as_uuid=True), - ForeignKey("brands.id", ondelete="CASCADE"), - nullable=False, - ) - content_id: Mapped[uuid.UUID | None] = mapped_column( - Uuid(as_uuid=True), - ForeignKey("contents.id", ondelete="SET NULL"), - nullable=True, - ) - citation_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0) - positive_ratio: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) - avg_rank: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) - platform_data: Mapped[dict | None] = mapped_column(JSONType, nullable=True) - recorded_at: Mapped[datetime] = mapped_column( - server_default=func.now(), - nullable=False, - ) - created_at: Mapped[datetime] = mapped_column( - server_default=func.now(), - nullable=False, - ) - - brand: Mapped["Brand"] = relationship("Brand") - - __table_args__ = ( - Index("idx_content_baselines_brand_id", "brand_id"), - Index("idx_content_baselines_content_id", "content_id"), - ) diff --git a/backend/app/models/organization.py b/backend/app/models/organization.py index d472520..16a33fa 100644 --- a/backend/app/models/organization.py +++ b/backend/app/models/organization.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Integer, ForeignKey, Index, func, Text +from sqlalchemy import String, Integer, ForeignKey, Index, func, Text, DateTime from sqlalchemy import Uuid from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -24,10 +24,12 @@ class Organization(Base): plan: Mapped[str] = mapped_column(String(20), server_default="free", nullable=False) max_members: Mapped[int] = mapped_column(Integer, server_default="5", nullable=False) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, @@ -84,6 +86,7 @@ class OrgMember(Base): ) role: Mapped[str] = mapped_column(String(20), server_default="viewer", nullable=False) joined_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) diff --git a/backend/app/models/platform_rule.py b/backend/app/models/platform_rule.py index f68bdac..0e777f1 100644 --- a/backend/app/models/platform_rule.py +++ b/backend/app/models/platform_rule.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Boolean, ForeignKey, Index, func, Text +from sqlalchemy import String, Boolean, ForeignKey, Index, func, Text, DateTime from sqlalchemy import Uuid from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -24,6 +24,7 @@ class PlatformRule(Base): severity: Mapped[str] = mapped_column(String(20), nullable=False) is_active: Mapped[bool] = mapped_column(Boolean, server_default="true", nullable=False) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, diff --git a/backend/app/models/platform_rule_version.py b/backend/app/models/platform_rule_version.py index 425cd1d..445e7eb 100644 --- a/backend/app/models/platform_rule_version.py +++ b/backend/app/models/platform_rule_version.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Integer, Index, func +from sqlalchemy import String, Integer, Index, func, DateTime from sqlalchemy import Uuid from sqlalchemy.orm import Mapped, mapped_column @@ -22,7 +22,7 @@ class PlatformRuleVersion(Base): rule_data: Mapped[dict] = mapped_column(JSONType, nullable=False) change_summary: Mapped[str | None] = mapped_column(String(500), nullable=True) created_by: Mapped[str | None] = mapped_column(String(100), nullable=True) - created_at: Mapped[datetime] = mapped_column(server_default=func.now()) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) __table_args__ = ( Index("idx_rule_versions_rule_id", "rule_id"), diff --git a/backend/app/models/schema_suggestion.py b/backend/app/models/schema_suggestion.py index 57bebff..68aad0d 100644 --- a/backend/app/models/schema_suggestion.py +++ b/backend/app/models/schema_suggestion.py @@ -52,10 +52,12 @@ class SchemaSuggestion(Base): JSONType, nullable=True, ) created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False,