v2.0: 架构大版本升级
任务 3.2+3.3: 飞书入口迁移到 MessagePipeline - feishu_bot.py 改用 pipeline.handle_message(去掉 30 行会话管理代码) - feishu_longconn_service.py 改用 pipeline.handle_message(去掉 25 行) - 各入口只负责协议适配,业务逻辑统一在 Pipeline 任务 5: 统一配置管理 - 新增 src/config/config_service.py(ConfigService 单例) - 优先级:环境变量 > system_settings.json > 代码默认值 - 支持点号分隔的嵌套 key、自动类型转换 任务 8: 密码哈希升级 - SHA-256 bcrypt(User.set_password/check_password) - AuthManager.hash_password/verify_password 同步升级 - 兼容旧密码:登录时检测 SHA-256 格式,验证通过后自动升级为 bcrypt - auth_manager.secret_key 改为从环境变量读取 任务 9: 前端事件总线 - TSPDashboard 新增 on/off/emit 方法 - 模块间可通过事件通信,不再只靠直接读写共享状态 README.md 重写 - 功能概览、技术栈、快速开始、项目结构 - 架构要点、多租户、飞书机器人、环境变量 - 开发和部署说明
This commit is contained in:
@@ -99,59 +99,36 @@ def _process_message_in_background(app, event_data: dict):
|
||||
|
||||
logger.info(f"[Feishu Bot] 清理后的消息内容: '{text_content}'")
|
||||
|
||||
# 3. 获取或创建该飞书用户的会话(支持群聊隔离)
|
||||
chat_manager = service_manager.get_chat_manager()
|
||||
|
||||
# 获取发送者ID(优先 open_id,user_id 可能为 None)
|
||||
# 3. 解析发送者信息
|
||||
sender = event.get('sender', {})
|
||||
sender_ids = sender.get('sender_id', {})
|
||||
sender_open_id = sender_ids.get('open_id', '') or ''
|
||||
sender_user_id = sender_ids.get('user_id', '') or ''
|
||||
sender_id = sender_user_id or sender_open_id or 'unknown'
|
||||
sender_type = sender.get('sender_type', 'user')
|
||||
|
||||
# 获取发送者姓名(用 open_id 查询)
|
||||
sender_name = sender_id
|
||||
try:
|
||||
id_for_query = sender_open_id or sender_user_id
|
||||
id_type = 'open_id' if sender_open_id else 'user_id'
|
||||
if id_for_query:
|
||||
user_info = feishu_service.get_user_info(id_for_query, id_type=id_type)
|
||||
user_info = feishu_service.get_user_info(id_for_query, id_type='open_id' if sender_open_id else 'user_id')
|
||||
sender_name = user_info.get('name') or user_info.get('en_name') or sender_id
|
||||
except Exception as e:
|
||||
logger.warning(f"[Feishu Bot] 获取发送者信息失败: {e}")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
logger.info(f"[Feishu Bot] 消息详情: 发送者={sender_name}({sender_id}), 群={chat_id}, 类型={chat_type_desc}, 租户={tenant_id}, 消息ID={message_id}")
|
||||
logger.info(f"[Feishu Bot] 📝 消息内容: '{text_content}'")
|
||||
|
||||
# 群聊隔离:每个用户在每个群都有独立会话
|
||||
user_id = f"feishu_{chat_id}_{sender_id}"
|
||||
logger.info(f"[Feishu Bot] 发送者={sender_name}({sender_id}), 群={chat_id}, 租户={tenant_id}")
|
||||
|
||||
# 检查是否已有活跃会话
|
||||
active_sessions = chat_manager.get_active_sessions()
|
||||
session_id = None
|
||||
for session in active_sessions:
|
||||
if session.get('user_id') == user_id:
|
||||
session_id = session.get('session_id')
|
||||
# 更新会话的 tenant_id(群可能重新绑定了租户)
|
||||
if session_id in chat_manager.active_sessions:
|
||||
chat_manager.active_sessions[session_id]['tenant_id'] = tenant_id
|
||||
logger.info(f"[Feishu Bot] 找到已有会话: {session_id}")
|
||||
break
|
||||
|
||||
# 如果没有会话,创建新会话
|
||||
if not session_id:
|
||||
session_id = chat_manager.create_session(user_id=user_id, work_order_id=None, tenant_id=tenant_id)
|
||||
logger.info(f"[Feishu Bot] 新建会话: {session_id}, 用户={sender_name}({sender_id}), 租户={tenant_id}")
|
||||
|
||||
# 4. 调用实时对话接口处理消息
|
||||
response_data = chat_manager.process_message(
|
||||
session_id=session_id,
|
||||
user_message=text_content,
|
||||
# 4. 使用 Pipeline 统一处理消息
|
||||
pipeline = service_manager.get_pipeline()
|
||||
response_data = pipeline.handle_message(
|
||||
user_id=user_id,
|
||||
message=text_content,
|
||||
tenant_id=tenant_id,
|
||||
chat_id=chat_id,
|
||||
ip_address=f"feishu:{sender_id}:{sender_name}",
|
||||
invocation_method=f"feishu_bot({chat_type})"
|
||||
)
|
||||
logger.info(f"[Feishu Bot] 处理结果: success={response_data.get('success')}, 用户={sender_name}")
|
||||
logger.info(f"[Feishu Bot] 处理结果: success={response_data.get('success')}")
|
||||
|
||||
# 5. 提取回复并发送
|
||||
if response_data.get("success"):
|
||||
|
||||
Reference in New Issue
Block a user