Files
wecom_it_smart_desk/backend/app/constants.py
T
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

214 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 企微IT智能服务台 — 阶段5 自动化闭环 常量定义
# =============================================================================
# 说明:集中定义自动化引擎的 WS 事件名、执行模式、风险等级、会话/动作状态、
# 映射源优先级、以及自动化专用错误码。
#
# 约定说明(重要,与架构设计的一致性取舍):
# 1. 统一响应格式沿用项目既有 {code: int, data: {}, message: str}
# 因此架构文档中的错误码段 AUT-001~AUT-0xx 在此以数值形式落地为 4001~40xx,
# WS 的 automation.error 事件同样携带该数值 code。
# 2. WS 事件名统一以 automation. 为前缀(架构约定)。
# =============================================================================
# --------------------------------------------------------------------------
# WebSocket 事件名(前缀 automation.
# --------------------------------------------------------------------------
AUTOMATION_WS_PROGRESS = "automation.progress" # 进度推送(步骤开始/完成)
AUTOMATION_WS_ACTION_REQUIRED = "automation.action_required" # 需要坐席审批 / 员工二次确认
AUTOMATION_WS_RESOLVED = "automation.resolved" # 处置成功,等待/已关单
AUTOMATION_WS_TAKEOVER = "automation.takeover" # 转人工接管
AUTOMATION_WS_ERROR = "automation.error" # 异常(转人工 + 通知)
AUTOMATION_WS_EVENTS = {
"progress": AUTOMATION_WS_PROGRESS,
"action_required": AUTOMATION_WS_ACTION_REQUIRED,
"resolved": AUTOMATION_WS_RESOLVED,
"takeover": AUTOMATION_WS_TAKEOVER,
"error": AUTOMATION_WS_ERROR,
}
# --------------------------------------------------------------------------
# 执行模式(双模式执行引擎)
# --------------------------------------------------------------------------
AUTOMATION_MODE_PLAN_ONLY = "plan_only" # 仅生成处置方案,不真正执行外部动作
AUTOMATION_MODE_REAL_EXEC = "real_exec" # 真正执行外部系统动作
# --------------------------------------------------------------------------
# 风险等级
# --------------------------------------------------------------------------
AUTOMATION_RISK_READ = "read" # 只读:默认可自动执行
AUTOMATION_RISK_LOW = "low" # 低风险写操作:默认可自动执行
AUTOMATION_RISK_HIGH = "high" # 高危:必须审批或员工 H5 二次确认
# 默认可自动执行的风险等级集合(其余必须走审批/确认)
AUTOMATION_AUTO_EXECUTABLE_RISKS = {AUTOMATION_RISK_READ, AUTOMATION_RISK_LOW}
# --------------------------------------------------------------------------
# 会话状态机
# --------------------------------------------------------------------------
AUTOMATION_SESSION_CREATED = "created"
AUTOMATION_SESSION_RUNNING = "running"
AUTOMATION_SESSION_PAUSED = "paused" # 等待审批/确认时挂起
AUTOMATION_SESSION_RESOLVED = "resolved" # 处置成功,等待静默关单/员工确认
AUTOMATION_SESSION_CLOSED = "closed" # 已关单
AUTOMATION_SESSION_HANDOFF = "handoff" # 已转人工
AUTOMATION_SESSION_ERROR = "error"
# 终态集合(不再流转)
AUTOMATION_SESSION_TERMINAL_STATES = {
AUTOMATION_SESSION_CLOSED,
AUTOMATION_SESSION_HANDOFF,
AUTOMATION_SESSION_ERROR,
}
# --------------------------------------------------------------------------
# 动作状态机
# --------------------------------------------------------------------------
AUTOMATION_ACTION_PENDING = "pending"
AUTOMATION_ACTION_RUNNING = "running"
AUTOMATION_ACTION_SUCCESS = "success"
AUTOMATION_ACTION_FAILED = "failed"
AUTOMATION_ACTION_SKIPPED = "skipped"
AUTOMATION_ACTION_AWAIT_APPROVAL = "await_approval"
AUTOMATION_ACTION_APPROVED = "approved"
AUTOMATION_ACTION_REJECTED = "rejected"
# --------------------------------------------------------------------------
# 映射源与优先级(联软主,eHR 兜底;aTrust 密钥未到后置)
# --------------------------------------------------------------------------
MAPPING_SOURCES = ["lianruan", "atrust", "ehr"]
MAPPING_SOURCE_PRIORITY = {
"lianruan": 0, # 联软终端安全管理(主,支持 strusername 直接映射)
"atrust": 1, # 零信任 / aTrust(密钥未到,预留占位)
"ehr": 2, # 北森 EHR 静态映射(兜底)
}
# 静默关单 Redis TTL(秒):处置成功后 10 分钟内员工无异议则自动关单
AUTOMATION_SILENT_CLOSE_TTL = 600
# --------------------------------------------------------------------------
# 自动化错误码(数值,沿用项目 {code:int} 约定)
# 架构文档 AUT-001~AUT-0xx → 4001~40xx
# --------------------------------------------------------------------------
class AutomationErrorCode:
SCENARIO_NOT_FOUND = 4001 # 场景未启用或未配置
INTENT_FAILED = 4002 # 意图识别失败
EXTERNAL_CALL_FAILED = 4003 # 外部系统调用失败
ACTION_REJECTED = 4004 # 动作被拒绝(风险/需审批未通过)
SESSION_NOT_FOUND = 4005 # 自动化会话不存在
APPROVAL_REJECTED = 4006 # 审批被驳回
TIMEOUT_HANDOFF = 4007 # 超时自动接管
EMPLOYEE_DECLINED = 4008 # 员工拒绝/未二次确认
CONFIG_ERROR = 4009 # 配置错误(阈值/场景/映射)
MAPPING_FAILED = 4010 # 终端/员工映射失败
INVALID_MODE = 4011 # 非法执行模式
ROLLBACK_FAILED = 4012 # 回滚补偿失败
AUTOMATION_ERROR_MESSAGES = {
AutomationErrorCode.SCENARIO_NOT_FOUND: "场景未启用或未配置",
AutomationErrorCode.INTENT_FAILED: "意图识别失败",
AutomationErrorCode.EXTERNAL_CALL_FAILED: "外部系统调用失败",
AutomationErrorCode.ACTION_REJECTED: "动作被拒绝(需审批或高危)",
AutomationErrorCode.SESSION_NOT_FOUND: "自动化会话不存在",
AutomationErrorCode.APPROVAL_REJECTED: "审批被驳回",
AutomationErrorCode.TIMEOUT_HANDOFF: "处置超时,已自动转人工",
AutomationErrorCode.EMPLOYEE_DECLINED: "员工未确认或已拒绝",
AutomationErrorCode.CONFIG_ERROR: "自动化配置错误",
AutomationErrorCode.MAPPING_FAILED: "终端/员工映射失败",
AutomationErrorCode.INVALID_MODE: "非法的执行模式",
AutomationErrorCode.ROLLBACK_FAILED: "回滚补偿失败",
}
def automation_error_message(code: int) -> str:
"""根据自动化错误码返回默认中文消息。"""
return AUTOMATION_ERROR_MESSAGES.get(code, "自动化处理异常")
# ===========================================================================
# 复杂场景重构第一阶段 — 新增常量
# ===========================================================================
# --------------------------------------------------------------------------
# 全局意图常量
# --------------------------------------------------------------------------
GLOBAL_INTENT_PAUSE = "pause"
GLOBAL_INTENT_RESUME_TASK = "resume_task"
GLOBAL_INTENT_CORRECT = "correct"
GLOBAL_INTENT_SUPPLEMENT = "supplement"
GLOBAL_INTENT_NONE = None
# --------------------------------------------------------------------------
# 新增 WS 事件名(暂停/恢复/超时关闭/信息更正/信息补充)
# --------------------------------------------------------------------------
AUTOMATION_WS_PAUSED = "automation.paused"
AUTOMATION_WS_RESUMED = "automation.resumed"
AUTOMATION_WS_TIMEOUT_CLOSED = "automation.timeout_closed"
AUTOMATION_WS_INFO_CORRECTED = "automation.info_corrected"
AUTOMATION_WS_INFO_SUPPLEMENTED = "automation.info_supplemented"
# 扩展 WS 事件集合
AUTOMATION_WS_EVENTS.update({
"paused": AUTOMATION_WS_PAUSED,
"resumed": AUTOMATION_WS_RESUMED,
"timeout_closed": AUTOMATION_WS_TIMEOUT_CLOSED,
"info_corrected": AUTOMATION_WS_INFO_CORRECTED,
"info_supplemented": AUTOMATION_WS_INFO_SUPPLEMENTED,
})
# --------------------------------------------------------------------------
# 超时配置
# --------------------------------------------------------------------------
PAUSE_TIMEOUT_HOURS = 24
PAUSE_TIMEOUT_SECONDS = 24 * 3600
RESUME_POINT_REDIS_TTL = 25 * 3600 # 恢复点 Redis TTL(25小时,比超时多1小时兜底)
# --------------------------------------------------------------------------
# Redis key 模板
# --------------------------------------------------------------------------
REDIS_KEY_RESUME_POINT = "auto:resume_point:{session_id}"
REDIS_KEY_PAUSED_SESSIONS = "auto:paused_sessions:{employee_id}"
# --------------------------------------------------------------------------
# 全局意图关键词(Dify 不可用时兜底)
# --------------------------------------------------------------------------
GLOBAL_INTENT_KEYWORDS: dict = {
"pause": ["先去开会", "等会继续", "先处理别的", "暂停", "我去忙一下", "晚点再说"],
"resume_task": ["继续", "继续刚才", "好了继续吧", "接着来", "恢复", "回来了"],
"correct": ["刚才说错了", "不是", "应该是", "更正", "说错了"],
"supplement": ["再补充一下", "顺便说一下", "还有", "对了补充", "另外"],
}
# --------------------------------------------------------------------------
# 信息项修饰符
# --------------------------------------------------------------------------
INFO_MODIFIER_FIXED = "固定" # 动作执行后锁定,不可更正
INFO_MODIFIER_INCREMENTAL = "增量" # 补充时追加而非覆盖
INFO_MODIFIER_EXPLICIT = "明确" # 用户明确提供的值
INFO_MODIFIER_IMPLICIT = "隐含" # 从上下文推断的值
INFO_MODIFIER_REPEAT = "复述" # 更正后需向员工发送确认消息
INFO_MODIFIER_REQUIRED = "必需" # 流程阻塞项,未填写时不可继续执行
# --------------------------------------------------------------------------
# 新增错误码
# --------------------------------------------------------------------------
AutomationErrorCode.SESSION_NOT_PAUSABLE = 4013 # 会话不可暂停(终态)
AutomationErrorCode.SESSION_NOT_RESUMABLE = 4014 # 会话不可恢复(已关闭/超时)
AutomationErrorCode.INFO_ITEM_LOCKED = 4015 # 信息项已锁定
AutomationErrorCode.MULTIPLE_PAUSED_SESSIONS = 4016 # 多个暂停会话需选择
AutomationErrorCode.COMPRESSION_FAILED = 4017 # 上下文压缩失败(已降级截断)
AutomationErrorCode.UNDO_LIMIT_EXCEEDED = 4018 # 撤销次数超限
AutomationErrorCode.BATCH_CORRECT_FAILED = 4019 # 批量更正失败(事务回滚)
AUTOMATION_ERROR_MESSAGES.update({
AutomationErrorCode.SESSION_NOT_PAUSABLE: "会话不可暂停(终态)",
AutomationErrorCode.SESSION_NOT_RESUMABLE: "会话不可恢复(已关闭/超时)",
AutomationErrorCode.INFO_ITEM_LOCKED: "信息项已锁定,不可更正",
AutomationErrorCode.MULTIPLE_PAUSED_SESSIONS: "存在多个暂停会话,需选择要恢复的任务",
AutomationErrorCode.COMPRESSION_FAILED: "上下文压缩失败,已降级为截断处理",
AutomationErrorCode.UNDO_LIMIT_EXCEEDED: "撤销次数超限,最多可撤销5次更正",
AutomationErrorCode.BATCH_CORRECT_FAILED: "批量更正失败,已回滚全部更正",
})