bea288e414
== 已部署上线 (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
214 lines
11 KiB
Python
214 lines
11 KiB
Python
# =============================================================================
|
||
# 企微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: "批量更正失败,已回滚全部更正",
|
||
})
|