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
This commit is contained in:
Simon
2026-07-11 23:13:10 +08:00
parent 3d152fc8eb
commit bea288e414
928 changed files with 85169 additions and 54205 deletions
+224
View File
@@ -128,6 +128,8 @@ class SessionResponse(BaseModel):
resolved_at: Optional[str] = None
closed_by: Optional[str] = None
meta: Optional[dict] = None
# 复杂场景重构:暂停时间戳
paused_at: Optional[str] = None
actions: List[ActionResponse] = Field(default_factory=list)
approval: Optional[ApprovalTicketResponse] = None
created_at: Optional[str] = None
@@ -239,8 +241,230 @@ def serialize_session(
resolved_at=_iso(session.resolved_at),
closed_by=session.closed_by,
meta=session.meta,
paused_at=_iso(session.paused_at),
actions=[serialize_action(a) for a in (actions or [])],
approval=serialize_approval(ticket) if ticket else None,
created_at=_iso(session.created_at),
updated_at=_iso(session.updated_at),
)
# ===========================================================================
# 复杂场景重构第一阶段 — 新增 Schema
# ===========================================================================
# --------------------------------------------------------------------------
# 全局意图识别结果(扩展 IntentResult
# --------------------------------------------------------------------------
class GlobalIntentResult(BaseModel):
"""全局意图识别结果。"""
global_intent: Optional[str] = None # pause / resume_task / correct / supplement / null
scenario_key: Optional[str] = None # 未命中全局意图时走场景识别
confidence: float = 0.0
corrected_field: Optional[str] = None # CORRECT: 更正的字段名
old_value: Optional[str] = None # CORRECT: 旧值
new_value: Optional[str] = None # CORRECT: 新值
supplement_field: Optional[str] = None # SUPPLEMENT: 补充的字段名
supplement_value: Optional[str] = None # SUPPLEMENT: 补充的值
raw: str = ""
error: str = ""
# --------------------------------------------------------------------------
# 请求模型(复杂场景重构)
# --------------------------------------------------------------------------
class PauseRequest(BaseModel):
"""暂停会话请求(通常由意图识别触发,也可直接调用)。"""
reason: Optional[str] = None
class ResumeRequest(BaseModel):
"""恢复会话请求。"""
session_id: Optional[str] = None # 多任务时指定恢复哪个;None 则自动选择唯一的
class CorrectRequest(BaseModel):
"""信息更正请求。"""
field: str = Field(..., description="更正的字段名")
new_value: str = Field(..., description="新值")
old_value: Optional[str] = None
class SupplementRequest(BaseModel):
"""信息补充请求。"""
field: str = Field(..., description="补充的字段名")
value: str = Field(..., description="补充的值")
class AgentResumeRequest(BaseModel):
"""坐席代恢复请求。"""
note: Optional[str] = None
class AgentCloseRequest(BaseModel):
"""坐席关闭会话请求。"""
note: Optional[str] = None
# --------------------------------------------------------------------------
# 响应模型(复杂场景重构)
# --------------------------------------------------------------------------
class InformationItemResponse(BaseModel):
"""信息项响应。"""
id: str
session_id: str
name: str
value: str
modifiers: List[str] = Field(default_factory=list)
is_filled: bool
is_locked: bool
version: int
update_history: List[dict] = Field(default_factory=list)
updated_at: Optional[str] = None
class ResumePointResponse(BaseModel):
"""恢复点响应。"""
session_id: str
title: str
scenario_key: Optional[str] = None
current_step: str
paused_at: Optional[str] = None
pending_items: List[str] = Field(default_factory=list)
info_items: List[InformationItemResponse] = Field(default_factory=list)
class PausedSessionItem(BaseModel):
"""暂停会话列表项。"""
session_id: str
title: str
scenario_key: Optional[str] = None
paused_at: Optional[str] = None
paused_duration: str = "" # 如 "2h 15min"
# --------------------------------------------------------------------------
# 序列化辅助(复杂场景重构)
# --------------------------------------------------------------------------
def serialize_information_item(item: Any) -> InformationItemResponse:
"""将 InformationItem ORM 对象序列化为响应模型。"""
return InformationItemResponse(
id=item.id,
session_id=item.session_id,
name=item.name,
value=item.value,
modifiers=item.modifiers or [],
is_filled=item.is_filled,
is_locked=item.is_locked,
version=item.version,
update_history=item.update_history or [],
updated_at=_iso(item.updated_at),
)
# ===========================================================================
# 复杂场景重构第二阶段 — P2/P3 新增 Schema
# ===========================================================================
# --------------------------------------------------------------------------
# P3 请求模型
# --------------------------------------------------------------------------
class BatchCorrectRequest(BaseModel):
"""批量更正请求。"""
corrections: List[dict] = Field(
..., description="更正列表 [{field, new_value, old_value?}, ...]"
)
reason: Optional[str] = Field(None, description="更正备注")
class UndoCorrectionRequest(BaseModel):
"""撤销更正请求。"""
pass # 无参数,撤销最近一次更正
class VersionDiffRequest(BaseModel):
"""版本对比请求。"""
v1: int = Field(..., description="版本号1")
v2: int = Field(..., description="版本号2")
# --------------------------------------------------------------------------
# P3 响应模型
# --------------------------------------------------------------------------
class BatchCorrectResponse(BaseModel):
"""批量更正响应。"""
corrected_items: List[dict] = Field(default_factory=list)
snapshot_id: int
dependency_warnings: List[dict] = Field(default_factory=list)
class UndoCorrectionResponse(BaseModel):
"""撤销更正响应。"""
undone_items: List[str] = Field(default_factory=list)
restored_values: Dict[str, str] = Field(default_factory=dict)
snapshot_id: int
remaining_undo_count: int = 5
class CorrectionHistoryResponse(BaseModel):
"""更正历史响应。"""
history: List[dict] = Field(default_factory=list)
class VersionChainResponse(BaseModel):
"""版本链响应。"""
item_key: str
chain: List[dict] = Field(default_factory=list)
class VersionDiffResponse(BaseModel):
"""版本对比响应。"""
item_key: str
v1: int
v1_value: str
v2: int
v2_value: str
changed: bool
# --------------------------------------------------------------------------
# P2 响应模型
# --------------------------------------------------------------------------
class CompressionLogItem(BaseModel):
"""压缩日志项。"""
id: int
session_id: str
tokens_before: int
tokens_after: int
compression_ratio: float
task_node: Optional[str] = None
duration_ms: int
compression_level: int
summary: Optional[str] = None
created_at: Optional[str] = None
class CompressionLogListResponse(BaseModel):
"""压缩日志列表响应。"""
logs: List[CompressionLogItem] = Field(default_factory=list)
total: int = 0