""" 業務查詢服務 - 整合 NLP 分析和資料庫查詢 用於處理 LINE 用戶的自然語言業務查詢 """ import logging from typing import Dict, Any, Optional, List from backend.services.nlp_service import NLPService from backend.services.database_service import DatabaseService from backend.models.schemas import DatabaseResult logger = logging.getLogger(__name__) class BusinessQueryService: """業務查詢服務 - 整合自然語言處理和資料庫查詢""" def __init__(self): self.nlp_service = NLPService() self.db_service = DatabaseService() def process_user_query(self, user_message: str, user_id: str = None) -> Dict[str, Any]: """ 處理用戶查詢的主要入口點 Args: user_message: 用戶的自然語言查詢 user_id: 用戶ID(可選) Returns: 包含查詢結果和格式化回應的字典 """ try: # 1. 使用 NLP 服務分析用戶查詢 analysis_result = self.nlp_service.analyze_business_query(user_message, user_id) logger.info(f"NLP 分析結果 - 意圖: {analysis_result.intent}, 信心度: {analysis_result.confidence}") # 2. 根據分析結果執行對應的資料庫查詢 db_result = self._execute_database_query(analysis_result) # 3. 格式化回應訊息 response_message = self.nlp_service.format_response_message(db_result, analysis_result.intent) # 4. 儲存查詢記錄(如果有用戶ID) if user_id: self.db_service.save_message(user_id, user_message, "query") return { "success": db_result.success, "intent": analysis_result.intent, "confidence": analysis_result.confidence, "entities": analysis_result.entities, "response_message": response_message, "data": db_result.data, "count": db_result.count, "error": db_result.error } except Exception as e: logger.error(f"處理用戶查詢時發生錯誤: {str(e)}") return { "success": False, "intent": "unknown", "confidence": 0.0, "entities": {}, "response_message": f"抱歉,處理您的查詢時發生錯誤:{str(e)}", "data": [], "count": 0, "error": str(e) } def _execute_database_query(self, analysis_result) -> DatabaseResult: """根據 NLP 分析結果執行對應的資料庫查詢""" try: method_name = analysis_result.parameters.get("method") if method_name == "search_products": return self.db_service.search_products( query_text=analysis_result.parameters.get("query_text"), category=analysis_result.parameters.get("category"), limit=analysis_result.parameters.get("limit", 10) ) elif method_name == "check_inventory": return self.db_service.check_inventory( product_name=analysis_result.parameters.get("product_name"), category=analysis_result.parameters.get("category") ) elif method_name == "search_orders": return self.db_service.search_orders( user_id=analysis_result.parameters.get("user_id"), status=analysis_result.parameters.get("status"), limit=analysis_result.parameters.get("limit", 10) ) elif method_name == "get_low_stock_products": return self.db_service.get_low_stock_products( threshold=analysis_result.parameters.get("threshold", 10) ) elif method_name == "get_business_summary": return self.db_service.get_business_summary() else: # 使用通用的自然語言查詢處理 return self.db_service.process_natural_language_query( analysis_result.parameters.get("query_text", ""), analysis_result.parameters.get("user_id") ) except Exception as e: logger.error(f"執行資料庫查詢時發生錯誤: {str(e)}") return DatabaseResult( success=False, error=f"資料庫查詢失敗: {str(e)}" ) def get_query_suggestions(self, user_id: str = None) -> List[str]: """提供查詢建議""" suggestions = [ "查詢商品 iPhone", "庫存查詢 筆記型電腦", "我的訂單", "低庫存商品", "業務統計摘要", "查詢客戶資料", "今天的銷售報表" ] return suggestions def get_help_message(self) -> str: """取得幫助訊息""" help_text = """ 🤖 智能查詢助手使用說明: 📦 商品查詢: • "查詢商品 iPhone" • "有什麼筆記型電腦" • "商品價格查詢" 📊 庫存查詢: • "庫存查詢 iPhone" • "筆記型電腦還有多少" • "查詢存貨狀況" 📋 訂單查詢: • "我的訂單" • "查詢訂單狀態" • "訂單編號 ORD001" ⚠️ 庫存警告: • "低庫存商品" • "缺貨商品查詢" 📈 業務統計: • "業務摘要" • "統計報表" • "總計資料" 💡 您可以用自然語言提問,系統會智能理解您的需求! """ return help_text.strip() def validate_user_permissions(self, user_id: str, query_type: str) -> bool: """驗證用戶權限(可根據需要擴展)""" # 這裡可以根據用戶角色和查詢類型來驗證權限 # 目前先返回 True,允許所有查詢 return True