models.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from sqlalchemy import JSON, Column, DateTime, ForeignKey, Integer, String, Text
  2. from sqlalchemy.orm import relationship
  3. from sqlalchemy.sql import func
  4. from app.db import Base
  5. class Case(Base):
  6. __tablename__ = "cases"
  7. id = Column(Integer, primary_key=True, index=True)
  8. case_no = Column(String(64), nullable=True, index=True)
  9. case_name = Column(String(255), nullable=False, index=True)
  10. # 多文件字节 SHA256 排序后摘要;用于去重
  11. material_fingerprint = Column(String(64), nullable=True, index=True)
  12. # 当前最新要素(可编辑)
  13. elements = Column(JSON, nullable=False, default=dict)
  14. # 最新画像缓存
  15. portrait = Column(JSON, nullable=False, default=dict)
  16. applicant_name = Column(String(64), nullable=True, index=True)
  17. respondent_name = Column(String(128), nullable=True, index=True)
  18. case_cause = Column(String(64), nullable=True, index=True)
  19. risk_level = Column(String(16), nullable=True, index=True)
  20. # 合并后的申请书/材料全文(用于类案展示与对比;大文本可截断存储)
  21. application_text = Column(Text, nullable=True)
  22. # 历史类案可录入:裁决结论、仲裁机构(无数据时前端展示占位说明)
  23. ruling_result = Column(Text, nullable=True)
  24. arbitration_org = Column(String(255), nullable=True)
  25. created_at = Column(DateTime(timezone=True), server_default=func.now())
  26. files = relationship("CaseFile", back_populates="case", cascade="all, delete-orphan")
  27. element_versions = relationship("CaseElementsVersion", back_populates="case", cascade="all, delete-orphan")
  28. class CaseFile(Base):
  29. __tablename__ = "case_files"
  30. id = Column(Integer, primary_key=True)
  31. case_id = Column(Integer, ForeignKey("cases.id", ondelete="CASCADE"), nullable=False, index=True)
  32. filename = Column(String(255), nullable=False)
  33. content_type = Column(String(128), nullable=True)
  34. storage_path = Column(String(512), nullable=False)
  35. size_bytes = Column(Integer, nullable=True)
  36. created_at = Column(DateTime(timezone=True), server_default=func.now())
  37. case = relationship("Case", back_populates="files")
  38. class CaseElementsVersion(Base):
  39. __tablename__ = "case_elements_versions"
  40. id = Column(Integer, primary_key=True)
  41. case_id = Column(Integer, ForeignKey("cases.id", ondelete="CASCADE"), nullable=False, index=True)
  42. version = Column(Integer, nullable=False)
  43. elements = Column(JSON, nullable=False)
  44. updated_by = Column(String(64), nullable=True)
  45. updated_at = Column(DateTime(timezone=True), server_default=func.now())
  46. case = relationship("Case", back_populates="element_versions")
  47. class ProcessingTask(Base):
  48. __tablename__ = "processing_tasks"
  49. id = Column(String(64), primary_key=True)
  50. case_id = Column(Integer, ForeignKey("cases.id", ondelete="CASCADE"), nullable=False, index=True)
  51. status = Column(String(16), nullable=False, default="PENDING") # PENDING/RUNNING/SUCCEEDED/FAILED
  52. progress = Column(Integer, nullable=False, default=0) # 0-100
  53. message = Column(String(255), nullable=True)
  54. error = Column(Text, nullable=True)
  55. created_at = Column(DateTime(timezone=True), server_default=func.now())
  56. updated_at = Column(DateTime(timezone=True), onupdate=func.now())