|
""" |
|
業務查詢服務 - 整合 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: |
|
|
|
analysis_result = self.nlp_service.analyze_business_query(user_message, user_id) |
|
|
|
logger.info(f"NLP 分析結果 - 意圖: {analysis_result.intent}, 信心度: {analysis_result.confidence}") |
|
|
|
|
|
db_result = self._execute_database_query(analysis_result) |
|
|
|
|
|
response_message = self.nlp_service.format_response_message(db_result, analysis_result.intent) |
|
|
|
|
|
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: |
|
"""驗證用戶權限(可根據需要擴展)""" |
|
|
|
|
|
return True |