Files
wecom_it_smart_desk/backend/app/models/exclusion_log.py
T

121 lines
3.5 KiB
Python
Raw Normal View History

# =============================================================================
# 企微IT智能服务台 — 排除命中日志模型
# =============================================================================
# 说明:对应数据库 exclusion_logs 表
# 每次排除规则命中时记录一条日志,用于审计和统计。
# =============================================================================
import uuid
from datetime import datetime
from typing import Optional
from sqlalchemy import DateTime, Index, String, Text
from sqlalchemy.orm import Mapped, mapped_column
from app.database import Base
class ExclusionLog(Base):
"""排除命中日志模型 — 对应 exclusion_logs 表。
每次排除规则命中时记录一条日志,用于审计追踪和统计分析。
Attributes:
id: 日志IDUUID
rule_id: 关联的规则ID
rule_name: 规则名称(冗余,防止规则删除后日志丢失名称)
conversation_id: 会话ID
user_id: 员工ID
message_content: 触发命中的消息内容
match_type: 匹配方式
matched_detail: 命中详情(命中的关键词/正则/意图/分类)
action_type: 执行的动作类型
action_result: 执行结果(success/failed
created_at: 创建时间
"""
__tablename__ = "exclusion_logs"
# 主键
id: Mapped[str] = mapped_column(
String(36),
primary_key=True,
default=lambda: str(uuid.uuid4()),
)
# 规则关联
rule_id: Mapped[str] = mapped_column(
String(36),
nullable=False,
comment="关联的规则ID",
)
rule_name: Mapped[Optional[str]] = mapped_column(
String(200),
nullable=True,
comment="规则名称(冗余存储)",
)
# 会话信息
conversation_id: Mapped[Optional[str]] = mapped_column(
String(36),
nullable=True,
comment="会话ID",
)
user_id: Mapped[Optional[str]] = mapped_column(
String(100),
nullable=True,
comment="员工ID",
)
# 命中详情
message_content: Mapped[Optional[str]] = mapped_column(
Text,
nullable=True,
comment="触发命中的消息内容",
)
match_type: Mapped[Optional[str]] = mapped_column(
String(20),
nullable=True,
comment="匹配方式",
)
matched_detail: Mapped[Optional[str]] = mapped_column(
Text,
nullable=True,
comment="命中详情",
)
# 执行结果
action_type: Mapped[Optional[str]] = mapped_column(
String(50),
nullable=True,
comment="执行的动作类型",
)
action_result: Mapped[str] = mapped_column(
String(50),
nullable=False,
default="success",
comment="执行结果:success/failed",
)
# 时间戳
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
nullable=False,
default=datetime.now,
comment="创建时间",
)
# 索引
__table_args__ = (
Index("idx_exclusion_logs_rule", "rule_id"),
Index("idx_exclusion_logs_created", "created_at"),
Index("idx_exclusion_logs_conversation", "conversation_id"),
)
def __repr__(self) -> str:
"""排除日志对象的字符串表示。"""
return (
f"<ExclusionLog(id={self.id}, rule={self.rule_name}, "
f"action={self.action_type}, result={self.action_result})>"
)