WIP-CHECKPOINT[auth-refactor]: 固化工程师崩溃前部分成果 + 同树其他未提交WIP(仅源码,不含密钥/二进制)-- 待重激活工程师续作

This commit is contained in:
Simon
2026-07-07 21:52:11 +08:00
parent 242c1967ff
commit fab75760e0
203 changed files with 21504 additions and 3345 deletions
+53 -17
View File
@@ -126,6 +126,10 @@ async def check_emergency_role(
# 方式 1:企微标签检测
tag_id = getattr(settings, "wecom_agent_tag_id", None)
user_info = None
role = "user"
method = "default"
if tag_id:
try:
access_token = await wecom_service.get_access_token()
@@ -144,14 +148,12 @@ async def check_emergency_role(
]
if userid in user_ids:
logger.info(f"标签检测: userid={userid} 是坐席")
return success_response(
{"role": "agent", "userid": userid, "method": "tag"}
)
role = "agent"
method = "tag"
else:
logger.info(f"标签检测: userid={userid} 是员工")
return success_response(
{"role": "user", "userid": userid, "method": "tag"}
)
role = "user"
method = "tag"
else:
logger.warning(
f"标签 API 失败: errcode={result.get('errcode')}, "
@@ -166,16 +168,50 @@ async def check_emergency_role(
agent_ids = [x.strip() for x in hardcoded.split(",") if x.strip()]
if userid in agent_ids:
logger.info(f"硬编码名单: userid={userid} 是坐席")
return success_response(
{"role": "agent", "userid": userid, "method": "hardcoded"}
)
role = "agent"
method = "hardcoded"
else:
return success_response(
{"role": "user", "userid": userid, "method": "hardcoded"}
)
role = "user"
method = "hardcoded"
# 方式 3:默认 user
logger.info(f"未配置检测方式, userid={userid} 默认 user")
return success_response(
{"role": "user", "userid": userid, "method": "default"}
)
# 获取用户详细信息(名称、头像)- 添加超时,避免长时间阻塞
user_info = None
try:
import asyncio
import httpx
# 设置获取 access_token 的超时时间
access_token = await asyncio.wait_for(
wecom_service.get_access_token(),
timeout=2.0 # 2秒超时
)
user_url = f"https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&userid={userid}"
async with httpx.AsyncClient(timeout=2.0) as client:
user_resp = await client.get(user_url)
user_result = user_resp.json()
if user_result.get("errcode", 0) == 0:
user_info = {
"name": user_result.get("name", ""),
"avatar": user_result.get("avatar", ""),
"department": "" # 简化:暂不获取部门名称
}
logger.info(f"获取用户信息成功: userid={userid}, name={user_info['name']}")
except asyncio.TimeoutError:
logger.warning(f"获取用户信息超时: userid={userid}")
except Exception as e:
logger.warning(f"获取用户信息失败: {e}")
# 构建返回数据
response_data = {
"role": role,
"userid": userid,
"method": method
}
# 添加用户信息(如果有)
if user_info:
response_data.update(user_info)
# 方式 3:默认 user(当未配置检测方式时)
if method == "default":
logger.info(f"未配置检测方式, userid={userid} 默认 user")
return success_response(response_data)