evaluation.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, JSON, String, Text
  4. from sqlalchemy.orm import Mapped, mapped_column
  5. from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin
  6. class EvaluationIndicator(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  7. __tablename__ = "evaluation_indicators"
  8. mine_id: Mapped[str | None] = mapped_column(
  9. String(32), ForeignKey("mines.id", ondelete="CASCADE"), nullable=True, index=True
  10. )
  11. parent_id: Mapped[str | None] = mapped_column(
  12. String(32), ForeignKey("evaluation_indicators.id", ondelete="SET NULL"), nullable=True
  13. )
  14. code: Mapped[str] = mapped_column(String(64), index=True)
  15. name: Mapped[str] = mapped_column(String(128))
  16. dimension: Mapped[str] = mapped_column(String(32), index=True)
  17. indicator_type: Mapped[str] = mapped_column(String(32), default="quantitative")
  18. unit: Mapped[str] = mapped_column(String(32), default="")
  19. formula: Mapped[str] = mapped_column(Text, default="")
  20. data_source: Mapped[str] = mapped_column(String(255), default="")
  21. weight: Mapped[float] = mapped_column(Float, default=0)
  22. min_value: Mapped[float | None] = mapped_column(Float, nullable=True)
  23. max_value: Mapped[float | None] = mapped_column(Float, nullable=True)
  24. target_value: Mapped[float | None] = mapped_column(Float, nullable=True)
  25. weight_method: Mapped[str] = mapped_column(String(32), default="static")
  26. enabled: Mapped[bool] = mapped_column(Boolean, default=True)
  27. sort_order: Mapped[int] = mapped_column(Integer, default=0)
  28. config: Mapped[dict] = mapped_column(JSON, default=dict)
  29. class EvaluationRun(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  30. __tablename__ = "evaluation_runs"
  31. mine_id: Mapped[str] = mapped_column(
  32. String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True
  33. )
  34. run_no: Mapped[str] = mapped_column(String(64), unique=True, index=True)
  35. period_start: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  36. period_end: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  37. status: Mapped[str] = mapped_column(String(32), default="pending", index=True)
  38. total_score: Mapped[float | None] = mapped_column(Float, nullable=True)
  39. grade: Mapped[str] = mapped_column(String(8), default="")
  40. summary: Mapped[str] = mapped_column(Text, default="")
  41. recommendations: Mapped[list] = mapped_column(JSON, default=list)
  42. weight_snapshot: Mapped[dict] = mapped_column(JSON, default=dict)
  43. input_snapshot: Mapped[dict] = mapped_column(JSON, default=dict)
  44. model_output: Mapped[dict] = mapped_column(JSON, default=dict)
  45. started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  46. finished_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  47. created_by: Mapped[str] = mapped_column(String(128), default="")
  48. class EvaluationScore(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  49. __tablename__ = "evaluation_scores"
  50. run_id: Mapped[str] = mapped_column(
  51. String(32), ForeignKey("evaluation_runs.id", ondelete="CASCADE"), index=True
  52. )
  53. indicator_id: Mapped[str] = mapped_column(
  54. String(32), ForeignKey("evaluation_indicators.id", ondelete="CASCADE"), index=True
  55. )
  56. raw_value: Mapped[float | None] = mapped_column(Float, nullable=True)
  57. score: Mapped[float | None] = mapped_column(Float, nullable=True)
  58. weighted_score: Mapped[float | None] = mapped_column(Float, nullable=True)
  59. weight: Mapped[float | None] = mapped_column(Float, nullable=True)
  60. level: Mapped[str] = mapped_column(String(16), default="")
  61. evidence: Mapped[str] = mapped_column(Text, default="")
  62. metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict)