File size: 6,207 Bytes
cd9bca9
 
 
 
 
 
0503b45
cd9bca9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
"""
業務查詢服務 - 整合 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