Files
2026-01-09 19:14:41 +08:00

50 lines
1.9 KiB
Python

from sqlalchemy import Column, Integer, String, DateTime, Float, Enum, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.models import Base
from app.config import TABLE_PREFIX
import enum
class TargetType(str, enum.Enum):
SAMPLE = "SAMPLE"
ORDER = "ORDER"
class MatchStatus(str, enum.Enum):
pending = "pending"
accepted = "accepted"
rejected = "rejected"
auto_matched = "auto_matched"
class ReviewAction(str, enum.Enum):
accept = "accept"
reject = "reject"
class MatchResult(Base):
__tablename__ = f"{TABLE_PREFIX}Match_Results"
id = Column(Integer, primary_key=True, index=True)
dit_id = Column(Integer, ForeignKey(f"{TABLE_PREFIX}DIT_Records.id"), nullable=False)
target_type = Column(Enum(TargetType), nullable=False)
target_id = Column(Integer, nullable=False)
score = Column(Float, nullable=False)
match_priority = Column(Integer, default=3) # 1: Oppy ID, 2: Account, 3: Name
match_source = Column(String(255)) # e.g., "Matched via Opportunity ID: OP12345"
reason = Column(String(255))
status = Column(Enum(MatchStatus), default=MatchStatus.pending)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
dit = relationship("DitRecord", backref="matches")
class ReviewLog(Base):
__tablename__ = f"{TABLE_PREFIX}Review_Logs"
id = Column(Integer, primary_key=True, index=True)
match_id = Column(Integer, ForeignKey(f"{TABLE_PREFIX}Match_Results.id"), nullable=False)
user_id = Column(Integer, ForeignKey(f"{TABLE_PREFIX}users.id"), nullable=False)
action = Column(Enum(ReviewAction), nullable=False)
timestamp = Column(DateTime(timezone=True), server_default=func.now())
match_result = relationship("MatchResult", backref="review_logs")
user = relationship("User", backref="review_logs")