# ============================================================================= # 企微IT智能服务台 — 系统管理 API # ============================================================================= # 说明:系统级配置管理接口,包括: # 1. GET /api/system/emergency-mode — 查询应急模式状态 # 2. PUT /api/system/emergency-mode — 切换应急模式开关 # ============================================================================= import logging from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models.system_config import SystemConfig from app.utils.response import AppException, success_response logger = logging.getLogger(__name__) # 创建路由器 router = APIRouter() # 应急模式配置键(与 main.py init_data 保持一致) EMERGENCY_MODE_KEY = "emergency_mode" # -------------------------------------------------------------------------- # GET /api/system/emergency-mode — 查询应急模式状态 # -------------------------------------------------------------------------- @router.get("/system/emergency-mode") async def get_emergency_mode( db: AsyncSession = Depends(get_db), ): """查询应急模式状态。 返回当前应急模式的开关状态。 应急模式开启时,智能服务台降级,引导员工使用企微原生「员工服务」通道。 Returns: Dict: 统一响应格式 data.emergency_mode: bool — 是否启用应急模式 data.employee_service_guide: str — 开启时的引导文案(仅开启时返回) """ # 从数据库读取 emergency_mode 配置 stmt = select(SystemConfig).where( SystemConfig.config_key == EMERGENCY_MODE_KEY ) result = await db.execute(stmt) config = result.scalars().first() # 配置不存在时默认关闭(安全默认值) is_enabled = False if config and config.config_value: is_enabled = config.config_value.lower() in ("true", "1", "yes") response_data = {"emergency_mode": is_enabled} # 应急模式开启时,附带引导文案 if is_enabled: response_data["employee_service_guide"] = ( "IT智能服务台正在进行系统维护," "请通过企业微信「通讯录 → 员工服务」联系IT支持人员," "我们将尽快为您处理。" ) return success_response(data=response_data) # -------------------------------------------------------------------------- # PUT /api/system/emergency-mode — 切换应急模式开关 # -------------------------------------------------------------------------- @router.put("/system/emergency-mode") async def toggle_emergency_mode( body: dict, db: AsyncSession = Depends(get_db), ): """切换应急模式开关(仅限坐席/管理员操作)。 开启应急模式后: - H5 用户端页面显示引导文案,提示走企微原生「员工服务」 - 坐席工作台顶部显示醒目的应急模式横幅 关闭应急模式后恢复正常服务。 Args: body: 请求体,包含 emergency_mode: bool Returns: Dict: 统一响应格式 data.emergency_mode: bool — 切换后的状态 """ enabled = body.get("emergency_mode", None) if enabled is None: raise AppException(1001, "emergency_mode 参数不能为空") enabled_bool = bool(enabled) # 查找或创建 emergency_mode 配置项 stmt = select(SystemConfig).where( SystemConfig.config_key == EMERGENCY_MODE_KEY ) result = await db.execute(stmt) config = result.scalars().first() new_value = "true" if enabled_bool else "false" if config: # 更新已有配置 config.config_value = new_value else: # 配置不存在时新建(兜底,正常情况由 init_data 创建) config = SystemConfig( config_key=EMERGENCY_MODE_KEY, config_value=new_value, description="应急模式开关(true=启用员工服务通道,智能服务台降级)", ) db.add(config) await db.flush() status_text = "开启" if enabled_bool else "关闭" logger.info(f"应急模式已{status_text}") return success_response( data={ "emergency_mode": enabled_bool, "message": f"应急模式已{status_text}", } )