demand_feedback.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from sqlalchemy import BigInteger, DateTime, Index, Integer, String, Text, UniqueConstraint, func
  4. from sqlalchemy.orm import Mapped, mapped_column
  5. from supply_infra.db.base import Base
  6. class DemandFeedback(Base):
  7. """需求汇总页面的人工反馈记录。"""
  8. __tablename__ = "demand_feedback"
  9. __table_args__ = (
  10. UniqueConstraint(
  11. "client_request_id",
  12. name="uk_demand_feedback_request",
  13. ),
  14. Index(
  15. "idx_demand_feedback_demand",
  16. "demand_grade_id",
  17. "created_at",
  18. ),
  19. Index(
  20. "idx_demand_feedback_video",
  21. "demand_grade_id",
  22. "video_id",
  23. "created_at",
  24. ),
  25. Index(
  26. "idx_demand_feedback_expansion",
  27. "demand_video_expansion_id",
  28. "created_at",
  29. ),
  30. Index(
  31. "idx_demand_feedback_user",
  32. "feedback_user_id",
  33. "created_at",
  34. ),
  35. Index(
  36. "idx_demand_feedback_processing",
  37. "processing_status",
  38. "created_at",
  39. ),
  40. )
  41. id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
  42. client_request_id: Mapped[str] = mapped_column(String(64), nullable=False)
  43. target_type: Mapped[str] = mapped_column(
  44. String(32),
  45. nullable=False,
  46. comment="反馈对象:demand / video / hit_content",
  47. )
  48. biz_dt: Mapped[str] = mapped_column(
  49. String(32),
  50. nullable=False,
  51. comment="目标所属业务日",
  52. )
  53. demand_grade_id: Mapped[int] = mapped_column(
  54. BigInteger,
  55. nullable=False,
  56. comment="目标 demand_grade.id",
  57. )
  58. video_id: Mapped[str | None] = mapped_column(
  59. String(64),
  60. nullable=True,
  61. comment="视频反馈或命中内容反馈的视频 id",
  62. )
  63. demand_video_expansion_id: Mapped[int | None] = mapped_column(
  64. BigInteger,
  65. nullable=True,
  66. comment="命中内容 demand_video_expansion.id",
  67. )
  68. feedback_action: Mapped[str] = mapped_column(
  69. String(32),
  70. nullable=False,
  71. comment="support / oppose / correct / supplement",
  72. )
  73. reason_code: Mapped[str | None] = mapped_column(String(64), nullable=True)
  74. content: Mapped[str | None] = mapped_column(Text, nullable=True)
  75. target_snapshot_json: Mapped[str] = mapped_column(
  76. Text,
  77. nullable=False,
  78. comment="提交时由服务端生成的目标快照",
  79. )
  80. feedback_user_id: Mapped[int] = mapped_column(
  81. Integer,
  82. nullable=False,
  83. comment="反馈人 auth_user.id",
  84. )
  85. feedback_user_name_snapshot: Mapped[str] = mapped_column(
  86. String(128),
  87. nullable=False,
  88. comment="反馈人名称快照",
  89. )
  90. feedback_username_snapshot: Mapped[str] = mapped_column(
  91. String(64),
  92. nullable=False,
  93. comment="反馈人登录账号快照",
  94. )
  95. processing_status: Mapped[str] = mapped_column(
  96. String(24),
  97. nullable=False,
  98. default="pending",
  99. comment="pending / accepted / rejected / needs_evidence",
  100. )
  101. platform_demand_id: Mapped[str | None] = mapped_column(
  102. String(36), nullable=True
  103. )
  104. platform_demand_version_id: Mapped[str | None] = mapped_column(
  105. String(36), nullable=True
  106. )
  107. processed_by: Mapped[str | None] = mapped_column(String(128), nullable=True)
  108. processed_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  109. resolution_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
  110. consumed_run_id: Mapped[str | None] = mapped_column(String(36), nullable=True)
  111. impact_json: Mapped[str | None] = mapped_column(Text, nullable=True)
  112. created_at: Mapped[datetime] = mapped_column(
  113. DateTime,
  114. nullable=False,
  115. server_default=func.now(),
  116. )
  117. updated_at: Mapped[datetime] = mapped_column(
  118. DateTime,
  119. nullable=False,
  120. server_default=func.now(),
  121. onupdate=func.now(),
  122. )