Files
wecom_it_smart_desk/backend/app/constants.py
T

214 lines
11 KiB
Python
Raw Normal View History

# =============================================================================
# 企微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: "批量更正失败,已回滚全部更正",
})