Files
wecom_it_smart_desk/backend/app/models/routing_event.py
Simon bea288e414 feat: 2026-07-11 全量更新 - 代办集成+会议室预定+知识迭代修复+UI统一+Bug修复
== 已部署上线 (9项) ==
- 代办事项真实数据源集成 (企微审批API 8bug修复链)
- H5/坐席端 Logo样式统一+绿色背景
- 视频引导页修复 (localStorage key v2)
- 坐席端 v9 Vue版本修复 (ElMessage._context)
- 截图按钮 v10 修复 (getDisplayMedia user gesture)
- 扫码样式恢复+H5扫码登录跳转修复
- H5截图快捷键提示

== 代码完成待部署 (3项) ==
- 知识迭代3Bug修复 (#8 POST端点/#7 MERGE幂等/#6 过期检查)
- 会议室预定-小鱼易联终端 (40文件, 40/40测试通过)
- IT资产升级审批推送 (asset_service.py)

== 需求文档 (2项) ==
- 坐席端AI辅助消息框-PRD (4项新功能确认)
- 坐席端布局优化建议 v2.0 (7天计划)

== 新增文档 ==
- 日报-2026-07-11.md
- 知识迭代Bug修复报告-20260711.md
- 会议室预定-部署指南.md
- CHANGELOG.md 更新

== 测试 ==
- test_todo_integration.py: 40/40
- test_meetingroom.py: 40/40
- test_bugfix_ki_suggestions.py: 21/21
2026-07-11 23:13:10 +08:00

129 lines
4.1 KiB
Python

# =============================================================================
# 企微IT智能服务台 — 路由命中事件模型(P1)
# =============================================================================
# 说明:对应数据库 routing_events 表,记录每次路由推荐事件
# 用于后续优化 Prompt 准确率、分析高频非IT业务
#
# 记录字段:会话ID、员工消息内容、识别的业务类别、推荐联系人、是否点击联系
# =============================================================================
from datetime import datetime
from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Index, Integer, String
from sqlalchemy.orm import Mapped, mapped_column
from app.database import Base
class RoutingEvent(Base):
"""路由命中事件模型 — 对应 routing_events 表(P1)。
记录每次路由推荐事件,为后续优化 Prompt 准确率、分析高频非IT业务
提供数据支撑。
Attributes:
id: 主键,自增
conversation_id: 会话ID(外键)
employee_id: 员工ID
message_content: 触发路由的员工消息(截断至500字)
business_category: 识别的业务类别
routing_confidence: 路由置信度
contact_id: 推荐的联系人ID(外键)
contact_name: 联系人姓名(冗余存储)
is_clicked: 员工是否点击了「联系TA」
created_at: 创建时间
"""
__tablename__ = "routing_events"
# 主键:自增整数
id: Mapped[int] = mapped_column(
Integer,
primary_key=True,
autoincrement=True,
comment="主键",
)
# 会话ID(外键,关联 conversations 表)
conversation_id: Mapped[str] = mapped_column(
String(36),
ForeignKey("conversations.id", ondelete="CASCADE"),
nullable=False,
comment="会话ID",
)
# 员工ID
employee_id: Mapped[str] = mapped_column(
String(64),
nullable=False,
comment="员工ID",
)
# 触发路由的员工消息内容(截断至500字防止过长)
message_content: Mapped[str] = mapped_column(
String(500),
nullable=False,
comment="触发路由的员工消息(截断)",
)
# 识别的业务类别(行政/人力资源/财务/法务/行政-物业)
business_category: Mapped[str] = mapped_column(
String(50),
nullable=False,
comment="识别的业务类别",
)
# 路由置信度(0.0~1.0,≥0.7 触发名片推荐)
routing_confidence: Mapped[float] = mapped_column(
Float,
nullable=False,
comment="路由置信度",
)
# 推荐的联系人ID(外键,关联 business_contacts 表)
contact_id: Mapped[int | None] = mapped_column(
Integer,
ForeignKey("business_contacts.id", ondelete="SET NULL"),
nullable=True,
default=None,
comment="推荐的联系人ID",
)
# 联系人姓名(冗余存储,避免联系人删除后丢失记录)
contact_name: Mapped[str] = mapped_column(
String(50),
nullable=False,
comment="联系人姓名(冗余)",
)
# 员工是否点击了「联系TA」按钮
is_clicked: Mapped[bool] = mapped_column(
Boolean,
nullable=False,
default=False,
comment="是否点击了联系TA",
)
# 创建时间
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
nullable=False,
default=datetime.now,
comment="创建时间",
)
# 索引定义
__table_args__ = (
# 按业务类别查询(分析高频非IT业务)
Index("idx_routing_events_category", "business_category"),
# 按会话ID查询(查看某会话的路由历史)
Index("idx_routing_events_conv", "conversation_id"),
)
def __repr__(self) -> str:
"""路由事件对象的字符串表示,方便调试。"""
return (
f"<RoutingEvent(id={self.id}, conv={self.conversation_id}, "
f"category={self.business_category}, confidence={self.routing_confidence})>"
)