|
""" |
|
測試 /search 訂單查詢功能 - 基於實際銷售訂單資料 |
|
""" |
|
|
|
import requests |
|
import json |
|
|
|
def test_search_api_orders(): |
|
"""測試 /search API 的訂單查詢功能""" |
|
base_url = "http://localhost:7860" |
|
|
|
print("🔍 測試 /search API 訂單查詢功能") |
|
print("=" * 60) |
|
|
|
|
|
test_cases = [ |
|
{ |
|
"name": "查詢特定訂單編號", |
|
"message": "查詢訂單 SO-20250706-001", |
|
"expected": "應該找到 2025-07-06 的已交付訂單" |
|
}, |
|
{ |
|
"name": "查詢另一個訂單編號", |
|
"message": "SO-20250708-001 狀態如何?", |
|
"expected": "應該找到 2025-07-08 的已出貨訂單" |
|
}, |
|
{ |
|
"name": "查詢已交付訂單", |
|
"message": "查詢已交付的訂單", |
|
"expected": "應該找到狀態為 DELIVERED 的訂單" |
|
}, |
|
{ |
|
"name": "查詢已出貨訂單", |
|
"message": "已出貨訂單有哪些?", |
|
"expected": "應該找到狀態為 SHIPPED 的訂單" |
|
}, |
|
{ |
|
"name": "一般訂單查詢", |
|
"message": "我的訂單", |
|
"expected": "應該顯示所有訂單" |
|
}, |
|
{ |
|
"name": "訂單狀態查詢", |
|
"message": "訂單狀態查詢", |
|
"expected": "應該顯示訂單列表" |
|
}, |
|
{ |
|
"name": "使用日期格式編號", |
|
"message": "20250706-001 這個訂單", |
|
"expected": "應該找到對應的 SO- 訂單" |
|
} |
|
] |
|
|
|
for i, test_case in enumerate(test_cases, 1): |
|
print(f"\n{i}. {test_case['name']}") |
|
print(f" 查詢: '{test_case['message']}'") |
|
print(f" 預期: {test_case['expected']}") |
|
|
|
try: |
|
payload = { |
|
"message": test_case["message"], |
|
"user_id": "test_user_search" |
|
} |
|
|
|
response = requests.post( |
|
f"{base_url}/search", |
|
json=payload, |
|
timeout=30, |
|
headers={"Content-Type": "application/json"} |
|
) |
|
|
|
print(f" 狀態碼: {response.status_code}") |
|
|
|
if response.status_code == 200: |
|
result = response.json() |
|
print(f" 成功: {result.get('success', False)}") |
|
|
|
|
|
response_text = result.get('text', 'No response') |
|
if len(response_text) > 200: |
|
print(f" 回應: {response_text[:200]}...") |
|
else: |
|
print(f" 回應: {response_text}") |
|
|
|
|
|
if any(keyword in response_text for keyword in ['SO-', '訂單', '狀態', '已交付', '已出貨']): |
|
print(f" ✅ 包含訂單相關資訊") |
|
else: |
|
print(f" ❌ 未包含預期的訂單資訊") |
|
|
|
else: |
|
print(f" ❌ API 錯誤: {response.text}") |
|
|
|
except Exception as e: |
|
print(f" ❌ 請求失敗: {str(e)}") |
|
|
|
print("-" * 60) |
|
|
|
def test_route_api_orders(): |
|
"""測試 /route API 對訂單查詢的路由""" |
|
base_url = "http://localhost:7860" |
|
|
|
print(f"\n🔄 測試 /route API 訂單查詢路由") |
|
print("=" * 60) |
|
|
|
|
|
order_queries = [ |
|
"查詢訂單 SO-20250706-001", |
|
"我的訂單狀態", |
|
"已交付的訂單", |
|
"訂單編號 SO-20250708-001" |
|
] |
|
|
|
for i, query in enumerate(order_queries, 1): |
|
print(f"\n{i}. 路由測試: '{query}'") |
|
|
|
try: |
|
payload = { |
|
"message": query, |
|
"user_id": "test_user_route" |
|
} |
|
|
|
response = requests.post( |
|
f"{base_url}/route", |
|
json=payload, |
|
timeout=30, |
|
headers={"Content-Type": "application/json"} |
|
) |
|
|
|
print(f" 狀態碼: {response.status_code}") |
|
|
|
if response.status_code == 200: |
|
result = response.json() |
|
mode = result.get('mode', 'unknown') |
|
success = result.get('success', False) |
|
|
|
print(f" 路由模式: {mode}") |
|
print(f" 成功: {success}") |
|
|
|
|
|
if mode == "search": |
|
print(f" ✅ 正確路由到搜尋模式") |
|
elif mode == "product_query": |
|
print(f" ⚠️ 路由到商品查詢模式(可能需要調整)") |
|
else: |
|
print(f" ❌ 路由到非預期模式: {mode}") |
|
|
|
|
|
response_text = result.get('text', 'No response') |
|
if len(response_text) > 100: |
|
print(f" 回應: {response_text[:100]}...") |
|
else: |
|
print(f" 回應: {response_text}") |
|
|
|
else: |
|
print(f" ❌ API 錯誤: {response.text}") |
|
|
|
except Exception as e: |
|
print(f" ❌ 請求失敗: {str(e)}") |
|
|
|
def test_order_query_patterns(): |
|
"""測試訂單查詢模式識別""" |
|
|
|
print(f"\n🤖 測試訂單查詢模式識別") |
|
print("=" * 60) |
|
|
|
def analyze_order_query_intent(message: str): |
|
"""簡化版訂單查詢意圖分析""" |
|
message_lower = message.lower() |
|
|
|
|
|
order_keywords = ['訂單', '訂購', '購買', 'so-', 'order'] |
|
|
|
|
|
status_keywords = ['狀態', '已交付', '已出貨', '處理中', '取消', 'delivered', 'shipped'] |
|
|
|
|
|
action_keywords = ['查詢', '搜尋', '找', '看', '檢查'] |
|
|
|
has_order_keyword = any(keyword in message_lower for keyword in order_keywords) |
|
has_status_keyword = any(keyword in message_lower for keyword in status_keywords) |
|
has_action_keyword = any(keyword in message_lower for keyword in action_keywords) |
|
|
|
|
|
confidence = 0.0 |
|
if has_order_keyword: |
|
confidence += 0.5 |
|
if has_status_keyword: |
|
confidence += 0.3 |
|
if has_action_keyword: |
|
confidence += 0.2 |
|
|
|
return { |
|
"is_order_query": has_order_keyword, |
|
"has_status": has_status_keyword, |
|
"has_action": has_action_keyword, |
|
"confidence": min(confidence, 1.0), |
|
"should_route_to_search": has_order_keyword and confidence > 0.5 |
|
} |
|
|
|
test_messages = [ |
|
"查詢訂單 SO-20250706-001", |
|
"我的訂單狀態如何?", |
|
"已交付的訂單有哪些?", |
|
"SO-20250708-001 出貨了嗎?", |
|
"訂單編號查詢", |
|
"購買記錄", |
|
"今天天氣如何?", |
|
"是否有推薦貓砂?" |
|
] |
|
|
|
for message in test_messages: |
|
print(f"\n訊息: '{message}'") |
|
analysis = analyze_order_query_intent(message) |
|
|
|
print(f" 訂單查詢: {analysis['is_order_query']}") |
|
print(f" 包含狀態: {analysis['has_status']}") |
|
print(f" 包含動作: {analysis['has_action']}") |
|
print(f" 信心度: {analysis['confidence']:.2f}") |
|
print(f" 建議路由: {'搜尋模式' if analysis['should_route_to_search'] else '其他模式'}") |
|
|
|
def main(): |
|
"""主函數""" |
|
print("🚀 開始 /search 訂單查詢功能測試\n") |
|
|
|
|
|
try: |
|
response = requests.get("http://localhost:7860/health", timeout=5) |
|
if response.status_code == 200: |
|
print("✅ API 服務運行正常\n") |
|
else: |
|
print("❌ API 服務狀態異常\n") |
|
return |
|
except Exception as e: |
|
print(f"❌ 無法連接到 API 服務: {str(e)}") |
|
print("請確保 LineBot 服務正在運行在 localhost:7860\n") |
|
|
|
test_order_query_patterns() |
|
return |
|
|
|
|
|
test_search_api_orders() |
|
test_route_api_orders() |
|
test_order_query_patterns() |
|
|
|
print("\n" + "=" * 60) |
|
print("✅ 測試完成!") |
|
print("\n💡 測試總結:") |
|
print("1. /search API 應該能正確處理訂單查詢") |
|
print("2. 支援 SO- 格式訂單編號查詢") |
|
print("3. 支援狀態篩選(已交付、已出貨等)") |
|
print("4. 路由系統應該將訂單查詢導向搜尋模式") |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|