131 lines
4.4 KiB
Python
131 lines
4.4 KiB
Python
# =============================================================================
|
|
# 企微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}",
|
|
}
|
|
)
|